Rev 7107 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7107 | Rev 7110 | ||
---|---|---|---|
Line 17... | Line 17... | ||
17 | 17 | ||
Line 18... | Line 18... | ||
18 | MODULE API; |
18 | MODULE API; |
Line -... | Line 19... | ||
- | 19 | ||
19 | 20 | IMPORT sys := SYSTEM; |
|
Line 20... | Line 21... | ||
20 | IMPORT sys := SYSTEM; |
21 | |
21 | 22 | ||
- | 23 | CONST |
|
- | 24 | ||
- | 25 | MAX_SIZE = 16 * 400H; |
|
- | 26 | HEAP_SIZE = 1 * 100000H; |
|
- | 27 | ||
- | 28 | _new = 1; |
|
- | 29 | _dispose = 2; |
|
- | 30 | ||
- | 31 | ||
Line 22... | Line 32... | ||
22 | CONST |
32 | TYPE |
Line 23... | Line 33... | ||
23 | 33 | ||
24 | MAX_SIZE = 16 * 400H; |
34 | CRITICAL_SECTION = ARRAY 2 OF INTEGER; |
- | 35 | ||
- | 36 | ||
Line -... | Line 37... | ||
- | 37 | VAR |
|
25 | HEAP_SIZE = 1 * 100000H; |
38 | |
26 | 39 | heap, endheap: INTEGER; |
|
27 | VAR |
40 | pockets: ARRAY MAX_SIZE DIV 32 + 1 OF INTEGER; |
28 | 41 | ||
- | 42 | CriticalSection: CRITICAL_SECTION; |
|
Line 29... | Line 43... | ||
29 | heap, endheap: INTEGER; |
43 | |
- | 44 | ||
30 | pockets: ARRAY MAX_SIZE DIV 32 + 1 OF INTEGER; |
45 | PROCEDURE [stdcall] zeromem* (size, adr: INTEGER); |
31 | 46 | BEGIN |
|
32 | PROCEDURE [stdcall] zeromem*(size, adr: INTEGER); |
47 | sys.CODE("578B7D0C8B4D0833C09CFCF3AB9D5F") |
33 | BEGIN |
48 | END zeromem; |
34 | sys.CODE("578B7D0C8B4D0833C09CFCF3AB9D5F") |
49 | |
35 | END zeromem; |
50 | |
- | 51 | PROCEDURE mem_commit* (adr, size: INTEGER); |
|
Line 36... | Line 52... | ||
36 | 52 | VAR |
|
- | 53 | tmp: INTEGER; |
|
- | 54 | BEGIN |
|
37 | PROCEDURE mem_commit*(adr, size: INTEGER); |
55 | FOR tmp := adr TO adr + size - 1 BY 4096 DO |
38 | VAR tmp: INTEGER; |
56 | sys.PUT(tmp, 0) |
39 | BEGIN |
57 | END |
40 | FOR tmp := adr TO adr + size - 1 BY 4096 DO |
58 | END mem_commit; |
41 | sys.PUT(tmp, 0) |
59 | |
42 | END |
60 | |
43 | END mem_commit; |
61 | PROCEDURE strncmp* (a, b, n: INTEGER): INTEGER; |
44 | 62 | VAR |
|
45 | PROCEDURE strncmp*(a, b, n: INTEGER): INTEGER; |
63 | A, B: CHAR; |
46 | VAR A, B: CHAR; Res: INTEGER; |
64 | Res: INTEGER; |
47 | BEGIN |
65 | BEGIN |
48 | Res := 0; |
66 | Res := 0; |
- | 67 | WHILE n > 0 DO |
|
49 | WHILE n > 0 DO |
68 | sys.GET(a, A); INC(a); |
50 | sys.GET(a, A); INC(a); |
- | |
51 | sys.GET(b, B); INC(b); |
69 | sys.GET(b, B); INC(b); |
52 | DEC(n); |
70 | DEC(n); |
- | 71 | IF A # B THEN |
|
53 | IF A # B THEN |
72 | Res := ORD(A) - ORD(B); |
54 | Res := ORD(A) - ORD(B); |
73 | n := 0 |
55 | n := 0 |
74 | ELSIF A = 0X THEN |
56 | ELSIF A = 0X THEN |
75 | n := 0 |
57 | n := 0 |
76 | END |
58 | END |
77 | END |
59 | END |
78 | RETURN Res |
60 | RETURN Res |
79 | END strncmp; |
61 | END strncmp; |
80 | |
- | 81 | ||
62 | 82 | PROCEDURE [stdcall] sysfunc1* (arg1: INTEGER): INTEGER; |
|
63 | PROCEDURE [stdcall] sysfunc1*(arg1: INTEGER): INTEGER; |
83 | BEGIN |
64 | BEGIN |
84 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
65 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
85 | sys.CODE("CD40"); (* int 40h *) |
66 | sys.CODE("CD40"); (* int 40h *) |
86 | sys.CODE("C9"); (* leave *) |
67 | sys.CODE("C9"); (* leave *) |
87 | sys.CODE("C20400"); (* ret 04h *) |
68 | sys.CODE("C20400"); (* ret 04h *) |
88 | RETURN 0 |
69 | RETURN 0 |
89 | END sysfunc1; |
70 | END sysfunc1; |
90 | |
71 | 91 | ||
72 | PROCEDURE [stdcall] sysfunc2*(arg1, arg2: INTEGER): INTEGER; |
92 | PROCEDURE [stdcall] sysfunc2* (arg1, arg2: INTEGER): INTEGER; |
73 | BEGIN |
93 | BEGIN |
- | 94 | sys.CODE("53"); (* push ebx *) |
|
74 | sys.CODE("53"); (* push ebx *) |
95 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
75 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
96 | sys.CODE("8B5D0C"); (* mov ebx, [ebp + 0Ch] *) |
76 | sys.CODE("8B5D0C"); (* mov ebx, [ebp + 0Ch] *) |
97 | sys.CODE("CD40"); (* int 40h *) |
77 | sys.CODE("CD40"); (* int 40h *) |
98 | sys.CODE("5B"); (* pop ebx *) |
78 | sys.CODE("5B"); (* pop ebx *) |
99 | sys.CODE("C9"); (* leave *) |
79 | sys.CODE("C9"); (* leave *) |
100 | sys.CODE("C20800"); (* ret 08h *) |
80 | sys.CODE("C20800"); (* ret 08h *) |
101 | RETURN 0 |
81 | RETURN 0 |
102 | END sysfunc2; |
82 | END sysfunc2; |
103 | |
83 | 104 | ||
84 | PROCEDURE [stdcall] sysfunc3*(arg1, arg2, arg3: INTEGER): INTEGER; |
105 | PROCEDURE [stdcall] sysfunc3* (arg1, arg2, arg3: INTEGER): INTEGER; |
85 | BEGIN |
106 | BEGIN |
86 | sys.CODE("53"); (* push ebx *) |
107 | sys.CODE("53"); (* push ebx *) |
Line -... | Line 108... | ||
- | 108 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
|
87 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
109 | sys.CODE("8B5D0C"); (* mov ebx, [ebp + 0Ch] *) |
88 | sys.CODE("8B5D0C"); (* mov ebx, [ebp + 0Ch] *) |
- | |
89 | sys.CODE("8B4D10"); (* mov ecx, [ebp + 10h] *) |
110 | sys.CODE("8B4D10"); (* mov ecx, [ebp + 10h] *) |
- | 111 | sys.CODE("CD40"); (* int 40h *) |
|
- | 112 | sys.CODE("5B"); (* pop ebx *) |
|
- | 113 | sys.CODE("C9"); (* leave *) |
|
- | 114 | sys.CODE("C20C00"); (* ret 0Ch *) |
|
- | 115 | RETURN 0 |
|
- | 116 | END sysfunc3; |
|
- | 117 | ||
- | 118 | ||
- | 119 | PROCEDURE [stdcall] sysfunc4* (arg1, arg2, arg3, arg4: INTEGER): INTEGER; |
|
- | 120 | BEGIN |
|
- | 121 | sys.CODE("53"); (* push ebx *) |
|
- | 122 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
|
- | 123 | sys.CODE("8B5D0C"); (* mov ebx, [ebp + 0Ch] *) |
|
- | 124 | sys.CODE("8B4D10"); (* mov ecx, [ebp + 10h] *) |
|
- | 125 | sys.CODE("8B5514"); (* mov edx, [ebp + 14h] *) |
|
- | 126 | sys.CODE("CD40"); (* int 40h *) |
|
- | 127 | sys.CODE("5B"); (* pop ebx *) |
|
- | 128 | sys.CODE("C9"); (* leave *) |
|
- | 129 | sys.CODE("C21000"); (* ret 10h *) |
|
- | 130 | RETURN 0 |
|
- | 131 | END sysfunc4; |
|
- | 132 | ||
- | 133 | ||
- | 134 | PROCEDURE [stdcall] sysfunc5* (arg1, arg2, arg3, arg4, arg5: INTEGER): INTEGER; |
|
- | 135 | BEGIN |
|
- | 136 | sys.CODE("53"); (* push ebx *) |
|
- | 137 | sys.CODE("56"); (* push esi *) |
|
- | 138 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
|
- | 139 | sys.CODE("8B5D0C"); (* mov ebx, [ebp + 0Ch] *) |
|
- | 140 | sys.CODE("8B4D10"); (* mov ecx, [ebp + 10h] *) |
|
- | 141 | sys.CODE("8B5514"); (* mov edx, [ebp + 14h] *) |
|
- | 142 | sys.CODE("8B7518"); (* mov esi, [ebp + 18h] *) |
|
- | 143 | sys.CODE("CD40"); (* int 40h *) |
|
90 | sys.CODE("CD40"); (* int 40h *) |
144 | sys.CODE("5E"); (* pop esi *) |
- | 145 | sys.CODE("5B"); (* pop ebx *) |
|
91 | sys.CODE("5B"); (* pop ebx *) |
146 | sys.CODE("C9"); (* leave *) |
- | 147 | sys.CODE("C21400"); (* ret 14h *) |
|
- | 148 | RETURN 0 |
|
- | 149 | END sysfunc5; |
|
- | 150 | ||
- | 151 | ||
- | 152 | PROCEDURE switch_task; |
|
- | 153 | VAR |
|
- | 154 | res: INTEGER; |
|
- | 155 | BEGIN |
|
- | 156 | res := sysfunc2(68, 1) |
|
92 | sys.CODE("C9"); (* leave *) |
157 | END switch_task; |
- | 158 | ||
- | 159 | ||
- | 160 | PROCEDURE futex_create (ptr: INTEGER): INTEGER; |
|
- | 161 | RETURN sysfunc3(77, 0, ptr) |
|
- | 162 | END futex_create; |
|
- | 163 | ||
- | 164 | ||
93 | sys.CODE("C20C00"); (* ret 0Ch *) |
165 | PROCEDURE futex_wait (futex, value, timeout: INTEGER); |
- | 166 | VAR |
|
94 | RETURN 0 |
167 | res: INTEGER; |
95 | END sysfunc3; |
168 | BEGIN |
- | 169 | res := sysfunc5(77, 2, futex, value, timeout) |
|
- | 170 | END futex_wait; |
|
- | 171 | ||
- | 172 | ||
96 | 173 | PROCEDURE futex_wake (futex, number: INTEGER); |
|
- | 174 | VAR |
|
- | 175 | res: INTEGER; |
|
- | 176 | BEGIN |
|
- | 177 | res := sysfunc4(77, 3, futex, number) |
|
- | 178 | END futex_wake; |
|
- | 179 | ||
- | 180 | ||
- | 181 | PROCEDURE EnterCriticalSection* (VAR CriticalSection: CRITICAL_SECTION); |
|
- | 182 | BEGIN |
|
- | 183 | switch_task; |
|
- | 184 | futex_wait(CriticalSection[0], 1, 10000); |
|
- | 185 | CriticalSection[1] := 1 |
|
- | 186 | END EnterCriticalSection; |
|
97 | PROCEDURE _NEW*(size: INTEGER): INTEGER; |
187 | |
- | 188 | ||
- | 189 | PROCEDURE LeaveCriticalSection* (VAR CriticalSection: CRITICAL_SECTION); |
|
- | 190 | BEGIN |
|
- | 191 | CriticalSection[1] := 0; |
|
- | 192 | futex_wake(CriticalSection[0], 1) |
|
- | 193 | END LeaveCriticalSection; |
|
- | 194 | ||
98 | VAR res, idx, temp: INTEGER; |
195 | |
- | 196 | PROCEDURE InitializeCriticalSection* (VAR CriticalSection: CRITICAL_SECTION); |
|
99 | BEGIN |
197 | BEGIN |
- | 198 | CriticalSection[0] := futex_create(sys.ADR(CriticalSection[1])); |
|
- | 199 | CriticalSection[1] := 0 |
|
100 | IF size <= MAX_SIZE THEN |
200 | END InitializeCriticalSection; |
101 | idx := ASR(size, 5); |
201 | |
- | 202 | ||
- | 203 | PROCEDURE __NEW (size: INTEGER): INTEGER; |
|
102 | res := pockets[idx]; |
204 | VAR |
103 | IF res # 0 THEN |
205 | res, idx, temp: INTEGER; |
- | 206 | BEGIN |
|
- | 207 | IF size <= MAX_SIZE THEN |
|
- | 208 | idx := ASR(size, 5); |
|
- | 209 | res := pockets[idx]; |
|
- | 210 | IF res # 0 THEN |
|
104 | sys.GET(res, pockets[idx]); |
211 | sys.GET(res, pockets[idx]); |
105 | sys.PUT(res, size); |
212 | sys.PUT(res, size); |
106 | INC(res, 4) |
213 | INC(res, 4) |
107 | ELSE |
214 | ELSE |
108 | temp := 0; |
215 | temp := 0; |
- | 216 | IF heap + size >= endheap THEN |
|
- | 217 | IF sysfunc2(18, 16) > ASR(HEAP_SIZE, 10) THEN |
|
- | 218 | temp := sysfunc3(68, 12, HEAP_SIZE) |
|
- | 219 | ELSE |
|
- | 220 | temp := 0 |
|
- | 221 | END; |
|
- | 222 | IF temp # 0 THEN |
|
- | 223 | mem_commit(temp, HEAP_SIZE); |
|
- | 224 | heap := temp; |
|
- | 225 | endheap := heap + HEAP_SIZE |
|
- | 226 | ELSE |
|
- | 227 | temp := -1 |
|
- | 228 | END |
|
- | 229 | END; |
|
- | 230 | IF (heap # 0) & (temp # -1) THEN |
|
- | 231 | sys.PUT(heap, size); |
|
- | 232 | res := heap + 4; |
|
- | 233 | heap := heap + size |
|
- | 234 | ELSE |
|
- | 235 | res := 0 |
|
109 | IF heap + size >= endheap THEN |
236 | END |
110 | IF sysfunc2(18, 16) > ASR(HEAP_SIZE, 10) THEN |
237 | END |
111 | temp := sysfunc3(68, 12, HEAP_SIZE) |
238 | ELSE |
112 | ELSE |
239 | IF sysfunc2(18, 16) > ASR(size, 10) THEN |
113 | temp := 0 |
- | |
114 | END; |
- | |
115 | IF temp # 0 THEN |
240 | res := sysfunc3(68, 12, size); |
116 | mem_commit(temp, HEAP_SIZE); |
241 | IF res # 0 THEN |
117 | heap := temp; |
- | |
118 | endheap := heap + HEAP_SIZE |
- | |
119 | ELSE |
- | |
120 | temp := -1 |
242 | mem_commit(res, size); |
- | 243 | sys.PUT(res, size); |
|
121 | END |
244 | INC(res, 4) |
- | 245 | END |
|
- | 246 | ELSE |
|
122 | END; |
247 | res := 0 |
- | 248 | END |
|
- | 249 | END; |
|
- | 250 | IF res # 0 THEN |
|
- | 251 | zeromem(ASR(size, 2) - 1, res) |
|
123 | IF (heap # 0) & (temp # -1) THEN |
252 | END |
124 | sys.PUT(heap, size); |
253 | RETURN res |
125 | res := heap + 4; |
254 | END __NEW; |
126 | heap := heap + size |
255 | |
127 | ELSE |
256 | |
128 | res := 0 |
- | |
129 | END |
257 | PROCEDURE __DISPOSE (ptr: INTEGER): INTEGER; |
130 | END |
258 | VAR |
131 | ELSE |
259 | size, idx: INTEGER; |
- | 260 | BEGIN |
|
- | 261 | DEC(ptr, 4); |
|
- | 262 | sys.GET(ptr, size); |
|
- | 263 | IF size <= MAX_SIZE THEN |
|
- | 264 | idx := ASR(size, 5); |
|
- | 265 | sys.PUT(ptr, pockets[idx]); |
|
- | 266 | pockets[idx] := ptr |
|
132 | IF sysfunc2(18, 16) > ASR(size, 10) THEN |
267 | ELSE |
- | 268 | size := sysfunc3(68, 13, ptr) |
|
- | 269 | END |
|
133 | res := sysfunc3(68, 12, size); |
270 | RETURN 0 |
134 | IF res # 0 THEN |
271 | END __DISPOSE; |
- | 272 | ||
- | 273 | ||
135 | mem_commit(res, size); |
274 | PROCEDURE NEW_DISPOSE (func, arg: INTEGER): INTEGER; |
- | 275 | VAR |
|
- | 276 | res: INTEGER; |
|
136 | sys.PUT(res, size); |
277 | BEGIN |
- | 278 | EnterCriticalSection(CriticalSection); |
|
- | 279 | ||
- | 280 | IF func = _new THEN |
|
- | 281 | res := __NEW(arg) |
|
- | 282 | ELSIF func = _dispose THEN |
|
137 | INC(res, 4) |
283 | res := __DISPOSE(arg) |
- | 284 | END; |
|
Line 138... | Line 285... | ||
138 | END |
285 | |
139 | ELSE |
- | |
140 | res := 0 |
- | |
141 | END |
- | |
142 | END; |
- | |
143 | IF res # 0 THEN |
- | |
144 | zeromem(ASR(size, 2) - 1, res) |
- | |
145 | END |
- | |
146 | RETURN res |
- | |
147 | END _NEW; |
- | |
148 | 286 | LeaveCriticalSection(CriticalSection) |
|
149 | PROCEDURE _DISPOSE*(ptr: INTEGER): INTEGER; |
- | |
150 | VAR size, idx: INTEGER; |
- | |
151 | BEGIN |
287 | RETURN res |
Line -... | Line 288... | ||
- | 288 | END NEW_DISPOSE; |
|
152 | DEC(ptr, 4); |
289 | |
153 | sys.GET(ptr, size); |
290 | |
154 | IF size <= MAX_SIZE THEN |
291 | PROCEDURE _NEW* (size: INTEGER): INTEGER; |
155 | idx := ASR(size, 5); |
292 | RETURN NEW_DISPOSE(_new, size) |
- | 293 | END _NEW; |
|
Line 156... | Line 294... | ||
156 | sys.PUT(ptr, pockets[idx]); |
294 | |
157 | pockets[idx] := ptr |
295 | |
158 | ELSE |
296 | PROCEDURE _DISPOSE* (ptr: INTEGER): INTEGER; |
159 | size := sysfunc3(68, 13, ptr) |
297 | RETURN NEW_DISPOSE(_dispose, ptr) |
- | 298 | END _DISPOSE; |
|
Line 160... | Line 299... | ||
160 | END |
299 | |
- | 300 | ||
161 | RETURN 0 |
301 | PROCEDURE ExitProcess* (p1: INTEGER); |
162 | END _DISPOSE; |
302 | BEGIN |
163 | 303 | p1 := sysfunc1(-1) |
|
164 | PROCEDURE ExitProcess*(p1: INTEGER); |
304 | END ExitProcess; |
- | 305 | ||
Line 165... | Line 306... | ||
165 | BEGIN |
306 | |
- | 307 | PROCEDURE ExitThread* (p1: INTEGER); |
|
166 | p1 := sysfunc1(-1) |
308 | BEGIN |
167 | END ExitProcess; |
309 | p1 := sysfunc1(-1) |
168 | 310 | END ExitThread; |
|
169 | PROCEDURE ExitThread*(p1: INTEGER); |
311 | |
170 | BEGIN |
312 | |
- | 313 | PROCEDURE OutChar (c: CHAR); |
|
- | 314 | VAR |
|
- | 315 | res: INTEGER; |
|
- | 316 | BEGIN |
|
- | 317 | res := sysfunc3(63, 1, ORD(c)) |
|
- | 318 | END OutChar; |
|
- | 319 | ||
- | 320 | ||
- | 321 | PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER); |
|
- | 322 | VAR |
|
- | 323 | c: CHAR; |
|
171 | p1 := sysfunc1(-1) |
324 | BEGIN |
172 | END ExitThread; |
325 | IF lpCaption # 0 THEN |
173 | 326 | OutChar(0DX); |
|
174 | PROCEDURE OutChar(c: CHAR); |
327 | OutChar(0AX); |
175 | VAR res: INTEGER; |
328 | REPEAT |
176 | BEGIN |
329 | sys.GET(lpCaption, c); |
177 | res := sysfunc3(63, 1, ORD(c)) |
330 | IF c # 0X THEN |
178 | END OutChar; |
- | |
179 | - | ||
180 | PROCEDURE DebugMsg*(lpText, lpCaption: INTEGER); |
- | |
181 | VAR c: CHAR; |
- | |
182 | BEGIN |
- | |
183 | IF lpCaption # 0 THEN |
- | |
184 | OutChar(0DX); |
- | |
185 | OutChar(0AX); |
- | |
186 | REPEAT |
- | |
187 | sys.GET(lpCaption, c); |
- | |
188 | IF c # 0X THEN |
- | |
189 | OutChar(c) |
331 | OutChar(c) |
190 | END; |
332 | END; |
191 | INC(lpCaption) |
333 | INC(lpCaption) |
192 | UNTIL c = 0X; |
334 | UNTIL c = 0X; |
193 | OutChar(":"); |
335 | OutChar(":"); |
- | 336 | OutChar(0DX); |
|
Line 194... | Line 337... | ||
194 | OutChar(0DX); |
337 | OutChar(0AX) |
195 | OutChar(0AX) |
338 | END; |
196 | END; |
339 | REPEAT |
- | 340 | sys.GET(lpText, c); |
|
197 | REPEAT |
341 | IF c # 0X THEN |
- | 342 | OutChar(c) |
|
Line 198... | Line 343... | ||
198 | sys.GET(lpText, c); |
343 | END; |
199 | IF c # 0X THEN |
344 | INC(lpText) |