构建IBM3270终端控制器

2020-05-28 08:04:34

IBM3270型终端是大型计算机终端。我长期以来一直对IBM的大型机着迷,尤其是这些终端。3278和3279等早期机型有独特的美学,它们的块状设计与无处不在的VT系列终端有很大的不同。

我并不是唯一一个想要将真正的IBM终端连接到Hercules仿真器上的人。不幸的是,很难找到必要的带以太网或令牌环接口的IBM3174终端控制器,这是支持TCP/IP且处于工作状态的软件版本。此外,它们很大,噪音很大,而且很难维护,因为软件是从一张不常见的2.4MB 5.25英寸软盘上加载的-如果你幸运的话,还有一个20MB的硬盘选项。所以我决定建造我自己的,并在这个过程中学到一些东西。

根据IBM的说法,3270信息显示系统于1972年推出,5年后的1977年成为标志性的3278终端。彩色终端于1979年与3279一起问世。将IBM型号和日期混为一谈非常令人困惑!

3270是最易识别的面向块的终端之一。3270数据流允许程序员描述包含受保护文本、不受保护字段和格式属性的屏幕。不受保护的字段允许您输入或修改数据。终端不会像面向字符的终端那样立即将您按下的每个键都发送给主机,而是会存储输入,直到您按下注意键(如Enter)。只有当您按下注释键时,输入才会发送到主机,这样可以缩短缓慢或不可靠连接的感知响应时间。它还降低了主机处理要求,允许连接到主机的终端比面向字符的终端多得多。它与HTML表单没有太大不同。

早期的3270终端上有令人兴奋的外围设备,包括用于改进导航和磁卡读卡器的光笔;不幸的是,我从未在eBay上看到过这些。

在星形拓扑中,终端通过同轴电缆连接到控制器。Balun可以将此转换为更常见的双绞线布线,尽管我认为IBM更喜欢您使用他们的布线系统。控制器根据是本地控制器还是遥控器和年份通过不同的接口连接到主机,接口包括:

因此,IBM 3174和3274控制器有许多不同的形状和大小-从小型台式设备、中型机架安装设备到大型落地式设备。

包括Memorex在内的其他公司也生产兼容的终端和控制器。一旦个人计算机变得司空见惯,终端就可以被ISA、PCMCIA以及后来的PCI卡取代,PCI卡允许运行仿真器的PC使用相同的同轴电缆进行连接。后来,随着LAN和TCP/IP的出现,这些连接被不需要额外硬件或同轴电缆的TN3270 Telnet所取代。

对于现在拥有TCP/IP网络但也拥有大量物理终端的客户,后来的3174控制器提供了通过TCP/IP上的Telnet将这些终端连接到大型机的能力。这些是您要连接到大力神的控制器。让我感兴趣的是,这些后来的控制器还提供了VT100仿真功能,3270终端可以通过telnet连接到UNIX或VMS主机,就像它是VT100一样。这对我来说似乎很奇怪;如果终端是面向块的,似乎不可能以一种有用的方式模拟VT100。

最后一台IBM终端是20世纪90年代末推出的3483。到那时,该终端类似于瘦客户端,并使用行业标准的VGA显示器和PS/2键盘连接。

我最初的搜索发现了所使用的电缆和3270数据流的描述,这是有详细记录的,但没有关于终端和控制器之间使用的协议的描述。直到我找到了用于构建PC接口的现已过时的芯片的数据表,我才从芯片和国家半导体公司(National Semiconductor)找到了我想要的细节:

设备通过特性阻抗为93&Amp;Ohm的RG-62型同轴电缆进行点对点连接-与使用总线拓扑和50&Amp;Ohm阻抗电缆的10BASE2以太网不同。为了减少长电缆线路上的噪声干扰,使用了差分信令,该规范允许设备之间的距离长达1.5公里。

使用MACHESTER编码以2.3587 Mb/s的比特率发送数据。该编码方案确保每个比特中间的转换(从高到低或从低到高),从而允许接收器可靠地恢复数据。一帧包含一个或多个10位字;帧中的每个字以同步位开始,以奇偶校验位结束。唯一的序列指示帧的开始和结束。

控制器发起所有通信;它向终端发送包含命令字和可选数据字(将其视为参数)的帧。终端用包含一个或多个数据字的帧进行响应。

原来有两种不同类型的终端切割和DFT。切割型终端依靠控制单元来处理3270数据流,并将其转换为基本操作,例如将光标移动到该地址,并将这些字符写入显示缓冲器(称为再生缓冲器)。该控制器处理与3270终端相关的大部分智能人员,这意味着CUT终端逻辑比可比的VT100更简单。DFT类型的终端可以自己处理3270数据流,并且控制器将其传递给终端。

你仍然可以在易趣上找到国家半导体DP8340发射器和DP8341接收器,所以我和数据手册参考电路中显示的其他元件一起购买了一些。我最初认为我必须从头开始建立一个接口,但这些发射器和接收器IC为我提供了数据链路层处理。

我还找到了一个带令牌环接口的IBM3174-23R机架式控制器,我想我已经准备好出发了。不幸的是,控制程序软盘已损坏,只能加载诊断盘。诊断程序确实在终端上显示菜单,这足以捕获终端和控制器之间的一些流量进行分析。

我根据DP8341数据表在面包板上构建了一个简单的接收器电路,将其连接到Arduino Mega上,并使用T形连接器连接控制器和终端之间的线路。当数据可用引脚第一次变高时,我非常兴奋,并且调用了我的中断处理程序。我花了一段时间才能可靠地从接收器读取数据。我很快就发现Arduino Mega;的8KB内存溢出了,而且数据速率太快,无法通过串口实时将数据卸载到我的PC上。

我捕获的大部分消息都是来自控制器的轮询命令和来自终端的确认响应。因为控制器发起所有通信,所以它必须轮询终端以连续检查按键。过滤掉无按键消息后,我可以将终端返回的扫描码映射到键上。

我还捕获了与显示缓冲区相关的LOAD ADDRESS COUNTER和WRITE DATA命令。提取地址很容易,但根据终端上显示的诊断界面,我没有看到以EBCDIC编码写入显示缓冲区的数据,它也不是ASCII。原来终端使用的是不同的字符编码,我不知道它叫什么,也找不到任何与它相关的信息。我从诊断界面获得了足够的示例,可以从捕获的数据构建大部分映射。当我将DP8340发送器添加到面包板时,在第一次写入后能够生成完整的映射。当然,hello world!

3270终端在显示屏底部显示状态行。除当前光标位置外,状态行由控制器管理。令人困惑的是,状态行开始于显示缓冲器的地址0,尽管它位于屏幕的底部,但地址80是80列模式中的左上角单元。此外,状态行的字符编码是不同的,并且包括许多不寻常的符号。

最终,我能够创建一个Python库pycoax来序列化和反序列化3270帧-Python代码在您的PC上运行,并通过串行(真正的USB)与Arduino通信。

最后,我使用KiCad设计了我的第一个PCB,并将设计发送到JLCPCB。15美元,一周后,我准备好了5个Arduino盾牌,可以组装了。与面包板电路相比,PCB是一个相当大的改进,我注意到接收器错误显著减少。好的,我承认第一次有一个路线错误-我确实不得不订购一个修订版!

我的目标是构建一个可以与Hercules一起使用的IBM3174控制器的替代品。现在我明白了切割型终端不会直接处理3270数据流,我意识到首先实现VT100仿真比实现TN3270更容易。

我发现了pyte,它提供内存中的VT100仿真,我可以连接到进程(比如shell或SSH)。我所要做的就是轮询终端上的按键,将这些按键传递给进程,用进程输出更新pyte仿真器,然后将模拟的终端屏幕写入终端-需要一些映射。再重复一遍。除此之外,我还必须监视终端是否连接(通电)或断开,并监控进程运行状况。

在内存昂贵的时代,像我这样在控制器内存中维护屏幕副本不是早期控制器的操作方式。取而代之的是,切割终端提供命令以从显示缓冲器读取并查找与特定模式匹配的单元,例如指示未受保护字段的开始的属性。没有同样的资源限制,我发现维护屏幕副本和使用更改的内容更新终端要容易得多。

受pyte的启发,我编写了pytn3270,这是一个提供类似内存仿真的纯Python TN3270库。将其与控制器集成几乎不需要更改;我需要做的所有不同之处就是将字段属性映射到3270终端属性字节。我本来可以使用x3270,但我想更好地理解telnet协议和3270数据流。我只实现了最低限度的TN3270协议,但是连接到z/OS就足够了,一个纯Python库可能会在本项目之外派上用场。

今天,OEC远不能提供IBM3174控制器的所有功能,但它是可用的。

首先,我想添加一个连接菜单,以便您可以选择主机(它当前只能连接到单个主机)和多个逻辑终端支持。稍后的EAB和TN3270E支持-我需要实现一些缺少的pytn3270功能来支持这些功能。

我正在研究一个基于FPGA的接口,它不依赖于过时的国家半导体IC-在这个过程中,我了解了更多关于协议和一些Verilog的知识。

如果您对这些感兴趣,我很乐意收到您的来信。目前关于这些终端的信息很少,我可能把现存的东西和历史错误地拼凑在一起了-欢迎任何更正、澄清或其他信息!