MOS 6502

时间:2017-09-17 09:15:42

标签: assembly 6502

我正在研究here中的MOS 6502指令集的寻址模式。

indirect, Y-indexed的描述与其他来源有点不一致。

它说

  

OPC($ LL),Y操作数是有效地址,增加Y ,带进位;有效地址是zeropage地址的单词

但是其他来源没有提到带有进位的添加。与here一样。

计算有效地址的正确方法是什么?

1 个答案:

答案 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处的单词为0280Y0090,其加法为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;
}