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
...
我正在 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
...