mirror of https://github.com/nmlgc/ReC98.git
135 lines
1.9 KiB
NASM
135 lines
1.9 KiB
NASM
_ctlZ equ 26
|
|
|
|
; int __cdecl __far __read(int fd, void *buf, unsigned int len)
|
|
___read proc
|
|
public ___read
|
|
@@c = byte ptr -3
|
|
@@dlen = word ptr -2
|
|
@@fd = word ptr dPtrSize + 2
|
|
@@buf = dword ptr dPtrSize + 4
|
|
@@len = word ptr dPtrSize + 4 + dPtrSize
|
|
|
|
push bp
|
|
mov bp, sp
|
|
sub sp, 4
|
|
push si
|
|
push di
|
|
mov ax, [bp+@@fd]
|
|
cmp ax, __nfile
|
|
jb short @@readCheckLen
|
|
mov ax, 6
|
|
push ax
|
|
call __IOERROR
|
|
jmp @@readRet
|
|
|
|
@@readCheckLen:
|
|
mov ax, [bp+@@len]
|
|
inc ax
|
|
cmp ax, 2
|
|
jb short @@readTooShort
|
|
mov bx, [bp+@@fd]
|
|
add bx, bx
|
|
test byte ptr (_openfd+1)[bx], 2
|
|
jz short @@readDo
|
|
|
|
@@readTooShort:
|
|
xor ax, ax
|
|
jmp @@readRet
|
|
|
|
@@readDo:
|
|
push [bp+@@len]
|
|
if LDATA
|
|
push word ptr [bp+@@buf+2]
|
|
endif
|
|
push word ptr [bp+@@buf]
|
|
push [bp+@@fd]
|
|
nopcall __rtl_read
|
|
add sp, 4 + dPtrSize
|
|
mov [bp+@@dlen], ax
|
|
inc ax
|
|
cmp ax, 2
|
|
jb short @@readBinary
|
|
mov bx, [bp+@@fd]
|
|
add bx, bx
|
|
test byte ptr (_openfd+1)[bx], 40h
|
|
jnz short @@readSqueezeCR
|
|
|
|
@@readBinary:
|
|
mov ax, [bp+@@dlen]
|
|
jmp short @@readRet
|
|
|
|
@@readSqueezeCR:
|
|
mov cx, [bp+@@dlen]
|
|
les si, [bp+@@buf]
|
|
ife LDATA
|
|
push ds
|
|
pop es
|
|
endif
|
|
mov di, si
|
|
mov bx, si
|
|
cld
|
|
|
|
@@squeeze:
|
|
lods byte ptr es:[si]
|
|
cmp al, _ctlZ
|
|
jz short @@endSeen
|
|
cmp al, 0Dh
|
|
jz short @@elseSqueeze
|
|
stosb
|
|
loop @@squeeze
|
|
jmp short @@squeezeBreak
|
|
|
|
@@elseSqueeze:
|
|
loop @@squeeze
|
|
push es
|
|
push bx
|
|
mov ax, 1
|
|
push ax
|
|
lea ax, [bp+@@c]
|
|
pushSS_
|
|
push ax
|
|
push [bp+@@fd]
|
|
nopcall __read
|
|
add sp, 8
|
|
pop bx
|
|
pop es
|
|
cld
|
|
mov al, [bp+@@c]
|
|
stosb
|
|
|
|
@@squeezeBreak:
|
|
cmp di, bx
|
|
jnz short @@doneTextJump
|
|
jmp short @@readDo
|
|
|
|
@@doneTextJump:
|
|
jmp short @@doneText
|
|
|
|
@@endSeen:
|
|
push bx
|
|
mov ax, 1
|
|
push ax
|
|
neg cx
|
|
sbb ax, ax
|
|
push ax
|
|
push cx
|
|
push [bp+@@fd]
|
|
nopcall _lseek
|
|
add sp, 8
|
|
mov bx, [bp+@@fd]
|
|
add bx, bx
|
|
or _openfd[bx], 200h
|
|
pop bx
|
|
|
|
@@doneText:
|
|
sub di, bx
|
|
xchg ax, di
|
|
|
|
@@readRet:
|
|
pop di
|
|
pop si
|
|
mov sp, bp
|
|
pop bp
|
|
ret
|
|
___read endp
|