Files
erkyrath.infocom-zcode-terps/64/lzip/objects.asm
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

199 lines
4.2 KiB
NASM

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