; 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