A DMD 5620 Terminal Emulator

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.

dmd_5620.jpg

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 is the version the emulator also runs. (/As an aside, I would love to find other ROM versions and allow the emulator to load whichever one it chooses, but so far I've had little luck tracking down older ROMs/)

I started by writing a WE32100 core and I/O emulation library. From there, I built two front ends that use the same common code, one for Macintosh and one for Linux. A Windows version is planned.

The main goal for the project was compatibility with the AT&T 3B2/400 Emulator, so that informed a lot of my decisions. However, there is no reason the emulator should not work with mpx and mux on Research UNIX (V8, V9, and V10), so long as the mpx and mux code has been compiled for the correct terminal ROM 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.

Challenges

Because of the nature of the beast, I chose not to embed the library source code in the native Mac and Linux emulator projects. Instead, I have checked in pre-compiled static libraries (ar archives) built from the Rust source.

There is a downside to tqhis, of course: it requires you to build on the same platform that the libdmd_core library was built on. If you want to build one of the native emulators from source yourself, and you're not on x86_64, you will first need to build dmd_core with Rust, and then overwrite the libdmd_core.a file in the native emulator's library directory.

It was a tradeoff I was willing to make.

The Linux DMD 5620 Emulator

dmd_gtk_screenshot.png

Usage

This is a command-line GTK+ 3 app that uses Telnet to connect to a host.

dmd5620 [-v] -h host [-p port] [-n nvram_file] [-- <gtk_options> ...]

The valid options are

-v
Print the version and exit
-h host
Connect to the given hostname (Required)
-p port
Use the supplied port number (Optional. If not specified, the default is 23)
-n file
Store the contents of NVRAM in the specified file (Optional)

Binary Release

If you want to start playing with the emulator without building it, there is a binary release available here that should work for any current Linux distribution that has libgtk-3 installed.

If you have any trouble with it or want a custom build, please email me.

Version Date Link SHA1 Size
1.2.0 11 January 2019 dmd5620 02b4b626805bb8b88915ecb37fc50496c53ce749 1,069,008 bytes

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.

The Macintosh DMD 5620 Emulator

dmd_mac_screenshot.png

Usage

The Macintosh version of the DMD 5620 emulator is a standard Mac application bundle. Full instructions for use are included in the built in documentation under the Help menu.

Binary Release

The binary release is currently available from the Mac App Store. It is compatible with macOS "Sierra" 10.12 and higher.

mac_app_store_badge.png

Source Code

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

It is written in Swift using Cocoa, CoreAnimation, and CoreGraphics frameworks.