Digital Archaeology: Recovered TI BASIC Programs for the Texas Instruments TI-99/4A Home Computer

Digital Archaeology: Recovered TI BASIC Programs for the Texas Instruments TI-99/4A Home Computer

Digital-Archaeology-Recovered-TI-BASIC-Programs-for-the-Texas-Instruments-TI994A-Home-Computer.jpg

I sometimes wonder if I’m in the process of making a transition from philosopher to classicist, given my interest in Latin and Ancient Roman philosophy, and my increasing interest in archaeology. Today, however, I want to talk about a different kind of archaeology: digital archaeology.

I’ve seen an incredible amount of technical change and progress in my nearly 42 years. When I was a very small child, my dad had an Epson QX-10 computer with CP/M as the operating system, on which I vividly remember playing the classic Colossal Cave Adventure text-based game with my dad. I’m not sure of the timeline, but we also had a Texas Instruments TI-99/4A Home Computer that I became much more familiar with, even writing fairly sophisticated programs in BASIC well before I even got to Kindergarten. And, of course, in the early 1980s, as happened in many a 1980s California classroom, I spent lots of time on Tandy Radio Shack TRS-80 and Apple II computers. Sadly, with such rapid change in computer technology, to say nothing of the changes that occurred with the onset of the internet era in the mid-1990s, it was almost unavoidable that certain pieces of computing history would be lost to time.

Many of us who grew up in the 1980s are nostalgic for the purity of the technology we grew up with, just as we are also nostalgic for the purity of the early internet experience of the 1990s, being both the first generation to grow up with computers in the classroom and in our homes and the first generation to experience the internet as part of our formative teenage/college years. All of this is to say that I’ve hand a longtime side interest in what I’ve termed “digital archaeology,” the attempt to recover lost pieces of computing history that I myself found particularly valuable or about which I’m particularly nostalgic.

Back when I was using the Texas Instruments TI-99/4A Home Computer, my dad and I used to save programs on audio cassette tapes, a common way of saving and retrieving BASIC programs back then. Although many of the program tapes were lost, I still have two of these audio tapes to this day. Although there are various TI-99/4A emulators out there, I haven’t been industrious enough to attempt to load the audio of these two tapes into an emulator to try to relieve the programs, to find out if they contained BASIC programs my dad or I authorized, or if they contained commercial programs that we saved to our own audio tapes.

A few years ago, however, I had the tapes, along with a few other audio cassettes from my childhood that I had saved, digitized for posterity. I posted the audio files from the two tapes of TI BASIC programs to the TI 99ers Facebook group, after which a kind member of the user’s group, Billy Stoughton II, was able to recover some, but not all, of the programs they contained. Needless to say, I was ecstatic at the prospect of recovering such a quirky piece of my childhood as some lost TI BASIC programs hidden for decades on audio tapes stored away for safekeeping. It’s not an overstatement to say that my experience writing and typing in BASIC programs into the TI-99/4A and into the TRS-80 and Apple II computers when I was a little kid primed me for studying, and eventually teaching, formal logic later in life. What would these recovered programs prove to be?

Below I have embedded YouTube videos with the original audio files from the two tapes I had, along with the TI BASIC programs they contained, kindly recovered from the digital ash heap by Billy Stoughton II.

TI-99/4A Program Tapes

Recovered TI BASIC Programs

Program 1: TI Song (Name Unknown)

This program appears to be a musical program, some sort of song written using the TI-99/4A sound capability via CALL SOUND statements in TI BASIC. It’s possible that my dad wrote this program, as he commonly wrote musical programs in TI BASIC. But it’s also possible that this program was written by someone else, possibly in a TI-99/4A magazine and saved by my dad on cassette tape.

10 CALL CLEAR
20 FOR X=1 TO 15
30 READ L,T1,V1,T2,V2,T3,V3
40 CALL SOUND(L,T1,V1,T2,V2,T3,V3)
100 NEXT X
175 CALL SOUND(1000,30000,30)
200 GO TO 1000
500 DATA 370,523,8,311,12,196,12,5,30000,30,30000,30,30000,30,125,494,9,294,13,196,13,370,523,8,311,12,196,12
510 DATA 5,30000,30,30000,30,30000,30,125,415,10,262,14,175,14,370,392,11,294,15,247,15
520 DATA 5,30000,30,30000,30,30000,30,125,349,12,392,16,123,16,370,311,13,415,15,131,15
530 DATA 5,30000,30,30000,30,30000,30,125,349,12,415,16,131,16,1000,392,10,494,14,147,14
540 DATA 1000,494,8,349,12,196,12,2000,523,5,330,10,131,10
1000 FOR Y=1 TO 6
1010 READ A,B,C
1020 CALL SOUND(A,B,C)
1030 NEXT Y
1050 DATA 150,262,12,150,330,10,150,392,8,300,784,6,1,30000,30,100,659,8
1055 CALL SOUND(1000,523,10,659,10,784,5)
1056 CALL SOUND(1000,30000,30)
1057 RESTORE
1060 GO TO 10

Program 2: Outer Spelling

I don’t recall this program, but according to the REM (Remark) statements at the beginning of the program, it is called “Outer Spelling” and was written by Mike Wilcox and Dave Guardanapo for Tronics Sales Corporation in 1982.

100 REM  "OUTER SPELLING" BY MIKE WILCOX AND DAVE GUARDANAPO 07/30/82
105 REM  COPYRIGHT 1982 TRONICS SALES CORPORATION
108 CALL CLEAR
110 CALL SCREEN(16)
120 CALL CHAR(139,"F0F0F0F00F0F0F0F")
130 FOR I=1 TO 32
140 CALL HCHAR(1,I,139)
150 NEXT I
160 FOR I=1 TO 24
170 CALL VCHAR(I,32,139)
180 NEXT I
190 FOR I=32 TO 1 STEP-1
200 CALL HCHAR(24,I,139)
210 NEXT I
220 FOR I=24 TO 1 STEP-1
230 CALL VCHAR(I,1,139)
240 NEXT I
250 READ N
260 FOR I=1 TO N
270 READ R,C,A$
280 FOR L=0 TO LEN(A$)-1
290 CALL HCHAR(R,C+L,ASC(SEG$(A$,L+1,1)))
300 NEXT L
310 NEXT I
320 DATA 5,5,10,TRONICS SALES,7,12,PRESENTS:,11,9,OUTER  SPELLING
330 DATA 22,3,(c) 1982 TRONICS SALES CORP.,18,6,PRESS ANY KEY TO BEGIN
340 DEF XX=INT(14*RND+2)
350 CALL KEY(0,K,S)
360 CALL COLOR(14,XX,1)
370 CALL COLOR(14,1,XX)
380 IF S=0 THEN 350
390 CALL CLEAR
400 CALL CHAR(140,"FF00FF00FF00FF00")
410 CALL CHAR(141,"8000E000F800FE")
420 CALL CHAR(142,"FF003F000F0003")
430 CALL CHAR(143,"FF00F800F000C")
440 CALL SCREEN(5)
450 CALL COLOR(14,16,1)
460 RESTORE 510
470 CALL HCHAR(1,1,140,768)
480 FOR I=1 TO 20
490 READ R,C,CH
500 CALL HCHAR(R,C,CH)
510 NEXT I
520 DATA 5,8,143,6,8,141,3,16,141,4,17,141,5,18,141,4,16,142,5,17,142
530 DATA 6,18,142,4,29,142,5,30,142,4,30,141,5,31,141,11,8,141,12,9,141
540 DATA 11,7,142,12,8,142,11,23,142,12,24,142,11,24,141,12,25,141
550 FOR PR=1 TO 56
560 READ R,C,N
570 CALL VCHAR(R,C,32,N)
580 NEXT PR
590 DATA 3,1,5,4,2,4,4,4,4,3,5,5,4,7,1,6,7,2,3,9,5,3,10,5,4,12,3,3,14,5,5,16,3
600 DATA 3,17,1,6,17,2,3,18,2,7,18,1,3,20,5,4,21,3,4,23,3,3,24,5,4,26,3,4,27,3
610 DATA 3,28,5,5,29,2,6,30,1,4,31,1,3,32,5,10,1,5,10,2,5,10,3,5,10,4,5,10,5,5
620 DATA 10,6,5,12,7,2,13,8,1,11,9,1,10,10,5,11,12,1,13,12,2,10,14,5,10,16,4
630 DATA 10,17,4,10,18,5,11,20,1,13,20,1,11,21,3,10,22,5,12,23,2,13,24,1,11,25,1
640 DATA 10,26,5,10,27,5,10,28,5,10,29,5,10,30,5,10,31,5,10,32,5
650 CALL HCHAR(1,1,32,64)
660 CALL HCHAR(8,1,32,64)
670 FOR I=15 TO 24
680 CALL HCHAR(I,1,32,32)
690 NEXT I
700 FOR I=1 TO 6
710 FOR D=1 TO 50
720 NEXT D
730 CALL COLOR(14,6,1)
740 FOR D=1 TO 50
750 NEXT D
760 CALL COLOR(14,16,1)
770 NEXT I
780 FOR D=1 TO 500
790 NEXT D
800 CALL CLEAR
810 OPTION BASE 1
820 DEF ROW=INT(RND*10)+15
830 DEF COL=INT(RND*32)+1
840 DIM X(30),Q$(30)
850 CALL CLEAR
860 GOSUB 3710
870 CALL SCREEN(16)
880 CALL CLEAR
890 PRINT "SELECT LEVEL OF DIFFICULTY": : : : :"PRESS   FOR": : :
900 PRINT "  1    SLOW": :"  2    MEDIUM": :"  3    FAST": :"  4    BLITZ": : : : :
910 FLAG=0
920 RIGHT=0
930 WRONG=0
940 SCORE=0
950 CALL KEY(0,K,S)
960 IF S=0 THEN 950
970 IF(K<49)+(K>52)THEN 950
980 IF K<>49 THEN 1000
990 A=700
1000 IF K<>50 THEN 1020
1010 A=350
1020 IF K<>51 THEN 1040
1030 A=175
1040 IF K<>52 THEN 1060
1050 A=0
1060 OPT=0
1150 CALL CLEAR
1160 GOSUB 4250
1520 REM  START GAME
1530 IF FLAG<>0 THEN 1650
1540 CALL SCREEN(2)
1550 GOSUB 3140
1560 GOSUB 2560
1570 GOSUB 2850
1580 GOSUB 3000
1590 RESTORE 1600
1600 DATA 3,2,3,SCORE:,4,3,RIGHT:,6,3,WRONG:
1610 GOSUB 3050
1620 RIGHT=0
1630 WRONG=0
1640 CTR=0
1650 IF OPT=1 THEN 1670
1660 WORDS=30
1670 CTR=CTR+1
1680 IF CTR<=WORDS THEN 1770
1690 GOSUB 3930
1700 CALL CLEAR
1710 PRINT TAB(8);"YOU HAVE USED"
1720 PRINT:TAB(8);"ALL THE WORDS!": : :"DO YOU WANT TO PLAY AGAIN?": : : :"  PRESS Y FOR YES": :"  PRESS N FOR NO": : : : :
1730 CALL KEY(3,K,S)
1740 IF S=0 THEN 1730
1750 IF K=89 THEN 870
1760 STOP
1770 IF RIGHT=10 THEN 3440
1780 RANDOMIZE
1790 IF OPT=1 THEN 1880
1800 N=INT(RND*30)+1
1810 IF X(N)=1 THEN 1800
1820 X(N)=1
1830 GOSUB 4510
1840 REM  GET WORD
1850 FOR I=1 TO N
1860 READ WORD$
1870 NEXT I
1880 L=LEN(WORD$)
1890 REM  ASK TO SPELL
1900 FOR I=1 TO L
1910 CALL HCHAR(10,13+I,ASC(SEG$(WORD$,I,1)))
1920 CALL SOUND(-100,I*1000,2)
1930 NEXT I
1940 FOR DELAY=1 TO A
1950 NEXT DELAY
1960 REM
1970 CALL HCHAR(10,14,95,L)
1980 TRY$=""
1990 C=0
2000 CALL KEY(3,K,S)
2010 IF S=0 THEN 2000
2020 IF(K=6)+(K=32)THEN 1900
2030 IF K=7 THEN 1970
2040 IF K=13 THEN 2140
2050 IF(K>64)*(K<91)THEN 2090
2060 CALL SOUND(100,220,0)
2070 CALL SOUND(120,110,0)
2080 GOTO 2000
2090 CALL HCHAR(10,14+C,K)
2100 C=C+1
2110 TRY$=TRY$&CHR$(K)
2120 IF LEN(TRY$)>L THEN 2140
2130 GOTO 2000
2140 IF TRY$<>WORD$ THEN 2220
2150 REM  WORD RIGHT!
2160 GOSUB 3930
2170 RIGHT=RIGHT+1
2180 CALL HCHAR(10,14,32,L)
2190 FLAG=1
2200 GOSUB 3190
2210 ON OPT+1 GOTO 1650,1470
2220 CALL HCHAR(10,14,32,L+1)
2230 CALL HCHAR(10,14,95,L)
2240 C=0
2250 REM  WORD WRONG!
2260 REM  SHOW SPELLING
2270 FOR I=1 TO L
2280 CALL HCHAR(10,14+C,ASC(SEG$(WORD$,I,1)))
2290 CALL SOUND(-100,I*1000,0)
2300 C=C+1
2310 NEXT I
2320 WRONG=WRONG+1
2330 CTR=CTR-1
2340 X(N)=0
2350 GOSUB 3190
2360 FOR D=1 TO 400
2370 NEXT D
2380 CALL HCHAR(10,14,32,8)
2390 FLAG=1
2400 GOTO 1650
2410 DATA CAT,LOCK,KING,DIG,DAY,ONE,TEN,SIX,HOUSE,MILK
2420 DATA FIVE,HOME,TREE,DESK,WELL,TELL,TALK,ZOO,WATER,BOOK
2430 DATA APPLE,BANANA,EASY,SILVER,IDEA,JACKET,KETTLE,LIFE,SCHOOL,NOON
2440 DATA OCTOBER,PHRASE,QUIT,UMBRELLA,VALUE,WILD,YAWN,ZINC,ALTHOUGH,BEFORE
2450 DATA SEVEN,TWENTY,HUNDRED,NINE,BOTTLE,BUTTON,WHISTLE,JOKE,VALENTINE,QUEST
2460 DATA QUILT,FOLLOW,SECOND,AGENT,SETTLE,COMPUTER,TELEPHONE,MUSIC,BESIDE,RADIO
2470 DATA PROJECT,FILTER,DRIVE,GHOST,HOSTESS,WAITER,POUND,LOUD,DELIVER,YELLOW
2480 DATA CALF,POST,MONEY,FORTY,INQUIRE,SPEECH,RANDOM,PENNY,MEASURE,DIVIDE
2490 DATA MODULE,HUMBLE,FORMULA,BEAUTY,DRAFT,PROCESS,SURGERY,INVOLVE,BELONG,HUGE
2500 DATA JOINT,KNOCK,LEAF,MANUAL,OBSERVE,PERMIT,SALUTE,TACKLE,RECORD,UTENSIL
2510 DATA LAUGH,ALMOND,BLIMP,CENSOR,FORGET,LENS,MONOPOLY,RANSOM,EITHER,MELON
2520 DATA GROW,GOVERN,GOSSIP,IMAGINE,PLUMBER,SHATTER,GREY,COURAGE,COUNTRY,GYM
2530 DATA COUPON,MARCH,PARROT,TEACH,SAILOR,BUTTER,LESSON,OCTAVE,REQUEST,SWALLOW
2540 DATA VISION,TEMPLE,TRAGEDY,VOWEL,WOLF,YOUNG,EXIT,GOLF,KNUCKLE,BUDGET
2550 DATA NATION,COUNTRY,FENCE,MILITARY,FOREST,EMPLOY,SERVE,HOSPITAL,WHEEL,GRAPH
2560 REM  DRAW FENCE
2570 CALL COLOR(9,11,2)
2580 CALL CHAR(96,"FFFFFFFFFFFFFFFF")
2590 CALL CHAR(97,"0103070F1F3F7FFF")
2600 CALL CHAR(98,"80C0E0F0F8FCFEFF")
2610 CALL CHAR(99,"FEFEFEFEFEFEFEFE")
2620 CALL CHAR(100,"E7C3818181C3E7FF")
2630 FOR I=14 TO 24
2640 CALL HCHAR(I,1,96,32)
2650 NEXT I
2660 FOR I=1 TO 32 STEP 4
2670 CALL HCHAR(14,I,97)
2680 CALL HCHAR(14,I+1,96,2)
2690 CALL HCHAR(14,I+3,98)
2700 IF I=1 THEN 2720
2710 CALL VCHAR(15,I-1,99,10)
2720 NEXT I
2730 RANDOMIZE
2740 FOR G=1 TO 100
2750 RANDOMIZE
2760 CALL HCHAR(ROW,COL,99)
2770 NEXT G
2780 FOR N=1 TO 5
2790 RANDOMIZE
2800 CALL HCHAR(ROW,COL,100)
2810 CALL SOUND(-100,ROW*110,3)
2820 CALL SOUND(-100,COL*110,3)
2830 NEXT N
2840 RETURN
2850 RETURN
2860 RETURN
2870 RETURN
2880 RETURN
2890 CALL CHAR(106,"7F7F3F1F0F070300")
2900 CALL CHAR(107,"FEFEFCF8F0E0C000")
2910 CALL CHAR(108,"FFFFFFFFFFFFFFFF")
2920 CALL HCHAR(3,27,104)
2930 CALL HCHAR(3,28,108)
2940 CALL HCHAR(3,29,105)
2950 CALL HCHAR(4,27,108,3)
2960 CALL HCHAR(5,27,106)
2970 CALL HCHAR(5,28,108)
2980 CALL HCHAR(5,29,107)
2990 RETURN
3000 REM  SCORE CARD
3010 FOR R=1 TO 7
3020 CALL HCHAR(R,2,108,11)
3030 NEXT R
3040 RETURN
3050 REM  PRINT DATA STATEMENT
3060 READ N
3070 FOR I=1 TO N
3080 READ R,C,M$
3090 FOR L=0 TO LEN(M$)-1
3100 CALL HCHAR(R,C+L,ASC(SEG$(M$,L+1,1)))
3110 NEXT L
3120 NEXT I
3130 RETURN
3140 REM   RE-DEF PRINT COLOR 
3150 FOR I=2 TO 8
3160 CALL COLOR(I,5,16)
3170 NEXT I
3180 RETURN
3190 REM  SCORE DISPLAY 
3200 SCORE=(RIGHT/(RIGHT+WRONG))*100
3210 R$=STR$(RIGHT)
3220 Z=LEN(R$)
3230 IF Z<4 THEN 3250
3240 Z=3
3250 FOR I=1 TO Z
3260 CALL HCHAR(4,9+I,ASC(SEG$(R$,I,1)))
3270 NEXT I
3280 W$=STR$(WRONG)
3290 Z=LEN(W$)
3300 IF Z<4 THEN 3320
3310 Z=3
3320 FOR I=1 TO Z
3330 CALL HCHAR(6,9+I,ASC(SEG$(W$,I,1)))
3340 NEXT I
3350 S$=STR$(SCORE)
3360 Z=LEN(S$)
3370 IF Z<=3 THEN 3390
3380 Z=3
3390 FOR I=1 TO Z
3400 CALL HCHAR(2,11,108)
3410 CALL HCHAR(2,8+I,ASC(SEG$(S$,I,1)))
3420 NEXT I
3430 RETURN
3440 REM  REPLAY OPTION      
3450 CTR=CTR-1
3460 CALL HCHAR(10,14,32,8)
3470 RESTORE 3480
3480 DATA 3,9,2,PRESS S FOR THE SAME LEVEL,11,4,PRESS N FOR A NEW LEVEL,13,6,PRESS Q TO QUIT
3490 GOSUB 3050
3500 CALL KEY(0,K,S)
3510 IF S=0 THEN 3500
3520 IF K=83 THEN 3570
3530 IF K=78 THEN 870
3540 IF K<>81 THEN 3500
3550 CALL CLEAR
3560 STOP
3570 RIGHT=0
3580 WRONG=0
3590 SCORE=0
3600 CALL SCREEN(2)
3610 GOSUB 2560
3620 GOSUB 2850
3630 GOSUB 3000
3640 RESTORE 1600
3650 GOSUB 3050
3660 CALL HCHAR(9,1,32,160)
3670 GOTO 1650
3680 REM  MUSIC DATA 
3690 DATA 262,262,392,392,440,440,392,392,349,392,440,349,330,349,392,330
3700 DATA 294,330,349,247,262,262
3710 REM  CREATURE DEFINITION     
3720 A1$="3C5A7E663C428142"
3730 A2$="003C5A7E663C2418"
3740 B1$="66427EDB7E3C2466"
3750 B2$="C3427EDB7E3C24E7"
3760 C1$="183C7EDBFF244281"
3770 C2$="183C7EFFFF3C2466"
3780 D1$="3CFFDBFF18244281"
3790 D2$="3CFFDBFF18242466"
3800 E1$="243C2CFFB5BD2466"
3810 E2$="24BDB5FF2C3C2466"
3820 CALL COLOR(12,7,11)
3830 CALL CHAR(120,A1$)
3840 CALL COLOR(13,5,11)
3850 CALL CHAR(128,B1$)
3860 CALL COLOR(14,13,11)
3870 CALL CHAR(136,C1$)
3880 CALL COLOR(15,14,11)
3890 CALL CHAR(144,D1$)
3900 CALL COLOR(16,2,11)
3910 CALL CHAR(152,E1$)
3920 RETURN
3930 REM  MONSTER PLACEMENT & DANCE 
3940 GOSUB 4060
3950 REM  MONSTER
3960 CALL HCHAR(ROW,COL,CH)
3970 RESTORE 3680
3980 FOR I=1 TO 11
3990 READ S1,S2
4000 CALL SOUND(235,S1,3)
4010 CALL CHAR(CH,F2$)
4020 CALL SOUND(235,S2,3)
4030 CALL CHAR(CH,F1$)
4040 NEXT I
4050 RETURN
4060 REM  MONSTER SELECTION 
4070 FORM=INT(RND*5)+1
4080 CH=112+(FORM*8)
4090 ON FORM GOTO 4100,4130,4160,4190,4220
4100 F1$=A1$
4110 F2$=A2$
4120 RETURN
4130 F1$=B1$
4140 F2$=B2$
4150 RETURN
4160 F1$=C1$
4170 F2$=C2$
4180 RETURN
4190 F1$=D1$
4200 F2$=D2$
4210 RETURN
4220 F1$=E1$
4230 F2$=E2$
4240 RETURN
4250 REM  SELECT LEVEL 
4260 CALL CLEAR
4270 FOR I=1 TO 30
4280 X(I)=0
4290 NEXT I
4300 PRINT "PRESS    FOR": : :"  1    FIRST GRADE": :
4310 PRINT "  2    FIRST/SECOND GRADE": :"  3    SECOND/THIRD GRADE": :"  4    FOURTH/FIFTH GRADE": :"  5    FIFTH/SIXTH GRADE": : : :
4320 PRINT: :
4330 CALL KEY(0,K,S)
4340 IF S=0 THEN 4330
4350 IF(K<49)+(K>53)THEN 4330
4360 CALL CLEAR
4370 IF K<>49 THEN 4400
4380 LEV=1520
4390 RETURN
4400 IF K<>50 THEN 4430
4410 LEV=1550
4420 RETURN
4430 IF K<>51 THEN 4460
4440 LEV=1580
4450 RETURN
4460 IF K<>52 THEN 4490
4470 LEV=1610
4480 RETURN
4490 LEV=1640
4500 RETURN
4510 REM  RESTORE TO READ 
4520 IF LEV>1520 THEN 4550
4530 RESTORE 2410
4540 RETURN
4550 IF LEV>1550 THEN 4580
4560 RESTORE 2440
4570 RETURN
4580 IF LEV>1580 THEN 4610
4590 RESTORE 2470
4600 RETURN
4610 IF LEV>1610 THEN 4640
4620 RESTORE 2500
4630 RETURN
4640 RESTORE 2530
4650 RETURN

Online Resources

If you made it all the way through the very long Outer Spelling TI BASIC program above and are hungry for even more information, here are a few online resources on the Texas Instruments TI-99/4A Home Computer and TI BASIC:

TI-99/4A TI BASIC and TI Extended BASIC

TI-99/4A Emulators

TI-99/4A Books and Magazines

TI-99/4A Users Groups

TI-99/4A General Information and Websites

TI-99/4A Videos:

Thoreau on the Pyramids: For Whom Are You Working?

Thoreau on the Pyramids: For Whom Are You Working?

Marcus Aurelius: Don't Be Too Bookish

Marcus Aurelius: Don't Be Too Bookish