具备一定的基础知识之后,接下来要开始真正的改造了。FC卡带的改造比较锻炼动手能力和耐心,技艺会随着改造的深入而不断提高,所以刚开始要好一些心理准备,比如焊坏板子、摔坏芯片、接错线等等。当然最最重要的是工欲善其事必先利其器,先配齐一套基础工具是必须的……

image

烙铁,国产黄花就足够日常DIY使用了,功率350w以上。 助焊剂,唯一好用的就是固特,分10g和50g两种大小的包装。 吸锡线,也是固特的,3mm宽度比较合适。 焊锡、钳子、镊子,这些不用多说了。

下面开始进入改造步骤:

* 拆除Mask Rom

第一步要把卡带上原来的PRG和CHR芯片拆掉(mapper芯片保持原样),拆焊芯片最好的工具是热风枪,可以一次性拆除芯片,并且不用破坏芯片本身,但是我没有,对于一个时间有限的爱好者来说也没有必要上这个玩意。多些耐心,一把性能可靠的烙铁绰绰有余。

先用钳子分别把PRG和CHR芯片的针脚剪断,注意要从针脚靠近芯片这一端的根部剪,不要从靠近PCB的那一端剪,否则容易破坏掉PCB上的焊盘让整个PCB报废。

image

剪完的样子,原本的MASK ROM终于完成了它的历史使命。

image

然后用烙铁加热每一个针脚的焊盘,再用镊子一个一个地将每一个针脚从焊盘里取出来,一共60个针脚,要有耐心。

image

把所有的针脚都拔掉之后就成了这样,焊盘里还残留有焊锡,使得我们没法把芯片插进去。

image

最后,用吸锡带蘸上助焊剂,用烙铁加热把每一个焊盘里残留的焊锡吸掉。不要尝试用吸锡器,你会疯掉。

image

吸掉残留的焊锡,再用粗橡皮把金手指上的氧化层擦掉,这样就得到了一块干干净净的电路板。

因为助焊剂并不是完全绝缘的,所以吸锡的过程中建议用纸巾随时把电路板上融化的助焊剂清理掉,完成后再用棉棒蘸酒精把电路板擦拭一遍,尽量确保没有残留。

image

如果你用来作为牺牲品的卡带比较多,同时初次尝试时想留给自己一些试错的余地,我建议你可以在原PRG和CHR的位置上焊上IC座,如果接下来某个针脚弄错了就不至于再费劲拆,使得整个过程可逆。我就是先这么干的。

image

准备PRG

这个时候就要根据所选择的Flash芯片来确定针脚和PCB上焊盘的对应了。因为Flash芯片与PRG/CHR的针脚定义是不完全一样的,所以对于处于相同位置但功能定义不一样的针脚,我们就需要通过飞线的方式来连接。

先来看PRG,下图中,左侧是28pin的PRG定义,中间是32pin的PRG定义,右侧是我这次选用的32pin/256KB的Flash芯片的定义。

image

我们这次选用的卡带是28pin/128KB的PRG芯片,根据前面所说的,这盘卡带的PCB电路板HVC-SLROM是兼容32pin/256KB的PRG芯片的,所以我们用Flash芯片对照32pin的PRG的针脚定义来对应就可以了。

此外,有两个控制针脚是要焊接到卡带金手指上的,金手指上在头尾和靠近中间的位置都有针脚编号,可以很容易地数到要焊接的目标针脚。

======== Updated on 2017-08-09 ========

MASK ROM的针脚布局并不一定是完全相同的,但FC卡带插槽的针脚定义以及同一种MMC芯片的针脚定义一定是固定的。所以在拿到一盘卡带时最好用万用表测量一下。通常同一个厂商所开发的卡带都会使用相同的MASK ROM针脚布局。 Flash芯片的控制针脚和卡带之间的连线通常是如下的对应关系:

Pin FC 说明
WE# CPU R/W 对应卡带金手指的14pin。
OE# PRG /CE PRG /CE通常在MMC芯片上。也存在很多例外,这时就需要利用74芯片来自制。
CE# CPU /ROMCS 对应卡带金手指的44pin。

MMC1芯片是有PRG /CE针脚的。

下面的对应关系只列出针脚位置定义不相同需要飞线的:

Flash PRG Edge Connector 说明
Pin 1 +5v   256KB的Flash芯片的pin1是NC(not connect),可以悬空。
Pin 2 Pin 24   地址线A16对应
Pin 22   Pin 44 Chip Enable,按字面理解吧
Pin 24 Pin 22   我也不知道为什么OE#对应/CE
Pin 30 Pin 1   因为RAF World是128KB,所以这个针脚其实用不到。
Pin 31   Pin 44 Write Enable,写入使能

根据上面的对应关系把Flash芯片需要飞线的针脚用钳子掰直,准备工作就完成了,下面是一张更直观的图。

image

准备CHR

再来看CHR,下图中,左侧是32pin的CHR定义,右侧是我这次选用的32pin/512KB的Flash芯片的定义。

image

MMC1的CHR最大容量是128KB,所以我选用的512KB的Flash芯片的中A17和A18脚这两个地址pin是用不到的,对于用不到的地址pin,我们需要把它们接到+5v上来屏蔽掉用不到的存储容量(接到GND也可以),而从上图可以看出,A18和A17对应CHR的相同位置上正好都是+5V电源,所以就不需要对这两个针脚做任何处理。但是如果要做合卡,这两个地址pin会起到关键作用,这一点后面说,先循序渐进从制作单卡开始。

既然CHR只支持128KB,那为什么我要选一个512KB的芯片呢?其实原本我用的是和之前“准备PRG”里一样的SST39SF020芯片,结果做出来的效果就是下面这样:

image

后来我咨询了高人byemu,告诉我在MMC1的卡带上,SST39SF系列芯片都不能作为CHR使用的,高人原话是39SF芯片的指令范围大,而MMC1只有2个4k 或者1个8k模式,如果是MMC3,有6个bank,就能用39SF芯片。反正我是搞不懂,完全属于我的知识空白,总之按照高人说的做肯定没错的。

======== Updated on 2017-08-13 ========

关于SST芯片无法用作MMC1卡带的CHR的问题,通过自己学习琢磨,加上不断请教byemu同志,总算弄明白了。

首先,说明一下Mapper芯片Bank Switching的逻辑。

image

上图是对于Mapper切bank的一个很形象的比喻。FC的CPU或PPU同时能寻址的数据大小有限,这是FC的基本知识。类似于手表的日期显示,一个月虽然有30天,但我们只关心今天是几号,所以手表就负责每天转动日期转盘,把当天的日期显示在窗口中,有的手表还可以显示星期几,这样就有了两个转盘和两个窗口。而Mapper芯片的作用就相当于手表的日期功能,给FC提供了窗口(Bank)和转盘(Rom)。

比如”魂斗罗”是256KB容量/Mapper 4/MMC3芯片,其PRG ROM为128KB(CHR ROM也是128KB)。MMC3将CPU的寻址范围(0x8000~0xFFFF,共32KB)划分成4个窗口,每个窗口8KB($8000-$9FFF、$A000-$BFFF、$C000-$DFFF、$E000-$FFFF),也就是说MMC3具备4个8KB大小的CPU Bank。那么,128KB的PRG ROM按照8KB的窗口大小将被分成32个Rom Bank,这就是转盘。MMC3可以从这32个Rom Bank中按照需要选择4个显示在窗口中,这就是切Bank。CHR部分同理。

总共有三个转盘:PRG RAM、PRG和CHR,窗口的大小也不是固定的,可以是1k,2k,4k,8k,16k等,不同的Mapper芯片对于窗口的数量大小有不同的配置。

Mapper芯片需要通过写指令寄存器的方式来进行Rom Bank的切换。这个网址:http://wiki.nesdev.com/w/index.php/MMC3记录了MMC3的Bank配置和Register的指令说明。这些信息在研究Kazzo烧录的时候会用到。

接下来回到正题,从Flash芯片的datasheet上可以查到,SST芯片的指令地址为0x2aaa和0x5555,而其他厂商如AMD和MX等的芯片的指令地址都是0x02aa和0x0555。我们这里称前者为高位指令,后者为低位指令。

image

我画了一个芯片地址线和物理容量的对应关系图,从中SST芯片的指令处于高位,需要A14~A0共15条地址线来寻址。而其他芯片的指令地址处于低位,只需要A10~A0共11条地址线。

image

再仔细研究datasheet,在MX29F004的指令表下方找到上面这个备注说明。意思是芯片接受指令时只关心A10~A0这11位是否为2aa或者555,而指令在A10以上的高位数据都会被忽略。现在我们来把十六进制换算成二进制:

位置 HEX Binary
低位 0x02aa 00000 01010101010
低位 0x0555 00000 10101010101
高位 0x2aaa 00101 01010101010
高位 0x5555 01010 10101010101

这样就一目了然了,0x02aa和0x2aaa的11个低位完全一样。而根据datasheet,MX29F004接受指令时只看11个低位,11位以上的高位都会被忽略。所以0x2aaa或者0x5555这些高位指令一样可以被MX29F004所兼容。

但反过来情况就略有不同,接下来以MMC1为例说明这个问题。先来看MMC1的文档(http://wiki.nesdev.com/w/index.php/MMC1

image

MMC1的CHR只有两个4KB的bank窗口,其地址为0x0000~0x0FFF和0x1000~0x1FFF,是无法支持高位指令的。

  • 第一:因为如果在0x1000~0x1FFF窗口中给0x5555写入指令,就会把最高位的5丢掉,只有当0x1000~0x1FFF窗口切到Rom转盘上0x5000这个Bank时才能得到0x5555这个地址。同理,必须切到Rom转盘上0x2000这个Bank时才能得到0x2aaa这个地址。
  • 第二:0x2aaa和0x5555两个地址之间间隔超过了10KB的距离,而PPU最大寻址范围也只有8KB,所以没有办法在同一个窗口中同时看见0x2aaa和0x5555这两个地址。所以对于高位指令的操作就需要两个Bank窗口来完成。
  • 第三:每写入一个字节的数据都遵循“发送写入指令然后写入数据”的步骤,中间是不能切换Bank的。MMC1只有两个CHR Bank窗口,必须要切到Rom上的0x2000和0x5000这两个Bank才能发送指令,而发完指令要写数据时又不能切Bank,所以永远只能往0x2000和0x5000这两个Bank上写数据,而其他30个rom bank永远访问不到。

因此,MMC1的CHR不支持高位指令的Flash芯片。

======== Updated on 2017-08-09 ========

用于作为CHR的Flash芯片的控制针脚与卡带之间的连线通常是如下的对应关系:

Pin FC 说明
WE# PPU /WR 对应卡带金手指的47pin。
OE# PRG /RD 对应卡带金手指的17pin。
CE# PPU A13 对应卡带金手指的56pin。

下面的对应关系只列出针脚位置定义不相同需要飞线的:

Flash CHR Edge Connector 说明
Pin 2 Pin 24   对应上A16地址pin
Pin 22 Pin 31   CE#对应/A13
Pin 24 Pin 2   OE#对应/RD
Pin 31   Pin 47 Write Enable,写入使能

根据上面的对应关系把Flash芯片需要飞线的针脚用钳子掰直,准备工作就完成了,下面是一张更直观的图。

image

飞线和焊接

网上能找到的改造卡带的资料很多都是用包皮线来飞线,缺点明显,如线太粗、定型效果不好,焊点处包皮受热收缩导致导线一定程度外露等等。

image

所以我选择了0.2mm的聚氨酯漆包线,可直接焊接不用预先刮涂层,实测各方面特性都很好,价格超便宜,这么一卷可以用很多年了。

焊接的过程没什么好说的,按照上面的表格确保对应好,按部就班,不要焊错,不要有虚焊,漆包线线头先用烙铁蘸锡点一下,发现上锡了就表明绝缘涂层化开了,否则焊锡是裹不到线上的。

image

image

上面是我做成功的第一盘卡带,走线及其难看。然后我就想着怎么能够改的更整洁美观些,于是就做了第二盘,如下。

image

image

这次我把飞线都走到了芯片背面和电路板之间,除了要焊到金手指上的线以外就基本没什么明线了。

烧录游戏

烧录的形式是由选择什么烧录器来决定的。

大众一点的方式是购买通用的PROM编程器,在网上搜编程器或者烧录器能找到一大堆结果,但是要注意的是这些大多数都是用于串行EEPROM和MCU单片机的,并不能烧录并行PROM。我在一篇国外的文章上发现了一个叫TOP853的编程器,然后自己搜了一下发现这个型号已经停产了,但是还能买到,价格也不贵,不过有个大问题是只支持WinXP系统。它的升级版有几种,其中TOP2013这个型号是支持win7和win10的,同时价格也不算太夸张,就是下面这个样子。

image

用编程器的的烧录过程是先把FC游戏的ROM文件用工具解开成PRG.bin和CHR.bin两个文件,然后分别烧录到两个Flash芯片里,再焊接到卡带PCB上,同时进行必要的飞线处理来将地址线和数据线一一对应。这是早期的卡带改造方式。因为芯片焊接到卡带上就无法再进行烧录了,所以Flash芯片的WE#和OE#分别接到VCC和GND就完事。

具体的改造过程可以参考下面这个链接:http://www.callanbrown.com/index.php/advanced-mmc3-nes-reproduction

后来出现了Kazzo烧录器情况就不一样了。Kazzo NES dumper / programmer,一个日本人开发的工具,既可以dump卡带,也可以进行烧录的开源工具。

image

项目地址:https://zh.osdn.net/projects/unagi/wiki/kazzo_intro_en

你可以在里面找到所有Kazzo烧录器的原理、PCB设计、软件、烧录脚本、使用说明等所有资料,动手能力强的完全可以自己DIY制作一套(也可以直接买现成的)。要说明的一点是这个项目里的文档基本都是日文和英文各一份,对于不懂日语的人非常友好。但我后来发现英文版的文档质量比日文版要差很多,所以建议在学习的时候一定要看日文版,不懂日语没关系,用google翻译转成英文(一定要转成英文,转成中文后狗屁不通)再看。

image

把改造好的卡带插进Kazzo,通过usb线连接到电脑。

下载烧录软件unagi_client_windows_062.zip,解压到本地磁盘,运行anago目录下的anago_wx.exe图形界面客户端(还有一个anago.exe是命令行工具,anago_en.txt是使用说明)。

image

先进入progaram选项卡进入烧录模式(如果是从现有卡带下载游戏rom可以进入dump选项卡。软件的界面简单易懂,这里不多说),下面是主要的选项说明:

  • script:烧录脚本,对应卡带的mapper类型。
  • ROM image:要烧录的游戏ROM
  • Program flash:PRG烧录进度和芯片型号选择,列表的芯片型号并不是一个prom大全,但是涵盖了eprom\eeprom以及不同容量的芯片,所以列表中的某个型号其实可以对应多种不同品牌的存储芯片。
  • Charcter flash:CHR烧录进度和芯片型号选择,同上。
  • compare复选框:烧录的同时对烧录的数据进行校验,应该勾选,这样烧录的时候如果校验失败就说明卡带的飞线或者焊接有问题。

======== Updated on 2017-08-15 ========

anago已经预置了一部分Flash芯片的支持。但我手上的芯片有SST39SF020/SST39SF040/MX29F004TC,除了39SF040,其他两个在列表中没有。 实际上,烧录时一般只要选择和手头芯片容量一致的配置就可以。但是对于完美主义者这样是不行的,下面是我的自定义配置。

["MX29F004TC"] = {
	capacity = 4 * mega, pagesize = 1,
	erase_wait = 8000, erase_require = true,
	retry = false,
	id_manufacurer = 0xc2, id_device = 0x45,
	command_mask = MASK_A10
},
["SST39SF020"] = {
	capacity = 2 * mega, pagesize = 1,
	erase_wait = 100, erase_require = true,
	retry = false,
	id_manufacurer = 0xbf, id_device = 0xb6,
	command_mask = MASK_A14
}

Flash芯片的配置在anago/flashdevice.nut文件里,把上面的文本粘贴进去,并且可以把不需要的芯片配置注释掉。然后在烧录界面中就可以选择上面两种芯片了。

  • capacity:芯片容量。mega代表1Mbit,即128KB,所以4*mega就代表512KB
  • pagesize:每个烧写单元的大小。Flash烧写数据有两种方式:Byte Program和Sector Program,这里的两种芯片都属于前者(datasheet里找)。而对于Byte Program来说,一个page就是一个字节,所以这里的值为1。
  • erase_wait:擦除时间,在芯片Datasheet中可以找到。
  • erase_require:烧录时是否需要先执行擦除(erase)操作。
  • id_manufacurer:芯片制造商标识,datasheet里找。
  • id_device:芯片标识,datasheet里找。
  • command_mask:芯片的指令属性。MASK_A10为低位指令,MASK_A14为高位指令。

设置好烧录选项点击program按钮,等待进度完成,一张可重复刷写游戏的自制烧录卡带就制作完毕了。

image

上机测试一切完美!第一盘FC烧录卡完成。

- End -