1

所以我试图弄清楚如何绕过LDX没有间接索引选项的事实,但我很不走运。(非常新的汇编程序)我正在使用 LDA (arrPoint), Y 从 int 数组中加载一个获取 MSB,我想使用 LDX (arrPoint), Y 来获取 LSB。

关于如何编写此代码以便可以使用 X 寄存器间接索引的任何提示?

这是我的一些代码,其中 arrPoint 位于内存 $1000 处,而 slask 是 2 个数据字节。

getInt: 
    ASL
    STA $36
    LDY $36
    LDX arrPoint, Y
    INY
    LDA (arrPoint), Y

    RTS

setInt:
    STY slask
    ASL slask
    LDY slask
    STX arrPoint, Y
    INY
    STA (arrPoint), Y

    RTS

谢谢

4

2 回答 2

2

考虑将数组转换为

 uint8_t lsb[N];
 uint8_t msb[N];

允许

LDA lsb, Y
TAX                ;; faster alternative to STA $36 + LDX $36
LDA msb, Y
RTS
于 2013-11-20T20:02:28.820 回答
2

正如迈克尔在 OP 评论中所描述的那样,LAX 是一个很好的解决方案,只要您:

  1. 正在为原始的 NMOS 6502 编写,
  2. 对使用未记录的操作码没有哲学上的反对意见,并且
  3. 不需要保存(或以其他方式保护)累加器 (.A) 内容

LAX 从内存位置加载 .A 和 .X 值,或立即值零(见下文)。寻址模式:

Mnemonic    Bytes       Cycles
LAX #00     AB 00       2
LAX abcd    AF cd ab    4
LAX abcd,Y  BF cd ab    4 (+1 if crossing page boundary)
LAX ab      A7 ab       3
LAX ab,Y    B7 ab       4
LAX (ab,X)  A3 ab       6
LAX (ab),Y  B3 ab       5 (+1 if crossing page boundary)

LAX被记录LAX #nn为缺少立即寻址模式( 4 个周期 ( )。LAX #$00LDA #$00; LDX #$00LDA #$00; TAX

此 DASM 宏注入字节序列以响应自定义助记符(ZAX、零 .A 和 .X):

  MAC ZAX
    DC.W #$00AB ; [2] LAX Immediate Zero (only stable when operand is zero)
  ENDM

这是我编写的文本位图渲染例程的简短摘录,该例程使用 LAX 来索引字节对地址表:

.dodraw LAX (_TEXTADDR),Y   ; [5] get first character of pair from text-buffer
        LDA _CHARTABL,X     ; [4] get first glyph data address lo-byte
        STA _GLYPADD1       ; [3] ZP set first glyph data address lo-byte
        LDA _CHARTABH,X     ; [4] get first glyph data address hi-byte
        STA _GLYPADD1+1     ; [3] ZP set first glyph data address hi-byte
        etc...
于 2013-11-21T10:37:53.333 回答