Rev 6613 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6613 | Rev 7597 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | Copyright 2016 Anton Krotov |
2 | Copyright 2016, 2018 Anton Krotov |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify |
4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU Lesser General Public License as published by |
5 | it under the terms of the GNU Lesser General Public License as published by |
6 | the Free Software Foundation, either version 3 of the License, or |
6 | the Free Software Foundation, either version 3 of the License, or |
Line 17... | Line 17... | ||
17 | 17 | ||
Line 18... | Line 18... | ||
18 | MODULE File; |
18 | MODULE File; |
Line -... | Line 19... | ||
- | 19 | ||
19 | 20 | IMPORT sys := SYSTEM, KOSAPI; |
|
Line 20... | Line 21... | ||
20 | IMPORT sys := SYSTEM, KOSAPI; |
21 | |
Line -... | Line 22... | ||
- | 22 | ||
21 | 23 | CONST |
|
Line 22... | Line 24... | ||
22 | CONST |
24 | |
Line 23... | Line 25... | ||
23 | 25 | SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2; |
|
Line 45... | Line 47... | ||
45 | time_modif*, date_modif*, |
47 | time_modif*, date_modif*, |
46 | size*, hsize*: INTEGER; |
48 | size*, hsize*: INTEGER; |
47 | name*: FNAME |
49 | name*: FNAME |
48 | END; |
50 | END; |
Line -... | Line 51... | ||
- | 51 | ||
49 | 52 | ||
50 | PROCEDURE [stdcall] f_68_27(file_name: INTEGER; VAR size: INTEGER): INTEGER; |
53 | PROCEDURE [stdcall] f_68_27 (file_name: INTEGER; VAR size: INTEGER): INTEGER; |
- | 54 | BEGIN |
|
51 | BEGIN |
55 | sys.CODE( |
52 | sys.CODE("53"); (* push ebx *) |
56 | 053H, (* push ebx *) |
53 | sys.CODE("6A44"); (* push 68 *) |
57 | 06AH, 044H, (* push 68 *) |
54 | sys.CODE("58"); (* pop eax *) |
58 | 058H, (* pop eax *) |
55 | sys.CODE("6A1B"); (* push 27 *) |
59 | 06AH, 01BH, (* push 27 *) |
56 | sys.CODE("5B"); (* pop ebx *) |
60 | 05BH, (* pop ebx *) |
57 | sys.CODE("8B4D08"); (* mov ecx, [ebp + 08h] *) |
61 | 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) |
58 | sys.CODE("CD40"); (* int 40h *) |
62 | 0CDH, 040H, (* int 64 *) |
59 | sys.CODE("8B4D0C"); (* mov ecx, [ebp + 0Ch] *) |
63 | 08BH, 04DH, 00CH, (* mov ecx, dword [ebp + 12] *) |
60 | sys.CODE("8911"); (* mov [ecx], edx *) |
64 | 089H, 011H, (* mov dword [ecx], edx *) |
61 | sys.CODE("5B"); (* pop ebx *) |
65 | 05BH, (* pop ebx *) |
62 | sys.CODE("C9"); (* leave *) |
66 | 0C9H, (* leave *) |
- | 67 | 0C2H, 008H, 000H (* ret 8 *) |
|
63 | sys.CODE("C20800"); (* ret 08h *) |
68 | ) |
64 | RETURN 0 |
69 | RETURN 0 |
Line -... | Line 70... | ||
- | 70 | END f_68_27; |
|
65 | END f_68_27; |
71 | |
66 | 72 | ||
67 | PROCEDURE Load*(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; |
73 | PROCEDURE Load* (FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; |
Line -... | Line 74... | ||
- | 74 | RETURN f_68_27(sys.ADR(FName[0]), size) |
|
68 | RETURN f_68_27(sys.ADR(FName[0]), size) |
75 | END Load; |
- | 76 | ||
69 | END Load; |
77 | |
- | 78 | PROCEDURE GetFileInfo* (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN; |
|
70 | 79 | VAR |
|
71 | PROCEDURE GetFileInfo*(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN; |
80 | res2: INTEGER; fs: rFS; |
72 | VAR res2: INTEGER; fs: rFS; |
81 | |
73 | BEGIN |
82 | BEGIN |
74 | fs.subfunc := 5; |
83 | fs.subfunc := 5; |
75 | fs.pos := 0; |
84 | fs.pos := 0; |
76 | fs.hpos := 0; |
85 | fs.hpos := 0; |
- | 86 | fs.bytes := 0; |
|
77 | fs.bytes := 0; |
87 | fs.buffer := sys.ADR(Info); |
78 | fs.buffer := sys.ADR(Info); |
88 | COPY(FName, fs.name) |
Line -... | Line 89... | ||
- | 89 | ||
79 | COPY(FName, fs.name) |
90 | RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0 |
- | 91 | END GetFileInfo; |
|
80 | RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0 |
92 | |
81 | END GetFileInfo; |
93 | |
82 | 94 | PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN; |
|
83 | PROCEDURE Exists*(FName: ARRAY OF CHAR): BOOLEAN; |
95 | VAR |
Line -... | Line 96... | ||
- | 96 | fd: rFD; |
|
84 | VAR fd: rFD; |
97 | BEGIN |
85 | BEGIN |
98 | RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr)) |
86 | RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr)) |
99 | END Exists; |
87 | END Exists; |
100 | |
88 | 101 | ||
89 | PROCEDURE Close*(VAR F: FS); |
102 | PROCEDURE Close* (VAR F: FS); |
Line -... | Line 103... | ||
- | 103 | BEGIN |
|
90 | BEGIN |
104 | IF F # NIL THEN |
- | 105 | DISPOSE(F) |
|
91 | IF F # NIL THEN |
106 | END |
- | 107 | END Close; |
|
92 | DISPOSE(F) |
108 | |
- | 109 | ||
93 | END |
110 | PROCEDURE Open* (FName: ARRAY OF CHAR): FS; |
94 | END Close; |
111 | VAR |
95 | 112 | F: FS; |
|
96 | PROCEDURE Open*(FName: ARRAY OF CHAR): FS; |
113 | |
97 | VAR F: FS; |
114 | BEGIN |
Line 107... | Line 124... | ||
107 | COPY(FName, F.name) |
124 | COPY(FName, F.name) |
108 | END |
125 | END |
109 | ELSE |
126 | ELSE |
110 | F := NIL |
127 | F := NIL |
111 | END |
128 | END |
- | 129 | ||
112 | RETURN F |
130 | RETURN F |
113 | END Open; |
131 | END Open; |
Line -... | Line 132... | ||
- | 132 | ||
114 | 133 | ||
- | 134 | PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN; |
|
- | 135 | VAR |
|
115 | PROCEDURE Delete*(FName: ARRAY OF CHAR): BOOLEAN; |
136 | F: FS; |
- | 137 | res, res2: INTEGER; |
|
116 | VAR F: FS; res, res2: INTEGER; |
138 | |
- | 139 | BEGIN |
|
117 | BEGIN |
140 | |
118 | IF Exists(FName) THEN |
141 | IF Exists(FName) THEN |
119 | NEW(F); |
142 | NEW(F); |
120 | IF F # NIL THEN |
143 | IF F # NIL THEN |
121 | F.subfunc := 8; |
144 | F.subfunc := 8; |
Line 130... | Line 153... | ||
130 | res := -1 |
153 | res := -1 |
131 | END |
154 | END |
132 | ELSE |
155 | ELSE |
133 | res := -1 |
156 | res := -1 |
134 | END |
157 | END |
- | 158 | ||
135 | RETURN res = 0 |
159 | RETURN res = 0 |
136 | END Delete; |
160 | END Delete; |
Line -... | Line 161... | ||
- | 161 | ||
137 | 162 | ||
- | 163 | PROCEDURE Seek* (F: FS; Offset, Origin: INTEGER): INTEGER; |
|
138 | PROCEDURE Seek*(F: FS; Offset, Origin: INTEGER): INTEGER; |
164 | VAR |
- | 165 | res: INTEGER; |
|
- | 166 | fd: rFD; |
|
139 | VAR res: INTEGER; fd: rFD; |
167 | |
- | 168 | BEGIN |
|
140 | BEGIN |
169 | |
141 | IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN |
170 | IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN |
142 | CASE Origin OF |
171 | CASE Origin OF |
143 | |SEEK_BEG: F.pos := Offset |
172 | |SEEK_BEG: F.pos := Offset |
144 | |SEEK_CUR: F.pos := F.pos + Offset |
173 | |SEEK_CUR: F.pos := F.pos + Offset |
Line 147... | Line 176... | ||
147 | END; |
176 | END; |
148 | res := F.pos |
177 | res := F.pos |
149 | ELSE |
178 | ELSE |
150 | res := -1 |
179 | res := -1 |
151 | END |
180 | END |
- | 181 | ||
152 | RETURN res |
182 | RETURN res |
153 | END Seek; |
183 | END Seek; |
Line -... | Line 184... | ||
- | 184 | ||
154 | 185 | ||
- | 186 | PROCEDURE Read* (F: FS; Buffer, Count: INTEGER): INTEGER; |
|
155 | PROCEDURE Read*(F: FS; Buffer, Count: INTEGER): INTEGER; |
187 | VAR |
- | 188 | res, res2: INTEGER; |
|
156 | VAR res, res2: INTEGER; |
189 | |
- | 190 | BEGIN |
|
157 | BEGIN |
191 | |
158 | IF F # NIL THEN |
192 | IF F # NIL THEN |
159 | F.subfunc := 0; |
193 | F.subfunc := 0; |
160 | F.bytes := Count; |
194 | F.bytes := Count; |
161 | F.buffer := Buffer; |
195 | F.buffer := Buffer; |
Line 164... | Line 198... | ||
164 | F.pos := F.pos + res2 |
198 | F.pos := F.pos + res2 |
165 | END |
199 | END |
166 | ELSE |
200 | ELSE |
167 | res2 := 0 |
201 | res2 := 0 |
168 | END |
202 | END |
- | 203 | ||
169 | RETURN res2 |
204 | RETURN res2 |
170 | END Read; |
205 | END Read; |
Line -... | Line 206... | ||
- | 206 | ||
171 | 207 | ||
- | 208 | PROCEDURE Write* (F: FS; Buffer, Count: INTEGER): INTEGER; |
|
172 | PROCEDURE Write*(F: FS; Buffer, Count: INTEGER): INTEGER; |
209 | VAR |
- | 210 | res, res2: INTEGER; |
|
173 | VAR res, res2: INTEGER; |
211 | |
- | 212 | BEGIN |
|
174 | BEGIN |
213 | |
175 | IF F # NIL THEN |
214 | IF F # NIL THEN |
176 | F.subfunc := 3; |
215 | F.subfunc := 3; |
177 | F.bytes := Count; |
216 | F.bytes := Count; |
178 | F.buffer := Buffer; |
217 | F.buffer := Buffer; |
Line 181... | Line 220... | ||
181 | F.pos := F.pos + res2 |
220 | F.pos := F.pos + res2 |
182 | END |
221 | END |
183 | ELSE |
222 | ELSE |
184 | res2 := 0 |
223 | res2 := 0 |
185 | END |
224 | END |
- | 225 | ||
186 | RETURN res2 |
226 | RETURN res2 |
187 | END Write; |
227 | END Write; |
Line -... | Line 228... | ||
- | 228 | ||
188 | 229 | ||
- | 230 | PROCEDURE Create* (FName: ARRAY OF CHAR): FS; |
|
- | 231 | VAR |
|
189 | PROCEDURE Create*(FName: ARRAY OF CHAR): FS; |
232 | F: FS; |
- | 233 | res2: INTEGER; |
|
190 | VAR F: FS; res2: INTEGER; |
234 | |
191 | BEGIN |
235 | BEGIN |
- | 236 | NEW(F); |
|
192 | NEW(F); |
237 | |
193 | IF F # NIL THEN |
238 | IF F # NIL THEN |
194 | F.subfunc := 2; |
239 | F.subfunc := 2; |
195 | F.pos := 0; |
240 | F.pos := 0; |
196 | F.hpos := 0; |
241 | F.hpos := 0; |
Line 199... | Line 244... | ||
199 | COPY(FName, F.name); |
244 | COPY(FName, F.name); |
200 | IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN |
245 | IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN |
201 | DISPOSE(F) |
246 | DISPOSE(F) |
202 | END |
247 | END |
203 | END |
248 | END |
- | 249 | ||
204 | RETURN F |
250 | RETURN F |
205 | END Create; |
251 | END Create; |
Line -... | Line 252... | ||
- | 252 | ||
206 | 253 | ||
- | 254 | PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN; |
|
207 | PROCEDURE DirExists*(FName: ARRAY OF CHAR): BOOLEAN; |
255 | VAR |
208 | VAR fd: rFD; |
256 | fd: rFD; |
209 | BEGIN |
257 | BEGIN |
210 | RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr)) |
258 | RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr)) |
Line -... | Line 259... | ||
- | 259 | END DirExists; |
|
211 | END DirExists; |
260 | |
- | 261 | ||
- | 262 | PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN; |
|
212 | 263 | VAR |
|
- | 264 | F: FS; |
|
213 | PROCEDURE CreateDir*(DirName: ARRAY OF CHAR): BOOLEAN; |
265 | res, res2: INTEGER; |
214 | VAR F: FS; res, res2: INTEGER; |
266 | |
- | 267 | BEGIN |
|
215 | BEGIN |
268 | NEW(F); |
216 | NEW(F); |
269 | |
217 | IF F # NIL THEN |
270 | IF F # NIL THEN |
218 | F.subfunc := 9; |
271 | F.subfunc := 9; |
219 | F.pos := 0; |
272 | F.pos := 0; |
Line 224... | Line 277... | ||
224 | res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2); |
277 | res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2); |
225 | DISPOSE(F) |
278 | DISPOSE(F) |
226 | ELSE |
279 | ELSE |
227 | res := -1 |
280 | res := -1 |
228 | END |
281 | END |
- | 282 | ||
229 | RETURN res = 0 |
283 | RETURN res = 0 |
230 | END CreateDir; |
284 | END CreateDir; |
Line -... | Line 285... | ||
- | 285 | ||
231 | 286 | ||
- | 287 | PROCEDURE DeleteDir* (DirName: ARRAY OF CHAR): BOOLEAN; |
|
- | 288 | VAR |
|
232 | PROCEDURE DeleteDir*(DirName: ARRAY OF CHAR): BOOLEAN; |
289 | F: FS; |
- | 290 | res, res2: INTEGER; |
|
233 | VAR F: FS; res, res2: INTEGER; |
291 | |
- | 292 | BEGIN |
|
234 | BEGIN |
293 | |
235 | IF DirExists(DirName) THEN |
294 | IF DirExists(DirName) THEN |
236 | NEW(F); |
295 | NEW(F); |
237 | IF F # NIL THEN |
296 | IF F # NIL THEN |
238 | F.subfunc := 8; |
297 | F.subfunc := 8; |
Line 247... | Line 306... | ||
247 | res := -1 |
306 | res := -1 |
248 | END |
307 | END |
249 | ELSE |
308 | ELSE |
250 | res := -1 |
309 | res := -1 |
251 | END |
310 | END |
- | 311 | ||
252 | RETURN res = 0 |
312 | RETURN res = 0 |
253 | END DeleteDir; |
313 | END DeleteDir; |
Line -... | Line 314... | ||
- | 314 | ||
254 | 315 | ||
255 | END File. |
316 | END File. |