mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-08 01:01:24 +00:00
200 lines
4.4 KiB
NASM
200 lines
4.4 KiB
NASM
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
|
||
|