201 lines
4.3 KiB
NASM
201 lines
4.3 KiB
NASM
|
;
|
||
|
; Copyright (c) Mix Software 1988
|
||
|
;
|
||
|
; position a file
|
||
|
;
|
||
|
; int fseek(fp, offset, origin)
|
||
|
; FILE *fp;
|
||
|
; long offset;
|
||
|
; int origin;
|
||
|
;
|
||
|
IDT fseek
|
||
|
DEF fseek
|
||
|
REF _fileerr
|
||
|
FREF _fseek
|
||
|
fseek MOV BX,SP
|
||
|
PUSH [BX][%PARM4-2]
|
||
|
PUSH [BX][%PARM3-2]
|
||
|
PUSH [BX][%PARM2-2]
|
||
|
PUSH [BX][%PARM1-2]
|
||
|
CALLFAR _fseek
|
||
|
ADD SP,%8
|
||
|
CMP DX,-1
|
||
|
JNZ OK
|
||
|
CMP AX,-1
|
||
|
JNZ OK
|
||
|
RETFAR
|
||
|
OK XOR AX,AX
|
||
|
RETFAR
|
||
|
END
|
||
|
;
|
||
|
; position a file
|
||
|
;
|
||
|
; long _fseek(fp, offset, origin)
|
||
|
; FILE *fp;
|
||
|
; long offset;
|
||
|
; int origin;
|
||
|
;
|
||
|
IDT _fseek
|
||
|
DEF _fseek
|
||
|
REF _fileerr
|
||
|
FREF _fflush
|
||
|
FREF _rflush
|
||
|
_fseek MOV BX,SP
|
||
|
MOV SI,[BX][%PARM1-2]
|
||
|
TEST SI,SI
|
||
|
JZ NOFILE
|
||
|
TEST %[SI][%FD$DIRTY],%FL$WRITE+FL$READ
|
||
|
JNZ FLUSH
|
||
|
;
|
||
|
; fp->file.count = 0;
|
||
|
;
|
||
|
DOSEEK MOV [SI][%FD$COUNT],0
|
||
|
;
|
||
|
; if ((handle = fp->file.handle) == -1) handle = 2;
|
||
|
;
|
||
|
MOV BX,[SI][%FD$HNDL]
|
||
|
CMP BX,%-1
|
||
|
JZ USE2
|
||
|
;
|
||
|
; reg.byte.ah = 0x42;
|
||
|
; reg.byte.al = origin;
|
||
|
; reg.word.bx = handle;
|
||
|
; longword.longvalue = offset;
|
||
|
; reg.word.cx = longword.words.msword;
|
||
|
; reg.word.dx = longword.words.lsword;
|
||
|
; longword.words.msword = reg.word.dx;
|
||
|
; longword.words.lsword = reg.word.ax;
|
||
|
; return longword.longvalue;
|
||
|
;
|
||
|
HNDLSET MOV AH,>42
|
||
|
MOV SI,SP
|
||
|
MOV AL,[SI][%PARM3+2-2]
|
||
|
MOV DX,[SI][%PARM2-2]
|
||
|
MOV CX,[SI][%PARM2+2-2]
|
||
|
;
|
||
|
; if (bios(0x21,®) & 0x01) return (*_fileerr)(reg.word.ax,fp);
|
||
|
;
|
||
|
INT >21
|
||
|
JB ERROR
|
||
|
;
|
||
|
; longword.words.msword = reg.word.dx;
|
||
|
; longword.words.lsword = reg.word.ax;
|
||
|
; return longword.longvalue;
|
||
|
;
|
||
|
RETSEG
|
||
|
;
|
||
|
ERROR MOV SI,SP
|
||
|
PUSH [SI][%PARM1-2]
|
||
|
PUSH AX
|
||
|
MOV BX,[_fileerr]
|
||
|
CALLSEG [BX]
|
||
|
ADD SP,%4
|
||
|
CWD
|
||
|
RETSEG
|
||
|
NOFILE MOV AX,-1
|
||
|
CWD
|
||
|
RETSEG
|
||
|
;
|
||
|
; if (fp->file.dirty & fdwrite) {
|
||
|
; if (_fflush(fp) != 0) return EOF;
|
||
|
; }
|
||
|
;
|
||
|
FLUSH TEST %[SI][%FD$DIRTY],%FL$WRITE
|
||
|
JZ FLUSHR
|
||
|
PUSH SI
|
||
|
CALLFAR _fflush
|
||
|
ENDFLUSH POP SI
|
||
|
TEST AX,AX
|
||
|
JZ DOSEEK
|
||
|
DEC AX
|
||
|
RETSEG
|
||
|
;
|
||
|
; else if (fp->file.dirty & fdread) {
|
||
|
; if (_rflush(fp) != 0) return EOF;
|
||
|
; }
|
||
|
;
|
||
|
FLUSHR PUSH SI
|
||
|
CALLFAR _rflush
|
||
|
JMPS ENDFLUSH
|
||
|
USE2 MOV BX,2
|
||
|
JMPS HNDLSET
|
||
|
END
|
||
|
;
|
||
|
; return the current file position
|
||
|
; long ftell(fp)
|
||
|
; FILE *fp;
|
||
|
;
|
||
|
IDT ftell
|
||
|
DEF ftell
|
||
|
FREF _seekend
|
||
|
REF _fileerr
|
||
|
ftell MOV BX,SP
|
||
|
MOV SI,[BX][%PARM1-2]
|
||
|
TEST SI,SI
|
||
|
JZ NULL
|
||
|
TEST %[SI][%FD$FLAGS],%FL$APPEN
|
||
|
JZ FIND
|
||
|
TEST %[SI][%FD$DIRTY],%FL$WRITE
|
||
|
JZ FIND
|
||
|
PUSH SI
|
||
|
CALLFAR _seekend
|
||
|
POP SI
|
||
|
FIND EQU $
|
||
|
;
|
||
|
; reg.byte.ah = 0x42;
|
||
|
; reg.byte.al = 1
|
||
|
; reg.word.bx = handle;
|
||
|
; reg.word.cx = 0
|
||
|
; reg.word.dx = 0
|
||
|
;
|
||
|
MOV AX,>4201
|
||
|
XOR CX,CX
|
||
|
XOR DX,DX
|
||
|
MOV BX,[SI][%FD$HNDL]
|
||
|
;
|
||
|
; if (bios(0x21,®) & 0x01) return (*_fileerr)(reg.word.ax,fp);
|
||
|
;
|
||
|
PUSH SI
|
||
|
INT >21
|
||
|
POP SI
|
||
|
JB ERROR
|
||
|
;
|
||
|
; longword.words.msword = reg.word.dx;
|
||
|
; longword.words.lsword = reg.word.ax;
|
||
|
; return longword.longvalue;
|
||
|
;
|
||
|
TEST %[SI][%FD$DIRTY],%FL$WRITE+FL$READ
|
||
|
JNZ BUFRUSED
|
||
|
RETSEG
|
||
|
;
|
||
|
; if (fp->file.dirty & fdwrite) {
|
||
|
; offset = fp->file.ptr - fp->file.bufr;
|
||
|
; }
|
||
|
;
|
||
|
BUFRUSED TEST %[SI][%FD$DIRTY],%FL$WRITE
|
||
|
JZ READBUFR
|
||
|
ADDOFF MOV CX,[SI][%FD$PTR]
|
||
|
SUB CX,[SI][%FD$BUFR]
|
||
|
ADD AX,CX
|
||
|
ADC DX,%0
|
||
|
RETSEG
|
||
|
;
|
||
|
; else if (fp->file.dirty & fdread) {
|
||
|
; offset = fp->file.bufr - fp->file.bufr;}
|
||
|
;
|
||
|
READBUFR SUB AX,[SI][%FD$COUNT]
|
||
|
SBB DX,0
|
||
|
RETSEG
|
||
|
;
|
||
|
ERROR MOV SI,SP
|
||
|
PUSH [SI][%PARM1-2]
|
||
|
PUSH AX
|
||
|
MOV BX,[_fileerr]
|
||
|
CALLSEG [BX]
|
||
|
ADD SP,%4
|
||
|
CWD
|
||
|
RETSEG
|
||
|
NULL MOV AX,-1
|
||
|
RETSEG
|
||
|
END
|