Texas Instruments TI 99/4A

Version Française
WikipédiA



My first computer, bought in 1983.

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

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:
CALL INIT
CALL LOAD("DSK1.MOUNTOBJ")
CALL LINK("MOUNT",u,v)
  • 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:
CALL LINK("XMOUNT",u,v)
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)

* MONTAGE D'UN VOLUME CF7
* DANS UNE UNITE DSKn
*
* APPEL EN BASIC ETENDU
* CALL LINK("MOUNT",N,V)
* N=1,2 OU 3 POUR DSKN
* V=VOLUME DE 1 A MAX
 
       DEF  MOUNT
 
VSBW   EQU  >2020
XMLLNK EQU  >2018
NUMREF EQU  >200C
FAC    EQU  >834A
STATUS EQU  >837C
 
MYREG  BSS  32
GPL    DATA >0020
 
MOUNT
       LWPI MYREG
       LI   R0,0
       LI   R1,1         UNIT 1-3 PARAM
       BLWP @NUMREF      GET PARAM
       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
 
       END
Some details:

I had to disassemble a TI program to write this one correctly because parameter passing was wrong and 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 the GPLWS 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 set the volumes 30 and 31 to program in Assembler and to display "Reboot with E/A cartridge", but the volumes 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 their power 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...
THE SOLUTION!

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 IDE ribbon. 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.

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 Upgrade that 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!

Programmation

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 time between 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 ONE and 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