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