emulation - Gameboy 模拟器弹出空堆栈

标签 emulation gameboy

我正在开发一个 Gameboy 模拟器,我已经在 ROM 中获得操作码 0xD1 (pop DE off stack) 但栈是空的(没有值被压入栈中)。所有未知的操作码都会返回错误,所有其他指令似乎都可以正常工作。

是我的程序、ROM 中的错误,还是这只是程序设置 DE 的一种快速方法?至 0x0000 ?

最佳答案

即使没有值已经 PUSH编辑到堆栈,POP将检索存储在 SP 中的地址处的值到指定的寄存器对,和 SP将增加 2 .

在您的示例中,如果 SP已初始化为,例如 wD000 ,并且 WRAM 被初始化为 0事先,POP DE将有效加载 0DE ,并增加 Stack Pointer来自 2 .

21 00 C0         ld   hl,C000       ;Start of WRAM
01 FF 1F         ld   bc,1FFF       ;Length of WRAM
AF               xor  a             ;a = 0
22               ldi  (hl),a        ;Blanks WRAM
0B               dec  bc
78               ld   a,b
B1               or   c
20 F9            jr   nz,0158       ;Loops until WRAM is cleared
21 00 D0         ld   hl,D000
F9               ld   sp,hl         ;SP = 0xD000
D1               pop  de            ;de = 0x0000, SP = 0xD002

另外,请注意 CALL指令将返回地址压入堆栈,并递减 SP来自 2 .同理,RET从堆栈中检索地址,并增加 SP来自 2 .

关于emulation - Gameboy 模拟器弹出空堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33334734/

相关文章:

javascript - Cordova - 如何在 Android Emulator 中查看错误和 console.log

nfc - 支持 HCE 的设备列表?

java - Xlet(javax.microedition.xlet)开发的启动步骤是什么?

emulation - GameBoy 16 位加载到 8 位内存

c - 无法在 C 中定义宏 - Initializer 元素不是常量

C 中的 CHIP8 - 如何正确处理延迟定时器?

Android模拟器sdcard权限

intel - Z80 处理器可以运行 Gameboy 游戏吗?

c - GBDK C 中 typedef 结构的前向声明

assembly - GameBoy ISA(编写模拟器)