架构和编程RCA Studio II

“最后,我们来到我们一直在等待的指示-性!”
/来自有关微处理器CDP1802的文章/




在1970年代初期,诸如Pong之类的简单电子游戏在美国非常流行(在苏联,其类似物出现在5-10年内出售)。 通常,此类游戏在现代意义上没有微处理器和内存,而是基于严格的逻辑构建的。 因此,可替换的弹药筒并没有多大意义,无论它们在哪里-它们只是一组包括所需比赛的跳投。

1977年,几乎同时发布了两个游戏机: Fairchild Channel FRCA Studio II 。 这些是功能齐全的计算机形式的第一款游戏机,带有微处理器和可替换的墨盒程序,将要讨论的RCA Studio II不仅由RCA开发,而且由特定的人Joseph A. Weisbecker (类似于整个COSMAC体系结构)开发。 。
第一个这样的设备System 00 ,也称为COSMAC FRED(1971),是一个原型,并未大量生产。


其中的处理器采用常规逻辑实现(在FRED2中 -在1973年问世的两个名为CDP1801 R和U的芯片上)。 RAM约为256字节-4 kb,此外,FRED2具有内置的录音机。


COSMAC架构的第一个商业实现是COSMAC ELF 。 1976年,ELF被定位为用于火腿的计算机(在《大众电子》杂志上发表了一系列文章),是一个带有拨动开关,指示器,CDP1802微处理器(相同的1801,但已经在一个芯片中)和256字节RAM的小板。 对于他来说,还有其他扩展卡可以在监视器上显示图形(使用CDP1861芯片),并连接了外接键盘和录音机。 基于带有扩展功能的ELF,出现了ELF II和VIP。 在COSMAC ROM中,有一台名为CHIP-8的虚拟机,可针对原始游戏进行强化(用于输出和移动软件sprite,生成随机数等的命令)。还有其他基于该体系结构的原始计算机和终端。


所有这些设备都是RCA Studio II的直接前身,并且具有极其紧密的硬件和软件架构。

RCA Studio II于1977年发布,当时的价格为150美元(现价600美元)。 通常,市场上的第一个不一定是最成功的。 在2008年,《 PC World》杂志将该游戏机视为有史以来最差的游戏机(从原则上讲,这与事实相差不远):黑白图像的正方形,没有操纵杆(而不是两个10个按钮的区域)和十几个游戏-有点不愉快令买家满意。


此外,所有游戏(内置游戏机和盒装游戏机)均以ST2虚拟机的伪代码编写(与COSMAC中的CHIP-8的想法相同),这使其运行非常缓慢。

RCA设法发布了约6.4万套RCA Studio II,不算后来出现的克隆(东芝Visicom,Conic M-1200等)。随着Atari VCS的出现,过时的RCA Studio II和Fairchild Channel F立即退出了战斗。

中央处理器


作为芯片制造商,RCA选择了自己的产品作为机顶盒处理器-RCA CDP1802微处理器,该处理器以1.78 MHz的频率运行并使用CMOS技术制造。


他的前任是CDP1801,这是一种两芯片处理器(与1802完全兼容):


CDP1802以其抗辐射版本(蓝宝石上的硅)而闻名,例如在CD 1802伽利略行星际站使用它,并在1990年代飞往木星(有6个这样的处理器),以及在MAGSAT中使用

处理器具有相当棘手的寄存器使用方案。 它具有一个8位累加器D和16个16位寄存器-R0..RF(R0-R15),根据4位寄存器P(指向R之一)的内容,每个寄存器都可以成为指令指针。 SEP Rn小组。 换句话说-处理器中没有一台PC!


另外,R0 ... R15中的任何一个都可以成为索引(地址)。 根据4位寄存器X中的值(由SEX Rn命令更改)确定选择,然后将所选的R视为某些命令的索引。

DMA的地址寄存器始终为R0。 在中断内部,指令计数器为R1。

有一个8位寄存器T,用于在发生中断时自动将X和P寄存器保存在其中。 通过使用RET或DIS命令设置IE中断启用标志来启用中断。

4位寄存器I和N包含由处理器执行的当前指令。

有一个标志寄存器-DF。 更确切地说,一个标志,因为它是一位数字,并且仅包含一个进位标志。

此外,处理器还具有一个单位输出端口Q,其状态由SEQ和REQ命令更改。

就像在那一代的许多处理器中一样,这里不存在通常意义上的堆栈(既没有PUSH,POP命令也没有堆栈指针),并且在必要时由现有指令实现。

也没有用于调用例程的传统指令。 使用SEP Rn指令可以执行到子程序的转换,我记得,它使所指示的Rn寄存器成为命令计数器。 要返回,将使用相同的SEP指令,但使用一个寄存器,该寄存器是调用前命令的计数器。 或者(在更通用但更慢的版本中)使用MARK和RET。

除了传统的有条件和无条件跳转(顺便说一句,它们都是绝对的)之外,还有一些SKIP指令,当满足条件时,跳过下一个SKIP指令(两个字节)。 还提供了无条件跳过。

1802处理器通常被称为第一个RISC处理器之一。 然而,在同一上下文中,提到了6502,以及其他一些。 可以肯定的是,该体系结构不是很普通,从编程的角度来看,会引起多种多样的感觉。 一方面,有多达16个16位寄存器。 另一方面,它们的内容只能直接减少或增加一个。 例如,在Rn中放置一个常量如下所示:

ldi $01 ; const -> D plo r6 ; D -> R6.0 ldi $02 ; const -> D phi r6 ; D -> R6.1 

因此,大部分代码都在前后移动字节。

实际上,在条件转移中,仅考虑到零的转移(仅累加器D中为0的情况)和转移标志。 典型的循环如下:

 loop: ... dec r7 ; R7-- glo r7 ; R7 -> D bnz loop loop: ... adi 2 ; D = D + const xri $07 ; compare using XOR. (D == const) -> D bnz loop 

所有算术和逻辑指令仅适用于电池D。

除了由SEQ / REQ控制的一位端口外,还有一个由OUT / INP命令控制的四位端口。 不幸的是,RCA Studio II中没有使用它。

记忆体


有:2 KB的ROM(BIOS +五个内置游戏)512字节的RAM(一半保留用于视频)
记忆卡

 000-2FF ROM RCA System ROM :   SP2 300-3FF ROM RCA System ROM : BIOS 400-7FF ROM   (    ) 400-7FF ROM  ( ) 1024 800-8FF RAM   (256 ) 900-9FF RAM  (256 ) A00-BFF ROM  ( ) C00-DFF ---  ,  800-9FF E00-FFF ROM  (  ) 

需要特别注意的是,对于盒式磁带上的游戏和程序,仅BIOS的一部分可用-包含SP2(不必要,大体上来说),数字从0到9的图像以及用于视频的标准中断处理程序。

影片


对于图形,使用RCA CDP1861芯片-所谓的“ Pixie”。

标准的RCA Studio II具有仅带有天线(RF)的标准输出,但是,人们将其重塑为复合材料,从而使质量更好(我几乎写过“为了更好的色彩还原” :)

从技术上讲,视频控制器提供两种颜色(黑色和白色)的最大分辨率64x128。 但是,这需要1024字节的视频内存,在Studio II中,RAM的总量为512字节。 因此,分辨率为64x32(需要256个字节),水平分辨率(64)是固定的。 在64像素的一行中,始终显示8个字节,这种情况持续14个处理器周期。

BIOS中断处理程序用于在屏幕上显示内存($ 900- $ 9ff)。 中断是由视频控制器启动的,每秒发生60次(NTSC)。BIOS处理器执行所有必要的操作-可执行程序只需要更改视频内存,其中每个位直接对应于一个黑点或白点(从左到右,从上到下)。


但是,没有什么可以阻止您编写自己的处理程序。 最简单的情况是分辨率为64x128,这对于视频控制器来说很自然。 对他来说,在处理程序中,将视频内存地址写入R0(屏幕数据将来自哪里)就足够了,字节将通过DMA本身显示,填满整个帧。这种情况在垂直分辨率(而非128)下更加复杂。您必须输入延迟并重复通过更改R0获得数据(请参阅cdp1861和BIOS源的描述)。

原则上,您甚至可以设置可变的垂直分辨率,不输出任何内容到屏幕的一部分,还可以指定ROM,而不是RAM(或部分ROM,部分是RAM)作为视频内存,还可以实现垂直滚动,更改R0中的初始值从其开始向控制器发布数据的地址。

请注意,在视频控制器的INT输出处,本机在光束到达可见区域之前出现两行。 因此,中断处理程序通常以一个延迟开始,该延迟使您可以按时开始显示内存。


视频控制器还具有EFX输出,在光束出现在可见区域之前的4线显示0,然后在该区域的最后4线显示0。 EFX输出连接到处理器EF1,可以使用B1(BN1)命令检查其状态。

沿着框架的返回光束的典型期望实现如下:

 ... delay: bn1 delay ; wait for EFX in video chip ... 

如上所述,在ROM中没有字母和符号的图像。 但是,仍然有数字(毕竟,在内置游戏中,您需要以某种方式显示分数和玩家数)。 但是,即使在这里,他们也设法保存:


如您所见,这些数字被粘在一起,以便从几个相邻的数字中获得其余的数字。

声音


我们只说有声音。 但没有更多。 NE555通过捆扎带连接到CDP1802的单个一位输出端口,然后全部连接到控制台内置的扬声器。当一个单元提供给RST NE555输入(通过SEQ处理器命令)时,它开始以625Hz的频率发出蜂鸣声。 为零时(通过REQ命令)-蜂鸣声停止。 其实仅此而已。 然而,仍然存在电容器,由于该电容器在吱吱声开始时,频率在0.4秒的过程中逐渐降低了一半(即,获得了一些额外的吱吱声)。


在标准BIOS中断处理程序中,除了负责视频的那一部分外,还有一部分检查特定存储单元的内容,如果不为零,则开启吱吱声,并开始循环减少$ 08CD单元的内容(当达到零时,吱吱声将关闭)。 因此,您不必理会端口上的自我录制,而只需设置吱吱声的持续时间,它将在后台发生,而无需停止程序:

  ldi $8cd & $ff plo rf ldi 250 ;   str rf ... 

也可以手动执行此操作(在关闭中断之后):

 ;   sex r3 ; set X to R3 dis ; return X to R5, P to R3, 0-IE, R3=R3+1 db 53h ; forces X=5 P=3 - which is no change ;   seq ;   ldi 250 ; delay plo r6 delay: dec r6 glo r6 bnz delay ;   req ;    sex r3 ; set X to R3 ret ; return X to R5, P to R3, 1-IE, R3=R3+1 db 53h ; forces X=5 P=3 - which is no change 


程序


在1970年代,编写了十几个游戏和其他几个程序(主要由RCA自己编写)。 它们几乎都不是用汇编程序编写的,而是用伪代码编写的 -在控制台ROM中,有一个特殊的解释器-虚拟机ST2。 很难确切地说出是什么促使这种决定。 最有可能的想法是节省内存-游戏的体积确实大大减少了。 通常,ST2的耳朵来自COSMAC中使用的名为CHIP-8的类似VM。 尽管两个VM彼此不兼容,但在2000年代已经编写了RCA Studio II的CHIP-8解释器。 鉴于架构的极端相似性,正如解释器所写,使用不需要大量内存的COSMAC进行的游戏在RCA Studio II上就不会出现问题也就不足为奇了。


las-这种架构上的虚拟机运行非常缓慢,这给游戏本身留下了不可磨灭的烙印。 后来,在2013年,保罗·罗布森(Paul Robson)写了大约十二种游戏-已经在汇编程序中,并随源一起分发

发展历程


据目击者说,最初,即使没有组装程序,RCA Studio II的开发也是在COSMAC ELF和FRED2上进行的。

当前,没有必要遭受这样的痛苦。 有一个不错的Windows模拟器Emma ,它具有良好的调试器(顺便说一句,它不仅模拟RCA Studio II,而且模拟所有COSMAC)。


作为汇编程序,我首先尝试使用交叉汇编程序a18,但是由于多种原因,最终集中精力于asmx ,后者也具有Python 脚本来生成成品盒式映像(扩展名为.st2)。

汇编程序1802的简要介绍可以在这里找到。 具有无限循环的RCA Studio II的最简单的test.asm如下所示:

  .include "1802.inc" .org 400h .db 4,2 ; SYS $402 start: br start ; some code .end 

注意指令“ .db 4,2”。 这是第一条可执行指令的地址,即 “ .db>(开始),<(开始)”。

简单循环实现:

  ldi 50 ;    D   plo r6 ;    D     r6 loop: dec r6 ; r6 = r6 -1 glo r6 ;     r6   D bnz loop ;    loop    D   

使用跳过指令:

 ; q = 0   $FF00 ,  q=1   $FF  loop: ghi r1 ; hi(r1) -> D lsz ;   2 ,   D  (..   seq) req ; 0 -> Q skp ;   1     (..   inc r1) seq ; 1 -> Q inc r1 ; r1 = r1 + 1 br loop ;  ... 

要在干净的汇编程序CDP1802中进行练习,可以方便地使用asm80在线汇编程序仿真器。 生成的源文件的扩展名必须为.a18

为了在自然界中的实际硬件上启动完成的应用程序,有一个RCA Studio II 40周年Multicart卡式盒。 我还没有,但是tnt23用一个游戏重新制作了可用的墨盒之一,该游戏用于安装在插槽中的EEPROM AT28C16芯片(2k x 8)。


因此,要运行在一块铁片上,我每次都会将芯片插入编程器中,将其闪烁,然后将其重新排列到转换后的墨盒中,然后打开控制台。 每次都是如此。



介绍无阴影



为了开发平台,我编写了256个字节的简介(在Tiny简介比赛中于Chaos Constructions'2018展示)。

Vectrex不同,在Vectrex中 ,即使仅绘制曲线也可以从Videopac获得壮观的图像,在ROM中已经有了一组小矮人的图像,在这里,我们遇到了一种悲惨的情况-普通,人人熟悉,光栅图形但黑白和无处不在的分辨率(64x32)。 在ROM中,不仅有图片,甚至还有字符。 声音-仅限于625Hz的吱吱声。

因此,音乐,各种典型的等离子,灯光以及通常涉及非正方形轮廓的所有事物都已被取消。 任何形式的文本也被取消-字母没有足够的空间。

结果,决定a)以不同的速度滚动b)重复c)的东西,结果是这样的:


如上所述,视频控制器中没有硬件滚动。 但是,低分辨率和黑白不仅有缺点,而且还有优点-覆盖较少的字节。

我使用shlc命令(带有连字符的左移)进行了逐行滚动-在循环中执行时,结果发现下一个字节的最左位向左移并不会消失,而是置于进位标志(DF)中。 因此,循环中的下一个shlc将其拾取并将其放在左侧的字节中。 结果是整个行的简单滚动,其中八个将循环滚动(因为方便获取云的图案并逐字节存储房屋)

 ... scrollret: sep r3 ; return from subroutine ;   scroll: ; set lines counter ldi LINES ; const -> D plo r10 ; D -> Rn.0 nextline: ; set bytes counter ldi BYTES_PER_LINE ; const -> D plo r7 ; D -> Rn.0 ; set carry to scroll glo r12 ; Rn -> D shr ; get one bit to set carry plo r12 ; D -> Rn.0 (save shifted byte) nextbyte: ldx ; Rx -> D shlc ; D = D << 1 (carry -> DF) stxd ; D -> M(Rx), Rx-- dec r7 ; Rn-- glo r7 ; Rn -> D bnz nextbyte dec r10 ; Rn-- glo r10 ; Rn -> D bnz nextline ; one line (8 bytes) scrolled, let's scroll next br scrollret ... 

请注意,子例程的入口位于滚动标签上,要返回,不仅要执行sep r3,还要从那里执行第一个br scrollret和sep r3。

这样做是为了使r14(子例程内的指令计数器)保持正确的状态,然后可以一次又一次调用该子例程(使用sep r14)。

当然,此处的调用期间不会保存任何变量-所有变量寄存器都是全局的。

在一般循环中,滚动子例程被两次调用-房屋第二次,云第四次(滚动最慢)。 总的周期沿光束的相反方向同步(道路,房屋,云层-有时间绘制,星星静止)。 就道路而言,只有一条线滚动-道路边缘仅用线绘制。

为了有趣,我尝试滚动整个屏幕-它不适合光束的反向运动。

房屋由样式设置:

 ... house1: .db %00000000 .db %11111111 .db %10101010 .db %11111111 .db %10101010 .db %11111111 .db %00000000 .db 1 house2: .db %00000000 .db %00011111 .db %01110101 .db %01011111 .db %01110101 .db %00011111 .db %00000000 .db 1 ... 

平板电脑,每个平板电脑都有链接:

 ... commands: .db house5 .db house2 .db house1 .db house3 ... 

在一个循环中,此标签将按顺序进行排序。

与房屋不同,为简单起见,两朵云都代表一种仅循环滚动的模式。

由于根据与房屋相同的原理输出云,以及由于模式之间的编程间隔(现在这些只是在数据中重复零),因此可以赢得一定数量的字节。

但是,问题还在于中断处理程序使用了某些寄存器-无法更改R0,R1,R2,R8,R9,R11。 将变量存储在内存中是用于写入和读取变量的大量额外字节(更不用说时钟周期了)。

理想情况下,滚动可能应该在中断处理程序中完成。 但是,为此,我必须编写自己的处理程序而不是标准处理程序。 这将是更正确的(顺便说一句,可以释放几个R寄存器),但是最有可能的是,最后,所有内容加在一起不能容纳256个字节。

至于星星,它们是静态的,但是要绘制一些看起来是随机分布的点,出乎意料的不是那么简单:

 ... loop: ldn r4 ; M[Rn] -> D ani %00000010 ; D AND const -> D bdf skip ; jump if carry ldi 0 ; const -> D skip: stxd ; D -> M(Rx), Rx-- glo r4 ; Rn -> D adi 47 ; D + const -> D plo r4 ; Rn -> D glo r15 ; Rn -> D bnz loop ... 

这里,在一个周期中,数据是从BIOS中获取的,这些数据会被稀疏并掩盖多余的位。 手动选择遮罩(用于ani)和音高(用于adi)。

至于声音,不可能改变频率只是模仿了汽车的“哔哔”声。

顺便说一句-我认为这是RCA Studio II的第一部演示作品:)

结语


Studio II之后,RCA发布了RCA Studio III的多个实例。 两件事的区别-出现了颜色(分辨率没有改变)和声音更好(您可以发出一个而不是255个不同的频率)。


有趣的是,两台机器在两个方向上都相互兼容,包括与解释器一起使用相同的中间代码。

还已知有RCA Studio IV的计划。 应该将分辨率提高到64x128,甚至已经编写了一个新的伪代码解释器。

至于CDP1802,则继续生产这种微处理器-首先由休斯 Hughes)制造,然后由Intersil(Renesas)制造。

如果您想了解有关计算机技术发展史的这一特殊分支的更多信息,建议您在Google上搜索“ COSMAC”和“ CDP1802 ”两个词。

网站连结


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


All Articles