我正在开发一个 Gameboy 模拟器,我已经在 ROM 中获得操作码0xD1
(弹出DE
堆栈)但堆栈为空(没有推送任何值)。所有未知的操作码都返回错误,所有其他指令似乎都工作正常。
这是我的编程错误,ROM,还是这只是程序设置为的快速DE
方法0x0000
?
即使没有值被PUSH
写入堆栈,POP
也会将存储在地址中的值检索SP
到指定的寄存器对中,并将SP
增加2
.
在您的示例中,如果SP
已初始化为 ,wD000
并且 WRAM 已0
预先初始化为 ,POP DE
则将有效地加载0
到DE
,并增加Stack Pointer
by 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
.