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
上一篇下一篇

猜你喜欢

热点阅读