home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
wunderki.zip
/
TGPC.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-08-16
|
4KB
|
290 lines
; *******************************************************
; * *
; * Turbo Pascal Runtime Library *
; * Textfile Low-level I/O *
; * *
; * Copyright (C) 1988,92 Borland International *
; * *
; *******************************************************
TITLE TGPC
INCLUDE SE.ASM
CONST SEGMENT WORD PUBLIC
; Newline string
NewLineStr DB cr,lf
CONST ENDS
DATA SEGMENT WORD PUBLIC
; Externals
EXTRN InOutRes:WORD
DATA ENDS
DGROUP GROUP CONST,DATA
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE,DS:DGROUP
; Publics
PUBLIC ReadLine,ReadEnd,WriteLine,WriteEnd
PUBLIC ReadText,WriteBuffer,WriteBlanks,InOutProc
; Read from textfile
; In AX = Callback procedure pointer
; CX = Callback CX
; DX:DI = Callback ES:DI
; ES:BX = File pointer
; Out ZF = 1 if no error
ReadText:
CMP InOutRes,0
JNE @@2
CMP ES:[BX].fMode,fmInput
JNE @@3
MOV SI,ES:[BX].fBufPos
CMP SI,ES:[BX].fBufEnd
JE @@4
@@1: PUSH DS
PUSH ES
PUSH BX
PUSH DX
LDS DX,ES:[BX].fBufPtr
MOV BX,ES:[BX].fBufEnd
POP ES
ADD BX,DX
ADD SI,DX
CLD
CALL AX
SUB SI,DX
MOV DX,ES
POP BX
POP ES
POP DS
MOV ES:[BX].fBufPos,SI
OR AX,AX
JNE @@4
@@2: RET
@@3: MOV InOutRes,104
RET
@@4: PUSH AX
PUSH CX
PUSH DX
PUSH DI
PUSH ES
PUSH BX
CALL InOutProc
POP BX
POP ES
POP DI
POP DX
POP CX
POP AX
MOV SI,ES:[BX].fBufPos
CMP SI,ES:[BX].fBufEnd
JNE @@1
RET
; Write blanks to textfile
; In DX = Count
; ES:BX = File pointer
; Out ZF = 1 if no error
WriteBlanks:
CMP InOutRes,0
JNE @@4
CMP ES:[BX].fMode,fmOutput
JNE @@5
@@1: MOV CX,ES:[BX].fBufSize
MOV DI,ES:[BX].fBufPos
SUB CX,DI
SUB DX,CX
JAE @@2
ADD CX,DX
XOR DX,DX
@@2: PUSH ES
LES SI,ES:[BX].fBufPtr
ADD DI,SI
MOV AL,' '
CLD
REP STOSB
SUB DI,SI
POP ES
MOV ES:[BX].fBufPos,DI
CMP DI,ES:[BX].fBufSize
JNE @@3
PUSH DX
PUSH ES
PUSH BX
CALL InOutProc
POP BX
POP ES
POP DX
@@3: OR DX,DX
JNE @@1
@@4: RET
@@5: MOV InOutRes,105
RET
; Write buffer to textfile
; In AX = Count
; DX:SI = Buffer pointer
; ES:BX = File pointer
; Out ZF = 1 if no error
WriteBuffer:
CMP InOutRes,0
JNE @@4
CMP ES:[BX].fMode,fmOutput
JNE @@5
@@1: MOV CX,ES:[BX].fBufSize
MOV DI,ES:[BX].fBufPos
SUB CX,DI
SUB AX,CX
JAE @@2
ADD CX,AX
XOR AX,AX
@@2: PUSH DS
PUSH ES
PUSH BX
MOV DS,DX
LES BX,ES:[BX].fBufPtr
ADD DI,BX
CLD
REP MOVSB
SUB DI,BX
POP BX
POP ES
POP DS
MOV ES:[BX].fBufPos,DI
CMP DI,ES:[BX].fBufSize
JNE @@3
PUSH AX
PUSH DX
PUSH SI
PUSH ES
PUSH BX
CALL InOutProc
POP BX
POP ES
POP SI
POP DX
POP AX
@@3: OR AX,AX
JNE @@1
@@4: RET
@@5: MOV InOutRes,105
RET
; ReadLn standard procedure
ReadLine:
ARG FileP,DWORD,1
ENTRY WINFAR
LES BX,FileP
MOV AX,OFFSET CS:@@10
XOR DX,DX
CALL ReadText
JNE @@1
CMP ES:[BX].fFlushProc.seg,0
JE @@1
CALL FlushProc
@@1: EXIT
@@10: LODSB
CMP AL,cr
JE @@11
CMP AL,eof
JE @@13
CMP SI,BX
JNE @@10
MOV AX,OFFSET CS:@@10
RET
@@11: CMP SI,BX
JE @@15
@@12: LODSB
CMP AL,lf
JE @@14
@@13: DEC SI
@@14: XOR AX,AX
RET
@@15: MOV AX,OFFSET CS:@@12
RET
; WriteLn standard procedure
WriteLine:
ARG FileP,DWORD,1
ENTRY WINFAR
LES BX,FileP
MOV AX,2
MOV SI,OFFSET DS:NewLineStr
MOV DX,DS
CALL WriteBuffer
JNE @@1
CMP ES:[BX].fFlushProc.seg,0
JE @@1
CALL FlushProc
@@1: EXIT
; End of Read or Write
ReadEnd:
WriteEnd:
ARG FileP,DWORD,1
ENTRY WINFAR
LES BX,FileP
CMP ES:[BX].fFlushProc.seg,0
JE @@1
CMP InOutRes,0
JNE @@1
CALL FlushProc
@@1: EXIT
; Call textfile InOutProc
; In ES:BX = File pointer
InOutProc:
PUSH ES
PUSH BX
CALL ES:[BX].fInOutProc
OR AX,AX
JE @@1
MOV InOutRes,AX
@@1: RET
; Call textfile FlushProc
; In ES:BX = File pointer
FlushProc:
PUSH ES
PUSH BX
CALL ES:[BX].fFlushProc
OR AX,AX
JE @@1
MOV InOutRes,AX
@@1: RET
CODE ENDS
END