间接索引在X寄存器上 - 汇编器6502

时间:2013-11-20 19:00:40

标签: assembly 6502

所以我试图弄清楚如何绕过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

由于

2 个答案:

答案 0 :(得分:2)

考虑将数组转换为

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

允许

LDA lsb, Y
TAX                ;; faster alternative to STA $36 + LDX $36
LDA msb, Y
RTS

答案 1 :(得分:2)

如迈克尔在OP评论中所述,LAX是一个很好的解决方案,为您提供:

  1. 正在为原始的NMOS 6502写作,
  2. 对使用未记录的操作码没有哲学上的反对意见,
  3. 不需要保留(或以其他方式保护)累积器(.A)内容
  4. 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)但实际上LAX #$00在你想要将.A和.X都设置为零时是稳定且有用的 - 它需要2个字节, 2个周期而不是4个周期(LDA #$00; LDX #$00)或3个字节/ 4个周期(LDA #$00; TAX)。

    此DASM宏注入字节序列以响应自定义助记符(ZAX,Zero .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...
    
相关问题