[譯文]使用VBA-SDL-H尋找圖片

原文地址:http://www.romhacking.net/docs/361/

工具下載:http://www.romhacking.net/utils/297/

ROM下載:這個自行baidu,我承認這方面比google強

 

某些沒翻譯的地方:

術語如sprite, char, tile。如果不懂也不用看這篇文章了。

其他如debugging console,翻譯成調試控制檯也很難過,知道意思就行了。

 

一個簡單的教程 - 使用內存斷點尋找圖片數據

by Labmaster, 24/03/06

(譯註:就是VBA-SDL-H的作者)

 

這是一個很簡短的教程,它將告訴你如何使用VBA-SDL-H尋找圖片數據。之前你需要

瞭解VBA-SDL-H的指令(看一下說明文檔 :p)和一些GBA的硬件知識。有任何問題請

去ROMHacking.net問。


目標:塞爾達傳說 - 縮小帽(標題畫面的Logo)


第一步是尋找圖片在VRAM中的位置,第一處尋找的地方是BG。在普通的VBA中運行遊戲,
打開Map Viewer,看看是否在這幾個BG中。(譯註:此時使用Mode 1,共有3個BG,BG0-2)
在這個例子中,Logo(譯註:The Legend of Zelda, The Minish Cap這幾個字)並
沒有在BG中,那麼肯定在sprite中了。爲了確認這點,打開OAM Viewer,不停移動滾動條
直到發現logo的一部分。

 

現在簡要說一下GBA sprites的基礎知識。它的圖片存放在0x06010000, (OAM數據是
控制sprite位置,放大之類的,存放在0x07000000),現在打開Tile Viewer,然後
選擇0x6010000 char base.這個時候預覽窗口是全黑的,所以試着變化一下調色板,
直到出來些東西。你應該會看到構成logo的tile出現了(有3個不同的調色板,
The Legend of Zelda是紅黃的,The Minish Cap是綠色的,還有劍的調色板)

 

現在我們需要找出來這些數據在ROM中的什麼地方。這時就要用到VBA-SDL-H的內存寫入
斷點了。隨便點擊構成logo的tile(比如說Z的左上角)。Tile Viewer會告訴你它的
內存地址 - 06013020。

 

用VBA-SDL-H打開遊戲,讓intro運行,只要在logo出現前停下即可(打開Tile Viewer,
勾上Automatic update,可以看到intro運行期間logo並沒有寫入到VRAM中)。進入到
debugging console,輸入以下命令下一個內存寫入斷點:

 

bpw 06013020 20

 

這條命令對06013020起始的20字節下了寫入斷點,其實對多少字節下斷並不重要(你可以
設成1)。繼續遊戲,不一會兒會斷下,顯示如下:

Breakpoint (on write) address 06013020 old:00000000 new:00000000
Breakpoint (on write) address 06013024 old:00000000 new:00000000
Breakpoint (on write) address 06013028 old:00000000 new:00000000
Breakpoint (on write) address 0601302C old:00000000 new:cccc0000
Breakpoint (on write) address 06013030 old:00000000 new:eeccc000
R00=84000580 R04=00000004 R08=00000000 R12=03000090
R01=84000000 R05=00000030 R09=00000000 R13=03007ecc
R02=040000d4 R06=03001000 R10=00000000 R14=080addcf
R03=020244c4 R07=00000000 R11=00000000 R15=080adf40
CPSR=8000003f (N.....T Mode: 1f)
080adf3e  6890 ldr r0, [r2, #0x8]

 

我們怎麼知道這個斷是對的?如果你之前打開Memory Viewer觀察過06013020的話,應該
知道的確是這些值。現在我們需要知道的是哪條指令觸發了這個斷點。在Diassembly
Viewer中,跳轉到080adf3e,然後向上找找,觸發這個斷點的指令就是緊鄰080adf3e
上面的那條:

 

080adf3c  6090 str r0, [r2, #0x8]


這條指令將r0的值寫入到r02 + 0x8所指的地址中。你如果瞭解GBA IO寄存器就方便
多了。r02的值是0x040000d4,是控制DMA傳輸的寄存器(如果你不知道DMA是啥,放
狗搜吧)。0x040000D4 + 0x8 = 040000DC,這條指令寫入了一個word,這就對應了
兩個寄存器,DMA通道3的字數寄存器和控制寄存器。(我怎麼知道的?GBATEK是
對GBA Hacker來說最有用的資料了)。DMA通道3的源地址寄存器是0x040000D4,所以
我們用下面這條指令看看它的內容:

 

mw 040000d4 (譯註:偷懶點的話mw r2也行)

 

顯示如下:

040000d4 088d6760 06013000 04000000 00000000 `g...0..........
040000e4 00000000 00000000 00000000 00000000 ................
040000f4 00000000 00000000 00000000 0080fd44 ............D...
...



數據來源自088D6760,注意到下一個word的值是06013000,看起來眼熟吧,這是目標
地址(040000d8是DMA通道3的目標地址寄存器)。

 

這篇短文到此就結束了。如果這篇東西你看起來不知所云,那你還是去買點更簡單的
文章看吧。

 

致尊貴的買家(譯註:老外也搞購買帖):儘管上至下斷爲止的步驟對大多數遊戲都是
通用的(只不過你用Tile Viewer找的話,圖片可能在另一個Character bases中),
但是各個遊戲將數據寫入VRAM的方式是不同的。有些可能使用Software Interrupt (SWI)
去複製或者解壓ROM裏的數據,有些還可能有自制的解壓函數去解壓圖片(有些直接
寫入到VRAM,有些寫入到WRAM,然後再用DMA或者SWI複製到VRAM,甚至用stmia/ldmia
指令來複制),所以這些都要靠你來分析斷下前發生了什麼。我會再寫一些針對其他遊戲
的類似教程,這樣你就能瞭解這些可能的工作方式。(譯註:但是坑了)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章