home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1997 April
/
Chip_1997-04_cd.bin
/
prezent
/
cb
/
data.z
/
ASSIGN.ASM
< prev
next >
Wrap
Assembly Source File
|
1997-01-16
|
7KB
|
446 lines
; *******************************************************
; * *
; * Delphi Runtime Library *
; * *
; * Copyright (c) 1996 Borland International *
; * *
; *******************************************************
INCLUDE SE.ASM
INCLUDE FILEIO.ASM
.386
.MODEL FLAT
EXTRN CreateFileA:NEAR, ReadFile:NEAR, WriteFile:NEAR
EXTRN CloseHandle:NEAR, GetStdHandle:NEAR, GetLastError:NEAR
EXTRN SetFilePointer:NEAR, GetFileSize:NEAR, SetEndOfFile:NEAR
EXTRN GetFileType:NEAR, SetInOutRes:NEAR
PUBLIC _Assign, __Flush, _Flush
.CODE
; FUNCTION TextIn( VAR t: Text ) : Integer;
TextIn PROC
; -> EAX Pointer to text record
; Make buffer empty
XOR EDX,EDX
MOV [EAX].BufEnd,EDX
MOV [EAX].BufPos,EDX
; ReadFile(t.Handle, t.BufPtr, t.BufSize, @t.BufEnd, Nil);
PUSH EDX ; pass lpOverLapped
LEA EDX,[EAX].BufEnd ; pass lpNumberOfBytesRead
PUSH EDX
PUSH [EAX].BufSize ; pass nNumberOfBytestoRead
PUSH [EAX].BufPtr ; pass lpBuffer
PUSH [EAX].Handle ; pass hFile
CALL ReadFile
TEST EAX,EAX ; result FALSE means error
JZ @@error
XOR EAX,EAX
RET
@@error: ; return extended error code
CALL GetLastError
RET
TextIn ENDP
; PROCEDURE TextNullProc( VAR t: Text );
TextNullProc PROC
; -> EAX Pointer to text record
XOR EAX,EAX ; signal success
RET
TextNullProc ENDP
; PROCEDURE TextOut( VAR t: Text );
TextOut PROC
; -> EAX Pointer to text record
; WriteFile(t.Handle, t.BufPtr, t.BufPos, @dummy, Nil);
PUSH ECX ; VAR dummy: Longint;
MOV EDX,[EAX].BufPos
TEST EDX,EDX
JLE @@skip
XOR ECX,ECX
MOV [EAX].BufPos,ECX
PUSH ECX ; pass lpOverLapped
LEA ECX,[ESP+4] ; pass lpNumberOfBytes written
PUSH ECX
PUSH EDX ; pass nNumberOfBytesToWrite
PUSH [EAX].BufPtr ; pass lpBuffer
PUSH [EAX].Handle ; pass hFile
CALL WriteFile
TEST EAX,EAX
JZ @@error
@@skip:
XOR EAX,EAX
@@exit:
POP ECX ; deallocate dummy
RET
@@error: ; return dos error code or 0
Call GetLastError
JMP @@exit
TextOut ENDP
; PROCEDURE TextClose( VAR t: Text );
TextClose PROC
; -> EAX Pointer to text record
; CloseHandle( t.Handle );
PUSH [EAX].Handle
MOV [EAX].Mode,fmClosed
CALL CloseHandle
DEC EAX
JNZ @@error
RET
@@error:
CALL GetLastError
RET
TextClose ENDP
; PROCEDURE TextOpen( VAR t: Text );
TextOpen PROC
; -> EAX Pointer to text record
;
PUSH ESI
MOV ESI,EAX
XOR EAX,EAX
MOV [ESI].BufPos,EAX
MOV [ESI].BufEnd,EAX
MOV EAX,[ESI].Mode
SUB EAX,fmInput
JE @@calledByReset
DEC EAX
JE @@calledByRewrite
DEC EAX
JE @@calledByAppend
JMP @@exit
@@calledByReset:
MOV EAX,GENERIC_READ ; open for read
MOV EDX,FILE_SHARE_WRITE
MOV ECX,OPEN_EXISTING
MOV [ESI].InOutFunc,offset TextIn
JMP @@common
@@calledByRewrite:
MOV EAX,GENERIC_WRITE ; open for write
MOV EDX,FILE_SHARE_READ
MOV ECX,CREATE_ALWAYS
JMP @@commonOut
@@calledByAppend:
MOV EAX,GENERIC_READ OR GENERIC_WRITE ; open for read/write
MOV EDX,FILE_SHARE_READ
MOV ECX,OPEN_EXISTING
@@commonOut:
MOV [ESI].InOutFunc,offset TextOut
@@common:
MOV [ESI].CloseFunc,offset TextClose
MOV [ESI].FlushFunc,offset TextNullProc
CMP byte ptr [ESI].FileName,0
JE @@isCon
; CreateFile(t.FileName, EAX, EDX, Nil, ECX, FILE_ATTRIBUTE_NORMAL, 0);
PUSH 0
PUSH FILE_ATTRIBUTE_NORMAL
PUSH ECX
PUSH 0
PUSH EDX
PUSH EAX
LEA EAX,[ESI].FileName
PUSH EAX
CALL CreateFileA
CMP EAX,-1
JZ @@error
MOV [ESI].Handle,EAX
CMP [ESI].Mode,fmInOut
JNE @@success
DEC [ESI].Mode ; fmInOut -> fmOutput
; ??? we really have to look for the first eof byte in the
; ??? last record and truncate the file there.
; Not very nice and clean...
;
; lastRecPos = Max( GetFileSize(...) - 128, 0);
PUSH 0
PUSH [ESI].Handle
CALL GetFileSize
INC EAX
JZ @@error
SUB EAX,129
JNC @@3
XOR EAX,EAX
@@3:
; lseek(f.Handle, SEEK_SET, lastRecPos);
PUSH FILE_BEGIN
PUSH 0
PUSH EAX
PUSH [ESI].Handle
CALL SetFilePointer
INC EAX
JE @@error
; bytesRead = read(f.Handle, f.Buffer, 128);
PUSH 0
MOV EDX,ESP
PUSH 0
PUSH EDX
PUSH 128
LEA EDX,[ESI].Buffer
PUSH EDX
PUSH [ESI].Handle
CALL ReadFile
POP EDX
DEC EAX
JNZ @@error
; for (i = 0; i < bytesRead; i++)
XOR EAX,EAX
@@loop:
CMP EAX,EDX
JAE @@success
; if (f.Buffer[i] == eof)
CMP byte ptr [ESI].Buffer[EAX],eof
JE @@truncate
INC EAX
JMP @@loop
@@truncate:
; lseek( f.Handle, SEEK_END, i - bytesRead );
PUSH FILE_END
PUSH 0
SUB EAX,EDX
PUSH EAX
PUSH [ESI].Handle
CALL SetFilePointer
INC EAX
JE @@error
; SetEndOfFile( f.Handle );
PUSH [ESI].Handle
CALL SetEndOfFile
DEC EAX
JNE @@error
JMP @@success
@@isCon:
MOV [ESI].CloseFunc,offset TextNullProc
CMP [ESI].Mode,fmOutput
JE @@output
PUSH STD_INPUT_HANDLE
JMP @@1
@@output:
PUSH STD_OUTPUT_HANDLE
@@1:
CALL GetStdHandle
CMP EAX,-1
JE @@error
MOV [ESI].Handle,EAX
@@success:
CMP [ESI].Mode,fmInput
JE @@2
PUSH [ESI].Handle
CALL GetFileType
TEST EAX,EAX
JE @@badFileType
CMP EAX,2
JNE @@2
MOV [ESI].FlushFunc,offset TextOut
@@2:
XOR EAX,EAX
@@exit:
POP ESI
RET
@@badFileType:
PUSH [ESI].Handle
CALL CloseHandle
MOV [ESI].Mode,fmClosed
MOV EAX,105
JMP @@exit
@@error:
MOV [ESI].Mode,fmClosed
CALL GetLastError
JMP @@exit
TextOpen ENDP
; PROCEDURE _Assign( VAR t: Text; s: PChar );
_Assign PROC
; -> EAX Pointer to text record
; EDX Pointer to file name
; we just initialize the various fields
LEA ECX,[EAX].Buffer
MOV [EAX].BufPtr,ECX
XOR ECX,ECX
MOV [EAX].Handle,ECX
MOV [EAX].Mode,fmClosed
MOV [EAX].BufSize,128
MOV [EAX].BufPos,ECX
MOV [EAX].BufEnd,ECX
MOV [EAX].OpenFunc,offset TextOpen
MOV [EAX].InOutFunc,ECX
MOV [EAX].FlushFunc,ECX
MOV [EAX].CloseFunc,ECX
; and copy the file name, truncating it to fNameLen-1 chars
LEA EAX,[EAX].FileName
TEST EDX,EDX
JE @@term
MOV CH,fNameLen / 2
@@loop:
MOV CL,[EDX]
INC EDX
MOV [EAX],CL
INC EAX
TEST CL,CL
JE @@exit
MOV CL,[EDX]
INC EDX
MOV [EAX],CL
INC EAX
TEST CL,CL
JE @@exit
DEC CH
JNE @@loop
DEC EAX
@@term:
MOV [EAX],CH
@@exit:
RET
_Assign ENDP
; PROCEDURE Flush( VAR f: Text );
__Flush PROC
; -> EAX Pointer to text record
MOV EDX,[EAX].Mode
CMP EDX,fmOutput
JNE @@fileNotOutput
CALL [EAX].InOutFunc
TEST EAX,EAX
JNE @@error
@@exit:
RET
@@fileNotOutput:
CMP EDX,fmInput
JE @@exit
MOV EAX,103
@@error:
JMP SetInOutRes
__Flush ENDP
; PROCEDURE _Flush( VAR f: Text );
_Flush PROC
; -> EAX Pointer to text record
MOV EDX,[EAX].Mode
CMP EDX,fmOutput
JNE @@fileNotOutput
CALL [EAX].FlushFunc
TEST EAX,EAX
JNE @@error
@@exit:
RET
@@fileNotOutput:
CMP EDX,fmInput
JE @@exit
MOV EAX,103
@@error:
JMP SetInOutRes
_Flush ENDP
END