Rev 7107 | Go to most recent revision | Show entire file | Regard 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 | ||
Line -... | Line 23... | ||
- | 23 | CONST |
|
- | 24 | ||
- | 25 | MAX_SIZE = 16 * 400H; |
|
- | 26 | HEAP_SIZE = 1 * 100000H; |
|
- | 27 | ||
- | 28 | _new = 1; |
|
- | 29 | _dispose = 2; |
|
- | 30 | ||
- | 31 | ||
22 | CONST |
32 | TYPE |
Line 23... | Line 33... | ||
23 | 33 | ||
24 | MAX_SIZE = 16 * 400H; |
34 | CRITICAL_SECTION = ARRAY 2 OF INTEGER; |
Line -... | Line 35... | ||
- | 35 | ||
- | 36 | ||
- | 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 | ||
Line -... | Line 42... | ||
- | 42 | CriticalSection: CRITICAL_SECTION; |
|
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 | |
Line -... | Line 51... | ||
- | 51 | PROCEDURE mem_commit* (adr, size: INTEGER); |
|
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 | |
Line 58... | Line 76... | ||
58 | END |
76 | END |
59 | END |
77 | END |
60 | RETURN Res |
78 | RETURN Res |
61 | END strncmp; |
79 | END strncmp; |
Line -... | Line 80... | ||
- | 80 | ||
62 | 81 | ||
63 | PROCEDURE [stdcall] sysfunc1*(arg1: INTEGER): INTEGER; |
82 | PROCEDURE [stdcall] sysfunc1* (arg1: INTEGER): INTEGER; |
64 | BEGIN |
83 | BEGIN |
65 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
84 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
66 | sys.CODE("CD40"); (* int 40h *) |
85 | sys.CODE("CD40"); (* int 40h *) |
67 | sys.CODE("C9"); (* leave *) |
86 | sys.CODE("C9"); (* leave *) |
68 | sys.CODE("C20400"); (* ret 04h *) |
87 | sys.CODE("C20400"); (* ret 04h *) |
69 | RETURN 0 |
88 | RETURN 0 |
Line -... | Line 89... | ||
- | 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 |
74 | sys.CODE("53"); (* push ebx *) |
94 | sys.CODE("53"); (* push ebx *) |
Line 79... | Line 99... | ||
79 | sys.CODE("C9"); (* leave *) |
99 | sys.CODE("C9"); (* leave *) |
80 | sys.CODE("C20800"); (* ret 08h *) |
100 | sys.CODE("C20800"); (* ret 08h *) |
81 | RETURN 0 |
101 | RETURN 0 |
82 | END sysfunc2; |
102 | END sysfunc2; |
Line -... | Line 103... | ||
- | 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 *) |
87 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
108 | sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *) |
Line 92... | Line 113... | ||
92 | sys.CODE("C9"); (* leave *) |
113 | sys.CODE("C9"); (* leave *) |
93 | sys.CODE("C20C00"); (* ret 0Ch *) |
114 | sys.CODE("C20C00"); (* ret 0Ch *) |
94 | RETURN 0 |
115 | RETURN 0 |
95 | END sysfunc3; |
116 | END sysfunc3; |
Line -... | Line 117... | ||
- | 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 *) |
|
- | 144 | sys.CODE("5E"); (* pop esi *) |
|
- | 145 | 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) |
|
- | 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 | ||
- | 165 | PROCEDURE futex_wait (futex, value, timeout: INTEGER); |
|
- | 166 | VAR |
|
- | 167 | res: INTEGER; |
|
- | 168 | BEGIN |
|
- | 169 | res := sysfunc5(77, 2, futex, value, timeout) |
|
- | 170 | END futex_wait; |
|
- | 171 | ||
- | 172 | ||
- | 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; |
|
- | 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 | ||
- | 195 | ||
- | 196 | PROCEDURE InitializeCriticalSection* (VAR CriticalSection: CRITICAL_SECTION); |
|
- | 197 | BEGIN |
|
- | 198 | CriticalSection[0] := futex_create(sys.ADR(CriticalSection[1])); |
|
- | 199 | CriticalSection[1] := 0 |
|
- | 200 | END InitializeCriticalSection; |
|
- | 201 | ||
96 | 202 | ||
- | 203 | PROCEDURE __NEW (size: INTEGER): INTEGER; |
|
97 | PROCEDURE _NEW*(size: INTEGER): INTEGER; |
204 | VAR |
98 | VAR res, idx, temp: INTEGER; |
205 | res, idx, temp: INTEGER; |
99 | BEGIN |
206 | BEGIN |
100 | IF size <= MAX_SIZE THEN |
207 | IF size <= MAX_SIZE THEN |
101 | idx := ASR(size, 5); |
208 | idx := ASR(size, 5); |
102 | res := pockets[idx]; |
209 | res := pockets[idx]; |
Line 142... | Line 249... | ||
142 | END; |
249 | END; |
143 | IF res # 0 THEN |
250 | IF res # 0 THEN |
144 | zeromem(ASR(size, 2) - 1, res) |
251 | zeromem(ASR(size, 2) - 1, res) |
145 | END |
252 | END |
146 | RETURN res |
253 | RETURN res |
147 | END _NEW; |
254 | END __NEW; |
Line -... | Line 255... | ||
- | 255 | ||
148 | 256 | ||
- | 257 | PROCEDURE __DISPOSE (ptr: INTEGER): INTEGER; |
|
149 | PROCEDURE _DISPOSE*(ptr: INTEGER): INTEGER; |
258 | VAR |
150 | VAR size, idx: INTEGER; |
259 | size, idx: INTEGER; |
151 | BEGIN |
260 | BEGIN |
152 | DEC(ptr, 4); |
261 | DEC(ptr, 4); |
153 | sys.GET(ptr, size); |
262 | sys.GET(ptr, size); |
154 | IF size <= MAX_SIZE THEN |
263 | IF size <= MAX_SIZE THEN |
Line 157... | Line 266... | ||
157 | pockets[idx] := ptr |
266 | pockets[idx] := ptr |
158 | ELSE |
267 | ELSE |
159 | size := sysfunc3(68, 13, ptr) |
268 | size := sysfunc3(68, 13, ptr) |
160 | END |
269 | END |
161 | RETURN 0 |
270 | RETURN 0 |
- | 271 | END __DISPOSE; |
|
- | 272 | ||
- | 273 | ||
- | 274 | PROCEDURE NEW_DISPOSE (func, arg: INTEGER): INTEGER; |
|
- | 275 | VAR |
|
- | 276 | res: INTEGER; |
|
- | 277 | BEGIN |
|
- | 278 | EnterCriticalSection(CriticalSection); |
|
- | 279 | ||
- | 280 | IF func = _new THEN |
|
- | 281 | res := __NEW(arg) |
|
- | 282 | ELSIF func = _dispose THEN |
|
- | 283 | res := __DISPOSE(arg) |
|
- | 284 | END; |
|
- | 285 | ||
- | 286 | LeaveCriticalSection(CriticalSection) |
|
- | 287 | RETURN res |
|
- | 288 | END NEW_DISPOSE; |
|
- | 289 | ||
- | 290 | ||
- | 291 | PROCEDURE _NEW* (size: INTEGER): INTEGER; |
|
- | 292 | RETURN NEW_DISPOSE(_new, size) |
|
- | 293 | END _NEW; |
|
- | 294 | ||
- | 295 | ||
- | 296 | PROCEDURE _DISPOSE* (ptr: INTEGER): INTEGER; |
|
- | 297 | RETURN NEW_DISPOSE(_dispose, ptr) |
|
162 | END _DISPOSE; |
298 | END _DISPOSE; |
Line -... | Line 299... | ||
- | 299 | ||
163 | 300 | ||
164 | PROCEDURE ExitProcess*(p1: INTEGER); |
301 | PROCEDURE ExitProcess* (p1: INTEGER); |
165 | BEGIN |
302 | BEGIN |
166 | p1 := sysfunc1(-1) |
303 | p1 := sysfunc1(-1) |
Line -... | Line 304... | ||
- | 304 | END ExitProcess; |
|
167 | END ExitProcess; |
305 | |
168 | 306 | ||
169 | PROCEDURE ExitThread*(p1: INTEGER); |
307 | PROCEDURE ExitThread* (p1: INTEGER); |
170 | BEGIN |
308 | BEGIN |
Line -... | Line 309... | ||
- | 309 | p1 := sysfunc1(-1) |
|
171 | p1 := sysfunc1(-1) |
310 | END ExitThread; |
- | 311 | ||
172 | END ExitThread; |
312 | |
173 | 313 | PROCEDURE OutChar (c: CHAR); |
|
174 | PROCEDURE OutChar(c: CHAR); |
314 | VAR |
175 | VAR res: INTEGER; |
315 | res: INTEGER; |
Line -... | Line 316... | ||
- | 316 | BEGIN |
|
176 | BEGIN |
317 | res := sysfunc3(63, 1, ORD(c)) |
- | 318 | END OutChar; |
|
177 | res := sysfunc3(63, 1, ORD(c)) |
319 | |
178 | END OutChar; |
320 | |
179 | 321 | PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER); |
|
180 | PROCEDURE DebugMsg*(lpText, lpCaption: INTEGER); |
322 | VAR |
181 | VAR c: CHAR; |
323 | c: CHAR; |
182 | BEGIN |
324 | BEGIN |
Line 205... | Line 347... | ||
205 | OutChar(0DX); |
347 | OutChar(0DX); |
206 | OutChar(0AX) |
348 | OutChar(0AX) |
207 | END |
349 | END |
208 | END DebugMsg; |
350 | END DebugMsg; |
Line -... | Line 351... | ||
- | 351 | ||
209 | 352 | ||
210 | PROCEDURE init* (p1: INTEGER); |
353 | PROCEDURE init* (p1: INTEGER); |
211 | BEGIN |
354 | BEGIN |
- | 355 | p1 := sysfunc2(68, 11); |
|
212 | p1 := sysfunc2(68, 11) |
356 | InitializeCriticalSection(CriticalSection) |
Line -... | Line 357... | ||
- | 357 | END init; |
|
213 | END init; |
358 | |
214 | 359 |