home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
pascal
/
bp7os2
/
os2rtl
/
sys
/
seth.asm
< prev
next >
Wrap
Assembly Source File
|
1993-08-16
|
4KB
|
274 lines
; *******************************************************
; * *
; * Turbo Pascal Run-time Library *
; * Set Support Routines *
; * *
; * Copyright (c) 1988,92 Borland International *
; * *
; *******************************************************
TITLE SETH
INCLUDE SE.ASM
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE
; Publics
PUBLIC ZLoad,ZStore,ZBitMask,ZWordLoad,ZAddComp,ZAddRange
PUBLIC ZUnion,ZDifference,ZIntersect,ZEqual,ZRelation
; Load set
; In [SP+6] = Destination pointer
; [SP+2] = Source pointer
; [SP] = Set data
; Out SP = SP+6
ZLoad:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+10]
LDS SI,SS:[BX+6]
MOV BX,SS:[BX+4]
MOV CL,BH
XOR CH,CH
XOR AL,AL
REP STOSB
MOV CL,BL
REP MOVSB
MOV CL,32
SUB CL,BL
SUB CL,BH
REP STOSB
MOV DS,DX
RETF 6
; Load word sized set
; In [SP+2] = Destination pointer
; [SP] = Word set
; Out SP = SP+2
ZWordLoad:
CLD
MOV BX,SP
LES DI,SS:[BX+6]
MOV AX,SS:[BX+4]
STOSW
MOV CX,15
XOR AX,AX
REP STOSW
RETF 2
; Add set component
; In [SP+2] = Destination pointer
; [SP] = Component number
; Out SP = SP+2
ZAddComp:
MOV BX,SP
LES DI,SS:[BX+6]
MOV AL,SS:[BX+4]
MOV BL,AL
XOR BH,BH
MOV CL,3
SHR BX,CL
MOV CL,AL
AND CL,7
MOV AL,1
SHL AL,CL
OR ES:[DI+BX],AL
RETF 2
; Add set range
; In [SP+4] = Destination pointer
; [SP+2] = First component number
; [SP] = Last component number
; Out SP = SP+4
ZAddRange:
MOV BX,SP
LES DI,SS:[BX+8]
MOV AL,SS:[BX+6]
MOV DL,SS:[BX+4]
SUB DL,AL
JC @@2
INC DL
MOV BL,AL
XOR BH,BH
MOV CL,3
SHR BX,CL
MOV CL,AL
AND CL,7
MOV AL,1
SHL AL,CL
@@1: OR ES:[DI+BX],AL
ROL AL,1
ADC BX,0
DEC DL
JNE @@1
@@2: RETF 4
; Store set
; In [SP+6] = Source pointer
; [SP+2] = Destination pointer
; [SP] = Set data
; Out SP = SP+10
ZStore:
CLD
MOV BX,SP
MOV DX,DS
LDS SI,SS:[BX+10]
LES DI,SS:[BX+6]
MOV BX,SS:[BX+4]
MOV CL,BH
XOR CH,CH
ADD SI,CX
MOV CL,BL
REP MOVSB
MOV DS,DX
RETF 10
; Compute set offset and bit mask
; In AL = Element number
; AH = 01H or 0FEH
; DL = Number of bytes in set
; DH = Offset of first byte in set
; Out AL = Bit mask
; DX = Byte offset
ZBitMask:
MOV CH,AL
MOV CL,3
SHR CH,CL
SUB CH,DH
JB @@1
CMP CH,DL
JAE @@1
MOV DL,CH
XOR DH,DH
AND AL,7
MOV CL,AL
MOV AL,AH
ROL AL,CL
RETF
@@1: CWD
XCHG AX,DX
XOR DX,DX
RETF
; Set union
; In [SP+4] = Destination pointer
; [SP] = Source pointer
; Out SP = SP+4
ZUnion:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+8]
LDS SI,SS:[BX+4]
MOV CX,16
@@1: LODSW
OR AX,ES:[DI]
STOSW
LOOP @@1
MOV DS,DX
RETF 4
; Set difference
; In [SP+4] = Destination pointer
; [SP] = Source pointer
; Out SP = SP+4
ZDifference:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+8]
LDS SI,SS:[BX+4]
MOV CX,16
@@1: LODSW
NOT AX
AND AX,ES:[DI]
STOSW
LOOP @@1
MOV DS,DX
RETF 4
; Set intersection
; In [SP+4] = Destination pointer
; [SP] = Source pointer
; Out SP = SP+4
ZIntersect:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+8]
LDS SI,SS:[BX+4]
MOV CX,16
@@1: LODSW
AND AX,ES:[DI]
STOSW
LOOP @@1
MOV DS,DX
RETF 4
; Set equality test
; In [SP+4] = Destination pointer
; [SP] = Source pointer
; Out SP = SP+8
; ZF = 1 if Dest=Source
ZEqual:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+8]
LDS SI,SS:[BX+4]
MOV CX,16
REP CMPSW
MOV DS,DX
RETF 8
; Set relation test
; In [SP+4] = Destination pointer
; [SP] = Source pointer
; Out SP = SP+8
; ZF = 1 if Dest>=Source
ZRelation:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+8]
LDS SI,SS:[BX+4]
MOV CX,16
@@1: LODSW
OR AX,ES:[DI]
SCASW
JNE @@2
LOOP @@1
@@2: MOV DS,DX
RETF 8
CODE ENDS
END