我正在尝试用C#复制Javidx9的NES / MOS6502 CPU代码,这是一次学术练习,但我很难理解零页面寻址模式的实现背后的逻辑。具体来说,我正在查看此code:
// Address Mode: Zero Page
// To save program bytes, zero page addressing allows you to absolutely address
// a location in first 0xFF bytes of address range. Clearly this only requires
// one byte instead of the usual two.
uint8_t olc6502::ZP0()
{
addr_abs = read(pc);
pc++;
addr_abs &= 0x00FF;
return 0;
}
我很难理解为什么addr_abs &= 0x00FF;
存在,uint16_t addr_abs
是16位,但是uint8_t read(uint16_t a);
无论如何都会返回一个8位值,因此默认情况下高8位(MOS6502是低位优先)将被00掉吗?我是否缺少有关C编译器/ x86 ISA的工作方式的信息?
您是正确的addr_abs &= 0x00ff
不需要。
uint16_t x = n
,其中n
是无符号的8位数字(在这种情况下)。 x
会将其高8位清除。如@tadman所述,以前可能使用了另一种方法将值存储到addr_abs
中,但并未清除高8位。