大概是20多年前时候,家里老爹给我买了一台小霸王游戏机,哦不是,是学习机,当然我从来没有拿来当做学习机过,这也算是和绝大多数人一样,开启了游戏的启蒙。
有时候为了买一张卡带,我会走半小时去很远的文具店,就为了省下公交费用,但当年的卡带很多忽悠人,比如什么500合1,可能375都是重复的(当然现在还是会这样干)。
现在各种卡带,不管是自制还是原装的,都已经随处可见,而自己制作卡带除了是探索与学习外,也是愿望,是完成童年懵懂时候的期待,这些是网购一张成品所不能给予的。
对FC/NES卡带的研究
了解NES与FC的差异
结束以前的遗憾
情怀
情怀
情怀
其实从理论来说很简单,只要你烧写的内容是机器可以读出的数据就可以了,几乎所有卡带机应该都是这样。比如下图就是一张玩家自制的SNES卡带,上面只是有一个EPROM(紫外擦除只读存储器),只要焊接好再插上去,让游戏机去读这个ROM就可以了。
但实际上,更早的8位机受限于性能,所以卡带的设计完全不是什么“单纯的存储器”,而有更全面的设计思路,毕竟机器再升级硬件不现实,但卡带可以升级,甚至后面能处理一部分音频数据。
所以这一次就来聊一聊,NES和FC的卡带、机器的差异,并且说明一下如何正确的烧写游戏到自制的UNROM类型NES卡带。为什么是NES不是FC?因为NES卡资料更多,所以制作难度低也比较容易入门。
在一切开始之前我觉得有必要科普一下一些知识,比如很多人(包括我)有听说FC和NES在硬件设计上没区别,那么很容易就会默认卡带也是没有区别。而且对于绝大多数接触FC仿制机的朋友来说,很难了解NES的相关情况。
然而事实上区别还是有的,并且还挺大,这里就来说一下FC卡带和NES卡带的主要的差异。
在卡带外观上的差异非常显著,FC卡带通常都比较小。
而NES卡带和机器一样,是为欧美市场特制的,富有力量、粗犷和男子汉气概等各种80年代欧美文化要素,所以它的外观很大,当然里面的板子多数时候没有那么大。
但也有极少数的,很大的时候,比如这一个《最终幻想》的卡带,上面甚至有两个PRG ROM用来存放高达256KB的游戏资料。
然后这时候可能会想到,为什么以前买到的黄卡,可能有些既不是上面这种规格也不是NES这种?
这是因为黄卡在早些时候,使用了大容量的ROM,加上上面的Mapper芯片AX5202P也很大(后面我会说这是什么),所以板子完全不是任天堂原版FC卡带尺寸能塞下的,因此有了这样的大黄卡。
当然这还和产业链有关系,例如批量的未授权黄卡必然代表有人在批量的生产这种大体积的外壳了,只是因为当年的任天堂没有国内代理公司也没有分公司所以这些事情都没有被追究。
第二点,CIC(Checking Integrated Circuit)芯片
从内来看,NES的卡带是需要有区域识别芯片的,防止把其他地区的卡插到美国游戏机上,如果没有这个芯片,无法正常地读取ROM
可以看到,虽然都是UNROM卡类型,但是下面这个FC的卡带没有区域识别芯片,也就是最左边的这一个。不过办法其实还蛮多,CIC芯片可以通过额外配置(飞线外挂)的方式实现读从而让机器正常运行,或许这也算是任天堂最早的防盗版方式的应用。
我看了后就想,要是直接在NES主机的插槽那边安装一片CIC,岂不是任意卡都不用装这个芯片了?
NES卡带的插槽更宽并且引脚数量和FC的差很多,一个是72pin一个是60pin,多出的引脚一部分就是用来做识别使用,然后有一些EXP引脚,或许是用于外设、扩展等类。
也因此,可以轻轻松松地把FC卡带转接到NES卡带上面。这样的转接器还蛮多。
当然卡带转接也可以只是为了转区而转,比如这样一张用于转区的MD转接器。
那这里可以说一下卡带插槽的线路了,和现在大部分串口不一样,早期存储器是并口的,也就是数据是一次读出8Bit。这里的D就是Data,而这部分是内存一次读写的数据量。
想要确定读取的地址是哪里,就需要地址线也就是下图标注的A,Address,内存地址相当于门牌号。可以看出来FC在设计上最大支持15bit的地址线,因此地址最大值为就是2的15次方,数据存储最大值为8bitx2x15也就是256Kbit合32Kbyte。但是,这里的引脚连接的是PPU,PPU硬件只能读8KB,所以虽然支持32KB但实际只有8KB可以读出。
这些前面带有P的,就是用于读取PRG ROM的引脚,这一看也是15bit,所以说FC默认设计下就是只支持32KB的PRG ROM和8KB的CHR ROM。
所以这样的引脚设计,使得最基础的,没有任何用于提高寻址范围的逻辑芯片的卡带基本上是这样子的。
虽然说FC卡带可以直直的安装,但是NES的卡带是要按下去(注意手的操作)让上下两排都物理接触才能正常读取的。但我买的一张合卡在弹起的状态下,居然也没有问题。
这种需要按压才能正常读取的操作除了安全起见,也是为了防止一些问题,事实上NES已经非常尽量的做了减少问题的设计,包括但不限于防止力气大导致卡带反向插入。
若回看一下刚才的引脚定义可以发现,不管是FC还是NES,卡带的右上角和左下角的VCC供电引脚都是对称设计,这样就算是插反了卡带也不至于损坏。
在最开始的时候我的理想是我想要玩什么游戏就做哪个游戏,但实际上,完全不行,甚至很不好选择。
这个是因为游戏的不同所以使得卡带有不同的特性,比如说有的游戏需要存储存档文件(例如《最终幻想》),有的游戏程序声音和图像存在不同的芯片内(例如《马里奥》),还有的自带音频芯片(比如KONAMI的《魍魉战记》),这些不一样的需求和设计,使得卡带类型多种多样起来。
加上FC和NES的不同,让卡带的种类几乎翻倍,而因为一些限制比如说国内研究卡带的人不多大多数受限于时间只能收藏,所以很少有关于FC卡带的数据库和研究,也因此你可以看到模拟器叫做NES,卡带数据库也都是以欧美卡带为基准来建立的,关于FC的卡带的研究,相对NES的少一些,公开资料也更少。
那么,常见有哪些?NROM,AxROM,UxROM,TxROM,CxROM,VCRx等等,还有很多,在这里举出的卡带类型中,这一个x代表某个字符。
其中还会产生一些细分,以TxROM举例,可以看到有分自带CHR ROM和CHR RAM的差异。
总的来说这样一分,卡带的类型可以说是非常多了。所以在一些抉择后,以及在资料的搜索难度极力求简的背景下,我认为最适合教学的是UNROM卡带,它多数时候就只有PRG ROM和CHR RAM,在芯片烧写时候只需要烧写一片PRG ROM。
当然既然有相对简单的就会有相对难的,比如说TxROM这种,带有电池记忆和RAM,还有CHR ROM,MMC芯片,PRG芯片等。像是TxROM这类MMC卡带的特点是,MMC卡有一个专门的芯片MCC芯片来实现对更大容量的ROM支持,而其他的有些就只是用逻辑芯片来完成这一操作比如UNROM。
很多英文和中文混一起就看不懂了?下一章节我会介绍各种芯片作用。
用于存储游戏的图形文件,这是一个只读存储器,但有些游戏并没有使用到这个,具体表现为使用FamilyROM工具打开ROM文件会发现CHR是空的
所以,在一些时候它才会被需要,里面会填充这样的数据,如果是在PC端可以使用YYCHR工具查看CHR ROM里面存储的图像
用于存储游戏的程序文件,这通常是一个只读存储器,也是所有卡带必备的一个芯片,可以没有CHR ROM,但是PRG ROM必须要有。
CIC这一个芯片的作用很简单,就是区域检查,用来和主机那边联络以确定你是不是把美版的卡带插在NES,把日版的卡带插在FC上。
这一个随机存储器在除了UNROM以外的卡带上会配备,有一些游戏因为设计原因会需要使用RAM来读写一些文件,因此就使用到这一片芯片。
用来存储ROM中的精灵的数据,精灵指的是FC设计上由PPU处理的图形数据,比如《马里奥》中的马里奥。
CHR RAM是用于存储PRG ROM中的数据,包括场景的翻页等等,或许可以理解为显存的缓存,PPU原本只能支持8KB,但现在可以通过从PRG ROM不断取用放进CHR RAM来突破限制。
因为寻址大小关系,所以6502本来最大只能40KB的PRG ROM和8KB的CHR ROM,但是80年代哪来那么小的游戏呢,所以,为了解决这个难题,比较基本情况就是使用Mapper电路芯片来辅助,实现超越CPU限制的32KB和8KB大小寻址范围。下图就是一张超级马里奥兄弟的SNROM类型的卡带。
Mapper芯片,通称MMCx芯片(x等于某个数字也表示芯片代数),这个芯片的作用直白来讲就是让寻址范围更大,能支持更大的ROM,比如1024KB,一块芯片就能替代繁杂的逻辑芯片,解决设计短板。除了任天堂自己生产的,国产的AX5202P是目前还能买到的少数Mapper芯片的一种。
这个芯片早几十年就停产,因为后面已经有了集成度更高的“牛屎”,板载环氧树脂封装,也叫邦定封装,有个说法是没有硬封装是因为80年代我国芯片产业严重受限没有设备。
需要在意的一点是,牛屎不是国产“专利”,任天堂官方也会使用牛屎芯片,因为这类封装体积小,成本比硬封装的便宜一半有余。
前面已经说明了,不同游戏会对应不同的卡,比如《超级马里奥》是UROM,《松鼠大作战》是SxROM,而《魂斗罗》是UNROM,各不通用,那么想要找到游戏和卡带的对应,会需要一些查询。这里我提供两个使用到的网站,它们罗列出URNOM类型卡带的游戏。
找到游戏名称之后,可以到一些具有游戏数据库的网站去下载ROM测试,在研究过程中我发现这三个站点结合使用效果最好:
甚至在emulatorgames平台你可以先试试游戏怎么样,这家对80年代游戏的查找命中率相对较高。
在查找并且下载了你需要的ROM后,我们会需要使用这一个工具FamiROM,这一个工具的作用非常简单,就是能切分.nes格式的文件为CHR和PRG 两部分ROM文件,并且显示必要的信息
当然并不是所有文件都能被正常读取,事实上我测试了一下读取率在12%左右,出现下面这类提示不是权限问题什么的,而是软件不支持。
当然你要是下载的一定是UNROM的NES文件它一定可以读取,或者凑运气从这些随处可以下载到的ROM合集中一个一个尝试能不能被famiROM软件识别也可以(我确实这样干过)。
在使用famiROM打开一个UNROM的ROM后,选择PRG的大小为512KB,并且点击split。
之后就可以在.nes文件边上看到.bin文件,也就是我们将要烧写进卡带ROM芯片内的数据。无论多少大小都要选择512KB。
制作这块,我尽量想着写的简单一点,但是简单一点似乎就会造成更多的不方便,等后面有视频教学我想可以所有人看得懂为目标。因此这一篇文章中的第五章节开始,可能会有一些基础知识被忽略,总的来说如果您不太了解一些名词,这是非常正常的。
一些制作过程遇到的问题我也不删减而是全部放出,作为未来的经验参考。
在理解了前几个章节的内容后,我们可以开始着手进行制作了,那么我将会列出所有使用到的东西
吸锡带
吸锡器,越大越好
无铅焊锡,有铅当然也可以
T12烙铁,推荐搭配刀头
用于ROM和CIC的编程器
剪钳
Attiny13
SN74LS377N
SN74LS32N x2
SN74LS139(可选)
UNROM 512 SinzoMOD VA1或原版UNROM512
39SF040
UT6264
104独石电容 x5
3mm LED
470k电阻
IC插座 8P
IC插座14P
IC插座 20P
IC插座 28P
IC插座 32P
防静电手套
Windows系统,NES Emulator,famiROM工具,还有上述烧录器对应的控制软件。考虑到对难度的优化,我打包了会使用到的几个工具,当然不保准链接会失效。
当然这里有个很重要的东西是PCB板,这里我提供下我修改的UNROM512板子的gerber文件,它会更加匹配这一篇文章,出于一些战术考虑,我配置的协议是CC-BY-NC 3.0,若您是个人使用可以随意发挥,未授权商用将侵权(包括闲鱼)。
在下单时候必须要注意,一定要选择1.2mm厚度因为卡槽支持的是1.2mm,当然如果真的不相信这个厚度,硬插坏了可以在网购站点搜索NES 72 Pin Connector重买一个槽。
为什么要注意这个厚度呢,我不会说在最开始的研究初期,打板打成了1.6mm,还是别人提醒我才发现的。
在制作上面,我个人是先行焊接一个都是插座的板子,它将被用于测试与验证CIC以及ROM。
这样带来的好处是可以通过替换芯片的方法来验证是哪部分有问题,我用一个镊子可以轻松的从插座上面撬开芯片。
等验证板都验证清楚了,确实没有问题后,再焊接为一块成品UNROM游戏卡。
NES卡带的内部空间并不能容纳带插座的板子,需要裸板测试。
还必须要拆机来方便插入卡带,NES的拆机没有什么难度所以这里不做说明。
在实现上,有些时候可以使用原厂的芯片比如说Nintendo 6113B1,但我推荐使用Atmel公司的Attiny13来自制,最为廉价的情况就是利用avrdude软件+Arduino ISP以及Attiny13这一个芯片,这也是目前比较实用的解决办法但有严重弊端。
在一开始采用这种方式,使用一个Arduino Nano做成了烧录器。
这种使用Attiny13烧录程序变成CIC芯片的操作的原作者开源了代码,并且放出BIN二进制文件下载。
如果使用命令行来烧写我用的语句是这样子的,需要保证你已经安装了Arduino IDE
Avrdude.exe -C C:\Users\wzx13\Documents\ArduinoData\packages\MicroCore\hardware\avr\2.1.0/avrdude.conf -v -pattiny13 -cstk500v1 -PCOM3 -b19200 -Uhfuse:w:0xfb:m -Ulfuse:w:0x70:m -Uflash:w: D:\Download\Avrciczz-v3.tar(1)\avrciczz-v3/avrciczz.hex:i
可以使用GUI,也就是有界面的配置工具 ,需要注意的是,熔丝位必须是低位0x70、高位0xFE。
但是一番烧写下来,虽然提示我烧写成功,但是我总觉得CIC不太对,因为识别不正常一直在灰屏闪烁,这是机器在自己复位。
我是如何知道的?挺简单,我有一张140IN1的NES卡带,我拆下了CIC 芯片(和我的是同样型号)进行验证。
为了方便替换,我焊接了一个直插座。接着通过把【我烧的CIC芯片】插在【140IN1卡带】以及【140IN1卡带CIC芯片】插在【我做的卡带】上,可以得知我做的卡带ROM和CIC芯片都没弄好。
是不是CIC芯片的开源文件有问题?我试着使用读取的方式来实现导出【140IN1卡带】的CIC芯片中烧写的程序,具体语句如下:
avrdude.exe -CC:\Users\昵称\Documents\ArduinoData\packages\MicroCore\hardware\avr\2.1.0/avrdude.conf -v -pattiny13 -cstk500v1 -PCOM3 -b19200 -U flash:r:attiny13flashdump.bin:r
除了这种工具外,我又测试了几个工具后发现, AVRDUDESS 这一个是在功能上最好的GUI工具。所谓GUI就是有这样的图形界面,当然需要进行一下配置,像是图中这样。 我使用我已经烧写过的芯片进行一下测试,熔丝位好像可以正常的读取出来(熔丝位:一种芯片自带功能的配置参数,类似于内置开关),但是又觉得不太正常。
通过强行读取确实是读取出了【140IN1卡带的CIC芯片的程序】,但是并不是很确定是否真的成功。
另一边比较糟糕的事情是,在一整天的尝试过程中,我可能是把三片芯片都给全部损坏了,无法读取芯片的识别码,损失重大。
还有一个USBASP烧录器,这个东西很便宜,我承认是为了凑单买的。
然而,我在电脑蓝屏几次后,它也是一起无法使用,直接提示找不到设备,当然这个东西只要9.9包邮,我也不太指望能用几次。
这一些9.9包邮的下载器不靠谱
自制烧录器虽然很廉价就可以获得,但是并不靠谱
在不断烧写中,芯片可能都坏了?但不确定是不是插座问题
当然这样也不是办法,在【认为手头芯片都报废】的几天后我收到了我买了一个新的工具,烧录器MiniPro TL866A,我购买的是二手的,售价在150左右。阴差阳错的,收到后我发现居然和参考的一篇文章作者用的是同款。
另外我又额外的购置到了比较便宜的翻新Attiny13(又不是不能用),只要3元就有一个,关键是10个包邮。当然他们不是最先买的那种DIP8的封装了,而是这种SOP8的封装。
这也意味着我必须要买个SOP8弹跳座,用来在不焊接的情况下,使用编程器烧录芯片。
但是临时原因在撰写文章时候还没有到货,所以我使用仓库中剩余的这些转接板来转成DIP的。
因为通用性好,所以能用这一个装置就烧录手头几乎所有的芯片,包括27Cxxx(紫外擦除芯片,中华学习机的ROM是这个系列),39SF040(这次用的装PRG的ROM芯片)。趁着之前烧坏的芯片还没被我丢掉,我想着试试看先前时候读不出来的芯片还行不行,结果当然是毫无问题,看来之前感觉出问题是因为自制的烧录器坏了。
然后我去读了【140IN1卡带】上面的那一个CIC芯片,发现是加密的(这是当然),可以看到右边ASCII码全是ABCDEFG。
这里以TL866对应的MiniPro烧写器为例说明如何烧写CIC芯片,其他也是大同小异。
第一步,打开软件并且选择ATTINY13,按照提示正确的安装Attiny13芯片到编程器上。
第二步,选择AVRCIC的程序文件avrciczz.hex,文件包的下载地址链接:点击跳转,提取码:5e0a。 第三步,选择熔丝位Fuse Byte以配置芯片功能,很多时候忘记这一步会导致芯片没有正常的发挥作用。
第五步,使用验证板进行测试。这里要注意的是,刚刚烧完后,需要很多次的RESET来让芯片自动识别区域,具体会需要5-20次。
如果说按压多次RESET都不正常,还可以尝试使用一个棒状物轻微压住卡带。
在比较早的时候,我有一个编程器 TOP2000 ,和后面的序号一样,是一款1999年左右的产品。之前时候我用来处理中华学习机的EPROM。
然后,我发现一个大问题, 就是这个编程器的处理EEPROM的速度有点慢腾腾。在设计上,默认使用39SD040,也就是512KB的芯片,而你如果使用这一片的话,写的时间硬生生的拉长到了45分钟。
但是,因为之前处理CIC芯片我买了一个新的编程器TL866A,所以新的编程器烧写很快的同时,也让烧写的内容终于是正确的。算了一下速度,大概是比之前的TOP2000型号编程器快了60倍,只要44秒。这告诉我们,不要为了省钱买老旧生产力设备。
但我看了一下订单历史,这价格、时间好像也没有差很多。
因为如何烧写与上面的5.4章节所述的是基本一致,所以不再复述,选择39SF040就可以。
整个过程是非常简单的,至于PRG文件的获取,查询看第4章中的描述。
我通过这种方式烧写并且确认一些可以正常游玩的游戏,具体的游戏文件等,我放在下载包内。
在设计上,UNROM512被配置为可以让PRG ROM中的程序自行重写PRGROM,这样就可以免去电池以及存储数据的SRAM,也因此就有了一块额外的139芯片以及许多选项焊盘。这些焊盘的连线对重写PRG至关重要。
当然在一开始时候我因为是测试板,用的是普普通通的直插脚座,所以就不是很在意这种设计。
经过一些尝试后,我发现主要需要选择的,目前只有一个 ONE,VERTICAL和HORIZON的连线选项,这决定了屏幕的刷新方式。
ONE是整屏翻页,VERTICAL是水平卷动(比如《魂斗罗》、《超级马里奥》),而HORIZON是从下到上(例如《1943》,《彩虹岛》)。
如果选择错误的话,就会出现页面刷新的一些问题,比如这样,当然游戏还会正常的运行就是了:
具体的连线和是否要启用【Flashable】功能有关系,通常都是不需要的,所以只要这样连线就可以:
连接FLASHLOCK的4个焊盘
不安装139芯片
不焊接FLASHABLE焊盘
在经过最后的测试后焊接,一盘正经的NES游戏卡带《魂斗罗》美版就烧写好了。
如果说是FC,没外壳还凑合用,但是NES的话,要是没有一个合适的外壳那就只能机器和卡都裸着了。
所以我们需要卡带外壳,我购买的外壳来源是1688,我看了下加上邮费也比TB的更便宜,所以一次买了一些足够我塞我想玩的几个游戏。
最终的效果是这样的,我们做的PCB可以正常的被塞进外壳里面,成为真正的卡带。
如何查找原版卡带贴纸,依然还是使用nescartdb.com这一个站点来进行,搜索游戏的英文名称即可找到卡带表面的扫描图片。
如果实在找不到,用英文斜体写也可以,这样会显得像是一张内部流出的测试卡带,比如这一张《最终幻想2》。
表面的贴纸建议使用光面的来打印效果最好,我虽然有光面纸但打印机的彩色墨盒早早损坏了,因此后面就不提供实际的彩色的效果。
在下载后使用PS打开,可以看到并不是一个正常的比例,换句话说直接打印一定是比较小的,那么需要着手进行解决。
为了获得正常尺寸,先对手头的空白卡带进行图像扫描,没有扫描仪也没关系,章节末尾我会给出免费模板提供给各位。
把下载后图片和扫描出来的图片放在一起,然后对下载的封面进行调整。
经过一些简单调整我最后制作了这样一张正确比例的模板,使用A4进行打印, 链接:点击跳转,提取码:y0w2 对比一下,左边是普通的A4右边是光面纸,在观感好很多:
这一个问题发生在芯片已经被焊接好,但结果上下折腾无法正常出画面的情况,这里提供的这种方法适合所有直插引脚芯片但千万不要对任何的指示器类、发光类的元件使用。
首先要做的事情就是使用吸锡器大致的去掉引脚上的焊锡,当然这种方法很难去干净,不过没有关系。
当然这里我推荐在吸锡器上面弄一个V字口让烙铁的头部伸进去,当然一如既往我还是推荐使用刀头。
然后使用一个能干烧的加热平台,我给一个很少使用的电火锅底座加了PID控制器,这样很方便进行这种拆焊。
问题的排查其实并不是很难当然这里我还是写一下研究过程遇到的情况,当然在应用下列检查表之前,建议多按一按RESET键,或者吹一下卡带金手指,说不定会有奇迹。
屏幕不显示,喇叭有持续噪音:检查所有芯片的方向是否正确,正常情况是全部一个朝向
电源指示灯闪烁,按RESET 20次没有改善:检查CIC芯片引脚焊接情况,并且确认卡带正常接触,最差情况重新烧录一次CIC芯片
无法烧录CIC,提示识别不对:和编程器之间没有插好或者某个脚位的接触不良,损坏可能性不大但不排除
4. 屏幕在启动时候花屏、黑屏:第一种可能是CHR RAM的安装、焊接问题,检查一遍进行处理;第二种可能烧的是UROM或者其他需要CHR ROM或者PRG RAM的那种游戏,简单来说就是ROM不对
5. 屏幕在启动时候持续灰屏: ROM没有正常读出,但通过了区域检测的表现
6. 屏幕在游戏游玩时候花屏:检查ONE,VERITAL和HORIOZN连线是否正确
7. 拆焊下的ROM芯片不能正常读取:大概率是引脚断了,芯片因为温度损坏可能性不大,因为真正的核心部分只有中间一点点温度很难影响到
到这里,整个教程就结束了,我是新昼,很高兴你能来看我写的文章,我们下次再见~
评论区
共 28 条评论热门最新