FC街霸修改教程2---PPU和專用擴(kuò)展芯片說明
PPU內(nèi)存
????????$0000-$1fff,一共8k內(nèi)存,用途寫的是“圖案表”。游戲卡上的CHR芯片數(shù)據(jù)放到這里,大于8k時(shí)通過擴(kuò)展芯片分段放到這里,有的游戲卡里沒有CHR芯片時(shí),是通過PRG芯片里的游戲程序?qū)RG芯片里的數(shù)據(jù)放到這里。PPU管理的內(nèi)存數(shù)據(jù)其實(shí)都是顯示到電視的圖案,圖案表里存放的是圖案的貼圖塊。
??

???????????
????????一般情況下,$0000-$0fff(藍(lán)色部分,稱作圖案表0),這4k內(nèi)存里的貼圖塊用做游戲的背景使用。$1000-$1fff(綠色部分,稱為圖案表1),這4k內(nèi)存里的貼圖塊用做游戲的精靈使用,精靈主要就是玩家操縱的游戲角色。

????????從$2000開始,后邊的內(nèi)存就是和電視里顯示的游戲圖像相關(guān)的了,《任天堂產(chǎn)品系統(tǒng)文件》里有詳細(xì)的介紹,“命名表”就是有圖案表組成的背景圖像,也是電視里所要呈現(xiàn)的游戲背景圖像?!皩傩员怼本褪恰懊怼崩铩罢{(diào)色板”的配色數(shù)據(jù),在《電腦游戲機(jī)硬件與編程特技》一書里有詳細(xì)說明,似乎是因?yàn)橛布拗贫鴥?yōu)化出的一個(gè)東西。
????????當(dāng)背景圖案過于復(fù)雜,使用的圖案塊數(shù)量大于“圖案表”容量時(shí),擴(kuò)展芯片就派上用場了,將圖案塊數(shù)據(jù)分段放入“圖案表”內(nèi)存,然后拼出一個(gè)完整的背景圖案。假如根據(jù)時(shí)間可以選擇放入不同的數(shù)據(jù)段,可以讓背景圖案產(chǎn)生動(dòng)畫效果。關(guān)于精靈(玩家控制的游戲角色)的“圖案表”也是這個(gè)原理,根據(jù)不同的人物動(dòng)作數(shù)據(jù)放入“圖案表”不同的圖案塊數(shù)據(jù),讓游戲中人物角色不至于花屏。
?

????????左邊“命名表”里圈出的兩個(gè)小人圖案,就是從右邊“圖案表”圈出的圖案塊數(shù)據(jù) ,假如根據(jù)時(shí)間改變“圖案表”里所圈出的圖案塊時(shí)(當(dāng)然其他的圖案塊不變),背景房子上窗戶里的小人會(huì)顯示動(dòng)起來,像魂斗羅(日版)標(biāo)題畫面里的火焰應(yīng)該就是這種操作。
?

????????精靈也是這個(gè)操作,每個(gè)動(dòng)作的數(shù)據(jù)擴(kuò)展芯片會(huì)將對(duì)應(yīng)的圖案塊數(shù)據(jù)存入精靈所使用的“圖案表”中。前面說的有瑕疵,應(yīng)該是游戲程序操作擴(kuò)展芯片將對(duì)應(yīng)的圖案塊數(shù)據(jù)存入精靈所使用的“圖案表”中。
我覺得《任天堂產(chǎn)品系統(tǒng)文件》應(yīng)該解釋的就這些啦!
?

?
下邊說一下擴(kuò)展芯片:
????????????????????????????????????https://www.nesdev.org/wiki/INES_Mapper_091

????????因?yàn)槠涫且粔K牛屎芯片,沒有型號(hào)(有部分游戲卡是用mmc3芯片改裝的,這里忽略),所以下面都會(huì)以模擬器里的稱呼“91映射器”或是“mapper 91”代替。
?
CPU分段規(guī)定:(都是從NESDEV 網(wǎng)站查到的)
CPU $8000-$9FFF: 8 k ??可以選擇PRG-ROM 段
CPU $A000-$BFFF: 8 k? ?可以選擇PRG-ROM 段
CPU $C000-$FFFF: 16 k? PRG-ROM的最后16k段,是個(gè)固定的。
????????Mapper 91 規(guī)定了cpu內(nèi)存的$8000-$ffff(一共32k)分成了3個(gè)段,前兩個(gè)為8k段,每個(gè)8k段是可以選擇PRG-ROM?段的,可以是PRG里的任何8k段,通過游戲程序選擇。這說明了PRG-ROM里的數(shù)據(jù)是以8k為一段分的。cpu內(nèi)存最后一段為16k段,PRG-ROM里的最后8k+8k=16k段放到這里,是固定的,說明開機(jī)后最后這16k自動(dòng)固定到$c000-$ffff這里。
????????為什么自動(dòng)固定?因?yàn)槌绦虻娜齻€(gè)中斷地址在$fffa-$ffff里,幾乎所有fc游戲的PRG-ROM…末端都是固定到CPU內(nèi)存末端的,要不開機(jī)后找不到程序入口游戲就運(yùn)行不了了。

畫的有點(diǎn)亂,意思是PRG-ROM里的8k段可以通過程序隨意變成cpu內(nèi)存的那個(gè)位置。這個(gè)過程有個(gè)名詞叫“切bank”。
PPU分段規(guī)定:
PPU $0000-$07FF: 2 k ??可以選擇CHR-ROM 段
PPU $0800-$0FFF: 2 k ??可以選擇CHR-ROM段
PPU $1000-$17FF: 2 k ??可以選擇CHR-ROM段
PPU $1800-$1FFF: 2 k ??可以選擇CHR-ROM段
PPU這8k內(nèi)存分了4個(gè)段,都是可以選擇CHR-ROM段的。也就是說“圖案表0”分了2個(gè)段,“圖案表1”分了2個(gè)段。程序可以通過擴(kuò)展芯片分配CHR-ROM里的任意2k段到這兩個(gè)圖案表里,目的就是改變背景圖案和改變精靈動(dòng)作圖案。

?
究竟怎么分配呢?mapper91資料里有介紹:
$6000: Select 2 KiB CHR-ROM bank at PPU $0000-$07FF
$6001: Select 2 KiB CHR-ROM bank at PPU $0800-$0FFF
$6002: Select 2 KiB CHR-ROM bank at PPU $1000-$17FF
$6003: Select 2 KiB CHR-ROM bank at PPU $1800-$1FFF
????????當(dāng)在游戲程序里將CHR-ROM里的段序號(hào)(上圖紅色數(shù)字)寫入規(guī)定的地址($6000、$6001、$6002、$6003)時(shí),該段數(shù)據(jù)就是“圖案表”里所對(duì)應(yīng)的數(shù)據(jù)了。
PRG-ROM分配方法也介紹了:
$7000: Select 8 KiB PRG-ROM bank at CPU $8000-$9FFF
$7001: Select 8 KiB PRG-ROM bank at CPU $A000-$BFFF
????????當(dāng)游戲程序代碼將PRG-ROM里的段序號(hào)寫入規(guī)定的地址時(shí),該段數(shù)據(jù)就變成那兩段內(nèi)存里對(duì)應(yīng)的數(shù)據(jù)了。具體是怎么變化過去的,我也不知道。就記住這些規(guī)定的地址是個(gè)端口就行。記住向這些端口寫個(gè)數(shù)據(jù),就能設(shè)置或是得到一些功能就行啦。
????????關(guān)于mapper91的其它端口功能還有命名表鏡像設(shè)置端口和IRQ啟動(dòng)和停止端口,命名表鏡像在《任天堂產(chǎn)品系統(tǒng)文件》里有介紹,SF3里使用的是垂直鏡像,沒啥說的。IRQ方面我也弄不太懂,好像就是在電視機(jī)的掃描線到某個(gè)位置(應(yīng)該在運(yùn)行到電視屏幕看不到的掃描線處)設(shè)置一個(gè)掃描線數(shù)值,然后寫入IRQ啟動(dòng)端口一個(gè)數(shù)(寫什么數(shù)好像沒有規(guī)定,怎么寫之后分析游戲程序代碼時(shí)再講),當(dāng)掃描線再次運(yùn)行到這個(gè)數(shù)值時(shí),IRQ就運(yùn)行IRQ中斷里的程序了,IRQ程序運(yùn)行時(shí)還得寫一下IRQ停止端口來確定一下。
想詳細(xì)了解IRQ只能自行網(wǎng)絡(luò)搜索了,呵呵呵呵。
mapper91 映射器知識(shí)總結(jié):
記住$6000、$6001、$6002、$6003、$7000、$7001、$7006、$7007這幾個(gè)端口功能就行了!
?
?