mirror of https://github.com/nmlgc/ReC98.git
139 lines
2.3 KiB
NASM
139 lines
2.3 KiB
NASM
; master library - MS-DOS
|
|
;
|
|
; Description:
|
|
; ファイルからの読み込み
|
|
;
|
|
; Function/Procedures:
|
|
; unsigned file_read( char far * buf, unsigned bsize ) ;
|
|
;
|
|
; Parameters:
|
|
; char far * buf 読み込み先( NULLならば、bsize分読み捨てる )
|
|
; unsigned bsize 最大読み取り長(バイト数,
|
|
; 0 ならば file_Bufferを必要ならば更新するだけ )
|
|
;
|
|
; Returns:
|
|
; 読み込んだバイト数
|
|
;
|
|
; Binding Target:
|
|
; Microsoft-C / Turbo-C / Turbo Pascal
|
|
;
|
|
; Running Target:
|
|
; MS-DOS
|
|
;
|
|
; Requiring Resources:
|
|
; CPU: 8086
|
|
;
|
|
; Notes:
|
|
; file_EOFは、1バイトも読めなかった時だけ設定される。
|
|
;
|
|
; Compiler/Assembler:
|
|
; TASM 3.0
|
|
; OPTASM 1.6
|
|
;
|
|
; Author:
|
|
; 恋塚昭彦
|
|
;
|
|
; Revision History:
|
|
; 92/11/17 Initial
|
|
; 92/11/30 BufferSize = 0なら DOS直接に
|
|
; 92/12/06 ↑で発生した、[indirect:ぜんぜん動かん][direct:retcode異常]
|
|
; を修正。
|
|
|
|
func FILE_READ
|
|
push BP
|
|
mov BP,SP
|
|
push SI
|
|
push DI
|
|
|
|
; 引数
|
|
@@buf = (RETSIZE+2)*2
|
|
@@bsize = (RETSIZE+1)*2
|
|
|
|
cmp file_BufferSize,0
|
|
je short @@DIRECT
|
|
|
|
mov BX,[BP+@@bsize] ; BX = rest
|
|
les DI,[BP+@@buf]
|
|
@@RLOOP:
|
|
mov AX,file_InReadBuf
|
|
cmp file_BufPtr,AX
|
|
jb short @@MADA_ARU
|
|
|
|
add WORD PTR file_BufferPos,AX
|
|
adc WORD PTR file_BufferPos+2,0
|
|
|
|
push BX
|
|
push DS
|
|
mov CX,file_BufferSize
|
|
mov BX,file_Handle
|
|
lds DX,file_Buffer
|
|
mov AH,3Fh ; ファイルの読み込み
|
|
int 21h
|
|
pop DS
|
|
pop BX
|
|
cmc ; エラーなら AX = 0 -> EOF
|
|
sbb DX,DX
|
|
and AX,DX
|
|
mov file_InReadBuf,AX
|
|
jz short @@EOF
|
|
|
|
mov file_BufPtr,0 ; 読めた
|
|
@@MADA_ARU:
|
|
mov SI,file_InReadBuf ; SI = len
|
|
sub SI,file_BufPtr
|
|
sub SI,BX
|
|
sbb AX,AX
|
|
and SI,AX
|
|
add SI,BX
|
|
mov AX,ES
|
|
or AX,DI
|
|
je short @@LOOPEND
|
|
or SI,SI
|
|
je short @@LOOPEND
|
|
|
|
push SI ; 転送
|
|
push DS
|
|
mov CX,SI
|
|
mov AX,file_BufPtr
|
|
lds SI,file_Buffer
|
|
add SI,AX
|
|
shr CX,1
|
|
rep movsw
|
|
adc CX,CX
|
|
rep movsb
|
|
pop DS
|
|
pop SI
|
|
@@LOOPEND:
|
|
add file_BufPtr,SI
|
|
sub BX,SI
|
|
jne short @@RLOOP
|
|
jmp short @@EXITLOOP
|
|
EVEN
|
|
; バッファサイズが0ならDOS直接アクセス
|
|
@@DIRECT:
|
|
push DS
|
|
mov CX,[BP+@@bsize] ; BX = rest
|
|
|
|
mov BX,file_Handle
|
|
lds DX,[BP+@@buf]
|
|
mov AH,3Fh ; ファイルの読み込み
|
|
int 21h
|
|
pop DS
|
|
add WORD PTR file_BufferPos,AX
|
|
adc WORD PTR file_BufferPos+2,0
|
|
mov BX,CX
|
|
sub BX,AX
|
|
je short @@EXITLOOP
|
|
@@EOF:
|
|
mov file_Eof,1
|
|
@@EXITLOOP:
|
|
mov AX,[BP+@@bsize]
|
|
sub AX,BX
|
|
|
|
pop DI
|
|
pop SI
|
|
pop BP
|
|
ret 6
|
|
EVEN
|
|
endfunc
|