home *** CD-ROM | disk | FTP | other *** search
-
- ; *******************************************************
- ; * *
- ; * 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
-