我正在使用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)。
非常感谢任何帮助。
如果你能向我解释你提供的陈述是如何运作的,那就太好了。机器代码对我来说很陌生。
答案 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
...