AppleIIAsm-Collection/disks/disk2_common/T.MEMSWAP.SUB

164 lines
3.7 KiB
Plaintext
Raw Normal View History

*
*``````````````````````````````*
* MEMSWAP :: MEMORY SWAP *
*- -*
* SWAPS THE VALUES STORED IN *
* TWO BLOCKS OF SEQUENTIAL *
* MEMORY. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>$6A00 *
* PHA *
* LDA #<$6A00 *
* PHA *
* LDA #>$300 *
* PHA *
* LDA #<$300 *
* PHA *
* LDA #$100 *
* PHA *
* JSR MEMSWAP *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LOW BYTE OF FIRST ADDRESS *
* HIGH BYTE OF FIRST ADDRESS *
* LOBYTE OF SECOND ADDRESS *
* HIBYTE OF SECOND ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
MEMSWAP
*
** GET RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET VARIABLES
*
PLA
STA :LENGTH
PLA
STA ADDR1
STA :A1
PLA
STA ADDR1+1
STA :A1+1
PLA
STA ADDR2
STA :A2
PLA
STA ADDR2+1
STA :A2+1
*
********************************
*
* ERROR CONTROL
*
********************************
*
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA ADDR2+1 ; IF #>A2 => #>A1
CMP ADDR1+1
BCS :CHKLO ; CHECK LOW BYTES
JMP :A1GTA2 ; ELSE, A1 > A2
:CHKLO
LDA ADDR2
CMP ADDR1
BCS :A2GTA1
JMP :A1GTA2
:A2GTA1
LDA ADDR2 ;CALC DEST-SRC
SEC
SBC ADDR1
TAX
LDA ADDR2+1
SBC ADDR1+1 ; MOD 64K AUTOMATIC
; -- DISCARD CARRY
TAY
TXA ; CMP WITH # OF BYTES TO MOVE
CMP :LENGTH
TYA
SBC :LENGTH+1
BCS :ERREND ; BRANCH IF NO OVERLAP
JMP :OVF
:A1GTA2
LDA ADDR1
SEC
SBC ADDR2
TAX
LDA ADDR1+1
SBC ADDR2+1
TAY
TXA
CMP :LENGTH
TYA
SBC :LENGTH+1
BCS :ERREND
:OVF
_ERR :E_SID;:E_OVF;:E_DUMP;:LENGTH;#6
*
********************************
*
:ERREND
*
********************************
*
LDY #255 ; COUNTER
:LP
INY
LDA (ADDR1),Y
TAX ; X CONTAINS ADDR1 VAL
LDA (ADDR2),Y ; A CONTAINS ADDR2 VAL
STA (ADDR1),Y
TXA
STA (ADDR2),Y
CPY :LENGTH
BNE :LP
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
RTS
*
** VARIABLES
*
:LENGTH DS 2
:A1 DS 2
:A2 DS 2
*
:E_SID ASC "MEMSWAP (MSWAP MACRO)",00
:E_DUMP ASC "DUMPING LENGTH (2) A1(2) A2(2)",00
:E_OVF ASC "OVERFLOW! ADDRESSES OVERLAP.",00
*