6502芯片:复杂内存数据的传输(Complex Memory
2021-05-27 本文已影响0人
苹果王子刘泽庆
将数据从一处移到另一处是一种常见的操作。如果要移动的数据量是256字节或更少,并且数据的源和目标位置是固定的,那么使用索引LDA和索引STA进行简单循环是效率最高的。
需要注意的是,虽然X和Y寄存器都可以在索引寻址模式中使用,但6502指令中的不对称意味着,如果一个或两个内存区域驻留在零页上,X寄存器是更好的选择。
; Move 256 bytes or less in a forward direction
LDX #0 ;Start with the first byte
_LOOP LDA SRC,X ;Move it
STA DST,X
INX ;Then bump the index ...
CPX #LEN ;... until we reach the limit
BNE _LOOP
先移动最后一个字节的对应代码如下:
; Move 256 bytes or less in a reverse direction
LDX #LEN ;Start with the last byte
_LOOP DEX ;Bump the index
LDA SRC,X ;Move a byte
STA DST,X
CPX #0 ;... until all bytes have moved
BNE _LOOP
如果要操作的数据更小(128字节或更少),那么我们可以取消比较限制,同时可以使用DEX指令设置标志位来监测循环是否结束。
; Move 128 bytes or less in a reverse direction
LDX #LEN-1 ;Start with the last byte
_LOOP LDA SRC,X ;Move it
STA DST,X
DEX ;Then bump the index ...
BPL _LOOP ;... until all bytes have moved
要创建一个完全通用的内存传输,我们必须改变使用间接索引寻址访问内存和使用所有寄存器。下面的代码显示了一个前向传输算法,它首先移动完整的256字节页,然后是剩余的较小大小的片段。
_MOVFWD LDY #0 ;Initialise the index
LDX LEN+1 ;Load the page count
BEQ _FRAG ;... Do we only have a fragment?
_PAGE LDA (SRC),Y ;Move a byte in a page transfer
STA (DST),Y
INY ;And repeat for the rest of the
BNE _PAGE ;... page
INC SRC+1 ;Then bump the src and dst addresses
INC DST+1 ;... by a page
DEX ;And repeat while there are more
BNE _PAGE ;... pages to move
_FRAG CPY LEN+0 ;Then while the index has not reached
BEQ _DONE ;... the limit
LDA (SRC),Y ;Move a fragment byte
STA (DST),Y
INY ;Bump the index and repeat
BNE _FRAG\?
_DONE EQU * ;All done