我从这里查看MOS 6502 指令集的寻址模式。
的描述indirect, Y-indexed
与其他来源有点不一致。
它说
OPC ($LL),Y 操作数是由 Y 递增的有效地址,带进位;有效地址是零页地址处的字
但是其他消息来源没有提到带有进位的加法。喜欢这里。
计算有效地址的正确方法是什么?
如有疑问,最好查看官方文档。此处
还有一份来自 MOS 的引人入胜的原始数据表[ 1 ],内容如下
INDIRECT INDEXED ADDRESSING - 在间接索引寻址(称为
( Indirect) , Y
)中,指令的第二个字节指向页面零中的内存位置。
该内存位置的内容被添加到变址寄存器的内容中,结果是有效地址Y
的低八位。这个加法的进位被添加到下一页零存储器位置的内容,结果是有效地址的高八位。
所以第二次加法是通过携带进行的。您可以将其视为(在little-endian中)指向的 16 位字与扩展为 16 位的寄存器零 的内容
之间的 16 位加法。Immediate
Y
例如,如果内存和Y
是
All values in hex
Address 00 01 02 03 04 ...
Value 80 02 f3 00 03 ...
Y = 90
然后(0), Y
是
low 8 bits: 80 + 90 = 10 (with carry = 1)
high 8 bits: 02 + 00 + 1 = 03
给出有效地址0310
。同样(3), Y
是
low 8 bits: 00 + 90 = 90 (with carry = 0)
high 8 bits: 03 + 00 + 0 = 03
这导致 value 的有效地址0390
。
您可以看到,当考虑 16 位量时,0 处的字 is0280
和Y
is 0090
,它们的相加0310
符合预期。
长描述只是对这些事实进行了编码:a) 所指向的 16 位字Indirect
存储在小端 b)Y
是零扩展 c) 加法是 16 位的。
在 C 中,它应该看起来像这样
uint16_t effective_addr(uint8_t indirect)
{
//Take the INDIRECT immediate and make a pointer to a 16-bit LE word out of it
//In C int-to-ptr is implementation define, we assume an identity map here
uint16_t* page_zero_ptr = (uint16_t*)indirect;
//The Y register is 8-bit, we consider it a 16-bit one instead
//Assume y is of unsigned type
uint16_t y_zero_ext = y;
//Do a 16-bit addition, this is equivalent to two 8-bit additions with carry
return *page_zero_ptr + y;
}