FC街霸修改教程1---基礎(chǔ)知識簡述
????????早就想寫一個教程,因?yàn)橐粋€人要修改很多東西,改完這個時那個就忘了,改完那個時這個又忘了。開始想起一個《零基礎(chǔ)修改fc街霸》的標(biāo)題,然后來寫個教程,后來想想,自己還沒全弄明白呢,所以也沒有寫。因?yàn)檫B續(xù)技和地板透視效果沒研究出來,現(xiàn)在暫時也沒啥心思修改,等哪天心血來潮將項(xiàng)目再繼續(xù)。趁著腦子對游戲結(jié)構(gòu)還清晰,先寫點(diǎn)我所探索出來的東西,一是留一個記錄,省著項(xiàng)目再開時忘掉游戲各個部位的功能。二是讓對fc街霸游戲有情懷而且有時間的朋友清楚一些游戲結(jié)構(gòu),想動手的朋友也可以添加人物或是修改成fc的《世界英雄》、《斗士歷史》、《豪血寺一族》等。因?yàn)槲乙膊粫幊?,所以以后的寫的東西里有些名詞啥的也不會太嚴(yán)謹(jǐn)或是有錯誤,但盡量讓理解上不出現(xiàn)錯誤。
本教程暫時沒有詳細(xì)的規(guī)劃,想到哪里寫哪里。
1、? 修改基礎(chǔ)必備資料
《任天堂產(chǎn)品系統(tǒng)文件》----------必須詳細(xì)了解的fc硬件知識,需要仔細(xì)閱讀,后邊對此文檔會有講解。
《6502微處理機(jī)及其應(yīng)用》-------這本書可以學(xué)習(xí)fc游戲的編程語言指令,平時可以看看,主要的于程序分析和修改時查閱指令時用。(不用先死記硬背匯編語言指令,在以后的游戲調(diào)試中慢慢就會全掌握的)
《任天堂游戲編程探秘》和《電腦游戲機(jī)硬件與編程特技》------這兩本書其實(shí)不算必備,但是里邊還是有些知識的詳細(xì)講解,平時可以結(jié)合《任天堂產(chǎn)品系統(tǒng)文件》看看。
還有個必備網(wǎng)址就是nesdev.org---------里邊有fc的軟硬件及其相關(guān)的知識。
?
2、對《任天堂產(chǎn)品系統(tǒng)文件》的部分講解
????????首先得具備計(jì)算機(jī)基礎(chǔ)。因?yàn)槭且薷膄c的游戲,所以要對fc硬件了解,fc也是計(jì)算機(jī)的一種,我準(zhǔn)備結(jié)合fc簡單啰嗦啰嗦計(jì)算機(jī)的基礎(chǔ)。
????????嗯!感覺也沒啥,就是處理器(cpu)、內(nèi)存(ram)、存儲器(rom),cpu就是處理數(shù)據(jù)計(jì)算,內(nèi)存就是存放cpu處理過程中的數(shù)據(jù),存儲器就是存放(游戲)程序數(shù)據(jù)的。Fc的cpu是8位的, 只能處理8位的數(shù)據(jù),這里涉及到“位”、“bit”、“BIT”啥的我也不講了。硬件方面什么總線啥的也不講了。
關(guān)于內(nèi)存映像的說明
先了解進(jìn)制知識
????????我們生活中的計(jì)算幾乎都是十進(jìn)制,比如買東西計(jì)算價格時,計(jì)算時逢十進(jìn)一。
0、1、2、3、4、5、6、7、8、9、到這里后邊就是10、11、12……
????????計(jì)算機(jī)cpu是由半導(dǎo)體制作的,只有導(dǎo)通和截止,也就是開和關(guān)兩種狀態(tài),所以都是以二進(jìn)制計(jì)算的。
00、01、到這里后邊就是10、11、到這里后邊就是100、101、110、111……
????????關(guān)于數(shù)據(jù)的在游戲調(diào)試器里顯示都是十六進(jìn)制的。
?0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f、到這里后邊就是10、11、12、13、14、15、16、17、18、19、1a、1b、1c、1d、1e、1f......
????????當(dāng)然這些進(jìn)制數(shù)都可以相互轉(zhuǎn)換:十進(jìn)制的10 = 二進(jìn)制的1010 = 十六進(jìn)制的a、十進(jìn)制的16 = 二進(jìn)制的10000 = 十六進(jìn)制的?10。關(guān)于詳細(xì)的轉(zhuǎn)換方法不說了,計(jì)算時可用系統(tǒng)里的計(jì)算器,設(shè)置成“程序員”模式計(jì)算。書寫方面前面應(yīng)該加標(biāo)識符號,我沒有加。
好!開始說說fc的內(nèi)存,一個蘿卜一個坑,關(guān)于$0000-$FFFF---fc的cpu只能管理這么多的內(nèi)存空間。

因?yàn)橛布?jié)約成本?的設(shè)計(jì),只能使用2k的內(nèi)存,也就是$0000-$07ff。
????????其中這2k內(nèi)存里,$0000-$00ff是零頁內(nèi)存,零頁內(nèi)存好像就是在程序里可以用$00-$ff表示吧,節(jié)省程序空間?也有執(zhí)行速度快的設(shè)計(jì)吧,在《6502微處理機(jī)及其應(yīng)用》有介紹。
$0100-$01ff:作為程序堆棧使用,堆棧的概念請自行搜索。我理解就是:程序是按順序執(zhí)行的,在執(zhí)行中需要跳轉(zhuǎn)去執(zhí)行某個可重復(fù)使用的另一個程序時,當(dāng)前的地址就存入堆棧里,等另一個程序執(zhí)行完,就從堆棧里找到這個地址繼續(xù)執(zhí)行原程序。
$0200-$02ff:是精靈使用的數(shù)據(jù),關(guān)于精靈,主要就是游戲中玩家可以操縱動畫角色?!度翁焯卯a(chǎn)品系統(tǒng)文件》關(guān)于圖形處理器里有對精靈的講解。
$2000-$5fff:關(guān)于寄存器和擴(kuò)展rom啥的不說了,《任天堂產(chǎn)品系統(tǒng)文件》的I/O端口里有介紹。
下面的內(nèi)存就是關(guān)于游戲卡的了。

$6000-$7fff:這部分內(nèi)存理解為游戲存檔用,有帶有游戲記錄的游戲用這段內(nèi)存,比如上圖右上的芯片就應(yīng)該是這部分內(nèi)存。要是沒有存檔的游戲,這部分內(nèi)存好像就是不用了。
$8000-$ffff:這部分32k內(nèi)存就是游戲卡的程序和數(shù)據(jù),上圖右下的芯片就是這部分內(nèi)存。
????????上圖標(biāo)有mmc3字樣的芯片是個擴(kuò)展芯片,當(dāng)游戲的數(shù)據(jù)(右下的芯片內(nèi)容)大于cpu的處理范圍時,擴(kuò)展芯片就將數(shù)據(jù)分成好多個段(當(dāng)然每段不能大于32k了),需要哪段時就讓這個段變成$8000-$ffff,以便cpu能處理到(根據(jù)分段的大小,最后一段自動成為$8000-$ffff)。根據(jù)游戲的需要,擴(kuò)展芯片也有好多種類,擴(kuò)展芯片也并不是只負(fù)責(zé)將程序和數(shù)據(jù)分段(bank),也有一些別的功能,比如圖案和音樂的增強(qiáng)等?!度翁焯卯a(chǎn)品系統(tǒng)文件》里的“內(nèi)存映射硬件”部分有介紹。再具體的功能可以按擴(kuò)展芯片名稱網(wǎng)上搜索,DESDEV的WIKI里都有介紹,上圖的擴(kuò)展芯片型號是mmc3,對應(yīng)到映射器(模擬器對擴(kuò)展芯片模擬時,因?yàn)橛胁簧贁U(kuò)展芯片沒有型號,或是電路走線不同,所以又重新設(shè)置了標(biāo)準(zhǔn))是mapper4。SF3使用的是mapper91,也有使用mapper197的。無論使用哪個擴(kuò)展芯片,功能都是將大于32k的內(nèi)存分段(也就是分bank,來回使用時稱為切bank)。
?
Sf3的擴(kuò)展芯片功能后邊再細(xì)說!
?
????????上圖左下的芯片是游戲的圖形數(shù)據(jù)芯片,是ppu處理的內(nèi)存(相當(dāng)于顯存?),大于ppu內(nèi)存時也由擴(kuò)展芯片進(jìn)行分段。
?
再說說中斷
????????fc有三個中斷:RESET? NMI? IRQ。地址在內(nèi)存的$fffa-$ffff。我也不知道怎么解釋中斷,就是說fc游戲一通電,游戲主程序就循環(huán)的運(yùn)行,按照程序內(nèi)容在內(nèi)存里存放了一些數(shù)據(jù),等到中斷時,中斷程序按內(nèi)存里的數(shù)據(jù)執(zhí)行一些游戲功能,比如更改游戲畫面,人物動作等。
三個中斷畫個圖解釋下吧

????????開機(jī)后從$fffc、$fffd讀取reset地址開始執(zhí)行程序,到達(dá)NMI中斷處從$fffa、$fffb讀取NMI地址執(zhí)行NMI中斷程序。 IRQ中斷是通過程序設(shè)置的,也需要硬件支持。NMI中斷和IRQ中斷的時間是通過掃描線決定的。IRQ中斷好像都是通過游戲卡上的擴(kuò)展芯片支持的。掃描線詳細(xì)知識請自行B站搜索。
掃描線和中斷的圖解

????????綠色的掃描線可以看成程序運(yùn)行中。解釋的也許有錯誤,明白個大概就可以。想深入了解請去NESDEV- WIKI站學(xué)習(xí),好像國內(nèi)的知乎、CSDN站也有中文的。B站內(nèi)也有視頻教程。
FC街霸修改教程1---基礎(chǔ)知識簡述的評論 (共 條)
