gbz80 - IF语句

时间:2017-03-02 04:16:43

标签: if-statement machine-code gameboy

我正在使用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)。

非常感谢任何帮助。

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

1 个答案:

答案 0 :(得分:0)

请勿使用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
...