2017-03-02 88 views
0

我在Zmart上對VisualboyAdvance做了一些編碼,我不知道如何做任何形式的IF語句。gbz80 - 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

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