Rev 7983 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7983 | leency | 1 | (* |
7597 | akron1 | 2 | BSD 2-Clause License |
6613 | leency | 3 | |
7983 | leency | 4 | Copyright (c) 2019-2020, Anton Krotov |
7597 | akron1 | 5 | All rights reserved. |
6613 | leency | 6 | *) |
7 | |||
8 | MODULE API; |
||
9 | |||
7597 | akron1 | 10 | IMPORT SYSTEM; |
6613 | leency | 11 | |
7597 | akron1 | 12 | |
13 | CONST |
||
14 | |||
8097 | maxcodehac | 15 | eol* = 0AX; |
16 | |||
7983 | leency | 17 | BIT_DEPTH* = 32; |
7597 | akron1 | 18 | |
8097 | maxcodehac | 19 | RTLD_LAZY = 1; |
7597 | akron1 | 20 | |
8097 | maxcodehac | 21 | |
6613 | leency | 22 | TYPE |
23 | |||
8097 | maxcodehac | 24 | SOFINI = PROCEDURE; |
6613 | leency | 25 | |
7597 | akron1 | 26 | |
6613 | leency | 27 | VAR |
28 | |||
8097 | maxcodehac | 29 | MainParam*, libc*: INTEGER; |
6613 | leency | 30 | |
8097 | maxcodehac | 31 | dlopen* : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER; |
32 | dlsym* : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER; |
||
6613 | leency | 33 | |
8097 | maxcodehac | 34 | exit*, |
35 | exit_thread* : PROCEDURE [linux] (code: INTEGER); |
||
36 | puts : PROCEDURE [linux] (pStr: INTEGER); |
||
37 | malloc : PROCEDURE [linux] (size: INTEGER): INTEGER; |
||
38 | free : PROCEDURE [linux] (ptr: INTEGER); |
||
6613 | leency | 39 | |
7983 | leency | 40 | fini: SOFINI; |
6613 | leency | 41 | |
7983 | leency | 42 | |
6613 | leency | 43 | PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER); |
44 | BEGIN |
||
7597 | akron1 | 45 | puts(lpCaption); |
46 | puts(lpText) |
||
6613 | leency | 47 | END DebugMsg; |
48 | |||
7597 | akron1 | 49 | |
50 | PROCEDURE _NEW* (size: INTEGER): INTEGER; |
||
51 | VAR |
||
52 | res, ptr, words: INTEGER; |
||
53 | |||
6613 | leency | 54 | BEGIN |
7597 | akron1 | 55 | res := malloc(size); |
56 | IF res # 0 THEN |
||
57 | ptr := res; |
||
58 | words := size DIV SYSTEM.SIZE(INTEGER); |
||
59 | WHILE words > 0 DO |
||
60 | SYSTEM.PUT(ptr, 0); |
||
61 | INC(ptr, SYSTEM.SIZE(INTEGER)); |
||
62 | DEC(words) |
||
63 | END |
||
64 | END |
||
6613 | leency | 65 | |
7597 | akron1 | 66 | RETURN res |
67 | END _NEW; |
||
68 | |||
69 | |||
70 | PROCEDURE _DISPOSE* (p: INTEGER): INTEGER; |
||
7107 | akron1 | 71 | BEGIN |
7597 | akron1 | 72 | free(p) |
73 | RETURN 0 |
||
74 | END _DISPOSE; |
||
7107 | akron1 | 75 | |
7597 | akron1 | 76 | |
8097 | maxcodehac | 77 | PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER); |
7597 | akron1 | 78 | VAR |
79 | sym: INTEGER; |
||
7696 | akron1 | 80 | |
6613 | leency | 81 | BEGIN |
7597 | akron1 | 82 | sym := dlsym(lib, SYSTEM.ADR(name[0])); |
83 | ASSERT(sym # 0); |
||
84 | SYSTEM.PUT(VarAdr, sym) |
||
8097 | maxcodehac | 85 | END GetSym; |
6613 | leency | 86 | |
7597 | akron1 | 87 | |
88 | PROCEDURE init* (sp, code: INTEGER); |
||
6613 | leency | 89 | BEGIN |
7983 | leency | 90 | fini := NIL; |
7597 | akron1 | 91 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen); |
92 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER), dlsym); |
||
93 | MainParam := sp; |
||
6613 | leency | 94 | |
7696 | akron1 | 95 | libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY); |
8097 | maxcodehac | 96 | GetSym(libc, "exit", SYSTEM.ADR(exit_thread)); |
97 | exit := exit_thread; |
||
98 | GetSym(libc, "puts", SYSTEM.ADR(puts)); |
||
99 | GetSym(libc, "malloc", SYSTEM.ADR(malloc)); |
||
100 | GetSym(libc, "free", SYSTEM.ADR(free)); |
||
6613 | leency | 101 | END init; |
102 | |||
7597 | akron1 | 103 | |
7983 | leency | 104 | PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER; |
105 | RETURN 0 |
||
106 | END dllentry; |
||
107 | |||
108 | |||
109 | PROCEDURE sofinit*; |
||
110 | BEGIN |
||
111 | IF fini # NIL THEN |
||
112 | fini |
||
113 | END |
||
114 | END sofinit; |
||
115 | |||
116 | |||
117 | PROCEDURE SetFini* (ProcFini: SOFINI); |
||
118 | BEGIN |
||
119 | fini := ProcFini |
||
120 | END SetFini; |
||
121 | |||
122 | |||
123 | END API. |