2015-10-25 2 views
2

Я работаю над эмулятором Gameboy, и я достиг точки в ROM, где я получаю код 0xD1 (pop DE off stack), но стек пуст (значения не были нажаты на него). Все неизвестные коды операций возвращают ошибку, и все остальные инструкции работают нормально. Так что же это делать? Это ошибка в моем программировании, ROM, или это просто быстрый способ для программы установить DE на 0x0000?Gameboy Emulator pop off empty stack

ответ

5

Даже если никакое значения не был 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 инструкция выталкивает адрес возврата в стек, и декрементирует SP по 2. Точно так же RET извлекает адрес из стека и увеличивает SP на 2.

+0

Спасибо, ясный и лаконичный ответ, который решил мою проблему! – TheAbelo2