早就想写一个教程,因为一个人要修改很多东西,改完这个时那个就忘了,改完那个时这个又忘了。开始想起一个《零基础修改fc街霸》的标题,然后来写个教程,后来想想,自己还没全弄明白呢,所以也没有写。因为连续技和地板透视效果没研究出来,现在暂时也没啥心思修改,等哪天心血来潮将项目再继续。趁着脑子对游戏结构还清晰,先写点我所探索出来的东西,一是留一个记录,省着项目再开时忘掉游戏各个部位的功能。二是让对fc街霸游戏有情怀而且有时间的朋友清楚一些游戏结构,想动手的朋友也可以添加人物或是修改成fc的《世界英雄》、《斗士历史》、《豪血寺一族》等。因为我也不会编程,所以以后的写的东西里有些名词啥的也不会太严谨或是有错误,但尽量让理解上不出现错误。
(资料图)
本教程暂时没有详细的规划,想到哪里写哪里。
1、 修改基础必备资料
《任天堂产品系统文件》----------必须详细了解的fc硬件知识,需要仔细阅读,后边对此文档会有讲解。
《6502微处理机及其应用》-------这本书可以学习fc游戏的编程语言指令,平时可以看看,主要的于程序分析和修改时查阅指令时用。(不用先死记硬背汇编语言指令,在以后的游戏调试中慢慢就会全掌握的)
《任天堂游戏编程探秘》和《电脑游戏机硬件与编程特技》------这两本书其实不算必备,但是里边还是有些知识的详细讲解,平时可以结合《任天堂产品系统文件》看看。
还有个必备网址就是里边有fc的软硬件及其相关的知识。
2、对《任天堂产品系统文件》的部分讲解
首先得具备计算机基础。因为是要修改fc的游戏,所以要对fc硬件了解,fc也是计算机的一种,我准备结合fc简单啰嗦啰嗦计算机的基础。
嗯!感觉也没啥,就是处理器(cpu)、内存(ram)、存储器(rom),cpu就是处理数据计算,内存就是存放cpu处理过程中的数据,存储器就是存放(游戏)程序数据的。Fc的cpu是8位的, 只能处理8位的数据,这里涉及到“位”、“bit”、“BIT”啥的我也不讲了。硬件方面什么总线啥的也不讲了。
关于内存映像的说明
先了解进制知识
我们生活中的计算几乎都是十进制,比如买东西计算价格时,计算时逢十进一。
0、1、2、3、4、5、6、7、8、9、到这里后边就是10、11、12……
计算机cpu是由半导体制作的,只有导通和截止,也就是开和关两种状态,所以都是以二进制计算的。
00、01、到这里后边就是10、11、到这里后边就是100、101、110、111……
关于数据的在游戏调试器里显示都是十六进制的。
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......
当然这些进制数都可以相互转换:十进制的10 = 二进制的1010 = 十六进制的a、十进制的16 = 二进制的10000 = 十六进制的 10。关于详细的转换方法不说了,计算时可用系统里的计算器,设置成“程序员”模式计算。书写方面前面应该加标识符号,我没有加。
好!开始说说fc的内存,一个萝卜一个坑,关于$0000-$FFFF---fc的cpu只能管理这么多的内存空间。
因为硬件节约成本?的设计,只能使用2k的内存,也就是$0000-$07ff。
其中这2k内存里,$0000-$00ff是零页内存,零页内存好像就是在程序里可以用$00-$ff表示吧,节省程序空间?也有执行速度快的设计吧,在《6502微处理机及其应用》有介绍。
$0100-$01ff:作为程序堆栈使用,堆栈的概念请自行搜索。我理解就是:程序是按顺序执行的,在执行中需要跳转去执行某个可重复使用的另一个程序时,当前的地址就存入堆栈里,等另一个程序执行完,就从堆栈里找到这个地址继续执行原程序。
$0200-$02ff:是精灵使用的数据,关于精灵,主要就是游戏中玩家可以操纵动画角色。《任天堂产品系统文件》关于图形处理器里有对精灵的讲解。
$2000-$5fff:关于寄存器和扩展rom啥的不说了,《任天堂产品系统文件》的I/O端口里有介绍。
下面的内存就是关于游戏卡的了。
$6000-$7fff:这部分内存理解为游戏存档用,有带有游戏记录的游戏用这段内存,比如上图右上的芯片就应该是这部分内存。要是没有存档的游戏,这部分内存好像就是不用了。
$8000-$ffff:这部分32k内存就是游戏卡的程序和数据,上图右下的芯片就是这部分内存。
上图标有mmc3字样的芯片是个扩展芯片,当游戏的数据(右下的芯片内容)大于cpu的处理范围时,扩展芯片就将数据分成好多个段(当然每段不能大于32k了),需要哪段时就让这个段变成$8000-$ffff,以便cpu能处理到(根据分段的大小,最后一段自动成为$8000-$ffff)。根据游戏的需要,扩展芯片也有好多种类,扩展芯片也并不是只负责将程序和数据分段(bank),也有一些别的功能,比如图案和音乐的增强等。《任天堂产品系统文件》里的“内存映射硬件”部分有介绍。再具体的功能可以按扩展芯片名称网上搜索,DESDEV的WIKI里都有介绍,上图的扩展芯片型号是mmc3,对应到映射器(模拟器对扩展芯片模拟时,因为有不少扩展芯片没有型号,或是电路走线不同,所以又重新设置了标准)是mapper4。SF3使用的是mapper91,也有使用mapper197的。无论使用哪个扩展芯片,功能都是将大于32k的内存分段(也就是分bank,来回使用时称为切bank)。
Sf3的扩展芯片功能后边再细说!
上图左下的芯片是游戏的图形数据芯片,是ppu处理的内存(相当于显存?),大于ppu内存时也由扩展芯片进行分段。
再说说中断
fc有三个中断:RESET NMI IRQ。地址在内存的$fffa-$ffff。我也不知道怎么解释中断,就是说fc游戏一通电,游戏主程序就循环的运行,按照程序内容在内存里存放了一些数据,等到中断时,中断程序按内存里的数据执行一些游戏功能,比如更改游戏画面,人物动作等。
三个中断画个图解释下吧
开机后从$fffc、$fffd读取reset地址开始执行程序,到达NMI中断处从$fffa、$fffb读取NMI地址执行NMI中断程序。 IRQ中断是通过程序设置的,也需要硬件支持。NMI中断和IRQ中断的时间是通过扫描线决定的。IRQ中断好像都是通过游戏卡上的扩展芯片支持的。扫描线详细知识请自行B站搜索。
扫描线和中断的图解
绿色的扫描线可以看成程序运行中。解释的也许有错误,明白个大概就可以。想深入了解请去NESDEV- WIKI站学习,好像国内的知乎、CSDN站也有中文的。B站内也有视频教程。