Alternative title: Releasing into the void… Again.

In April 1995 I proudly uploaded MCMF10.ZIP to CiX – an OPL program that made my Psion MC400 play MF4 (DTMF) tones so it could dial phone numbers into a phone handset 😀 I released it well after the MC was on its way to being forgotten, for a platform that (rumour has it) sold less than 1000 units, and then… <tumbleweed> nothing. A couple of emails in 1997 and that was about it. I’d written about MCMF back in 2021 and it was that nostalgia trip that sent me to eBay to buy another MC400.
So here we are, 31.5 years on, and I’ve done exactly the same thing again. I’ve written some new software for the MC400 and I’m releasing it into the void; the number of people actively using an MC400 in 2026 must surely be countable on the fingers of one hand (and I’m one of those fingers 😉 ). But hey, apart from Psion themselves maybe that makes me the most prolific software developer for this particular platform? Maybe so. Another Achievement Unlocked 😉
Meet MCVT – a proper VT100 terminal emulator for the Psion MC series.
But why?
The MC400 comes with a built-in terminal app, TERM.APP, and it’s fine for what it is – a dumb “glass teletype” that’s perfectly happy with a line-at-a-time shell. I use it on serial port A to talk to a Raspberry Pi. But throw anything at it that moves the cursor around – vi, top, anything with a menu – and you get a screen full of escape-code spaghetti. The Series 3/3a crowd had VT100 emulation back in the day (via nfsc/p3nfs) but nobody ever did it for the MC. Probably because, by the time anyone could’ve, nobody had an MC 😀
The undocumented machine:
Here’s the catch. The Psion SIBO C SDK – which I have a copy of, and which runs happily in DOSBox – documents the Series 3 and 3a. The MC is the *older* sibling, and it turns out it’s a rather different beast under the hood. Rather than the Series 3’s HWIM-style interface, the MC400 has a full object-oriented GUI library in ROM – WIMP.DYL and OLIB.DYL – with windows, menu bars, dialogs and an “app manager” that schedules everything. None of it is in the SDK documentation. Not a (MC) word.
So the only way in was through the ROM itself. I pulled the chip dumps from my MC (ROM v2.60F) and set about picking apart the class tables, method numbers and object layouts until there was enough of a map to build a native WIMP application. It’s the sort of fanatical, shoehorned-into-the-tiniest-space development that David Wood describes in *Smartphones and Beyond*, and digging through it only made me admire Psion’s engineering team even more.


A debugger as a test bench:
Testing every build on the real MC400 would have taken forever – copy the file over the PLP link, switch to the system screen, run it, watch it panic, repeat. So I leaned on a trick I’d written about before: the SDK’s SDBG.EXE debugger can run a whole MC-style environment on a PC, and if you drop your own program in as `SYS$BOOT.IMG` it boots straight into it. The SDK even ships an MC window server built for VGA, so what you see is surprisingly close to the real thing.
Add DOSBox’s null-modem serial option and I could pipe a real Linux shell through the emulated serial port into whatever test program I was poking at. A series of little test programs (MCTEST, CONTEST, ATTRTEST, then WT1, WT2 and WT3) went through that loop – plenty of them producing nothing but a black screen and a mouse pointer – before anything got anywhere near the real hardware. Debugging a 36-year-old laptop’s GUI in a 30-something-year-old debugger running in a DOS emulator on Linux… very meta 😀
Reverse engineering TERM.APP:
The other half of the puzzle was Psion’s own terminal app. Picking TERM.APP apart showed it’s just an ordinary program image with two files tacked on the end – the icon first, then the resources (menus, dialogs, strings). Once I knew that, MCVT could be packaged the same way and sit on the system screen like a first-class citizen.
It also showed me that the nice “Serial options” dialog (baud rate, parity, handshaking etc.) isn’t part of TERM at all – it lives in the ROM, and any app can call it. So MCVT uses the *real* MC serial dialog, which feels pleasingly authentic. And the icon? I borrowed TERM’s and wrote “VT100” across its little screen in a 3×5 pixel font. Well, why not 😀
Real hardware, real bugs:
Every build then went over to the real MC400 via “psibridge” – a Raspberry Pi Zero 2 W running MCLINK.EXE in DOSBox on serial port B for file transfers, with port A free for the terminal itself. The real machine found the bugs the emulator didn’t: panics, serial corruption, window maximise oddities and my favourite – the screen falling apart *only* when I ssh’d somewhere else from the Pi. It turned out ssh puts the Pi’s serial tty into raw mode and quietly turns off XON/XOFF, so the MC’s receive buffer overflowed mid-redraw. A one-line `stty ixon` fix on the Pi sorted it.
And yes, I did run btop on it. Over 9600 baud. Ridiculous, I know 😀
What MCVT does now:
– VT100 emulation (with a sprinkling of xterm extras) as a native MC WIMP app with a proper menu bar
– the MC’s built-in Serial options dialog plus its own Terminal options (local echo, Backspace key, auto-wrap)
– UTF-8 decoding – £, accents and box-drawing characters show properly (emoji become a little ■😉 )
– XON/XOFF (and RTS/CTS) flow control
– a resizable terminal grid – maximise it and you get 89×34
– settings saved to M:\MCVT.INI


A note on how it was built:
I should be upfront: a big chunk of the ROM disassembly and the C was done with an AI assistant (Claude), with me steering – dumping ROMs, the SDK debugger hack, testing every single build on the real machine, feeding back logs and screenshots, and deciding what it should do. Doing all of the reverse engineering by hand would’ve taken me months, and I’d have learned more about the guts of EPOC16 along the way. I’m genuinely ambivalent about that trade-off. But the alternative was that MCVT simply wouldn’t exist, and the reverse-engineering notes (now a document in their own right) are a record of an undocumented system that otherwise was never going to get written down.
Into the void (again):
MCVT is released under the GPL-2.0 – the VT100 parser descends from nfsc (Rudolf Koenig, Michael Schroeder and Juergen Weigert), so that’s the right home for it – and it’s on GitHub. MC200 owners (if any of you are out there 😀 ) – there’s a screen-size fix in the works for the 640×200 display.
In 1995 I uploaded MCMF to CiX and waited for a response that never really came. In 2026 I’ve pushed MCVT to GitHub with roughly the same expectations. The difference is that this time I *know* it’s for a handful of people at most, and I’m completely fine with that. Some things you build because they need to exist 😀
If you really wanna do some VT100 on your MC400 then download away…


Countable on one hand .. but not zero 🙂