ReC98/libs/BorlandC/putc.asm

481 lines
8.0 KiB
NASM

; int __cdecl _fputc(char ch, FILE *fp)
public __fputc
__fputc proc
@@ch = byte ptr dPtrSize + 2
@@fp = dword ptr dPtrSize + 4
push bp
mov bp, sp
push si
push di
les bx, [bp+@@fp]
dec es:[bx+FILE.level]
push word ptr [bp+@@fp+2]
push bx
mov al, [bp+@@ch]
cbw
push ax
nopcall _fputc
add sp, 6
pop di
pop si
pop bp
ret
__fputc endp
; int __cdecl fputc(int ch, FILE *fp)
public _fputc
_fputc proc
@@ch = byte ptr dPtrSize + 2
@@fp = dword ptr dPtrSize + 4
push bp
mov bp, sp
push si
push di
mov al, [bp+@@ch]
mov fputc_c, al
les bx, [bp+@@fp]
cmp es:[bx+FILE.level], -1
jge short @@checkFlags
inc es:[bx+FILE.level]
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 es:[si], al
mov es, word ptr [bp+@@fp+2]
test byte ptr es:[bx+FILE.flags], 8
jnz short @@LBufFlush?
jmp @@retC
@@LBufFlush?:
cmp fputc_c, 0Ah
jz short @@LBufFlush
cmp fputc_c, 0Dh
jz short @@LBufFlush
jmp @@retC
@@LBufFlush:
push word ptr [bp+@@fp+2]
push word ptr [bp+@@fp] ; stream
nopcall _fflush
pop cx
pop cx
or ax, ax
jnz short @@j1_retEOF
jmp @@retC
@@j1_retEOF:
jmp @@retEOF
@@checkFlags:
les bx, [bp+@@fp]
test byte ptr es:[bx+FILE.flags], 90h
jnz short @@setErr
test byte ptr es:[bx+FILE.flags], 2
jnz short @@setOut
@@setErr:
les bx, [bp+@@fp]
or es:[bx+FILE.flags], 10h
jmp @@retEOF
@@setOut:
les bx, [bp+@@fp]
or es:[bx+FILE.flags], 100h
cmp es:[bx+FILE._bsize], 0
jz short @@unbuffered
cmp es:[bx+FILE.level], 0
jz short @@bufferedPut
push word ptr [bp+@@fp+2]
push bx
nopcall _fflush
pop cx
pop cx
or ax, ax
jz short @@bufferedPut
jmp @@retEOF
@@bufferedPut:
les bx, [bp+@@fp]
mov ax, es:[bx+FILE._bsize]
neg ax
mov es:[bx+FILE.level], ax
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 al, fputc_c
mov es, dx
mov es:[si], al
mov es, word ptr [bp+@@fp+2]
test byte ptr es:[bx+FILE.flags], 8
jnz short @@bufferedFlush?
jmp @@retC
@@bufferedFlush?:
cmp fputc_c, 0Ah
jz short @@bufferedFlush
cmp fputc_c, 0Dh
jz short @@bufferedFlush
jmp @@retC
@@bufferedFlush:
push word ptr [bp+@@fp+2]
push word ptr [bp+@@fp]
nopcall _fflush
pop cx
pop cx
or ax, ax
jnz short @@j2_retEOF
jmp @@retC
@@j2_retEOF:
jmp @@retEOF
@@unbuffered:
les bx, [bp+@@fp]
mov al, es:[bx+FILE.fd]
cbw
add ax, ax
mov bx, ax
test byte ptr (_openfd+1)[bx], 8
jz short @@unbufferedText
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
@@unbufferedText:
cmp fputc_c, 0Ah
jnz short @@unbufferedPutC
les bx, [bp+@@fp]
test byte ptr es:[bx+FILE.flags], 40h
jnz short @@unbufferedPutC
mov ax, 1
push ax
push ds
mov ax, offset fputc_cr
push ax
mov al, es:[bx+FILE.fd]
cbw
push ax
nopcall __rtl_write
add sp, 8
cmp ax, 1
jnz short @@unbufferedFlag
@@unbufferedPutC:
mov ax, 1
push ax
push ds
mov ax, offset fputc_c
push ax
les bx, [bp+@@fp]
mov al, es:[bx+FILE.fd]
cbw
push ax
nopcall __rtl_write
add sp, 8
cmp ax, 1
jz short @@retC
@@unbufferedFlag:
les bx, [bp+@@fp]
test byte ptr es:[bx+FILE.flags+1], 2
jnz short @@retC
or es:[bx+FILE.flags], 10h
@@retEOF:
mov ax, 0FFFFh
jmp short @@ret
@@retC:
mov al, fputc_c
mov ah, 0
@@ret:
pop di
pop si
pop bp
ret
_fputc endp
; int __cdecl fputchar(int c)
public _fputchar
_fputchar proc
@@ch = word ptr dPtrSize + 2
push bp
mov bp, sp
push si
push di
push ds
mov ax, offset stdout
push ax
push [bp+@@ch]
call _fputc
add sp, 6
pop di
pop si
pop bp
ret
_fputchar endp
; int __stdcall _FPUTN(FILE *fp, size_t n, void *ptr)
__FPUTN proc near
@@len = word ptr -2
@@fp = dword ptr 4
@@n = word ptr 8
@@ptr = dword ptr 0Ah
push bp
mov bp, sp
sub sp, 2
push si
push di
mov ax, [bp+@@n]
mov [bp+@@len], ax
les bx, [bp+@@fp]
test byte ptr es:[bx+FILE.flags], 8
jz short @@NoBuf
jmp short @@LBufLoop
@@LBufPut:
push word ptr [bp+@@fp+2]
push word ptr [bp+@@fp]
les bx, [bp+@@ptr]
inc word ptr [bp+@@ptr]
mov al, es:[bx]
cbw
push ax
call _fputc
add sp, 6
cmp ax, 0FFFFh
jnz short @@LBufLoop
jmp @@ret0
@@LBufLoop:
mov ax, [bp+@@n]
dec [bp+@@n]
or ax, ax
jnz short @@LBufPut
jmp @@retLen
@@NoBuf:
les bx, [bp+@@fp]
test byte ptr es:[bx+FILE.flags], 40h
jnz short @@bin
jmp @@text
@@bin:
cmp es:[bx+FILE._bsize], 0
jnz short @@binBuffered
jmp @@binUnbuffered
@@binBuffered:
mov ax, es:[bx+FILE._bsize]
cmp ax, [bp+@@n]
jnb short @@binBufferedFit
cmp es:[bx+FILE.level], 0
jz short @@binAppend?
push word ptr [bp+@@fp+2]
push bx
nopcall _fflush
pop cx
pop cx
or ax, ax
jz short @@binAppend?
jmp @@ret0
@@binAppend?:
les bx, [bp+@@fp]
mov al, es:[bx+FILE.fd]
cbw
add ax, ax
mov bx, ax
test byte ptr (_openfd+1)[bx], 8
jz short @@binWrite
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
@@binWrite:
push [bp+@@n]
push word ptr [bp+@@ptr+2]
push word ptr [bp+@@ptr]
les bx, [bp+@@fp]
mov al, es:[bx+FILE.fd]
cbw
push ax
nopcall __rtl_write
add sp, 8
cmp ax, [bp+@@n]
jnz short @@j1_ret0
jmp @@retLen
@@j1_ret0:
jmp @@ret0
@@binBufferedFit:
les bx, [bp+@@fp]
mov ax, es:[bx+FILE.level]
add ax, [bp+@@n]
jl short @@binBufferedStuff
cmp word ptr es:[bx], 0
jnz short @@binBufferedFlush
mov ax, 0FFFFh
sub ax, es:[bx+FILE._bsize]
mov es:[bx+FILE.level], ax
jmp short @@binBufferedStuff
@@binBufferedFlush:
push word ptr [bp+@@fp+2]
push word ptr [bp+@@fp]
nopcall _fflush
pop cx
pop cx
or ax, ax
jz short @@binBufferedStuff
jmp @@ret0
@@binBufferedStuff:
push [bp+@@n]
push word ptr [bp+@@ptr+2]
push word ptr [bp+@@ptr]
les bx, [bp+@@fp]
push word ptr es:[bx+FILE.curp+2]
push word ptr es:[bx+FILE.curp]
nopcall _memcpy
add sp, 0Ah
les bx, [bp+@@fp]
mov ax, es:[bx+FILE.level]
add ax, [bp+@@n]
mov es:[bx+FILE.level], ax
mov ax, [bp+@@n]
add word ptr es:[bx+FILE.curp], ax
jmp @@retLen
@@binUnbuffered:
les bx, [bp+@@fp]
mov al, es:[bx+FILE.fd]
cbw
add ax, ax
mov bx, ax
test byte ptr (_openfd+1)[bx], 8
jz short @@binUnbufferedWrite
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
@@binUnbufferedWrite:
push [bp+@@n]
push word ptr [bp+@@ptr+2]
push word ptr [bp+@@ptr]
les bx, [bp+@@fp]
mov al, es:[bx+FILE.fd]
cbw
push ax
nopcall __rtl_write
add sp, 8
cmp ax, [bp+@@n]
jnz short @@j2_ret0
; Hack (jmp long @@retLen)
db 0e9h, 07fh, 000h
@@j2_ret0:
jmp short @@ret0
@@text:
les bx, [bp+@@fp]
cmp es:[bx+FILE._bsize], 0
jz short @@textUnbuffered
jmp short @@textBufferedLoop
@@textBuffered:
les bx, [bp+@@fp]
inc word ptr es:[bx]
jge short @@textBufferedPut
mov dx, word ptr es:[bx+FILE.curp+2]
mov si, word ptr es:[bx+FILE.curp]
inc word ptr es:[bx+FILE.curp]
les bx, [bp+@@ptr]
inc word ptr [bp+@@ptr]
mov al, es:[bx]
mov es, dx
mov es:[si], al
mov ah, 0
jmp short @@textBufferedEOF?
@@textBufferedPut:
push word ptr [bp+@@fp+2]
push word ptr [bp+@@fp]
les bx, [bp+@@ptr]
inc word ptr [bp+@@ptr]
mov al, es:[bx]
push ax
call __fputc
add sp, 6
@@textBufferedEOF?:
cmp ax, 0FFFFh
jz short @@ret0
@@textBufferedLoop:
mov ax, [bp+@@n]
dec [bp+@@n]
or ax, ax
jnz short @@textBuffered
jmp short @@retLen
@@textUnbuffered:
push [bp+@@n]
push word ptr [bp+@@ptr+2]
push word ptr [bp+@@ptr]
les bx, [bp+@@fp]
mov al, es:[bx+FILE.fd]
cbw
push ax
nopcall ___write
add sp, 8
cmp ax, [bp+@@n]
jz short @@retLen
@@ret0:
xor ax, ax
jmp short @@ret
@@retLen:
mov ax, [bp+@@len]
@@ret:
pop di
pop si
mov sp, bp
pop bp
retn 0Ah
__FPUTN endp