ReC98/libs/BorlandC/fseek.asm

317 lines
4.9 KiB
NASM

; static int pascal near Displacement (FILE *fp)
Displacement proc near
@@P = dword ptr -6
@@disp = word ptr -2
@@fp = DPTR_ 4
if LDATA
@@local_stack equ 6
else
@@local_stack equ 2
endif
push bp
mov bp, sp
sub sp, @@local_stack
push si
push di
LES_ bx, [bp+@@fp]
cmp ES_[bx+FILE.level], 0
jge short @@absLevel
if LDATA
mov cx, ES_[bx+FILE._bsize]
add cx, ES_[bx+FILE.level]
inc cx
mov ax, cx
else
mov dx, ES_[bx+FILE._bsize]
add dx, ES_[bx+FILE.level]
inc dx
mov ax, dx
endif
jmp short @@bin?
@@absLevel:
LES_ bx, [bp+@@fp]
mov ax, ES_[bx+FILE.level]
cwd
xor ax, dx
sub ax, dx
if LDATA
mov cx, ax
else
mov dx, ax
endif
@@bin?:
mov [bp+@@disp], ax
LES_ bx, [bp+@@fp]
test byte ptr ES_[bx+FILE.flags], 40h
jnz short @@ret
LES_ bx, [bp+@@fp]
if LDATA
mov dx, word ptr ES_[bx+FILE._curp+2]
mov ax, word ptr ES_[bx+FILE._curp]
mov word ptr [bp+@@P+2], dx
mov word ptr [bp+@@P], ax
else
mov cx, [bx+FILE._curp]
endif
cmp ES_[bx+FILE.level], 0
jge short @@readLoop
jmp short @@writeLoop
@@write:
if LDATA
dec word ptr [bp+@@P]
LES_ bx, [bp+@@P]
else
dec cx
mov bx, cx
endif
cmp byte ptr ES_[bx], 0Ah
jnz short @@writeLoop
inc [bp+@@disp]
@@writeLoop:
if LDATA
mov ax, cx
dec cx
else
mov ax, dx
dec dx
endif
or ax, ax
jnz short @@write
jmp short @@ret
@@read:
if LDATA
les bx, [bp+@@P]
inc word ptr [bp+@@P]
else
mov bx, cx
inc cx
endif
cmp byte ptr ES_[bx], 0Ah
jnz short @@readLoop
inc [bp+@@disp]
@@readLoop:
if LDATA
mov ax, cx
dec cx
else
mov ax, dx
dec dx
endif
or ax, ax
jnz short @@read
@@ret:
mov ax, [bp+@@disp]
pop di
pop si
mov sp, bp
pop bp
ret dPtrSize
Displacement endp
; int __cdecl fseek(FILE *fp, __int32 ofs, int whence)
_fseek proc
@@fp = DPTR_ 2 + dPtrSize
@@ofs = dword ptr 2 + dPtrSize + dPtrSize
@@whence = word ptr 2 + dPtrSize + dPtrSize + 4
push bp
mov bp, sp
push si
push di
if LDATA
push word ptr [bp+@@fp+2]
endif
push word ptr [bp+@@fp]
nopcall _fflush
if LDATA
pop cx
endif
pop cx
or ax, ax
jz short @@fromCur?
mov ax, 0FFFFh
jmp short @@ret
@@fromCur?:
cmp [bp+@@whence], 1
jnz short @@set
LES_ bx, [bp+@@fp]
cmp ES_[bx+FILE.level], 0
jle short @@set
if LDATA
push word ptr [bp+@@fp+2]
endif
push bx
call Displacement
cwd
sub word ptr [bp+@@ofs], ax
sbb word ptr [bp+@@ofs+2], dx
@@set:
LES_ bx, [bp+@@fp]
and ES_[bx+FILE.flags], 0FE5Fh
mov ES_[bx+FILE.level], 0
if LDATA
mov dx, word ptr ES_[bx+FILE._buffer+2]
endif
mov ax, word ptr ES_[bx+FILE._buffer]
if LDATA
mov word ptr ES_[bx+FILE._curp+2], dx
endif
mov word ptr ES_[bx+FILE._curp], ax
push [bp+@@whence]
push word ptr [bp+@@ofs+2]
push word ptr [bp+@@ofs]
mov al, ES_[bx+FILE.fd]
cbw
push ax
nopcall _lseek
add sp, 8
cmp dx, -1
jnz short @@ret0
cmp ax, -1
jnz short @@ret0
mov ax, 0FFFFh
jmp short @@ret
@@ret0:
xor ax, ax
@@ret:
pop di
pop si
pop bp
ret
_fseek endp
; __int32 __cdecl ftell(FILE *fp)
_ftell proc
@@l = dword ptr -8
@@a = dword ptr -4
@@fp = DPTR_ 2 + dPtrSize
push bp
mov bp, sp
sub sp, 8
push si
push di
mov ax, 1
push ax
xor ax, ax
push ax
push ax
LES_ bx, [bp+@@fp]
mov al, ES_[bx+FILE.fd]
cbw
push ax
nopcall _lseek
add sp, 8
mov word ptr [bp+@@a+2], dx
mov word ptr [bp+@@a], ax
cmp dx, -1
jnz short @@writing?
cmp ax, -1
jnz short @@writing?
jmp @@retA
@@writing?:
LES_ bx, [bp+@@fp]
cmp ES_[bx+FILE.level], 0
if LDATA
jl short @@appending?
jmp @@subDisplacement
else
jge short @@subDisplacement
endif
@@appending?:
mov al, ES_[bx+FILE.fd]
cbw
add ax, ax
mov bx, ax
test byte ptr (_openfd+1)[bx], 8
jz short @@addDisplacement
mov ax, 2
push ax
xor ax, ax
push ax
push ax
mov bx, word ptr [bp+@@fp]
mov al, ES_[bx+FILE.fd]
cbw
push ax
nopcall _lseek
add sp, 8
mov word ptr [bp+@@l+2], dx
mov word ptr [bp+@@l], ax
cmp dx, -1
jnz short @@restore
cmp ax, -1
jnz short @@restore
jmp short @@ret
@@restore:
xor ax, ax
push ax
push word ptr [bp+@@a+2]
push word ptr [bp+@@a]
LES_ bx, [bp+@@fp]
mov al, ES_[bx+FILE.fd]
cbw
push ax
nopcall _lseek
add sp, 8
cmp dx, -1
jnz short @@setAToL
cmp ax, -1
jnz short @@setAToL
mov dx, -1
mov ax, -1
jmp short @@ret
@@setAToL:
mov dx, word ptr [bp+@@l+2]
mov ax, word ptr [bp+@@l]
mov word ptr [bp+@@a+2], dx
mov word ptr [bp+@@a], ax
@@addDisplacement:
if LDATA
push word ptr [bp+@@fp+2]
endif
push word ptr [bp+@@fp]
call Displacement
cwd
add word ptr [bp+@@a], ax
adc word ptr [bp+@@a+2], dx
jmp short @@retA
@@subDisplacement:
if LDATA
push word ptr [bp+@@fp+2]
endif
push word ptr [bp+@@fp]
call Displacement
cwd
sub word ptr [bp+@@a], ax
sbb word ptr [bp+@@a+2], dx
@@retA:
mov dx, word ptr [bp+@@a+2]
mov ax, word ptr [bp+@@a]
@@ret:
pop di
pop si
mov sp, bp
pop bp
ret
_ftell endp