The key to switch between Full Keyboard Mode and Partial Keyboard Mode is preset to Scroll Lock. If you want to map it to another key, simply define the uimodekey property in mame.ini.

Setting in mame.ini

uimodekey ENTER_PAD

This would change the menu key to the Enter key on the number keypad. You can choose any key from this set:

A, B, C, D, E, F, G, H, I,
J, K, L, M, N, O, P, Q, R, 
S, T, U, V, W, X, Y, Z, 0,
1, 2, 3, 4, 5, 6, 7, 8, 9,
F1, F2, F3, F4, F5, F6, F7, F8,
F9, F10, F11, F12, F13, F14, F15, ESC,
0_PAD, 1_PAD, 2_PAD, 3_PAD, 4_PAD, 5_PAD, 6_PAD,

If you do not yet have a mame.ini file in your folder, run MAME with the -createconfig option from a command shell:

mame -createconfig

Command line option

As with all settings in mame.ini, you can also provide this setting in the command line:

mame64 ti99_4a -uimodekey ENTER_PAD

The MAME emulator is operated via the keyboard and a graphic menu. However, the system that it emulates also make more or less extensive use of the keyboard, so we should expect conflicts.

Hence, MAME defines two operation modes and two layout modes of the keyboard:

  • Operation modes
    • Full keyboard mode
    • Partial keyboard mode
  • Layout modes
    • Emulated keyboard mode
    • Natural keyboard mode

You can change the key for switching between the modes if your keyboard does not have a Scroll-Lock key: Change the UI mode key.

 keyboard map t1

The natural keyboard

The natural keyboard posts complete strings for each keystroke but throttles the output.


  • © -> (C) (three characters)
  • ß -> ss
  • æ -> ae

Alpha Lock: Caution must be taken that Alpha Lock is in the release state when starting the emulation. The reason is that the Alpha Lock state cannot be changed in natural keyboard mode. Instead, the case is controlled by the PC keyboard and its Caps Lock state. If Alpha Lock is on (from the last emulation run with emulated keyboard), all characters appear as upper case, regardless of the Caps Lock setting.

Actually, all Linuxes are alike. Almost. In the end, you run into problems because one system is by default installed with some library that another does not use. Since these libraries are installed only once, the challenge is to find out which libraries need to be installed and which are already there, and this is again different from system to system.

Thus, not the Linuxes are different, but their installation evolves over time. I will give some hints for installing MAME on different systems on this page.

Running MAME

MAME is dynamically linked against some libraries which may not be installed on your machine.

But fixing this is a simple job which you have to do only once. The following commands have been tested on a fresh installation. After installing, you should be able to run MAME. (Please report if you find a different situation.)

Unfortunately, different Linux flavors come with different package installers. And to make things worse, they use different package names for the same libraries.


openSUSE Tumbleweed

sudo zypper install libSDL2_ttf-2_0-0
sudo zypper install libQt5Widgets5


Ubuntu 19.10, 20.04

Linux Mint 19.3

sudo apt install libsdl2-ttf-2.0-0
sudo apt install libqt5widgets5

While the simulation of hardware circuits is in no way problematic with respect to copyright (since we produce a new system by observing the behavior of the original one), the distribution of memory contents is generally subject to copyright, and unlicenced distribution is considered an offense by most jurisdictions. Some countries know exemptions in the case of legacy software that is not runnable without the hardware, when the hardware is not available anymore. Other countries do not have corresponding exemptions. So you have to be aware of the following:

The emulator does not ship with any ROMs. There are ROMs available on some servers; use your favorite search engine. Keep in mind that most ROMs are distributed on the assumption that you have the original ROMs in hardware that you purchased. Downloading the ROMs of hardware that you do not have may be a copyright violation. In doubt, contact the copyright holders.

Consequently, I will not provide links for downloading these files. Find out by yourself how to get them. The safest way (from a legal standpoint) is to dump the contents from the real equipment if you own such a system.

At least for the TI-99/8 we have a written consent from TI that the ROM contents may be freely distributed. For TI-99/8 ROMs have a look at (login required).

Rumours are that you should also try the FTP site of WHTech.

The ROM dumps used for the TI emulations can be identified by this list. The required files must be present when starting the emulation. If an optional file is missing, the emulation will run, provided that the affected component that needs the ROM is not accessed. You will get a warning message stating that ROMs are missing and that the emulation will probably not run correctly.

Systems may be parents of others. In that case, the child systems borrow the ROM files from the parents if they do not have them in their own ZIP file. This means that if you have the file, you can always launch the European version ti99_4ae since all files are equal, and the ti99_4a is the parent of ti99_4ae.

  • ti99_4 is the parent of ti99_4e (european version)
  • ti99_4a is the parent of ti99_4ae and ti99_4ev
  • ti99_8 is the parent of ti99_8e

MAME is tolerant about the file names inside the ZIP files; the only important key is the hash code. ROM contents are compared by their hash code to make sure that the contents are authentic. Files may be renamed within the ZIP files.

The following table refers to MAME versions 0.212 and higher. The ROM dumps are distributed over a set of ZIP files. Each ZIP file corresponds to a single system or peripheral extension.

Main systems

These are the ROMs for the consoles, the Geneve, and the SGCPU.

TI-99/4A (ti99_4a)

Also comprises the European version (ti99_4ae)

File name CRC SHA-1 Description
994a_grom0.u500 2445a5e8 ea15d8b0ac52112dc0d5f4ab9a79ac8ca1cc1bbc GROM chip 0000-17ff
994a_grom1.u501 b8f367ab 3ecead4b83ec525084c70b6123d4053f8a80e1f7 GROM chip 2000-37ff
994a_grom2.u502 e0bb5341 e255f0d65d69b927cecb8fcfac7a4c17d585ea96 GROM chip 4000-57ff
994a_rom_hb.u610 ee859c5f a45245707c3dccea902b718554a882d214a82504 ROM chip 0000-1fff high bytes
994a_rom_lb.u611 37859301 f4e774fd5913b387a763f1b8de5524c54b255434 ROM chip 0000-1fff low bytes


TI-99/4A modified for use with EVPC (ti99_4ev)

Inherits from ti99_4a

File name CRC SHA-1 Description
994ev_grom1.u501 6885326d 1a98de5ee886dce705de5cce11034a7be31aceac Modified GROM chip 2000-37ff


TI-99/4QI (ti99_4qi)

Inherits from ti99_4a

File name CRC SHA-1 Description
994qi_grom0.u29 8b07772d 95dcf5b7350ade65297eadd2d680c27561cc975c Modified GROM chip 0000-17ff


Geneve 9640 (geneve)

File name CRC SHA-1 Description
genbt098.bin b2e20df9 2d5d09177afe97d63ceb3ad59b498b1c9e2153f7 Boot EPROM v0.98 ("Swan")
genbt100.bin 8001e386 b44618b54dabac3882543e18555d482b299e0109 Boot EPROM v1.00


Geneve 9640 modified (genmod)

Reuses the boot EPROM from the Geneve 9640 (v1.00)

File name CRC SHA-1 Description
gnmbt100.bin 8001e386 b44618b54dabac3882543e18555d482b299e0109 Boot EPROM v1.00


SNUG TI-99/4P aka SGCPU (ti99_4p)

Also requires a prepared HSGPL card and the EVPC.

File name CRC SHA-1 Description
sgcpu_hb.bin aa100730 35e585b2dcd3f2a0005bebb15ede6c5b8c787366 ROM 0000-7FFF high bytes
sgcpu_lb.bin 2a5dc818 dec141fe2eea0b930859cbe1ebd715ac29fa8ecb ROM 0000-7FFF low bytes


TI-99/8 (ti99_8)

May use the HX5102 as storage. TI-99/4A expansion cards are not guaranteed to work.

ROM file CRC SHA-1 Description
cd2325a.vsm 1f58b571 0ef4f178716b575a1c0c970c56af8a8d97561ffe Speech ROM chip 1
cd2326a.vsm 65d00401 a367242c2c96cebf0e2bf21862f3f6734b2b3020 Speech ROM chip 2
g0_f830.bin 1026db60 7327095bf4f390476e69d9fd8424e98ea1f2325a GROM 0 at address F830 (System)
g1_f830.bin 93a43d65 19be8a07d674bc7554c2bc9c7a5725d81e888e6e GROM 1 at address F830
g2_f830.bin 06f2b901 f65e0fcb2c63e230b4a9563c72f91259b94ce955 GROM 2 at address F830
g0_f840.bin 44501071 4b5ef7f1aa43a87e7ae4f02090944be5c39b1f26 GROM 0 at address F840 (Text-to-Speech)
g1_f840.bin 5a271d9e bb95befa2ffba2cc17ac437386e069e8ff621248 GROM 1 at address F840
g2_f840.bin d52502df 17063e33ee8709d0df8030f38bb92c4322d55e1e GROM 2 at address F840
g3_f840.bin 86c12396 119b6df9211b5399245e017721fc51b88b60879f GROM 3 at address F840
g4_f840.bin f17a2ef8 dcb044f71d7f8a165b41f39e35a368d8f2d63b67 GROM 4 at address F840
g5_f840.bin 7dc41301 dff714da68de352db93fba309db8e5a8ae7cab1a GROM 5 at address F840
g6_f840.bin 7e310a90 e927d8b3f8b32aa4fb9f7d080d5262c566a77fc7 GROM 6 at address F840
g7_f840.bin 3a9d20df 1e6f9f8ec7df4b997a7579be742d0a7d54bc8763 GROM 7 at address F840
g0_f850.bin 2d948672 cf15912d6dae5a450e0cfd796aa36ea5e521dc56 GROM 0 at address F850 (P-Code library 1)
g1_f850.bin 7d64a842 d5884bb2af21c8027311478ee506beac6f46203d GROM 1 at address F850
g2_f850.bin e5ed8900 03826882ce10fb5a6b3a9ccc85d3d1fe51979d0b GROM 2 at address F850
g3_f850.bin 87aaf19e fdbe163773b8a30fa6b9508e679be6fa4f99bf7a GROM 3 at address F850
g4_f850.bin d3e789a5 5ab06aa75ca694b1035ce5ac0bebacc928721388 GROM 4 at address F850
g5_f850.bin 49fd90bd 44b2cef29c2d5304a0dcfedbdcdf9f21f2201bf9 GROM 5 at address F850
g6_f850.bin 31bac4ab e29049f0597d5de0bfd5c9c7bfea902abe858010 GROM 6 at address F850
g7_f850.bin 71534098 75e87123efde885e27dd749e07cb189eb2cc45a8 GROM 7 at address F850
g0_f860.bin 0ceef210 b89957fbff094b758746391a69dea6907c66b950 GROM 0 at address F860 (P-Code library 2)
g1_f860.bin fc87de25 4695b7f979f59a01ec16c55e4587c3379482b658 GROM 1 at address F860
g2_f860.bin e833e350 6ffe501981a1112be1af596a489d96e287fc6be5 GROM 2 at address F860
u25a_pas.bin d7ed6dd6 32212ce6426ceccbff73d342d4a3ef699c0ae1e4 ROM (16K) containing Pascal support
u25_rom1.bin b574461a 42c6aed44802cfabdd26b565d6e5ddfcd689f11e ROM containing ROM1 (16K), Text-to-speech DSR (8K), Hexbus DSR (8K)
u4_rom0.bin 901eb8d6 13190c5e834baa9c0a70066b566cfcef438ed88a ROM0 (only used in 99/4A mode)


TI-99/4 (ti99_4)

Less successful predecessor of the TI-99/4A.

File name CRC SHA-1 Description
994_grom0.u500 aa757e13 4658d3d01c0131c283a30cebd12e76754d41a84a GROM chip 0000-17ff
994_grom1.u501 c863e460 6d849a76011273a069a98ed0c3feaf13831c942f GROM chip 2000-37ff
994_grom2.u502 b0eda548 725e3f26f8c819f356e4bb405b4102b5ae1e0e70 GROM chip 4000-57ff
994_rom_hb.u610 6fcf4b15 d085213c64701d429ae535f9a4ac8a50427a8343 ROM chip 0000-1fff high bytes
994_rom_lb.u611 491c21d1 7741ae9294c51a44a78033d1b77c01568a6bbfb9 ROM chip 0000-1fff low bytes

TI-99/2 24K (ti99_224)

Uses 24K ROM; earlier prototype. Does not support Hexbus.

File name CRC SHA-1 Description
rom0000.bin c57436f1 71d9048fed0317cfcc4cd966dcbc3bc163080cf9 ROM 0000-1FFF
rom2000.bin be22c6c4 931931d61732bacdab1da227c01b8045ca860f0b ROM 2000-3FFF
rom4000.bin 926ca20e 91624a16aa2c62c7ebc23128308709efdebddca3 ROM 4000-5FFF


TI-99/2 32K (ti99_232)

Uses 32K ROM; later prototype. May use HX5102 as storage.

File name CRC SHA-1 Description
rom0000.u2a 01b94f06 ef2e0c5f0492d7d024ebfe3fad29c2b57ea849e1 ROM 0000-1FFF
rom2000.u12 0a32f80a 32ed98481998be295e637eaa2117337cfa4a7984 ROM 2000-3FFF
rom4000a.u3 10c11fab d43e0952538e66e2cedc307b71b65cb388cbe8e3 ROM 4000-5FFF Bank 1
rom4000b.u2b 34dd52ed e01892b1b110d7d592a7e7f1f39f9f46ea0818db ROM 4000-5FFF Bank 2


Peripheral Expansion Cards

These are cards that are plugged into the Peripheral Expansion Box (PEB).

SNUG BwG disk controller (ti99_bwg)

File name CRC SHA-1 Description
bwg_dsr.u15 06f1ec89 6ad77033ed268f986d9a5439e65f7d391c4b7651 DSR ROM (4 banks)


SNUG Enhanced Video Processor Card (ti99_evpc)

Runs on ti99_4ev, sgcpu

File name CRC SHA-1 Description
evpc_dsr.u21 a062b75d 6e8060f86e3bb9c36f244d88825e3fe237bfe9a9 Card DSR


Myarc Hard and Floppy Disk Controller (ti99_hfdc)

Standard floppy and hard disk controller. Runs with TI-99/4A and Geneve. Supports 2 sides, single (9) and double (18) density, and 40 or 80 tracks.

File name CRC SHA-1 Description
hfdc_dsr.u34 66fbe0ed 11df2ecef51de6f543e4eaf8b2529d3e65d0bd59 Card DSR


Myarc Memory Expansion Card MEXP-1 (ti99_myarcmem)

Configured to run with Myarc Extended Basic II.

File name CRC SHA-1 Description
myarc512k_xb2_dsr.bin 41fbb96d 4dc7fdfa46842957bcbb0cf2c37764e4bb6d877a Card DSR


P-Code Card (ti99_pcode)

Card has a master enable/disable switch (check DIP settings).

File name CRC SHA-1 Description
pcode_grom0.u11 505e5df0 66911fba7599c64981180f8a673581f4b05941ff Card GROM 0000-17FF
pcode_grom1.u13 63b546d5 3d830c8bdac102275ec0702eff1ebf4b67484f52 Card GROM 2000-37FF
pcode_grom2.u14 28821e5c c147bd5d8d624caa690284bfc253c6699e3518d4 Card GROM 4000-57FF
pcode_grom3.u16 1db4a4a5 f7a0ba8050f00ccc1ee328c66df5cc4269748ced Card GROM 6000-77FF
pcode_grom4.u19 9618eb9b 1f223f3febcb93e648cefe49c83bfeac802be9d6 Card GROM 8000-97FF
pcode_grom5.u20 c47efe6d f5b56c7de1cb1e7345a0716d35f00a3a9722febe Card GROM A000-B7FF
pcode_grom6.u21 06a34c93 56172c56afa3868f2098328f81881022230d949d Card GROM C000-D7FF
pcode_grom7.u22 a09ca8d9 2ea33d875f9c8e7c00df023a0d8d4461d50f0a87 Card GROM E000-F7FF
pcode_rom0.u1 3881d5b0 a60e0468bb15ff72f97cf6e80979ca8c11ed0426 Card ROM 4000-4FFF
pcode_rom1.u18 46a06b8b 24e2608179921aef312cdee6f455e3f46deb30d0 Card ROM 5000-5FFF 2 Banks


TI Floppy Disk Controller Card (ti99_tifdc)

Supports 2 sides, FM recording (single density), and 40 tracks.

File name CRC SHA-1 Description
fdc_dsr.u26 693c6b6e 0c24fb4944843ad3f08b0b139244a6bb05e1c6c2 Card DSR 4000-4FFF
fdc_dsr.u27 2c921087 3646c3bcd2dce16b918ee01ea65312f36ae811d2 Card DSR 5000-5FFF


TI RS232/PIO Card (ti99_rs232)

Provides two serial interfaces and one parallel interface. May be used twice in the system to get two more serial interfaces and one more parallel interface. Check DIP settings for CRU base.

File name CRC SHA-1 Description
rs232pio_dsr.u1 eab382fb ee609a18a21f1a3ddab334e8798d5f2a0fcefa91 Card DSR 4000-4FFF


Other devices

GRAMKracker (ti99_gkracker)

To be used in the GROM port (cartridge slot).

File name CRC SHA-1 Description
gkracker.bin 86eaaf9f a3bd5257c63e190800921b52dbe3ffa91ad91113 GK loader


Speech Synthesizer (ti99_speech)

Also used as a peripheral card (using an adaptor card)

File name CRC SHA-1 Description
cd2325a.u2a 1f58b571 0ef4f178716b575a1c0c970c56af8a8d97561ffe Speech ROM 128 Kbit
cd2326a.u2b 65d00401 a367242c2c96cebf0e2bf21862f3f6734b2b3020 Speech ROM 128 Kbit


HX5102 Hexbus Floppy Drive (ti_hx5102)

Used with TI-99/8 and TI-99/2 32K. Supports 2 sides, single (9) or double density (16 sectors) and 40 or 77 tracks.

File name CRC SHA-1 Description
hx5102_rom1.u25 40621a77 1532f6f23e0104326c21909cb0ec46936242a12a Drive firmware 8K
hx5102_rom2.u29 57c2603b 2f1d01378943436f0abd5b20710f6c8c175fde13 Drive firmware 8K

We're going to describe a fast way to install MAME on your Windows computer. If you follow these steps closely, there should not be any problem getting it running.

Check your Windows release

You should run a post-XP version (Vista, 7, 8, or 10). Do not try any older release like Windows 98, ME, or 2000. Windows XP is not recommended for security reasons, and MAME is not tested to run on it.

Get the MAME package

Download the most recent MAME release from the MAMEdev website from the section Official Binaries. You should use the 64 bit version (unless you know that your computer is 32 bit only).

Please do not attempt to install an older release, particularly not if its release number is much smaller than the current one. There have been changes in the meantime concerning the ROM formats, and this may make it impossible to run MAME.

Install the files

Run the exe file; this is just a self-extracting archive file. Choose your target directory; for easier configuration, a simple path like C:\prg\mame is recommended. The extracted files will be located in that directory.

Note that MAME does not alter your registry file. This means you can at any time simply remove the MAME installation, install another one in a separate directory, or reinstall it if desired. Uninstallation means that you have to remove that directory.

Configure it once

Open a command shell and type (in black)

C:\Users\Whoever> cd \prg\mame
C:\prg\mame> mame64 -createconfig
C:\prg\mame> exit

This creates a file C:\prg\mame\mame.ini. Open it in some text editor.

In the second section ("CORE SEARCH PATH OPTIONS") you will find a setting rompath. This is relative to your base directory C:\prg\mame; typically, you will find the value roms (i.e. it will be C:\prg\mame\roms). This subdirectory is already created by unpacking the zip file. If you like, you can append ;cartridges or similar in order to separate between modules and system roms. You must make sure that there is a directory C:\prg\mame\cartridges; if needed, create a new folder of that name in your explorer.

Scroll down to "OSD VIDEO OPTION"; change window to 1 to get a windowed output, otherwise it is fullscreen. In the next section "OSD PER-WINDOW VIDEO OPTION" you should set the first resolution property to 640x480 or bigger, as you find suitable.

Note that this configuration is only done once, when you install MAME, as we show it here.

Install system ROMs and cartridges

Go to our WHTech repository and download from the directory /System ROMs/MAME. Unzip its contents into the roms subdir. Do not unzip the zip files inside.

Also from WHTech, download from /Cartridges/MAME. It contains a collection of zip files, each one for a cartridge; do not unpack these cartridge zips.

Store the cartridge zips into the cartridges subdir if you added that location to the rompath, otherwise move all cartridge zip files to the roms subdir, too.

Create a starter batch

Create a small batch file to launch MAME. You may drop that on your desktop. For that, open some text editor and type

cd \prg\mame
mame64 ti99_4a

Save it as ti99.bat to your desktop, or anywhere else as desired.

You can now edit this starter batch or create copies. You can change the system name (e.g. geneve, ti99_8), add cartridges (-cart exbasic) or peripheral devices (-ioport peb -ioport:peb:slot8 hfdc), and add floppy disks (-flop1 mydisk.dsk).

If you prefer the 32 KiB internal 16-bit RAM expansion, you can turn it on in the "System configuration" menu of the on-screen display (OSD). You then have to remove the 32kmem configuration below in all examples, however.

Example 1

Plain console, cassette file inserted

Important: This and the following examples will only work if you actually offer the specified disk or cassette image files at the indicated paths (or in the working directory if no path is specified).

cd \prg\mame
mame64 ti99_4a -cass1 cassette.wav

Example 2

External 32K memory expansion, TI floppy controller, myfloppyimage.dsk inserted in DSK1

cd \prg\mame
mame64 ti99_4a -ioport peb -ioport:peb:slot2 32kmem -ioport:peb:slot8 tifdc -flop1 myfloppyimage.dsk

Example 3

Cartridge Extended Basic, external 32K memory expansion, RS232 card, HFDC controller, one drive, myfloppyimage.dsk inserted

cd \prg\mame
mame64 ti99_4a -cart exbasic -ioport peb -ioport:peb:slot2 32kmem -ioport:peb:slot7 tirs232 -ioport:peb:slot8 hfdc -flop1 myfloppyimage.dsk

Example 4

Cartridge Editor/Assembler, external 32K memory expansion, Speech synthesizer, Horizon RAMDisk, HFDC, hard disk, one floppy image inserted

cd \prg\mame
mame64 ti99_4a -cart editass -ioport peb -ioport:peb:slot2 32kmem -ioport:peb:slot3 spchsyn -ioport:peb:slot4 horizon -ioport:peb:slot8 hfdc -ioport:peb:slot8:hfdc:h1 generic -hard1 myharddisk.hd -flop1 myfloppyimage.dsk

Example 5

P-Code system, external 32K memory expansion, TI floppy controller, one drive, Editor/Filer inserted from folder C:\prg\mame\disks\UCSD

cd \prg\mame
mame64 ti99_4a -ioport peb -ioport:peb:slot2 32kmem -ioport:peb:slot3 pcode -ioport:peb:slot8 tifdc -flop1 disks\UCSD\ucsd_pascal_editor_filer_1.dsk

Note: You must turn on the P-Code card in the DIP switches menu of the On-screen display (OSD). The card is turned off by default because it immediately takes over control on start.

Example 6

Geneve, Horizon RAMDisk, Speech, RS232, HFDC, one hard disk

cd \prg\mame
mame64 geneve -peb:slot4 horizon -peb:slot5 spchsyn -peb:slot6 tirs232 -peb:slot8 hfdc -ioport:peb:slot8:hfdc:h1 generic -hard1 myharddisk.hd


If you do not plan to change your configuration too often, you may want to set it inside MAME using the OSD. You can use the menu selection Slot devices to change the peripheral box contents, for example. Note that this change is only temporary until you leave MAME.

If you want to keep changes after stopping MAME, you must set readconfig and writeconfig to 1 in mame.ini.

When you use this setting, be aware that your command-line arguments may be overridden by what you had set in the OSD menu before you exited MAME the last time.