Rev 9577 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9577 | Rev 9645 | ||
---|---|---|---|
Line 17... | Line 17... | ||
17 | 17 | ||
Line 18... | Line 18... | ||
18 | VAR |
18 | VAR |
Line 19... | Line -... | ||
19 | - | ||
20 | DLL_INIT: PROCEDURE [stdcall] (entry: INTEGER); |
- | |
21 | - | ||
22 | imp_error*: RECORD |
- | |
23 | - | ||
24 | proc*, lib*: STRING; |
- | |
25 | error*: INTEGER |
- | |
Line 26... | Line 19... | ||
26 | 19 | ||
27 | END; |
20 | DLL_INIT: PROCEDURE [stdcall] (entry: INTEGER); |
28 | 21 | ||
29 | 22 | ||
Line 174... | Line 167... | ||
174 | 167 | ||
175 | 168 | ||
176 | PROCEDURE mem_commit (adr, size: INTEGER); |
169 | PROCEDURE mem_commit (adr, size: INTEGER); |
177 | VAR |
- | |
178 | tmp: INTEGER; |
170 | VAR |
179 | 171 | tmp: INTEGER; |
|
180 | BEGIN |
172 | BEGIN |
181 | FOR tmp := adr TO adr + size - 1 BY 4096 DO |
173 | FOR tmp := adr TO adr + size - 1 BY 4096 DO |
182 | SYSTEM.PUT(tmp, 0) |
174 | SYSTEM.PUT(tmp, 0) |
Line 183... | Line 175... | ||
183 | END |
175 | END |
184 | END mem_commit; |
176 | END mem_commit; |
185 | 177 | ||
186 | - | ||
187 | PROCEDURE [stdcall] malloc* (size: INTEGER): INTEGER; |
178 | |
188 | VAR |
179 | PROCEDURE [stdcall] malloc* (size: INTEGER): INTEGER; |
189 | ptr: INTEGER; |
180 | VAR |
190 | 181 | ptr: INTEGER; |
|
191 | BEGIN |
182 | BEGIN |
Line 225... | Line 216... | ||
225 | 216 | ||
226 | PROCEDURE AppAdr (): INTEGER; |
217 | PROCEDURE AppAdr (): INTEGER; |
227 | VAR |
218 | VAR |
228 | buf: ARRAY 1024 OF CHAR; |
219 | buf: ARRAY 1024 OF CHAR; |
229 | a: INTEGER; |
- | |
230 | 220 | a: INTEGER; |
|
231 | BEGIN |
221 | BEGIN |
232 | a := sysfunc3(9, SYSTEM.ADR(buf), -1); |
222 | a := sysfunc3(9, SYSTEM.ADR(buf), -1); |
233 | SYSTEM.GET(SYSTEM.ADR(buf) + 22, a) |
223 | SYSTEM.GET(SYSTEM.ADR(buf) + 22, a) |
234 | RETURN a |
224 | RETURN a |
Line 235... | Line 225... | ||
235 | END AppAdr; |
225 | END AppAdr; |
236 | 226 | ||
237 | 227 | ||
238 | PROCEDURE GetCommandLine* (): INTEGER; |
- | |
239 | VAR |
228 | PROCEDURE GetCommandLine* (): INTEGER; |
240 | param: INTEGER; |
229 | VAR |
241 | 230 | param: INTEGER; |
|
242 | BEGIN |
231 | BEGIN |
Line 243... | Line 232... | ||
243 | SYSTEM.GET(28 + AppAdr(), param) |
232 | SYSTEM.GET(28 + AppAdr(), param) |
244 | RETURN param |
233 | RETURN param |
245 | END GetCommandLine; |
234 | END GetCommandLine; |
246 | - | ||
247 | 235 | ||
248 | PROCEDURE GetName* (): INTEGER; |
236 | |
249 | VAR |
237 | PROCEDURE GetName* (): INTEGER; |
250 | name: INTEGER; |
238 | VAR |
Line 274... | Line 262... | ||
274 | 262 | ||
275 | PROCEDURE GetProcAdr* (name: ARRAY OF CHAR; lib: INTEGER): INTEGER; |
263 | PROCEDURE GetProcAdr* (name: ARRAY OF CHAR; lib: INTEGER): INTEGER; |
276 | VAR |
264 | VAR |
Line 277... | Line -... | ||
277 | cur, procname, adr: INTEGER; |
- | |
278 | 265 | cur, procname, adr: INTEGER; |
|
279 | 266 | ||
280 | PROCEDURE streq (str1, str2: INTEGER): BOOLEAN; |
267 | PROCEDURE streq (str1, str2: INTEGER): BOOLEAN; |
281 | VAR |
- | |
282 | c1, c2: CHAR; |
268 | VAR |
283 | 269 | c1, c2: CHAR; |
|
284 | BEGIN |
270 | BEGIN |
285 | REPEAT |
271 | REPEAT |
286 | SYSTEM.GET(str1, c1); |
272 | SYSTEM.GET(str1, c1); |
Line 290... | Line 276... | ||
290 | UNTIL (c1 # c2) OR (c1 = 0X) |
276 | UNTIL (c1 # c2) OR (c1 = 0X) |
Line 291... | Line 277... | ||
291 | 277 | ||
292 | RETURN c1 = c2 |
278 | RETURN c1 = c2 |
Line 293... | Line -... | ||
293 | END streq; |
- | |
294 | 279 | END streq; |
|
295 | 280 | ||
296 | BEGIN |
281 | BEGIN |
297 | adr := 0; |
282 | adr := 0; |
298 | IF (lib # 0) & (name # "") THEN |
283 | IF (lib # 0) & (name # "") THEN |
Line 311... | Line 296... | ||
311 | 296 | ||
312 | 297 | ||
313 | PROCEDURE init (dll: INTEGER); |
298 | PROCEDURE init (dll: INTEGER); |
314 | VAR |
- | |
315 | lib_init: INTEGER; |
299 | VAR |
316 | 300 | lib_init: INTEGER; |
|
317 | BEGIN |
301 | BEGIN |
318 | lib_init := GetProcAdr("lib_init", dll); |
302 | lib_init := GetProcAdr("lib_init", dll); |
319 | IF lib_init # 0 THEN |
303 | IF lib_init # 0 THEN |
Line 324... | Line 308... | ||
324 | DLL_INIT(lib_init) |
308 | DLL_INIT(lib_init) |
325 | END |
309 | END |
326 | END init; |
310 | END init; |
Line -... | Line 311... | ||
- | 311 | ||
- | 312 | ||
- | 313 | PROCEDURE OutChar* (c: CHAR); |
|
- | 314 | BEGIN |
|
- | 315 | sysfunc3(63, 1, ORD(c)) |
|
- | 316 | END OutChar; |
|
- | 317 | ||
- | 318 | ||
- | 319 | PROCEDURE OutLn*; |
|
- | 320 | BEGIN |
|
- | 321 | OutChar(0DX); |
|
- | 322 | OutChar(0AX) |
|
- | 323 | END OutLn; |
|
- | 324 | ||
- | 325 | ||
- | 326 | PROCEDURE OutString (s: ARRAY OF CHAR); |
|
- | 327 | VAR |
|
- | 328 | i: INTEGER; |
|
- | 329 | BEGIN |
|
- | 330 | i := 0; |
|
- | 331 | WHILE (i < LEN(s)) & (s[i] # 0X) DO |
|
- | 332 | OutChar(s[i]); |
|
- | 333 | INC(i) |
|
- | 334 | END |
|
- | 335 | END OutString; |
|
- | 336 | ||
- | 337 | ||
- | 338 | PROCEDURE imp_error (lib, proc: STRING); |
|
- | 339 | BEGIN |
|
- | 340 | OutString("import error: "); |
|
- | 341 | IF proc = "" THEN |
|
- | 342 | OutString("can't load '") |
|
- | 343 | ELSE |
|
- | 344 | OutString("not found '"); OutString(proc); OutString("' in '") |
|
- | 345 | END; |
|
- | 346 | OutString(lib); |
|
- | 347 | OutString("'" + 0DX + 0AX) |
|
- | 348 | END imp_error; |
|
327 | 349 | ||
328 | 350 | ||
329 | PROCEDURE GetStr (adr, i: INTEGER; VAR str: STRING); |
351 | PROCEDURE GetStr (adr, i: INTEGER; VAR str: STRING); |
330 | VAR |
352 | VAR |
331 | c: CHAR; |
353 | c: CHAR; |
Line 335... | Line 357... | ||
335 | str[i] := c; INC(i) |
357 | str[i] := c; INC(i) |
336 | UNTIL c = 0X |
358 | UNTIL c = 0X |
337 | END GetStr; |
359 | END GetStr; |
Line 338... | Line 360... | ||
338 | 360 | ||
339 | 361 | ||
340 | PROCEDURE [stdcall] dll_Load* (import_table: INTEGER): INTEGER; |
362 | PROCEDURE [stdcall-] dll_Load* (import_table: INTEGER): INTEGER; |
341 | CONST |
363 | CONST |
342 | path = "/sys/lib/"; |
364 | path = "/sys/lib/"; |
343 | VAR |
- | |
344 | imp, lib, exp, proc, res, pathLen: INTEGER; |
365 | VAR |
345 | fail, done: BOOLEAN; |
- | |
346 | procname, libname: STRING; |
366 | imp, lib, exp, proc, pathLen: INTEGER; |
347 | 367 | procname, libname: STRING; |
|
348 | BEGIN |
- | |
349 | SYSTEM.CODE(060H); (* pusha *) |
- | |
350 | fail := FALSE; |
- | |
351 | done := FALSE; |
368 | BEGIN |
352 | res := 0; |
369 | SYSTEM.CODE(060H); (* pusha *) |
353 | libname := path; |
370 | libname := path; |
354 | pathLen := LENGTH(libname); |
371 | pathLen := LENGTH(libname); |
355 | REPEAT |
372 | |
356 | SYSTEM.GET(import_table, imp); |
373 | SYSTEM.GET(import_table, imp); |
357 | IF imp # 0 THEN |
374 | WHILE imp # 0 DO |
358 | SYSTEM.GET(import_table + 4, lib); |
375 | SYSTEM.GET(import_table + 4, lib); |
359 | GetStr(lib, pathLen, libname); |
376 | GetStr(lib, pathLen, libname); |
- | 377 | exp := sysfunc3(68, 19, SYSTEM.ADR(libname[0])); |
|
360 | exp := sysfunc3(68, 19, SYSTEM.ADR(libname[0])); |
378 | IF exp = 0 THEN |
361 | fail := exp = 0; |
- | |
362 | ELSE |
- | |
363 | done := TRUE |
- | |
364 | END; |
- | |
365 | IF fail THEN |
- | |
366 | done := TRUE; |
- | |
367 | imp_error.proc := ""; |
- | |
368 | imp_error.lib := libname; |
- | |
369 | imp_error.error := 1 |
- | |
370 | END; |
379 | imp_error(libname, "") |
371 | IF (imp # 0) & ~fail THEN |
380 | ELSE |
372 | REPEAT |
381 | REPEAT |
373 | SYSTEM.GET(imp, proc); |
382 | SYSTEM.GET(imp, proc); |
374 | IF proc # 0 THEN |
383 | IF proc # 0 THEN |
375 | GetStr(proc, 0, procname); |
384 | GetStr(proc, 0, procname); |
376 | proc := GetProcAdr(procname, exp); |
385 | proc := GetProcAdr(procname, exp); |
377 | IF proc # 0 THEN |
- | |
378 | SYSTEM.PUT(imp, proc); |
386 | IF proc # 0 THEN |
379 | INC(imp, 4) |
387 | SYSTEM.PUT(imp, proc) |
380 | ELSE |
388 | ELSE |
381 | imp_error.proc := procname; |
389 | proc := 1; |
382 | imp_error.lib := libname; |
390 | imp_error(libname, procname) |
383 | imp_error.error := 2 |
391 | END; |
384 | END |
392 | INC(imp, 4) |
385 | END |
393 | END |
386 | UNTIL proc = 0; |
- | |
387 | init(exp); |
- | |
388 | INC(import_table, 8) |
- | |
389 | END |
- | |
390 | UNTIL done; |
- | |
391 | IF fail THEN |
394 | UNTIL proc = 0; |
392 | res := 1 |
395 | init(exp) |
- | 396 | END; |
|
- | 397 | INC(import_table, 8); |
|
- | 398 | SYSTEM.GET(import_table, imp); |
|
393 | END; |
399 | END; |
394 | import_table := res; |
400 | |
395 | SYSTEM.CODE(061H) (* popa *) |
401 | SYSTEM.CODE(061H) (* popa *) |
Line 396... | Line 402... | ||
396 | RETURN import_table |
402 | RETURN 0 |
397 | END dll_Load; |
403 | END dll_Load; |
Line 408... | Line 414... | ||
408 | 414 | ||
409 | 415 | ||
410 | PROCEDURE LoadLib* (name: ARRAY OF CHAR): INTEGER; |
416 | PROCEDURE LoadLib* (name: ARRAY OF CHAR): INTEGER; |
411 | VAR |
- | |
412 | Lib: INTEGER; |
417 | VAR |
413 | 418 | Lib: INTEGER; |
|
414 | BEGIN |
419 | BEGIN |
415 | DLL_INIT := dll_Init; |
420 | DLL_INIT := dll_Init; |
416 | Lib := sysfunc3(68, 19, SYSTEM.ADR(name[0])); |
421 | Lib := sysfunc3(68, 19, SYSTEM.ADR(name[0])); |
417 | IF Lib # 0 THEN |
422 | IF Lib # 0 THEN |
418 | init(Lib) |
423 | init(Lib) |
419 | END |
424 | END |
Line 420... | Line 425... | ||
420 | RETURN Lib |
425 | RETURN Lib |
421 | END LoadLib; |
426 | END LoadLib; |
422 | 427 | ||
423 | - | ||
424 | PROCEDURE _init*; |
428 | |
425 | BEGIN |
- | |
426 | DLL_INIT := dll_Init; |
429 | PROCEDURE _init* (import_table: INTEGER); |
Line 427... | Line 430... | ||
427 | imp_error.lib := ""; |
430 | BEGIN |
428 | imp_error.proc := ""; |
431 | DLL_INIT := dll_Init; |