; ******************************************************* ; * * ; * Turbo Pascal Run-time Library * ; * File Control Routines * ; * * ; * Copyright (c) 1988,92 Borland International * ; * * ; ******************************************************* TITLE FCTL INCLUDE SE.ASM DATA SEGMENT WORD PUBLIC ; Externals EXTRN FileMode:BYTE,InOutRes:WORD DATA ENDS IF WindowsVersion ; Windows entry points EXTRN AnsiToOem:FAR ENDIF CODE SEGMENT BYTE PUBLIC ASSUME CS:CODE,DS:DATA ; Publics PUBLIC AssignFile,ResetFile,RewriteFile,TruncFile,CloseFile PUBLIC ReadFile,WriteFile,ReadBlock,WriteBlock,SeekFile PUBLIC AssignFileC ; Assign standard procedure (PChar) AssignFileC: DB 0BAH ;MOV DX,immed ; Assign standard procedure (String) AssignFile: XOR DX,DX MOV BX,SP PUSH DS LES DI,SS:[BX+8] LDS SI,SS:[BX+4] CLD XOR AX,AX STOSW MOV AX,fmClosed STOSW XOR AX,AX MOV CX,(fName-fBufSize)/2 REP STOSW IF WindowsVersion PUSH ES PUSH DI PUSH ES PUSH DI ENDIF MOV CX,79 OR DX,DX JNE @@1 LODSB CMP CL,AL JBE @@1 MOV CL,AL JCXZ @@2 @@1: LODSB OR AL,AL JE @@2 STOSB LOOP @@1 @@2: XOR AL,AL STOSB IF WindowsVersion CALL AnsiToOem ENDIF POP DS RETF 8 ; Reset standard procedure ResetFile: MOV AL,FileMode MOV AH,dosOpen XOR DX,DX JMP SHORT OpenFile ; Rewrite standard procedure RewriteFile: MOV AX,dosCreate*256 MOV DX,1 ; Open file OpenFile: ARG FileP,DWORD,1 ARG RecSize,WORD,1 ENTRY FAR LES DI,FileP CMP ES:[DI].fMode,fmClosed JE @@2 CMP ES:[DI].fMode,fmInOut JE @@1 MOV InOutRes,102 JMP SHORT @@5 @@1: PUSH AX PUSH DX PUSH ES PUSH DI PUSH CS CALL CloseFile POP DX POP AX @@2: CMP ES:[DI].fName,0 JE @@3 PUSH DS LEA DX,[DI].fName PUSH ES POP DS XOR CX,CX INT DOS POP DS JNC @@4 MOV InOutRes,AX JMP SHORT @@5 @@3: XCHG AX,DX @@4: MOV ES:[DI].fMode,fmInOut MOV ES:[DI].fHandle,AX MOV AX,RecSize MOV ES:[DI].fBufSize,AX @@5: EXIT ; Truncate standard procedure TruncFile: MOV BX,SP LES DI,SS:[BX+4] CALL OpenCheck JNE @@1 XOR CX,CX MOV BX,ES:[DI].fHandle MOV AH,dosWrite INT DOS JNC @@1 MOV InOutRes,AX @@1: RETF 4 ; Close standard procedure CloseFile: MOV BX,SP LES DI,SS:[BX+4] CALL OpenCheck JNE @@2 MOV BX,ES:[DI].fHandle CMP BX,4 JBE @@1 MOV AH,dosClose INT DOS JNC @@1 MOV InOutRes,AX @@1: MOV ES:[DI].fMode,fmClosed @@2: RETF 4 ; Check that file is open OpenCheck: CMP ES:[DI].fMode,fmInOut JE @@1 MOV InOutRes,103 @@1: RET ; Read standard procedure ReadFile: MOV AH,dosRead MOV DX,100 JMP SHORT InOutFile ; Write standard procedure WriteFile: MOV AH,dosWrite MOV DX,101 ; Typed file I/O InOutFile: ARG FileP,DWORD,1 ARG BufferP,DWORD,1 ENTRY FAR LES DI,FileP CALL OpenCheck JNE @@2 PUSH DS PUSH DX LDS DX,BufferP MOV CX,ES:[DI].fBufSize MOV BX,ES:[DI].fHandle INT DOS POP DX POP DS JC @@1 CMP AX,CX JE @@2 MOV AX,DX @@1: MOV InOutRes,AX @@2: EXIT 4 ; BlockRead standard procedure ReadBlock: MOV BL,dosRead MOV CX,100 JMP SHORT InOutBlock ; BlockWrite standard procedure WriteBlock: MOV BL,dosWrite MOV CX,101 ; Untyped file I/O InOutBlock: ARG FileP,DWORD,1 ARG BufferP,DWORD,1 ARG Count,WORD,1 ARG ResultP,DWORD,1 ENTRY FAR LES DI,FileP CALL OpenCheck JNE @@4 MOV AX,Count OR AX,AX JE @@1 PUSH DS PUSH CX MUL ES:[DI].fBufSize MOV CX,AX LDS DX,BufferP MOV AH,BL MOV BX,ES:[DI].fHandle INT DOS POP CX POP DS JC @@3 XOR DX,DX DIV ES:[DI].fBufSize @@1: LES DI,ResultP MOV DX,ES OR DX,DI JE @@2 MOV ES:[DI],AX JMP SHORT @@5 @@2: CMP AX,Count JE @@5 MOV InOutRes,CX JMP SHORT @@5 @@3: MOV InOutRes,AX @@4: LES DI,ResultP MOV DX,ES OR DX,DI JE @@5 XOR AX,AX MOV ES:[DI],AX @@5: EXIT ; Seek standard procedure SeekFile: ARG FileP,DWORD,1 ARG FilePos,DWORD,1 ENTRY FAR LES DI,FileP CALL OpenCheck JNE @@1 MOV AX,FilePos.w2 MUL ES:[DI].fBufSize MOV CX,AX MOV AX,FilePos.w0 MUL ES:[DI].fBufSize ADD CX,DX MOV DX,AX MOV BX,ES:[DI].fHandle MOV AX,dosSeek*256 INT DOS JNC @@1 MOV InOutRes,AX @@1: EXIT CODE ENDS END