1979年以来首款便携式游戏机的复古设计



1974年,德州仪器(TI)推出了TMS1000系列的首批4位微控制器,英特尔于1976年开始生产其著名的MCS-48系列的8位微控制器。 然后开始。

由于微控制器的便宜和自给自足(当时它们被直接称为单芯片微型计算机),消费电子设备更加明智,其数量比以往任何时候都增长。 随着微控制器的出现,出现了诸如便携式电子游戏之类的设备,可以在该链接处估计“灾难”的规模。 在所有这些早期的游戏中,我将在本文中讨论的其中一个脱颖而出-这是Milton Bradley Microvision,这是第一款具有可更换弹药筒的便携式电子游戏,它同时使用了上述两个微控制器。 我还将尝试详细介绍此控制台的开发细节。

一般说明




Microvision于四十年前的1979年在美国发行。 总共为她售出了12盒带游戏的墨盒,其中包括-配有Block Buster控制台(《 突破》的模拟版),体育类-保龄球和棒球,著名棋盘游戏Connect Four ,Pinball的电子版。 大多数游戏都可以在MVEM仿真器上进行评估,该仿真器是基于一系列有趣的出版物制作的 ,从中我也学到了很多有用的东西。 在这里,我不会详细介绍游戏机的原始游戏,但我将立即转向游戏机的内部世界。



控制台的重要功能是2英寸LCD,分辨率为16x16像素。 以今天的标准来看,原始液晶显示器相当原始,但是与便携式游戏中使用的LED组件和真空发光指示器相比,矩阵LCD屏幕是一个相当进步的步骤。 除Microvision之外,同年,一系列具有类似屏幕的电子游戏Mego Mini-Vid发售了,但尺寸为13x20。 显然,在当时,这些是仅有的具有这种分辨率的矩阵LCD的设备。



显示器由Hughes SCUS0488芯片控制-这是一个矩阵LCD驱动器。 该驱动器由带有一对电容器和电阻器的UA79MG负电压稳定器供电,这是最简单的元件基础。


控制台的外壳中还包含控件-一个4x3按钮矩阵和一个10kΩ可变电阻作为拨片。 对于声音再现,有一个压电动力。

最重要的是为什么Microvision创造了历史,而每个人都忘记了使用可更换墨盒的上述Mini-Vid。



从外部看,墨盒是外壳的可拆卸上部。 弹药筒的中心有一个塑料屏幕覆盖着屏幕,每个游戏上都涂有彩色游戏元素和单独的铭文。 下面是薄膜后面覆盖的按钮孔,上面贴有签名,并且在每场比赛中,只为所使用的按钮孔。 根据作者的说法,弹药筒的这种布置可能使控制台对特定游戏的适应性最大化成为可能。


Block Buster游戏板,在机壳和背面

墨盒的电子部分基于两个微控制器之一-带必需的线束的TMS1100或Intel 8021。 将游戏机的“大脑”放在弹药筒中似乎是一个很奇怪的决定,但它只能让您每场游戏获得2枚筹码。 此外,它还增加了多功能性。 同时,显然由于微控制器的存在,墨盒的价格并没有增加太多(例如,1976年的8021批量价格约为3美元)。

所有这些都馈入了一个或两个并联连接的表冠(8021非常脆弱)。 此外,在更高版本中,第二个电池的触点被移除,建议将剩余空间用于备用电池。 显然,这是由于用户经常混淆极性,导致相当危险的短路。

领带


我购买了这个古老的游戏机,以便为其编写某种游戏并制造一个墨盒,并在可能的情况下尽可能地复制原始游戏机的元素库。
但是存在一个重大问题-TMS1100,Intel 8021具有屏蔽的ROM,即 在制造过程中在工厂编程。 英特尔微控制器有一个出路:8021是8048的精简版,它也具有带掩膜的ROM,但是英特尔生产了带有可编程ROM-8748的8048类似物,既可以紫外线擦除,又可以便宜地编程。

不幸的是,对于TMS1100来说情况要糟糕得多-该芯片有一个可与外部ROM一起使用的调试版本-TMS1098,但如果可能的话,现在就很难购买。 此外,该芯片是采用DIP-64封装制造的,它本身很大,不能完全插入盒中,但是还需要相当大的ROM。

通常,您需要的是可紫外线擦除的8748,并且墨盒的最终版本可以制成不可磨灭的版本。


上面是一个可编程的P8748H,下面是可紫外线擦除的D8748H

英特尔8021


以下是8021而不是8748的简要说明,因为 我将仅使用8021的截断功能,以便仅拥有最初由控制台开发人员分配的资源。

像整个MCS-48系列一样,存储子系统也基于改良的哈佛体系结构。 程序存储器是一个1024字节的内部ROM,数据存储器是64字节的动态RAM。

RAM的组织如下图所示:



单元0-7占用直接寻址的工作寄存器R0-R7,其中R0和R1用作间接访问所有RAM单元的指针。 单元格8-23用于8级调用堆栈,尽管它们也可以通过R0-R1使用。

微控制器具有内置的时钟发生器,参考频率由外部石英,RC链或LC链设置。 一个机器周期持续10个周期,每个周期占用3个参考频率周期。 最大频率为3.58 MHz,而机器周期为8.38μs。 最小频率受DRAM的规格限制,为600 kHz。

8021包含2个8位端口和1个4位,它们也可用于连接I / O端口扩展器芯片8243。所有端口都是准双向的。

此外,微控制器具有内置的八位定时器/计数器。 在定时器模式下,计数器T每32个机器周期递增1。 在溢出T上,TF标志被设置。 在计数器模式下,在测试输入T1处对脉冲计数。

该命令系统包含64条指令,其中一个周期执行36条指令,两个周期执行28条指令。 大多数指令都是单字节的。

指令列表及简要说明


准备工作


购买8748没问题,主要是要注意芯片是使用不同的技术生产的。 最早的NMOP要求固件使用25V电压,标记为D8748。 到70年代末,这些微控制器开始使用HMOP-E技术(英特尔NMOP的改进版本)构建,标记为D8748H,已经需要21V电压。 NEC的后续克隆(mPD8748H)需要相同的电压。 一次性可编程版本标记为P8748H。

紫外线橡皮擦是用机械计时器购买的最简单,最便宜的中文,如实践所示,它可以完美地完成其任务(尽管在较短的时间间隔内没有计时器精度)。 它在约2.5分钟内可靠地擦除了芯片的ROM。 后来,我从日本手中以象征性的价格购买了ZAX Quick-EII橡皮擦,从90年代初的外观上,我什至都不知道是哪一年。 实际上,它使用氙气闪光灯并在3(!)秒内擦除了8748。 可以在此处观看带有工作演示的视频(不是我的视频)。

主要问题是程序员。 在现代程序员中,这个过时的Intel系列的支持仅需300美元。 虽然,有一个相对便宜的业余Willem可以通过适配器与MCS-48配合使用,但是它需要LPT,这根本不适合我。 我不得不自己焊接。 我是一个业余无线电新手,所以我和他一起度过了大约一个星期,抛弃了当时到达的两个8748中的一个(尽管我很喜欢她原本就是那样的想法)。 我以此处发布电路基础,仅将其用于Atmega和更方便的24V电源。 所有这些都焊接在面包板上:



事实证明,这确实很丑陋,并且其中一个mosfet可以工作到极限(甚至是一点点),但是最后,程序员应付了他的任务,并为我提供了很好的服务。

因此,一切就绪,测试固件会通过LED指示灯愉快地闪烁,是时候制造墨盒了。

弹药筒


TMS1100上的大部分墨盒都可以使用,因为 发行了英特尔的英特尔8021许可证的Signetics无法提供所需的MB芯片供应。 甚至某些已经为8021编写的游戏也必须移植到TMS1100。 顺便说一句,这使我们放弃了危险的两节电池捆绑,因为TI微控制器的功耗仅为0.1W,而Intel为1W。 我只有8021的6个子弹之一,它是Connect Four游戏,它被当作基础。

我试图使电路板与原始电路板尽可能相似,但是,当然,我必须进行更改。 首先,芯片的尺寸(DIP-40与DIP-28)和不同的引脚排列。 其次,我们必须更改设置时钟频率的振荡电路中的面额,因为 HMOS版本的微电路的机器周期为15个周期,而原始墨盒中使用的MOS版本的机器周期为30个周期。 因此,为了获得完整的真实性,我的盒带将以1.25 MHz相对于原始2.5 MHz的频率工作,同时确保相同的性能。



在上图中,是在中国订购的成品印刷电路板,当它们打开时,我绘制并蚀刻了电路板,并组装了这样的“调试复合体”:


最后,硬件部分已准备就绪,您可以开始编程了。

展示架




首先,我必须处理LCD的输出。 如我上面所写,它是由Hughes 0488驱动程序使用多路复用控制的(最近有关这种LCD控制方式的有趣文章已在Habré上发表)。 它是驱动程序,而不是控制器,因此您不能只打开一个像素进行业务,就需要使用低级命令以30-50 Hz的频率不断更新屏幕内容。

连接图如下:



引脚H0488:

Vdd-电源(3-8V)
R1-R16-字符串控制输出
C1-C16-列控制输出
DATA0-DATA3-数据总线
!Data Clk-数据记录时钟输入
锁存脉冲 -引脚状态信号R0-R15,C0-C15

芯片的含义如下:

通过4条信息线,依次设置微电路所有32个输出的必要状态(每行和每列16个)。 即 我们以4位部分表示行1-4,然后5-8、9-12以及最后13-16的输出状态,还以4位形式4次表示列的状态。 每个新数据都由沿DATA CLK线的脉冲计时。 发送完所有8条数据后,“锁存脉冲”线上的脉冲将设置输出R1-R16,C1-C16的指示状态,该状态将一直保持到该线上的下一个脉冲。

自然地,在一个这样的循环中,我们不能独立地指示每个单独像素的状态,我们只能显示16个像素(按行与列的交点数)。 因此,要独立更新每个像素的状态,将需要256/16 = 16个周期。

此外,我们有责任切换极性以消除LCD电极的恒定电压,否则显示会迅速下降。 极性切换发生在低输入!数据时钟的锁存脉冲上信号的后沿。 建议根据屏幕刷新率切换极性。

数据表中的以下时序图说明了上述内容:



所有这些都是在汇编程序8021中实现的(顺便说一下,与其他系列的汇编程序相比,显着减少了,所有这些都是出于相同的真实性,我只使用了8021支持的指令),看起来可能像这样:

mov R0, #32 ;    . mov r1, #10000000b ;    r1-r2 mov r2, #00000000b ;  . mov r4, #00000010b ;    !DATA CLK. mov r3, #11110000b clr c loop: ;   r1-r16   . mov a, r1 ;   r1 loadNibble ;    R1-R4. mov a, r1 ;  4   r1 rrc a ;      , xch a, r1 ;    . swap a loadNibble ;    R5-R8. mov a, r2 ;   r2 loadNibble ;    R9-R12. mov a, r2 ;  4   r2 rrc a ;      ,  xch a, r2 ;  C,     . swap a loadNibble ;    R13-R16 ;   C1-C16     . mov a, @R0 ;       loadNibble ;       C1-C4. mov a, @R0 swap a ;   4 . loadNibble ;     C4-C8. inc R0 ;     mov a, @R0 ;     , loadNibble ;      4 . mov a, @R0 swap a ;   4 . loadNibble ;     C9-C12. inc R0 ;    inc a ;   R0-R15  C0-C15, outl p1, a ;  Latch Pulse  1. jnc loop ;      . clr a ; outl p1, a ; . inc a ; outl p1, a ; loadNibble macro anl a, r3 ;    . outl p1, a ;   . orl a, r4 outl p1, a ; !DATA CLK. endm 

这是显示存储在RAM中的图像的子程序的最快版本。 它以1152个机器周期(在我们的情况下为〜12μs)执行。

屏幕的最大刷新率约为每秒70帧(如果微控制器什么也不做),这基本上是多余的,因此,为了节省寄存器和ROM,我在实践中使用了其他例程-速度较慢,更适合于特定任务。 但是,在此频率下,考虑到此显示器的高惰性,可以显示具有4个灰度等级的图像(例如KPDV上的niblonog),并且可以快速改变帧。 甚至是简短的四色动画:


如您所见,对比度还有很多不足之处,当涉及所有行和列时,对比度尤其惊人,但是无可奈何-复用控制的成本。

琴键




这里的一切都简单得多。 这些按钮分为4行3列的矩阵。 行连接到引脚P0.4-P0.7,列连接到P0.0-P0.2。



如上所述,8021的端口是准双向的,因此,为了知道端子的状态,必须先向它们发送设备。 即 输入数据时,输入信号与缓冲区的内容之间会发生连接,这对应于端口上显示的最新数据。 键盘民意调查如下所示:

  mov a, #01111111b ; 0        1, outl p0, a ; ,      . in a, p0 ; , 0       ;      

划桨




或者,用俄语,安装在控制台下部的操纵轮是一个带有装饰性手柄的10kΩ可变电阻器,可以旋转该电阻器来控制游戏中的某些事物。 当然,8021或TMS1100中都没有ADC。 旋转角度由电容器的充电速度决定,电容器应谨慎地焊接到控制台板上。



全部工作如下:当引脚P2.2-P2.3处于高电平时,电容器放电并且逻辑单元位于测试输入T1上。 在将P2.2设置为P2.3到低电平后,电容器将开始充电,并且在一段时间后,根据可变电阻器的电阻呈指数关系,其两端的压降将变为T1设置为0。它仅用于检测时间直到在T1上出现零为止,这将与桨的旋转角度成比例(有关此类方案的更多详细信息,请参见DI HALT'a )。 在代码中,这可能看起来像这样:

  clr a mov r1, a outl p2, a ; 0  P2.2-P2.3 loop: inc r1 ; r1 jt1 loop ;  T1  mov a, #00110000b ; 1  P2.2-P2.3 outl p2, a ;     



音效


在这里非常简单,压电动力学连接到端口P2.0和P2.1的两根线,我们要做的就是交替交替以正确的频率摇动腿。

发生什么事了


结果,我写了两个游戏-俄罗斯方块和一种Flappy Bird。 为了进行调试,我使用了Intel D8748H和NEC D8749HD的一个克隆,只是ROM大小不同。 我使用8048集成开发环境作为汇编器和调试器。 在此过程中,我获得了难忘的经历-微控制器从控制台到橡皮擦,从橡皮擦到编程器,再从那里回到控制台的不断流动,所有这些都伴随着医院发出的紫外线电离空气的气味...

我在曾经可编程的Intel P8748H中写下了完成的程序,然后将其焊接到那时到达的印刷电路板上。


与原始板的比较,从左到右:Block Buster,My option,Connect Four

我只好使用原始的一个;作为案例,我只有两个可用的弹药筒之一,它们无法正常工作。



船体不足以进行第二场比赛:


结论


Microvision MB于1981年之前生产,尽管一开始的销售就很成功,但少数游戏(总共发布了13个盒带)和质量问题通常被称为销量下降的原因。 我还要加上一个过大的尺寸,尤其是与当时出现并大受欢迎的Nintendo Game&Watch系列游戏相比。

在GitHub上发布的源代码和方案

Source: https://habr.com/ru/post/zh-CN416865/


All Articles