我正在研究here中的MOS 6502指令集的寻址模式。
indirect, Y-indexed
的描述与其他来源有点不一致。
它说
OPC($ LL),Y操作数是有效地址,增加Y ,带进位;有效地址是zeropage地址的单词
但是其他来源没有提到带有进位的添加。与here一样。
计算有效地址的正确方法是什么?
答案 0 :(得分:7)
如果有疑问,最好查看官方文档 MOS here有一个引人入胜的原始数据表 也是[1] ,内容为
间接索引寻址 - 在间接索引寻址(称为
( Indirect) , Y
)中,指令的第二个字节指向第0页的内存位置。
该存储单元的内容被添加到Y
索引寄存器的内容中,结果是有效地址的低位8位。
此添加的进位已添加到下一页零的内容 存储器位置,结果是有效地址的高8位。
所以第二次添加是在携带时进行的
您可以将此视为在Immediate
指向的16位字(在little-endian中)和Y
寄存器零的内容扩展到16位之间的16位加法。
例如,如果内存和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
会产生值0390
的有效地址。
您可以看到,当被视为16位数时,0处的单词为0280
而Y
为0090
,其加法为0310
,符合预期。
长描述只是编码这些事实:a)Indirect
指向的16位字存储在小端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;
}