Sinclair BASIC: Difference between revisions
DewiMorgan (talk | contribs) Clarify print positioning. |
Citation bot (talk | contribs) Add: date. | Use this bot. Report bugs. | Suggested by 4throck | #UCB_toolbar |
||
Line 687: | Line 687: | ||
* ''[https://web.archive.org/web/20150901085346/http://www.wearmouth.demon.co.uk/ Sea Change ROM]'' by Steve Vickers and Ian Logan, modified by Geoff Wearmouth, a replacement ROM with an enhanced Sinclair BASIC.<ref>{{Cite web|url=https://sinclair.wiki.zxnet.co.uk/wiki/Sinclair_BASIC_history|title=Sinclair BASIC history - Sinclair Wiki|website=sinclair.wiki.zxnet.co.uk}}</ref> |
* ''[https://web.archive.org/web/20150901085346/http://www.wearmouth.demon.co.uk/ Sea Change ROM]'' by Steve Vickers and Ian Logan, modified by Geoff Wearmouth, a replacement ROM with an enhanced Sinclair BASIC.<ref>{{Cite web|url=https://sinclair.wiki.zxnet.co.uk/wiki/Sinclair_BASIC_history|title=Sinclair BASIC history - Sinclair Wiki|website=sinclair.wiki.zxnet.co.uk}}</ref> |
||
*''[[Gosh Wonderful]]'' by [[Geoff Wearmouth]], a replacement ROM that fixes bugs and adds a tokenizer, stream lister, delete and renumber commands.<ref name="ReferenceA"/><ref>{{cite web|title=The Incomplete Spectrum ROM Assembly|url=http://www.wearmouth.demon.co.uk/ |archive-url=https://web.archive.org/web/20150901085346/http://www.wearmouth.demon.co.uk |archive-date=2015-09-01 |url-status=dead}}</ref> |
*''[[Gosh Wonderful]]'' by [[Geoff Wearmouth]], a replacement ROM that fixes bugs and adds a tokenizer, stream lister, delete and renumber commands.<ref name="ReferenceA"/><ref>{{cite web|title=The Incomplete Spectrum ROM Assembly|url=http://www.wearmouth.demon.co.uk/ |archive-url=https://web.archive.org/web/20150901085346/http://www.wearmouth.demon.co.uk |archive-date=2015-09-01 |url-status=dead}}</ref> |
||
* ''[[OpenSE BASIC]]'' (formerly SE BASIC) by [[Andrew Owen]], a replacement ROM with bug fixes and many enhancements including [[ULAplus]]<ref>{{Cite web|url=https://sites.google.com/site/ulaplus/|title=ULAplus|website=sites.google.com}}</ref> support, published as open source in 2011<ref>{{Cite web|url=http://www.fruitcake.plus.com/Sinclair/Interface2/Cartridges/Interface2_RC_New_3rdParty_SEBASIC.htm|title=ZX Interface 2 - SE BASIC (3rd Party ROM Cartridge)|website=www.fruitcake.plus.com}}</ref><ref>{{Cite web|url=https://sourceforge.net/projects/sebasic/|title=OpenSE BASIC|website=SourceForge}}</ref><ref>{{Cite web |title=OpenSE BASIC at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware |url=https://spectrumcomputing.co.uk/entry/27510/ZX-Spectrum/OpenSE_BASIC |access-date=2022-12-13 |website=Spectrum Computing |language=en}}</ref> |
* ''[[OpenSE BASIC]]'' (formerly SE BASIC) by [[Andrew Owen]], a replacement ROM with bug fixes and many enhancements including [[ULAplus]]<ref>{{Cite web|url=https://sites.google.com/site/ulaplus/|title=ULAplus|website=sites.google.com}}</ref> support, published as open source in 2011<ref>{{Cite web|url=http://www.fruitcake.plus.com/Sinclair/Interface2/Cartridges/Interface2_RC_New_3rdParty_SEBASIC.htm|title=ZX Interface 2 - SE BASIC (3rd Party ROM Cartridge)|website=www.fruitcake.plus.com}}</ref><ref>{{Cite web|url=https://sourceforge.net/projects/sebasic/|title=OpenSE BASIC|website=SourceForge|date=16 April 2013 }}</ref><ref>{{Cite web |title=OpenSE BASIC at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware |url=https://spectrumcomputing.co.uk/entry/27510/ZX-Spectrum/OpenSE_BASIC |access-date=2022-12-13 |website=Spectrum Computing |language=en}}</ref> |
||
===Compilers for the ZX Spectrum family=== |
===Compilers for the ZX Spectrum family=== |
Revision as of 08:19, 24 July 2023
This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these messages)
‹The template Manual is being considered for merging.›
|
Paradigm | Imperative |
---|---|
Designed by | John Grant, Steve Vickers |
Developer | Nine Tiles Networks, Sinclair Research |
First appeared | 1979 |
Platform | ZX80, ZX81, ZX Spectrum, +, 128, +2, +3, T/S 2068, TC 3256 |
License | Proprietary |
Sinclair BASIC is a dialect of the programming language BASIC used in the 8-bit home computers from Sinclair Research and Timex Sinclair. The Sinclair BASIC interpreter was made by Nine Tiles Networks Ltd.[1]
History
Sinclair BASIC was originally developed in 1979 for the ZX80 by Nine Tiles. The programmers were John Grant, the owner of Nine Tiles, and Steve Vickers.
It was initially an incomplete implementation of the 1978 American National Standards Institute (ANSI) minimal BASIC standard with integer arithmetic only, termed 4K BASIC (for its ROM size) for the ZX80. It evolved through the floating-point 8K BASIC for the ZX81 and T/S 1000 (which was also available as an upgrade for the ZX80[2]), and became an almost complete version in the 16 KB ROM ZX Spectrum (known as 48K BASIC).
It is present in all ZX Spectrum compatibles and clones, with more advanced systems also offering expanded versions like 128K BASIC, +3 BASIC, T/S 2000 BASIC, BASIC64 or Timex Extended Basic.
As of 2015, interpreters exist for modern operating systems,[3] and older systems,[4] that allow Sinclair Basic to be used easily.
Syntax
Keywords
On the 16K/48K ZX Spectrum (48K 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 then G | Function | Returns the absolute value of number [5]
|
ACS
|
number
|
EXTENDED MODE then SYMBOL SHIFT+W | Function | Returns the arccosine of number [6]
|
AND
|
SYMBOL SHIFT+Y | Logical operator | Returns true if both conditions on either side of the AND keyword are true, else returns false[note 3][7]
| |
ASN
|
number
|
EXTENDED MODE then SYMBOL SHIFT+Q | Function | Returns the arcsine of number [8]
|
AT
|
line, column;
|
SYMBOL SHIFT+I | Other | Used in a PRINT statement to print at the line and column specified;[9] for example, PRINT AT 5,10;"*" puts a star in column 10 of line 5.
|
ATN
|
number
|
EXTENDED MODE then SYMBOL SHIFT+E | Function | Returns the arctangent of number [6]
|
ATTR
|
(line, column)
|
EXTENDED MODE then SYMBOL SHIFT+L | Function | Returns a byte containing information on the colours of the text cell on the screen, corresponding to the specified line and column ;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[10]
|
BEEP
|
duration, pitch
|
EXTENDED MODE then SYMBOL SHIFT+Z | Command | Produces sound from the computer's speaker; duration is in seconds, pitch is in semitones above (positive value) or below (negative value) middle C[11]
|
BIN
|
number
|
EXTENDED MODE then B | Other | Indicates number is in binary notation[12]
|
BORDER
|
number
|
B | Command | Sets the border of the screen to the colour specified by the number [note 4][13]
|
BRIGHT
|
number
|
EXTENDED MODE then SYMBOL SHIFT+B | Command/other | Makes all following colours brighter if number is 1, or its normal shade if 0[note 5][14]
|
CAT
|
number
|
EXTENDED MODE then SYMBOL SHIFT+9 | Command | Displays contents of ZX Microdrive specified by number [note 6][15]
|
CHR$
|
number
|
EXTENDED MODE then U | Function | Returns the character corresponding to the decimal number in the computer's character set[16]
|
CIRCLE
|
x, y, r
|
EXTENDED MODE then SYMBOL SHIFT+H | Command | Draws a circle with its centre at coordinates (x ,y ) and radius r [17]
|
CLEAR
|
address
|
X | Command | Clears the screen,[18] all variables and the GO SUB stack,[19] and optionally sets the maximum RAM address to be used by BASIC[20]
|
CLOSE #
|
number
|
EXTENDED MODE then SYMBOL SHIFT+5 | Command | Closes the specified stream number for access[note 6] |
CLS
|
V | Command | Clears all text and graphics from the screen[18] | |
CODE
|
string
|
EXTENDED MODE then I | Function/other | Returns the number corresponding to the first character in string in the computer's character set;[16] also used to save arbitrary chunks memory to tape, disk, etc. and load them back in — see LOAD , SAVE and VERIFY for details
|
CONTINUE
|
C | Command | Restarts a program after it has stopped due to an error or the user pressing the CAPS SHIFT+SPACE or BREAK keys[21] | |
COPY
|
Z | Command | Sends the currently displayed screen to the printer[22] | |
COS
|
number
|
EXTENDED MODE then W | Function | Returns the cosine of number [23]
|
DATA
|
comma-separated values
|
EXTENDED MODE then D | Command/other | Provides numbers and/or strings to use with the READ command[24] and allows saving the contents of an array to tape when used with the SAVE command[25] (as SAVE filename DATA array name()
|
DEF FN
|
name(variable) = operation
|
EXTENDED MODE then 1 | Command | Defines a custom function that can be used with the FN command;function definitions must be of the form f(x)=operations , for example f(x)=x*2 and the function name may not consist of more than one letter, plus a $-symbol if the function returns a string[26]
|
DIM
|
variable(dimensions)
|
D | Command | Declares an array with the specified dimensions , 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, and DIM b$(5) is one string of five characters)[27]
|
DRAW
|
x, y [, r]
|
W | Command | Draws a line in the current INK colour to coordinates (x ,y ) from the coordinates used by the previous PLOT or DRAW command; if the optional r is supplied, it indicates the radius of the circle segment to be drawn, in radians[28]
|
ERASE
|
drive;"filename"
|
EXTENDED MODE then SYMBOL SHIFT+7 | Command | Deletes the specified file from a ZX Microdrive[note 6][29] |
EXP
|
number
|
EXTENDED MODE then X | Function | Returns e to the power number [30]
|
FLASH
|
number
|
EXTENDED MODE then SYMBOL SHIFT+V | Command/other | Makes all following text alternate its foreground (INK ) and background (PAPER ) colours[note 5]
|
FN
|
function(value)
|
EXTENDED MODE then SYMBOL SHIFT+2 | Function | Calls the function defined earlier in the program using DEF FN [26]
|
FORMAT
|
drive;"name"
|
EXTENDED MODE then SYMBOL SHIFT+0 | Command | Formats the cartridge in the indicated Microdrive and assigns it the identifier name [note 6][31]
|
FOR
|
variable = start TO end
|
F | Command | Starts a FOR -NEXT loop;[32] the variable name may only be one character long[33]
|
GO SUB
|
number
|
H | Command | Makes the program jump to the BASIC line specified by number ; when the program encounters the command RETURN , it will jump back to the statement after the GO SUB [34]
|
GO TO
|
number
|
G | Command | Makes the program jump to the BASIC line specified by number
|
IF
|
condition THEN
|
U | Command | Evaluates the condition , and if true, executes the statement that follows the keyword THEN that must come after the condition,[35] for example IF a=1 THEN LET b=2 [note 7]
|
IN
|
address
|
EXTENDED MODE then SYMBOL SHIFT+I | Function | Returns a byte read from the hardware input/output port corresponding to the address [36]
|
INK
|
number
|
EXTENDED MODE then SYMBOL SHIFT+X | Command/other | Sets the foreground colour for text and graphics[note 4][note 5][37] |
INKEY$
|
|
EXTENDED MODE then SYMBOL 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,[38] 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 the Enter key, then stores the entered value in the specified variable ; if the optional prompt is supplied, this will be shown on the screen[39]
|
INT
|
number
|
EXTENDED MODE then R | Function | Returns the integer value of number , rounding down to the nearest whole number[5] (thus, INT -1.1 returns −2, not −1)
|
INVERSE
|
number
|
EXTENDED MODE then SYMBOL SHIFT+M | Command/other | Reverses the colours on all following text if number 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 if number is 0[note 5][40]
|
LEN
|
string
|
EXTENDED MODE then K | Function | Returns the number of characters (bytes) in string [41]
|
LET
|
variable=value
|
L | Command | Assigns value to the named variable[42]
|
LINE
|
|
EXTENDED MODE then SYMBOL SHIFT+3 | Other | |
LIST
|
[number]
|
K | Command | Outputs the current BASIC program to the screen; if the optional number is provided, it omits all lines with a lower number[44]
|
LLIST
|
[number]
|
EXTENDED MODE then SYMBOL SHIFT+V | Command | As LIST except the listing is output to the printer[22]
|
LN
|
number
|
EXTENDED MODE then SYMBOL SHIFT+Z | Function | Returns the natural logarithm of number [45]
|
LOAD
|
"[filename]" [CODE [address[, length]]| DATA variable()]
|
J | Command | Loads a program or data into RAM from tape, ZX Microdrive, disk, etc., deleting any existing BASIC program and variables;[39] if an empty string ("" ) is provided, this loads the first program found, else it will search the tape for the program named in the string; if the optional CODE is provided, will load the program into memory at the address it had when it was saved, or at the specified address (length is intended as a safety, to try and load the right program in case there are multiple on the tape with the right name but of different lengths);[46] if the optional DATA variable() is provided, will load the data from the tape into the array named variable() [25]
|
LPRINT
|
text
|
EXTENDED MODE then SYMBOL SHIFT+C | Command | As PRINT except output is sent to the printer[22]
|
MERGE
|
"[filename]"
|
EXTENDED MODE then SYMBOL SHIFT+T | Command | As LOAD , 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. Using MERGE prevents a program saved using LINE from auto-running once loaded[47]
|
MOVE
|
stream1 TO stream2
|
EXTENDED MODE then SYMBOL SHIFT+6 | Command | Moves data from one stream (keyboard, screen, file, printer, network, etc.) to another[note 6][48] |
NEW
|
A | Command | Erases the current BASIC program and all variables[39] | |
NEXT
|
variable
|
N | Command | Closes a FOR -NEXT loop; the variable must match that of the corresponding FOR command[49] — "empty" NEXT s to refer to the immediately preceding FOR in the program are not allowed
|
NOT
|
condition
|
SYMBOL SHIFT+S | Logical operator | Returns true if the condition is false, else returns false[note 3][7]
|
OPEN #
|
stream
|
EXTENDED MODE then SYMBOL SHIFT+4 | Command | Opens a stream for reading from and/or writing to[note 6][50] |
OR
|
SYMBOL SHIFT+Y | Logical operator | Returns true if either of the conditions on either side of the OR keyword are true, else returns false[note 3][7]
| |
OUT
|
address, value
|
EXTENDED MODE then SYMBOL SHIFT+O | Command | Sends the value (a byte) to the hardware [Memory-mapped I/O|input/output port] corresponding to the address [36]
|
OVER
|
number
|
EXTENDED MODE then SYMBOL SHIFT+N | Command/other | Will make following text overprint with an XOR operation what is already on the screen if number is 1, instead of erasing it, or erase it if number is 0[note 5][40]
|
PAPER
|
number
|
EXTENDED MODE then SYMBOL SHIFT+C | Command/other | Sets the background colour for text and graphics[note 4][note 5][37] |
PAUSE
|
delay
|
M | Command | Halts program execution for the specified delay, in of a second in Europe or in North America[51] (thus, PAUSE 50 halts for one second in Europe)
|
PEEK
|
address
|
EXTENDED MODE then O | Function | Returns a byte representing the contents of the memory location pointed to by address [52]
|
PI
|
|
EXTENDED MODE then M | Function | Returns the value of pi[45] |
PLOT
|
x, y
|
Q | Command | Draws a pixel in the current INK colour on the screen at the coordinates (x ,y )[53]
|
POINT
|
(x,y)
|
EXTENDED MODE then SYMBOL SHIFT+8 | Function | Returns 1 if the pixel pointed at graphical coordinates (x ,y ) is currently in the ink (foreground) colour, else returns 0[17]
|
POKE
|
address, value
|
O | Command | Sets the contents of address in RAM to value [54]
|
PRINT
|
[AT x,y;] text
|
P | Command | Prints text (which must be one or more strings or numbers separated with semicolons) to the screen[42]. If used with #0 or #1, it prints in the bottom two (input) lines of the screen; if used with AT , it prints at the specified text coordinates; otherwise, it prints either immediately following the output of any previous PRINT statement (if the previous statement ended in a semicolon), or in the first column of the line below the previous PRINT output[9], defaulting to 0,0.
|
RANDOMIZE
|
[number]
|
T | Command | Initializes the random number generator; if used without a number (or with 0), it does this based on the computer's internal clock, else it uses the number supplied, which must be in the range [1,65535][55]
|
READ
|
variable
|
EXTENDED MODE then A | Command | Takes a value from a DATA statement and stores it in the named variable : the first time READ is used, it gets the first value after the first DATA , the second time it gets the next one, and so on[24]
|
REM
|
text | E | Command | Begins a comment in the source code, meaning that everything after the REM statement is ignored, until the end of the line[39] — note this includes everything after a colon, which normally begins a new segment: 10 REM Nothing to see here : PRINT "Unprintable" will not produce any output, for example
|
RESTORE
|
[number]
|
EXTENDED MODE then S | Command | Resets where READ commands look for values in DATA statements: if used without a number, the next READ will use the first DATA in the program, with a number it will use the first DATA on or after the line whose number is indicated[56]
|
RETURN
|
Y | Command | Returns execution to the first statement following the last GO SUB command that was executed[34]
| |
RND
|
|
EXTENDED MODE then T | Function | Returns a pseudo-random number with eight significant figures in the range [0,1)[57] |
RUN
|
[number]
|
R | Command | Starts the current BASIC program, from its first line if no number is specified, else from the line with that number (or the first one after, if it does not exist)[58]
|
SAVE
|
"filename" [DATA variable() | LINE number]
|
S | Command | Saves the current BASIC program to tape or other storage device, with the filename specified; if the optional LINE followed by a line number is used, then the program will start automatically at the indicated line number when it is LOAD ed back in; with the optional DATA , the command saves the contents of the array named by the variable instead of the current BASIC program[25]
|
SCREEN$
|
[(line, column)]
|
EXTENDED MODE then SYMBOL SHIFT+ | Function/other | As a function, identifies the character at the specified line and column on the screen.[9] Used after the filename in a LOAD or SAVE command, indicates that the contents of the display memory should be loaded or saved; this essentially makes it a shortcut for CODE 16384,6912 [note 8] but does not work with VERIFY because the contents of the display memory will be different by the time that command reads back the saved data;[59]
|
SGN
|
number
|
EXTENDED MODE then F | Function | Returns 1 if number is positive, 0 if it is 0, and −1 if it is negative[5]
|
SIN
|
number
|
EXTENDED MODE then Q | Function | Returns the sine of number [23]
|
STEP
|
number
|
SYMBOL SHIFT+D | Other | Indicates the interval used by a FOR statement,[33] for example FOR n=2 TO 6 STEP 2 will skip n=3 and n=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 the INPUT command;[58] once the program is stopped, it can be resumed with CONTINUE
| |
SQR
|
number
|
EXTENDED MODE then H | Function | Returns the square root of number [26]
|
STR$
|
number
|
EXTENDED MODE then Y | Function | Returns the character from the computer's character set corresponding to number [60]
|
TAB
|
column
|
EXTENDED MODE then P | Other | In a PRINT 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[18]
|
TAN
|
number
|
EXTENDED MODE then E | Function | Returns the tangent of number [61]
|
THEN
|
statement
|
SYMBOL SHIFT+G | Other | Follows the condition in an IF statement to indicate what should happen when the condition evaluates to true[note 7][35]
|
TO
|
|
SYMBOL SHIFT+F | Other | Indicates a range from the number to the left of TO to the number of the right of it, inclusive;[62] when used with FOR 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 then L | Function | When called with a single-character string, this returns the memory address at which the glyph for the user-defined graphic character corresponding to that character is defined.[12] If called with an address, it starts machine code execution at that address (thus making it one of the few Sinclair BASIC functions to have a Side effect) and returns the contents of the Z80’s BC register pair.[63] |
VAL
|
string
|
EXTENDED MODE then J | Function | Evaluates the string as a number and returns the result;[64] this can perform calculations: VAL "1+2" returns 3, for example, and also evaluates variables and even other VAL statements: LET a=1: VAL "a+VAL ""2""" [note 9] also returns 3
|
VAL$
|
string
|
EXTENDED MODE then SYMBOL SHIFT+J | Function | Similar to VAL but evaluates the string as a string[5]
|
VERIFY
|
"[filename]"
|
EXTENDED MODE then SYMBOL SHIFT+R | Command | Reads a program or data from tape or other storage, much like LOAD , 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 a SAVE command, to make sure the program or data has been saved without corruption.[65]
|
Keyword entry
In 48K models and older, the keywords are entered via Sinclair's unique keyword entry system, as indicated on the table. The most common commands need one keystroke only; for example, pressing only P at the start of a line on a Spectrum produces the full command PRINT
. Less frequent commands require more complex key sequences: BEEP
(for example) is keyed by pressing CAPS SHIFT plus SYMBOL SHIFT to access extended mode (later models include an EXTENDED MODE key), keeping SYMBOL SHIFT held down and pressing Z. Keywords are colour-coded on the original Spectrum keyboard to indicate which mode is required:[66]
- White: key only
- Red on the key itself: SYMBOL SHIFT plus the key
- Green above the key: EXTENDED MODE followed by the key
- Red below the key: EXTENDED MODE followed by SYMBOL SHIFT plus the key
The ZX81 8K BASIC used the shorter forms GOTO
, GOSUB
, CONT
and RAND
, whereas the Spectrum 48K BASIC used the longer forms GO TO
, GO SUB
, CONTINUE
and RANDOMIZE
. The ZX80 4K BASIC also used these longer forms but differed by using the spelling RANDOMISE
. The ZX81 8K BASIC was the only version to use FAST
, SCROLL
, SLOW
and UNPLOT
. The ZX80 4K BASIC had the exclusive function TL$()
; it was equivalent to the string operator (2 TO )
in later versions.
Unique code points are assigned in the ZX80 character set, ZX81 character set and ZX 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 the BASIC interpreter could quickly determine any command or function by evaluating one byte, and that the keywords need not be reserved words like in other BASIC dialects or other programming languages, e.g., it is allowed to define a variable named PRINT
and output its value with PRINT 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 requires LET
(i.e., LET a=1
not only a=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, no SIN(x)
needed (though the latter was allowed). The 4K BASIC ROM of the ZX80 had a short list of exceptions to this: the functions CHR$()
, STR$()
, TL$()
, PEEK()
, CODE()
, RND()
, USR()
and ABS()
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.[67]
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 mode
The original Spanish ZX Spectrum 128 included four additional BASIC editor commands in Spanish,[68][69] 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 the RS-232 device, but undocumented as the code was broken)
Unlike the LEFT$()
, MID$()
and RIGHT$()
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 variable a$
. Thus, it is possible to replace the LEFT$()
and RIGHT$()
commands by simply omitting the left or right array position respectively; for example a$( TO 5)
is equivalent to LEFT$(a$,5)
. Further, a$(5)
alone is enough to replace MID$(a$,5,1)
.
Variable names
Variables holding numeric values may be any length, while string and array variable names must consist of only one alphabetical character. Thus, LET a=5
, LET Apples=5
, LET a$="Hello"
, DIM a(10)
and DIM a$(10)
are all good, while LET Apples$="Fruit"
, DIM Apples(10)
and DIM Apples$(10)
are not.
The long variable names allowed for numeric variables can include alphanumeric characters after the first character, so LET a0=5
is allowed but not LET 0a=5
. The long variable names can also include spaces, which are ignored, so LET number of apples = 5
is the same as LET numberofapples = 5
Official versions
4K BASIC
- 4K BASIC for ZX80[70] (so named for residing in 4 KiB read-only memory (ROM)), was developed by John Grant of Nine Tiles for the ZX80. It has integer-only arithmetic.
- System Commands:
NEW
RUN
LIST
LOAD
SAVE
- Control Statements:
GOTO
IF
THEN
GOSUB
STOP
RETURN
FOR
TO
NEXT
CONTINUE
- Input/Output Statements:
PRINT
INPUT
- Assignment Statement:
LET
- Other Statements:
CLEAR
CLS
DIM
REM
RANDOMIZE
POKE
- System Commands:
8K BASIC
- 8K BASIC is the ZX81 BASIC (also available as an upgrade for the ZX80[2]), updated with floating-point arithmetic by Steve Vickers, so named for residing in 8 KiB ROM.
- Statements:
PRINT
RAND
LET
CLEAR
RUN
LIST
GOTO
CONT
INPUT
NEW
REM
PRINT
STOP
BREAK
IF
STOP
FOR
NEXT
TO
STEP
SLOW
FAST
GOSUB
RETURN
SAVE
LOAD
CLS
SCROLL
PLOT
UNPLOT
PAUSE
LPRINT
LLIST
COPY
DIM
POKE
NEW
- Functions:
ABS
SGN
SIN
COS
TAN
ASN
ACS
ATN
LN
EXP
SQR
INT
PI
RND
FUNCTION
LEN
VALSTR$
NOT
CODE
CHR$
INKEY$
AT
TAB
INKEY$
PEEK
USR
- Statements:
48 BASIC
- 48 BASIC is the BASIC for the original 16/48 KB RAM 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[71]
128 BASIC
- 128 BASIC is the BASIC for the ZX Spectrum 128.[72] It offers extra commands and uses letter-by-letter input.
- New commands:
LOAD !
SAVE !
MERGE !
ERASE !
PLAY
SPECTRUM
- New commands:
+3 BASIC
- +3 BASIC is the BASIC with disk support for the ZX Spectrum +3 and +2A.[71]
- New commands:
FORMAT
COPY
- New commands:
T/S 2000 BASIC
- T/S 2000 BASIC is used on the Spectrum-compatible Timex 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 the AY-3-8192 sound chip.STICK
is a function that gives the position of the internal joystick (Timex Sinclair 2090).
BASIC64
- BASIC64 by Timex of Portugal, is a software extension[73] to allow better Basic programming with the 512×192 and dual display areas graphic modes available only on Timex 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 for TC 2048 and a version for T/S 2068 and TC 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
- Timex Extended Basic by Timex of Portugal is used on the Timex Computer 3256, adding TEC - Timex Extended Commands commands supporting the AY-3-8912 sound chip, RS-232 network and the 512x192 pixel high resolution graphic mode.[74][75]
- RAM drive commands:
LOAD!
SAVE!
CAT!
MERGE!
ERASE!
CLEAR!
- RS-232 commands:
FORMAT!
LPRINT
LLIST
- AY-3-8912 commands:
BEEP!
- 512x192 resolution commands:
SCREEN$
DRAW!
PLOT!
CIRCLE!
- RAM drive commands:
Other versions, extensions, derivatives and successors
Interpreters for the ZX Spectrum family
Several ZX Spectrum interpreters exist.[76]
- Beta BASIC by Dr. Andy Wright, was originally a BASIC extension, but became a full interpreter.[77]
- YS MegaBasic by Mike Leaman.[76][78]
- ZebraOS by Zebra Systems in New York, a cartridge version of T/S 2000 BASIC that used the 512×192 screen mode.[79]
- Sea Change ROM by Steve Vickers and Ian Logan, modified by Geoff Wearmouth, a replacement ROM with an enhanced Sinclair BASIC.[80]
- Gosh Wonderful by Geoff Wearmouth, a replacement ROM that fixes bugs and adds a tokenizer, stream lister, delete and renumber commands.[76][81]
- OpenSE BASIC (formerly SE BASIC) by Andrew Owen, a replacement ROM with bug fixes and many enhancements including ULAplus[82] support, published as open source in 2011[83][84][85]
Compilers for the ZX Spectrum family
Several ZX Spectrum compilers exist.[76]
- HiSoft COLT Compiler (a.k.a. HiSoft COLT Integer Compiler)[86][87]
- HiSoft BASIC (a.k.a. HiSoft BASIC Compiler), an integer and floating-point capable compiler[88][89]
- Laser Compiler[90][91]
- Softek 'IS' Integer Compiler[92][93] (successor to Softek Integer Compiler[94])
- Softek 'FP' Full Compiler[95][96]
- ZIP Compiler[97][98]
Derivatives and successors for other computers
- SuperBASIC, a much more advanced BASIC dialect introduced with the Sinclair QL personal computer, with some similarities to the earlier Sinclair BASICs[99]
- SAM Basic, the BASIC on the SAM Coupé, generally considered a ZX Spectrum clone[100]
- ROMU6 by Cesar and Juan Hernandez - MSX[76]
- Spectrum 48 by Whitby Computers - Commodore 64[76]
- Sparky eSinclair BASIC by Richard Kelsh, an operating system loosely based on ZX Spectrum BASIC - Zilog eZ80[101]
- Sinbas by Pavel Napravnik - DOS[76]
- Basic[102] (and CheckBasic[103]) by Philip Kendall - Unix
- BINSIC[104] by Adrian McMenamin, a reimplementation in Groovy closely modelled on ZX81 BASIC - Java
- BASin[105] by Paul Dunn, a complete Sinclair BASIC integrated development environment (IDE) based on a ZX Spectrum emulator[76] - Windows
- SpecBAS[106] (a.k.a. SpecOS) by Paul Dunn, an integrated development environment (IDE) providing an enhanced superset of Sinclair BASIC - Windows, Linux, Pandora, and Raspberry Pi
- ZX-Basicus[107] by Juan-Antonio Fernández-Madrigal, a synthesizer, analyzer, optimizer, interpreter and debugger of Sinclair BASIC 48K for PCs, freely downloadable for Linux and Windows.
See also
- List of computer system emulators § Sinclair ZX80
- List of computer system emulators § Sinclair ZX81
- List of computer system emulators § Sinclair ZX Spectrum and clones
Notes
- ^ Optional parameters are enclosed in [square brackets]
- ^ These assume the computer is in K (keyword) mode, which it normally is at the start of a line when entering BASIC. On the Spectrum 16K and 48K, Extended Mode is entered by pressing CAPS SHIFT and SYMBOL SHIFT simultaneously rather than the EXTENDED MODE key that is present on the Spectrum+ and later models.
- ^ a b c “False” in Sinclair BASIC equates to 0 (zero), everything else equates to “true”. Functions that return true-or-false values thus actually return 0 for false and 1 for true, while
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. - ^ a b c The available numbers for colours are:
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 in
INK
andPAPER
may also be set to 9 for “contrast” — that is, to put a dark colour on a light background or vice versa automatically. - ^ a b c d e f
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. - ^ a b c d e f
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 the ZX Microdrive. (The shadow ROM was paged when the BASIC interpreter detected a syntax error, which is why most ZX Microdrive commands use a"*"
). - ^ a b Unlike many other BASIC dialects, Sinclair Basic did not include the
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 TO
- ^ The Spectrum’s display memory starts at address 16384 and is 6912 bytes long
- ^ A string inside a string must have its quotes doubled in Sinclair BASIC
References
- ^ Garfield, Simon (28 February 2010). "Sir Clive Sinclair: "I don't use a computer at all"". The Guardian. Retrieved 23 May 2011.
He is keen to credit [...], not least Nine Tiles, the company that made the Basic operating software.
- ^ a b "ZX80 - 8K BASIC ROM Upgrade". www.fruitcake.plus.com.
- ^ Dunn, Paul (7 December 2022), SpecBAS, retrieved 12 December 2022
- ^ "CSDb". Commodore 64 Scene Database. Retrieved 12 December 2022.
- ^ a b c d Vickers 1983, p. 59.
- ^ a b Vickers 1983, p. 70.
- ^ a b c Vickers 1983, p. 85.
- ^ Vickers 1983, p. 69–70.
- ^ a b c d Vickers 1983, p. 101.
- ^ Vickers 1983, p. 116.
- ^ Vickers 1983, p. 135.
- ^ a b Vickers 1983, p. 93.
- ^ Vickers 1983, p. 113.
- ^ Vickers 1983, p. 110–111.
- ^ Cambridge Communication 1983, p. 15.
- ^ a b Vickers 1983, p. 91.
- ^ a b Vickers 1983, p. 123.
- ^ a b c Vickers 1983, p. 103.
- ^ "World of Spectrum - Documentation - ZX Spectrum manual - Chapter 24". worldofspectrum.org.
- ^ Vickers 1983, p. 168.
- ^ Vickers 1983, p. 19.
- ^ a b c Vickers 1983, p. 151.
- ^ a b Vickers 1983, p. 68.
- ^ a b Vickers 1983, p. 41.
- ^ a b c Vickers 1983, p. 142.
- ^ a b c Vickers 1983, p. 60.
- ^ Vickers 1983, p. 79–81.
- ^ Vickers 1983, p. 11–123.
- ^ Cambridge Communication 1983, p. 18.
- ^ Vickers 1983, p. 66.
- ^ Cambridge Communication 1983, p. 19.
- ^ Vickers 1983, p. 31.
- ^ a b Vickers 1983, p. 32.
- ^ a b Vickers 1983, p. 37.
- ^ a b Vickers 1983, p. 25.
- ^ a b Vickers 1983, p. 159.
- ^ a b Vickers 1983, p. 110.
- ^ Vickers 1983, p. 131.
- ^ a b c d Vickers 1983, p. 16.
- ^ a b Vickers 1983, p. 112.
- ^ Vickers 1983, p. 57.
- ^ a b Vickers 1983, p. 13.
- ^ Vickers 1983, p. 144.
- ^ Vickers 1983, p. 15.
- ^ a b Vickers 1983, p. 67.
- ^ Vickers 1983, p. 142–143.
- ^ Vickers 1983, p. 147.
- ^ Cambridge Communication 1983, p. 39.
- ^ Vickers 1983, p. 31–32.
- ^ Cambridge Communication 1983, p. 22.
- ^ Vickers 1983, p. 129.
- ^ Vickers 1983, p. 130.
- ^ Vickers 1983, p. 121.
- ^ Vickers 1983, p. 163.
- ^ Vickers 1983, p. 74.
- ^ Vickers 1983, p. 42.
- ^ Vickers 1983, p. 73.
- ^ a b Vickers 1983, p. 14.
- ^ Vickers 1983, p. 143.
- ^ Vickers 1983, p. 58.
- ^ Vickers 1983, p. 69.
- ^ Vickers 1983, p. 32, 51.
- ^ Vickers 1983, p. 180.
- ^ Vickers 1983.
- ^ Vickers 1983, p. 141.
- ^ Vickers 1983, p. 7–8.
- ^ "Picture of ZX80".
- ^ "Spectrum 128 ROM Disassembly - Spanish Spectrum 128". www.fruitcake.plus.com.
- ^ Sinclair (1985). ZX Spectrum 128 Introducción y Guía de Funcionamiento. Sinclair Research Ltd and Investronica, S. A. p. 9.
- ^ "Sinclair ZX80 User Manual 4K Basic for ZX80".
- ^ a b "World of Spectrum - Documentation - ZX Spectrum +3 - Chapter 7". worldofspectrum.org.
- ^ "World of Spectrum - Documentation - ZX Spectrum 128 Manual Page 6". worldofspectrum.org.
- ^ "Timex tech info - Basic 64 for TC2048". timex.comboios.info.
- ^ "Microsete N.º46, Maio 1987" (PDF). loadzx.com.
- ^ "Timex Computer 3256, Timex Portugal". k1.spdns.de.
- ^ a b c d e f g h "World of Spectrum - Sinclair BASIC - Home of the Sinclair Extended Basic Project". www.worldofspectrum.org. Archived from the original on 13 October 2002.
- ^ "Beta Basic at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "YS MegaBasic at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "Zebra OS64 at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "Sinclair BASIC history - Sinclair Wiki". sinclair.wiki.zxnet.co.uk.
- ^ "The Incomplete Spectrum ROM Assembly". Archived from the original on 1 September 2015.
- ^ "ULAplus". sites.google.com.
- ^ "ZX Interface 2 - SE BASIC (3rd Party ROM Cartridge)". www.fruitcake.plus.com.
- ^ "OpenSE BASIC". SourceForge. 16 April 2013.
- ^ "OpenSE BASIC at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "World of Spectrum - HiSoft COLT Compiler". World of Spectrum.
- ^ "HiSoft COLT Compiler at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "World of Spectrum - HiSoft BASIC". World of Spectrum.
- ^ "HiSoft BASIC at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "World of Spectrum - Laser Compiler". World of Spectrum.
- ^ "Laser Compiler at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "World of Spectrum - Softek 'IS' BASIC Compiler". World of Spectrum.
- ^ "Integer Compiler at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "World of Spectrum - Integer Compiler". World of Spectrum.
- ^ "World of Spectrum - Softek 'FP' Full Compiler". World of Spectrum.
- ^ "Softek 'FP' Full Compiler at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ "World of Spectrum - ZIP Compiler". World of Spectrum.
- ^ "ZIP Compiler at Spectrum Computing - Sinclair ZX Spectrum games, software and hardware". Spectrum Computing. Retrieved 13 December 2022.
- ^ Berry, Stephen (1984). "QL Keywords". Archived from the original on 22 February 2017. Retrieved 27 June 2023.
{{cite web}}
: CS1 maint: unfit URL (link) - ^ "Sam Coupe Scrapbook: Sam BASIC". www.mono.org. Retrieved 13 December 2022.
- ^ "Sparky eZX BASIC Project". rk-internet.com.
- ^ "Philip Kendall - Basic". www.shadowmagic.org.uk.
- ^ "Philip Kendall - CheckBasic". www.shadowmagic.org.uk.
- ^ "Binsic Is Not Sinclair Instruction Code". 25 June 2012.
- ^ "ZX Spin and BASin - ULAplus". sites.google.com.
- ^ "ZXDunny/SpecBAS". 5 June 2021 – via GitHub.
- ^ "ZX-Basicus: analyzer/synthesizer/optimizer/interpreter of Sinclair BASIC programs for the ZX Spectrum 48K". jafma.net.
Bibliography
- Ardley, Neil (1984). Sinclair ZX Spectrum+ User Guide. Dorling Kindersley in association with Sinclair Research. ISBN 0-86318-080-9.
- Vickers, Steven (1982). Sinclair ZX Spectrum BASIC Programming. Sinclair Research.
- Vickers, Steven (1983). Sinclair ZX Spectrum BASIC Programming (2 ed.). Sinclair Research.
- Cambridge Communication (1983). Sinclair ZX Spectrum Microdrive and Interface 1 manual. Sinclair Research.
External links
- Sinclair ZX Spectrum BASIC Programming: The original 1982 manual by Steven Vickers (referenced above)
- Sinclair ZX81 Basic Programming Archived 2007-04-22 at the Wayback Machine: also by Vickers
- The History of Sinclair BASIC: By Andrew Owen
- Timex Computer World: Basic 64 user manual for Timex Computer 2048
- Sinclair BASIC grammar: A LL(1) grammar specification for parsing Sinclair BASIC 16/48K