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

167 lines
3.8 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.
STTL "--- OBJECT & PROPERTY HANDLERS ---"
PAGE
; ----------------------------------
; GET ABSOLUTE ADDRESS OF OBJECT [A]
; ----------------------------------
; ENTER: OBJECT IN A/X (LO/HI)
; EXIT: ADDRESS IN [FPC]
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 relative ADDR
adc ZBEGIN+ZOBJEC+1 ; OF THE OBJECT TABLE
sta FPCL ; save lo byte
lda I+HI
adc ZBEGIN+ZOBJEC ; now work on page
jsr SETPC ; now get page/bank
sta FPCH ; this is hi part
sty FPCBNK ; and this is the bank
rts
; -----------------------------
; GET ADDRESS OF PROPERTY TABLE
; -----------------------------
; EXIT: [FPC] HAS ABSOLUTE ADDR OF PROPERTY TABLE
; including OFFSET TO START OF PROP IDS
PROPB:
lda ARG1+LO
ldx ARG1+HI ; get address
jsr OBJLOC ; put table location into FPC
lda #12 ; add 12 to get to beginning
jsr ADDFPC ; and add it to FPC
jsr FETCHB ; get MSB of P-TABLE Address
pha ; and save it for a moment
jsr NEXTFPC ; to get LSB
jsr FETCHB ; get LSB of P-TABLE Address
sta FPCL ; and save lo part
pla ; get page back
jsr SETPC ; and set up memory bank/page
sta FPCH ; save page
sty FPCBNK ; and bank
jsr FETCHB ; get length of short description
asl A ; WORD-ALIGN IT
jsr ADDFPC ; and add it to FPC
jsr NEXTFPC ; POINT JUST PAST THE DESCRIPTION
rts
; -------------------
; FETCH A PROPERTY ID
; -------------------
; ENTRY: LIKE "PROPB" EXIT (i.e. - address in FPC)
;
PROPN:
jsr FETCHB ; get the byte
and #%00111111 ; MASK OUT LENGTH BITS (EZIP)
rts
; -------------------------------
; FETCH # BYTES IN PROPERTY VALUE
; -------------------------------
; ENTRY: LIKE "PROPB" EXIT (i.e. - address in FPC)
;
PROPL:
jsr FETCHB ; CHECK LENGTH FLAGS
tax ; save it
bpl SHORT ; OFF, SO 1 OR 2 BYTES
jsr NEXTFPC
jsr FETCHB ; NEXT BYTE HAS LENGTH
and #%00111111 ; MASK OFF EXTRA BITS
rts
SHORT:
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 (i.e. - in [FPC])
;
PROPNX:
jsr PROPL ; GET LENGTH OF CURRENT PROP
tay ; move one more for correct alignment
iny ; okay, done it
tya ; thanks
jsr ADDFPC ; add to [FPC]
rts
;
; ----------------
; GET OBJECT FLAGS
; ----------------
; ENTRY: OBJECT # IN [ARG1], FLAG # IN [ARG2]
; EXIT: FLAG WORD IN [K], BIT ID IN [J],
; FLAG WORD ADDRESS IN [FPC]
;
FLAGSU:
LDA ARG1+LO ; get table offset
LDX ARG1+HI
JSR OBJLOC ; GET OBJECT ADDR IN [FPC]
LDA ARG2+LO ; LOOK AT FLAG ID
CMP #$10 ; FIRST SET OF FLAGS?
BCC FLS1 ; YES, ADDR IN [FPC] 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 #4 ; 3rd Flag word
bne FLSx ; and add it in
FLS:
lda #2 ; 2nd Flag word
FLSx:
jsr ADDFPC
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:
jsr FETCHB ; MOVE THE FLAG WORD
sta K+HI ; INTO [K] - FIRST THE MSB
jsr NEXTFPC ; and then get get LSB
jsr FETCHB
sta K+LO ; THEN THE LSB
jmp PREVFPC ; point back to flag word
END