dos_compilers/Borland Turbo Pascal v55/STREAM.ASM
2024-07-02 06:49:04 -07:00

144 lines
3.1 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; Turbo Pascal 5.5 object-oriented example
; Assembler code for OBJECTS.PAS unit
; Copyright (c) 1989 by Borland International, Inc.
TITLE Stream
INCLUDE OBJECTS.INC
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE
PUBLIC Stream@Get
Stream@Get PROC FAR
@Self EQU (DWORD PTR [BP+6])
PUSH BP
MOV BP,SP
PUSH AX
MOV AX,SP
PUSH SS
PUSH AX
MOV AX,2
PUSH AX
LES DI,@Self
PUSH ES
PUSH DI
MOV DI,ES:[DI]
CALL [DI].Stream$Read
POP BX
OR BX,BX
JE @@2
LES DI,@Self
DEC BX
CMP BX,ES:[DI].Stream@TypeCount
JAE @@1
PUSH ES
PUSH DI
LES DI,ES:[DI].Stream@TypeList
SHL BX,1
PUSH WORD PTR ES:[DI+BX]
XOR AX,AX
PUSH AX
PUSH AX
LES DI,@Self
LES DI,ES:[DI].Stream@ProcList
SHL BX,1
SHL BX,1
CALL ES:[DI+BX].SProc@LoadProc
JMP SHORT @@3
@@1: MOV AX,-2
CALL StreamError
@@2: XOR AX,AX
MOV DX,AX
@@3: POP BP
RET 4
Stream@Get ENDP
PUBLIC Stream@Put
Stream@Put PROC FAR
@B EQU (DWORD PTR [BP+10])
@Self EQU (DWORD PTR [BP+6])
PUSH BP
MOV BP,SP
LES DI,@B
MOV CX,ES
OR CX,DI
JE @@1
MOV AX,ES:[DI]
LES DI,@Self
MOV CX,ES:[DI].Stream@TypeCount
JCXZ @@2
MOV BX,CX
LES DI,ES:[DI].Stream@TypeList
CLD
REPNE SCASW
JNE @@2
NEG CX
ADD CX,BX
@@1: PUSH CX
MOV AX,SP
PUSH SS
PUSH AX
MOV AX,2
PUSH AX
LES DI,@Self
PUSH ES
PUSH DI
MOV DI,ES:[DI]
CALL [DI].Stream$Write
POP BX
DEC BX
JS @@3
LES DI,@Self
PUSH ES
PUSH DI
PUSH @B.w2
PUSH @B.w0
LES DI,ES:[DI].Stream@ProcList
SHL BX,1
SHL BX,1
SHL BX,1
CALL ES:[DI+BX].SProc@StoreProc
JMP SHORT @@3
@@2: LES DI,@Self
MOV AX,-1
CALL StreamError
@@3: POP BP
RET 8
Stream@Put ENDP
; Stream error handler
; In AX = Error code
; ES:DI = Stream object pointer
; Uses AX,BX,CX,DX,SI
PUBLIC StreamError
StreamError PROC NEAR
PUSH ES
PUSH DI
PUSH AX
PUSH ES
PUSH DI
MOV DI,ES:[DI]
CALL [DI].Stream$Error
POP DI
POP ES
RET
StreamError ENDP
CODE ENDS
END