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

109 lines
4.0 KiB
NASM

*
*``````````````````````````````*
* APUT81 (NATHAN RIGGS) *
* *
* PUT DATA FROM SRC LOCATION *
* INTO 1D, 8BIT ARRAY AT THE *
* SPECIFIED ELEMENT. *
* *
*------------------------------*
* 8-BIT MULTIPLICATION CODE *
* ADAPTED FROM WHITE FLAME'S *
* WORK ON CODEBASE64. LICENSE *
* MAY VARY. *
*------------------------------*
* *
* INPUT: *
* *
* ZPW1 = SOURCE ADDRESS *
* ZPW2 = DESTINATION ADDRESS *
* ZPB1 = ARRAY INDEX *
* *
* DESTROY: NZCIDV *
* ^^^ ^ *
* *
* CYCLES: 172+ *
* SIZE: 100 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]ADDRS EQU ZPW1 ; SOURCE ADDRESS
]ADDRD EQU ZPW2 ; DESTINATION
]AIDX EQU ZPB1 ; ARRAY INDEX
]SCRATCH EQU ZPW3 ; ZEROED HIBYTE
*
]ESIZE EQU ZPB2 ; ELEMENT SIZE
]ESIZEBK EQU ZPB3 ; ^BACKUP
]ASIZE EQU ZPW4 ; # OF ELEMENTS
]IDX EQU ZPW5 ; INDEX
]RES EQU ZPW6 ; MULTIPLICATION RESULT
*
APUT81
LDA ]AIDX ; {2C2B} STORE IN 2 LOCATIONS
STA ]IDX ; {3C2B} FOR A BACKUP LATER
*
** MULTIPLY INDEX BY ELEM SIZE AND ADD 2
*
LDY #1 ; {2C2B} GET ELEMENT LENGTH FROM
LDA (]ADDRD),Y ; {6C2B} BYTE 1 OF ARRAY
STA ]ESIZE ; {3C2B}
STA ]ESIZEBK ; {3C2B}
LDY #0 ; {2C2B} RESET INDEX
LDA (]ADDRD),Y ; {6C2B} GET NUMBER OF ELEMENTS
STA ]ASIZE ; {3C2B} FROM ARRAY
TYA ; {2C1B} .A = 0
STY ]SCRATCH ; {3C2B} LOBYTE = 0
STY ]SCRATCH+1 ; {3C2B} HIBYTE = 0
BEQ :ENTLPA ; {3C2B} IF 0, SKIP TO LOOP
:DOADD
CLC ; {2C1B} CLEAR CARRY FLAG
ADC ]AIDX ; {4C2B} ADD INDEX LOBYTE
TAX ; {2C1B} TEMPORARILY STORE IN .X
TYA ; {2C1B} TRANSFER HIBYTE TO .A
ADC ]SCRATCH ; {4C2B} ADD HIBYTE
TAY ; {2C1B} STORE BACK IN .Y
TXA ; {2C1B} RELOAD LOBYTE TO .A
:LPA
ASL ]AIDX ; {6C3B} MUL INDEX BY TWO
ROL ]SCRATCH ; {6C3B} ADJUST HIBYTE CARRY
:ENTLPA
LSR ]ESIZE ; {6C3B} DIVIDE ELEMENT SIZE BY 2
BCS :DOADD ; {3C2B} IF >= LOBYTE IN .A, ADD AGAIN
BNE :LPA ; {3C2B}
STX ]IDX ; {3C2B} STORE LOBYTE
STY ]IDX+1 ; {3C2B} STORE HIBYTE
CLC ; {2C1B} CLEAR CARRY FLAG
LDA #2 ; {2C2B} ADD 2 BYTES TO INDEX
ADC ]IDX ; {3C2B} TO ACCOUNT FOR HEADER
STA ]RES ; {3C2B} STORE LOBYTE
LDA #0 ; {2C2B} ACCOUNT FOR HIBYTE CARRY
ADC ]IDX+1 ; {3C2B}
STA ]RES+1 ; {3C2B}
*
** ADD RESULT TO ARRAY ADDRESS TO GET ELEMENT ADDR
*
CLC ; {2C1B} CLEAR CARRY FLAG
LDA ]RES ; {3C2B} LOAD RESULT FROM EARLIER
ADC ]ADDRD ; {3C2B} ADD ARRAY ADDRESS LOBYTE
STA ]RES ; {3C2B} STORE BACK IN RESULT
LDA ]RES+1 ; {3C2B} ADD ARRAY ADDRESS HIBYTE
ADC ]ADDRD+1 ; {3C2B}
STA ]RES+1 ; {3C2B} STORE HIBYTE
*
STA ]ADDRD+1 ; {3C2B} STORE IN ZERO PAGE HIBYTE
LDA ]RES ; {3C2B} STORE LOBYTE TO ZERO PAGE
STA ]ADDRD ; {3C2B}
*
** COPY FROM SRC ADDR3 TO ELEMENT LOCATION ADDR
*
:LP
LDA (]ADDRS),Y ; {6C2B} LOAD BYTE FROM SOURCE
STA (]ADDRD),Y ; {6C2B} STORE IN ELEMENT ADDRESS
INY ; {2C1B} INCREASE BYTE INDEX
CPY ]ESIZEBK ; {4C3B} COMPARE TO ELEMENT SIZE
BNE :LP ; {3C2B} IF !=, KEEP COPYING
*
LDY ]ADDRD+1 ; {3C2B} .Y = ELEMENT ADDRESS HIBYTE
LDX ]ADDRD ; {3C2B} .X = LOBYTE
LDA ]ESIZE ; {3C2B} .A = ELEMENT SIZE
RTS ; {6C1B}