ReC98/libs/master.lib/file_close.asm

101 lines
1.9 KiB
NASM

; master library - MS-DOS
;
; Description:
; 作業バッファのフラッシュ
; ファイルのクローズ
;
; Function/Procedures:
; void file_flush( void ) ;
; void file_close( void ) ;
;
; Parameters:
; none
;
; Returns:
; none
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; MS-DOS
;
; Requiring Resources:
; CPU: 8086
;
; Notes:
;
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 92/11/17 Initial
; 92/11/29 file_flush追加
; 94/ 2/10 [M0.22a] 書き込みオープン時, file_BufferPosを更新してなかった
; 95/ 4/14 [M0.22k] BUGFIX read後のfile_flush()後、まれに現在位置がずれた
; out: BX = file handle
func FILE_FLUSH ; file_flush() {
mov BX,file_Handle
cmp BX,-1
je short @@F_IGNORE ; house keeping
mov AX,file_BufPtr ; opened for read? write?
cmp file_InReadBuf,AX ; InReadBuf < BufPtr then write
jae short @@F_READ
; 書き込みオープンされている
push DS
mov CX,file_BufPtr
lds DX,file_Buffer
mov AH,40h ; ファイルの書き込み
int 21h
pop DS
jc short @@ERROR
add WORD PTR file_BufferPos,AX
adc WORD PTR file_BufferPos+2,0
cmp file_BufPtr,AX
je short @@WDONE
@@ERROR:
mov file_ErrorStat,1
@@WDONE:
mov file_BufPtr,0
ret
@@F_READ:
cmp file_InReadBuf,0
je short @@F_IGNORE
mov DX,AX ; AX: file_BufPtr
mov CX,0
add DX,WORD PTR file_BufferPos
mov file_InReadBuf,CX
mov file_BufPtr,CX
adc CX,WORD PTR file_BufferPos+2
mov AX,4200h
mov BX,file_Handle ; 論理位置に物理位置を合わせる
int 21h ; seek
; 論理位置の先頭を更新
mov WORD PTR file_BufferPos,AX
mov WORD PTR file_BufferPos+2,DX
@@F_IGNORE:
ret
endfunc ; }
func FILE_CLOSE ; file_close() {
call FILE_FLUSH ; フラッシュ BXにfile handleが…
mov AH,3Eh ; ファイルのクローズ
int 21h
mov file_Handle,-1 ; ファイルハンドルの無効化
@@IGNORE:
ret
endfunc ; }