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

200 lines
4.4 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
PAGE
STTL "--- 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