mirror of https://github.com/nmlgc/ReC98.git
[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:
parent
8f27696514
commit
36a4a02bdc
|
@ -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
|
266
th01_op.asm
266
th01_op.asm
|
@ -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 =======================================
|
||||
|
||||
|
|
Loading…
Reference in New Issue