Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6613 leency 1
(*
2
    Copyright 2016 Anton Krotov
3
 
4
    This program is free software: you can redistribute it and/or modify
5
    it under the terms of the GNU Lesser General Public License as published by
6
    the Free Software Foundation, either version 3 of the License, or
7
    (at your option) any later version.
8
 
9
    This program is distributed in the hope that it will be useful,
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
    GNU Lesser General Public License for more details.
13
 
14
    You should have received a copy of the GNU Lesser General Public License
15
    along with this program.  If not, see .
16
*)
17
 
18
MODULE RTL;
19
 
20
IMPORT sys := SYSTEM, API;
21
 
22
TYPE
23
 
24
  IntArray = ARRAY 2048 OF INTEGER;
25
  STRING = ARRAY 2048 OF CHAR;
26
  PROC = PROCEDURE;
27
 
28
VAR
29
 
30
  SelfName, rtab: INTEGER; CloseProc: PROC;
31
 
32
PROCEDURE [stdcall] _halt*(n: INTEGER);
33
BEGIN
34
  API.ExitProcess(n)
35
END _halt;
36
 
37
PROCEDURE [stdcall] _newrec*(size, t: INTEGER; VAR ptr: INTEGER);
38
BEGIN
39
  ptr := API._NEW(size);
40
  IF ptr # 0 THEN
41
    sys.PUT(ptr, t);
42
    INC(ptr, 4)
43
  END
44
END _newrec;
45
 
46
PROCEDURE [stdcall] _disprec*(VAR ptr: INTEGER);
47
BEGIN
48
  IF ptr # 0 THEN
49
    ptr := API._DISPOSE(ptr - 4)
50
  END
51
END _disprec;
52
 
53
PROCEDURE [stdcall] _rset*(y, x: INTEGER);
54
BEGIN
55
  sys.CODE("8B45088B4D0C3BC87F0A83F91F760B83F81F760633C0C9C2080083F9007D0233C983F81F7E05B81F000000BA000000802BC8F7D9D3FA83E81F8BC8F7D9D3EA8BC2C9C20800")
56
END _rset;
57
 
58
PROCEDURE [stdcall] _inset*(y, x: INTEGER);
59
BEGIN
60
  sys.CODE("8B45088B4D0C83F91F7709D3E883E001C9C20800C933C0C20800")
61
END _inset;
62
 
63
PROCEDURE [stdcall] _checktype*(table, t, r: INTEGER);
64
BEGIN
65
  table := rtab;
66
  sys.CODE("8B450C8B4D1085C975076A0158C9C20C008B51FC8B4D083BD0740D85D27409C1E20203D18B12EBEF33C93BC20F94C18BC1C9C20C00")
67
END _checktype;
68
 
69
PROCEDURE [stdcall] _savearr*(size, source, dest: INTEGER);
70
BEGIN
71
  sys.CODE("9CFC8BD78BC68B7D108B750C8B4D08F3A48BFA8BF09D")
72
END _savearr;
73
 
74
PROCEDURE [stdcall] _saverec*(dyn, stat, size, source, dest: INTEGER): BOOLEAN;
75
VAR res: BOOLEAN;
76
BEGIN
77
  res := dyn = stat;
78
  IF res THEN
79
    _savearr(size, source, dest)
80
  END
81
  RETURN res
82
END _saverec;
83
 
84
PROCEDURE [stdcall] _arrayidx*(Dim: INTEGER; VAR Arr: IntArray; bsize, idx, c: INTEGER);
85
VAR i, m: INTEGER;
86
BEGIN
87
  m := bsize * idx;
88
  FOR i := 4 TO Dim + 2 DO
89
    m := m * Arr[i]
90
  END;
91
  IF (Arr[3] > idx) & (idx >= 0) THEN
92
    Arr[3] := c + m
93
  ELSE
94
    Arr[3] := 0
95
  END
96
END _arrayidx;
97
 
98
PROCEDURE [stdcall] _arrayidx1*(VAR Arr: IntArray; bsize, idx, c: INTEGER);
99
BEGIN
100
  IF (Arr[3] > idx) & (idx >= 0) THEN
101
    Arr[3] := bsize * idx + c
102
  ELSE
103
    Arr[3] := 0
104
  END
105
END _arrayidx1;
106
 
107
PROCEDURE [stdcall] _arrayrot*(m, n: INTEGER; VAR Arr: IntArray);
108
VAR i, j, t: INTEGER;
109
BEGIN
110
  FOR i := 1 TO n DO
111
    t := Arr[0];
112
    FOR j := 0 TO m + n - 1 DO
113
      Arr[j] := Arr[j + 1]
114
    END;
115
    Arr[m + n] := t
116
  END
117
END _arrayrot;
118
 
119
PROCEDURE Min(a, b: INTEGER): INTEGER;
120
BEGIN
121
  IF a > b THEN
122
    a := b
123
  END
124
  RETURN a
125
END Min;
126
 
127
PROCEDURE [stdcall] _length*(s: ARRAY OF CHAR): INTEGER;
128
BEGIN
129
  sys.CODE("8B4508");     //  mov     eax, [ebp + 08h]
130
  sys.CODE("8B4D0C");     //  mov     ecx, [ebp + 0Ch]
131
  sys.CODE("48");         //  dec     eax
132
			  //  L1:
133
  sys.CODE("40");         //  inc     eax
134
  sys.CODE("803800");     //  cmp     byte ptr [eax], 0
135
  sys.CODE("7403");       //  jz      L2
136
  sys.CODE("E2F8");       //  loop    L1
137
  sys.CODE("40");         //  inc     eax
138
			  //  L2:
139
  sys.CODE("2B4508");     //  sub     eax, [ebp + 08h]
140
  sys.CODE("C9");         //  leave
141
  sys.CODE("C20800");     //  ret     08h
142
  RETURN 0
143
END _length;
144
 
145
PROCEDURE [stdcall] _strcopy*(b, blen, a, alen: INTEGER);
146
BEGIN
147
  _savearr(Min(alen, blen), a, b);
148
  IF blen > alen THEN
149
    sys.PUT(b + alen, 0X)
150
  END
151
END _strcopy;
152
 
153
PROCEDURE [stdcall] _strcmp*(op: INTEGER; b, a: ARRAY OF CHAR): BOOLEAN;
154
VAR i: INTEGER; Res: BOOLEAN;
155
BEGIN
156
  i := API.strncmp(sys.ADR(a), sys.ADR(b), Min(LEN(a), LEN(b)));
157
  IF i = 0 THEN
158
    i := _length(a) - _length(b)
159
  END;
160
  CASE op OF
161
  |0: Res := i = 0
162
  |1: Res := i # 0
163
  |2: Res := i < 0
164
  |3: Res := i > 0
165
  |4: Res := i <= 0
166
  |5: Res := i >= 0
167
  ELSE
168
  END
169
  RETURN Res
170
END _strcmp;
171
 
172
PROCEDURE [stdcall] _lstrcmp*(op: INTEGER; b: CHAR; a: ARRAY OF CHAR): BOOLEAN;
173
VAR s: ARRAY 2 OF CHAR;
174
BEGIN
175
  s[0] := b;
176
  s[1] := 0X;
177
  RETURN _strcmp(op, s, a)
178
END _lstrcmp;
179
 
180
PROCEDURE [stdcall] _rstrcmp*(op: INTEGER; b: ARRAY OF CHAR; a: CHAR): BOOLEAN;
181
VAR s: ARRAY 2 OF CHAR;
182
BEGIN
183
  s[0] := a;
184
  s[1] := 0X;
185
  RETURN _strcmp(op, b, s)
186
END _rstrcmp;
187
 
188
PROCEDURE Int(x: INTEGER; VAR str: STRING);
189
VAR i, a, b: INTEGER; c: CHAR;
190
BEGIN
191
  i := 0;
192
  a := 0;
193
  REPEAT
194
    str[i] := CHR(x MOD 10 + ORD("0"));
195
    x := x DIV 10;
196
    INC(i)
197
  UNTIL x = 0;
198
  b := i - 1;
199
  WHILE a < b DO
200
    c := str[a];
201
    str[a] := str[b];
202
    str[b] := c;
203
    INC(a);
204
    DEC(b)
205
  END;
206
  str[i] := 0X
207
END Int;
208
 
209
PROCEDURE [stdcall] _assrt*(code, m: INTEGER; modname: STRING; line: INTEGER);
210
VAR msg, int: STRING; pos, n: INTEGER;
211
 
212
  PROCEDURE StrAppend(s: STRING);
213
  VAR i, n: INTEGER;
214
  BEGIN
215
    n := LEN(s);
216
    i := 0;
217
    WHILE (i < n) & (s[i] # 0X) DO
218
      msg[pos] := s[i];
219
      INC(pos);
220
      INC(i)
221
    END
222
  END StrAppend;
223
 
224
BEGIN
225
  pos := 0;
226
  n := line MOD 16;
227
  line := line DIV 16;
228
  CASE n OF
229
  |1: StrAppend("assertion failure")
230
  |2: StrAppend("variable of a procedure type has NIL as value")
231
  |3: StrAppend("typeguard error")
232
  |4: StrAppend("inadmissible dynamic type")
233
  |5: StrAppend("index check error")
234
  |6: StrAppend("NIL pointer dereference")
235
  |7: StrAppend("invalid value in case statement")
236
  |8: StrAppend("division by zero")
237
  ELSE
238
  END;
239
  StrAppend(0DX);
240
  StrAppend(0AX);
241
  StrAppend("module ");
242
  StrAppend(modname);
243
  StrAppend(0DX);
244
  StrAppend(0AX);
245
  StrAppend("line ");
246
  Int(line, int);
247
  StrAppend(int);
248
  IF m = 2 THEN
249
    StrAppend(0DX);
250
    StrAppend(0AX);
251
    StrAppend("code ");
252
    Int(code, int);
253
    StrAppend(int)
254
  END;
255
  API.DebugMsg(sys.ADR(msg), SelfName)
256
END _assrt;
257
 
258
PROCEDURE [stdcall] _close*;
259
BEGIN
260
  IF CloseProc # NIL THEN
261
    CloseProc
262
  END
263
END _close;
264
 
265
PROCEDURE [stdcall] _init*(self, rec, gsize, gadr, esp: INTEGER);
266
BEGIN
267
  API.zeromem(gsize, gadr);
268
  API.init(esp);
269
  SelfName := self;
270
  rtab := rec;
271
  CloseProc := NIL
272
END _init;
273
 
274
PROCEDURE SetClose*(proc: PROC);
275
BEGIN
276
  CloseProc := proc
277
END SetClose;
278
 
279
END RTL.