Эмулятор Gameboy выталкивает пустой стек

Я работаю над эмулятором Gameboy, и я достиг точки в ПЗУ, где я получаю код операции 0xD1 (извлекаю DE из стека), но стек пуст (в него не было помещено никаких значений). Все неизвестные коды операций возвращают ошибку, а все остальные инструкции работают нормально.

Это ошибка в моем программировании, в ПЗУ, или это просто быстрый способ для программы установить DE в 0x0000?


person TheAbelo2    schedule 25.10.2015    source источник


Ответы (1)


Даже если значение не было 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.

person Méga Lag    schedule 26.10.2015
comment
Спасибо, четкий и краткий ответ, который решил мою проблему! - person TheAbelo2; 26.10.2015