nathanriggs 82d0e74c1a 0.3.1 updates
some minor bugfixes, directory shuffling, added demo and utility disks
2019-01-26 21:02:17 -05:00

276 lines
5.7 KiB
Plaintext

*
*``````````````````````````````*
* APUT82 : PUT DATA INTO ELEM *
*- -*
* THIS PUTS DATA FROM ONE ADDR *
* INTO THE ADDRESS OF AN ARRAY *
* WITH THE INDEX OF [:XIDX], *
* [:YIDX]. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>$300 ; SOURCE DATA *
* PHA *
* LDA #<$300 *
* PHA *
* LDA #>$3A0 ; DEST ARRAY *
* PHA *
* LDA #<$3A0 *
* PHA *
* LDA #2 ; ELEM X INDEX *
* PHA *
* LDA #3 ; ELEM Y INDEX *
* PHA *
* JSR APUT82 *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* ELEMENT Y INDEX *
* ELEMENT X INDEX *
* LOW BYTE OF DESTINATION ADDR *
* HI BYTE OF DESTINATION ADDR *
* LO BYTE OF SOURCE ADDRESS *
* HI BYTE OF SOURCE ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* .Y = LOBYTE ELEMENT ADDRESS *
* .X = HIBYTE ELEMENT ADDRESS *
* .A = ELEMENT BYTE LENGTH *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
APUT82
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA :YIDX ; Y INDEX
DEC :YIDX
PLA
STA :XIDX ; X INDEX
DEC :XIDX
PLA
STA ADDR4 ; ADDRESS OF ARRAY
PLA
STA ADDR4+1
PLA
STA ADDR3 ; ADDRESS OF DATA
PLA ; TO BE COPIED
STA ADDR3+1
*
** GET ARRAY SIZES
*
LDY #2
LDA (ADDR4),Y
STA :ESIZE
STA :MCAND
LDA #0
STA :MCAND+1
LDY #0
LDA (ADDR4),Y
STA :XLEN
INY
LDA (ADDR4),Y
STA :YLEN
LDY #0
*
********************************
*
* ERROR CONTROL
*
********************************
*
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :XIDX ; IF X > MAX LEN
CMP :XLEN
BCS :XOVF
JMP :ERRCONT1
:XOVF
_ERR :E_SID;:E_XOVF;:E_DUMP;:XIDX;#15
:ERRCONT1
LDA :YIDX ; IF Y > MAX LEN
CMP :YLEN
BCS :YOVF
JMP :ERRCONT2
:YOVF
_ERR :E_SID;:E_YOVF;:E_DUMP;:XIDX;#15
:ERRCONT2
LDA :XIDX ; IF INDEX IS 0, ERR
CMP #255
BEQ :XOVF
:ERRCONT3
LDA :YIDX
CMP #255
BEQ :YOVF
*
********************************
*
:ERREND
*
********************************
*
** MULTIPLY Y-INDEX BY Y-LENGTH
*
LDA #0
TAY
STY SCRATCH
BEQ :ENTLP
*
:DOADD
CLC
ADC :YIDX
TAX
*
TYA
ADC SCRATCH
TAY
TXA
*
:LP
ASL :YIDX
ROL SCRATCH
:ENTLP
LSR :YLEN
BCS :DOADD
BNE :LP
*
STX :MLIER
STY :MLIER+1
*
** NOW ADD X INDEX
*
CLC
LDA :MLIER
ADC :XIDX
STA :MLIER
BCC :CONTADD
LDA :MLIER+1
ADC #1
STA :MLIER+1
:CONTADD
*
** NOW MULTIPLY BY LENGTH OF ELEMENTS
*
LDA #0
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFTR LSR :MLIER+1
ROR :MLIER
BCC :ROTR
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROTR
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFTR
*
CLC
INC :PROD ; INCREASE BY 3
INC :PROD
INC :PROD
BCC :NOCAR
INC :PROD+1
:NOCAR
*
** NOW ADD BASE ADDRESS OF ARRAY TO GET
** THE ADDRESS OF THE INDEX VALUE
*
CLC
LDA :PROD
ADC ADDR4
STA :PROD
LDA :PROD+1
ADC ADDR4+1
STA :PROD+1
LDA :PROD
*SBC #1
*STA :PROD
*
** RETURN ADDRESS IN Y(LOW) AND X(HIGH)
*
LDY :PROD
LDX :PROD+1
STY ADDR2
STX ADDR2+1
*
LDY #0
LDX #0
*
** COPY FROM SRC ADDR TO DEST ADDR
*
:CLP
LDA (ADDR3),Y
STA (ADDR2),Y
INY
CPY :ESIZE
BNE :CLP
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
** RETURN ELEMENT ADDRESS AND SIZE
*
LDX ADDR2+1
LDY ADDR2
LDA :ESIZE
*
RTS
*
** DATA
*
:ESIZE DS 1
:XIDX DS 1
:YIDX DS 1
:MCAND DS 2
:MLIER DS 2
:PROD DS 4
:XLEN DS 1
:YLEN DS 1
*
:E_SID ASC "APUT82 (PUT82 MACRO)",00
:E_DUMP ASC ":XIDX(1) :YIDX(1) :MCAND(2) :MLIER(2)"
ASC ":PROD(4) :XLEN(1) :YLEN(1)",00
:E_XOVF ASC "OUT OF BOUNDS! X > MAXIMUM OR IS 0.",00
:E_YOVF ASC "OUT OF BOUNDS! Y > MAX OR IS 0.",00
*