3 SYSTEM_MODDESC
*SYSTEM_modlist
= NIL
;
4 SYSTEM_DLINK
*SYSTEM_dlink
= NIL
;
6 LONGINT SYSTEM_INF
= 0x7FF0000000000000L
;
7 INTEGER SYSTEM_INFS
= 0x7F800000;
9 CHAR SYSTEM_strBuf
[32][256];
10 INTEGER SYSTEM_actual
;
12 INTEGER SYSTEM_argCount
;
13 void *SYSTEM_argVector
;
15 void SYSTEM_REGMOD(SYSTEM_MODDESC
*mod
)
18 mod
->next
= SYSTEM_modlist
;
20 for (i
= 0; i
< mod
->nofimps
; i
++) mod
->imports
[i
]->refcnt
++;
24 INTEGER gc
[3], len
[1];
27 void *SYSTEM_NEWARR(INTEGER type
, INTEGER n
)
29 int ptr
= Kernel_NewArr(type
, n
, 1);
30 ((Array
*)ptr
)->len
[0] = n
;
34 void *SYSTEM_NEWARR1(INTEGER type
, INTEGER n0
, INTEGER n
)
36 int ptr
= Kernel_NewArr(type
, n
* n0
, 1);
37 ((Array
*)ptr
)->len
[0] = n0
;
41 void *SYSTEM_NEWARR2(INTEGER type
, INTEGER n1
, INTEGER n0
, INTEGER n
)
43 int ptr
= Kernel_NewArr(type
, n
* n0
* n1
, 2);
44 ((Array
*)ptr
)->len
[0] = n1
;
45 ((Array
*)ptr
)->len
[1] = n0
;
49 void *SYSTEM_NEWARR3(INTEGER type
, INTEGER n2
, INTEGER n1
, INTEGER n0
, INTEGER n
)
51 int ptr
= Kernel_NewArr(type
, n
* n0
* n1
* n2
, 3);
52 ((Array
*)ptr
)->len
[0] = n2
;
53 ((Array
*)ptr
)->len
[1] = n1
;
54 ((Array
*)ptr
)->len
[2] = n0
;
58 void *SYSTEM_NEWARR4(INTEGER type
, INTEGER n3
, INTEGER n2
, INTEGER n1
, INTEGER n0
, INTEGER n
)
60 int ptr
= Kernel_NewArr(type
, n
* n0
* n1
* n2
* n3
, 4);
61 ((Array
*)ptr
)->len
[0] = n3
;
62 ((Array
*)ptr
)->len
[1] = n2
;
63 ((Array
*)ptr
)->len
[2] = n1
;
64 ((Array
*)ptr
)->len
[3] = n0
;
68 INTEGER
SYSTEM_XCHK(INTEGER i
, INTEGER ub
)
70 if ((unsigned)(i
)>=(unsigned)(ub
)) __HALT(-7);
75 CHAR
* SYSTEM_LSTR(char *x
)
77 CHAR
*str
= SYSTEM_strBuf
[SYSTEM_actual
];
79 SYSTEM_actual
= (SYSTEM_actual
+ 1) & 0x1F;
81 if (i
== 256) __HALT(-8);
83 } while (x
[i
++] != 0);
87 INTEGER
SYSTEM_ASH(INTEGER x
, INTEGER n
)
89 if (n
>= 0) return x
<< n
;
90 else return x
>> (-n
);
93 LONGINT
SYSTEM_ASHL(LONGINT x
, INTEGER n
)
95 if (n
>= 0) return x
<< n
;
96 else return x
>> (-n
);
99 INTEGER
SYSTEM_ABS(INTEGER x
)
105 LONGINT
SYSTEM_ABSL(LONGINT x
)
111 SHORTREAL
SYSTEM_ABSF(SHORTREAL x
)
117 REAL
SYSTEM_ABSD(REAL x
)
123 INTEGER
SYSTEM_ENTIER(REAL x
)
131 LONGINT
SYSTEM_ENTIERL(REAL x
)
139 INTEGER
SYSTEM_DIV(INTEGER x
, INTEGER y
)
142 if (x
< 0) return ~(~x
/ y
);
145 if (x
> 0) return ~((x
- 1) / -y
);
152 LONGINT
SYSTEM_DIVL(LONGINT x
, LONGINT y
)
155 if (x
< 0) return ~(~x
/ y
);
158 if (x
> 0) return ~((x
- 1) / -y
);
165 INTEGER
SYSTEM_MOD(INTEGER x
, INTEGER y
)
168 if (x
< 0) return y
+ ~(~x
% y
);
171 if (x
> 0) return y
+ 1 + ((x
- 1) % -y
);
172 else return -(-x
% -y
);
178 LONGINT
SYSTEM_MODL(LONGINT x
, LONGINT y
)
181 if (x
< 0) return y
+ ~(~x
% y
);
184 if (x
> 0) return y
+ 1 + ((x
- 1) % -y
);
185 else return -(-x
% -y
);
191 INTEGER
SYSTEM_MIN(INTEGER x
, INTEGER y
)
197 LONGINT
SYSTEM_MINL(LONGINT x
, LONGINT y
)
203 SHORTREAL
SYSTEM_MINF(SHORTREAL x
, SHORTREAL y
)
209 REAL
SYSTEM_MIND(REAL x
, REAL y
)
215 INTEGER
SYSTEM_MAX(INTEGER x
, INTEGER y
)
221 LONGINT
SYSTEM_MAXL(LONGINT x
, LONGINT y
)
227 SHORTREAL
SYSTEM_MAXF(SHORTREAL x
, SHORTREAL y
)
233 REAL
SYSTEM_MAXD(REAL x
, REAL y
)
240 SHORTREAL
SYSTEM_INT2SR(INTEGER x
)
242 return *(SHORTREAL
*)&x
;
245 REAL
SYSTEM_LONG2R(LONGINT x
)
250 INTEGER
SYSTEM_SR2INT(SHORTREAL x
)
252 return *(INTEGER
*)&x
;
255 LONGINT
SYSTEM_R2LONG(REAL x
)
257 return *(LONGINT
*)&x
;
263 INTEGER
SYSTEM_STRLEN(CHAR x
[]) /* LEN(lx$) */
266 while (x
[i
] != 0) i
++;
270 INTEGER
SYSTEM_STRLENS(SHORTCHAR x
[]) /* LEN(sx$) */
273 while (x
[i
] != 0) i
++;
277 INTEGER
SYSTEM_STRCMPSS(SHORTCHAR x
[], SHORTCHAR y
[]) /* sx = sy */
280 while (x
[i
] == y
[i
] && y
[i
] != 0) i
++;
284 INTEGER
SYSTEM_STRCMPTS(CHAR x
[], SHORTCHAR y
[]) /* SHORT(lx) = sy */
287 while ((x
[i
] & 0xff) == y
[i
] && y
[i
] != 0) i
++;
288 return (x
[i
] & 0xff) - y
[i
];
291 INTEGER
SYSTEM_STRCMPTT(CHAR x
[], CHAR y
[]) /* SHORT(lx) = SHORT(ly) */
294 while ((x
[i
] & 0xff) == (y
[i
] & 0xff) && (y
[i
] & 0xff) != 0) i
++;
295 return (x
[i
] & 0xff) - (y
[i
] & 0xff);
298 INTEGER
SYSTEM_STRCMPLL(CHAR x
[], CHAR y
[]) /* lx = ly */
301 while (x
[i
] == y
[i
] && y
[i
] != 0) i
++;
305 INTEGER
SYSTEM_STRCMPSL(SHORTCHAR x
[], CHAR y
[]) /* LONG(sx) = ly */
308 while (x
[i
] == y
[i
] && y
[i
] != 0) i
++;
312 INTEGER
SYSTEM_STRCMPTL(CHAR x
[], CHAR y
[]) /* LONG(SHORT(lx)) = ly */
315 while ((x
[i
] & 0xff) == y
[i
] && y
[i
] != 0) i
++;
316 return (x
[i
] & 0xff) - y
[i
];
319 void SYSTEM_STRCOPYSS(SHORTCHAR x
[], SHORTCHAR y
[], INTEGER n
) /* sy := sx */
323 if (n
-- == 0) __HALT(-8);
325 } while (x
[i
++] != 0);
328 void SYSTEM_STRCOPYTS(CHAR x
[], SHORTCHAR y
[], INTEGER n
) /* sy := SHORT(lx) */
332 if (n
-- == 0) __HALT(-8);
333 y
[i
] = (SHORTCHAR
)x
[i
];
334 } while ((x
[i
++] & 0xff) != 0);
337 void SYSTEM_STRCOPYLL(CHAR x
[], CHAR y
[], INTEGER n
) /* ly := lx */
341 if (n
-- == 0) __HALT(-8);
343 } while (x
[i
++] != 0);
346 void SYSTEM_STRCOPYSL(SHORTCHAR x
[], CHAR y
[], INTEGER n
) /* ly := LONG(sx) */
350 if (n
-- == 0) __HALT(-8);
352 } while (x
[i
++] != 0);
355 void SYSTEM_STRCOPYTL(CHAR x
[], CHAR y
[], INTEGER n
) /* ly := LONG(SHORT(lx)) */
359 if (n
-- == 0) __HALT(-8);
360 y
[i
] = (x
[i
] & 0xff);
361 } while ((x
[i
++] & 0xff) != 0);
364 void SYSTEM_STRAPNDSS(SHORTCHAR x
[], SHORTCHAR y
[], INTEGER n
) /* sy := sy + sx */
367 while (y
[j
] != 0) j
++;
369 if (n
-- == 0) __HALT(-8);
371 } while (x
[i
++] != 0);
374 void SYSTEM_STRAPNDTS(CHAR x
[], SHORTCHAR y
[], INTEGER n
) /* sy := sy + SHORT(lx) */
377 while (y
[j
] != 0) j
++;
379 if (n
-- == 0) __HALT(-8);
380 y
[j
++] = (SHORTCHAR
)x
[i
];
381 } while ((x
[i
++] & 0xff) != 0);
384 void SYSTEM_STRAPNDLL(CHAR x
[], CHAR y
[], INTEGER n
) /* ly := ly + lx */
387 while (y
[j
] != 0) j
++;
389 if (n
-- == 0) __HALT(-8);
391 } while (x
[i
++] != 0);
394 void SYSTEM_STRAPNDSL(SHORTCHAR x
[], CHAR y
[], INTEGER n
) /* ly := ly + LONG(sx) */
397 while (y
[j
] != 0) j
++;
399 if (n
-- == 0) __HALT(-8);
401 } while (x
[i
++] != 0);
404 void SYSTEM_STRAPNDTL(CHAR x
[], CHAR y
[], INTEGER n
) /* ly := ly + LONG(SHORT(lx)) */
407 while (y
[j
] != 0) j
++;
409 if (n
-- == 0) __HALT(-8);
410 y
[j
++] = (x
[i
] & 0xff);
411 } while ((x
[i
++] & 0xff) != 0);