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 | (* |
2 | BSD 2-Clause License |
||
3 | |||
4 | Copyright (c) 2019-2020, Anton Krotov |
||
5 | All rights reserved. |
||
6 | *) |
||
7 | |||
8 | MODULE API; |
||
9 | |||
10 | IMPORT SYSTEM; |
||
11 | |||
12 | |||
13 | CONST |
||
14 | |||
8097 | maxcodehac | 15 | eol* = 0AX; |
16 | |||
7983 | leency | 17 | BIT_DEPTH* = 64; |
18 | |||
8097 | maxcodehac | 19 | RTLD_LAZY = 1; |
7983 | leency | 20 | |
8097 | maxcodehac | 21 | |
7983 | leency | 22 | TYPE |
23 | |||
8097 | maxcodehac | 24 | SOFINI = PROCEDURE; |
7983 | leency | 25 | |
26 | |||
27 | VAR |
||
28 | |||
8097 | maxcodehac | 29 | MainParam*, libc*: INTEGER; |
7983 | leency | 30 | |
8097 | maxcodehac | 31 | dlopen* : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER; |
32 | dlsym* : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER; |
||
7983 | 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); |
||
7983 | leency | 39 | |
40 | fini: SOFINI; |
||
41 | |||
42 | |||
43 | PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER); |
||
44 | BEGIN |
||
45 | puts(lpCaption); |
||
46 | puts(lpText) |
||
47 | END DebugMsg; |
||
48 | |||
49 | |||
50 | PROCEDURE _NEW* (size: INTEGER): INTEGER; |
||
51 | VAR |
||
52 | res, ptr, words: INTEGER; |
||
53 | |||
54 | BEGIN |
||
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 |
||
65 | |||
66 | RETURN res |
||
67 | END _NEW; |
||
68 | |||
69 | |||
70 | PROCEDURE _DISPOSE* (p: INTEGER): INTEGER; |
||
71 | BEGIN |
||
72 | free(p) |
||
73 | RETURN 0 |
||
74 | END _DISPOSE; |
||
75 | |||
76 | |||
8097 | maxcodehac | 77 | PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER); |
7983 | leency | 78 | VAR |
79 | sym: INTEGER; |
||
80 | |||
81 | BEGIN |
||
82 | sym := dlsym(lib, SYSTEM.ADR(name[0])); |
||
83 | ASSERT(sym # 0); |
||
84 | SYSTEM.PUT(VarAdr, sym) |
||
8097 | maxcodehac | 85 | END GetSym; |
7983 | leency | 86 | |
87 | |||
88 | PROCEDURE init* (sp, code: INTEGER); |
||
89 | BEGIN |
||
90 | fini := NIL; |
||
91 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen); |
||
92 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER), dlsym); |
||
93 | MainParam := sp; |
||
94 | |||
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)); |
||
7983 | leency | 101 | END init; |
102 | |||
103 | |||
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. |