mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-18 15:30:36 +00:00
- getting ready for major changes for 0.6.0. - be sure to download the 0.5.0 release to ensure proper functionality, as these rountines will not work together in the SRC or BIN folder during the transition - Beginning to significantly alter documentation
114 lines
3.7 KiB
NASM
114 lines
3.7 KiB
NASM
*
|
|
*``````````````````````````````*
|
|
* ADIM81 (NATHAN RIGGS) *
|
|
* *
|
|
* INPUT *
|
|
* *
|
|
* WPAR1 = ARRAY ADDRESS (2B) *
|
|
* WPAR2 = # OF ELEMENTS *
|
|
* WPAR3 = LENGTH OF ELEMENTS *
|
|
* BPAR1 = FILL VALUE *
|
|
* *
|
|
* OUTPUT *
|
|
* *
|
|
* RETURN = TOTAL BYTES USED *
|
|
* RETLEN = 2 *
|
|
* *
|
|
* DESTROY: AXYNVBDIZCMS *
|
|
* ^^^^^ ^^^ *
|
|
* *
|
|
* CYCLES: 176+ *
|
|
* SIZE: 160 BYTES *
|
|
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
*
|
|
]ADDR EQU WPAR1
|
|
]ASIZE EQU WPAR2
|
|
]ESIZE EQU WPAR3
|
|
]FILL EQU BPAR1
|
|
*
|
|
]MSIZE EQU VARTAB ; TOTAL BYTES OF ARRAY
|
|
]ASZBAK EQU VARTAB+4 ; ARRAY SIZE BACKUP
|
|
]ESZBAK EQU VARTAB+6 ; ELEMENT SIZE BACKUP
|
|
*
|
|
ADIM81
|
|
LDA ]ESIZE
|
|
STA ]ESZBAK
|
|
LDA ]ASIZE
|
|
STA ]ASZBAK
|
|
LDA #0
|
|
STA ]ASIZE+1
|
|
STA ]ASZBAK+1
|
|
*
|
|
** MULTIPLY ARRAY SIZE BY ELEMENT SIZE
|
|
*
|
|
LDY #0 ; RESET HIBYTE FOR MULTIPLY
|
|
TYA ; RESET LOBYTE FOR MULTIPLY
|
|
LDY ]ASIZE+1
|
|
STY SCRATCH ; SAVE HIBYTE IN SCRATCH
|
|
BEQ :ENTLP ; IF ZERO, SKIP TO LOOP
|
|
:DOADD
|
|
CLC ; ADD ASIZE TO LOBYTE
|
|
ADC ]ASIZE
|
|
TAX ; TEMPORARILY STORE IN .X
|
|
TYA ; TRANSFER HIBYTE TO .A
|
|
ADC SCRATCH ; ADD HIBYTE
|
|
TAY ; STORE BACK IN .Y
|
|
TXA ; LOAD LOBYTE IN .A AGAIN
|
|
:LP ; LOOP START
|
|
ASL ]ASIZE ; MULTIPLY ASIZE BY 2
|
|
ROL SCRATCH ; MULTIPLY HIBYTE BY 2
|
|
:ENTLP
|
|
LSR ]ESIZE ; DIVIDE ESIZE BY 2
|
|
BCS :DOADD ; IF >= LOBYTE IN .A, ADD AGAIN
|
|
BNE :LP ; OTHERWISE, RELOOP
|
|
*
|
|
STX ]MSIZE ; STORE LOBYTE
|
|
STY ]MSIZE+1 ; STORE HIBYTE
|
|
LDA ]MSIZE ; NOW ADD TO BYTES
|
|
CLC ; TO MSIZE FOR ARRAY HEADER
|
|
ADC #2
|
|
STA ]MSIZE ; STORE LOBYTE
|
|
LDA ]MSIZE+1
|
|
ADC #0 ; CARRY FOR HIBYTE
|
|
STA ]MSIZE+1
|
|
*
|
|
** NOW CLEAR MEMORY BLOCKS
|
|
*
|
|
LDA ]FILL ; GET FILL VALUE
|
|
LDX ]MSIZE+1 ; X = # O PAGES TO DO
|
|
BEQ :PART ; BRANCH IF HIBYTE = 0
|
|
LDY #0 ; RESET INDEX
|
|
:FULL
|
|
STA (]ADDR),Y ; FILL CURRENT BYTE
|
|
INY ; INCREMENT INDEX
|
|
BNE :FULL ; LOOP UNTIL PAGE DONE
|
|
INC ]ADDR+1 ; GO TO NEXT PAGE
|
|
DEX ; DECREMENT COUNTER
|
|
BNE :FULL ; LOOP IF PAGES LEFT
|
|
:PART
|
|
LDX ]MSIZE ; PARTIAL PAGE BYTES
|
|
BEQ :MFEXIT ; EXIT IF LOBYTE = 0
|
|
LDY #0 ; RESENT INDEX
|
|
:PARTLP
|
|
STA (]ADDR),Y ; STORE VAL
|
|
INY ; INCREMENT INDEX
|
|
DEX ; DECREMENT COUNTER
|
|
BNE :PARTLP ; LOOP UNTIL DONE
|
|
:MFEXIT
|
|
LDY #0 ; STORE NUMBER OF ELEMENTS
|
|
LDA ]ASZBAK ; INTO FIRST BYTE OF ARRAY
|
|
STA (]ADDR),Y
|
|
INY
|
|
LDA ]ESZBAK ; STORE ELEMENT SIZE INTO
|
|
STA (]ADDR),Y ; SECOND BYTE OF ARRAY
|
|
LDX ]ADDR ; GET LOBYTE OF ARRAY ADDRESS
|
|
LDY ]ADDR+1 ; AND HIBYTE TO RETURN IN .X, .Y
|
|
LDA ]ASZBAK ; RETURN NUMBER OF ELEMENTS IN .A
|
|
LDA ]MSIZE ; STORE TOTAL ARRAY SIZE
|
|
STA RETURN ; IN RETURN
|
|
LDA ]MSIZE+1
|
|
STA RETURN+1
|
|
LDA #2 ; SET RETURN LENGTH TO
|
|
STA RETLEN ; 2 BYTES
|
|
RTS
|