AppleIIAsm-Collection/disks/disk3_arrays/T.AGET81.SUB.MIN
nathanriggs ad58479739 Disk 3: ARRAYS 0.3.0 updates
- major bugfixes, especially in 2D arrays
- separated each subroutine into own file
- reconfigured arrays to use 1-based indexing
- Arrays.demo uses macros now
- added overflow error handling to get and put routines
2019-01-20 19:14:17 -05:00

107 lines
2.3 KiB
Plaintext

AGET81
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :IDX
DEC :IDX
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA #0
STA :IDX+1
LDY #1 ; ELEMENT SIZE LOC
LDA (ADDR1),Y
STA :ESIZE
STA RETLEN ; LENGTH OF RETURN VALUE
DEY
LDA (ADDR1),Y
STA :ALEN
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :IDX ; IF IDX > ARRAY LENGTH
CLC
ADC #1
CMP :ALEN
BCS :OVF
JMP :CHKCONT
:OVF
_ERR :E_SID;:E_OVF1;:E_DUMP;:RES;#6
:CHKCONT
LDA :IDX
CMP #255 ; NO ZERO INDEX
BEQ :UNF ; UNDERFLOW
JMP :ERREND
:UNF
_ERR :E_SID;:E_UNF;:E_DUMP;:RES;#6
:ERREND
LDY #0
LDA #0
TAY
STY SCRATCH
BEQ :ENTLP
:DOADD
CLC
ADC :IDX
TAX
TYA
ADC SCRATCH
TAY
TXA
:LP
ASL :IDX
ROL SCRATCH
:ENTLP
LSR :ESIZE
BCS :DOADD
BNE :LP
STX :IDX
STY :IDX+1
CLC
LDA #2
ADC :IDX
STA :RES
LDA #0
ADC :IDX+1
STA :RES+1
CLC
LDA :RES
ADC ADDR1 ; LOW OF ARRAY ADDRESS
STA :RES
LDA :RES+1
ADC ADDR1+1
STA :RES+1
LDY #0
LDA :RES
STA ADDR1
LDA :RES+1
STA ADDR1+1
:LDLOOP
LDA (ADDR1),Y
STA RETURN,Y
INY
CPY RETLEN
BCC :LDLOOP ; IF .Y <= RETLEN
BEQ :LDLOOP ; KEEP LOOPING
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY :RES
LDX :RES+1
LDA RETLEN
RTS
:RES DS 2
:IDX DS 2
:ESIZE DS 1
:ALEN DS 1
:E_SID ASC "AGET81 (GET81 MACRO)",00
:E_DUMP ASC "DUMPING RES(2) IDX(2) ESIZE(1) ALEN(1)",00
:E_OVF1 ASC "OVERFLOW: INDEX HIGHER THAN ARRAY LENGTH",00
:E_UNF ASC "UNDERFLOW: CANNOT USE A ZERO INDEX",00