AppleIIAsm-Collection/source/d3_arrays/T.SUB.APUT82.ASM
2021-06-05 21:40:51 -04:00

147 lines
5.9 KiB
NASM

*
*``````````````````````````````*
* APUT82 (NATHAN RIGGS) *
* *
* PUT DATA FROM SOURCE INTO *
* A 2D, 8BIT ARRAY ELEMENT. *
* *
* INPUT: *
* *
* ZPW1 = SOURCE ADDRESS *
* ZPW2 = ARRAY ADDRESS *
* ZPB1 = 1ST DIM INDEX *
* ZPB2 = 2ND DIM INDEX *
* *
* DESTROY: NZCIDV *
* ^^^ ^ *
* *
* CYCLES: 302+ *
* SIZE: 188 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]ADDRS EQU ZPW1 ; SOURCE ADDRESS
]ADDRD EQU ZPW2 ; ARRAY ADDRESS
]XIDX EQU ZPB1 ; X INDEX
]YIDX EQU ZPB2 ; Y INDEX
*
]ESIZE EQU ZPB3 ; ELEMENT LENGTH
]MCAND EQU ZPW3 ; MULTIPLICAND
]MLIER EQU ZPW4 ; MULTIPLIER
]PROD EQU VARTAB ; PRODUCT
]XLEN EQU ZPW5 ; ARRAY X-LENGTH
]YLEN EQU VARTAB+4 ; ARRAY Y-LENGTH
]PBAK EQU VARTAB+8 ; PRODUCT BACKUP
*
APUT82
LDY #0 ; {2C2B} RESET INDEX
LDA (]ADDRD),Y ; {6C2B} GET ARRAY X-LENGTH
STA ]XLEN ; {3C2B}
LDY #1 ; {2C2B} INCREMENT INDEX
LDA (]ADDRD),Y ; {6C2B} GET ARRAY Y-LENGTH
STA ]YLEN ; {3C2B}
LDY #2 ; {2C2B} INCREMENT INDEX
LDA (]ADDRD),Y ; {6C2B} GET ARRAY ELEMENT LENGTH
STA ]ESIZE ; {3C2B}
*
** MULTIPLY Y-INDEX BY Y-LENGTH
*
LDA #0 ; {2C2B} RESET LOBYTE
TAY ; {2C1B} RESET HIBYTE
STY ZPB4 ; {3C2B} SAVE HIBYTE IN ZPB4
BEQ :ENTLP ; {3C2B} IF ZERO, SKIP TO LOOP
:DOADD
CLC ; {2C1B} CLEAR CARRY FLAG
ADC ]YIDX ; {4C3B} ADD Y-INDEX
TAX ; {2C1B} STORE IN .X
TYA ; {2C1B} LOAD HIBYTE
ADC ZPB4 ; {4C3B} ADD HIBYTE
TAY ; {2C1B} STORE IN .Y
TXA ; {2C1B} RELOAD LOBYTE
:LP
ASL ]YIDX ; {6C3B} MULTIPLY Y-INDEX BY 2
ROL ZPB4 ; {6C3B} DEAL WITH HIBYTE
:ENTLP
LSR ]YLEN ; {6C3B} DIVIDE Y-LENGTH BY 2
BCS :DOADD ; {3C2B} IF >= LOBYTE, ADD AGAIN
BNE :LP ; {3C2B} ELSE, LOOP
STX ]PBAK ; {3C2B} STORE LOBYTE IN PRODUCT BACKUP
STY ]PBAK+1 ; {3C2B} STORE HIBYTE
LDA ]XIDX ; {3C2B} PUT X-INDEX INTO MULTIPLIER
STA ]MLIER ; {3C2B}
LDA #0 ; {2C2B} RESET HIBYTE
STA ]MLIER+1 ; {3C2B} TRANSFER HIBYTE
LDA ]ESIZE ; {3C2B} PUT ELEMENT LENGTH
STA ]MCAND ; {3C2B} INTO MULTIPLICAND
LDA #0 ; {2C2B} RESET HIBYTE
STA ]MCAND+1 ; {3C2B}
*
** NOW MULTIPLY XIDX BY ELEMENT LENGTH
*
STA ]PROD ; {3C2B} RESET PRODUCT LOBYTE
STA ]PROD+1 ; {3C2B} RESET 2ND BYTE
STA ]PROD+2 ; {3C2B} RESET 3RD BYTE
STA ]PROD+3 ; {3C2B} RESET HIBYTE
LDX #$10 ; {2C2B} LOAD $10 INTO .X (#16)
:SHIFTR LSR ]MLIER+1 ; {6C3B} DIVIDE MULTIPLIER BY 2
ROR ]MLIER ; {6C3B} DEAL WITH HIBYTE
BCC :ROTR ; {3C2B} IF < RODUCT, ROTATE
LDA ]PROD+2 ; {3C2B} LOAD PRODUCT 3RD BYTE
CLC ; {2C1B} CLEAR CARRY FLAG
ADC ]MCAND ; {4C3B} ADD MULTIPLICAND
STA ]PROD+2 ; {3C2B} STORE 3RD BYTE
LDA ]PROD+3 ; {3C2B} LOAD HIBYTE
ADC ]MCAND+1 ; {4C3B} ADD MULTIPLICAND HIBYTE
:ROTR
ROR ; {6C3B} ROTATE .A RIGHT
STA ]PROD+3 ; {3C2B} STORE IN PRODUCT HIBYTE
ROR ]PROD+2 ; {6C3B} ROTATE PRODUCT 3RD BYTE
ROR ]PROD+1 ; {6C3B} ROTATE RODUCT 2ND
ROR ]PROD ; {6C3B} ROTATE LOBYTE
DEX ; {2C1B} DECREMENT COUNTER
BNE :SHIFTR ; {3C2B} IF NOT 0, BACK TO SHIFTER
*
** NOW ADD PRODUCT TO REST
*
LDA ]PBAK ; {3C2B} LOAD FIRST PRODUCT LOBYTE
CLC ; {2C1B} CLEAR CARRY FLAG
ADC ]PROD ; {4C3B} ADD 2ND PRODUCT LOBYTE
STA ]PROD ; {3C2B} STORE NEW PRODUCT LOBYTE
LDA ]PBAK+1 ; {3C2B} LOAD FIRST PRODUCT HIBYTE
ADC ]PROD+1 ; {4C3B} ADD 2ND HIBYTE
STA ]PROD+1 ; {3C2B} STORE HIBYTE
LDA ]PROD ; {3C2B} LOAD NEW PRODUCT LOBYTE
CLC ; {2C1B} CLEAR CARRY FLAG
ADC #3 ; {4C3B} INCREASE BY 3
STA ]PROD ; {3C2B} STORE IN LOBYTE
LDA ]PROD+1 ; {3C2B} APPLY CARRY TO HIBYTE
ADC #0 ; {2C2B}
STA ]PROD+1 ; {3C2B}
*
** ADD ARRAY ADDRESS TO GET INDEX
*
CLC ; {2C1B} CLEAR CARRY FLAG
LDA ]PROD ; {3C2B} LOAD PRODUCT LOBYTE
ADC ]ADDRD ; {4C3B} ADD ARRAY ADDRESS LOBYTE
STA ]PROD ; {3C2B} STORE IN PRODUCT
LDA ]PROD+1 ; {3C2B} LOAD PRODUCT HIBYTE
ADC ]ADDRD+1 ; {4C3B} ADD ARRAYH ADDRESS HIBYTE
STA ]PROD+1 ; {3C2B} STORE HIBYTE
LDX ]PROD ; {3C2B} PUT ELEMENT ADDRESS LOBYTE IN .X
LDY ]PROD+1 ; {3C2B} PUT HIBYTE IN Y
STX ZPW6 ; {3C2B} STORE IN ZERO PAGE
STY ZPW6+1 ; {3C2B}
LDY #0 ; {2C2B} RESET INDEX
*
** COPY FROM SRC ADDR TO DEST ADDR
*
:CLP
LDA (]ADDRS),Y ; {6C2B} GET BYTE FROM SOURCE
STA (ZPW6),Y ; {3C2B} STORE IN ELEMENT
INY ; {2C1B} INCREASE INDEX
CPY ]ESIZE ; {4C3B} IF < ELEMENT SIZE,
BNE :CLP ; {3C2B} CONTINUE COPYING
LDX ZPW6 ; {3C2B} PUT ELEMENT LOBYTE IN .X
LDY ZPW6+1 ; {3C2B} PUT HIBYTE IN .Y
LDA ]ESIZE ; {3C2B} PUT ELEMENT SIZE IN .A
RTS ; {6C1B}