1

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

任何帮助将非常感激。

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

4

1 回答 1

1

不要使用 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
...
于 2017-03-02T10:49:36.907 回答