mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-11 23:43:24 +00:00
116 lines
2.9 KiB
Plaintext
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
|
|
|
|
|