gbz80 - IF 语句

gbz80 - IF statements

我正在 VisualboyAdvance 上用 Z80 编写一些代码,但我不知道如何执行任何类型的 IF 语句。

我制作了一个脚本来增加屏幕上从 0xC3A0 开始的每个图块的值。屏幕数据结束于0xC507.

我的代码如下:

    d322|21A0C3|LD HL,C3A0h
    d325|34    |INC (HL)
    d326|23    |INC HL
    d327|00    |NOP
    .
    .
    .
    d340|00    |NOP
    d341|C325D3|JP D325h

如您所见,它不断循环并最终通过增加核心功能使游戏崩溃。我想要一种方法让它在 HL 达到 0xC507 时使用 0xC9(Ret)。

如有任何帮助,我们将不胜感激。

如果你能向我解释你提供的语句是如何工作的,那就太好了。机器码对我来说很陌生。

不要使用 Visual Boy Advance。

它的Game Boy仿真精度非常差,尤其是内存访问时序,这对许多商业ROM来说是个大问题:http://gbdev.gg8.se/wiki/articles/Test_ROMs#Emulators_running_on_desktop_computers

它也有很多安全漏洞。堆栈缓冲区溢出让攻击者控制您的机器。这是其中之一:https://youtu.be/L-L8qWpd_74

使用 BGB 来满足您的调试需求,它具有出色的调试器并且准确性非常好。

退出循环的条件必须在跳转指令上完成,像这样:

01 67 01         ld   bc,0167            ;0xC507 - 0xC3A0
21 A0 C3         ld   hl,C3A0            ;start of the area we wish to increment
:loop_start
34               inc (hl)                ;(hl) ++
23               inc hl                  ;hl ++
0B               dec  bc                 ;bc --
78               ld   a,b
B1               or   c
20 F9            jr   nz,[loop_start]    ;if(bc ≠ 0), loop to :loop_start
...