i68apollo
is the computer-based component of the two-part i68
(*I*nput from Motorola *68*000[fn:4]-based calculator) prototype userspace driver intended to allow the use of a Texas Instruments TI-83 Plus, TI-89 or TI-92 Plus calculator as an external keyboard under Linux. i68apollo
is not intended to work under any other operating system.
i68apollo
requires its sister component i68soyuz
to function, which you can find here.
For the time being, i68
requires that the calculator be plugged in via a SilverLink cable. No other means are supported, including TiEmu. If you want to use i68
, get ready to spend money on old hardware.
i68apollo
is written in Rust and requires standard Rust utilities to compile. Go here to install them, if you haven’t already.
If you’re unfamiliar with the Rust build process, here’s an expedited guide:
- Install
cargo
, like I said - Open a terminal and
cd
to the directory you’ve downloaded/cloned/pulled this repository to.[fn:2] - Once there, you’ll type either
cargo run
orcargo run --release
to compile and run with either the debug or release compilation profiles, respectively.
- Plug your calculator into your computer with a SilverLink USB cable.
- Start
i68soyuz
on your calculator by following the instructions in that project’s repository. - When prompted to “start apollo”, start
i68apollo
with eithercargo run
orcargo run --release
. - Go ahead and “press any key” on your calculator.
i68apollo
andi68soyuz
will then exchange version information. If there is a version mismatch, both will mutually abort the connection. Otherwise, you should at this point be able to type on your computer with your calculator. - Press the
ON
key on your calculator at any point to quit.
- Ensure that the major (first number) and minor (second number) versions of
i68apollo
andi68soyuz
match. If they do not, you must install the up-to-date version of the offending component. - If you get an error saying something about being “unable to create virtual keyboard”, make sure
uinput
is running. You can do this by runningsudo modprobe uinput
in your terminal. - If you get an error about “not being able to find link cable”, make sure the link cable is plugged in, and that your USB ports are functioning correctly. Try running
lsusb
to determine if the SilverLink cable is visible to the operating system. - If you get an error about something being “busy”, make sure you aren’t running any other programs that might be trying to access the link cable, like TiLP2 or TI Connect.
- If for whatever reason
i68apollo
fails to exit wheni68soyuz
does, press Control-C in the terminal to force it to quit.
- Because TI calculators have a somewhat… nonstandard keyboard layouts, many of the special keys are not properly implemented. Keys like
SIN
,MODE
or^
instead produce bogus function key presses. Furthermore, combinations like2nd~+~I
fail to produce the expected result. This is partially due to the limitations of the Rust uinput crate, and partially due to the limitations of X11’s (or XKB’s, rather) default keyboard configuration. Perhaps future work will address this, perhaps not. Messing with X11 internals gives me the heebie-jeebies.
- I would like to implement some kind of support for the TI PLT-KBD, but due a dearth of documentation this may not be possible.[fn:1]
- It’d be nice if the two components could send some configuration information between each other, such as which key should be used to exit, or how the calculator should report its key matrix.
- Manually loading
i68soyuz
onto the calculator is a pain, it’d be nice ifi68apollo
could do that automatically. Could probably be done by loading the calculator’s directory, executingi68soyuz
if found, checking its version, and either proceeding if everything passes or else issuing a “silent download” to install the latest version, then proceeding. - Overall robustness could really use some improving.
- It’d be desirable if I could roll an XKB configuration for the TI-92 Plus. It’d be really annoying and complicated, especially since it has so many nonstandard KeySyms and multigraphs and modifiers and such, but I think it could be done.
i68apollo
is named for the Apollo spacecraft used as part of the joint Soviet-American Apollo-Soyuz Test Project. As I am American, and i68apollo
is the “local” component of i68
, I named it after the American part of the mission.
i68soyuz
, the “foreign” component of i68
, was named likewise for the Soviet spacecraft.
[fn:4] Now something of a misnomer, following the successful to port to the z80-based TI-83 Plus.
[fn:3] https://www.youtube.com/watch?v=urcL86UpqZc&t=472s
[fn:2] If you don’t know how to use the terminal, then I’m sorry but this might be little over your head. For what it’s worth, you probably don’t really want to run this anyway. It’s hacky and gross and brittle and obtuse and unpleasant to use, and all for very little benefit. If you still do regardless, you’re probably technically inclined enough to figure it out yourself.
[fn:1] I think it should be possible to hook the relevant interrupt for link port I/O and the log the tx and rx queues to reverse-engineer the protocol, but I have yet to try it. I think it’s pretty simple–just sending a remote-control packet with every keypress–but I haven’t been able to get anything working under that assumption. Perhaps the protocol is more bidirectional than I knew–the keyboard may require the calculator to identify itself before it can send keycodes, or something else entirely. This footnote is entirely speculation.