dos_compilers/Borland Turbo Pascal v55/STREAM.ASM

144 lines
3.1 KiB
NASM
Raw Normal View History

2024-07-02 15:49:04 +02:00
; 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