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
|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.
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...
...and full of problems:
- cpu 16 bits, 3MHz
- separate 16k video ram vidéo
- 16 colors, text mode, low and high resolution graphics
- electronic sprites
- rom expansion (cartridges)
- a real keyboard
- sound 3 channels
- BASIC, Pascal, Logo, Assembler
- two joysticks
- expandable (with the PObox, ram, floppies, RS232, etc...)
- CPU registers are in RAM
- Video RAM is used to store the BASIC program (slow interpretation, reduction of the graphic capabilities to TEXT!)
- expensive ROM modules
- 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:
| ||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: |
Use of CALL MOUNT within a program
- a parallel port Centronics
- a memory expansion 32 Kb
- 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.
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:
I have added a new call:
- u is the unit (1,2 or 3 for DSK1,2 or 3)
- v is the volume number from 1 to your maxi.
CALL LINK("XMOUNT",u,v)whose settings are resistant to the RESET.And this last:
CALL LINK("DSKINF",V())with DIM V(3) minimumThat 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
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 R1,1 UNIT 1-3
PARAM BLWP @NUMREF GET PARAM
BLWP @XMLLNK TO INTEGER
AI R4,16376 VDP ADR
LI R1,2 DISK PARAM
BLWP @NUMREF GET PARAM
BLWP @XMLLNK TO INTEGER
BLWP @VSBW HIGH OF DISK
INC R0 NEXT RAM POS
BLWP @VSBW LOW OF DISK
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:
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!
- DSK1: WORD at 16378
- DSK2: WORD at 16380
- DSK3: WORD at 16382
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...
| ||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 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.
|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: |
It comes with a symbolic assembler (no source saved!) and a graphic example LINES.
- a constant RAM 4Kb expansion
- an interface to the 32Kb not supported by the TI Basic
- an interface to load/run binary programs from the disk units
- an interface with TI Basic with CALL INIT, POKEV, PEEKV, LOAD, PEEK, LINK et CHARPAT to manage memory and binary programs
I replaced the internal 3V battery with two standard external ones. They've been working for years!
Read the tapes!
|Two indispensable cartridges: |
- The Editor/Assembler:
Easy to learn, flexible, no traps.
- a full page editor
- an assembler
- a debugger
- The TI Extended Basic
- sprtites and speech access
- multiple instructions per line, IF..THEN..ELSE
- sub programs with parameters CALL/SUB
- use of the 32Kb RAM expansion where assembly modules can be loaded and executed
|Data on a tape are represented as a periodic sound. |
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:
- Each ZERO is a half period, positive or negative, that lasts T. (figures next)
- Each ONE is a complete period that lasts T. (figure next)
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:
- if greater than 3T/4 it is considered to be a ZERO
- 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.
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!
- 10 control bytes(unknown meaning)
- 64 data bytes
- copy of the 10 control bytes
- copy of the 64 data bytes
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:
- OLD_CS1.PRG, the tape reader
- CASSETTE.TXT how is a TI program encoded on a tape (french)
- CUBERT.CS1 an example of a game I wrote long time ago, saved by this system.
15 décembre 2007