Most retrocomputing apps are one emulator and a screen. ipnx is two emulators, because the thing being reproduced was two machines. The Blit — sold by Teletype as the DMD 5620 — was not a display. It was a computer with its own processor and memory, connected to a headless host by a serial line, and programs ran on it after being downloadedinto it over that line.
Why emulate the whole machine
The alternative — translating 1985 system calls into modern ones, the way iSH does — runs into a wall on Apple platforms: apps may not spawn processes and may not generate code at runtime. A Unix that cannot fork is not a Unix.
Full-system emulation dissolves the problem rather than fighting it. The Research Unix kernel forks its processes inside the emulated VAX, where the host operating system has no opinion about it, and both emulator cores are ordinary ahead-of-time compiled interpreters — the same pattern App Store review has accepted from UTM SE, iDOS and the SIMH-derived iAltair.
What actually boots
Not a prepared script. The boot block finds hp(0,0)unix, the kernel probes its hardware, /etc/rc mounts the filesystems and brings the network up, andinit starts a getty on each terminal line:
Boot
: hp(0,0)unix
280120+62356+81364 start 0x11c
Unix Edition 8 -- ipnx Release 1.0 (2026-08-16)
built Sun Aug 16 07:48:53 2026
real mem = 8388608
avail mem = 7294976
hp0: RP07
il0 at uba0 csr 164000 vec 400
network: il0 10.0.2.15, gateway 10.0.2.2
login:
The wire
The two emulators talk over a loopback socket. That is a stand-in for the cable, and it turned out to be the least interesting part of the problem: the throttles were at each end, not in the middle. The 5620's DUART paced characters at its programmed baud rate, and the simulator's serial device rate-limited the socket to whatever speed the guest kernel asked for. Both were 9600 baud, in series, which is exactly as slow as it sounds.
Raising both took the mux download from about a hundred seconds to fifteen. The lesson generalises: when something is slow at both ends, fixing one end buys you almost nothing, and the measurement that tells you so is queue depth rather than throughput.
Idling
A simulator that is doing nothing should cost nothing, and this one did not — a stockvax780 burns most of a core sitting at a login prompt. The fix was three flags upstream had not set, on the periodic units that sit at the head of the event queue. Patched, the VAX thread idles at under three per cent with the guest's clock still keeping correct time.
The 5620 is the honest remaining cost. It does not idle, because a real one did not: its processor genuinely spun. Closing its window stops the thread and returns the core.
Read the rest
The full technical record is in the repository — the architecture spec, the phase notes, the network file system wire format, and a long list of the mistakes that produced each of the rules above. Nothing in it is summarised for effect; it was written while the thing was being built.