Rev 7693 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7693 | Rev 7696 | ||
---|---|---|---|
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
3 | 3 | ||
4 | Copyright (c) 2019, Anton Krotov |
4 | Copyright (c) 2019, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
6 | *) |
6 | *) |
7 | 7 | ||
8 | MODULE LINAPI; |
8 | MODULE LINAPI; |
9 | 9 | ||
10 | IMPORT SYSTEM, API; |
10 | IMPORT SYSTEM, API; |
11 | 11 | ||
12 | 12 | ||
13 | TYPE |
13 | TYPE |
14 | 14 | ||
15 | TP* = API.TP; |
15 | TP* = API.TP; |
16 | 16 | ||
17 | 17 | ||
18 | VAR |
18 | VAR |
19 | 19 | ||
20 | argc*, envc*: INTEGER; |
20 | argc*, envc*: INTEGER; |
21 | 21 | ||
22 | libc*, librt*: INTEGER; |
22 | libc*, librt*: INTEGER; |
23 | 23 | ||
24 | stdout*, |
24 | stdout*, |
25 | stdin*, |
25 | stdin*, |
26 | stderr* : INTEGER; |
26 | stderr* : INTEGER; |
27 | 27 | ||
28 | malloc* : PROCEDURE [linux] (size: INTEGER): INTEGER; |
28 | malloc* : PROCEDURE [linux] (size: INTEGER): INTEGER; |
29 | free* : PROCEDURE [linux] (ptr: INTEGER); |
29 | free* : PROCEDURE [linux] (ptr: INTEGER); |
30 | exit* : PROCEDURE [linux] (code: INTEGER); |
30 | exit* : PROCEDURE [linux] (code: INTEGER); |
31 | puts* : PROCEDURE [linux] (pStr: INTEGER); |
31 | puts* : PROCEDURE [linux] (pStr: INTEGER); |
32 | fwrite*, |
32 | fwrite*, |
33 | fread* : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER; |
33 | fread* : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER; |
34 | fopen* : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER; |
34 | fopen* : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER; |
35 | fclose* : PROCEDURE [linux] (file: INTEGER): INTEGER; |
35 | fclose* : PROCEDURE [linux] (file: INTEGER): INTEGER; |
36 | time* : PROCEDURE [linux] (ptr: INTEGER): INTEGER; |
36 | time* : PROCEDURE [linux] (ptr: INTEGER): INTEGER; |
37 | 37 | ||
38 | clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER; |
38 | clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER; |
39 | 39 | ||
40 | 40 | ||
41 | PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); |
41 | PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); |
42 | VAR |
42 | VAR |
43 | i, len, ptr: INTEGER; |
43 | i, len, ptr: INTEGER; |
44 | c: CHAR; |
44 | c: CHAR; |
45 | 45 | ||
46 | BEGIN |
46 | BEGIN |
47 | i := 0; |
47 | i := 0; |
48 | len := LEN(s) - 1; |
48 | len := LEN(s) - 1; |
49 | IF (0 <= n) & (n <= argc + envc) & (n # argc) & (len > 0) THEN |
49 | IF (0 <= n) & (n <= argc + envc) & (n # argc) & (len > 0) THEN |
50 | SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr); |
50 | SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr); |
51 | REPEAT |
51 | REPEAT |
52 | SYSTEM.GET(ptr, c); |
52 | SYSTEM.GET(ptr, c); |
53 | s[i] := c; |
53 | s[i] := c; |
54 | INC(i); |
54 | INC(i); |
55 | INC(ptr) |
55 | INC(ptr) |
56 | UNTIL (c = 0X) OR (i = len) |
56 | UNTIL (c = 0X) OR (i = len) |
57 | END; |
57 | END; |
58 | s[i] := 0X |
58 | s[i] := 0X |
59 | END GetArg; |
59 | END GetArg; |
60 | 60 | ||
61 | 61 | ||
62 | PROCEDURE GetEnv* (n: INTEGER; VAR s: ARRAY OF CHAR); |
62 | PROCEDURE GetEnv* (n: INTEGER; VAR s: ARRAY OF CHAR); |
63 | BEGIN |
63 | BEGIN |
64 | IF (0 <= n) & (n < envc) THEN |
64 | IF (0 <= n) & (n < envc) THEN |
65 | GetArg(n + argc + 1, s) |
65 | GetArg(n + argc + 1, s) |
66 | ELSE |
66 | ELSE |
67 | s[0] := 0X |
67 | s[0] := 0X |
68 | END |
68 | END |
69 | END GetEnv; |
69 | END GetEnv; |
70 | 70 | ||
71 | 71 | ||
72 | PROCEDURE init; |
72 | PROCEDURE init; |
73 | VAR |
73 | VAR |
74 | ptr: INTEGER; |
74 | ptr: INTEGER; |
75 | 75 | ||
76 | BEGIN |
76 | BEGIN |
- | 77 | ||
- | 78 | IF API.MainParam # 0 THEN |
|
77 | envc := -1; |
79 | envc := -1; |
78 | SYSTEM.GET(API.MainParam, argc); |
80 | SYSTEM.GET(API.MainParam, argc); |
79 | REPEAT |
81 | REPEAT |
80 | SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr); |
82 | SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr); |
81 | INC(envc) |
83 | INC(envc) |
82 | UNTIL ptr = 0; |
84 | UNTIL ptr = 0 |
- | 85 | ELSE |
|
- | 86 | envc := 0; |
|
- | 87 | argc := 0 |
|
- | 88 | END; |
|
83 | 89 | ||
84 | libc := API.libc; |
90 | libc := API.libc; |
85 | 91 | ||
86 | stdout := API.stdout; |
92 | stdout := API.stdout; |
87 | stdin := API.stdin; |
93 | stdin := API.stdin; |
88 | stderr := API.stderr; |
94 | stderr := API.stderr; |
89 | 95 | ||
90 | malloc := API.malloc; |
96 | malloc := API.malloc; |
91 | free := API.free; |
97 | free := API.free; |
92 | exit := API._exit; |
98 | exit := API._exit; |
93 | puts := API.puts; |
99 | puts := API.puts; |
94 | fwrite := API.fwrite; |
100 | fwrite := API.fwrite; |
95 | fread := API.fread; |
101 | fread := API.fread; |
96 | fopen := API.fopen; |
102 | fopen := API.fopen; |
97 | fclose := API.fclose; |
103 | fclose := API.fclose; |
98 | time := API.time; |
104 | time := API.time; |
99 | 105 | ||
100 | librt := API.librt; |
106 | librt := API.librt; |
101 | 107 | ||
102 | clock_gettime := API.clock_gettime |
108 | clock_gettime := API.clock_gettime |
103 | END init; |
109 | END init; |
104 | 110 | ||
105 | 111 | ||
106 | PROCEDURE [stdcall-] syscall* (eax, ebx, ecx, edx, esi, edi: INTEGER): INTEGER; |
112 | PROCEDURE [stdcall-] syscall* (eax, ebx, ecx, edx, esi, edi: INTEGER): INTEGER; |
107 | BEGIN |
113 | BEGIN |
108 | SYSTEM.CODE( |
114 | SYSTEM.CODE( |
109 | 053H, (* push ebx *) |
115 | 053H, (* push ebx *) |
110 | 056H, (* push esi *) |
116 | 056H, (* push esi *) |
111 | 057H, (* push edi *) |
117 | 057H, (* push edi *) |
112 | 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) |
118 | 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) |
113 | 08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *) |
119 | 08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *) |
114 | 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *) |
120 | 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *) |
115 | 08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *) |
121 | 08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *) |
116 | 08BH, 075H, 018H, (* mov esi, dword [ebp + 24] *) |
122 | 08BH, 075H, 018H, (* mov esi, dword [ebp + 24] *) |
117 | 08BH, 07DH, 01CH, (* mov edi, dword [ebp + 28] *) |
123 | 08BH, 07DH, 01CH, (* mov edi, dword [ebp + 28] *) |
118 | 0CDH, 080H, (* int 128 *) |
124 | 0CDH, 080H, (* int 128 *) |
119 | 05FH, (* pop edi *) |
125 | 05FH, (* pop edi *) |
120 | 05EH, (* pop esi *) |
126 | 05EH, (* pop esi *) |
121 | 05BH, (* pop ebx *) |
127 | 05BH, (* pop ebx *) |
122 | 0C9H, (* leave *) |
128 | 0C9H, (* leave *) |
123 | 0C2H, 018H, 000H (* ret 24 *) |
129 | 0C2H, 018H, 000H (* ret 24 *) |
124 | ) |
130 | ) |
125 | RETURN 0 |
131 | RETURN 0 |
126 | END syscall; |
132 | END syscall; |
127 | 133 | ||
128 | 134 | ||
129 | BEGIN |
135 | BEGIN |
130 | init |
136 | init |
131 | END LINAPI.>=>=>=> |
137 | END LINAPI.>=>=>=> |