DS ROM深度HACK教程--動態調試操作掛鉤篇 by tring

最近因爲方向鍵壞掉~又想玩RY傳說~於是開始着手研究DS的操作掛鉤~
簡單點說~就是把RY傳說這個本來不能用觸摸的遊戲改成全程觸摸版~


〇,修改必備
1,必備工具:IDEAS模擬器(本人用的1020版~因爲速度比1024快~),16位修改器,靜態反彙編工具,編譯工具
之所以要IDEAS是因爲在主流模擬器裏只有IDEAS提供免費的調試功能~雖然十分的簡陋(可以說啥功能都沒有)~但是總比沒有要強幾倍~
16位修改器和靜態反彙編工具~本人推薦用CT2的那個專爲DS ROM優化後的版本~那個版本直接支持ARM指令反彙編~

一,思路分析
要掛鉤操作無疑要做以下幾件事情
1,找到按鍵的程序可識別地址
2,找到觸摸屏的程序可識別地址
3,找到合適的地方下斷
爲了解決前2項問題~首先想到的最簡單的方法當然是用EC直接搜~

二,EC搜索
相信有一定模糊搜索基礎的人可以很快找到方案來搜索按鍵判定和觸摸判定~也就是說~這個步驟理論上來說應該是一點難度沒有的可以快速解決的~可是事實上的情形卻複雜的多~
1,按鍵部分:用EC順利搜索出幾個地址表現出按鍵的變化~但是試着鎖定後發現~無論哪一個都無法對遊戲內容產生影響~也就是說用EC搜到的這幾個變量僅僅是程序可表現的~而非程序可識別的~簡單點說就是你可以看他來判斷按了啥鍵~但是不能通過改變他來改變按的鍵~
2,觸摸部分:用EC直接啥都搜不到~
在按鍵和觸摸2個方面皆碰壁~給人的唯一結論是~用這種只就其表不問其根的方法來搜索本質就行不通~於是下面俺開始介紹文章的正式部分~
通過DEBUGGER來動態調試ROM~

三,關於DS的輸入識別所必須具備的知識
別以爲這個只是科普講座~這個可是後面DEBUG過程中最重要的依據~所以請仔細看過這段~

DS是由2個處理器同時處理程序的系統~ARM9爲主處理器~ARM7爲協處理器~ARM9用來處理遊戲的絕大部分信息~而ARM7輔助處理聲音~I/O等一些底層信息~
關於ARM9和ARM7的分工我暫不多說~但是需要注意的是~在很多底層方面的東西ARM9是無法正常訪問的~

接着說說DS的按鍵和觸摸屏輸入的過程~
按鍵部分~DS有一個16位的只讀按鍵寄存器~其作用就是識別按鍵並將按鍵信息存放其內~而這個寄存器映射在內存空間上的地址是0x04000130 意思就是說~遊戲只要檢查這個地址的值~就可以很輕鬆的判定所按的鍵了~
不過事實上還少許有一點麻煩的部分~就是這個寄存器所對應的鍵並不是DS上的全部鍵~X,Y鍵並未被對應在這個寄存器中~而是另外一個入口爲0x04000136的只讀寄存器~有趣的是~這個寄存器除了對應X,Y鍵以外~還對應了觸摸屏的狀態~也就是說要檢查觸摸屏也是要訪問這個寄存器的~

或許你會說~那麼只要檢查這2個寄存器豈不就可以很輕鬆的獲得按鍵和觸屏信息了~
但是事實上有2點問題~
1,這2個寄存器都是隻讀寄存器~也就是說雖然可以得到信息~但是仍然改不了~
2,最煩躁的問題在於~0x04000136這個寄存器是僅能由ARM7訪問的~而通常遊戲的程序是寫在ARM9當中的~……

因此現在面臨的問題就是:X,Y,觸摸屏無法通過ARM9訪問~
那麼現在那麼多DS遊戲又是怎樣訪問這些部分的呢~
其實很簡單~在ARM7程序中會有一部分代碼專門用來處理這個寄存器~並將按鍵和觸摸信息插入一個叫IPC的共享內存結構中上報給ARM9
也就是說這樣問題就轉換到了尋找IPC地址和按鍵識別程序所處地址了~

四,調試程序必備知識
這一段不同於上面一段主要介紹理論~這部分主要要介紹的是調試一個程序所常常會用到的一些操作技巧~

作爲一個調試器(DEBUGGER)最重要的幾個功能在於:
1,跟蹤 2,下斷點 3,動態修改狀態
然而IDEAS提供的這個免費DEBUGGER很不幸的少了最方便的一個功能~下斷~……
這無疑會給我們的工作帶來很多不必要的麻煩~但是這些麻煩往往也並非不可解決~

接下來我要講講調試最基礎操作~跟蹤~所具有的一些技巧~
1,步入:簡單的來說就是順着程序的正常流程一條一條的往下執行~這個流程包括跳轉和調用~這是任何一個調試器都肯定具備的功能~(IDEAS對應快捷鍵F8)
2,步過:這個在大致上~和上面一種差不多~但是有個很根本的區別:步過的話在碰到調用指令的時候並不會跟蹤進入所調用的函數~而是一次執行完該函數~在調用指令的物理下一行才停止下來~事實上這種跟蹤模式比起步入來說~用的更加廣泛~
但是十分不幸的是~……IDEAS又沒有步過功能~……所以這時候我們就要找到代替手段~

IDEAS除了步入以外~唯一提供的一個功能是~運行到指定行~(對應F6)
這個功能可以簡單的理解爲在光標所指定的地方下一個斷點~然後放程序運行~當運行到指定地方的時候~自然就會被斷下~這個功能是唯一取代下斷的方法~不過遺憾的是~這樣全程序就只能下一個斷點~很多邏輯結構就無從分清~
另外這個功能還可以用來事先步過~在跟蹤看到調用命令時(ARM裏的調用命令是bl *****)將光標指定到該命令下一行~然後F6~然後就順利步過了~

五,開始着手實際調試吧~
對於一個剛剛上手的程序~我們對其結構~特徵地址~重要子程序~重要內存標示~都一無所知~所以我們需要選擇一個儘量單純的和確定性的地方開始我們的調試~
按照經驗來說~最符合這個條件的地方便是程序的開頭~

先試試一路步過~讓程序跑跑會怎樣~
一路F8,F6~在順利通過幾個調用指令後~出現了異常情況~:某個調用指令一步過後遊戲的開頭LOGO便播出來了~這便說明~OP的處理程序在這裏調用的那個子程序之中~因爲OP中有識別A鍵跳過LOGO的功能~所以就是說在這段OP程序裏肯定能找到我們需要找的按鍵識別程序~
記下這個調用指令的地址和調用的地址~重置調試器~直接F6到該指令~然後F8步入~

繼續對於子程序內的代碼步過~發現需要的內容後便步入~並一路記錄進入的地址~
最後可以找到一個子程序~在LOGO顯示出來後~遊戲調用這個子程序~對其直接步過的話~進入一段時間的延時~而且延時中途可以按鍵取消~
很顯然這個就是我們要找的程序了~

大致記錄一路過來的地址~大致會像這樣~:

最後這行的調用便是延遲部分了~

六,尋找按鍵輸入識別程序
剛纔的部分我們找到了開頭LOGO裏的延時程序~接下來我們要從這段程序裏找到按鍵識別用的程序~
前面之所以要從開頭下手~就是因爲在這段相對單純的LOGO處理程序裏找我們的目標~肯定比在遊戲進程中找要來的簡單的多~

要找東西~就要有明確的標誌來告訴我們~要找的東西究竟是還未到~還是已經過了~因爲這次我們是在延遲程序裏搜按鍵的處理程序~所以當然是看延遲是否跳過來判斷按鍵處理程序的位置了~

具體的操作比較有意思:
從延遲程序開始~一路往下F8~看到bl,blt等調用指令的時候停住~把光標落到下一行準備步過~這個時候按住模擬器設定的DS的A鍵位~然後再按下F6~然後鬆開A鍵~這樣~如果按鍵識別程序是在步過的這個調用裏的話~那麼馬上F5放開程序任其運行~應該遊戲就馬上跳過LOGO了~相反~如果說要找的那程序不在這段調用裏~那麼F5放行後~應該還照常有一段延遲~LOGO纔過去~
因此很方便就能判定按鍵識別程序是否在這某個調用裏~一路用這個方法找進去~並且記錄下地址~應該就能像以下這樣~

最終發現~就是以上的最後一行~在對於按鍵的檢測起作用~這行的意思是:
把r2寄存器所指定的地址的內容讀入r12寄存器~而r2的內容就是上面那行所指定的0x0400130
這樣便清晰了~這條就是讀按鍵寄存器4000130來檢查按鍵的語句了~
無疑~只要在這裏下斷放入我們的修改程序~雖然不能改變4000130的內容~但是隻要竄改r12的內容~對於後面程序的影響也無異於改按鍵了~所以這個地址就是我們HACK ROM的入口地址了~請一定記住~

但是相信稍微有點DS程序經驗的人看到這個地址一定會覺得十分的奇怪~按道理來說~DS的內存空間是從地址0x02000000開始的~但是這個程序的地址卻是0x01ff84f8~居然在內存空間之前~
其實這個地址所在的區域叫做ITCM 簡單的說~就是DS所提供的一塊高速緩存~因爲只靠一味提高CPU主頻速度來增加代碼的運行速度~只能導致嚴重的發熱和耗電問題~這個對於掌機是十分不利的~所以滑頭的老N在DS裏提供了大量的高速緩存部分用以存放一些需要頻繁訪問的內容~以上這段按鍵識別命令無疑符合這個前提~所以被載入了ITCM而非內存中~
那麼這段代碼本來如果要線性載入會被載入哪裏呢?~這個問題關係到修改ROM的時候要在ROM文件的哪裏來找這個代碼的問題~
解決方法是~隨意找一段該部分的16進制代碼~然後在CT2中搜索~搜到後~切換到反彙編模式~這時候看到的這個代碼前面對應的地址就是線性載入時候對應的地址了~俺前面那個記錄裏括號裏的(20a1ff8)就是這個線性地址~

不過這樣只是解決了除了X,Y以外的其他按鍵的問題~那麼X,Y和觸摸屏的問題如何解決呢?~

接着我們順便看看剛纔找到的那段識別按鍵的代碼~

這裏的第1和第3行就是剛纔分析的讀4000130的代碼~相信大家都注意到這裏第2和第4行~形式和1~3差不多~功能就是讀取0x027fffa8這個地址的內容到r3~
基於這裏是按鍵識別程序~而且4000130只能讀出部分按鍵~不難猜測出~這個27fffa8定然是用來讀取剩下的X,Y按鍵的地址~
繼續分析這個地址~27fffa8~和4000130一樣~都不在正常的內存空間之內~但是4000130是I/O寄存器~而這個27fffa8所在的地方是DS內一段ARM7與ARM9共享的內存區域~也就是說~這裏的數據通常都是用於ARM7和ARM9通信之用的~
那麼結合我前面介紹的基本知識~不難得出結論~這個27fffa8所在的地方必然是通信用IPC結構的地址~

用上面的方法~我們無法找到觸摸的識別程序或者識別地址~因爲遊戲裏沒有任何一個部分會對觸摸進行實際響應~
但是通過上面的部分~我們找到了IPC結構的地址~這個非常重要~因爲X,Y鍵信息是和觸摸屏信息一起被放入IPC的~所以觸摸信息必然在27fffa8周圍~
(而且最重要的一點在於~似乎不同ROM~不同遊戲所用的IPC結構都是一模一樣的~也就是說在共享內存中的地址都是一樣~這個對於其他ROM的調試來說~無疑是找到了一條超便利的捷徑~)

通過按下X,Y鍵~觀察IPC中的數據變化~很快找到了按鍵與那個地址內容的對應情況~但是讓人十分費解的一點是~無論如何點擊觸摸屏~對於該塊數據都毫無影響~
難道說是之前的推論錯誤嘛?~顯然應該不是這個原因~真正的原因在於~由於RY傳說從頭到尾都沒有使用過觸摸屏~所以這個功能根本一開始就被封印了~……

七,研究觸摸~就需要研究能觸摸的遊戲~
剛纔的研究無疑收穫不淺~相當多有用的信息都順利得到~甚至可以說除了觸摸以外的所有問題都順利解決了~但是無法忽視的是~那個結果確實也給人當頭一棒~:
RY傳說壓根就沒有觸摸識別程序~……

爲了確認這點~並且深度研究觸摸的作用過程~當然我們首先需要的就是一款能夠觸摸的遊戲~我選用的是過去的一款電擊文庫~因爲是單純的電子小說~所以代碼應該相對比較簡單~而且該遊戲是支持全程觸摸的~

打開遊戲~隨意運行下後暫停在開始的標題菜單選項那裏~其實放哪裏都無所謂~只是我覺得這裏因爲只要不點中選項可以一直保持狀態~所以很方便~
先F5放行~隨意點住觸摸屏上一個點~然後F4暫停~因爲剛纔我們已經找到IPC地址了~所以這次當然省掉了不少麻煩的步驟~直接將內存觀測窗切到27fff80來觀察一下這部分數據~
就算一次看不出來~多點幾次也能很快發現~原本在RY傳說裏對應XY識別的27fffa8,a9兩格之後是一串00的~但是這次後面4格里卻有了數據~
在不點觸摸屏的時候是 00 00 00 06 而當點住後便是 ** ** ** 01 上面**之處的數據稍微分析下可以發現 *a b* cd 01 裏面 ba 組成X軸座標 cd 組成Y軸座標~而最後那個01當然就是指的觸摸屏被按下的狀態~

到此~關於觸摸的IPC也找到了~欣然以爲問題都解決了?~可是面前還有個超嚴峻的問題~……RY傳說的觸摸屏可是被關閉的啊~……
爲了解決這個問題~俺的第一反映是去ARM7裏找答案~

八,對於ARM7的種種研究
因爲要研究觸摸屏~所以依舊使用電子小說的ROM~將調試器切換到ARM7模式~F5放行一下~不同於ARM9~並不會有什麼明顯的反映~

隨意暫停一下~會發現有很大機率程序會停在BIOS段裏的一個返回指令bx lr上~而且雖然lr寄存器有值~但是無論怎麼F8~都無法繼續跟蹤~這種現象叫做軟中斷簡稱swi~是底層程序所慣用的一種手段~暫時不用深究~

偶爾暫停會停在可以跟蹤的地方~這時候一路遇見bl就F6步過~遇見bx lr就F8跟出~應該很快就可以跟蹤到一個循環執行的程序~找到循環後記下其實和循環跳轉的地址~然後再多試幾次暫停~

非常奇怪的是有一點~似乎暫停後跟蹤到的主循環~還有很多不同版本~……可能幾次跟蹤出來的循環的地址和內容都不同~而且每一個循環都無疑是最外層主循環~沒有跳轉出去的指令~

因爲之前已經記錄下地址~所以用F6分別到不同的循環進行功能考察~
具體做法其實也很簡單~因爲ARM7是直接訪問硬件~然後把信息寫入IPC的~所以只用故意竄改IPC的內容和實際不符合~然後觀察何時被修正回來~就知道起作用的指令在哪裏了~因爲我們要考察的是觸摸屏~所以選擇了27fffad這個地址~因爲這個地址在沒有觸摸的時候爲06有的時候爲01~
在循環之初把該地址強制設定爲01~然後對每一個bl調用都F6步過~因爲現在的狀況是沒有觸摸的~所以一旦到達觸摸判定的程序~必然會導致該地址由01變成06~

對於幾個循環都分別測試後~發現了很奇怪的結論~
大多循環在循環的過程中01都會變成06~但是時機卻完全沒有一點規律~在每一個bl處都有可能會變掉~……
不過有奇怪的當然也會有正常的~在找到的幾個循環裏有一個~他的01到06的切換是非常嚴格的符合在某個調用語句內的~順着這個調用一路找~最終不難找到了ARM7真正的識別觸摸屏的程序~

這個循環不但處理觸摸~按鍵的處理也在這裏完成~無疑~這個循環就是ARM7的輸入處理程序了~

因此抱着試一試的心態~俺把這個電子小說的ARM7給替換了RY傳說原本的ARM7~然後調試替換後的RY傳說的ROM~

遊戲在載入後存檔處有點不順(卡在初始存檔那)~這個是換ARM7在模擬器上經常出現的症狀~而且我們在乎的也不是這個~於是無視就可以了~

進入調試模式~看IPC~……非常遺憾~在本應該是觸摸信息的那個地方依舊是一串00~……於是~繼而切換到ARM7調試模式~找到剛纔的那個輸入處理循環~F6~下斷~等着程序暫停到那裏方便研究~可是一等不停~二等不停~……事實上就是根本不會停在那裏~……結論是~這個循環壓根就沒被執行~……
爲什麼?~明明這個ARM7在之前的ROM裏會很好的處理觸摸~爲啥在RY傳說裏就根本不執行那段了呢?~

於是俺找到原RY傳說的ARM7~對一些特徵指令進行搜索後驚訝的發現~雖然地址和極小部分細節不同~但是其實原ARM7裏也有處理觸摸的那段程序~不僅如此~可以說2個ARM7除了一些無關緊要的細節和程序對應的地址有差異以外~根本就是一模一樣的~……也就是說決定那段代碼是否運行的~是ARM7的代碼之外的其他某些原因~……

爲了搞清這個外因是什麼~我們再回到對電子小說的ROM的研究~
之前研究ARM7~一直是從中途來找循環的~這次我們從開頭開始~
因爲ARM7的代碼十分有趣~雖然剛進入程序的時候是被載入在2380000開頭的區域的~但是跟蹤一段後~會發現前面的部分爲類似解壓的功能~將真正的arm7代碼載入到3800000開頭的一段區域裏~
繼續跟蹤一段後~終於進入了主循環~這次的主循環是真正意義上的ARM7根循環~不同於前面找到的那些~某種程度上只是中斷調用~
讓我們看看主循環的代碼~除了幾個無關緊要的數據處理程序外~有一個調用十分有趣~這段代碼裏起作用的只有一句~
3804502: swi 0x06
這個swi語句~就俺來說是十分陌生的~上網GOOGLE了一番後得知~這個就是ARM的軟中斷調用指令~而swi 06具體對應的功能是swiHalt~也就是暫停~……
也就是說對於主循環來說~他真正在做的事情~只是維護少部分數據~然後暫停進程~並進入等待~等待其他中斷處理程序給他解禁~……

事到如此~貌似一點進展都沒有~依舊沒能搞清楚~究竟是什麼原因導致重要的觸摸循環沒被執行~但是事到如此~卻有個非常暴力的解決方法~:在ARM7主循環裏強制插入對觸摸識別程序的調用~

3803c90(0238be78):讀輸入循環
3803cc4(0238beac):調用讀TOUCH
37f842c(02380614):主循環開頭
37f8450(0238063c):主循環結束跳轉
具體做法倒是比較簡單~把主循環的循環跳轉指令依照上先前記錄的數據(括號裏是線性載入地址~也就是ROM文件裏的線性地址)~重新定位到識別觸摸的程序調用那裏~然後把調用的下一行改成跳轉~重新指回主循環的開頭~

因爲不同ROM的ARM7文件本質上都是一樣的~但是隨意替換會導致模擬器或者燒錄卡的兼容問題~所以俺修改的是RY傳說的原始ARM7~

到現在~之前說的3個問題~按鍵識別地址~觸摸識別地址~下斷地址~以及中途出現的新問題~觸摸被關閉的問題~全部解決~這樣用ARM彙編簡單的寫段將屏幕不同區域和按鍵進行對位的小程序~然後插到arm9的空白部分~設定好跳轉後~配合之前修改的arm7~打包成新ROM~

放到IDEAS上運行~BINGO!~一切順利~順利的用觸摸屏控制按鍵~正準備燒到機器上玩的時候~隨手用NO$GBA運行了一下~……結果只有一個字~艹!~……居然完完全全的一點用沒有~……觸摸部分依舊被完全關閉……然後俺又不甘心的給燒到了卡上……果然還是沒用……觸摸依然不行~……結論只有一個~因爲ARM7的作用機理十分複雜~強制對其進行暴力修改~雖然在某些模擬器上可以正常運作~但是在實際DS上卻是無法行的通的~……

九,回到ARM9~換個思路找出路~
受到剛纔ARM7修改的打擊~只好重新將思路轉回ARM9~因爲還是觸摸問題~所以依舊是研究電子小說的ROM~

用剛纔在ARM7曾用過的找觸摸程序的改27fffad的方法~來跟蹤arm9代碼~因爲有之前的種種經驗~這次很順利的找到了觸摸的IPC改變前後~在ARM9執行的程序~

從最後一行的那裏跟入~會發現204ddf處所對應的程序是一個類似死循環的部分~

以上就是這個子程序的完整代碼~唯一的功能只有不斷的檢查某個內存的值~不符合則繼續循環~……
然而奇怪的是~這個程序明明只有讀取沒有寫入~應該不會改變任何內存的值~也就是說這個循環應該永遠不可能跳出的啊~可是事實上在bx lr處按F6卻順利出來了~而且就是在出來的這個時候~IPC上被強制改錯的觸摸值~也會被修正過來~
因此推測出這個程序的功能是等待ARM7的觸摸識別程序處理完而已~
在這裏等待~就表示在這不久前面就會是從ARM9發向ARM7的讀觸摸的請求~
因此回到外層的子程序裏~留心一點~不難發現~在這層裏有按鍵處理程序~而且整個的大致結構和RY傳說的按鍵處理程序幾乎一模一樣~只有一個非常顯著的區別~就是在程序尾處多了以下幾個調用~
200b120: bl 0x0204e200
200b124: mov r0,r4
200b128: bl 0x0204e1a8
顯然~最下面的第二個調用就是剛纔跟蹤進去的那個~用於等待ARM7處理結束的程序~那麼很自然的就能推測出~第一個調用的功能向ARM7發送讀觸摸請求的了~

對於這個程序步入跟蹤~得到一下的內容~

程序裏分別使用了4000184和4000188這2個接口~看是4打頭的就該知道~這2個是I/O接口的寄存器了~而實際上這2個寄存器正是FIFO隊列的2個重要寄存器~
關於這個FIFO隊列~要說清楚比較麻煩~但是這裏只需要搞清楚一點~就是FIFO的用途是ARM7和ARM9的相互通信~這樣程序就明瞭了~204c458這段程序無疑就是向ARM7發送觸摸請求的代碼了~

十,完事具備~只欠東風
事情到這裏~問題都已經解決了~
1,按鍵的修改:除了X,Y鍵以外的~在將按鍵寄存器讀入r12的時候~修改r12的值實現按鍵修改~而X,Y鍵則可以直接修改IPC上對應的地址~
2,觸摸的識別:直接檢測IPC上觸摸對應的地址~
3,合適的斷點:當然只能是在將4000130讀入r12的這一句處~因爲是要修改r12~所以若不在這裏就一點意義都沒有了~
4,觸摸屏解封:調用其他rom裏的FIFO處理程序向ARM7發送觸摸請求~

現在就是要實際完成ROM修改的時候了~

主要介紹下如何給觸摸屏解封~:
1,首先是從電子小說的ROM中提取FIFO處理程序~地址是204c458的這段程序~值得注意的是他還調用了2個子程序~一次都要提取出來~
2,在自己的修改代碼裏調用提取出來的程序~值得注意的是~這個子程序是帶參數傳遞的~調用的時候別忘了~
3,設置一個等待程序~用來等待ARM7處理結束~因爲原本的標識位涉及到很複雜的工作~所以俺放棄了原程序的等待程序~而是事先給IPC的觸摸位賦錯值~然後檢測何時被更正~來判定ARM7是否執行完成~
4,還原環境~因爲FIFO程序比較複雜~基本改變了從r0到r14的所有寄存器~所以在前面的工作都完成後~爲了後面的不受到影響~一定要還原之前的環境~

之後的代碼便是簡單的搗弄下各個數據之間的轉換~完成按鍵到觸摸的映射就可以了~

等待程序r_wait的代碼如下:


代碼全部寫完也編譯好了後~接下來就要LINK鏈接了~因爲格式很不規範~所以麼辦法用程序來鏈接~只能手動來完成~
先用DOS的COPY命令將主要程序main1.o 提取出來的FIFO程序FIFO_snd.o 一同提取出來的FIFO_snd所調用的2個子程序sx2.o 等待程序r_wait.o 全部順序合成一個文件~然後用CT2打開~找到每個bl調用指令~然後把調用指令的調用地址全部修改正確~這個部分就算完成了~

最後將之前完成的那整段程序~全部插入到ARM9文件的空白處(這還不能亂插……程序有點大~勢必要覆蓋掉一部分東西~找個都是無用信息的地方給塞進去~)~俺插的是2092800處~然後在20a1ff8處改成跳轉到我們代碼的指令~(需要注意的是這裏實際是被載入到1ff84f8~所以計算跳轉差量的時候要用這個值)~再把我們插入的代碼的回跳指令指向那個的下一行~一切就算修改完成了~

十一,完成~
把這個修改好的ARM9文件~替換原ROM裏的ARM9~然後打包運行~所有模擬器~DS實機~皆運行無誤~修改成功!~.
發佈了90 篇原創文章 · 獲贊 3 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章