mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2024-06-16 07:29:30 +00:00
109 lines
4.0 KiB
NASM
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}
|