From 36a4a02bdcd53e1617a80dd46365c81a4b749502 Mon Sep 17 00:00:00 2001 From: nmlgc Date: Mon, 25 Aug 2014 04:05:24 +0200 Subject: [PATCH] [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? --- libs/BorlandC/fread.asm | 233 +++++++++++++++++++++++++++++++++++ th01_op.asm | 266 +--------------------------------------- 2 files changed, 234 insertions(+), 265 deletions(-) create mode 100644 libs/BorlandC/fread.asm diff --git a/libs/BorlandC/fread.asm b/libs/BorlandC/fread.asm new file mode 100644 index 00000000..b73dca88 --- /dev/null +++ b/libs/BorlandC/fread.asm @@ -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 diff --git a/th01_op.asm b/th01_op.asm index a1485945..5c956f8c 100644 --- a/th01_op.asm +++ b/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 =======================================