Gameboy 模拟器弹出空堆栈

Gameboy Emulator pop off empty stack

我正在开发 Gameboy 模拟器,我已经在 ROM 中获得了操作码 0xD1(从堆栈弹出 DE)但堆栈为空(没有值已被推到它上面)。所有未知操作码 return 一个错误,所有其他指令似乎工作正常。

是我的程序、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 指令将 return 地址压入堆栈,并将 SP 递减 2。同理,RET从栈中取出地址,将SP增加2