219 lines
5.1 KiB
NASM
219 lines
5.1 KiB
NASM
; Turbo Pascal 5.5 object-oriented example
|
||
; Assembler code for OBJECTS.PAS unit
|
||
; Copyright (c) 1989 by Borland International, Inc.
|
||
|
||
TITLE BUFSTM
|
||
|
||
INCLUDE OBJECTS.INC
|
||
|
||
CODE SEGMENT BYTE PUBLIC
|
||
|
||
EXTRN StreamError:NEAR
|
||
EXTRN DosStream@GetPos:NEAR
|
||
|
||
ASSUME CS:CODE
|
||
|
||
PUBLIC BufStream@Flush
|
||
|
||
BufStream@Flush PROC FAR
|
||
|
||
@Self EQU (DWORD PTR [BP+6])
|
||
|
||
PUSH BP
|
||
MOV BP,SP
|
||
LES DI,@Self
|
||
CMP ES:[DI].Stream@Status,0
|
||
JNE @@1
|
||
MOV AL,2
|
||
CALL FlushBuffer
|
||
@@1: POP BP
|
||
RET 4
|
||
|
||
BufStream@Flush ENDP
|
||
|
||
PUBLIC BufStream@GetPos
|
||
|
||
BufStream@GetPos PROC FAR
|
||
|
||
@Self EQU (DWORD PTR [BP+6])
|
||
|
||
PUSH BP
|
||
MOV BP,SP
|
||
LES DI,@Self
|
||
PUSH ES
|
||
PUSH DI
|
||
PUSH CS
|
||
CALL DosStream@GetPos
|
||
OR DX,DX
|
||
JS @@1
|
||
LES DI,@Self
|
||
SUB AX,ES:[DI].BufStream@BufEnd
|
||
SBB DX,0
|
||
ADD AX,ES:[DI].BufStream@BufPtr
|
||
ADC DX,0
|
||
@@1: POP BP
|
||
RET 4
|
||
|
||
BufStream@GetPos ENDP
|
||
|
||
PUBLIC BufStream@Read
|
||
|
||
BufStream@Read PROC FAR
|
||
|
||
@Buf EQU (DWORD PTR [BP+12])
|
||
@Count EQU (WORD PTR [BP+10])
|
||
@Self EQU (DWORD PTR [BP+6])
|
||
|
||
PUSH BP
|
||
MOV BP,SP
|
||
LES DI,@Self
|
||
CMP ES:[DI].Stream@Status,0
|
||
JNE @@6
|
||
MOV AL,1
|
||
CALL FlushBuffer
|
||
JNE @@6
|
||
XOR DX,DX
|
||
@@1: MOV CX,@Count
|
||
SUB CX,DX
|
||
JE @@7
|
||
LES DI,@Self
|
||
MOV AX,ES:[DI].BufStream@BufEnd
|
||
SUB AX,ES:[DI].BufStream@BufPtr
|
||
JA @@2
|
||
PUSH CX
|
||
PUSH DX
|
||
PUSH DS
|
||
LDS DX,ES:[DI].BufStream@Buffer
|
||
MOV CX,ES:[DI].BufStream@BufSize
|
||
MOV BX,ES:[DI].DosStream@Handle
|
||
MOV AH,3FH
|
||
INT 21H
|
||
POP DS
|
||
POP DX
|
||
POP CX
|
||
JC @@5
|
||
MOV ES:[DI].BufStream@BufPtr,0
|
||
MOV ES:[DI].BufStream@BufEnd,AX
|
||
OR AX,AX
|
||
JE @@4
|
||
@@2: CMP CX,AX
|
||
JB @@3
|
||
MOV CX,AX
|
||
@@3: PUSH DS
|
||
LDS SI,ES:[DI].BufStream@Buffer
|
||
ADD SI,ES:[DI].BufStream@BufPtr
|
||
ADD ES:[DI].BufStream@BufPtr,CX
|
||
LES DI,@Buf
|
||
ADD DI,DX
|
||
ADD DX,CX
|
||
CLD
|
||
REP MOVSB
|
||
POP DS
|
||
JMP @@1
|
||
@@4: MOV AX,101
|
||
@@5: CALL StreamError
|
||
@@6: LES DI,@Buf
|
||
MOV CX,@Count
|
||
XOR AL,AL
|
||
CLD
|
||
REP STOSB
|
||
@@7: POP BP
|
||
RET 10
|
||
|
||
BufStream@Read ENDP
|
||
|
||
PUBLIC BufStream@Write
|
||
|
||
BufStream@Write PROC FAR
|
||
|
||
@Buf EQU (DWORD PTR [BP+12])
|
||
@Count EQU (WORD PTR [BP+10])
|
||
@Self EQU (DWORD PTR [BP+6])
|
||
|
||
PUSH BP
|
||
MOV BP,SP
|
||
LES DI,@Self
|
||
CMP ES:[DI].Stream@Status,0
|
||
JNE @@4
|
||
MOV AL,0
|
||
CALL FlushBuffer
|
||
JNE @@4
|
||
XOR DX,DX
|
||
@@1: MOV CX,@Count
|
||
SUB CX,DX
|
||
JE @@4
|
||
LES DI,@Self
|
||
MOV AX,ES:[DI].BufStream@BufSize
|
||
SUB AX,ES:[DI].BufStream@BufPtr
|
||
JA @@2
|
||
PUSH CX
|
||
PUSH DX
|
||
MOV AL,1
|
||
CALL FlushBuffer
|
||
POP DX
|
||
POP CX
|
||
JNE @@4
|
||
MOV AX,ES:[DI].BufStream@BufSize
|
||
@@2: CMP CX,AX
|
||
JB @@3
|
||
MOV CX,AX
|
||
@@3: PUSH DS
|
||
MOV AX,ES:[DI].BufStream@BufPtr
|
||
ADD ES:[DI].BufStream@BufPtr,CX
|
||
LES DI,ES:[DI].BufStream@Buffer
|
||
ADD DI,AX
|
||
LDS SI,@Buf
|
||
ADD SI,DX
|
||
ADD DX,CX
|
||
CLD
|
||
REP MOVSB
|
||
POP DS
|
||
JMP @@1
|
||
@@4: POP BP
|
||
RET 10
|
||
|
||
BufStream@Write ENDP
|
||
|
||
; Flush stream buffer
|
||
; In AL = Flush mode (0=Read,1=Write,2=Both)
|
||
; ES:DI = BufStream pointer
|
||
; Out ZF = Status test
|
||
|
||
FlushBuffer PROC NEAR
|
||
|
||
MOV CX,ES:[DI].BufStream@BufPtr
|
||
SUB CX,ES:[DI].BufStream@BufEnd
|
||
JE @@4
|
||
MOV BX,ES:[DI].DosStream@Handle
|
||
JA @@1
|
||
CMP AL,1
|
||
JE @@4
|
||
MOV DX,CX
|
||
MOV CX,-1
|
||
MOV AX,4201H
|
||
INT 21H
|
||
JMP SHORT @@3
|
||
@@1: CMP AL,0
|
||
JE @@4
|
||
PUSH DS
|
||
LDS DX,ES:[DI].BufStream@Buffer
|
||
MOV AH,40H
|
||
INT 21H
|
||
POP DS
|
||
JC @@2
|
||
CMP AX,CX
|
||
JE @@3
|
||
MOV AX,101
|
||
@@2: CALL StreamError
|
||
@@3: XOR AX,AX
|
||
MOV ES:[DI].BufStream@BufPtr,AX
|
||
MOV ES:[DI].BufStream@BufEnd,AX
|
||
CMP AX,ES:[DI].Stream@Status
|
||
@@4: RET
|
||
|
||
FlushBuffer ENDP
|
||
|
||
CODE ENDS
|
||
|
||
END
|
||
|