2013-11-20 37 views
1

所以我想弄清楚如何绕过LDX没有间接索引的选项,但我都运气不好。 (漂亮的新汇编) 我使用LDA(arrPoint),Y加载从int数组中获取MSB,我想使用LDX(arrPoint),Y获取LSB。间接索引在X寄存器 - 汇编6502

关于如何写这个的任何提示,以便我可以使用间接索引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

如果你不介意捣毁了'A'注册就可以使用无证指令'LAX(arrPoint),Y'(中加载相同的值'A'和'X')。如果汇编程序不支持无证指令,则操作码为“$ B3”。 – Michael

+0

好吧,好像我不能使用LAX,但是我不可能先将一个字节装入Accumilator,然后写入TAX将其传送到X寄存器,然后将第二个字节装入Accumilator? –

+0

如果我的计数正确,'LAX'是1个字节,比'LDA' +'TAX'少1个周期。但除此之外,这将是同样的事情。 – Michael

回答

2

考虑阵列转换到

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

允许

LDA lsb, Y 
TAX    ;; faster alternative to STA $36 + LDX $36 
LDA msb, Y 
RTS 
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),但实际上,当你想既u和.X设置为零LAX #$00是稳定的和有用的 - 它需要2个字节,2周期而不是每个(LDA #$00; LDX #$00)中的4个或3个字节/ 4个周期(LDA #$00; TAX)。

这DASM宏注入的字节序列响应定制助记符(ZAX,零u和.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...