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.
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
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
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:
- A WE32100 CPU core
- Interrupt logic
- A 2681 DUART for keyboard and serial I/O
- RAM and ROM
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
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
-v: Print the version and exit
- -h: Print help ane exit
- -s SHELL: Execute SHELL as a sub-process
- -d DEVICE: Connect directly to the specified tty device
- -n FILE: store NVRAM settings in the specified file
- -f VER: Use the specified firware version (either “8;7;3” or “8;7;5”, the default)
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