1,5 → 1,5 |
(* |
Copyright 2016 Anton Krotov |
(* |
Copyright 2016, 2018 Anton Krotov |
|
This program is free software: you can redistribute it and/or modify |
it under the terms of the GNU Lesser General Public License as published by |
19,10 → 19,12 |
|
IMPORT sys := SYSTEM, KOSAPI; |
|
|
CONST |
|
SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2; |
|
|
TYPE |
|
FNAME* = ARRAY 520 OF CHAR; |
47,29 → 49,36 |
name*: FNAME |
END; |
|
|
PROCEDURE [stdcall] f_68_27(file_name: INTEGER; VAR size: INTEGER): INTEGER; |
BEGIN |
sys.CODE("53"); (* push ebx *) |
sys.CODE("6A44"); (* push 68 *) |
sys.CODE("58"); (* pop eax *) |
sys.CODE("6A1B"); (* push 27 *) |
sys.CODE("5B"); (* pop ebx *) |
sys.CODE("8B4D08"); (* mov ecx, [ebp + 08h] *) |
sys.CODE("CD40"); (* int 40h *) |
sys.CODE("8B4D0C"); (* mov ecx, [ebp + 0Ch] *) |
sys.CODE("8911"); (* mov [ecx], edx *) |
sys.CODE("5B"); (* pop ebx *) |
sys.CODE("C9"); (* leave *) |
sys.CODE("C20800"); (* ret 08h *) |
sys.CODE( |
053H, (* push ebx *) |
06AH, 044H, (* push 68 *) |
058H, (* pop eax *) |
06AH, 01BH, (* push 27 *) |
05BH, (* pop ebx *) |
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) |
0CDH, 040H, (* int 64 *) |
08BH, 04DH, 00CH, (* mov ecx, dword [ebp + 12] *) |
089H, 011H, (* mov dword [ecx], edx *) |
05BH, (* pop ebx *) |
0C9H, (* leave *) |
0C2H, 008H, 000H (* ret 8 *) |
) |
RETURN 0 |
END f_68_27; |
|
|
PROCEDURE Load*(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; |
RETURN f_68_27(sys.ADR(FName[0]), size) |
END Load; |
|
|
PROCEDURE GetFileInfo*(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN; |
VAR res2: INTEGER; fs: rFS; |
VAR |
res2: INTEGER; fs: rFS; |
|
BEGIN |
fs.subfunc := 5; |
fs.pos := 0; |
77,15 → 86,19 |
fs.bytes := 0; |
fs.buffer := sys.ADR(Info); |
COPY(FName, fs.name) |
|
RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0 |
END GetFileInfo; |
|
|
PROCEDURE Exists*(FName: ARRAY OF CHAR): BOOLEAN; |
VAR fd: rFD; |
VAR |
fd: rFD; |
BEGIN |
RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr)) |
END Exists; |
|
|
PROCEDURE Close*(VAR F: FS); |
BEGIN |
IF F # NIL THEN |
93,9 → 106,13 |
END |
END Close; |
|
|
PROCEDURE Open*(FName: ARRAY OF CHAR): FS; |
VAR F: FS; |
VAR |
F: FS; |
|
BEGIN |
|
IF Exists(FName) THEN |
NEW(F); |
IF F # NIL THEN |
109,12 → 126,18 |
ELSE |
F := NIL |
END |
|
RETURN F |
END Open; |
|
|
PROCEDURE Delete*(FName: ARRAY OF CHAR): BOOLEAN; |
VAR F: FS; res, res2: INTEGER; |
VAR |
F: FS; |
res, res2: INTEGER; |
|
BEGIN |
|
IF Exists(FName) THEN |
NEW(F); |
IF F # NIL THEN |
132,12 → 155,18 |
ELSE |
res := -1 |
END |
|
RETURN res = 0 |
END Delete; |
|
|
PROCEDURE Seek*(F: FS; Offset, Origin: INTEGER): INTEGER; |
VAR res: INTEGER; fd: rFD; |
VAR |
res: INTEGER; |
fd: rFD; |
|
BEGIN |
|
IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN |
CASE Origin OF |
|SEEK_BEG: F.pos := Offset |
149,12 → 178,17 |
ELSE |
res := -1 |
END |
|
RETURN res |
END Seek; |
|
|
PROCEDURE Read*(F: FS; Buffer, Count: INTEGER): INTEGER; |
VAR res, res2: INTEGER; |
VAR |
res, res2: INTEGER; |
|
BEGIN |
|
IF F # NIL THEN |
F.subfunc := 0; |
F.bytes := Count; |
166,12 → 200,17 |
ELSE |
res2 := 0 |
END |
|
RETURN res2 |
END Read; |
|
|
PROCEDURE Write*(F: FS; Buffer, Count: INTEGER): INTEGER; |
VAR res, res2: INTEGER; |
VAR |
res, res2: INTEGER; |
|
BEGIN |
|
IF F # NIL THEN |
F.subfunc := 3; |
F.bytes := Count; |
183,13 → 222,19 |
ELSE |
res2 := 0 |
END |
|
RETURN res2 |
END Write; |
|
|
PROCEDURE Create*(FName: ARRAY OF CHAR): FS; |
VAR F: FS; res2: INTEGER; |
VAR |
F: FS; |
res2: INTEGER; |
|
BEGIN |
NEW(F); |
|
IF F # NIL THEN |
F.subfunc := 2; |
F.pos := 0; |
201,19 → 246,27 |
DISPOSE(F) |
END |
END |
|
RETURN F |
END Create; |
|
|
PROCEDURE DirExists*(FName: ARRAY OF CHAR): BOOLEAN; |
VAR fd: rFD; |
VAR |
fd: rFD; |
BEGIN |
RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr)) |
END DirExists; |
|
|
PROCEDURE CreateDir*(DirName: ARRAY OF CHAR): BOOLEAN; |
VAR F: FS; res, res2: INTEGER; |
VAR |
F: FS; |
res, res2: INTEGER; |
|
BEGIN |
NEW(F); |
|
IF F # NIL THEN |
F.subfunc := 9; |
F.pos := 0; |
226,12 → 279,18 |
ELSE |
res := -1 |
END |
|
RETURN res = 0 |
END CreateDir; |
|
|
PROCEDURE DeleteDir*(DirName: ARRAY OF CHAR): BOOLEAN; |
VAR F: FS; res, res2: INTEGER; |
VAR |
F: FS; |
res, res2: INTEGER; |
|
BEGIN |
|
IF DirExists(DirName) THEN |
NEW(F); |
IF F # NIL THEN |
249,7 → 308,9 |
ELSE |
res := -1 |
END |
|
RETURN res = 0 |
END DeleteDir; |
|
|
END File. |