TMS9900 Assembly Programming for the
TI-99/4A
The TI-99 was pretty much the only
computer to use the TMS9900, just like the Cpu itself, the TI-99
wasn't designed like most computers - with almost all it's ram as
VRAM - it actually uses VRAM to store basic programs (which is not
as fast as 'proper' memory!!)
Specs:
|
TI-99 4A |
| Cpu |
3mhz TMS9900 |
| Ram |
256 bytes! (32k ram upgrade option) |
| Vram |
16k |
| GPU |
TMS9918A |
| Resolution |
160x144 |
| Max Tiles |
256 (8x8 px) - 360 onscreen |
| Max Sprites |
40 (8x8 px 10 per line) |
| Colors |
4 |
| Sound chip |
TMS9919 |
|

|
ChibiAkumas Tutorials
Lesson H1 -
Hello World on the TI-99
Lesson P1 -
Bitmap graphics on the TI-99
Lesson
P2 - Joystick and Key Reading on the TI-99 with the CRU
Lesson
P3- Sound with the TMS9919 on the TI-99
Useful Documents
1602000-9701_TM990_100M_Users_Guide_Dec78
- See Page 4-01 onward
TI Memory Map
| Address |
Details |
| >0000 |
Console / ROM / OS / GPL Interpreter / BASIC
Interpreter |
| >2000 |
�Low� Ram Expansion (8k of 32k) |
| >4000 |
Device Service Routines |
| >7000 |
Cartridge ROM / Page Flip |
| >8000 |
RAM Memory Mapped Devices - VDP,GROM, SOUND, SPEECH. |
| >8000 |
CPU Memory 256 byte block |
| >8400 |
Sound Chip |
| >8800 |
VDP Data Read |
| >8802 |
VDP Status Read |
| >8C00 |
VDP DATA Write |
| >8C02 |
VDP Address Write |
| >9000 |
Speech Read |
| >9400 |
Speech Write |
| >9800 |
GROM Data Read |
| >9802 |
GROM Address Read |
| >9C00 |
GROM Data Write |
| >9C02 |
GROM Address Write |
| >A000 |
High Ram Expansion (24k of 32k) |
TI VDP Memory Map
Address
|
Details |
| >0000 |
Screen Image |
| >0300 |
Sprite Attrib |
| >0380 |
Color Table |
| >0400 |
Sprite Descriptor |
| >0780 |
Sprite Motion |
| >0800 |
Pattern Generator |
| >1000 |
Free Space |
| >3500 |
Disk DSRs |
TI Default Charset
The Character set has no lowercase characters.
TI Key Map
To select a column of the Keymap we use CRU
Address 0024h, we can then read in from the address 0006h
We can read a whole column into R4 with ST
R4,8
We can test a single bit with TB n - where n
is the bit (offset from 0006h) to test
| CRU Address |
Col 0 |
Col 1 |
Col 2 |
Col 3 |
Col 4 |
Col 5 |
Col 6 |
Col 7 |
| 0006h |
= |
. |
, |
M |
N |
/ |
J1-Fire |
J2-Fire |
| 0008h |
space |
L |
K |
J |
H |
; |
J1-Right |
J2-Right |
| 000Ah |
enter |
O |
I |
U |
Y |
P |
J1-Left |
J2-Left |
| 000Ch |
|
9 |
8 |
7 |
6 |
0 |
J1-Down |
J2-Down |
| 000Eh |
fctn |
2 |
3 |
4 |
5 |
1 |
J1-Up |
J2-Up |
| 0010h |
shift |
S |
D |
F |
G |
A |
|
|
| 0012h |
ctrl |
W |
E |
R |
T |
Q |
|
|
| 0014h |
|
X |
C |
V |
B |
Z |
|
|
Sound on the TI99
The TMS9919 uses memory mapped port 8400h for its sound control... This
port takes a single byte of data - except for tones which take 2 bytes
The data we send is in the format below:
|
|
Bits |
| Command |
Bit
Details |
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
| Format Template |
L=Latch C=Channel T=Type XXXX=Data |
L |
C |
C |
T |
D |
D |
D |
D |
|
|
|
|
|
|
|
|
|
|
| Tone - Command 1/2 |
C=Channel L=tone Low data |
1 |
C |
C |
0 |
L |
L |
L |
L |
| Tone - Command 2/2 |
H= High tone data (Higher numbers = lower tone) |
0 |
- |
H |
H |
H |
H |
H |
H |
| Volume |
C=Channel (0-2) V=Volume (15=silent 0=max) |
1 |
C |
C |
1 |
V |
V |
V |
V |
| Noise Channel |
(Channel 3) M=Noise mode (1=white) R=Rate (3=use tone
2) |
1 |
1 |
1 |
0 |
- |
M |
R |
R |
|