Mark 1家用Forth计算机(仅TTL,无微处理器)

2021-01-17 02:36:12

这台计算机没有微处理器。 CPU是离散的TTL逻辑。 我在1979年购买了第一本TTL数据书。 当时我正在学习6502机器代码,梦想着构建一个简单的TTL CPU。 我画了一些电路图。但这已经到了尽头。 25年后的今天,我终于做到了! Mark 1在晚上和周末工作,花了一个月的设计时间,四个月的建造时间和一个月的编程时间。 结果是:Myself是在FORTH中实现递归的标准方法。 即使您不熟悉FORTH,如果我告诉您它是一种基于堆栈的语言,并使用反向抛光表示法(RPN),您也许可以弄清楚它是如何工作的。 Mark 1是一种微编程机器,具有高度编码的< vertical"微码。 微指令()只有8位宽。 人们通常以“水平”的方式思考。微码,范围更广,编码更少。 有些确实非常广泛。 Mark 1更像是RISC处理器。

解码是使用74HC138 8分之一解码器集中完成的。 解码后的控制信号通过背板分配。 然后需要在卡级别进行简单的门控以完成解码。

条件是跳过而不是分支。 如果测试为真,则它会在指定的周期数内禁止加载另一条指令。 跳过距离递减为零,此时将恢复正常执行。

" PC←OP * 16"指令(1011xxxx)a.k.a. XOP从操作数寄存器中加载程序计数器(PC)的最高8位。 这是间接跳转的一种形式。

另一个跳转指令(1001xxxx)具有4位操作数,并且只能到达-ROM的前16个字节。

基于74181的ALU需要8个控制信号。 这些是使用7x16二极管矩阵ROM从-指令中的4位ALU功能字段解码的。 阴影正方形表示二极管的安装位置:

控制信号通过数据总线从二极管矩阵传输到ALU。

FLAG选择符号或溢出测试。 符号测试将ALU结果的最高有效位路由到条件测试多路复用器。 溢出测试需要增加一个quad-XOR门。 74181不会产生溢出信号(后面的382型号会产生)。 最终没有使用它,因为FORTH通过在减去后测试结果的符号来实现符号比较。

Mark 1位于3U 19"中。 带有64路DIN 41612背板的IEC297子机架。 总线布局如下所示。 " A"该行类似于标准的8位微处理器总线。 " C"行包含-指令和各种解码的控制信号。 全总线引脚(1、2、31和32)承载电源和时钟。

时钟是正交的。 CLK1在机器周期开始时上升下降。 CLK2用于为RAM和I / O生成写使能信号。

该定序器具有一个12位微程序计数器(PC)。 最高的8位可以从OP锁存器加载,从而跳转到256个微代码例程之一。 每个例程均以16字节的页面边界开始。

宏机器的机器语言操作码从下面的数据总线加载到OP锁存器中 微程序控制。可以使用索引寄存器之一作为程序计数器从内存中获取它们。 一个简单的微解释器由以下3个指令组成:

OP←Memory [Index]从存储器加载OP锁存器 索引←索引+1递增"程序计数器" PC←OP * 16执行微码程序

这3条指令如何执行? 一种可能是将它们附加到每个例程的末尾。 较慢但更节省空间的选择是在它们后面附加一个跳转。 Mark 1微码为此专门进行了跳转。

操作码可以具有零个,一个或多个操作数。 -例程通过增加程序计数器来消耗操作数。 在开发过程中,我使用了这两个操作数的POKE指令来测试UART。 这需要一个16位地址,后跟一个数据字节:

戳:Index.Lo←内存[PC];地址LO PC←PC + 1 Index.Hi←内存[PC];地址HI PC←PC + 1 温度←内存[PC];数据字节 PC←PC + 1 内存[索引]←温度;做扑克 跳到下一个

Mark 1旨在支持FORTH虚拟机。 以下FORTH原语是经过微编程的:

退出执行 分支0分支(LOOP)(DO)U * U /和或XOR LEAVE R> > R R 0 = 0< + D + 减去DUST减去DROP SWUP DUP @ C @! C! (做) 我最初的计划是建立一个子例程线程的FORTH。高级定义将被显式调用,原语将被内联编译:

我放弃了这个想法,因为大多数FORTH使用间接线程,并且我希望使用具有所有常用编译器功能的全功能标准FORTH。 许多编译词与间接线程模型紧密耦合。

间接线程代码是执行令牌的列表。 执行令牌是代码字段地址。 代码字段是指向机器代码的指针。 这在标记1上带来了一个问题,因为它具有单独的宏和微地址空间。 在代码字段中应该输入什么? 我的解决方案是将其缩短为1个字节并存储操作码:

Foo:DB OP_DUP 数据库OP_SWAP 数据库OP_DROP DB OP_EXIT 酒吧:DB OP_OVER DB OP_CALL DW Foo DB OP_ROT DB OP_EXIT

cfa_Foo:DW输入 pfa_Foo:DW cfa_DUP DW cfa_SWAP DW cfa_DROP DW cfa_Exit cfa_Bar:DW输入 pfa_Bar:DW cfa_OVER DW cfa_Foo DW cfa_ROT DW cfa_Exit cfa_Exit:DW pfa_Exit pfa_Exit:..代码.. cfa_DUP:DW pfa_DUP pfa_DUP:..代码..

cfa_Foo:数据库OP_ENTER pfa_Foo:DW cfa_DUP DW cfa_SWAP DW cfa_DROP DW cfa_Exit cfa_Bar:DB OP_ENTER pfa_Bar:DW cfa_OVER DW cfa_Foo DW cfa_ROT DW cfa_Exit cfa_Exit:DB OP_EXIT cfa_DUP:数据库OP_DUP cfa_SWAP:数据库OP_SWAP

下一条:mov w.l,[ip]; W←XT,IP←IP + 2 INC IP mov w.h,[ip] INC IP mov op,[w]; OP←[CFA] 公司; W←PFA xop; PC←OP * 16

它遵循ENTER要求在W中使用PFA调用基元的约定:

ENTER:dec rsp;推送IP mov rs,ip mov ip,w; IP←PFA 下一站 退出:mov ip,rs;流行IP 公司 下一站

请注意,NEXT中的最后3个指令如何类似于前面描述的简单微解释器。 这在实现乘法和除法时很有用。

我使用Microsoft汇编程序(MASM)为宏存储空间创建ROM映像。 语法" 16 DUP()"告诉MASM将封闭的字节重复16次。 它等效于:

cfa_Uxxx:数据库OP_XXX_BEGIN pfa_Uxxx:数据库OP_XXX_BIT,OP_XXX_BIT,OP_XXX_BIT,OP_XXX_BIT DB OP_XXX_BIT,OP_XXX_BIT,OP_XXX_BIT,OP_XXX_BIT DB OP_XXX_BIT,OP_XXX_BIT,OP_XXX_BIT,OP_XXX_BIT DB OP_XXX_BIT,OP_XXX_BIT,OP_XXX_BIT,OP_XXX_BIT 资料库OP_XXX_END

首先,NEXT用W中PFA的地址(即第一个_BIT)调用_BEGIN。 _BEGIN和_BIT通过从NEXT中的最后一条指令跳到第三位来结束。 这将执行_BIT 16次,并随着W递增W。 W充当循环计数器或临时程序计数器。 最后,_END跳到高级NEXT。

重置将PC强制为000H。 -ROM的前8个字节包含以下内容:

复位:mov w,0; W←0002h 公司 公司 迪斯;禁用IRQ mov ip.l,[w]; IP←冷启动向量 公司 mov ip.h,[w] 下一个: ...

这将从主存储器中位置0002h的冷启动向量初始化高级指令指针(IP)。 然后进入下一个。

小模型 。码 包括OPS.INC 组织0 DW 0FFFFh;保留用于IRQ向量 DW复位;冷启动矢量 重置DW UART_Init ...

我为Mark 1微代码编写了单遍汇编程序。 这将生成-ROM的Intel Hex映像以及格式为MASM EQU语句的操作码列表。 使用Microsoft MASM汇编器创建高级ROM。 / TINY命令行开关会强制链接器版本6.15生成二进制.COM文件, 然后将其转换为Intel Hex。 刻录EPROM很快变得乏味,我编写了一个驻留在ROM中的监视器,以通过串行端口接受Intel Hex下载。 这就是最初装入FORTH的方式。但是最新版本是ROM驻留的。 我现在有一个用于调试的基于PC的模拟器,FORTH相当稳定,并且对监视器的需求减少了。 我的原始《 FORTH》,于2003年发布在这里, 逆转除法运算符留下的商和余数的堆栈顺序。 这已得到纠正。 这是最新的代码: fig-FORTH的这种实现是基于Bill Ragsdale于1979年5月为6502安装的原始手册。 它在以下方面偏离标准: 大多数符合无花果的代码都应该很少改动或没有改动地运行。 请参阅模拟器zip中的示例(例如,DOER-MAKE)。 马来西亚国家石油大学的学生Aaron Tang建造了Mark 1 FORTH计算机。 他的一位同学艾迪尔·贾兹米(Aidil Jazmi)克隆了比尔·布兹比(Bill Buzbee)的Magic-1。 访问其“ UTP克隆”页面以阅读所有内容。 Aaron于2006年3月首次与我联系,并提出了一些问题,到2006年10月,他的计算机开始工作。 他使用了相同的欧元卡,并安装在与我相似的机架中,并非常仔细地遵循了我的布局。但是,尽管我主要使用笔线连接,但Aaron的计算机是用线包裹的。 亚伦和艾迪尔都做得很好。 您可以在我的链接页面上找到更多自制计算机。 请访问网络环上的其他站点(如下),并且不要忘记看一下我的Mark 2 FORTH计算机。 Qirien Dhaela的JavaScript Simplex-III自制计算机的设计师David Brooks创建了Homebuilt CPU Web Ring。 要加入,请在戴夫(Dave)行中提及您页面的URL。 您需要将此代码片段复制到您的页面中。