ReC98/libs/BorlandC/getc.asm

264 lines
4.3 KiB
NASM

; void __pascal __near FlushOutStreams(void)
_FlushOutStreams proc near
@@Ndx = word ptr -(dPtrSize + 2)
@@fp = DPTR_ -(dPtrSize)
push bp
mov bp, sp
sub sp, dPtrSize + 2
push si
push di
mov [bp+@@Ndx], FOPEN_MAX
mov word ptr [bp+@@fp+2], ds
mov word ptr [bp+@@fp], offset _streams
jmp short flush_loop
flush_outstream?:
LES_ bx, [bp+@@fp]
mov ax, ES_[bx+FILE.flags]
and ax, _F_TERM or _F_OUT
cmp ax, _F_TERM or _F_OUT
jnz short flush_next
push word ptr [bp+@@fp+2]
push bx
nopcall _fflush
pop cx
pop cx
flush_next:
add word ptr [bp+@@fp], size FILE
flush_loop:
mov ax, [bp+@@Ndx]
dec [bp+@@Ndx]
or ax, ax
jnz short flush_outstream?
pop di
pop si
mov sp, bp
pop bp
ret
_FlushOutStreams endp
; int __pascal __near _ffill(FILE *fp)
__ffill proc near
@@fp = DPTR_ 4
push bp
mov bp, sp
push si
push di
LES_ bx, [bp+@@fp]
test byte ptr ES_[bx+FILE.flags+1], _F_TERM shr 8
jz short @@fill
call _FlushOutStreams
@@fill:
LES_ bx, [bp+@@fp]
push ES_[bx+FILE._bsize]
mov dx, word ptr ES_[bx+FILE.buffer+2]
mov ax, word ptr ES_[bx+FILE.buffer]
mov word ptr ES_[bx+FILE.curp+2], dx
mov word ptr ES_[bx+FILE.curp], ax
push dx
push ax
mov al, ES_[bx+FILE.fd]
cbw
push ax
nopcall ___read
add sp, 8
LES_ bx, [bp+@@fp]
mov ES_[bx+FILE.level], ax
or ax, ax
jle short @@empty?
and ES_[bx+FILE.flags], not _F_EOF
xor ax, ax
jmp short @@ret
@@empty?:
LES_ bx, [bp+@@fp]
cmp ES_[bx+FILE.level], 0
jnz short @@error
mov ax, ES_[bx+FILE.flags]
and ax, not (_F_IN or _F_OUT)
or ax, _F_EOF
mov ES_[bx+FILE.flags], ax
jmp short @@retMinus1
@@error:
LES_ bx, [bp+@@fp]
mov ES_[bx+FILE.level], 0
or ES_[bx+FILE.flags], _F_ERR
@@retMinus1:
mov ax, -1
@@ret:
pop di
pop si
pop bp
ret 4
__ffill endp
; int __cdecl _fgetc(FILE *stream)
__fgetc proc
@@fp = DPTR_ (2 + cPtrSize)
push bp
mov bp, sp
push si
push di
LES_ bx, [bp+@@fp]
inc ES_[bx+FILE.level]
push word ptr [bp+@@fp+2]
push bx
call _fgetc
pop cx
pop cx
pop di
pop si
pop bp
ret
__fgetc endp
__Nfgetc:
pop ax
push cs
push ax
; int __cdecl fgetc(FILE *@@fp)
_fgetc proc
@@fp = DPTR_ (2 + cPtrSize)
push bp
mov bp, sp
push si
push di
mov ax, word ptr [bp+@@fp]
or ax, word ptr [bp+@@fp+2]
jnz short @@filled?
jmp @@retEOF
@@filled?:
LES_ bx, [bp+@@fp]
cmp ES_[bx+FILE.level], 0
jle short @@validFile?
dec ES_[bx+FILE.level]
jmp short @@retBufferedC
@@validFile?:
LES_ bx, [bp+@@fp]
cmp ES_[bx+FILE.level], 0
jl short @@error
test ES_[bx+FILE.flags], _F_OUT or _F_ERR
jnz short @@error
test byte ptr ES_[bx+FILE.flags], _F_READ
jnz short @@buffered?
@@error:
LES_ bx, [bp+@@fp]
or ES_[bx+FILE.flags], _F_ERR
jmp @@retEOF
@@buffered?:
LES_ bx, [bp+@@fp]
or ES_[bx+FILE.flags], _F_IN
cmp ES_[bx+FILE._bsize], 0
jz short @@flushTerm
push word ptr [bp+@@fp+2]
push bx
call __ffill
or ax, ax
jnz short @@retEOF
LES_ bx, [bp+@@fp]
dec ES_[bx+FILE.level]
@@retBufferedC:
LES_ bx, [bp+@@fp]
mov dx, word ptr ES_[bx+FILE.curp+2]
mov si, word ptr ES_[bx+FILE.curp]
inc word ptr ES_[bx+FILE.curp]
mov es, dx
mov al, ES_[si]
jmp short @@ret0
@@flushTerm:
LES_ bx, [bp+@@fp]
test byte ptr ES_[bx+FILE.flags+1], _F_TERM shr 8
jz short @@readc
call _FlushOutStreams
@@readc:
mov ax, 1
push ax
push ds
mov ax, offset fgetc_c
push ax
LES_ bx, [bp+@@fp]
mov al, ES_[bx+FILE.fd]
cbw
push ax
nopcall ___read
add sp, 8
or ax, ax
jnz short @@textLoop
LES_ bx, [bp+@@fp]
mov al, ES_[bx+FILE.fd]
cbw
push ax
nopcall _eof
pop cx
cmp ax, 1
jz short @@eof
LES_ bx, [bp+@@fp]
or ES_[bx+FILE.flags], _F_ERR
jmp short @@retEOF
@@eof:
LES_ bx, [bp+@@fp]
mov ax, ES_[bx+FILE.flags]
and ax, not (_F_IN or _F_OUT)
or ax, _F_EOF
mov ES_[bx+FILE.flags], ax
@@retEOF:
mov ax, EOF
jmp short @@ret
@@textLoop:
cmp fgetc_c, 0Dh ; '\r'
jnz short @@unsetEOF
LES_ bx, [bp+@@fp]
test byte ptr ES_[bx+FILE.flags], _F_BIN
jz short @@flushTerm
@@unsetEOF:
LES_ bx, [bp+@@fp]
and ES_[bx+FILE.flags], not _F_EOF
mov al, fgetc_c
@@ret0:
mov ah, 0
@@ret:
pop di
pop si
pop bp
ret
_fgetc endp
; int fgetchar(void)
_fgetchar proc
push si
push di
push ds
mov ax, offset stdin
push ax
call _fgetc
pop cx
pop cx
pop di
pop si
ret
_fgetchar endp