【问题标题】:Gameboy Processor LR35902 Opcode 0x08 MeaningGameboy 处理器 LR35902 操作码 0x08 含义
【发布时间】:2016-07-14 10:36:50
【问题描述】:

谁能解释一下操作码0x08 在 LR35902 处理器上的作用。助记符是LD (a16),SP

我很困惑,因为堆栈指针是一个 16 位值,但 (a16) 是一个只能存储 8 位的地址(我认为!)。我可以猜到前 8 位被放置到 (a16) 中,下一个被放置在它们旁边,但我想确认一下。

【问题讨论】:

    标签: z80 gameboy


    【解决方案1】:

    是的,该操作码将 SP 值放在地址 (a16) 中。下面是它的样子:

    void MemoryWrite(uint16_t addr, uint8_t value);
    
    MemoryWrite(a16, SP & 0xFF);
    MemoryWrite(a16 + 1, (SP & 0xFF00) >> 8);
    

    因为它是一个 little-endian 处理器,所以您将最低有效字节放在首位。

    【讨论】:

    • 感谢 Creker,感谢!
    • MemoryWrite((a16 + 1) & 0xFFFF, (SP & 0xFF00) >> 8);
    • 我认为没有必要。首先,不要认为有人会制作一个写入地址会溢出 uint16_t 的游戏。此外,它会覆盖看起来不像的堆栈。其次, uint16_t 无论如何都会环绕,这不是未定义的行为。
    • @creker 正确!在执行LD (0xFFFF), SP 时,内存位置0xFFFF 将具有SP 最低有效位。内存指针回绕,CPU 将尝试写入内存位置0x0000。什么都不会发生,因为 0x0000 是只读的。
    • @GabrielOshiro,好吧,不是只读的。它不会覆盖任何内容,但可能会触发 MBC。您可能知道,MBC 是通过写入只读地址进行编程的。例如,写入 0x0000 将触发 MBC1 中的外部 RAM 并触发 MBC3 中的 RAM/RTC。但是模拟器无论如何都不应该检查。你按照 ROM 告诉你的去做。
    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 2023-03-13
    • 2017-05-12
    • 1970-01-01
    • 2015-02-04
    • 2017-10-14
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多