2023-11-16 18:19:54 -05:00

116 lines
2.9 KiB
Plaintext

SUBTTL TABLE OPERATIONS
PAGE +
PUBLIC OPINTBL,OPINT1,OPINT2
;IS THE GIVEN WORD IN THE TABLE?
; AX = WORD TO COMPARE
; BX ^ TO TABLE
; CX = NUMBER OF ELEMENTS IN THE TABLE
;
OPINTBL PROC
MOV DX,AX ;(A12) SAVE WORD
MOV AX,BX ;(A12) GET ^ IN AX
OPINT1: PUSH AX ;(A12) SAVE POINTER
PUSH CX ;(A12) SAVE LOOPCOUNTER
CALL BSPLTB ;(A12) SPLIT THE POINTER
CALL GETWRD ;(A12) GET THE WORD
CMP CX,DX ;(A12) COMPARE THE TWO ITEMS
JE OPINT2 ;(A12) WE FOUND A MATCH
POP CX ;(A12) RESTORE LOOPCOUNTER
POP AX ;(A12) RESTORE ^ TO TABLE
INC AX ;(A12) UPDATE POINTER
INC AX
LOOP OPINT1 ;(A12) NEXT ELEMENT
;{CASE} FAILURE
XOR AX,AX ;(A12) WE DIDN'T FIND ANYTHING
CALL PUTVAL
JMP PFALSE ;(A12)
;{CASE} SUCCESS
OPINT2: POP CX ;(A12)
POP AX ;(A12)
CALL PUTVAL
JMP PTRUE ;(A12)
OPINTBL ENDP
PUBLIC OPGET,OPGETB,OPPUT,OPGTPT
;GET (GET THE ITEM'TH WORD FROM TABLE)
OPGET PROC
SHL BX,1 ;CONVERT ITEM TO BYTE COUNT
ADD AX,BX ;INDEX INTO TABLE
CALL BSPLTB ;SPLIT THE POINTER
CALL GETWRD ;GET THE WORD
MOV AX,CX
JMP PUTVAL ;AND RETURN IT
OPGET ENDP
;GETB (GET THE ITEM'TH BYTE FROM TABLE)
OPGETB PROC
ADD AX,BX ;INDEX INTO TABLE
CALL BSPLTB ;SPLIT THE POINTER
CALL GETBYT ;GET THE BYTE
MOV AX,CX
JMP BYTVAL ;AND RETURN IT
OPGETB ENDP
;PUT (REPLACE THE ITEM'TH WORD IN TABLE)
OPPUT PROC
SHL BX,1 ;CONVERT ITEM TO BYTE COUNT
ADD BX,AX ;INDEX INTO TABLE
PTAWRD [BX],C ;STORE THE WORD
RET
OPPUT ENDP
;PUTB (REPLACE ITEM'TH BYTE IN TABLE)
OPPUTB PROC
ADD BX,AX ;INDEX INTO TABLE
MOV ES:[BX],CL ; STORE BYTE
RET
OPPUTB ENDP
;GETPT (GET POINTER TO PROPERTY TABLE FOR GIVEN PROP)
OPGTPT PROC
MOV DX,BX ;PROPERTY
CALL OBJLOC ;FIND OBJ'S LOCATION
CALL FSTPRP ; (A0) GET POINTER TO FIRST PROPERTY
JMP OGT2$ ;SKIP NEXT LINE FIRST TIME THROUGH LOOP
OGT1$: CALL NXTPRP ;POINT TO NEXT PROPERTY
OGT2$: MOV AL,ES:[BX] ;GET PROPERTY IDENTIFIER
AND AL,MASK PROPNUM ;CLEAN OFF LENGTH BITS
CMP AL,DL ;COMPARE PROPERTY NUMBER WITH DESIRED ONE
JG OGT1$ ;IF GREATER, LOOP (TABLE SORTED IN REVERSE)
JE OGT3$ ;FOUND THE PROPERTY
SUB AX,AX ;RETURN ZERO FOR NO SUCH PROPERTY
JMP OGT4$
OGT3$: MOV AL,ES:[BX] ;NOW FIND LENGTH OF PROPERTY
INC BX ;POINT TO PROPERTY VALUE
TEST AL,80H ; (A0) PROPERTY LENGTH GREATER THAN 2?
JNZ OGT3B$ ; (A0) YES
JMP OGT3C$
OGT3B$: INC BX ; (A0) UPDATE POINTER
OGT3C$: MOV AX,BX ;AND RETURN IT
OGT4$: JMP PUTVAL
OPGTPT ENDP
PUBLIC OPPTSI
;PTSIZE (RETURN SIZE OF PROPERTY TABLE)
OPPTSI PROC
MOV BX,AX ;TABLE POINTER
MOV AL,ES:[BX-1] ;GET PROPERTY INDENTIFIER
TEST AL,80H ; (A0) PROPERTY LENGTH GREATER THAN 2?
JNZ OPTSB$ ; (A0) YES
TEST AL,40H ; (A0) NO, PROPERTY LENGTH 2?
JNZ OPTSA$ ; (A0) NO, PROPERTY LENGTH 1
MOV AX,1 ; (A0) LENGTH IS 1
JMP PUTVAL
OPTSA$: MOV AX,2 ; (A0) LENGTH IS 2
JMP PUTVAL
;
OPTSB$: AND AL,MASK PROPNUM ; (A0) MASK OUT OTHER BITS
XOR AH,AH ; (A0) CLEAR THESE
JMP PUTVAL ;RETURN IT
OPPTSI ENDP