V9t9 emulates the TI-99/4A on your computer.

It supports:

  • Configurable PC controller to joystick mapping
  • RS232/PIO output and TI Impact Printer emulation
  • Reading/writing cassette recordings to files
  • Drag and drop / auto-detection of modules, disks, demos, 99/4A files
  • Ability to save/restore sessions
  • Module formats: V9t9, MESS (.rpk/.zip), PBX banked modules
  • Disk support (files in native filesystem, sector images, track images)
  • TMS 9918A video
  • TMS 9919 sound
  • TMS 5220 speech
  • Demo playback and recording support
  • UCSD P-Code System
  • Rudimentary debugger
  • Image import
  • "Realistic" rendering of the monitor

(Some features here are advanced.)


Sound samples:

Recent Changes

2017/03/05 (download)

    New/published features:
  • Allow configuring PC controller to joystick mappings
  • Extract image importer into its own tool ( -tool ConvertImages), with enhanced support for various 4/8/15/16 bit depth modes and palettes
    Bug fixes:
  • Allow editing the way controllers map to joysticks (bug #13)
  • Fix detection of keyboard in certain modules (bug #9)
  • Find P-Code binaries more reliably (bug #8)
  • Improve keyboard mapping for joysticks (bug #6)
  • Add help to
  • If v9t9 crashes on Linux, due to PulseAudio issues, you can pass to use Java implementation
  • Avoid cases where configuration settings are lost on macOS
  • Fix bug in X instruction
  • Various disassembler/assembler fixes

2015/07/21 (download)

    New/published features:
  • Add RS232/PIO configuration -- for now, just determining whether the printer dialog opens or not
  • Improve printer dialog UI, allowing saving images to disk, and using less memory when multiple pages are printed
  • Add cassette reading/writing configuration button
  • Support PgUp/PgDn and Ctrl Home/End in debugger CPU instruction view
    Bug fixes:
  • Improve emulation speed significantly (for lower-end machines) (related to bug #2)
  • Improve video updating synchronization for less tearing (bug #3)
  • Fix keyboard buffering that interfered with gameplay (bug #4)
  • Fix cataloging and distinguishing of modules which are named the same (bug #5).
    V9t9 knows about a large number of unnamed (auto-start) and ambiguously named modules ("Milliken", "For English") and names them for you. V9t9 now also identifies and filters out duplicate modules.
    NOTE: the format of the modules.xml file has changed, so saving any changes with this version may not work with older releases.
  • Improve setup wizard load speed and make modules page simpler.
  • Fix disk/device selector history (can easily swap directories/images between DSKx entries without opening/closing dialog)
  • Ship v9t9render libraries. If V9t9 crashes on startup for you, especially when running under VirtualBox, try passing --client SWTAWT to or v9t9.bat to work around it.
    Site features:
  • Added archives of older V9t9 builds.

2015/07/02 (download)

  • add -Djna.nosys=true to by default.
  • allow VMARGS to be set outside
  • allow -Dv9t9.sound.rate=... to change ALSA rate and to bypass custom sound usage for Linux and Windows (possible fixes for bug #2)
  • fix problem with USCD P-System option no longer being available (thanks to RvK for noticing)
  • try again to fix OS X class loading issues (thanks Scott S. and Michael R. for reminding me)
  • revamped device configuration -- one button for selecting devices, then each device icon allows individual configuration
  • other GUI tweaks

2014/05/19 (download)

  • fix OS X support (for real?)
  • added initial RS232 " PIO support with TI Impact Printer emulation (try the "Printer Example" demo)
  • fix Windows XP (pre-OpenGL 1.5) support

2013/10/20 (download)

  • fix bug with joystick 'fire' detection in hand-coded assembly
  • add breakpoint support to debugger (right-click on an instruction to set/reset)
  • fix bug using numeric keypad as joysticks (use Num Lock + Scroll Lock)
  • fix launching for Win 7

2013/06/17 (download)

  • added support for Corcomp double-density disk controller
  • make audio gate more consistent
  • fix double-sided disk detection with *.dsk files
  • add EA/8K Super Cart support
  • fixed bug losing history from disk selector dialog
  • fixed bug leading to appearance that module list setup could not find all the required files
  • changed module list setup. Instead of showing only modules registered in a central database, V9t9 will prompt you to establish a modules.xml file containing a custom list of modules detected on your ROM paths.
  • more accurate DIV cycle counting

Older releases

Well, I don’t have any and can’t rebuild them, since they use Java Web Start, which is essentially obsolete now and apparently impossible to build or use in new Java releases.



Have Java 6 or newer installed on your system.

You will need ROMs to actually use the emulator. I don’t provide these but this page will give you some instructions.


Download the archive and unzip it somewhere on your system.

Running from Windows

Launch V9t9 by double-clicking the v9t9.bat file.

If this exits immediately, be sure java is on your PATH. If it crashes under a VM, try passing –client SWTAWT.

Alternately, run a Command Prompt and type:

cd \path\to\extracted\v9t9

Running from OS X or Linux

Launch V9t9 by double-clicking the file.

If this exits immediately, be sure java is on your PATH. If it crashes under a VM, try passing –client SWTAWT.

Alternately, run a Terminal and type:

cd /path/to/extracted/v9t9

Keyboard Mappings

The 99/4A keyboard has 40 keys and your keyboard has more. The 99/4A formed the rest of the ASCII character set using the “Fctn” key with other alphanumeric keys. Also, 99/4A programs often refer to symbolic key names like “REDO” and “PROC’D”, which map to “Fctn” plus number keys.

In V9t9, use “Alt” for “Fctn”.

These are the Fctn-+number mappings:

  • Fctn-1 = DELETE
  • Fctn-2 = INSERT
  • Fctn-3 = ERASE
  • Fctn-4 = CLEAR (this also stops BASIC programs and some RS232/PIO device operations; hold it down)
  • Fctn-5 = BEGIN
  • Fctn-6 = PROC'D
  • Fctn-7 = AID (often used for help)
  • Fctn-8 = REDO
  • Fctn-9 = BACK (like Esc)

These keys that don’t exist on the 99/4A are automatically mapped as follows by V9t9.

These choices try to align with the patterns of typical 99/4A software. If you object, please file a feature request!

  • Arrow Down = Fctn-X
  • Arrow Up = Fctn-E
  • Arrow Left = Fctn-S
  • Arrow Right = Fctn-D
  • Home = Fctn-5 (BEGIN)
  • End = Fctn-0
  • Insert = Fctn-2 (INSERT)
  • Delete = Fctn-1 (DELETE)

(The keys above are the same for the numeric keypad when Num Lock is enabled and joystick mode is not enabled.)

  • Page Up = Fctn-6 (PROC’D)
  • Page Down = Fctn-4 (CLEAR)
  • Fnumber = Fctn-number

Joystick Mappings

The standard 99/4A system came with two joysticks – aka “handheld controllers”.

V9t9 provides several ways to emulate the 99/4A joysticks.

PC Controllers

V9t9 can use connected PC controllers or joysticks and map them to 99/4A joysticks.

  • V9t9 only selects controllers with X and Y controls which don’t act like mice.
  • You must restart V9t9 for it to detect and use changes in connected joysticks.
  • Select the “Joystick” icon in the left-hand toolbar to configure how the connected controllers map to the TI Joystick.
  • This dialog (in Interactive mode) shows live updates of whichever controllers were detected at startup and allows you to assign their components to Joystick 1 or 2 (or neither) and then choose how each component contributes to the joystick.

    • IGNORE: the component is not used (handy for buggy USB controllers with stuck values)
    • X_AXIS, Y_AXIS: map an analog control to the X or Y axes
    • DIRECTIONAL: map a single analog control to X and Y axes
    • UP, DOWN, LEFT, RIGHT: map buttons to these directions (useful for Playstation 3 directional-pad buttons)
    • BUTTON: map the button to Fire
  • You may also edit the configuration (Edit mode). The syntax should be somewhat obvious.

V9t9 will keep track of various combinations of detected controllers, but may not migrate settings from e.g. controller A if you run with controllers A and B the next time.

Whatever edits you make in the Interactive or Edit modes applies only for the specific controller setup active when you run V9t9.

See ~/.v9t9j/config and ControllerConfig and Joystick1Config and Joystick2Config for details if you want to copy settings between controller configurations without doing this by hand.

Emulating with host keyboard

V9t9 can use the keyboard’s numeric keypad as “joystick #1” (and also “joystick #2” if you enjoy a difficult challenge).

Press Scroll Lock to toggle between modes.

By default the numeric keypad is used for ASCII numbers or 99/4A keyboard arrows (whatever Num Lock indicates). You’ll see a notification to the lower-right telling you the current mode.

When you see “Using numpad for joystick #1 (shift for #2)”, you can use the numeric keypad.


4   5   6      fire = 'Enter', '+', or '-'   reset = 5 (in case something's stuck)


If you need to emulate “joystick #2”, hold down Shift. (I told you it’d be a challenge.)

Standard keyboard mappings

99/4A programs usually support keyboard-only setups:

Player 1:


S       D      fire = Q


Player 2:


J       K      fire = Y



Please see this page for details.


I’ve been working on this in various forms since 1992, when I started working on the idea in Turbo Pascal as “tiemul.pas” in the computer lab, and once crashed the computer’s server when I ran it there without permission.

That next summer, I started rewriting the emulator in assembly for DOS and soon made the emulator into a product: “TI Emulator!” (yes, with the exclamation point). It was my first venture into the world of business – and copyright infringement. (I had been shipping ROMs around, and TI reminded me that I should have a license agreement and be paying royalties.)

This was an exciting time, interacting with people all over the world through letters and emails. A loyal user suggested the name “V9t9” and the product was renamed and a few more versions were released.

I got several requests to support then-current custom hardware for the aging TI-99/4A, but unfortunately was not experienced enough to infer the operation of hardware without having it in person, so those efforts never got off the ground.

A few years later, I moved from DOS to Linux and started porting V9t9 to C. This project was exciting, since it involved making the thing portable and capable of supporting multiple kinds of graphics, sound, and input APIs. This port never really saw the light of day (it was a bit way too geeky for the average user to understand, and only built against GNU C in Linux and Metrowerks Codewarrior in Windows).

Many years later, I started porting V9t9 to Java in 2005. The Java port was originally quite nastily ported directly from the C port, and I’ve been gradually rewriting chunks in a proper object oriented format ever since.

I would be remiss not to mention the driving motivation for continuing to work on the emulator at all in the 2000’s, after my original TI-99/4A became mostly unusable (no access to a TV or monitor with RCA connectors, for example) – Thierry Nouspikel’s excellent compendium of technical data, The TI-99/4A Tech Pages.
I have gone back to this site again and again over the years to refine my understanding of hardware I’ve not used in years.


Please see this page for advanced usage and configuration.


The V9t9 Java codebase is licensed under EPL v1.0, with the exception that no commercial redistribution is allowed.

This software includes content licensed under EPL v1.0; code from the Base64 library;
Vlad Roubtsov’s HRTimer library; LWJGL utilities from Kevin Glass and Brian Matzon; and the various packages from Apache Commons.

Friend of Eclipse</img>