Texas Instruments TI 99/4A

Version Française

My first computer, bought in 1983.

Go to My Little Compiler (speed up your XB programs!)


Thanks to Pascal-J for scanning
and sharing his work.
Thanks to the authors who remain
the owners of their books..
Ask for an access to my Cloud to get
those manuals.

TI/99 Owners's Manual french. 50 programmes (finance, games, maths...) in TI-Basic (3 programs in XB). French. 99'Magazine, n°3, december 1983, french. Technical book, part 1, english. Technical book, part 2, english. Technical book, console and peripherials, english.
What's in the box? What I own Read the tapes!

My very first "desktop" computer. In spite of its numerous defects I can see today, I still look at it with nostalgia.A strange machine, intolerant with the syntax, so slow that you had to optimize your BASIC code. I remerber changing the "/4" with "*.25", some "VAR=10" with "V=10" and lowering the line numbers to increase the speed and free some bytes.Most of all, this true 16 bits had no integer variables in its BASIC! A shame...However...

A computer full of qualities...
  1. cpu 16 bits, 3MHz
  2. separate 16k video ram vidéo
  3. 16 colors, text mode, low and high resolution graphics
  4. electronic sprites
  5. rom expansion (cartridges)
  6. a real keyboard
  7. sound 3 channels
  8. BASIC, Pascal, Logo, Assembler
  9. two joysticks
  10. expandable (with the PObox, ram, floppies, RS232, etc...)
...and full of problems:
  1. CPU registers are in RAM
  2. Video RAM is used to store the BASIC program (slow interpretation, reduction of the graphic capabilities to TEXT!)
  3. expensive ROM modules
  4. more than expensive peripherial expansions
On one hand, this makes the TI Basic the slowest programming language I've ever used.With the TI Extended Basic, things were a bit better: multiple instructions per line, enhanced instruction set.Well, the TMS9900 assembler is, on the other hand, fast, complete, easy to learn, cool adressing modes, general registers (not dedicated to one particular task).How I regret not to have been able to afford the peripherials that could ease my work! Always saving on tape, ASM programming with the little "Mini memory"...

What I own:

My extensions

The TI Speech Synthesizer gives a voice to your computer through CALL SAY in TI Extended Basic for example.Other cartridges can access speech: the Assembler or games such as PARSEC.

Chained to it, there is the CF7+ card, more details below.

The CF7+ card

The wonder extension that brings you three upgrades:
  1. a parallel port Centronics
  2. a memory expansion 32 Kb
  3. a Compact Flash reader that emulates three disk units DSK1, DSK2 and DSK3 taken from a large collection of disk images(according to the CF capacity) with subprograms CALL MOUNT/UNMOUNT and CALL FORMAT.
Use of CALL MOUNT within a program

CALL MOUNT command, the one that allows you to set the volume inserted in a disk unit, can't be used from inside a program,Software that need volume swapping can't work unless you use a STOP/CONT combination with the user's intervention to write the command.

I wrote a little tool, MOUNTOBJ, to select the volume you need when running in Extended Basic. Here's how it works:
  • u is the unit (1,2 or 3 for DSK1,2 or 3)
  • v is the volume number from 1 to your maxi.
I have added a new call:
whose settings are resistant to the RESET.And this last:
CALL LINK("DSKINF",V())with DIM V(3) minimum
That returns into V(1), V(2) and V(3) the volumes numbers mounted in each unit.

Download here the image CF7XMOUNT.DSK containing:
  • the object code MOUNTOBJ
  • the assembly source MOUNT
  • a help file with more comments on the source code XMOUNT.TXT

MOUNT Source code
(No detail here on the XMOUNT routine, too long! You can get it in the ZIP above)

* N=1,2 OU 3 POUR DSKN
        DEF  MOUNT
        VSBW EQU  >2020
        XMLLNK EQU  >2018
        NUMREF EQU  >200C
        FAC    EQU  >834A
        STATUS EQU  >837C 
        MYREG  BSS  32
GPL     DATA >0020
        LI   R0,0
        LI   R1,1         UNIT 1-3
        BLWP @XMLLNK      TO INTEGER       
        DATA >12B8       
        MOV  @FAC,R4       
        A    R4,R4       
        AI   R4,16376     VDP ADR        
        LI   R0,0       
        LI   R1,2         DISK PARAM       
        BLWP @NUMREF      GET PARAM       
        BLWP @XMLLNK      TO INTEGER       
        DATA >12B8       
        MOV  @FAC,R1        
        MOV  R4,R0       
        BLWP @VSBW        HIGH OF DISK       
        INC  R0           NEXT RAM POS       
        SWPB R1       
        BLWP @VSBW        LOW OF DISK        
        SZCB @GPL+1,@STATUS       
        LWPI >83E0       
        B    @>0070        
Some details:

I had to disassemble a TI program to write this one correctly because parameter passing was wrongand no correct return to XB was performed.
Disassembling "SPEAK" routine from the TI Speech disk, I found that:
  • To convert a float to integer, DATA >1200 did not work but DATA >12B8 did.
  • Returning with B *R11 (with the adresse saved before!) did not work either, but setting myself theGPLWS with LWPI and branching to >0070 did.
  • Clearing the GPL Status byte seems to be incorrect, but using a mask with >20 works.

What the program does:

It just writes the volume number at specific VDP RAM locations:
  • DSK1: WORD at 16378
  • DSK2: WORD at 16380
  • DSK3: WORD at 16382
The problem is that this doesn't resist to a RESET. For example in my MENU program I want to setthe volumes 30 and 31 to program in Assembler and to display "Reboot with E/A cartridge", but thevolumes settings will be lost!
That's fixed now with the XMOUNT routine.

Problems between TI Speech and CF7+

The TI Speech blocks the power pins +/-5V present on the exapansion slot. This way, the other expansions can't take theirpower from the console. I wired those two pins from input to output on the TI Speech board to allow the CF7+ to work.Be careful when soldering the wires on the OUT connector as this last will be inserted in the CF7: the wires must not be close to the border of the card.

I didn't solve every compatibility problem with this manipulation, if someone can help...

I finally found the solution! The Speech module had to be placed after the CF7. But this last has no second connector, so I had to solder wires directly to the CF7, I used a flat IDEribbon. I made a "male" connector to plug into the Speech module from an old ISA graphic card that I cut.

You just have to solder 17 contacts to make the module work. To know wich ones, just visit the TI-99 Upgrade excellent page.

The TI accesses totally to the CF7: before this change, only SAVE/OLD from BASIC were stable, but loading binaries (as the Editor or Assembler) would hang the system. Now it's fixed.

The F18A

It's an enhanced version of the graphic chip TMS9918 that brings:
  • a VGA output to use modern and stable monitor
  • Extra 2KB VDP RAM
  • A random number generator
  • A clock
  • A better sprite managment (32 per line for example)
  • A graphic overlay with high definition and 4 colors
  • A second processor embedded that can work directly on the VDP RAM

On the righ, first run of the TI-99/4A with the new F18A, test with Pole Position and a 17 inches screen.

Please, don't tell me about the dust that covers both screen and computer...

Matthew's site, the maker of the F18A, it's HERE

MLC compiler it supports these new features since its version 1.30
with a set of instructions to manage:

A second processor TMS9900 working in parallel on the VDP RAM A graphic overlay (BML) with 4 colors in high resolution A timer with a 10ns precision, at last a clock in the TI 99!

Just remove the old TMS9918 from its socket
(pin 1 up on the image)
And replace it with the F18A
(VGA connector to the left of the image)

No sound with VGA!

So you have to connect pins 5 and 6 from the A/V connector and solder them to an external amplified speaker.

The whole system rebuilt with sound, VGA, Speech and CF7+

Console Speed Up +20%

The TI 99/4A can be overclocked. Its 12 MHz quartz can be replaced with a 14,32 MHz one without any unstability.The resulting frequency is close to 3,6 MHz. I followed the instructions given at TI-99 Upgradethat offers very clear and professional upgrades that you can make on your own.

Assembler with the MiniMemory

The Assembler became accessible with the Minimemory that is:
  1. a constant RAM 4Kb expansion
  2. an interface to the 32Kb not supported by the TI Basic
  3. an interface to load/run binary programs from the disk units
  4. an interface with TI Basic with CALL INIT, POKEV, PEEKV, LOAD, PEEK, LINK et CHARPAT to manage memory and binary programs
It comes with a symbolic assembler (no source saved!) and a graphic example LINES.

I replaced the internal 3V battery with two standard external ones. They've been working for years!


Two indispensable cartridges:
  1. The Editor/Assembler:
    1. a full page editor
    2. an assembler
    3. a debugger
    Easy to learn, flexible, no traps.
  2. The TI Extended Basic
    1. sprtites and speech access
    2. multiple instructions per line, IF..THEN..ELSE
    3. sub programs with parameters CALL/SUB
    4. use of the 32Kb RAM expansion where assembly modules can be loaded and executed
Read the tapes!

Data on a tape are represented as a periodic sound.
  1. Each ZERO is a half period, positive or negative, that lasts T. (figures next)
  2. Each ONE is a complete period that lasts T. (figure next)
The long starting "bip" is a serie of zeros that calibrates the reader with the mean timebetween two sign changes to estimate T.Then the reader gets the duration between two sign changes and:
  1. if greater than 3T/4 it is considered to be a ZERO
  2. if less than 3T/4 it's considered to be the first part of a ONEand the reader should verify that there is another sign change before 3T/4.
To start the data the TI uses a special byte %b11111111 equals to 255 (or -1 if signed).Next byte is the number of blocks in this record.Each block contains 74 bytes twice:
  1. 10 control bytes(unknown meaning)
  2. 64 data bytes
  3. copy of the 10 control bytes
  4. copy of the 64 data bytes
The doubling of data is a system to check the validity of the record. If it could be disabled, transfers would be twice as fast!

To rebuild the program, just put together the 64 data bytes blocks skipping the 10 control bytes and the doubles.We can estimate the length of the largest BASIC program to be saved in this format:
255 (max number of blocks) times 64 = 16320 bytes.

Application on Atari

I wrote a little tool for Atari TT + ST Replay 16 to re-read the TI-99 tapes.With it, it's possible to keep a copy of my programs on Atari, to print them even if I have no floppy, nor printer on the TI.

Download this archive that contains:
  1. OLD_CS1.PRG, the tape reader
  2. CASSETTE.TXT how is a TI program encoded on a tape (french)
  3. CUBERT.CS1 an example of a game I wrote long time ago, saved by this system.

15 décembre 2007