所以我试图弄清楚如何绕过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
由于
答案 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是一个很好的解决方案,为您提供:
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...