[Reduction] #169-170: fgetn and fread

... yeah, just because ZUN decided to use the C file functions to read
reiiden.cfg for a change. OK, can we *finally* include master.lib's bgm.inc
now?
This commit is contained in:
nmlgc 2014-08-25 04:05:24 +02:00
parent 8f27696514
commit 36a4a02bdc
2 changed files with 234 additions and 265 deletions

233
libs/BorlandC/fread.asm Normal file
View File

@ -0,0 +1,233 @@
; int __stdcall fgetn(FILE *fp, int n, void *ptr)
_fgetn proc near
@@var_4 = word ptr -4
@@Temp = word ptr -2
@@fp = dword ptr 4
@@n = word ptr 8
@@ptr = dword ptr 0Ah
push bp
mov bp, sp
sub sp, 4
push si
push di
jmp @@while
@@loop:
inc [bp+@@n]
les bx, [bp+@@fp]
mov ax, es:[bx+FILE._bsize]
cmp ax, [bp+@@n]
jbe short @@len_bsize
mov ax, [bp+@@n]
jmp short @@bin?
@@len_bsize:
les bx, [bp+@@fp]
mov ax, es:[bx+FILE._bsize]
@@bin?:
mov [bp+@@Temp], ax
les bx, [bp+@@fp]
test byte ptr es:[bx+FILE.flags], 40h
jnz short @@bsize?
jmp @@getc?
@@bsize?:
cmp es:[bx+FILE._bsize], 0
jnz short @@greater?
jmp @@getc?
@@greater?:
mov ax, es:[bx+FILE._bsize]
cmp ax, [bp+@@n]
jnb short @@getc?
cmp es:[bx+FILE.level], 0
jnz short @@getc?
dec [bp+@@n]
mov [bp+@@Temp], 0
jmp short @@adjust?
@@adjust:
les bx, [bp+@@fp]
add bx, FILE._bsize
mov [bp+@@var_4], bx
mov ax, es:[bx]
add [bp+@@Temp], ax
sub [bp+@@n], ax
@@adjust?:
les bx, [bp+@@fp]
mov ax, es:[bx+FILE._bsize]
cmp ax, [bp+@@n]
jbe short @@adjust
push [bp+@@Temp]
push word ptr [bp+@@ptr+2]
push word ptr [bp+@@ptr]
mov al, es:[bx+FILE.fd]
cbw
push ax
nopcall __rtl_read
add sp, 8
mov dx, ax
cmp dx, 0FFFFh
jnz short @@advance
xor dx, dx
les bx, [bp+@@fp]
or es:[bx+FILE.flags], 10h
@@advance:
add word ptr [bp+@@ptr], dx
cmp dx, [bp+@@Temp]
jz short @@while
mov ax, [bp+@@Temp]
sub ax, dx
add [bp+@@n], ax
@@setEOF:
les bx, [bp+@@fp]
or es:[bx+FILE.flags], 20h
jmp short @@ret
@@writec:
les bx, [bp+@@ptr]
mov es:[bx], dl
inc word ptr [bp+@@ptr]
@@getc?:
dec [bp+@@n]
mov ax, [bp+@@n]
or ax, ax
jz short @@EOF?
dec [bp+@@Temp]
jz short @@EOF?
les bx, [bp+@@fp]
dec word ptr es:[bx]
jl short @@getc
mov dx, es:[bx+0Eh]
mov si, es:[bx+0Ch]
inc word ptr es:[bx+0Ch]
mov es, dx
mov al, es:[si]
mov ah, 0
jmp short @@gotEOF?
@@getc:
push word ptr [bp+@@fp+2]
push word ptr [bp+@@fp]
nopcall __fgetc
pop cx
pop cx
@@gotEOF?:
mov dx, ax
cmp ax, 0FFFFh
jnz short @@writec
@@EOF?:
cmp dx, 0FFFFh
jz short @@setEOF
@@while:
cmp [bp+@@n], 0
jz short @@ret
jmp @@loop
@@ret:
mov ax, [bp+@@n]
pop di
pop si
mov sp, bp
pop bp
retn 0Ah
_fgetn endp
; size_t __cdecl fread(void *ptr, size_t psize, size_t nitems, FILE *fp)
public _fread
_fread proc DIST
@@temp = dword ptr -6
@@n = word ptr -2
@@ptr = dword ptr 6
@@psize = word ptr 0Ah
@@nitems = word ptr 0Ch
@@fp = dword ptr 0Eh
push bp
mov bp, sp
sub sp, 6
push si
push di
cmp [bp+@@psize], 0
jnz short @@seg?
xor ax, ax
jmp @@ret
@@seg?:
mov bx, [bp+@@psize]
xor cx, cx
mov ax, [bp+@@nitems]
xor dx, dx
call N_LXMUL@
mov word ptr [bp+@@temp+2], dx
mov word ptr [bp+@@temp], ax
cmp dx, 1
ja short @@huge
jb short @@segGet
or ax, ax
jnb short @@huge
@@segGet:
push word ptr [bp+@@ptr+2]
push word ptr [bp+@@ptr]
push word ptr [bp+@@temp]
push word ptr [bp+@@fp+2]
push word ptr [bp+@@fp]
call _fgetn
mov dx, word ptr [bp+@@temp]
sub dx, ax
push dx
xor dx, dx
pop ax
div [bp+@@psize]
jmp short @@ret
@@huge:
mov ax, [bp+@@nitems]
inc ax
mov [bp+@@n], ax
jmp short @@hugeGet
@@hugeAdvance:
mov bx, [bp+@@psize]
xor cx, cx
mov dx, word ptr [bp+@@ptr+2]
mov ax, word ptr [bp+@@ptr]
call near ptr N_PADD@
mov word ptr [bp+@@ptr+2], dx
mov word ptr [bp+@@ptr], ax
@@hugeGet:
dec [bp+@@n]
mov ax, [bp+@@n]
or ax, ax
jz short @@retItemsMinusN
push word ptr [bp+@@ptr+2]
push word ptr [bp+@@ptr]
push [bp+@@psize]
push word ptr [bp+@@fp+2]
push word ptr [bp+@@fp]
call _fgetn
or ax, ax
jz short @@hugeAdvance
@@retItemsMinusN:
mov ax, [bp+@@nitems]
sub ax, [bp+@@n]
@@ret:
pop di
pop si
mov sp, bp
pop bp
ret
_fread endp

View File

@ -7560,271 +7560,7 @@ arg_8 = byte ptr 0Eh
_fprintf endp
include libs/BorlandC/fputs.asm
; =============== S U B R O U T I N E =======================================
; Attributes: library function bp-based frame
; int __stdcall sub_41ED(FILE *stream, int, void *buf)
sub_41ED proc near
var_4 = word ptr -4
len = word ptr -2
stream = dword ptr 4
arg_4 = word ptr 8
buf = dword ptr 0Ah
push bp
mov bp, sp
sub sp, 4
push si
push di
jmp loc_42F4
; ---------------------------------------------------------------------------
loc_41F8:
inc [bp+arg_4]
les bx, [bp+stream]
mov ax, es:[bx+6]
cmp ax, [bp+arg_4]
jbe short loc_420C
mov ax, [bp+arg_4]
jmp short loc_4213
; ---------------------------------------------------------------------------
loc_420C:
les bx, [bp+stream]
mov ax, es:[bx+6]
loc_4213:
mov [bp+len], ax
les bx, [bp+stream]
test byte ptr es:[bx+2], 40h
jnz short loc_4223
jmp loc_42AF
; ---------------------------------------------------------------------------
loc_4223:
cmp word ptr es:[bx+6], 0
jnz short loc_422D
jmp loc_42AF
; ---------------------------------------------------------------------------
loc_422D:
mov ax, es:[bx+6]
cmp ax, [bp+arg_4]
jnb short loc_42AF
cmp word ptr es:[bx], 0
jnz short loc_42AF
dec [bp+arg_4]
mov [bp+len], 0
jmp short loc_4258
; ---------------------------------------------------------------------------
loc_4246:
les bx, [bp+stream]
add bx, 6
mov [bp+var_4], bx
mov ax, es:[bx]
add [bp+len], ax
sub [bp+arg_4], ax
loc_4258:
les bx, [bp+stream]
mov ax, es:[bx+6]
cmp ax, [bp+arg_4]
jbe short loc_4246
push [bp+len] ; len
push word ptr [bp+buf+2]
push word ptr [bp+buf] ; buf
mov al, es:[bx+4]
cbw
push ax ; handle
nopcall __rtl_read
add sp, 8
mov dx, ax
cmp dx, 0FFFFh
jnz short loc_428C
xor dx, dx
les bx, [bp+stream]
or word ptr es:[bx+2], 10h
loc_428C:
add word ptr [bp+buf], dx
cmp dx, [bp+len]
jz short loc_42F4
mov ax, [bp+len]
sub ax, dx
add [bp+arg_4], ax
loc_429C:
les bx, [bp+stream]
or word ptr es:[bx+2], 20h
jmp short loc_42FD
; ---------------------------------------------------------------------------
loc_42A6:
les bx, [bp+buf]
mov es:[bx], dl
inc word ptr [bp+buf]
loc_42AF:
dec [bp+arg_4]
mov ax, [bp+arg_4]
or ax, ax
jz short loc_42EF
dec [bp+len]
jz short loc_42EF
les bx, [bp+stream]
dec word ptr es:[bx]
jl short loc_42DB
mov dx, es:[bx+0Eh]
mov si, es:[bx+0Ch]
inc word ptr es:[bx+0Ch]
mov es, dx
mov al, es:[si]
mov ah, 0
jmp short loc_42E8
; ---------------------------------------------------------------------------
loc_42DB:
push word ptr [bp+stream+2]
push word ptr [bp+stream] ; stream
nop
push cs
call near ptr __fgetc
pop cx
pop cx
loc_42E8:
mov dx, ax
cmp ax, 0FFFFh
jnz short loc_42A6
loc_42EF:
cmp dx, 0FFFFh
jz short loc_429C
loc_42F4:
cmp [bp+arg_4], 0
jz short loc_42FD
jmp loc_41F8
; ---------------------------------------------------------------------------
loc_42FD:
; sub_41ED+10Bj
mov ax, [bp+arg_4]
pop di
pop si
mov sp, bp
pop bp
retn 0Ah
sub_41ED endp
; =============== S U B R O U T I N E =======================================
; Attributes: library function bp-based frame
; size_t __cdecl fread(void *ptr, size_t size, size_t n, FILE *stream)
_fread proc far
_ptr = dword ptr 6
_size = word ptr 0Ah
n = word ptr 0Ch
stream = dword ptr 0Eh
push bp
mov bp, sp
sub sp, 6
push si
push di
cmp [bp+_size], 0
jnz short loc_431B
xor ax, ax
jmp loc_439C
; ---------------------------------------------------------------------------
loc_431B:
mov bx, [bp+_size]
xor cx, cx
_fread endp ; sp-analysis failed
; =============== S U B R O U T I N E =======================================
; Attributes: library function
sub_4320 proc far
mov ax, [bp+0Ch]
xor dx, dx
call N_LXMUL@
mov [bp-4], dx
mov [bp-6], ax
cmp dx, 1
ja short loc_4359
jb short loc_4339
or ax, ax
jnb short loc_4359
loc_4339:
push word ptr [bp+8]
push word ptr [bp+6] ; buf
push word ptr [bp-6] ; int
push word ptr [bp+10h]
push word ptr [bp+0Eh] ; stream
call sub_41ED
mov dx, [bp-6]
sub dx, ax
push dx
xor dx, dx
pop ax
div word ptr [bp+0Ah]
jmp short loc_439C
; ---------------------------------------------------------------------------
loc_4359:
mov ax, [bp+0Ch]
inc ax
mov [bp-2], ax
jmp short loc_4376
; ---------------------------------------------------------------------------
loc_4362:
mov bx, [bp+0Ah]
xor cx, cx
mov dx, [bp+8]
mov ax, [bp+6]
call near ptr N_PADD@
mov [bp+8], dx
mov [bp+6], ax
loc_4376:
dec word ptr [bp-2]
mov ax, [bp-2]
or ax, ax
jz short loc_4396
push word ptr [bp+8]
push word ptr [bp+6] ; buf
push word ptr [bp+0Ah] ; int
push word ptr [bp+10h]
push word ptr [bp+0Eh] ; stream
call sub_41ED
or ax, ax
jz short loc_4362
loc_4396:
mov ax, [bp+0Ch]
sub ax, [bp-2]
loc_439C:
pop di
pop si
mov sp, bp
pop bp
retf
sub_4320 endp ; sp-analysis failed
include libs/BorlandC/fread.asm
; =============== S U B R O U T I N E =======================================