看这篇文章之前建议先了解一些FC的基础知识,如Mapper/MMC/PCB/PRG/CHR等等,网上关于这些概念的文档多不胜数,在这里就不一一介绍了,各位可以自行搜索。
英文基础比较好的建议去http://wiki.nesdev.com
以及它的论坛,几乎所有关于FC的软硬件知识都可以在里面找到。需要说明的一点,本人并不是专业人士,也只是一个初学者,写这篇文章的目的希望其他爱好者只用参考这一篇文章就可以完成自己的改造,而不用网上到处找资料,所以文章中不可避免会出现一些错误和纰漏,希望不要成为一种误导。
文中所有关于存储容量的单位除非单独说明,默认都是用Byte字节表示。
自制FC卡带主要有两种方式:用现有的卡带改造和自制卡带电路板,后一种费时费力,但是可定制程度高,同时也是一个能积累大量知识的过程。本人喜欢动手折腾,但时间实在有限,浅尝辄止体验一下乐趣足矣,所以只说说如何利用手头的正版卡带来改造并写入自己喜欢的游戏。
准备工作
现有网上能买到的最好的山寨合卡就是150合一,基本把小时候玩到和玩不到的经典游戏都收录了,但是我没在里面找到星际魂斗罗(RAF World),这也是我学习自制卡带的原因之一。在确定了目标之后,我们首先要去NesCartDB网站(http://bootgod.dyndns.org:7777/,需要科学上网) 查找这个游戏是基于什么Mapper,用的什么PCB,在网站右侧的搜索栏输入要查询的关键字就会跳转到对应卡带的页面。
在这里我们看到RAF World用的是MMC1芯片,也就是通常说的Mapper1,电路板PCB是HVC-SLROM。这里要说一下的是,FC的卡带PCB是HVC开头,而NES的PCB则是NES开头,美版只是多了一块CIC芯片用于锁区,所以HVC-SLROM和NES-SLROM本质上是一样的。这样我们在改造完卡带之后,相同PCB的游戏无论美版日版都是可以烧进去正常游戏的。
接下来我们要找一盘与RAF World相同PCB的卡带来对它做改造(英文叫Donor Cart),在NesCartDB里用SLROM作为关键字继续搜索还有哪些游戏是用的相同的PCB,为了强调性价比我们自然是要选择一款并不稀有的垃圾游戏,下面就是我找到的便宜货,并且一口气买了7,8盘。
然后就该要拆开卡带取出PCB了。将卡带正面朝上,用一个一字螺丝刀(我用的是拆手机的撬棒),分别从金手指两侧的卡带开口处撬,同时大拇指挤压卡带就可以基本无伤的拆开,然后在卡带顶部的两个方孔上用螺丝刀插进去别一下,整个卡带前后就分离了。这个过程需要练习和掌握正确姿势,我是在撬坏了三盘卡带之后才掌握的。下面是拆开的样子以及使用的工具。
除了金手指,完全看不出来这是一个30年前生产出的玩意,太美了。图中左边是CHR(存储游戏图像的ROM),右边是PRG(存储游戏主程序的ROM),右上是Mapper芯片MMC1。
``
关于存储芯片有个专门的名字叫MASK ROM,百度百科的解释完全可以说明这个概念:“MASK ROM,是制造商为了要大量生产,事先制作一颗有原始数据的ROM或EPROM当作样本,然后再大量生产与样本一样的 ROM,这一种做为大量生产的ROM样本就是MASK ROM,而烧录在MASK ROM中的资料永远无法做修改。” 但是,任天堂的MASK ROM还有一个特别之处,就是它和标准的Mask Rom针脚布局不一样。这是因为不同的游戏视容量大小不同可能会在相同的PCB上使用不同针脚数目的存储芯片,比如128KB的芯片是28pin,而256KB往上的芯片则是32pin,为了使得32pin芯片和28pin芯片的针脚能在同一块PCB上兼容,任天堂就改变了标准的针脚定义,这样做的唯一目的就是节省成本。
上图可以看到,我选择的这盘卡带的PRG芯片是28pin,而PCB上还有4个空的针脚,用来兼容32pin芯片。这四个空针脚会在接下来的改造中起到作用,帮我节省一些不必要的飞线。 最后,自制卡带有一个限制就是只能玩对应mapper的游戏,MMC1的卡带只能烧录MMC1的游戏,但是网上存在很多Mapper Hack的游戏ROM,例如可以把原本MMC1的游戏hack成MMC3,这样就可以把它烧录进MMC3芯片的PCB卡带里,本人目前level处于入门级,所以这些不在本文讨论范围之内。
存储芯片的选择
卡带采用的MASK ROM是一次性写入数据不能再更改的。而我们的改造需要用可擦写的芯片来替换MASK ROM,一来可以避免烧录错误使得芯片报废,二来可以使得改造后的卡带成为一张固定Mapper的烧录卡。 PROM是可编程只读存储器的缩写(Progammable Read-Only Memory),分为并行和串行两种,在FC时代流行的是并行存储器。目前已经淘汰,市面上基本很难再能以低廉的价格买到全新的芯片,能买到的多数都是拆机二手芯片。
可擦写PROM分为EPROM(可擦写可编程存储器)和EEPROM(电子可擦写可编程存储器),前者在芯片正面有个小窗户,一次写入数据后需要使用紫外线装置对窗口照射来擦除数据,由于我们的改造需要在完成后把PCB再装回卡带外壳中,所以EPROM不具备使之成为烧录卡的条件;而后者则可以用和烧写一样的方式通过操作针脚利用电子的方式来擦除数据,于是便成为改造的首选。因为我的目的是改造能够反复擦写的烧录卡,所以后续的改造都将采用EEPROM。
PROM芯片的针脚定义是基本相同的,跟存储数据相关的是地址线(也叫地址pin或Address Pin,用A+数字的形式标识)和数据线(也叫数据pin或Data Pin,用D+数字的形式标识),固定的8个数据pin代表8位位宽(一个字节),地址pin的数量决定了芯片的容量,有多少地址pin,容量就是2的多少次方,如芯片有18个地址pin,容量就是2的18方=256K字节(后面会介绍芯片的存储原理)。对于并行EEPROM,由于功能性针脚数量多,所以32pin芯片的容量上限是512KB,而EPROM由于功能性针脚少,可以在32pin封装上做更大的容量,所以针对现有卡带的改造,如果需要做大容量合卡那就需要利用EPROM。本文的改造实践只描述选用EEPROM的情况。 生产EEPROM的厂家很多,型号不尽相同,但都采用统一的针脚功能定义,和规范的命名规则,从型号上一般就可以看出芯片的容量,我没太多研究命名规则,也没接触太多型号的芯片,当拿到一个芯片型号时,只要搜索一下就很容易能找到该芯片的datasheet,一般是pdf格式,里面会有详细的说明。
======== Updated on 2017-08-09 ========
这里引用维基百科的记载(https://en.wikipedia.org/wiki/EEPROM):“Flash memory is a later form of EEPROM”。对于改造卡带来说使用的芯片也都属于Flash Memory。 从针脚来看,并行Flash芯片与MASK ROM的Address pin, Data pin都是相同的,不同的是控制针脚。MASK ROM只有一个/CE,而Flash芯片因为兼备读和写的操作,因此比MASK ROM多出两个控制针脚。分别是:
- CE# – Chip Enable,低电平时芯片处于可用状态。
- OE# – Output Enable,控制读操作。
- WE# – Write Enable,控制写操作。
通过控制这三个针脚上的高低电平来实现芯片的不同状态,如下:
操作 | CE# | OE# | WE# | 说明 |
---|---|---|---|---|
Read | Low | Low | High | 此时可从读取数据。 |
Write/Erase | Low | High | Low | 此时可以写入或擦除数据。 |
Standby | High | X | X | 待机状态,能耗比读或写状态时更低。 |
Output Disable | Low | High | High | 禁止读。 |
Write Inhibit | X | Low | X | 禁止写。 |
X X High (X代表不论高低。)
对于改造卡带,要想制作可重复擦写的烧录卡就需要同时兼顾这三个控制针脚,让烧录器可以自由控制卡带的读写状态,这也是在卡带PCB上飞线的主要工作量。
======== Updated on 2017-08-12 ========
Flash芯片的指令操作。
Flash芯片内部封装了一组寄存器,这些寄存器是独立于存储阵列的,这些寄存器控制着Flash芯片的工作状态,包括擦除、写入等等。
上图来自于AMD生产的AM29F040芯片的data sheet,从中可以看出Flash芯片具备一组指令机制,每个指令对应一种操作状态,指令本身包括指令的地址和指令的数据。当使用Flash芯片时,根据上表中的示例将指令数据写入其对应的指令地址中,Flash芯片就进入了该指令所对应的操作状态了。
从上表中也可以看出,读取操作不需要发送指令。
PROM的存储机制
本人上大学时模电和数电是必修课,但根本没用心学,考完试就全还给老师了。所谓书到用时方恨少,现在才知道那些枯燥的基础课是多么的有用。 一开始怎么也搞不懂为什么地址pin和数据pin之间是2的次方关系。直到在youtube上看了一篇教学视频“Understanding PROM”才恍然大悟
https://www.youtube.com/watch?v=cyc9wL1F8nY。
非科学上网的同学从这里下载:
http://pan.baidu.com/s/1o8LmIKy
每一根地址线的状态是0和1,多个地址线就形成了一系列0101…的不同组合,而每增加一根地址线其0和1的两种状态则把前面所有地址线的组合乘以了2,这就是容量翻倍的原理(2的次方关系)。 更进一步,通过对末端地址线的控制,还可以人为的给芯片划分出不同的存储区间,而这一点是后面制作合卡的关键。