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