2023-11-16 18:19:54 -05:00

176 lines
3.0 KiB
Plaintext

SBTTL "--- ITERATION STUFF ---"
;--------------------------------------------
; ITERATIONS
; EXECUTE THE ITERATION TABLE AT [ARG2]
; TEST FOR INPUT AFTER EACH ENTRY IS DONE AND
; -------------------------------------------
ITRATE: LDA ARG2+HI
STA ARG3+HI ; POINT ARG3 AT TABLE
LDA ARG2+LO
STA ARG3+LO
LDA #00 ; SET OFFSET INTO TABLE=0
STA ARG4+HI
STA ARG4+LO
JSR ICALC ; POINT [I] AT TABLE
LDA (I),Y ; NUMBER OF ENTRIES
STA ITICN
INY
LDA (I),Y ; ENTRY TO START WITH
STA ITPNT ; (NORMALLY ENTRY 1)
INC ARG4+LO ; POINT AT FISRT WORD IN FIRST ENTRY
LDX #1
ITLP2: CPX ITPNT ; SKIP ENTRIES 1 TO ITPNT
BEQ ITLOOP
JSR NXTENT
INX
BNE ITLP2 ; BRA
ITLOOP: JSR ICALC ; SET (I) CORECTLY
LDA (I),Y ; POINT IADR1 AT "HEADER"
STA IADR1+HI
STY IADR10
INY
LDA (I),Y
STA IADR1+LO
LDY #7 ; CURRENT ITERATION
LDA (I),Y
PHA ; SAVE
TAX
INX ; TAKE CARE OF SETING FOR NEXT ITERATION
LDY #9 ; NUMBER OF ITERATIONS
CMP (I),Y
BNE ITSKP2
LDX #1 ; RESTET TO FIRST ITERATION
ITSKP2: TXA
LDY #7
STA (I),Y ; NEXT ITERATION
INY ;=8
LDA (I),Y ; BSET
STA BSET
LDY #10 ; WIDTH
LDA (I),Y
STA IX1
TAX
INY
LDA (I),Y ; HEIGHT
STA IY1
TAY
JSR MULXY ; FIND WIDTH*HEIGHT
PLA ; RESTORE CURRENT ITERATION
TAY
ITLP3: DEY ; ZERO ALIGN FIRST TIME THRU/ THEN JUST DEX
BEQ ITSKP3
LDA MUH ; ADD LENGTH OF ICON (WIDTH*HEIGTH)
LDX MUL
JSR ADDIA1
JMP ITLP3
ITSKP3: TYA ;=0
LDX #4
JSR ADDIA1 ; SKIP 4 HEADER BYTES
LDY #2 ; =2
LDA (I),Y ; ICON XPOS
STA ARG1+HI
INY ; =3
LDA (I),Y
STA ARG1+LO
INY ; =4
LDA (I),Y ; ICON YPOS
STA ARG2+HI
INY ; =5
LDA (I),Y
STA ARG2+LO
INY ; =6
LDA (I),Y ; NEGATE
ITSKP4: STA NEGATE
LDA #00
STA MSKFLG ; DISABLE MASKING
JSR ITENT ; ENTER DRAW ROUTINE
JSR NXTENT ; POINT ARG4 AT NEXT ENTRY
LDX ITPNT ; ARE WE DONE YET?
CPX ITICN
BEQ ITEXI ; YES WE ARE DONE
INC ITPNT ; OTHERWISE POINT TO NEXT ENTRY
LDA VALUE+HI ; IF INPUT WAS CALLED WITH A NEG INT
BMI NONSNS ; DO NOT LOOK FOR INPUT
JSR SENSE ; DO WE HAVE AN INPUT
CMP #%10001111
BNE ITSKP5 ; GO HANDLE AN INPUT
NONSNS: JMP ITLOOP ; OTHERWISE DO NEXT ENTRY
ITSKP5: PHA ; SAVE INPUT
LDA #00
STA ARG4+HI
STA ARG4+LO ; POINT AT TABLE HEADER
JSR ICALC
INY ; =1
LDA ITPNT ; SAVE STATUS OF HOW FAR WE GOT IN DOING
STA (I),Y ; THE TABLE
PLA ; RESTORE SENSE
JMP PUTBYT ; RETURN SENSE
ITEXI: LDA #00
STA ARG4+HI
STA ARG4+LO
JSR ICALC ; POINT TO TABLE HEADER
INY ; =1
TYA
STA (I),Y
JMP NOIT
;-----------------------------
; SKIP 6 WORDS (1 TABLE ENTRY)
;-----------------------------
NXTENT: LDA #6 ; ADD 6 TO ARG4
CLC
ADC ARG4+LO
STA ARG4+LO
BCC NEXI
INC ARG4+HI
NEXI: RTS
;-----------------------------------------------------------
; ICALC POINTS [I] AT THE RAM ADDRESS OF THE TABLE,OFFSET OF
; ARG3,ARG4
; AND GENERATES A PURITY ERROR IF [I] POINTS AT PURE CODE.
;
; EXITS: <Y>=0
;------------------------------------------------------------
ICALC: LDY #00
LDA ARG4+LO
CLC
ADC ARG3+LO
STA I+LO
LDA ARG4+HI
ADC ARG3+HI
JMP ICENT ;ENTRY IN PCALC
END