144 lines
3.1 KiB
NASM
144 lines
3.1 KiB
NASM
|
; 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
|
|||
|
|