Rev 7696 | 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 | |||
7696 | akron1 | 15 | RTLD_LAZY* = 1; |
7983 | leency | 16 | BIT_DEPTH* = 32; |
7597 | akron1 | 17 | |
18 | |||
6613 | leency | 19 | TYPE |
20 | |||
7597 | akron1 | 21 | TP* = ARRAY 2 OF INTEGER; |
7983 | leency | 22 | SOFINI* = PROCEDURE; |
6613 | leency | 23 | |
7597 | akron1 | 24 | |
6613 | leency | 25 | VAR |
26 | |||
7696 | akron1 | 27 | eol*: ARRAY 2 OF CHAR; |
28 | MainParam*: INTEGER; |
||
6613 | leency | 29 | |
7597 | akron1 | 30 | libc*, librt*: INTEGER; |
6613 | leency | 31 | |
7597 | akron1 | 32 | dlopen* : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER; |
33 | dlsym* : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER; |
||
6613 | leency | 34 | |
7597 | akron1 | 35 | stdout*, |
36 | stdin*, |
||
37 | stderr* : INTEGER; |
||
6613 | leency | 38 | |
7597 | akron1 | 39 | malloc* : PROCEDURE [linux] (size: INTEGER): INTEGER; |
40 | free* : PROCEDURE [linux] (ptr: INTEGER); |
||
41 | _exit* : PROCEDURE [linux] (code: INTEGER); |
||
42 | puts* : PROCEDURE [linux] (pStr: INTEGER); |
||
43 | fwrite*, |
||
44 | fread* : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER; |
||
45 | fopen* : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER; |
||
46 | fclose* : PROCEDURE [linux] (file: INTEGER): INTEGER; |
||
6613 | leency | 47 | |
7597 | akron1 | 48 | clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER; |
49 | time* : PROCEDURE [linux] (ptr: INTEGER): INTEGER; |
||
6613 | leency | 50 | |
7983 | leency | 51 | fini: SOFINI; |
6613 | leency | 52 | |
7983 | leency | 53 | |
7597 | akron1 | 54 | PROCEDURE putc* (c: CHAR); |
55 | VAR |
||
56 | res: INTEGER; |
||
6613 | leency | 57 | |
58 | BEGIN |
||
7597 | akron1 | 59 | res := fwrite(SYSTEM.ADR(c), 1, 1, stdout) |
60 | END putc; |
||
6613 | leency | 61 | |
7597 | akron1 | 62 | |
6613 | leency | 63 | PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER); |
64 | BEGIN |
||
7597 | akron1 | 65 | puts(lpCaption); |
66 | puts(lpText) |
||
6613 | leency | 67 | END DebugMsg; |
68 | |||
7597 | akron1 | 69 | |
70 | PROCEDURE _NEW* (size: INTEGER): INTEGER; |
||
71 | VAR |
||
72 | res, ptr, words: INTEGER; |
||
73 | |||
6613 | leency | 74 | BEGIN |
7597 | akron1 | 75 | res := malloc(size); |
76 | IF res # 0 THEN |
||
77 | ptr := res; |
||
78 | words := size DIV SYSTEM.SIZE(INTEGER); |
||
79 | WHILE words > 0 DO |
||
80 | SYSTEM.PUT(ptr, 0); |
||
81 | INC(ptr, SYSTEM.SIZE(INTEGER)); |
||
82 | DEC(words) |
||
83 | END |
||
84 | END |
||
6613 | leency | 85 | |
7597 | akron1 | 86 | RETURN res |
87 | END _NEW; |
||
88 | |||
89 | |||
90 | PROCEDURE _DISPOSE* (p: INTEGER): INTEGER; |
||
7107 | akron1 | 91 | BEGIN |
7597 | akron1 | 92 | free(p) |
93 | RETURN 0 |
||
94 | END _DISPOSE; |
||
7107 | akron1 | 95 | |
7597 | akron1 | 96 | |
97 | PROCEDURE GetProcAdr (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER); |
||
98 | VAR |
||
99 | sym: INTEGER; |
||
7696 | akron1 | 100 | |
6613 | leency | 101 | BEGIN |
7597 | akron1 | 102 | sym := dlsym(lib, SYSTEM.ADR(name[0])); |
103 | ASSERT(sym # 0); |
||
104 | SYSTEM.PUT(VarAdr, sym) |
||
105 | END GetProcAdr; |
||
6613 | leency | 106 | |
7597 | akron1 | 107 | |
108 | PROCEDURE init* (sp, code: INTEGER); |
||
6613 | leency | 109 | BEGIN |
7983 | leency | 110 | fini := NIL; |
7597 | akron1 | 111 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen); |
112 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER), dlsym); |
||
113 | MainParam := sp; |
||
114 | eol := 0AX; |
||
6613 | leency | 115 | |
7696 | akron1 | 116 | libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY); |
7597 | akron1 | 117 | GetProcAdr(libc, "malloc", SYSTEM.ADR(malloc)); |
118 | GetProcAdr(libc, "free", SYSTEM.ADR(free)); |
||
119 | GetProcAdr(libc, "exit", SYSTEM.ADR(_exit)); |
||
120 | GetProcAdr(libc, "stdout", SYSTEM.ADR(stdout)); |
||
121 | GetProcAdr(libc, "stdin", SYSTEM.ADR(stdin)); |
||
122 | GetProcAdr(libc, "stderr", SYSTEM.ADR(stderr)); |
||
123 | SYSTEM.GET(stdout - SYSTEM.SIZE(INTEGER), stdout); |
||
124 | SYSTEM.GET(stdin - SYSTEM.SIZE(INTEGER), stdin); |
||
125 | SYSTEM.GET(stderr - SYSTEM.SIZE(INTEGER), stderr); |
||
126 | GetProcAdr(libc, "puts", SYSTEM.ADR(puts)); |
||
127 | GetProcAdr(libc, "fwrite", SYSTEM.ADR(fwrite)); |
||
128 | GetProcAdr(libc, "fread", SYSTEM.ADR(fread)); |
||
129 | GetProcAdr(libc, "fopen", SYSTEM.ADR(fopen)); |
||
130 | GetProcAdr(libc, "fclose", SYSTEM.ADR(fclose)); |
||
131 | GetProcAdr(libc, "time", SYSTEM.ADR(time)); |
||
6613 | leency | 132 | |
7696 | akron1 | 133 | librt := dlopen(SYSTEM.SADR("librt.so.1"), RTLD_LAZY); |
7597 | akron1 | 134 | GetProcAdr(librt, "clock_gettime", SYSTEM.ADR(clock_gettime)) |
6613 | leency | 135 | END init; |
136 | |||
7597 | akron1 | 137 | |
138 | PROCEDURE exit* (code: INTEGER); |
||
139 | BEGIN |
||
140 | _exit(code) |
||
141 | END exit; |
||
142 | |||
143 | |||
144 | PROCEDURE exit_thread* (code: INTEGER); |
||
145 | BEGIN |
||
146 | _exit(code) |
||
147 | END exit_thread; |
||
148 | |||
149 | |||
7983 | leency | 150 | PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER; |
151 | RETURN 0 |
||
152 | END dllentry; |
||
153 | |||
154 | |||
155 | PROCEDURE sofinit*; |
||
156 | BEGIN |
||
157 | IF fini # NIL THEN |
||
158 | fini |
||
159 | END |
||
160 | END sofinit; |
||
161 | |||
162 | |||
163 | PROCEDURE SetFini* (ProcFini: SOFINI); |
||
164 | BEGIN |
||
165 | fini := ProcFini |
||
166 | END SetFini; |
||
167 | |||
168 | |||
169 | END API. |