PPU内存
$0000-$1fff,一共8k内存,用途写的是“图案表”。游戏卡上的CHR芯片数据放到这里,大于8k时通过扩展芯片分段放到这里,有的游戏卡里没有CHR芯片时,是通过PRG芯片里的游戏程序将PRG芯片里的数据放到这里。PPU管理的内存数据其实都是显示到电视的图案,图案表里存放的是图案的贴图块。
(资料图片仅供参考)
一般情况下,$0000-$0fff(蓝色部分,称作图案表0),这4k内存里的贴图块用做游戏的背景使用。$1000-$1fff(绿色部分,称为图案表1),这4k内存里的贴图块用做游戏的精灵使用,精灵主要就是玩家操纵的游戏角色。
从$2000开始,后边的内存就是和电视里显示的游戏图像相关的了,《任天堂产品系统文件》里有详细的介绍,“命名表”就是有图案表组成的背景图像,也是电视里所要呈现的游戏背景图像。“属性表”就是“命名表”里“调色板”的配色数据,在《电脑游戏机硬件与编程特技》一书里有详细说明,似乎是因为硬件限制而优化出的一个东西。
当背景图案过于复杂,使用的图案块数量大于“图案表”容量时,扩展芯片就派上用场了,将图案块数据分段放入“图案表”内存,然后拼出一个完整的背景图案。假如根据时间可以选择放入不同的数据段,可以让背景图案产生动画效果。关于精灵(玩家控制的游戏角色)的“图案表”也是这个原理,根据不同的人物动作数据放入“图案表”不同的图案块数据,让游戏中人物角色不至于花屏。
左边“命名表”里圈出的两个小人图案,就是从右边“图案表”圈出的图案块数据 ,假如根据时间改变“图案表”里所圈出的图案块时(当然其他的图案块不变),背景房子上窗户里的小人会显示动起来,像魂斗罗(日版)标题画面里的火焰应该就是这种操作。
精灵也是这个操作,每个动作的数据扩展芯片会将对应的图案块数据存入精灵所使用的“图案表”中。前面说的有瑕疵,应该是游戏程序操作扩展芯片将对应的图案块数据存入精灵所使用的“图案表”中。
我觉得《任天堂产品系统文件》应该解释的就这些啦!
下边说一下扩展芯片:
/wiki/INES_Mapper_091
因为其是一块牛屎芯片,没有型号(有部分游戏卡是用mmc3芯片改装的,这里忽略),所以下面都会以模拟器里的称呼“91映射器”或是“mapper 91”代替。
CPU分段规定:(都是从NESDEV 网站查到的)
CPU $8000-$9FFF: 8 k 可以选择PRG-ROM 段
CPU $A000-$BFFF: 8 k 可以选择PRG-ROM 段
CPU $C000-$FFFF: 16 k PRG-ROM的最后16k段,是个固定的。
Mapper 91 规定了cpu内存的$8000-$ffff(一共32k)分成了3个段,前两个为8k段,每个8k段是可以选择PRG-ROM 段的,可以是PRG里的任何8k段,通过游戏程序选择。这说明了PRG-ROM里的数据是以8k为一段分的。cpu内存最后一段为16k段,PRG-ROM里的最后8k+8k=16k段放到这里,是固定的,说明开机后最后这16k自动固定到$c000-$ffff这里。
为什么自动固定?因为程序的三个中断地址在$fffa-$ffff里,几乎所有fc游戏的PRG-ROM…末端都是固定到CPU内存末端的,要不开机后找不到程序入口游戏就运行不了了。
画的有点乱,意思是PRG-ROM里的8k段可以通过程序随意变成cpu内存的那个位置。这个过程有个名词叫“切bank”。
PPU分段规定:
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内存分了4个段,都是可以选择CHR-ROM段的。也就是说“图案表0”分了2个段,“图案表1”分了2个段。程序可以通过扩展芯片分配CHR-ROM里的任意2k段到这两个图案表里,目的就是改变背景图案和改变精灵动作图案。
究竟怎么分配呢?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
当在游戏程序里将CHR-ROM里的段序号(上图红色数字)写入规定的地址($6000、$6001、$6002、$6003)时,该段数据就是“图案表”里所对应的数据了。
PRG-ROM分配方法也介绍了:
$7000: Select 8 KiB PRG-ROM bank at CPU $8000-$9FFF
$7001: Select 8 KiB PRG-ROM bank at CPU $A000-$BFFF
当游戏程序代码将PRG-ROM里的段序号写入规定的地址时,该段数据就变成那两段内存里对应的数据了。具体是怎么变化过去的,我也不知道。就记住这些规定的地址是个端口就行。记住向这些端口写个数据,就能设置或是得到一些功能就行啦。
关于mapper91的其它端口功能还有命名表镜像设置端口和IRQ启动和停止端口,命名表镜像在《任天堂产品系统文件》里有介绍,SF3里使用的是垂直镜像,没啥说的。IRQ方面我也弄不太懂,好像就是在电视机的扫描线到某个位置(应该在运行到电视屏幕看不到的扫描线处)设置一个扫描线数值,然后写入IRQ启动端口一个数(写什么数好像没有规定,怎么写之后分析游戏程序代码时再讲),当扫描线再次运行到这个数值时,IRQ就运行IRQ中断里的程序了,IRQ程序运行时还得写一下IRQ停止端口来确定一下。
想详细了解IRQ只能自行网络搜索了,呵呵呵呵。
mapper91 映射器知识总结:
记住$6000、$6001、$6002、$6003、$7000、$7001、$7006、$7007这几个端口功能就行了!