A graphing calculator as an SSH terminal
The TI Voyage 200 is a graphing calculator from 2002 with a QWERTY keyboard, a 240x128 screen and a 2.5 mm link port meant for talking to other calculators and data loggers. A keyboard and a screen are most of what a terminal is, so I wanted to know if the link port could carry the rest. It can. The calculator now runs ssh sessions, vim, tmux, irssi, htop and even Claude Code, with no physical modifications to it.
How it works
An ESP32 sits on the link port and does the networking. The calculator only draws text and reads keys. A 13 KB C program, compiled with GCC4TI, turns the calculator into a 60x21 VT220 terminal. From its menu you can open:
- Serial: a shell on the computer the ESP32 is plugged into, over USB.
- SSH: a session to any host over Wi-Fi. The ESP32 stores up to eight hosts and four Wi-Fi networks. It can also generate its own key and copy it to a host, so no password ever has to be typed on the calculator keyboard.
The ESP32 speaks the link port’s two-wire handshake itself, bit by bit, and frames the bytes its own way instead of using TI’s packet protocol. Every frame is checked, acknowledged and resent if lost, so nothing arrives garbled, not even after replugging the cable. As a bonus, the ESP32 sets the calculator’s clock from NTP, and pressing ◆ + APPS sends a screenshot of the calculator to the computer.
Taking it on the road
The ESP32 can be an M5Stack Stamp S3 on a breadboard or an M5Stack Cardputer. The Cardputer has its own battery and screen. The calculator runs on its own batteries, so the only cable left is the short one between the two.
Demos
Getting there: listening to the link port
Before any of this worked I had to learn what the calculator says on the wire. Those experiments live in a separate repository, ti-voyage-explorations, which has two ESP32 sketches:
- A link partner: the ESP32 speaks TI’s packet protocol and poses as a CBL data logger or another calculator, so TI-BASIC’s
Send,GetandSendCalctalk to it. - A passive sniffer: the ESP32 sits between two Voyage 200s and records what they say to each other. Twenty captured test sessions make up a write-up of the calculator-to-calculator protocol, down to the timing of each bit. A bit takes about 12.5 µs, and most of that is the sender’s code fetching the next bit.
None of this would have been possible without ArTICL, the TIGCC documentation and LibSSH-ESP32.
The code, wiring and a getting-started guide are at https://github.com/ticklemynausea/ti-voyage200-term-link.