PAGE SBTTL "--- OBJECT & PROPERTY HANDLERS ---" ; ******************************************** ; AN ASSUMPTION HAS BEEN MADE WITH EZIP OBJECT ; HANDLING. THAT IS THAT ALL THIS STUFF IS ; BEFORE PURBOT AND IS IN MAIN MEMORY ; AND THEREFORE DIRECT ACCESSING IS JUST FINE ; LINDE ; ******************************************** ; ---------------------------------- ; GET ABSOLUTE ADDRESS OF OBJECT [A] ; ---------------------------------- ; ENTER: OBJECT IN A/X (LO/HI) ; EXIT: ADDRESS IN [I] ; (EZIP VERSION) OBJLOC: STX I+HI ; SAVE MSB FOR SHIFTING ASL A ; MULTIPLY BY LENGTH OF AN ENTRY (14) STA I+LO ROL I+HI LDX I+HI ASL A ROL I+HI ; *4 ASL A ROL I+HI ; *8 ASL A ROL I+HI ; *16 SEC SBC I+LO ; -(*2) STA I+LO ; SO IS *14 TOTAL LDA I+HI STX I+HI SBC I+HI STA I+HI LDA I+LO CLC ADC #112 ; ADD OBJECT TABLE OFFSET BCC OBJ3 INC I+HI OBJ3: CLC ; NEXT ADD THE ABS ADDR ADC OBJTAB+LO ; OF THE OBJECT TABLE STA I+LO LDA I+HI ADC OBJTAB+HI STA I+HI RTS ; ----------------------------- ; GET ADDRESS OF PROPERTY TABLE ; ----------------------------- ; EXIT: [I] HAS ABSOLUTE ADDR OF PROPERTY TABLE ; [Y] HAS OFFSET TO START OF PROP IDS PROPB: LDA ARG1+LO LDX ARG1+HI ; (EZIP) JSR OBJLOC LDY #12 ; (EZIP) LDA (I),Y ; GET MSB OF P-TABLE ADDRESS CLC ADC ZCODE ; MAKE IT ABSOLUTE TAX ; AND SAVE HERE INY LDA (I),Y ; NOW GET LSB STA I+LO STX I+HI ; [I] NOW POINTS TO PROP TABLE LDY #0 LDA (I),Y ; GET LENGTH OF SHORT DESC ASL A ; WORD-ALIGN IT TAY ; EXPECTED HERE INY ; POINT JUST PAST THE DESCRIPTION RTS ; ------------------- ; FETCH A PROPERTY ID ; ------------------- ; ENTRY: LIKE "PROPB" EXIT PROPN: LDA (I),Y AND #%00111111 ; MASK OUT LENGTH BITS (EZIP) RTS ; ------------------------------- ; FETCH # BYTES IN PROPERTY VALUE ; ------------------------------- ; ENTRY: LIKE "PROPB" EXIT ; (EZIP) PROPL: LDA (I),Y ; CHECK LENGTH FLAGS AND #%10000000 ; TEST BIT 7 BEQ SHORT ; OFF, SO 1 OR 2 BYTES INY LDA (I),Y ; NEXT BYTE HAS LENGTH AND #%00111111 ; MASK OFF EXTRA BITS RTS SHORT: LDA (I),Y ; PICK UP BYTE AGAIN AND #%01000000 ; BIT 6 BEQ ONE LDA #2 ; BIT 6 = 1, LENGTH =2 RTS ONE: LDA #1 ; BIT 6 = 0, LENGTH =1 RTS ; ---------------------- ; POINT TO NEXT PROPERTY ; ---------------------- ; ENTRY: LIKE "PROPB" EXIT PROPNX: JSR PROPL ; GET LENGTH OF CURRENT PROP TAX ; SAVE HERE PPX: INY ; LOOP UNTIL BNE PPY INC I+LO BNE PPY INC I+HI PPY: DEX ; [Y] POINTS TO BNE PPX ; START OF NEXT PROP INY ; CORRECT ALIGNMENT RTS ; ----------------------------------------- ; CALL PROPNX, THEN ALIGN [I] AT THAT ENTRY ; ----------------------------------------- ; EXIT: [I] IS ALIGNED AT CURRENT PROPERTY ; [Y] IS ZEROED ; (EZIP) NEXTPI: JSR PROPNX ; GET ALIGNMENT OF NEXT PROPERTY INTO [Y] TYA ; ADD OFFSET TO NEXT PROP CLC ; TO [I] SO I POINTS DIRECTLY ADC I+LO ; AT IT STA I+LO BCC NXTPI1 INC I+HI ; ADD IN CARRY NXTPI1: LDY #0 ; CLEAR [Y] AS IT IS USED AS AN INDEX RTS ; ---------------- ; GET OBJECT FLAGS ; ---------------- ; ENTRY: OBJECT # IN [ARG1], FLAG # IN [ARG2] ; EXIT: FLAG WORD IN [K], BIT ID IN [J], ; FLAG WORD ADDRESS IN [I] FLAGSU: LDA ARG1+LO ; (EZIP) LDX ARG1+HI JSR OBJLOC ; GET OBJECT ADDR IN [I] LDA ARG2+LO ; LOOK AT FLAG ID CMP #$10 ; FIRST SET OF FLAGS? BCC FLS1 ; YES, ADDR IN [I] IS CORRECT SBC #16 ; ELSE ZERO-ALIGN FLAG INDEX TAX ; SAVE IT HERE CMP #$10 ; CHECK IF IN 2ND WORD BCC FLS ; YES, GO ALIGN FOR THAT SBC #16 ; ELSE ALIGN TO 3RD WORD TAX LDA I+LO CLC ADC #4 ; 3RD FLAG WORD STA I+LO BCC FLS0 INC I+HI JMP FLS0 ; (END EZIP CHGS) FLS: LDA I+LO ; ADD 2 TO ADDRESS IN [I] CLC ; TO POINT TO ADDRESS OF ADC #2 ; 2ND FLAG WORD STA I+LO BCC FLS0 INC I+HI FLS0: TXA ; RESTORE INDEX FLS1: STA K+LO ; SAVE FLAG ID HERE LDX #1 ; INIT THE STX J+LO ; FLAG WORD TO DEX ; $0001 STX J+HI LDA #15 ; SUBTRACT THE BIT POSITION SEC ; FROM 15 SBC K+LO ; TO GET THE SHIFT LOOP TAX ; INDEX BEQ FLS2 ; EXIT NOW IF NO SHIFT NEEDED FLSL: ASL J+LO ; SHIFT THE BIT ROL J+HI ; INTO POSITION DEX BNE FLSL FLS2: LDY #0 ; MOVE THE FLAG WORD LDA (I),Y ; INTO [J] STA K+HI ; FIRST THE MSB INY LDA (I),Y STA K+LO ; THEN THE LSB RTS END