Rev 7983 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7983 | Rev 8097 | ||
---|---|---|---|
Line 10... | Line 10... | ||
10 | IMPORT SYSTEM; |
10 | IMPORT SYSTEM; |
Line 11... | Line 11... | ||
11 | 11 | ||
Line 12... | Line 12... | ||
12 | 12 | ||
- | 13 | CONST |
|
13 | CONST |
14 | |
Line -... | Line 15... | ||
- | 15 | eol* = 0AX; |
|
- | 16 | ||
Line 14... | Line 17... | ||
14 | 17 | BIT_DEPTH* = 32; |
|
Line 15... | Line -... | ||
15 | RTLD_LAZY* = 1; |
- | |
16 | BIT_DEPTH* = 32; |
18 | |
Line 17... | Line 19... | ||
17 | 19 | RTLD_LAZY = 1; |
|
Line 18... | Line -... | ||
18 | - | ||
19 | TYPE |
20 | |
20 | - | ||
21 | TP* = ARRAY 2 OF INTEGER; |
- | |
Line 22... | Line 21... | ||
22 | SOFINI* = PROCEDURE; |
21 | |
23 | 22 | TYPE |
|
Line 24... | Line -... | ||
24 | - | ||
25 | VAR |
23 | |
26 | - | ||
27 | eol*: ARRAY 2 OF CHAR; |
- | |
28 | MainParam*: INTEGER; |
- | |
29 | - | ||
30 | libc*, librt*: INTEGER; |
24 | SOFINI = PROCEDURE; |
31 | 25 | ||
32 | dlopen* : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER; |
- | |
33 | dlsym* : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER; |
- | |
34 | - | ||
35 | stdout*, |
26 | |
36 | stdin*, |
- | |
37 | stderr* : INTEGER; |
- | |
38 | 27 | VAR |
|
Line 39... | Line 28... | ||
39 | malloc* : PROCEDURE [linux] (size: INTEGER): INTEGER; |
28 | |
Line 40... | Line -... | ||
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; |
- | |
47 | - | ||
48 | clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER; |
- | |
49 | time* : PROCEDURE [linux] (ptr: INTEGER): INTEGER; |
29 | MainParam*, libc*: INTEGER; |
50 | 30 | ||
51 | fini: SOFINI; |
31 | dlopen* : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER; |
52 | 32 | dlsym* : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER; |
|
53 | 33 | ||
Line 92... | Line 72... | ||
92 | free(p) |
72 | free(p) |
93 | RETURN 0 |
73 | RETURN 0 |
94 | END _DISPOSE; |
74 | END _DISPOSE; |
Line 95... | Line 75... | ||
95 | 75 | ||
96 | 76 | ||
97 | PROCEDURE GetProcAdr (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER); |
77 | PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER); |
Line 98... | Line 78... | ||
98 | VAR |
78 | VAR |
99 | sym: INTEGER; |
79 | sym: INTEGER; |
100 | 80 | ||
101 | BEGIN |
81 | BEGIN |
102 | sym := dlsym(lib, SYSTEM.ADR(name[0])); |
82 | sym := dlsym(lib, SYSTEM.ADR(name[0])); |
Line 103... | Line 83... | ||
103 | ASSERT(sym # 0); |
83 | ASSERT(sym # 0); |
104 | SYSTEM.PUT(VarAdr, sym) |
84 | SYSTEM.PUT(VarAdr, sym) |
105 | END GetProcAdr; |
85 | END GetSym; |
106 | 86 | ||
107 | 87 | ||
108 | PROCEDURE init* (sp, code: INTEGER); |
88 | PROCEDURE init* (sp, code: INTEGER); |
109 | BEGIN |
- | |
Line 110... | Line 89... | ||
110 | fini := NIL; |
89 | BEGIN |
111 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen); |
- | |
112 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER), dlsym); |
- | |
113 | MainParam := sp; |
90 | fini := NIL; |
114 | eol := 0AX; |
- | |
115 | - | ||
116 | libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY); |
91 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen); |
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)); |
92 | SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER), dlsym); |
121 | GetProcAdr(libc, "stdin", SYSTEM.ADR(stdin)); |
93 | MainParam := sp; |
122 | GetProcAdr(libc, "stderr", SYSTEM.ADR(stderr)); |
94 | |
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)); |
95 | libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY); |
Line 130... | Line -... | ||
130 | GetProcAdr(libc, "fclose", SYSTEM.ADR(fclose)); |
- | |
131 | GetProcAdr(libc, "time", SYSTEM.ADR(time)); |
- | |
132 | - | ||
133 | librt := dlopen(SYSTEM.SADR("librt.so.1"), RTLD_LAZY); |
- | |
134 | GetProcAdr(librt, "clock_gettime", SYSTEM.ADR(clock_gettime)) |
- | |
135 | END init; |
- | |
136 | - | ||
137 | - | ||
138 | PROCEDURE exit* (code: INTEGER); |
- | |
139 | BEGIN |
- | |
140 | _exit(code) |
- | |
141 | END exit; |
- | |
142 | 96 | GetSym(libc, "exit", SYSTEM.ADR(exit_thread)); |
|
143 | 97 | exit := exit_thread; |
|
144 | PROCEDURE exit_thread* (code: INTEGER); |
98 | GetSym(libc, "puts", SYSTEM.ADR(puts)); |