A DMD 5620 Terminal Emulator

Introduction

A recent project of mine has been studying and emulating the DMD 5620 terminal, jointly produced by Teletype Corporation, Western Electric, and AT&T in 1984.

The DMD 5620 was the commercial version of the “Blit” terminal, which came out of earlier research done by Rob Pike and Bart Locanthi Jr. at AT&T Bell Labs. It was a portrait display, bitmapped graphics terminal with a keyboard and a mouse as a pointing device.

img

The rough history goes something like this:

Pike and Locanthi were inspired by the Three Rivers PERQ graphics workstation, and wanted a bitmapped display for UNIX. They designed and built a prototype bitmap display using a Motorola 68000 processor, and affectionately called it the “jerq” in tribute to the PERQ.

When it started to spread inside Bell Labs, management insisted that it be renamed, so the name “Blit” was chosen—a reference to the Bit Blit algorithm.

Eventually, after the Bell System breakup and AT&T’s entry into the computer market, AT&T decided to commercialize the technology. They worked with Teletype Corporation and Western Electric, changed the CPU to an in-house WE32100, and sold it as a peripheral for their new 3B line of computers.

Providing an Emulation

The earlier 68000 based Jerq terminal used inside Bell Labs is fairly well studied. Several emulators already existed, running under UNIX, Plan 9, and even JavaScript. But the later commercial version, the DMD 5620, remained un-emulated.

Luckily, Eric Smith had assembled a lot of information about the 5620 on his website, including ROM sources and engineering documents. This made the task fairly straightforward.

To get a clean ROM image, I dumped the eight 27128 EPROMs from my own DMD 5620. My 5620 has ROM version 8;7;5 (2.0), so that was the only version the emulator ran at first. Thanks to my friend Sark on Twitter, I have since been able to track down the 8;7;3 (1.1) firmware as well.

I started by writing a WE32100 core and I/O emulation library. From there, I built a front end for macOS and Linux that uses the back end core library. A Windows version is planned (hopefully, some day).

The main goal for the project was compatibility with the AT&T 3B2/400 Emulator, so that informed a lot of my decisions. However, the emulator also works with mux on Research UNIX (V8, V9, and V10), so long as the terminal is running the firmware version 8;7;3.

The Core CPU and IO Library

The core library is written in the Rust programming language, and provides the guts of the DMD terminal. It implements:

It is completely agnostic about where input characters come from and output characters go to, so it is up to the application that uses the library to provide some form of connection (e.g., using the Telnet protocol or a direct serial link). It likewise does not provide any graphics code—it just gives a view into the video RAM, and the implementing application must do its own drawing.

The core library source code is on GitHub here:

It requires Rust 1.31 or later to compile, but should compile cleanly on any platform that supports Rust and the Rust libc crate.

Because of the nature of the beast, I chose not to embed the library source code in the native GTK emulator projects. Instead, the front-end code uses the back-end as a submodule and will try to build and link against it.

The macOS and Linux DMD 5620 Emulator

img

Usage

This is a command-line GTK+ 3 app that can connect either to a physical or virtual TTY device, or execute a shell as a PTY subprocess.

Usage: dmd5620 [-h] [-v] [-d DEV|-s SHELL] \
               [-f VER] [-n FILE] [-- <gtk_options> ...]

-h, --help              display help and exit
-v, --version           display version and exit
-f, --firmware VER      Firmware version ("8;7;3" or "8;7;5")
-d, --device DEV        serial port name
-s, --shell SHELL       execute SHELL instead of default user shell
-n, --nvram FILE        store nvram state in FILE

The valid options are

Source Code

The source for the Linux DMD 5620 Emulator is available on GitHub:

It is written in C using the GTK+ 3.0 libraries and statically linked against libdmd_core.a.