Rev 7696 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7696 | Rev 7983 | ||
---|---|---|---|
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
3 | 3 | ||
4 | Copyright (c) 2019, 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 | OS* = "LINUX"; |
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 | 21 | ||
22 | 22 | ||
23 | VAR |
23 | VAR |
24 | 24 | ||
25 | argc: INTEGER; |
25 | argc: INTEGER; |
26 | 26 | ||
27 | eol*: ARRAY 2 OF CHAR; |
27 | eol*: ARRAY 2 OF CHAR; |
- | 28 | ||
- | 29 | maxreal*: REAL; |
|
28 | 30 | ||
29 | 31 | ||
30 | PROCEDURE ExitProcess* (code: INTEGER); |
32 | PROCEDURE ExitProcess* (code: INTEGER); |
31 | BEGIN |
33 | BEGIN |
32 | API.exit(code) |
34 | API.exit(code) |
33 | END ExitProcess; |
35 | END ExitProcess; |
34 | 36 | ||
35 | 37 | ||
36 | PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); |
38 | PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); |
37 | VAR |
39 | VAR |
38 | i, len, ptr: INTEGER; |
40 | i, len, ptr: INTEGER; |
39 | c: CHAR; |
41 | c: CHAR; |
40 | 42 | ||
41 | BEGIN |
43 | BEGIN |
42 | i := 0; |
44 | i := 0; |
43 | len := LEN(s) - 1; |
45 | len := LEN(s) - 1; |
44 | IF (n < argc) & (len > 0) THEN |
46 | IF (n < argc) & (len > 0) THEN |
45 | SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr); |
47 | SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr); |
46 | REPEAT |
48 | REPEAT |
47 | SYSTEM.GET(ptr, c); |
49 | SYSTEM.GET(ptr, c); |
48 | s[i] := c; |
50 | s[i] := c; |
49 | INC(i); |
51 | INC(i); |
50 | INC(ptr) |
52 | INC(ptr) |
51 | UNTIL (c = 0X) OR (i = len) |
53 | UNTIL (c = 0X) OR (i = len) |
52 | END; |
54 | END; |
53 | s[i] := 0X |
55 | s[i] := 0X |
54 | END GetArg; |
56 | END GetArg; |
55 | 57 | ||
56 | 58 | ||
57 | PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR); |
59 | PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR); |
58 | VAR |
60 | VAR |
59 | n: INTEGER; |
61 | n: INTEGER; |
60 | 62 | ||
61 | BEGIN |
63 | BEGIN |
62 | GetArg(0, path); |
64 | GetArg(0, path); |
63 | n := LENGTH(path) - 1; |
65 | n := LENGTH(path) - 1; |
64 | WHILE path[n] # slash DO |
66 | WHILE path[n] # slash DO |
65 | DEC(n) |
67 | DEC(n) |
66 | END; |
68 | END; |
67 | path[n + 1] := 0X |
69 | path[n + 1] := 0X |
68 | END GetCurrentDirectory; |
70 | END GetCurrentDirectory; |
69 | 71 | ||
70 | 72 | ||
71 | PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; |
73 | PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; |
72 | VAR |
74 | VAR |
73 | res: INTEGER; |
75 | res: INTEGER; |
74 | 76 | ||
75 | BEGIN |
77 | BEGIN |
76 | res := API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F); |
78 | res := API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F); |
77 | IF res <= 0 THEN |
79 | IF res <= 0 THEN |
78 | res := -1 |
80 | res := -1 |
79 | END |
81 | END |
80 | 82 | ||
81 | RETURN res |
83 | RETURN res |
82 | END FileRead; |
84 | END FileRead; |
83 | 85 | ||
84 | 86 | ||
85 | PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; |
87 | PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; |
86 | VAR |
88 | VAR |
87 | res: INTEGER; |
89 | res: INTEGER; |
88 | 90 | ||
89 | BEGIN |
91 | BEGIN |
90 | res := API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F); |
92 | res := API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F); |
91 | IF res <= 0 THEN |
93 | IF res <= 0 THEN |
92 | res := -1 |
94 | res := -1 |
93 | END |
95 | END |
94 | 96 | ||
95 | RETURN res |
97 | RETURN res |
96 | END FileWrite; |
98 | END FileWrite; |
97 | 99 | ||
98 | 100 | ||
99 | PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER; |
101 | PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER; |
100 | RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb")) |
102 | RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb")) |
101 | END FileCreate; |
103 | END FileCreate; |
102 | 104 | ||
103 | 105 | ||
104 | PROCEDURE FileClose* (File: INTEGER); |
106 | PROCEDURE FileClose* (File: INTEGER); |
105 | BEGIN |
107 | BEGIN |
106 | File := API.fclose(File) |
108 | File := API.fclose(File) |
107 | END FileClose; |
109 | END FileClose; |
108 | 110 | ||
109 | 111 | ||
110 | PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER; |
112 | PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER; |
111 | RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb")) |
113 | RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb")) |
112 | END FileOpen; |
114 | END FileOpen; |
113 | 115 | ||
114 | 116 | ||
115 | PROCEDURE OutChar* (c: CHAR); |
117 | PROCEDURE OutChar* (c: CHAR); |
116 | BEGIN |
118 | BEGIN |
117 | API.putc(c) |
119 | API.putc(c) |
118 | END OutChar; |
120 | END OutChar; |
119 | 121 | ||
120 | 122 | ||
121 | PROCEDURE GetTickCount* (): INTEGER; |
123 | PROCEDURE GetTickCount* (): INTEGER; |
122 | VAR |
124 | VAR |
123 | tp: API.TP; |
125 | tp: API.TP; |
124 | res: INTEGER; |
126 | res: INTEGER; |
125 | 127 | ||
126 | BEGIN |
128 | BEGIN |
127 | IF API.clock_gettime(0, tp) = 0 THEN |
129 | IF API.clock_gettime(0, tp) = 0 THEN |
128 | res := tp[0] * 100 + tp[1] DIV 10000000 |
130 | res := tp[0] * 100 + tp[1] DIV 10000000 |
129 | ELSE |
131 | ELSE |
130 | res := 0 |
132 | res := 0 |
131 | END |
133 | END |
132 | 134 | ||
133 | RETURN res |
135 | RETURN res |
134 | END GetTickCount; |
136 | END GetTickCount; |
135 | 137 | ||
136 | 138 | ||
137 | PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN; |
139 | PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN; |
138 | RETURN path[0] # slash |
140 | RETURN path[0] # slash |
139 | END isRelative; |
141 | END isRelative; |
140 | 142 | ||
141 | 143 | ||
142 | PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER); |
144 | PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER); |
143 | END now; |
145 | END now; |
144 | 146 | ||
145 | 147 | ||
146 | PROCEDURE UnixTime* (): INTEGER; |
148 | PROCEDURE UnixTime* (): INTEGER; |
147 | RETURN API.time(0) |
149 | RETURN API.time(0) |
148 | END UnixTime; |
150 | END UnixTime; |
149 | 151 | ||
- | 152 | ||
- | 153 | PROCEDURE d2s* (x: REAL): INTEGER; |
|
- | 154 | VAR |
|
- | 155 | h, l, s, e: INTEGER; |
|
- | 156 | ||
- | 157 | BEGIN |
|
- | 158 | SYSTEM.GET(SYSTEM.ADR(x), l); |
|
- | 159 | SYSTEM.GET(SYSTEM.ADR(x) + 4, h); |
|
- | 160 | ||
- | 161 | s := ASR(h, 31) MOD 2; |
|
- | 162 | e := (h DIV 100000H) MOD 2048; |
|
- | 163 | IF e <= 896 THEN |
|
- | 164 | h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H; |
|
- | 165 | REPEAT |
|
- | 166 | h := h DIV 2; |
|
- | 167 | INC(e) |
|
- | 168 | UNTIL e = 897; |
|
- | 169 | e := 896; |
|
- | 170 | l := (h MOD 8) * 20000000H; |
|
- | 171 | h := h DIV 8 |
|
- | 172 | ELSIF (1151 <= e) & (e < 2047) THEN |
|
- | 173 | e := 1151; |
|
- | 174 | h := 0; |
|
- | 175 | l := 0 |
|
- | 176 | ELSIF e = 2047 THEN |
|
- | 177 | e := 1151; |
|
- | 178 | IF (h MOD 100000H # 0) OR (l # 0) THEN |
|
- | 179 | h := 80000H; |
|
- | 180 | l := 0 |
|
- | 181 | END |
|
- | 182 | END; |
|
- | 183 | DEC(e, 896) |
|
- | 184 | ||
- | 185 | RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 |
|
- | 186 | END d2s; |
|
- | 187 | ||
150 | 188 | ||
151 | PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER; |
189 | PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER; |
152 | VAR |
190 | VAR |
153 | res: INTEGER; |
191 | res: INTEGER; |
154 | 192 | ||
155 | BEGIN |
193 | BEGIN |
156 | a := 0; |
194 | a := 0; |
157 | b := 0; |
195 | b := 0; |
158 | SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4); |
196 | SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4); |
159 | SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4); |
197 | SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4); |
160 | SYSTEM.GET(SYSTEM.ADR(x), res) |
198 | SYSTEM.GET(SYSTEM.ADR(x), res) |
161 | RETURN res |
199 | RETURN res |
162 | END splitf; |
200 | END splitf; |
163 | 201 | ||
164 | 202 | ||
165 | BEGIN |
203 | BEGIN |
166 | eol := 0AX; |
204 | eol := 0AX; |
- | 205 | maxreal := 1.9; |
|
- | 206 | PACK(maxreal, 1023); |
|
167 | SYSTEM.GET(API.MainParam, argc) |
207 | SYSTEM.GET(API.MainParam, argc) |
168 | END HOST.=>=>> |
208 | END HOST.>=>=>=>=>> |