Rev 7983 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7983 | Rev 8097 | ||
---|---|---|---|
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
3 | 3 | ||
4 | Copyright (c) 2019-2020, Anton Krotov |
4 | Copyright (c) 2019-2020, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
6 | *) |
6 | *) |
7 | 7 | ||
8 | MODULE HOST; |
8 | MODULE HOST; |
9 | 9 | ||
10 | IMPORT SYSTEM, API, RTL; |
10 | IMPORT SYSTEM, API, RTL; |
11 | 11 | ||
12 | 12 | ||
13 | CONST |
13 | CONST |
14 | 14 | ||
15 | slash* = "/"; |
15 | slash* = "/"; |
16 | OS* = "LINUX"; |
16 | eol* = 0AX; |
17 | 17 | ||
18 | bit_depth* = RTL.bit_depth; |
18 | bit_depth* = RTL.bit_depth; |
19 | maxint* = RTL.maxint; |
19 | maxint* = RTL.maxint; |
20 | minint* = RTL.minint; |
20 | minint* = RTL.minint; |
- | 21 | ||
- | 22 | RTLD_LAZY = 1; |
|
- | 23 | ||
- | 24 | ||
- | 25 | TYPE |
|
- | 26 | ||
- | 27 | TP = ARRAY 2 OF INTEGER; |
|
21 | 28 | ||
22 | 29 | ||
23 | VAR |
30 | VAR |
- | 31 | ||
- | 32 | maxreal*: REAL; |
|
24 | 33 | ||
25 | argc: INTEGER; |
34 | argc: INTEGER; |
26 | 35 | ||
- | 36 | libc, librt: INTEGER; |
|
- | 37 | ||
- | 38 | stdout: INTEGER; |
|
- | 39 | ||
- | 40 | fread, fwrite : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER; |
|
- | 41 | fopen : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER; |
|
- | 42 | fclose : PROCEDURE [linux] (file: INTEGER): INTEGER; |
|
- | 43 | _chmod : PROCEDURE [linux] (fname: INTEGER; mode: SET): INTEGER; |
|
27 | eol*: ARRAY 2 OF CHAR; |
44 | time : PROCEDURE [linux] (ptr: INTEGER): INTEGER; |
28 | 45 | clock_gettime : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER; |
|
29 | maxreal*: REAL; |
46 | exit : PROCEDURE [linux] (code: INTEGER); |
30 | 47 | ||
31 | 48 | ||
32 | PROCEDURE ExitProcess* (code: INTEGER); |
49 | PROCEDURE ExitProcess* (code: INTEGER); |
33 | BEGIN |
50 | BEGIN |
34 | API.exit(code) |
51 | exit(code) |
35 | END ExitProcess; |
52 | END ExitProcess; |
36 | 53 | ||
37 | 54 | ||
38 | PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); |
55 | PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); |
39 | VAR |
56 | VAR |
40 | i, len, ptr: INTEGER; |
57 | i, len, ptr: INTEGER; |
41 | c: CHAR; |
58 | c: CHAR; |
42 | 59 | ||
43 | BEGIN |
60 | BEGIN |
44 | i := 0; |
61 | i := 0; |
45 | len := LEN(s) - 1; |
62 | len := LEN(s) - 1; |
46 | IF (n < argc) & (len > 0) THEN |
63 | IF (n < argc) & (len > 0) THEN |
47 | SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr); |
64 | SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr); |
48 | REPEAT |
65 | REPEAT |
49 | SYSTEM.GET(ptr, c); |
66 | SYSTEM.GET(ptr, c); |
50 | s[i] := c; |
67 | s[i] := c; |
51 | INC(i); |
68 | INC(i); |
52 | INC(ptr) |
69 | INC(ptr) |
53 | UNTIL (c = 0X) OR (i = len) |
70 | UNTIL (c = 0X) OR (i = len) |
54 | END; |
71 | END; |
55 | s[i] := 0X |
72 | s[i] := 0X |
56 | END GetArg; |
73 | END GetArg; |
57 | 74 | ||
58 | 75 | ||
59 | PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR); |
76 | PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR); |
60 | VAR |
77 | VAR |
61 | n: INTEGER; |
78 | n: INTEGER; |
62 | 79 | ||
63 | BEGIN |
80 | BEGIN |
64 | GetArg(0, path); |
81 | GetArg(0, path); |
65 | n := LENGTH(path) - 1; |
82 | n := LENGTH(path) - 1; |
66 | WHILE path[n] # slash DO |
83 | WHILE path[n] # slash DO |
67 | DEC(n) |
84 | DEC(n) |
68 | END; |
85 | END; |
69 | path[n + 1] := 0X |
86 | path[n + 1] := 0X |
70 | END GetCurrentDirectory; |
87 | END GetCurrentDirectory; |
71 | 88 | ||
72 | 89 | ||
73 | PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; |
90 | PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; |
74 | VAR |
91 | VAR |
75 | res: INTEGER; |
92 | res: INTEGER; |
76 | 93 | ||
77 | BEGIN |
94 | BEGIN |
78 | res := API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F); |
95 | res := fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F); |
79 | IF res <= 0 THEN |
96 | IF res <= 0 THEN |
80 | res := -1 |
97 | res := -1 |
81 | END |
98 | END |
82 | 99 | ||
83 | RETURN res |
100 | RETURN res |
84 | END FileRead; |
101 | END FileRead; |
85 | 102 | ||
86 | 103 | ||
87 | PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; |
104 | PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; |
88 | VAR |
105 | VAR |
89 | res: INTEGER; |
106 | res: INTEGER; |
90 | 107 | ||
91 | BEGIN |
108 | BEGIN |
92 | res := API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F); |
109 | res := fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F); |
93 | IF res <= 0 THEN |
110 | IF res <= 0 THEN |
94 | res := -1 |
111 | res := -1 |
95 | END |
112 | END |
96 | 113 | ||
97 | RETURN res |
114 | RETURN res |
98 | END FileWrite; |
115 | END FileWrite; |
99 | 116 | ||
100 | 117 | ||
101 | PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER; |
118 | PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER; |
102 | RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb")) |
119 | RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb")) |
103 | END FileCreate; |
120 | END FileCreate; |
104 | 121 | ||
105 | 122 | ||
106 | PROCEDURE FileClose* (File: INTEGER); |
123 | PROCEDURE FileClose* (File: INTEGER); |
107 | BEGIN |
124 | BEGIN |
108 | File := API.fclose(File) |
125 | File := fclose(File) |
109 | END FileClose; |
126 | END FileClose; |
110 | 127 | ||
- | 128 | ||
- | 129 | PROCEDURE chmod* (FName: ARRAY OF CHAR); |
|
- | 130 | VAR |
|
- | 131 | res: INTEGER; |
|
- | 132 | BEGIN |
|
- | 133 | res := _chmod(SYSTEM.ADR(FName[0]), {0, 2..8}) (* rwxrwxr-x *) |
|
- | 134 | END chmod; |
|
- | 135 | ||
111 | 136 | ||
112 | PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER; |
137 | PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER; |
113 | RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb")) |
138 | RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb")) |
114 | END FileOpen; |
139 | END FileOpen; |
115 | 140 | ||
116 | 141 | ||
117 | PROCEDURE OutChar* (c: CHAR); |
142 | PROCEDURE OutChar* (c: CHAR); |
- | 143 | VAR |
|
- | 144 | res: INTEGER; |
|
- | 145 | ||
118 | BEGIN |
146 | BEGIN |
119 | API.putc(c) |
147 | res := fwrite(SYSTEM.ADR(c), 1, 1, stdout) |
120 | END OutChar; |
148 | END OutChar; |
121 | 149 | ||
122 | 150 | ||
123 | PROCEDURE GetTickCount* (): INTEGER; |
151 | PROCEDURE GetTickCount* (): INTEGER; |
124 | VAR |
152 | VAR |
125 | tp: API.TP; |
153 | tp: TP; |
126 | res: INTEGER; |
154 | res: INTEGER; |
127 | 155 | ||
128 | BEGIN |
156 | BEGIN |
129 | IF API.clock_gettime(0, tp) = 0 THEN |
157 | IF clock_gettime(0, tp) = 0 THEN |
130 | res := tp[0] * 100 + tp[1] DIV 10000000 |
158 | res := tp[0] * 100 + tp[1] DIV 10000000 |
131 | ELSE |
159 | ELSE |
132 | res := 0 |
160 | res := 0 |
133 | END |
161 | END |
134 | 162 | ||
135 | RETURN res |
163 | RETURN res |
136 | END GetTickCount; |
164 | END GetTickCount; |
137 | 165 | ||
138 | 166 | ||
139 | PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN; |
167 | PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN; |
140 | RETURN path[0] # slash |
168 | RETURN path[0] # slash |
141 | END isRelative; |
169 | END isRelative; |
142 | 170 | ||
143 | - | ||
144 | PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER); |
- | |
145 | END now; |
- | |
146 | - | ||
147 | 171 | ||
148 | PROCEDURE UnixTime* (): INTEGER; |
172 | PROCEDURE UnixTime* (): INTEGER; |
149 | RETURN API.time(0) |
173 | RETURN time(0) |
150 | END UnixTime; |
174 | END UnixTime; |
151 | 175 | ||
- | 176 | ||
- | 177 | PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER; |
|
- | 178 | BEGIN |
|
- | 179 | SYSTEM.GET32(SYSTEM.ADR(x), a); |
|
- | 180 | SYSTEM.GET32(SYSTEM.ADR(x) + 4, b) |
|
- | 181 | RETURN a |
|
- | 182 | END splitf; |
|
- | 183 | ||
152 | 184 | ||
153 | PROCEDURE d2s* (x: REAL): INTEGER; |
185 | PROCEDURE d2s* (x: REAL): INTEGER; |
154 | VAR |
186 | VAR |
155 | h, l, s, e: INTEGER; |
187 | h, l, s, e: INTEGER; |
156 | 188 | ||
157 | BEGIN |
189 | BEGIN |
158 | SYSTEM.GET(SYSTEM.ADR(x), l); |
- | |
159 | SYSTEM.GET(SYSTEM.ADR(x) + 4, h); |
190 | e := splitf(x, l, h); |
160 | 191 | ||
161 | s := ASR(h, 31) MOD 2; |
192 | s := ASR(h, 31) MOD 2; |
162 | e := (h DIV 100000H) MOD 2048; |
193 | e := (h DIV 100000H) MOD 2048; |
163 | IF e <= 896 THEN |
194 | IF e <= 896 THEN |
164 | h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H; |
195 | h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H; |
165 | REPEAT |
196 | REPEAT |
166 | h := h DIV 2; |
197 | h := h DIV 2; |
167 | INC(e) |
198 | INC(e) |
168 | UNTIL e = 897; |
199 | UNTIL e = 897; |
169 | e := 896; |
200 | e := 896; |
170 | l := (h MOD 8) * 20000000H; |
201 | l := (h MOD 8) * 20000000H; |
171 | h := h DIV 8 |
202 | h := h DIV 8 |
172 | ELSIF (1151 <= e) & (e < 2047) THEN |
203 | ELSIF (1151 <= e) & (e < 2047) THEN |
173 | e := 1151; |
204 | e := 1151; |
174 | h := 0; |
205 | h := 0; |
175 | l := 0 |
206 | l := 0 |
176 | ELSIF e = 2047 THEN |
207 | ELSIF e = 2047 THEN |
177 | e := 1151; |
208 | e := 1151; |
178 | IF (h MOD 100000H # 0) OR (l # 0) THEN |
209 | IF (h MOD 100000H # 0) OR (BITS(l) * {0..31} # {}) THEN |
179 | h := 80000H; |
210 | h := 80000H; |
180 | l := 0 |
211 | l := 0 |
181 | END |
212 | END |
182 | END; |
213 | END; |
183 | DEC(e, 896) |
214 | DEC(e, 896) |
184 | 215 | ||
185 | RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 |
216 | RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 |
186 | END d2s; |
217 | END d2s; |
187 | 218 | ||
188 | 219 | ||
189 | PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER; |
220 | PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER); |
190 | VAR |
221 | VAR |
191 | res: INTEGER; |
222 | sym: INTEGER; |
192 | - | ||
193 | BEGIN |
- | |
194 | a := 0; |
223 | |
195 | b := 0; |
224 | BEGIN |
196 | SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4); |
225 | sym := API.dlsym(lib, SYSTEM.ADR(name[0])); |
197 | SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4); |
- | |
198 | SYSTEM.GET(SYSTEM.ADR(x), res) |
226 | ASSERT(sym # 0); |
199 | RETURN res |
227 | SYSTEM.PUT(VarAdr, sym) |
200 | END splitf; |
228 | END GetSym; |
201 | 229 | ||
202 | 230 | ||
203 | BEGIN |
231 | BEGIN |
204 | eol := 0AX; |
- | |
205 | maxreal := 1.9; |
232 | maxreal := 1.9; |
206 | PACK(maxreal, 1023); |
233 | PACK(maxreal, 1023); |
207 | SYSTEM.GET(API.MainParam, argc) |
234 | SYSTEM.GET(API.MainParam, argc); |
- | 235 | ||
- | 236 | libc := API.libc; |
|
- | 237 | GetSym(libc, "fread", SYSTEM.ADR(fread)); |
|
- | 238 | GetSym(libc, "fwrite", SYSTEM.ADR(fwrite)); |
|
- | 239 | GetSym(libc, "fopen", SYSTEM.ADR(fopen)); |
|
- | 240 | GetSym(libc, "fclose", SYSTEM.ADR(fclose)); |
|
- | 241 | GetSym(libc, "chmod", SYSTEM.ADR(_chmod)); |
|
- | 242 | GetSym(libc, "time", SYSTEM.ADR(time)); |
|
- | 243 | GetSym(libc, "exit", SYSTEM.ADR(exit)); |
|
- | 244 | GetSym(libc, "stdout", SYSTEM.ADR(stdout)); SYSTEM.GET(stdout - SYSTEM.SIZE(INTEGER), stdout); |
|
- | 245 | ||
- | 246 | librt := API.dlopen(SYSTEM.SADR("librt.so.1"), RTLD_LAZY); |
|
- | 247 | GetSym(librt, "clock_gettime", SYSTEM.ADR(clock_gettime)) |
|
208 | END HOST.>=>=>=>=>> |
248 | END HOST.>=>=>=>=>> |
209 | 249 |