TI BASIC is an ANSI-compliant interpreter for the BASIC language built into the 1979 Texas Instruments TI-99/4 home computer and its 1981 successor, the TI-99/4A. Unlike many BASICs based on Microsoft BASIC, TI BASIC was developed in-house following the emerging Minimal BASIC standard set by ANSI and ECMA, itself derived from Dartmouth BASIC. While lacking some features common in other versions, TI later introduced the TI Extended BASIC cartridge, adding support for graphics such as sprites, sound, and file operations including recording to tape. Despite its slow performance, TI BASIC was also used as a simple operating system on the TI-99 platform.
Performance
The TI-99 was based on the TMS9900 microprocessor, a 16-bit design that was originally built to provide a single-chip central processing unit (CPU) in low-end models of their TI-990 minicomputer lineup. The TMS9900 was also suitable for use in a microcomputer, but at that time the rest of the support chips required to build a complete computer were invariably 8-bit, and this included TI's wide catalog of such chips. In a minicomputer, 16-bit support systems were built up of many individual chips, but this was not suitable for a low-cost product. TI thus adopted the solution of making the machine mostly 8-bit and connecting the various support chips to this 8-bit bus, with the TMS9900 reading the bus twice to produce a 16-bit value.1
The TMS9900's instruction set architecture was based on 16-bit opcodes, meaning that programs would generally be twice as large as they would be on an 8-bit machine. In the era of expensive memory, this presented a significant cost. To address this, TI created an 8-bit virtual machine with its own language or intermediate representation known as the "Graphic Programming Language", or GPL, that allowed programs to be written in a more compact format. The downside to this approach is that every GPL instruction had to be converted on the fly into one or more underlying TMS9900 instructions.2 The GPL code itself was stored on the 8-bit side of the machine, further slowing its performance.3
For all of these reasons, the machine ran far slower than it was theoretically capable of. This was particularly noticeable in BASIC. Every instruction in the user's program had to be read from 8-bit memory, interpreted using code written in GPL, and then output back over the 8-bit bus again. As a result, TI BASIC had poor performance; on common benchmarks of the era, the TI-99 generally ran half as fast as 8-bit machines like the Commodore PET or Apple II.4 For instance, running the Byte Sieve in BASIC took 3960 seconds in TI BASIC, while the same test in Applesoft BASIC on the Apple II, ostensibly a much slower machine, took 2806 seconds, about 30% faster that the TI.5
Elements of TI BASIC
Editing and running
Unlike most BASICs of the era, TI BASIC did not provide a full-screen editor. Instead, a line editor was provided, which allowed the user to add or edit one line at a time. Explicit line numbers were used to order each statement. It used a > prompt to indicate the current new line in immediate mode, as opposed to the more common READY.6 Line numbers ranged from 1 to 32767, inclusive, and entering a line outside that range resulted in the "BAD LINE NUMBER" error.7 Line entry was aided by the NUMBER command, available only in immediate mode, which entered ascending line numbers,8 and RESEQUENCE, which renumbered an existing program.9
TI BASIC also included a number of debugging commands. BREAK worked something like STOP, stopping execution on certain lines. Unlike STOP, the exit to immediate mode did not occur on the line where BREAK appeared, but on the lines BREAK referred to. For instance, BREAK 130 would cause the program to exit to immediate mode whenever it moved to line 130. This could be used, for example, by inserting a single BREAK at the top of the program to control execution, rather than having to insert a STOP in the middle of the code. UNBREAK turned off existing breakpoints.10 Additionally, TRACE printed out the line number of the currently executing line in angle-brackets: <100><110> etc, and UNTRACE turned it off.11
Statements
The ANSI-compatible statements of TI BASIC are DATA, DEF, DIM, END, FOR..TO..STEP..NEXT, GOSUB, GOTO, IF..THEN..ELSE, INPUT, LET, NEXT, ON..GOSUB, ON..GOTO, OPTION BASE, PRINT, RANDOMIZE, READ, REM, RESTORE, RETURN, STOP. Most of these operate in the same fashion as their MS counterparts with two additions; RANDOMIZE restarts the random number generator at a given "seed" value, and OPTION BASE sets the first entry in arrays to either 0 or 1, whereas MS is always zero-based. To this standard set it added CALL, CLOSE, DISPLAY and OPEN.12
In keeping with the Minimal BASIC standard,13 IF statements could only perform branches, they could not perform arbitrary statements as was common in almost every other BASIC of the era. For instance, code such as:
100 IF X>5 THEN PRINT "IT IS LARGE"is not valid in TI BASIC. Instead, this would have to be performed using multiple lines:
100 IF X<=5 THEN 300 200 PRINT "IT IS LARGE"This can easily lead to off-by-one errors if the conversion is not careful about changing the sense of the boolean comparison. TI BASIC did, however, support the ELSE clause:14
100 IF X>5 THEN 200 ELSE 300The PRINT statement used colons to separate items on different lines, in addition to the more common comma or semicolon. This precluded its use as a statement separator, a concept that TI BASIC did not have.15 This means a line can have only a single statement. Due to the way BASIC interpreters work, GOTO-based loops can be sped up significantly by combining code onto a single line, which reduces the number of lines in the program and the corresponding amount of time needed to find a particular line number. This seemingly minor missing feature may result in much slower code, and adding this feature was part of TI Extended BASIC.
Extensions to the Minimal BASIC system were often not represented directly in BASIC, but were instead accessed via the CALL command and a series of named GPL-based subroutines. For instance, CALL CLEAR clears the screen, and CALL KEY returns the keycode of the currently pressed key on the keyboard. The language lacked PEEK and POKE so there was no official way16 to create new CALLable code within BASIC, to do this one would require the TI Editor/Assembler, the TI Mini Memory cartridge which included a small assembler,17 or by using Extended BASIC.
Functions
Unlike Microsoft BASICs, which used LEFT$, MID$, RIGHT$, and INSTR for manipulating strings, TI BASIC used the ANSI-compliant SEG$ and POS.
ABS Absolute value ASC ASCII numeric value of the first character of a string ATN Arctangent CHR$ Convert a number into a string with an ASCII character COS Cosine EOF Test whether the end of a file has been reached EXP Exponentiation INT greatest integer less than or equal to the parameter LEN Length of a string LOG Natural logarithm POS First occurrence of a string in another string RND Pseudorandom number generator SEG$ Return a substring of a string SGN Sign function SIN Sine SQR Square root STR$ Convert a number to a string TAN Tangent VAL Convert a string to a numberSubprograms
Subprograms are called with CALL statement (e.g. CALL CLEAR).
- CHAR Definition of graphical characters
- CLEAR Clears the screen
- COLOR Defines foreground- and background color for 8 characters
- GCHAR Reads one character at a specified position from the screen
- HCHAR Writes a character to a screen position and repeats it horizontally
- JOYST Returns the position of the joystick
- KEY Reads from the keyboard without echo on the screen
- SCREEN Changes the color of the screen
- SOUND Creates sounds (using a frequency) and noise
- VCHAR Writes a character to a screen position and repeats it vertically
Extended BASIC
TI BASIC was located in the system's internal ROMs. In 1981, TI released a plug-in ROM cartridge that added additional functions to the existing code, improving the language in a number of ways.18 Known as Extended BASIC, it was a highly anticipated addition to the platform.19
Among the changes was the addition of the ability to have multiple statements on a line. Using multiple statements may improve performance; loops that are implemented in a single line run much faster. Additionally, statements could now span several lines. As the underlying dialect already used the colon for string separators, Extended BASIC used the double-colon for this purpose. Confusingly, as a statement with two colons was also possible in TI BASIC, for instance, PRINT "A"::"B", which would output "A", a blank line and then "B", so these statements required a space to be added in Extended BASIC, PRINT "A": :"B".20
Another overdue addition was that IF statements could now perform arbitrary statements, rather than only a GOTO. In Extended BASIC one could write a simple statement like IF X>10 THEN X=X-1. This also worked in the ELSE clause, allowing statements like IF A=4 AND B=6 THEN R=10 ELSE PRINT "OOPS".21
Other additions include a small selection of new statements, including ACCEPT, IMAGE, LINPUT, ON BREAK, ON ERROR, ON WARNING, SUB, SUBEND and SUBEXIT. The last three statements are used for structured programming, allowing the creation of named subroutines. Extended BASIC also included a number of new functions and especially CALLable routines. Among the latter was a library of sprite commands, including ones that created motion that continued automatically.22
Speech synthesis
When equipped with the TI Speech Synthesizer, TI Extended BASIC users could also generate speech from a predefined vocabulary as easily as writing text on-screen. For example, the following line of text would cause the speech synthesizer to identify the computer:23
CALL SAY("HELLO I AM A #TEXAS INSTRUMENTS# T I NINETY NINE FOUR A HOME COMPUTER")Multi-word phrases are delimited with the # symbol, as #TEXAS INSTRUMENTS# in this example. Using a word not included in the speech synthesizer's built-in vocabulary of 338 words and phrases would cause it to slowly spell out the word. TI's Terminal Emulator II cartridge provided text-to-speech functionality.24
Citations
Bibliography
- Shaw, Stephen (1983). "Extended Basic". Getting Started With the Texas Instruments TI99/4A. Phoenix Publishing. ISBN 978-0-946576-04-3.
- User's Reference Guide (PDF). Texas Instruments. 1981.
External links
- Beginner's BASIC at ClassicCmp.org
- TI-99/4A BASIC Reference Card at ClassicCmp.org
References
"The TI-99/4A internal architecture". 16 August 2000. https://www.unige.ch/medecine/nouspikel/ti99/architec.htm ↩
Nouspikel, Thierry. "GPL: Graphic Programming Language". Retrieved 2 August 2020. http://www.unige.ch/medecine/nouspikel/ti99/gpl.htm ↩
"I grew up and learned basic on a TI-99/4a. It was a wonderful and simple time..." Hacker News. Retrieved 2 August 2020. https://news.ycombinator.com/item?id=13521531 ↩
Knight, Daniel (10 January 2016). "How Fast Were Those Late 1970s Home Computers?". Low End Mac. https://lowendmac.com/2016/how-fast-were-those-late-1970s-home-computers/ ↩
Gilbreath, Jim; Gilbreath, Gary (January 1983). "Eratosthenes Revisited: Once More through the Sieve". Byte. pp. 283–325. https://archive.org/details/byte-magazine-1983-01/page/n291 ↩
Guide1981, p. II-5. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Guide1981, p. II-8. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Guide1981, p. II-26. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Guide1981, p. II-27. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Guide1981, p. II-33. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Guide1981, p. II-36. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Guide1981, p. i. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Minimal BASIC (PDF) (Technical report). ECMA. January 1978. https://www.ecma-international.org/wp-content/uploads/ECMA-55_1st_edition_january_1978.pdf ↩
Guide1981, p. II-51. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Guide1981, p. II-65. - User's Reference Guide (PDF). Texas Instruments. 1981. http://www.classiccmp.org/dunfield/ti/usrguide.pdf ↩
Exploit by James Abbatiello https://forums.atariage.com/topic/162941-assembly-on-the-994a/page/11/?tab=comments#comment-2849894 ↩
"Mini Memory". https://www.ninerpedia.org/wiki/Mini_Memory ↩
Shaw 1983. - Shaw, Stephen (1983). "Extended Basic". Getting Started With the Texas Instruments TI99/4A. Phoenix Publishing. ISBN 978-0-946576-04-3. https://stephen.shawweb.co.uk/book7.html ↩
Kaplan, Gary (June 1981). "Extended BASIC Review". TI 99er. http://www.mainbyte.com/ti99/software/s_carts/ext_basic.html ↩
Shaw 1983. - Shaw, Stephen (1983). "Extended Basic". Getting Started With the Texas Instruments TI99/4A. Phoenix Publishing. ISBN 978-0-946576-04-3. https://stephen.shawweb.co.uk/book7.html ↩
Shaw 1983. - Shaw, Stephen (1983). "Extended Basic". Getting Started With the Texas Instruments TI99/4A. Phoenix Publishing. ISBN 978-0-946576-04-3. https://stephen.shawweb.co.uk/book7.html ↩
Shaw 1983. - Shaw, Stephen (1983). "Extended Basic". Getting Started With the Texas Instruments TI99/4A. Phoenix Publishing. ISBN 978-0-946576-04-3. https://stephen.shawweb.co.uk/book7.html ↩
Shaw 1983. - Shaw, Stephen (1983). "Extended Basic". Getting Started With the Texas Instruments TI99/4A. Phoenix Publishing. ISBN 978-0-946576-04-3. https://stephen.shawweb.co.uk/book7.html ↩
Shaw 1983. - Shaw, Stephen (1983). "Extended Basic". Getting Started With the Texas Instruments TI99/4A. Phoenix Publishing. ISBN 978-0-946576-04-3. https://stephen.shawweb.co.uk/book7.html ↩