在家制作自己的ColecoVision

2020-07-12 05:52:42

当我在跳蚤市场的垃圾桶里发现一些便宜的ColecoVision墨盒时,我知道我必须把它们从垃圾桶之后等待着他们的任何命运中拯救出来。我该怎么玩呢?今天旧的ColecoVision的价格太可笑了,所以我开始建造一台。

尽管他们生产了200多万台,与美国市场上世嘉大师系统的数量大致相同,但仍有一些问题似乎正在削减旧ColecoVisions的库存:

视频芯片的三倍电压“4116”DRAM(+5V、-5V和+12V)意味着DRAM产生的热量比它们真正需要的更多,然后过早死亡-这也意味着更复杂的电源也将发生故障;

容易出现故障的电源开关“滑块”设计,在出现故障时会产生难以诊断的“有点正常”的情况;

控制器端口的ESD保护较差,如果您经常与1970年代的毛毯或交换控制器一起居住在某个地方,则会损坏解码器;

没有NES或Atari 2600品牌的利基收藏家地位。

至少有三个这样的问题需要MOD来解决,但接下来你仍然需要确保ColecoVision的安全。如果我能轻松而廉价地做到这一点,你现在可能就不会读这篇文章了。

在我开始这个项目的时候,我在eBay上能找到的最便宜的工作ColecoVision是155加元。当地的分类广告更糟糕:一款未经测试的ColecoVision售价500美元,一款盒装亚当售价1800美元,令人垂涎。撇开投机者不谈,这为克隆人设定了相当高的预算。另外,我会学到一些东西--学到一些东西是无价的。尤其是如果你学得很辛苦的话。

使用复合视频。ColecoVision复合模式有很多,但是如果TMS99x8 VDP为了供给原始RF而发射复合视频,为什么不从一开始就这样做呢?如果我有幸在垃圾箱里放了TMS9928,那就更好了-能够像他们在欧洲Colecos上那样实现模拟RGB输出。也许在未来的…版本中。

试着把棋盘尺寸调小一点。最初的ColecoVision是一只巨大的野兽,特别是因为所有的电源管理和射频电路都不会包括在这块电路板上。我还想在合理的地方使用表面贴装芯片-它们更便宜,更容易获得,加起来会节省几英寸的电路板空间。

终于有借口买一台ROM编程器了。是的,它肯定需要一个BIOS ROM。

突然对一款相对不受欢迎的8位游戏机产生了浓厚的兴趣,这让我周围的每个人都感到担忧。

最大的障碍是我根本不了解内存解码,也不了解数据或地址总线是如何工作的。我从概念上理解,在一台旧的8位计算机或游戏机中,CPU以某种方式寻址各个组件,然后告诉它们该做什么,或者给它们一些数据。但我实际上并不理解它是如何工作的。这种缺乏知识的感觉就像是阻碍了我做一些很酷的事情,比如制作扩展卡,升级MSX中的RAM,或者构建我自己的单板计算机或RC2014克隆。

在翻阅了一大堆计算机体系结构入门教科书和英特尔服务手册后,我找不到一个很好的讲解员来解释这个问题,所以我决定开始向周围的每个我认识的人讨教,以获取提示。至少对于ColecoVision的Z80来说,在这一点上任何更复杂的事情都可能要了我的命。

最终,我能够把一些事实拼凑在一起,现在我将详细阐述这些事实,这样你们就可以跟上1982年计算机工程师聚会上的对话:

Z80可以访问大量内存-它有一条16位宽的地址总线,足以直接映射216=65,536个唯一地址(或64K的线性RAM)。

Z80还有256个I/O端口,这是我之前试图通过Basic修复损坏的PC-6001卷旋钮时看到的。

外围设备(通常)不知道或不关心CPU的内存地址或端口号:它们需要有人在它们开始工作时过来翻转它们的“启用”引脚。他们可能会研究地址总线的一部分,但仅限于他们实际能接受的数量(例如,原始ColecoVision上的8位“2114”RAM只有8个地址引脚)。

因为一条总线上一次只应该“启用”一个芯片(至少在ColecoVision上),所以CPU直接对话的每个人都将共享相同的地址引脚(它们位于相同的地址总线上)。

外设有时会映射到内存中,也就是说,它们会响应某个地址。因为外围设备不知道它们的地址是什么,所以这是解码逻辑的工作,它解释CPU请求的内存地址,以确定为哪个芯片打开使能引脚。

I/O端口也是如此,但是“地址”要小得多(只有端口号0-255才有效=8位地址),所以在寻找I/O端口时不需要注意16位地址的上半部分。

您知道CPU何时在寻找I/O端口,因为Z80的/IORQ引脚为低(/表示“有效(当)低”)。您知道何时查看内存,因为/MREQ很低。

如果您使用“REQ”引脚状态、地址引脚状态以及CPU的读取(/RD)和写入(/WR)引脚,您可以将一组基本逻辑门组合成一个组合,让Z80写入内存芯片或任何其他您想要的外设!

我认为,因为很多东西都是从你在上一步中学到的知识中衍生出来的,所以没有人真的会一下子把它们都写下来。或者,也许他们只是害怕在他们的解释中犯一个愚蠢的错误,看起来像我刚才可能做的那样完全愚蠢(祝贺你,你通过了测试)。希望我已经完成了我的(非常小的)部分,通过鼓励你鲁莽地在电路板上拍打芯片,并将类似的引脚连接在一起,来实现昂贵的工程教育的民主化。

因此,如果ColecoVision上的游戏期望外围设备位于内存或I/O端口中的特定地址,我们如何确定它们在哪里?幸运的是,一些匿名的天才已经在曾经存在于Usenet上的ColecoVision FAQ中记录了CV的内存映射和I/O端口映射:

0000H-BIOS ROM。1FFFH2000H-扩展端口。3FFFH4000H-扩展端口。5FFFH6000H-RAM开始(1K映射到8K点)。7FFFH8000H-购物车ROM(分为4个部分,每个部分单独启用)。FFFFH。

00-1F-无连接20-3F-无连接40-5F-Video60-7F-Video80-9F-无连接A0-BF-无连接C0-DF-SoundE0-FF-控制器;E2是特殊的,E0-E0显示为回读,E2显示为扫描-39。

我把这些都一字不差地抄了下来。如果你是这些地图的真正作者,我想和你握手,也要表扬你。

这些地址看起来相当圆--让我们看一下这些地址的二进制,看看为了解码它们,我们必须关注地址总线的多少位。我编写了一个快速的小Python程序,将它们从十六进制转换为二进制,并填充输出,因为尽管我感兴趣,但我仍然不擅长将十六进制转换为任何形式:

def to_bin(H):返回格式(h,';016b';)def walk_map(M):for(start_offset,Identifier)in m:print(to_bin(Start_Offset)+';';+Identifier)memory_map=[(0,';bios rom';),(0x2000,';扩展端口';),(0x4000,';扩展端口';),(0x6000,';开始RAM';),(0x8000,';购物车ROM存储库A';),(0xa000,';购物车ROM存储库B#39;),(0xc000,';购物车ROM存储库C#39;),(0xe000,';购物车ROM存储库D';)]io_map=[(0x40,视频';),(0x60,#39;视频';),(0xc0,&39;声音';),(0xe0,&39;控制器';)]打印(';内存映射:';)漫游映射(内存映射)打印(';I/O映射:';)漫游映射(Io_Map)。

内存映射:0000000000000000 BIOS ROM 0010000000000000扩展端口0100000000000000扩展端口011000000000000000启动RAM 1000000000000000车ROM库A1010000000000000车ROM库B1100000000000000车ROM库C1110000000000000车ROM库DI/O图:0000000001000000视频0000000001100000视频0000000011000000 sound0000000011100000控制器。

看起来只有高3位改变了地址。这意味着我们的解码器在解码内存时只需要关注A15、A14、A13,在解码I/O端口请求时只需要关注A7、A6和A5。

我草草写下了这张真值表,因为我依稀记得我在大学计算机科学本科硬件课上做过一张真值表。原来所有这些东西最终都派上了用场!

我想其他电脑一定要复杂得多,但ColecoVision的内存映射很好也很简单。谢谢,匿名工程师们,他们从制作卷心菜贴孩子中抽出一段时间来草草画出了这张记忆地图。

其实很简单,原来的开发者只用了两台74LS138去复用器。这些芯片所做的就是通过里面发生的任何事情的魔力将你的3个1位地址值变成一个8位值。

您还可以从那里切换3位启用,其中E1和E2必须处于活动状态,但E3根本不能使多路分解器工作。第三个使能位有点像“手刹”,但当你连接有自己的解码逻辑的外部设备(如ADAM)时,ColecoVision使用它来切断内部解码器。

我几乎只是把丹·鲍里斯在示意图中做的事情抄了下来,然后稍后再试着去理解它。结果看起来和我上面的真实表一模一样!这几乎就像其他人几十年来一直在设计计算机一样,而且很多部件已经存在,可以帮助他们做到这一点…。

一个小问题是,我挑选的替换SRAM-一袋5V耐压的三洋LC331632M-1264KB芯片,很久以前就是用来修复JVC X‘Eye的-有一个OE引脚,而原来的2114 SRAM没有。通过一个快速的小摆动,我把它从RAM的芯片使能和来自Z80的“读取”信号的共同努力中跑了出来。至少现在我可以说我在这个东西上设计了一个门,即使它确实引入了一个其他东西都没有使用的NOR芯片。

在内存和I/O解码工作完成后,是时候移植到TMS9918型视频芯片…上了。

不幸的是,TMS9918视频芯片被设计成与4116型8K DRAM中的64K非常紧密地工作。它们现在并不少见,但我不想把其中的8个放在我的电路板上,当我这里有一堆非常好的64K SRAM芯片时,我不想这样做。幸运的是,一个叫Tom LeMense的家伙已经知道如何将TMS9918转换成使用SRAM,所以我完全抄袭了他的设计。

他基本上使用几个触发器(假设是一位内存)来拦截TMS9918用来寻找其RAM的奇数球寻址方案,然后将该方案转换成像我这样的大型SRAM可以理解的东西。整件事让我头晕目眩,特别是当它开始使用通过多个反相器的信号的传播延迟来调整行访问定时时。

当然,增加了更多的闸门和逆变器,但我仍然在机器的这一部分取得了净领先。值得一提的是,TMS9918不会将其内存暴露给CPU:Z80通过I/O端口与其交互,然后9918有自己的独立内存总线,用于处理其视频内存的内容。我很高兴在这里省去了一些复杂性,而且很高兴有这么多人测试了它们。另外,他的原理图还制作了一个可行的复合视频输出电路。谢谢,汤姆!

我发现TMS99x8没有被CPU重置,这对我来说有点奇怪,因为我认为每个外围设备都必须重置。如果您没有扩展设备(例如ADAM)来为您重置它,它就不会被重置!我想BIOS必须完成所有的初始化,不想被否决。没有复位对我来说太令人惊讶了,以至于我不得不用另一套ColecoVision“Delta”板的原理图来证实这一点。

顺便说一句,您可能会注意到原理图上显示的是TMS9928。据我所知,TMS9918除了不能输出RGB之外,几乎与TMS9928具有相同的功能,而且它的使用范围更广-可能是因为它包括在每一个最终进入中国废品场的Msx1中。如果我不得不改用TMS9928(因为我可能读错了什么),那么可能需要重新做一次电路板,因为引脚有点不同,但这是在我的书中做更小版本的借口。

我有个朋友对钟有某种病态的憎恨。在没有进一步解释的情况下,我不得不假设这种恐惧源于他的电气工程课上的某种最后一刻的项目,就是不太顺利。我,我喜欢钟表。我喜欢他们的小手,我喜欢他们发出的滴答声。CPU时钟?哦,是的,我想我也可以喜欢那些。

最初的简历使用的是7.15909 MHz的水晶,这很难买到新的(DigiKey有几个供应商,但他们都是非袜子的)。它们有很多14.31818 MHz的晶体,所以我设计了我的第一个时钟分频器。

时钟分频器的工作方式是将原始时钟通过触发器。触发器更改其值的频率仅为时钟更改频率的一半(因为您将存储的最后一个值送入‘SET’引脚,而它实际上只在时钟的上升沿被设置),因此您最终得到的触发器输出的更改频率仅为进入它的时钟更改频率的一半。

我花了很长时间来尝试和理解它,尽管很久以前一位教授在我的大学硬件课程中向我解释过,直到我理解为止。德国人可能有一个词来表示你认为自己没有的知识,实际上你以前学过,只是没有内化。

帮助我最终意识到它确实起作用的部分原因是在电路模拟器中运行它。如果你想亲自试一下,我在那个电路模拟器里准备了一个测试项目。

由于CV的Z80和声音芯片的运行频率是3.57 MHz,所以从原来的7 MHz时钟已经有了一个时钟分频器。我所做的只是在前面堆叠了另一个触发器,所以从技术上讲,14 MHz被除以4,以满足CPU和SN76489的需求。

时钟还会以某种我还不太理解的方式乘以3才能产生TMS9918期望的10 MHz(而且非常挑剔,因为产生电视颜色需要精确的时间)。只有实际测试才能知道产生的时钟信号对于较新的PLCC Z80是否足够干净,或者我是否需要重做整个时钟部分,可能需要使用昂贵但容易的东西,如专用可编程振荡器。

正如已经多次声明的,原始的ColecoVision电源轨是+5V、-5V和12V-大约是您为VDP运行三电压DRAM所期望的电压。用更现代的SRAM代替那些DRAM的部分好处是我可以将电源线简化到+5V。但是,控制器解码逻辑仍需要“上拉”至-5V,如图所示:

虽然这可能是一个优化(无论是谁做的时钟电路和控制器解码都非常聪明),但在盯着它看了几个晚上并在电路模拟器中运行它之后,我无法真正理解发生了什么。所以我只是复制了整个重击,但是现在我需要-5V。我从哪儿弄来的呢?

几个月前,我发现了TI TPS60403“电压逆变器”,这是一个神奇的小SMD(5针SOT-23,用于“轻松”焊接)组件,可以接受从1.6V到5.5V的任何电压,并通过某种巫师魔法产生负电压版本。嘿,我已经有TI视频芯片了,也许他们会成为朋友。显然,这款芯片不能提供高达60 mA的电流,但这对这两个逻辑门来说可能已经足够了。它确实让我的零件充气了,而且价格不便宜,但也比加一个双电压电源便宜得多。

出于懒惰的原因,我决定不建造我自己的ColecoVision控制器。它们并不难构建,但我也不太愿意这么快就回到键盘矩阵中来。感觉我最近有很多这样的事情。还有一个问题是采购一个外壳-注射成型既昂贵,又是一个全新的痴迷领域,我现在不需要进入这个领域。也许我会在未来的某个日子里砍掉一个Aliexpress“不是任天堂”的、看起来像是Famicom的USB控制器。

我设法从eBay上以7.5美元的价格找到了一些松散的控制器。一个破旧的常规控制器,一个滚轮控制器和一个方向盘扩展模块加入了我的零件堆,还有一些游戏既不支持这两款花哨的控制器,也不支持这两款花哨的控制器。

这个批次的运输成本比应有的要高,滚轮控制器需要专有的电源,而且很难证明储存一个巨大的易腐蚀的转向控制器是合理的,因为我没有扩展端口,但有一个已知的原始部件来测试会很好。

如果没有其他事情,让滚轮控制器工作将是一个很酷的项目。我以前从来没有过,甚至在开始这个项目之前都不知道它的存在。也许它会让欧米茄种族变得更加甜蜜。

有了一半复制和一半制作的原理图,我终于可以开始有趣的部分布线了。在这一点上,我把电路板从100x100 mm扩展到150x100 mm,这样如果第一个设计出了问题,我就有足够的空间来修复它。150x100 mm仍然比190x135 mm的DVD盒小得多:

把电路板做得更大也会让布线更容易,但并不像你想象的那么容易。运行地址和数据总线的主要组件之间的空间仍然有限,所以我最终得到了很多通孔。CPU时钟轨迹特别难看,从BIOS芯片向上的时钟生成电路一直向下延伸到CPU:

我不确定更好地计划这类事情的技巧是什么-这可能是随着经验和“不应该做什么”的知识而成长的技能之一。当我移动IC时,我通常只是看着最小的摆动,试着尽可能地把它弄直,然后希望以后添加更多的元件时会有最好的结果。

我确保在每个IC上都加了一堆去耦的盖子--有总比没有好--尽管它们确实出现在了很难焊接的奇怪地方。从好的方面来说,总共有41个SMD 0805电容器和440805个电阻,我将会非常擅长表面贴装焊接。

在大约两个星期的早晚之后,我准备好了我的第一个版本的董事会。从上面看非常漂亮:

还不错。当然,这还不包括我的劳动时间、诊断时间,或者我未来可能要做的任何板子转速。而且所有的“旧零件”在未来都会变得更难找到,相应地也会变得更贵。它们中的大多数可能是从电子垃圾中回收的,因此对于大规模生产来说是不可靠的。幸运的是,我不是在做大规模的商业产品:我只是想满足我的冲动,以低于1993年的本田思域(Honda Civic)的价格买一辆ColecoVision。

我仍然需要买一个ROM编程器(最有可能是TL866)来编写BIOS ROM,这是我一直想要的工具,但从来没有真正有充分的理由获得。这当然会增加这个项目的总价,但这是我可以反复使用的东西,所以我不会再计算了。

董事会需要一些方法来远离办公桌,特别是现在它有了公司。

.