| Sinclair BASIC | |
|---|---|
| Paradigm | Imperative |
| Designed by | John Grant,Steve Vickers |
| Developer | Nine Tiles Networks, Sinclair Research |
| First appeared | 1980; 45 years ago (1980) |
| Platform | ZX80,ZX81,ZX Spectrum, +, 128, +2, +3,T/S 2068,TC 3256 |
| License | Proprietary |
Sinclair BASIC is adialect of the programming languageBASIC used in the8-bithome computers fromSinclair Research,Timex Sinclair andAmstrad. The Sinclair BASICinterpreter was written by Nine Tiles Networks Ltd.[1]
Designed to run in only 1 KB ofRAM, the system makes a number of decisions to lower memory usage. This led to one of Sinclair BASIC's most notable features, that the keywords were entered using single keystrokes; each of the possible keywords was mapped to a key on the keyboard, when pressed, the token would be placed into memory while the entire keyword was printed out on-screen. This made code entry easier whilst simplifying theparser.
The originalZX80 version supported onlyinteger mathematics, which partially made up for some of the memory-saving design notes which had negative impact on performance. When the system was ported to theZX81 in 1981, a fullfloating point implementation was added. This version was very slow, among the slowest BASICs on the market at the time, but given the limited capabilities of the machine, this was not a serious concern. The low speed was not mainly due to an inefficient interpreter though, it was an effect of the fact that 70-80% of the machine cycles were consumed by the video hardware. So the Z80 in the ZX81 clocked at 3.25 MHz was "in effect" running at well below 1 MHz from the perspective of the BASIC system.
Performance became a more serious issue with the release of theZX Spectrum in 1982, which ran too slowly to make full use of the machine's new features. This led to an entirely new BASIC for the followingSinclair QL, as well as a number of 3rd-party BASICs for the Spectrum and its various clones. The original version continued to be modified and ported in the post-Sinclair era.
Clive Sinclair initially met with John Grant, the owner of Nine Tiles, in April 1979 to discuss a BASIC for Sinclair's new computer concept.[2] Sinclair was inspired to make a new machine after watching his son enjoy theirTRS-80, but that machine's £500 price tag appeared to be a serious limit on its popularity. He wanted a new kit that would expand on their previousMK14 and feature a built-in BASIC at the target price of £79.95. To meet this price point, the machine would ship with only 1 KB of RAM and 4 KB of ROM. Grant suggested using theForth language instead, but the budget precluded this. Grant wrote the BASIC interpreter between June and July 1979, but the code initially came in at 5 KB and he spent the next month trimming it down. It was initially an incomplete implementation of the 1978American National Standards Institute (ANSI)Minimal BASIC standard with integer arithmetic only, termed4K BASIC.[3]
Even before the ZX80 was introduced in February 1980, the constant downward price-pressure in the industry was allowing the already inexpensive design to be further reduced in complexity and cost. In particular, many of the separate circuits in the ZX80 were re-implemented in a singleuncommitted logic array fromFerranti, which allowed the price to be reduced to only £49.95 while increasing the size of the ROM to 8 KB. This work was assigned toSteve Vickers, who joined Nine Tiles in January 1980. Whilst Grant worked on the code interfacing with hardware, Vickers used the larger space to introduce floating-point arithmetic and a suite oftrig functions, which were expected of any BASIC from that era, producing8K BASIC.[4] The initial version did not support theZX Printer and had a bug in itssquare root function. Nine Tiles provided a new version to address these, but Sinclair was slow to include the new version in the ROMs. The new ROMs were eventually offered to owners of the earlier ZX80 as well.[5]
When Sinclair lost the contest to build theBBC Computer, he moved ahead with plans to produce a low-cost colour-capable machine that emerged as theZX Spectrum of April 1982. ROM space would once again be increased, this time to 16 KB. In keeping with his philosophy of making systems for the lowest possible expenditure, Sinclair wanted the absolute minimum changes to the existing 8K BASIC. Although Nine Tiles felt that something much better would be needed for the new machine, the schedule would not allow it, and yet another expansion of the original code was produced. Due to the RAM also being increased, to 48 KB, this version was known as 48K BASIC and eventually48 BASIC with the introduction of the ZX Spectrum 128 at which time the 16 KB Spectrum was no longer sold and most existing ones in use had been upgraded to 48 KB.[6][7] The new version was available near the end of 1981, but it was "depressingly slow" and "snail like". Additionally, as no prototypes were available until the end of the year, it lacked support for the new line of peripherals Sinclair was planning.[8]
In February 1982, Nine Tiles began to have disagreements with Sinclair over owed royalties for the various manuals that Nine Tiles had produced. Around the same time, Vickers and his Sinclair counterpart, Richard Altwasser, left their respective companies to start theJupiter Ace project.[9] When the Spectrum was launched the ROM was still not complete, and although Nine Tiles continued working on it until April 1982, by that point 75,000 Spectrums had already been sold and the project was cancelled. The missing functionality was later added by additional code in theZX Interface 1. After Nine Tiles and Sinclair went their own ways, several new versions of 48 BASIC were created.
In 1983, as part of introducing the Spectrum to the US market as the TS2068,Timex modified it asT/S 2000 BASIC. The new version was incapable of running many Spectrum programs due to the memory location of machine's functions moving. A similar, but somewhat more compatible version, was introduced as part of the Spanish Spectrum 128 of 1985,128 BASIC.[7]
Amstrad purchased Sinclair Research in 1986. As Sinclair had never owned the copyright to the language, Amstrad had to arrange a new license with Nine Tiles. Several other versions also appeared in this period as various extensions andclones of the Spectrum were introduced. These included+3 BASIC,BASIC64 andTimex Extended Basic.[7][6]
As of 2015, interpreters exist for modernoperating systems,[10] and older systems,[11] that allow Sinclair Basic to be used easily.
Like most home-computer BASICs, Sinclair BASIC is anchored around itsline editor. When the machine is booted, it runs BASIC and displays aninverse video "K" at the bottom of the screen to indicate the entry point. When a line is entered and theNEW LINE key is pressed, it either runs immediately if it does not have aline number prefix, or clears the screen and performs the equivalent of aLIST command, placing a ">" cursor after the line number in the most recently entered line.
In contrast to most machines of the era, the editor does not allow freeform editing at any point on the screen. Instead, when the user pressesEDIT, the current line of code is copied back to the bottom of the screen. The user can move horizontally through this line using thecursor keys and commits their changes by pressingNEW LINE again. In contrast, on machines like theCommodore 64 orAtari 8-bit computers, the up and down keys can be used to move among the lines in the program and edit them in-place.
The most notable feature of the editor is that keywords are entered using single keystrokes. For instance, on the ZX81, theP key on the keyboard would cause the entire keywordPRINT to be entered into the currently editing line. Once a keyword has been entered, the cursor changes to an "L" to indicate what follows will be interpreted as normal text. For instance, pressingP again at this point would enter a single letter "P".
Keys generally had two separate keywords assigned to them – one above it and one below. Pressing the key in "K" mode would enter the keyword above the key, likePRINT forP. If the system was in "L" mode, one could return to "K" by pressing theshift key – the systems did not initially supportlowercase text, so the shift was not otherwise needed. The keywords below the keys required a second keystroke,⇧ Shift+NEW LINE, which put the editor into "function mode", changing the cursor to an "F". Entering common code often resulted in a significant number of keystrokes.
The system has the advantage of representing all multi-character keywords as a single character in memory, which was a significant savings in the early machines that shipped with only 1 KB of RAM. This single-character representation included multi-character items like<>. This has the added advantages of simplifying the runtime, as it can immediately determine whether a character in thesource code is a keyword or text, and also means that keywords are never entered directly, meaning that one can, for instance, have a variable named "PRINT", as the system can determine that it is not the same as the keyword.
As the systems evolved and added new keywords, the entry system became increasingly difficult to use. 48 BASIC in the Spectrum required every key to host up to four keywords. Entering keywords was a time-consuming process of looking over the relatively small type on the keyboard for the appropriate key, and then correctly entering the multiple keystrokes needed to enter it properly. For instance, enteringBEEP required one to typeCAPS SHIFT+SYMBOL SHIFT to access extended mode (later models include a separateEXTENDED MODE key), keepingSYMBOL SHIFT held down, and then and pressingZ. To improve the complex entry on the Spectrum, the keywords were colour-coded to indicate the required mode:[12]
This concept had run its course, and later machines running128 BASIC (ZX Spectrum 128, +2, +3, +2A, and +2B) featured a more traditional editor where the user typed-in the keyword as individual characters, similar to other home computers of the era. This required a new tokenizer to convert the line into a similar internal format.
The resulting in-memory storage of the program was otherwise similar toMicrosoft BASIC, in that only the keywords are presented as tokens, while non-keywords – like string and numeric constants and variable names – are left in their original typed-in format. However, that typed-in format was notASCII, but an internal character code that contains both printable characters and the keyword tokens. Although portions of the table, the capital letters A to Z, for instance, are in the same order as in ASCII, their characters correspond to different numeric values, i.e. theircode points' offset from zero is different from ASCII's offset of 65. Other characters, like punctuation, may have been moved about even more. TheZX Spectrum character set is the most prominent example of such a character code. Related computers running Sinclair BASIC used similar variants, e.g. theZX80 orZX81 character sets. All of these different but related character sets included Sinclair BASIC tokens.
One uncommon feature of Sinclair BASIC is the way it stores variables in memory. Typically, interpreters use a fixed-size entry to hold data, making it easy to scan the variable table. Due to the extremely limited memory of the ZX series, any wasted space had to be avoided, and this led to the use of a variable-length format. The data types included numbers stored in a 5-byte values, strings with a length and then the characters, and arrays of both of those types. The data was stored in the table itself, which contrasts with most BASICs of the era, where strings and array entries were stored in a separateheap.
The first byte for a variable entry always held the type in the first three bits, and the first character of the name in the next five bits. As was the case in most microcomputer dialects,A,A$,A() andA$() were all different variables and could store different values. Most variables could only have a single-character name; the exception are numeric variables (not arrays), where an alternate format held the first character of the name in those same five bits, but was then followed by additional characters ending with one with its high-bit set. Long variable names were whitespace-independent, and case-insensitive in later versions, soLETNumberOfApples=5 is the same asLETnumberofapples=5 referred to the same variable.
The downside to this approach is that scanning the table to look up the value of a variable reference is more complex. In addition to testing whether the name matches using the subset of the first byte, if the entry is not the one that is being looked for, the type has to be read from the upper three bits and then the next location of a variable in storage calculated using the type. For instance, if the program encounters the variable "A" and the table starts with the entry for "B$", it fails to match A with B, then reads the type to see it is a string, and then has to read the following length byte and skip forward by that amount of bytes to find the next entry in the table. To make this somewhat easier, arrays also stored a two-byte length, so the entire structure could be skipped over more easily.
A unique feature was the "short float", or integer type. Any numeric variable could store either type, the storage itself did not change and used 5 bytes in either case. Integers were indicated by setting the exponent byte to zero, while floating-point values were stored with anexcess-128 format exponent. This meant that it could not store zero as a float and lost one possible exponent magnitude. It also did not use any less memory, as the values were still 5-byte in memory. The advantage to this format is performance; the math library included tests to look for the zero exponent, and if it was seen, it would not attempt to perform various operations on the remaining 3 bytes under certain conditions.
The ZX818K BASIC used the shorter formsGOTO,GOSUB,CONT andRAND, whereas the Spectrum48 BASIC used the longer formsGO TO,GO SUB,CONTINUE andRANDOMIZE. The ZX804K BASIC also used these longer forms but differed by using the spellingRANDOMISE. The ZX818K BASIC was the only version to useFAST,SCROLL,SLOW andUNPLOT. The ZX804K BASIC had the exclusive functionTL$(); it was equivalent to the string operator(2 TO ) in later versions.
Unique code points are assigned in theZX80 character set,ZX81 character set andZX Spectrum character set for each keyword or multi-character operator, i.e.<=, >=,<>,"" (tokenized on the ZX81 only),** (replaced with↑ on the Spectrum). These are expanded by referencing a token table in ROM. Thus, a keyword uses one byte of memory only, a significant saving over traditional letter-by-letter storage. This also meant that theBASIC interpreter could quickly determine any command or function by evaluating one byte, and that the keywords need not bereserved words like in other BASIC dialects or other programming languages, e.g., it is allowed to define a variable namedPRINT and output its value withPRINT PRINT. This is also related to the syntax requirement that every line start with a command keyword, and pressing the one keypress for that command at the start of a line changes the editor from command mode to letter mode. Thus, variable assignment requiresLET (i.e.,LETA=1 not onlyA=1). This practice is also different from other BASIC dialects. Further, it meant that unlike other BASIC dialects, the interpreter needed no parentheses to identify functions;SIN x was sufficient, noSIN(x) needed (though the latter was allowed). The 4K BASIC ROM of the ZX80 had a short list of exceptions to this: the functionsCHR$(),STR$(),TL$(),PEEK(),CODE(),RND(),USR() andABS() did not have one-byte tokens but were typed in letter-by-letter and required the parentheses. They were listed as the INTEGRAL FUNCTIONS on a label above and to the right of the keyboard.[13]
128 BASIC, present on ZX Spectrum 128, +2, +3, +2A, and +2B, stored keywords internally in one-byte code points, but used a conventional letter-by-letter BASIC input system. It also introduced two new commands:
PLAY, which operated the 128k models'General Instrument AY-3-8910 music chipSPECTRUM, which switched the 128k Spectrum into a 48k Spectrum compatibility modeThe original Spanish ZX Spectrum 128 included four additional BASIC editor commands in Spanish,[14][15] one of which was undocumented:
EDITAR (to edit a line number or invoke the full screen string editor)NUMERO (to renumber the program lines)BORRAR (to delete program lines)ANCHO (to set the column width of theRS-232 device, but undocumented as the code was broken)Unlike theLEFT$(),MID$() andRIGHT$() functions used in the ubiquitous Microsoft BASIC dialects for home computers, parts of strings in Sinclair BASIC are accessed by numeric range. For example,A$(5 TO 10) gives a substring starting with the 5th and ending with the 10th character of the variablea$. Thus, it is possible to replace theLEFT$() andRIGHT$() commands by simply omitting the left or right array position respectively; for examplea$( TO 5) is equivalent toLEFT$(A$,5). Further,a$(5) alone is enough to replaceMID$(A$,5,1).
On the 16K/48K ZX Spectrum (48 BASIC), there are 88 keywords in Sinclair BASIC, denoting commands (of which there are 50), functions and logical operators (31), and other keywords (16, including 9 which are also commands or functions):
| Keyword | Parameters[note 1] | Entered using[note 2] | Type | Summary |
|---|---|---|---|---|
ABS | number | EXTENDED MODE thenG | Function | Returns theabsolute value ofnumber[16] |
ACS | number | EXTENDED MODE thenSYMBOL SHIFT+W | Function | Returns thearccosine ofnumber[17] |
AND | SYMBOL SHIFT+Y | Logical operator | Returns true if both conditions on either side of theAND keyword are true, else returns false[note 3][18] | |
ASN | number | EXTENDED MODE thenSYMBOL SHIFT+Q | Function | Returns thearcsine ofnumber[19] |
AT | line, column; | SYMBOL SHIFT+I | Other | Used in aPRINT statement to print at the line and column specified;[20] for example,PRINT AT 5,10;"*" puts a star in column 10 of line 5. |
ATN | number | EXTENDED MODE thenSYMBOL SHIFT+E | Function | Returns thearctangent ofnumber[17] |
ATTR | (line, column) | EXTENDED MODE thenSYMBOL SHIFT+L | Function | Returns abyte containing information on the colours of the text cell on the screen, corresponding to the specifiedline andcolumn; note that, unlike most Sinclair BASIC keywords, the parentheses are required; the first three bits indicate the ink (foreground) colour, the fourth, fifth and sixth bits the paper (background) colour, the seventh bit whether the colours are bright or not, and the eight, whether they are flashing[21] |
BEEP | duration, pitch | EXTENDED MODE thenSYMBOL SHIFT+Z | Command | Produces sound from the computer's speaker;duration is in seconds, pitch is insemitones above (positive value) or below (negative value)middle C[22] |
BIN | number | EXTENDED MODE thenB | Other | Indicatesnumber is inbinary notation[23] |
BORDER | number | B | Command | Sets the border of the screen to the colour specified by thenumber[note 4][24] |
BRIGHT | number | EXTENDED MODE thenSYMBOL SHIFT+B | Command/other | Makes all following colours brighter ifnumber is 1, or its normal shade if 0[note 5][25] |
CAT | number | EXTENDED MODE thenSYMBOL SHIFT+9 | Command | Displays contents ofZX Microdrive specified bynumber[note 6][26] |
CHR$ | number | EXTENDED MODE thenU | Function | Returns the character corresponding to the decimalnumber in the computer'scharacter set[27] |
CIRCLE | x, y, r | EXTENDED MODE thenSYMBOL SHIFT+H | Command | Draws a circle with its centre at coordinates (x,y) and radiusr[28] |
CLEAR | address | X | Command | Clears the screen,[29] all variables and theGO SUB stack,[30] and optionally sets the maximum RAM address to be used by BASIC[31] |
CLOSE # | number | EXTENDED MODE thenSYMBOL SHIFT+5 | Command | Closes the specified stream number for access[note 6] |
CLS | V | Command | Clears all text and graphics from the screen[29] | |
CODE | string | EXTENDED MODE thenI | Function/other | Returns the number corresponding to the first character instring in the computer'scharacter set;[27] also used to save arbitrary chunks memory to tape, disk, etc. and load them back in – seeLOAD,SAVE andVERIFY for details |
CONTINUE | C | Command | Restarts a program after it has stopped due to an error or the user pressing theCAPS SHIFT+SPACE orBREAK keys[32] | |
COPY | Z | Command | Sends the currently displayed screen to the printer[33] | |
COS | number | EXTENDED MODE thenW | Function | Returns thecosine ofnumber[34] |
DATA | comma-separated values | EXTENDED MODE thenD | Command/other | Provides numbers and/or strings to use with theREAD command[35] and allows saving the contents of an array to tape when used with theSAVE command[36] (asSAVE filename DATA array name()) |
DEF FN | name(variable) = operation | EXTENDED MODE then1 | Command | Defines a custom function that can be used with theFN command;function definitions must be of the formf(x)=operations, for examplef(x)=x*2 and the function name may not consist of more than one letter, plus a $-symbol if the function returns a string[37] |
DIM | variable(dimensions) | D | Command | Declares an array with the specifieddimensions, which may be multi-dimensional (for example,DIM a(10,10); if used with strings, the last dimension indicates the length of each of the strings (thus,DIM A$(2,5) is an array of two strings each of five characters long, andDIM B$(5) is one string of five characters)[38] |
DRAW | x, y [, r] | W | Command | Draws a line in the currentINK colour to coordinates (x,y) from the coordinates used by the previousPLOT orDRAW command; if the optionalr is supplied, it indicates the radius of the circle segment to be drawn, inradians[39] |
ERASE | drive;"filename" | EXTENDED MODE thenSYMBOL SHIFT+7 | Command | Deletes the specified file from aZX Microdrive[note 6][40] |
EXP | number | EXTENDED MODE thenX | Function | Returnse to the powernumber[41] |
FLASH | number | EXTENDED MODE thenSYMBOL SHIFT+V | Command/other | Makes all following text alternate its foreground (INK) and background (PAPER) colours[note 5] |
FN | function(value) | EXTENDED MODE thenSYMBOL SHIFT+2 | Function | Calls thefunction defined earlier in the program usingDEF FN[37] |
FORMAT | drive;"name" | EXTENDED MODE thenSYMBOL SHIFT+0 | Command | Formats the cartridge in the indicatedMicrodrive and assigns it the identifiername[note 6][42] |
FOR | variable = start TO end | F | Command | Starts aFOR-NEXT loop;[43] the variable name may only be one character long[44] |
GO SUB | number | H | Command | Makes the program jump to the BASIC line specified bynumber; when the program encounters the commandRETURN, it will jump back to the statement after theGO SUB[45] |
GO TO | number | G | Command | Makes the program jump to the BASIC line specified bynumber |
IF | condition THEN | U | Command | Evaluates thecondition, and if true, executes the statement that follows the keywordTHEN that must come after the condition,[46] for exampleIFA=1THENLETB=2[note 7] |
IN | address | EXTENDED MODE thenSYMBOL SHIFT+I | Function | Returns abyte read from the hardwareinput/output port corresponding to theaddress[47] |
INK | number | EXTENDED MODE thenSYMBOL SHIFT+X | Command/other | Sets the foreground colour for text and graphics[note 4][note 5][48] |
INKEY$ | | EXTENDED MODE thenSYMBOL SHIFT+Z | Function | Returns a string representing the key being pressed on the keyboard at the moment the function is called, or an empty string if none is,[49] but does not wait for a keypress |
INPUT | [prompt,] variable | I | Command | Halts program execution until the user types in something on the keyboard and presses theEnter key, then stores the entered value in the specifiedvariable; if the optionalprompt is supplied, this will be shown on the screen[50] |
INT | number | EXTENDED MODE thenR | Function | Returns theinteger value ofnumber, rounding down to the nearest whole number[16] (thus,INT -1.1 returns −2, not −1) |
INVERSE | number | EXTENDED MODE thenSYMBOL SHIFT+M | Command/other | Reverses the colours on all following text ifnumber is 1, so that it uses the current ink colour for the background and the current paper colour for the text, or sets them back to normal ifnumber is 0[note 5][51] |
LEN | string | EXTENDED MODE thenK | Function | Returns the number of characters (bytes) instring[52] |
LET | variable=value | L | Command | Assignsvalue to the named variable[53] |
LINE | | EXTENDED MODE thenSYMBOL SHIFT+3 | Other | |
LIST | [number] | K | Command | Outputs the current BASIC program to the screen; if the optionalnumber is provided, it omits all lines with a lower number[55] |
LLIST | [number] | EXTENDED MODE thenSYMBOL SHIFT+V | Command | AsLIST except the listing is output to the printer[33] |
LN | number | EXTENDED MODE thenSYMBOL SHIFT+Z | Function | Returns thenatural logarithm ofnumber[56] |
LOAD | "filename" DATA variable() | [CODE [start[, length]]] | SCREEN$ | J | Command | Loads from tape or another storage device, with thefilename specified, or the first file found if an empty string ("") is provided.
|
LPRINT | text | EXTENDED MODE thenSYMBOL SHIFT+C | Command | AsPRINT except output is sent to the printer[33] |
MERGE | "[filename]" | EXTENDED MODE thenSYMBOL SHIFT+T | Command | AsLOAD, except it does not delete the current program and variables; if a line number exists in both, that of the newly loaded program overwrites the existing one. UsingMERGE prevents a program saved usingLINE from auto-running once loaded[57] |
MOVE | stream1 TO stream2 | EXTENDED MODE thenSYMBOL SHIFT+6 | Command | Moves data from one stream (keyboard, screen, file, printer, network, etc.) to another[note 6][58] |
NEW | A | Command | Erases the current BASIC program and all variables[50] | |
NEXT | variable | N | Command | Closes aFOR-NEXT loop; the variable must match that of the correspondingFOR command[59] – "empty"NEXTs to refer to the immediately precedingFOR in the program are not allowed |
NOT | condition | SYMBOL SHIFT+S | Logical operator | Returns true if thecondition is false, else returns false[note 3][18] |
OPEN # | stream | EXTENDED MODE thenSYMBOL SHIFT+4 | Command | Opens a stream for reading from and/or writing to[note 6][60] |
OR | SYMBOL SHIFT+Y | Logical operator | Returns true if either of the conditions on either side of theOR keyword are true, else returns false[note 3][18] | |
OUT | address, value | EXTENDED MODE thenSYMBOL SHIFT+O | Command | Sends thevalue (abyte) to the hardwareinput/output port corresponding to theaddress.[47] |
OVER | number | EXTENDED MODE thenSYMBOL SHIFT+N | Command/other | Will make following text overprint with an XOR operation what is already on the screen ifnumber is 1, instead of erasing it, or erase it ifnumber is 0[note 5][51] |
PAPER | number | EXTENDED MODE thenSYMBOL SHIFT+C | Command/other | Sets the background colour for text and graphics[note 4][note 5][48] |
PAUSE | delay | M | Command | Halts program execution for the specified delay, in of a second in Europe or in North America[61] (thus,PAUSE 50 halts for one second in Europe). Also continues after a key press. |
PEEK | address | EXTENDED MODE thenO | Function | Returns a byte representing the contents of the memory location pointed to byaddress[62] |
PI | | EXTENDED MODE thenM | Function | Returns the value ofpi[56] |
PLOT | x, y | Q | Command | Draws a pixel in the currentINK colour on the screen at the coordinates (x,y)[63] |
POINT | (x,y) | EXTENDED MODE thenSYMBOL SHIFT+8 | Function | Returns 1 if the pixel pointed at graphical coordinates (x,y) is currently in the ink (foreground) colour, else returns 0[28] |
POKE | address, value | O | Command | Sets the contents ofaddress in RAM tovalue[64] |
PRINT | [AT x,y;] text | P | Command | Printstext (which must be one or more strings or numbers separated with semicolons) to the screen.[53] If used with #0 or #1, it prints in the bottom two (input) lines of the screen; if used withAT, it prints at the specified text coordinates; otherwise, it prints either immediately following the output of any previousPRINT statement (if the previous statement ended in a semicolon), or in the first column of the line below the previousPRINT output,[20] defaulting to 0,0. |
RANDOMIZE | [number] | T | Command | Initializes therandom number generator; if used without anumber (or with 0), it does this based on the computer's internal clock, else it uses thenumber supplied, which must be in the range [1,65535][65] |
READ | variable | EXTENDED MODE thenA | Command | Takes a value from aDATA statement and stores it in the namedvariable: the first timeREAD is used, it gets the first value after the firstDATA, the second time it gets the next one, and so on[35] |
REM | text | E | Command | Begins a comment in the source code, meaning that everything after theREM statement is ignored, until the end of the line[50] – note this includes everything after a colon, which normally begins a new segment:10REM Nothing to see here: PRINT "Unprintable" will not produce any output, for example. |
RESTORE | [number] | EXTENDED MODE thenS | Command | Resets whereREAD commands look for values inDATA statements: if used without a number, the nextREAD will use the firstDATA in the program, with a number it will use the firstDATA on or after the line whose number is indicated[66] |
RETURN | Y | Command | Returns execution to the first statement following the lastGO SUB command that was executed[45] | |
RND | | EXTENDED MODE thenT | Function | Returns a pseudo-random number with eightsignificant figures in the range [0,1)[67] |
RUN | [number] | R | Command | Starts the current BASIC program, from its first line if nonumber is specified, else from the line with that number (or the first one after, if it does not exist)[68] |
SAVE | "filename" [DATA variable() | LINE number | CODE start, length | SCREEN$] | S | Command | Saves to tape or another storage device, with thefilename specified.
|
SCREEN$ | [(line, column)] | EXTENDED MODE thenSYMBOL SHIFT+ | Function/other | As a function, identifies the character at the specified line and column on the screen.[20] Used after the filename in aLOAD orSAVE command, indicates that the contents of thedisplay memory should be loaded or saved; this essentially makes it a shortcut forCODE 16384,6912[note 8] but does not work withVERIFY because the contents of the display memory will be different by the time that command reads back the saved data;[69] |
SGN | number | EXTENDED MODE thenF | Function | Returns 1 ifnumber is positive, 0 if it is 0, and −1 if it is negative[16] |
SIN | number | EXTENDED MODE thenQ | Function | Returns thesine ofnumber[34] |
STEP | number | SYMBOL SHIFT+D | Other | Indicates the interval used by aFOR statement,[44] for exampleFORn=2TO6STEP2 will skipn=3 andn=5 in the loop |
STOP | SYMBOL SHIFT+A | Command | Ends execution of the current program, exiting to the BASIC editor; can also be given when the computer is waiting for input using theINPUT command;[68] once the program is stopped, it can be resumed withCONTINUE | |
SQR | number | EXTENDED MODE thenH | Function | Returns thesquare root ofnumber[37] |
STR$ | number | EXTENDED MODE thenY | Function | Converts a number to string. |
TAB | column | EXTENDED MODE thenP | Other | In aPRINT statement, makes sure that the text to be output begins in the column specified, wrapping to the next line as necessary, but never more than one line[29] |
TAN | number | EXTENDED MODE thenE | Function | Returns thetangent ofnumber[70] |
THEN | statement | SYMBOL SHIFT+G | Other | Follows the condition in anIF statement to indicate what should happen when the condition evaluates to true[note 7][46] |
TO | | SYMBOL SHIFT+F | Other | Indicates a range from the number to the left ofTO to the number of the right of it, inclusive;[71] when used withFOR both numbers must be supplied, while if used to slice strings, either may be left off to indicate the start or end of the string |
USR | string or address | EXTENDED MODE thenL | Function | When called with a single-character string, this returns the memory address at which theglyph for the user-defined graphic character corresponding to that character is defined.[23] If called with an address, it startsmachine code execution at that address (thus making it one of the few Sinclair BASIC functions to have aSide effect) and returns the contents of theZ80’s BCregister pair.[72] |
VAL | string | EXTENDED MODE thenJ | Function | Evaluates thestring as a number and returns the result;[73] this can perform calculations:VAL "1+2" returns 3, for example, and also evaluates variables and even otherVAL statements:LETA=1:VAL"A+VAL ""2"""[note 9] also returns 3 |
VAL$ | string | EXTENDED MODE thenSYMBOL SHIFT+J | Function | Similar toVAL but evaluates the string as a string[16] |
VERIFY | "[filename]" | EXTENDED MODE thenSYMBOL SHIFT+R | Command | Reads a program or data from tape or other storage, much likeLOAD, but instead of loading it into memory, compares it with the program or data that is already in memory. This is intended to be used immediately after aSAVE command, to make sure the program or data has been saved without corruption.[74] |
4K BASIC for ZX80[75] (so named for residing in 4 KiBread-only memory (ROM)), was developed by John Grant of Nine Tiles for the ZX80. It has integer-only arithmetic.
NEWRUNLISTLOADSAVEGOTOIFTHENGOSUBSTOPRETURNFORTONEXTCONTINUEPRINTINPUTLETCLEARCLSDIMREMRANDOMIZEPOKEABSCHR$CODEPEEKRNDSTR$TL$USR8K BASIC is the ZX81 BASIC (also available as an upgrade for the ZX80[5]), updated with floating-point arithmetic bySteve Vickers, so named for residing in 8 KiB ROM.
PRINTRANDLETCLEARRUNLISTGOTOCONTINPUTNEWREMPRINTSTOPBREAKIFSTOPFORNEXTTOSTEPSLOWFASTGOSUBRETURNSAVELOADCLSSCROLLPLOTUNPLOTPAUSELPRINTLLISTCOPYDIMPOKENEWABSSGNSINCOSTANASNACSATNLNEXPSQRINTPIRNDFUNCTIONLENVALSTR$NOTCODECHR$INKEY$ATTABINKEY$PEEKUSR48 BASIC is the BASIC for the original 16/48 KBRAM ZX Spectrum (and clones), with colour and more peripherals added by Steve Vickers and John Grant. It resides in 16 KB ROM and began to be called 48 BASIC with the introduction of the ZX Spectrum 128 at which time the 16 KB Spectrum was no longer sold and most existing ones in use had been upgraded to 48 KB.[6]
128 BASIC is the BASIC for the ZX Spectrum 128.[7] It offers extra commands and uses letter-by-letter input.
LOAD !SAVE !MERGE !ERASE !PLAYSPECTRUM+3 BASIC is the BASIC with disk support for the ZX Spectrum +3 and +2A.[6]
FORMATCOPYT/S 2000 BASIC is used on the Spectrum-compatibleTimex Sinclair 2068 (T/S 2068) and adds the following six new keywords:
DELETE deletes BASIC program line ranges.FREE is a function that gives the amount of free RAM.PRINT FREE will show how much RAM is free.ON ERR is an error-handling function mostly used asON ERR GO TO orON ERR CONT.RESET can be used to reset the behaviour ofON ERR. It was also intended to reset peripherals.SOUND controls theAY-3-8192sound chip.STICK is a function that gives the position of the internal joystick (Timex Sinclair 2090).BASIC64 byTimex of Portugal, is asoftware extension[76] to allow better Basic programming with the 512×192 and dual display areas graphic modes available only onTimex Sinclair computers. This extension adds commands and does a complete memory remap to avoid the system overwriting the extended screen memory area. Two versions exist due to different memory maps – a version forTC 2048 and a version for T/S 2068 andTC 2068.
PRINT # prints to a specific output channel.LIST # lists the program to a specific output channel.CLS* clears both display areas.INK* sets ink colour for both display areasPAPER* sets paper colour both display areasSCREEN$ selects the high / normal resolution modes.PLOT* plots a pixel and updates the drawing position.LINE draws a line from the previous PLOT position, supporting arc drawingCIRCLE* draws a circle or oval, depending on screen mode.Timex Extended Basic by Timex of Portugal is used on theTimex Computer 3256, addingTEC – Timex Extended Commands commands supporting the AY-3-8912 sound chip, RS-232 network and the 512x192 pixel high resolution graphic mode.[77][78]
LOAD!SAVE!CAT!MERGE!ERASE!CLEAR!FORMAT!LPRINTLLISTBEEP!SCREEN$DRAW!PLOT!CIRCLE!Several ZX Spectrum interpreters exist.[79]
Several ZX Spectrumcompilers exist.[79]
AND usually returns the first of the conditions supplied for true, or 1 if no numerical values were given. For example,6 AND 7 returns 6, whileNOT 6=7 returns 1.| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 |
| blue | red | magenta | green | cyan | yellow | white | black |
In all colour-related commands, the number 8 may be used to indicate "transparent" while inINK andPAPER may also be set to 9 for "contrast" – that is, to put a dark colour on a light background or vice versa automatically.
INK,PAPER,FLASH,BRIGHT,OVER andINVERSE set attributes for outputting text and graphics to the screen. They can be used either as commands, to apply to all subsequent output until set again, or within aPRINT statement, to apply only from that point until the end of the statement.CAT,ERASE,FORMAT andMOVE were originally designed to be used with peripherals, but at the launch of ZX Spectrum, they had not been completely implemented, such that their use generated an error message (Invalid Stream). Later with the aid of the ZX Interface 1 shadow ROM, they were used for theZX Microdrive. (The shadow ROM was paged when the BASIC interpreter detected a syntax error, which is why most ZX Microdrive commands use a"*").ELSE operator in theIF–THEN[–ELSE] clause. A workaround would be to use anIF–THEN–GO TO construct instead, bypassing the lines that would have been in anELSE clause with theGO TOHe is keen to credit [...], not least Nine Tiles, the company that made the Basic operating software.