home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
pascal
/
bp7os2
/
os2rtl
/
sys
/
objh.asm
< prev
next >
Wrap
Assembly Source File
|
1993-08-16
|
3KB
|
162 lines
; *******************************************************
; * *
; * Turbo Pascal Run-time Library *
; * Object Handling Routines *
; * *
; * Copyright (c) 1989,92 Borland International *
; * *
; *******************************************************
TITLE OBJH
INCLUDE SE.ASM
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE
; Externals
EXTRN NewMemory:NEAR,DisMemory:NEAR,HaltError:NEAR
; Publics
PUBLIC Construct,Destruct,CopyObject,MethodCheck
; Constructor support routine
; In DI = Method field offset
; BP = Constructor stack frame
; Out ZF = 1 if failed
Construct:
MOV SI,[BP+10] ;SI = VMT offset
CMP SI,1 ;Inherited constructor call?
JB @@2 ;Yes, exit with ZF = 0
LES BX,[BP+6] ;ES:BX = Self
MOV AX,ES ;Self = nil?
OR AX,BX
JE @@3 ;Yes, allocate
MOV WORD PTR [BP+10],0 ;No deallocation on Fail
@@1: MOV ES:[BX+DI],SI ;Store VMT link in object
@@2: RETF ;Exit
@@3: MOV AX,[SI] ;AX = Object size
IF WindowsVersion
INC BP ;Setup stack frame
PUSH BP
MOV BP,SP
PUSH DS
ELSE
PUSH BP ;Setup stack frame
MOV BP,SP
ENDIF
PUSH SI
PUSH DI
CALL NewMemory ;Allocate dynamic object
POP DI
POP SI
IF WindowsVersion
MOV SP,BP ;Remove stack frame
POP BP
DEC BP
ELSE
POP BP
ENDIF
JC @@4 ;Error if allocation failed
MOV CX,AX ;Out of memory?
OR CX,DX
JE @@2 ;Yes, exit with ZF = 1
MOV [BP+6],AX ;Store in Self pointer
MOV [BP+8],DX
MOV ES,DX ;ES:BX = Self
MOV BX,AX
JMP @@1 ;Init and exit with ZF = 0
@@4: MOV SP,BP ;Remove callers stack frame
POP BP
IF WindowsVersion
DEC BP
ENDIF
MOV AX,203
JMP HaltError
; Destructor support routine
; In DI = Method field offset
; BP = Destructor stack frame
Destruct:
CMP WORD PTR [BP+10],0 ;Inherited destructor call?
JE @@1 ;Yes, exit
LES BX,[BP+6] ;ES:BX = Self
MOV SI,ES:[BX+DI] ;SI = VMT offset
MOV AX,[SI] ;AX = Object size
MOV CX,BX ;BX:CX = Self
MOV BX,ES
IF WindowsVersion
INC BP ;Setup stack frame
PUSH BP
MOV BP,SP
PUSH DS
ELSE
PUSH BP ;Setup stack frame
MOV BP,SP
ENDIF
CALL DisMemory ;Dispose dynamic object
IF WindowsVersion
MOV SP,BP ;Remove Windows stack frame
POP BP
DEC BP
ELSE
POP BP ;Remove Windows stack frame
ENDIF
JC @@2 ;Error if deallocation failed
@@1: XOR AX,AX ;Self = nil
MOV [BP+6],AX
MOV [BP+8],AX
RETF
@@2: MOV SP,BP ;Remove callers stack frame
POP BP
IF WindowsVersion
DEC BP
ENDIF
MOV AX,204
JMP HaltError
; Object assignment support routine
CopyObject:
PUSH BP
MOV BP,SP
LES DI,[BP+8]
MOV BX,[BP+6]
ADD BX,DI
MOV AX,ES:[BX]
MOV SI,AX
MOV CX,DS:[SI]
MOV DX,DS
LDS SI,[BP+12]
CLD
REP MOVSB
MOV DS,DX
MOV ES:[BX],AX
POP BP
RETF 10
; Check method table
MethodCheck:
MOV CX,[DI]
JCXZ @@1
ADD CX,[DI+2]
JNE @@1
RETF
@@1: MOV AX,210
JMP HaltError
CODE ENDS
END