  OPENFILE              = 1
  READFILE              = 1
; WRITEFILE             = 1
; LSEEKFILE             = 1
  CREATEFILE            = 1
  FILESIZE              = 1
; FILECOPY              = 1
; DELETEFILE            = 1
; FINDFILE              = 1
        .386p
code32  segment para public use32
        assume cs:code32, ds:code32

include pmode.inc

public  _filebufloc, _filebuflen
public  _closefile

;ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
; DATA
;ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
_filebufloc     dd      0               ; location must be in low mem
_filebuflen     dw      4000h

;ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
; CODE
;ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ

ifdef   CREATEFILE
public  _createfile
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Create file
; In:
;   EDX -> ASCIIZ filename
; Out:
;   CF=1 - Error creating file
;   CF=0 - File created succesfully
;     V86R_BX - file handle
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_createfile:
        push ax
        push edx
        add edx,_code32a
        mov ax,dx
        shr edx,4
        and ax,0fh
        mov v86r_dx,ax
        mov v86r_ds,dx
        mov v86r_ax,3c00h
        mov v86r_cx,20h
        mov al,21h
        int 33h
        mov ax,v86r_ax
        mov v86r_bx,ax
        pop edx
        pop ax
        ret
endif

ifdef   OPENFILE
public  _openfile
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Open file
; In:
;   EDX -> ASCIIZ filename
; Out:
;   CF=1 - Error opening file
;   CF=0 - File opened succesfully
;     V86R_BX - file handle
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_openfile:
        push ax
        push edx
        add edx,_code32a
        mov ax,dx
        shr edx,4
        and ax,0fh
        mov v86r_dx,ax
        mov v86r_ds,dx
        mov v86r_ax,3d02h
        mov al,21h
        int 33h
        mov ax,v86r_ax
        mov v86r_bx,ax
        pop edx
        pop ax
        ret
endif

;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Close a file
; In:
;   V86R_BX - file handle
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_closefile:
        push ax
        mov v86r_ax,3e00h
        mov al,21h
        int 33h
        pop ax
        ret

ifdef   DELETEFILE
public  _deletefile
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Delete a file
; In:
;   EDX -> ASCIIZ filename
; Out:
;   CF=1 - Error opening file
;   CF=0 - File opened succesfully
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_deletefile:
        push ax
        push edx
        add edx,_code32a
        mov ax,dx
        shr edx,4
        and ax,0fh
        mov v86r_dx,ax
        mov v86r_ds,dx
        mov v86r_ah,41h
        mov al,21h
        int 33h
        pop edx
        pop ax
        ret
endif

ifdef   LSEEKFILE
public  _lseekfile
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Seek position in file
; In:
;   V86R_BX - file handle
;   EAX - signed offset to move to
;   BL - from: 0-beginning of file, 1-current location, 2-end of file
; Out:
;   CF=1  - Error seeking in file
;     EAX - ?
;   CF=0  - Seek fine
;     EAX - new offset from beginning of file
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_lseekfile:
        mov v86r_ah,42h
        mov v86r_al,bl
        mov v86r_dx,ax
        shr eax,16
        mov v86r_cx,ax
        mov al,21h
        int 33h
        pushf
        mov ax,v86r_dx
        shl eax,16
        mov ax,v86r_ax
        popf
        ret
endif

ifdef   FILESIZE
public  _filesize
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Get size of file
; In:
;   V86R_BX - file handle
; Out:
;   CF=1  - Error checking file
;     EAX - ?
;   CF=0  - chek fine
;     EAX - size of file
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_filesize:
        mov v86r_ax,4201h
        xor eax,eax
        mov v86r_cx,ax
        mov v86r_dx,ax
        mov al,21h
        int 33h
        push v86r_dx
        push v86r_ax
        mov v86r_ax,4202h
        xor eax,eax
        mov v86r_cx,ax
        mov v86r_dx,ax
        mov al,21h
        int 33h
        mov ax,v86r_dx
        shl eax,16
        mov ax,v86r_ax
        pop v86r_dx
        pop v86r_cx
        mov v86r_ax,4200h
        push eax
        mov al,21h
        int 33h
        pop eax
        ret
endif

ifdef   READFILE
public  _readfile
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Read from file
; In:
;   V86R_BX - file handle
;   EDX -> buffer to read to
;   ECX - number of bytes to read
; Out:
;   CF=1 - Error reading file
;     EAX - ?
;   CF=0 - Read went fine
;     EAX - number of bytes read
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_readfile:
        pushad
        xor ebp,ebp
        add edx,_code32a
        lea ebx,[ecx+edx]
        cmp ebx,100000h
        ja readlong
        mov eax,edx
        shr eax,4
        and dx,0fh
        mov v86r_ds,ax
        mov v86r_dx,dx
readl:
        mov eax,0fff0h
        cmp eax,ecx
        jbe readlf1
        mov eax,ecx
readlf1:
        mov v86r_cx,ax
        mov v86r_ax,3f00h
        mov al,21h
        int 33h
        jc readdone2
        movzx ebx,v86r_ax
        add ebp,ebx
        sub ecx,ebx
        jbe readdone
        or ebx,ebx
        jz readdone
        add v86r_ds,0fffh
        jmp readl
readlong:
        mov edi,edx
        sub edi,_code32a
        mov edx,ecx
        mov eax,_filebufloc
        add eax,_code32a
        mov ebx,eax
        shr eax,4
        and bx,0fh
        mov v86r_ds,ax
        mov v86r_dx,bx
        movzx ebx,_filebuflen
readlongl:
        mov eax,ebx
        cmp eax,edx
        jbe readlonglf1
        mov eax,edx
readlonglf1:
        mov v86r_cx,ax
        mov v86r_ax,3f00h
        mov al,21h
        int 33h
        jc short readdone2
        movzx ecx,v86r_ax
        add ebp,ecx
        mov eax,ecx
        or eax,eax
        jz readdone
        mov esi,_filebufloc
        rep movsb
        sub edx,eax
        ja readlongl
readdone:
        clc
readdone2:
        mov [esp+28],ebp
        popad
        ret
endif

ifdef   WRITEFILE
public  _writefile
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Write to file
; In:
;   V86R_BX - file handle
;   EDX -> buffer to write from
;   ECX - number of bytes to write
; Out:
;   CF=1 - Error writing file
;     EAX - ?
;   CF=0 - Write went fine
;     EAX - number of bytes read
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_writefile:
        pushad
        xor ebp,ebp
        add edx,_code32a
        lea ebx,[ecx+edx]
        cmp ebx,100000h
        ja writelong
        mov eax,edx
        shr edx,4
        and ax,0fh
        mov v86r_ds,dx
        mov v86r_dx,ax
writel:
        mov eax,0fff0h
        cmp eax,ecx
        jbe writelf1
        mov eax,ecx
writelf1:
        mov v86r_cx,ax
        mov v86r_ax,4000h
        mov al,21h
        int 33h
        jc writedone2
        movzx ebx,v86r_ax
        add ebp,ebx
        sub ecx,ebx
        jbe writedone
        add v86r_ds,0fffh
        jmp writel
writelong:
        mov esi,edx
        sub esi,_code32a
        mov edx,ecx
        mov eax,_filebufloc
        add eax,_code32a
        mov ebx,eax
        shr eax,4
        and bx,0fh
        mov v86r_ds,ax
        mov v86r_dx,bx
        movzx ebx,_filebuflen
writelongl:
        mov eax,ebx
        cmp eax,edx
        jbe writelonglf1
        mov eax,edx
writelonglf1:
        mov ecx,eax
        mov edi,_filebufloc
        rep movsb
        mov v86r_cx,ax
        mov v86r_ax,4000h
        mov al,21h
        int 33h
        jc writedone2
        movzx ecx,v86r_ax
        add ebp,ecx
        sub edx,ecx
        ja writelongl
writedone:
        clc
writedone2:
        mov [esp+28],ebp
        popad
        ret
endif

ifdef   FILECOPY
public  _filecopy
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Copy some bytes from one file to another
; In:
;   V86R_SI - source file handle
;   V86R_DI - destination file handle
;   ECX - number of bytes to copy
; Out:
;   CF=1  - Error copying file
;     EAX - ?
;   CF=0  - copied fine
;     EAX - number of bytes copied
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_filecopy:
        pushad
        xor ebp,ebp
        mov edx,_filebufloc
        add edx,_code32a
        mov al,dl
        and ax,0fh
        shr edx,4
        mov v86r_ds,dx
        mov v86r_dx,ax
        movzx ebx,_filebuflen
copylongl:
        mov eax,ebx
        cmp eax,ecx
        jbe copylonglf1
        mov eax,ecx
copylonglf1:
        mov v86r_cx,ax
        mov v86r_ax,3f00h
        mov ax,v86r_si
        mov v86r_bx,ax
        mov al,21h
        int 33h
        jc copydone2
        mov ax,v86r_ax
        or ax,ax
        jz copydone
        mov v86r_cx,ax
        mov v86r_ax,4000h
        mov ax,v86r_di
        mov v86r_bx,ax
        mov al,21h
        int 33h
        jc copydone2
        movzx edx,v86r_ax
        add ebp,edx
        sub ecx,edx
        ja copylongl
copydone:
        clc
copydone2:
        mov [esp+28],ebp
        popad
        ret
endif

ifdef   FINDFILE
public  _findfile
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; Do an AH=4E findfirst
; In:
;   AL - type of search: 4E-first, 4F-next
;   CX - search attributes
;   EDX -> 13 byte buffer for filename found
;   EDI -> search mask
; Out:
;   CF=1 - file not found
;     [EDX] - ?
;   CF=0 - file found
;     [EDX] - filename
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
_findfile:
        push eax
        push esi
        push edi
        add edi,_code32a
        mov esi,edi
        and esi,0fh
        shr edi,4
        mov v86r_ds,di
        mov v86r_dx,si
        mov v86r_ah,al
        mov v86r_cx,cx
        mov esi,_code16a
        sub esi,62h
        mov edi,edx
        mov al,21h
        int 33h
        mov ax,gs
        mov ds,ax
        movsd
        movsd
        movsd
        movsb
        mov ax,es
        mov ds,ax
        pop edi
        pop esi
        pop eax
        ret
endif


code32  ends
        end

