经过一年半的工作终于可以认为该项目已经完成。机器能够运行CAPS-11和CAPS-11 / BASIC。它具有适合的外围设备。这是运行时的视频片段。
该PDP-11 / 04最初来自爱立信。我们在八十年代末从爱立信计算机俱乐部EDKX收到了它。电脑是成块的,但除了一些十字螺丝以外,所有部件都可用。我们与TU60磁带站一起收到了。
PDP-11 / 04是70年代中期的产品,是PDP-11 / 05的后继产品。在这种新设计中,DEC设法将所有CPU逻辑压缩在一个单独的十六进制板上,而不是以前的两个十六进制板上。计算机的电路板安装在具有9个插槽的绕线底板中。通常,还有一个程序员控制台,操作员可以在其中输入小型引导程序或对CPU进行维护。但是,这只有操作员控制台更加有限。《计算机工程:硬件设计的DEC视图》一书中对PDP-11系列进行了广泛描述。这本书已经过扫描,可以在线获取。确实,这是一个非常好的阅读。
上面是CPU板的图片。它总共具有138个IC。数据路径的一些简化和可编程存储器的使用使得减少IC的数量成为可能。 CPU具有五个256x8双极PROM存储器,它们提供40位的微码字。这8位用作地址。一个有趣的功能是,微地址总线是集电极开路,因此只需直接在总线上进行或运算就可以轻松地进行有条件的微分支。众所周知的74181用作主ALU,而用作主寄存器DEC的通用暂存器则使用Intel 3101 16x4存储器。 CPU没有晶体来提供时钟,而是DEC在反馈环路中使用了延迟线。我们的PDP-11 / 04带有一块可处理16KB的存储板。它由MOSTEK制造的MK4096型32个动态MOS存储器组成。有趣的是,这些芯片是第一个具有多行行/列寻址功能的芯片,就像现代DDR存储器一样。通过使用这种技术,Mostek工程师设法将4kbit内存装入16引脚封装中。这是M7800或DL11异步通信板。最后是M9312板,用于引导机器并终止总线。实际上,在系统中需要两个终结器,因为CPU板本身没有终结器。这是最靠近CPU的终结器,因此必须在总线的另一端安装M9302板。该板包含四个插槽,其中一个可以安装双极PROM以支持从特定设备引导。还有一个PROM,其中包含控制台仿真器软件,该软件使用串行端口与操作员进行通信。在本文档中,机器分为几部分。检查H777电源
首先要检查的是电源是否良好。特别重要的是检查电容器的形状。 H777是该机器的电源,它是一个次级开关,这意味着它具有庞大的变压器,可将交流电转换为更易于处理的38 VAC。不用摆弄400 VDC的电源非常好。该机器中的H777由两个稳压器板,一个提供25安培的5V稳压器和一个提供+/- 15 V和-5V的MOS稳压器板组成。
当然,有些好心人已经阅读了BA11L维护手册,其中详细介绍了电源的内部工作原理。额定值为50 V 22000uf的大型滤波电容器可以过滤原始DC,能够很好地通过10k电阻器充电,并且泄漏非常小。 5V的输出电容器的形状较差。具有令人印象深刻的连接器的3900 uF / 6VDC Sprague即使使用560欧姆的电阻和足够的时间也无法达到额定电压。
如今,没有带螺纹连接器的3900 uF / 6VDC电容器,所以我将其替换为6800uF / 40VDC RIFA
使用新电容器,电源可以很好地管理以在我的虚拟负载中提供3安培的电流,然后从热的Pertinax熔炼得很好
但是,如果将电源连接到背板,它是否起作用?不幸的是,它没有。显然,来自电源的两个信号始终处于低电平状态,即BUS DC LO L和BUS AC LOL。这两个信号均为低电平有效信号,并处于其低电平状态。低状态禁止主CPU的时钟生成。
上面的示意图描述了H777电源的5V稳压器。标记为蓝色的区域是电流源电路,它由传入的原始DC馈电,并为50uF电容器充电,因此会产生良好的斜坡信号。梯形电阻电路和多个比较器生成BUS DC LO L,BUS AC LO L和内部信号,这些信号导致时钟信号到达主PWM开关。电容器上的电压从未超过20.4 V,这不足以使两个比较器改变极性。似乎从电流源消耗了很多电流。更换了电容器,但没有区别。但是电流源不仅连接到电容器。它也连接到红色标记的区域,这是一个撬棒电路。如果任何主开关晶体管发生故障,则输出结果将为38 V原始DC。不太好。因此,如果输出电压超过5.6 VDC,会有一个齐纳二极管和一对晶闸管触发。这也会使电流源短路,有效地停止电源中的所有活动。问题似乎是,即使在正常情况下,即使没有触发,晶闸管中的泄漏也会消耗1.5 mA的电流。显然所有晶闸管都有泄漏,但泄漏量不大。将晶闸管换成现代BT145即可实现功能齐全的电源!测试CPU所有电缆均已连接,并且电源已打开。任何地方都没有烟泄漏,这是一个好兆头。但是RUN指示灯只是短暂闪烁。按下控制台上的INIT开关只会使RUN灯短暂闪烁。不太有前途。然后用示波器检查CPU板的主时钟信号,发现启动了8个周期,停了几微秒,然后又进行了3个周期,又停了3个周期,然后什么也没有。从上面的图片可以推断出周期时间更接近250 ns,而不是" Computer Engineering"中指定的260 ns。但是,在反馈回路中使用延迟线可能不够精确。至少在七十年代中期,4 MHz的速度是令人印象深刻的。
除此之外,仅使用示波器可能无法做到这一点。为此,我得到了这个USB连接工具:
但是要用地址和数据总线覆盖整个机器,将需要其中四个。幸运的是,此时我可以以合理的价格购买HP1664A逻辑分析仪!
在由混合信号引起的一些初始问题之后,并且还忘记了机器处于低电平有效状态,我从分析仪中得到了一些良好的跟踪信息:
上图显示了微地址流水线寄存器的输出。因此,它实际上将第二个微步骤显示为第一个微步骤。但这实际上是与本文档相比正确的顺序。该跟踪的有趣之处在于,CPU输出地址总线上的地址24和26。然后,它在数据总线上接收到165020,这是要在断电后开始执行的PC。这也是M9312诊断程序的第一个地址。但是看一下CPU随后在地址总线上输出的地址是167020。由于某些原因,位10变高了!通过在总线接收器芯片上进行更紧密的测量,DS8641显示即使输入为3.31 V,输出仍为3.78 V!这似乎是错误的!这是件小事:不幸的是,DS8641不是很常见的IC。它特别适用于数字集电极开路总线。我从中国Ebay的一家卖家那里订购了一些产品,但是由于交货时间很长,所以我不得不从另一块板上拆下IC并更换CPU板上有故障的芯片。这次结果要好得多:
但是,它最终旋转起来等待控制台串行端口的TX ready位准备就绪。奇怪。也许M7800有故障?
另一个M7800配置为放在背板上。串行端口已连接到我的笔记本电脑。
完善!现在,它已通过诊断步骤1到4。但是按DL键使其从(不存在的)RL设备启动将导致其暂停。
似乎在尝试执行内存测试时会失败,然后在处理第一个总线时会遇到双总线故障。这与CPU的TRAP处理非常匹配。
在研究内存板并检查跳线和开关设置时,我发现尽管我更改了DIP开关,但无论位置在8个开关中的6个都保持断路。不太有希望。
可以检查并存储在内存中! PDP11GUI是一个不错的Windows工具,可以控制您的PDP-11。它可用于将文件加载到内存中,检查内存并启动CPU运行。
在Internet的许多地方都可以找到BASIC的纸带。但是它以绝对二进制加载器格式提供,目前PDP11GUI无法读取。但是,编写一个小的C程序来转换它很简单,然后可以在机器中付费,但是在9600 bps的串行线上运行不是很快。
绝对加载程序是一种小的纸带,需要将其引导到内存中,机器才能像上面的BASIC解释程序那样以绝对加载程序格式加载文件。绝对加载器随附在名为DEC-11-L2PC-PO的磁带上。
更新:从PDP11GUI的v1.38版本开始,在将文件与PDP11GUI一起使用之前无需转换文件,因为此转换已包含在PDP11GUI中。
似乎我已经很长时间没有做任何BASIC编程了:-)
运行诊断
要真正检查CPU是否正常运行,应该运行两个诊断程序。这些是GKAA和GKAB。实际上,有两种方法可以运行它们。您具有通过PDP11GUI加载的纸带的图像,或者运行XXDP环境。我尝试了两种方式。
最初这些是纸带软件,但不幸的是我找不到这些纸带的图像。但是我确实找到了带有GKAAA0.BIC和GKABC0.BIC的XXDP图像。事实证明,这些二进制文件实际上具有与纸带完全相同的格式。我使用PUTR工具从图像中提取它们。请确保将它们复制为二进制文件,否则您最终会像我一样挠头几个小时...然后,我使用PDP11GUI将它们加载到内存中并从地址200开始。
XXDP需要从某种海量存储中启动。现在唯一难于在计算机上运行的是TU58,因为它使用标准串行端口连接到驱动器。驱动器本身可以使用PC或MAC进行仿真。我下载了tu58em并将其在Mac上编译。它只需要对串行端口代码进行一些修改即可干净地编译。
然后,我开始为TU58仿真器获取可启动的TU58映像。使用模拟器来完成所有此类工作要简单得多。我用E11来做所有这一切。首先,我尝试了XXDP 2.6,该文件在bitavers上找到了用于的图像:
不幸的是,它比我的计算机需要更多的内存,因此将无法运行此版本。此外,出于某些原因,GKAB诊断程序根本无法在模拟的PDP-11 / 04上运行!
然后,我花了一些时间为XXDP套件的早期版本XXDP +制作TU58映像。
在真实计算机上的XXDP +下运行GKAAA0.BIC可以正常工作。大部分机器状况良好!这是我使用的图像的链接。
但是不幸的是,运行GKABC0会停止。无法找到此诊断的列表,但PDP-11 / 34版本非常相似。查看代码可以发现它暂停的部分正在测试CPU中的堆栈溢出逻辑。通过将堆栈指针设置为400,然后启用控制台TX中断来完成此操作。这将导致立即发生TX中断。这会将堆栈指针减小到400以下,并立即触发向矢量4/6的陷阱。另一方面,我的机器将触发新的控制台中断,直到堆栈回绕到177774(没有内存),然后由于双总线故障而停止!
通过交换卡,我发现使用替换的DL11-W的问题消失了。似乎DL11-W内部的中断逻辑已损坏。一旦CPU用SSYN响应,该中断将被清除。这不会在有故障的板上发生。 CPU一旦开始处理中断,就一次又一次地中断。
这是unibus中断周期。当CPU准备好处理中断时,设备声明/ BRn行,并且CPU响应BGn。然后,设备将以/ SACK响应,然后将向量放到总线上并置位/ INTR信号。 CPU将以/ SSYN信号响应。此跟踪来自工作板。
下面的示意图显示了中断触发器和在执行中断后应清除的门。
这张不太清晰的图片清楚地显示了不良板上的7408 AND门故障:
7408 E4的输入12和13的输出11。应该将引脚11上的信号清除为低电平。这不会发生,因此中断不断出现。
这是TU60磁带机。 DEC在70年代根据通用盒式录音带的一种变型为纸带做了简单的替换。 TU60容纳两个磁带驱动器单元。 150英尺的磁带可以存储近100 k字节。
顶视图显示了模拟板,该板可控制电动机并从磁头读取数据。与标准的盒式磁带驱动器不同,TU60不使用绞盘来控制磁带的速度。而是有两个独立的电动机。一种是倒带,并保持拉紧状态。另一个是由伺服器控制的前进电动机。前进电动机的转速是恒定的,比特率是恒定的,这意味着比特密度沿磁带变化。 TU60利用相位编码对磁带上的位进行编码。
控制器是一个简单的接口,具有两个寄存器,分别是177500的控制和状态寄存器以及177502的数据缓冲区。该板包含一些中断逻辑和地址解码电路,但它是驱动器的简单接口。
当开始和这个小家伙摆弄时,我很快就遇到了麻烦。倒带按钮过去工作正常。但随后突然停止了工作。显然,将电动机轴连接到暗盒的三角形物品已经从轴上掉了下来。根据图纸,那里应该有一个#2-56 1/8固定螺钉。但这不是。它怎么会消失呢?当第二个驱动器也有同样的问题时(在那种公制国家的瑞典很难找到这种紧定螺钉),我在图纸中仔细看了一下。在较低的三角形耦合器上,它写为" loctite"。而不是固定螺丝。也许他们俩都只用乳酸?无论如何,我买了一些胶水,猜猜是什么,它很好用!显然Maindec ZTAAC0完全没有通过。我发现的第一个问题是驱动板上的DEC8881驱动程序无法通过EOT / BOT信号。我用7439芯片代替了它,我不得不从中国以每片不到3美元的价格购买。有趣的是,拆焊DEC8881芯片时,背面实际上标记为7439!现在,诊断程序开始在驱动器#1上运行,但不在驱动器#0上运行。没有向前运动。我一步一步地将其跟踪到第一个驱动板上有故障的75452集电极开路驱动器。最终,两个驱动器均通过ZTAAC0!但是不是ZTABC0 ...只是为了研究试图向驱动器中写入内容时发生了什么,我编写了一个小型汇编程序,该程序连续写入一个字节,然后再次递增并再次写入,从而填满整个磁带。这也起作用,因此我对其进行了修改,以从磁带中读取数据。将我的LA放在驱动器的数据缓冲区中,可以得到稳定的00、01、02,...,FD,FE,FF,00、01等流。阅读和写作作品!
我已经收到了CAPS-11操作系统磁带的图像。可启动磁带包含一个名为CTLOAD.SYS的文件,该文件应该是一个引导程序,可以加载实际的CAPS-11操作系统。好的操作系统可能有点夸张,它是一个非常简单的命令行解析器和例程,用于从盒式磁带加载和存储文件。 CAPS-11系统位于文件CAPS11.S8K中,而CAPS-11链接为在8k字环境中工作。 CAPS中的启动过程非常复杂。硬件引导程序(或者如果您想在八进制的地址1000中键入它)称为CBOOT。 CBOOT跳过CTLOAD.SYS文件的前32个字节块(该块是磁带上的第一个文件)。然后,它将接下来的128个字节读取到位置0的内存中。CTLOAD.SYS的这一部分称为PRELDR。然后PRELDR确定可用内存的大小,并将其余CTLOAD.SYS加载到可能的最大内存中。其余部分实际上由CABLDR和CBOOT组成(再次)。 CABLDR是一个盒式绝对装载机,但是它读取的文件格式与纸带绝对装载机相同。这意味着CAPS11.S8K文件为纸带绝对格式,可以使用PDP11GUI轻松加载!此外,CABLDR使用切换寄存器来决定如何加载内容,并且由于该计算机缺少程序员控制台,因此CABLDR会因不存在内存陷阱而停止运行。
使用PDP11GUI并从21510开始给出了CAPS-11提示。 70年代初的操作系统于2014年运行。40年后。
找出TU60的问题所在,需要轻松地以可预测的方式重复某些操作。不幸的是,使用XXDP诊断程序确实很棘手。它们在子例程中打印出错误代码,这可能是写或读的结果。至少我无法确定到底出了什么问题。同样,在连接逻辑分析仪时,可以一遍又一遍地进行相同的测量,并且只需稍微调整测试点,这很有用。我得出的结论是,最好的方法是编写自己的简单测试程序来做到这一点。我在PDP-11汇编器中尝试了一些小型驱动器,以从驱动器写入或读取文件。但是,即使是一个稍大的程序,也需要大量的调试工作,我是没有经验的PDP-11汇编程序程序员...我更是C类型的家伙。在机器上运行C程序呢?当然,需要交叉编译器。 Diane Neisus页面启发了我。我下载了Binutils 2.24 GCC 4.8.2并进行了构建:Binutils:然后是GCC:然后我需要c启动文件crt0.s。我创建了一个最小的版本,该版本可以正常工作:由于格式化打印非常有用,因此我搜索并找到了一个适合嵌入式应用程序的微型printf,它足以作为开始。编译并尝试链接此程序后,发现缺少一堆例程___ mulhi3,___ udivhi3等。 gcc使用的例程,而不是本机指令。我用C语言编写了自己的简单例程,该例程执行了乘法,除法和提醒操作。在编译这些代码时,我发现使用带-m10选项的编译器强制其生成PDP-11 / 10兼容输出时,编译器在生成从短到长的转换代码时会崩溃。唯一的
......