For other BASIC language versions see the Category:BASIC
Locomotive BASIC was a BASIC interpreter for the Amstrad CPC range of computers.
It was availlable directly from in-built ROMs on CPC old generation and on the Plus System Cartridge for the Plus range.
Description
Locomotive BASIC, was one of the best and fastest BASIC implementations of the era. The language benefited both from a clean, well-thought out implementation of the core language by Locomotive, and by the excellent firmware of the CPC, which lent most of its advanced features to the BASIC.
Unlike the competing Commodore 64, it featured a comprehensive graphic capabilities with its PLOT, DRAW, PAPER, INK, PEN, BORDER and (in BASIC 1.1) FILL commands. It had extensive sound commands, granting control of the AY-3-8912 via the firmware's volume and tone envelope system. With the SOUND command, you could select channels, set envelopes, pitch, noise and volume. That was something unmatched by other computers of that era.
Also there was simple interface for memory management, with MEMORY and LOAD commands. The latter allowed for loading of raw screen data, thus providing easy picture showing. Both through this (combined with CALL, PEEK and POKE) and the firmware's RSX system, it was easy to mix BASIC and assembly code, thereby speeding up programs by coding the slowest parts directly in machine code. Many successful programs, including games such as Radzone and applications such as PowerPage, made use of this technique.
With DEF FN, ON variable GOTO and ON variable GOSUB, Locomotive BASIC provided the rudiments of "structured programming", though nowhere near the extent of the PROCedures of BBC Basic.
All in all, if you compare BASIC interpreters of that era, the Locomotive's seems to be the best 'all-rounder' regarding the combination of speed and complexity, and still some of its features were unmatched by others.
If you are interested in more information about the different versions of the CPC's BASIC and the technical details, you can have a look at the article "Technical information about Locomotive BASIC".
History
The CPC implementation of Locomotive BASIC was developed directly from Locomotive Software's existing Z80 BASIC. The existence of this is cited as one of the reasons Locomotive requested that Amstrad change the CPC's processor from a 6502 to a Z80.
The 464 shipped with BASIC 1.0 on ROM.
The language was revised and debugged for the 664, 6128 and Plus machines to become BASIC 1.1. Changes were minor but significant for the programmer, and included:
- DEC$ bug removed (in BASIC 1.0, it required two opening brackets and was undocumented)
- Better handling of string arguments to RSXs (|DIR,"*.BAS" rather than a$="*.BAS":|DIR,@a$)
- DATA statements can appear anywhere within a line; in BASIC 1.0, they had to be at the end of a line
- FILL command (fill area with solid colour)
- COPYCHR$ function (fetch character from screen)
- Better garbage collection
- Some number-handling bugs removed (e.g. in FOR loops with negative start/end values)
- FRAME (CALL &BD19)
- Extra, optional 'plotting mode' parameter for DRAW/PLOT commands (supported only through control codes on BASIC 1.0)
- GRAPHICS PAPER, GRAPHICS PEN commands
- ON BREAK CONT (disable ESCape)
- CLEAR INPUT (flush keyboard buffer)
- The AUTO command show the whole line if it exist, it only printed a * on the 464
Some parts of 'BASIC' were actually housed in the firmware ROM, but were not officially accessible to other programs. This included the line editor.
The 'pure BASIC' parts of Locomotive BASIC - i.e. those not concerned with CPC-specific firmware and hardware features - were upgraded to become Mallard BASIC, the CP/M language shipped with the PCW. This also featured exceptionally advanced random-access file handling, a feature missing from the CPC.
Command list
Commands and operators
AFTER
‹time delay›[,
‹timer number›] GOSUB
‹line number›
- Waits for ‹time delay›/50 seconds and then jumps to the subroutine at ‹line number›. There are 4 delay timers from 0 to 3 which can be specified with ‹timer number›. If omitted ‹timer number› defaults to 0.
- In the case of parallel task has 3 the highest and 0 the lowest priority.
- With DI or EI you can disable or enable the timing interrupt. With REMAIN <timer number> you can also disable an AFTER or EVERY construct and stores the "remaining" time (> REMAIN)
AUTO
[‹line number›][,
‹increment›]
- Automatically generates line numbers starting at ‹line number› with ‹increment› after each entered line number. Use [ESC] to leave AUTO mode. Default values for ‹line number› and ‹increment› are 10.
- Example:
-
AUTO 100,5 :REM generates line numbers 100, 105, 110...
BORDER
‹colour›[,
‹colour›]
- Changes the colour of the border. If the second argument is supplied the border flashes between the two colours.
CALL
‹address expression›[,
‹list of: parameter›]
- Allows a machine code routine to be called by BASIC. Variables, string values and constants can be passed to the routine. Values of any supported type can be passed back by supplying a variable with
@
in front of it. This passes the address of the variable to the routine although it doesn't implicitly know the data type. - Example:
-
CALL 0 :REM resets the computer completely
CAT
- Displays the names of the files on the tape or disc. Tape files are displayed in the order they are encountered. Disc files are sorted alphabetically by ACSII code. Only files matching the current user are displayed. Files marked as system are not displayed.
- Examples:
-
CAT :REM lists all disc files in alpha-numeric (ASCII) order
-
|TAPE :CAT :REM lists names of all tape files in their storage order
CHAIN
‹file name›[,
‹line number expression›]
- Enables the specified program to be loaded and RUN automatically. If the optional parameter ‹line number expression› is specified, the program execution will commence from that line.
CHAIN MERGE
‹file name›[,
‹line number expression› | [,
[‹line number expression›],DELETE
‹line number range›]]
- Loads the specified program from tape or disc, merges it into the program in memory, and starts execution of the merged program. The parameter
DELETE
‹line number range› is used to delete part of the original program before running it, if required.
CLEAR
- Clears all variables from memory, leaving the program in memory unchanged. All open files are abandoned.
- The command clear inside a subroutine (GOSUB... RETURN) will also clear the "stack pointer" address of the gosub heap. That means that a RETURN won't work and a GOTO has to be used instead.
CLG
[‹masked ink›]
- Clears the graphics screen to colour specified by ‹masked ink›. If parameter ‹masked ink› is not specified then the graphics screen is cleared to the colour specified by the GRAPHICS PAPER statement.
CLOSEIN
- Closes any input file (tape or disc).
CLOSEOUT
- Closes any output file (tape or disc).
CLS
[#
‹stream expression›]
- Clears the window specified by ‹stream expression›. If ‹stream expression› is omitted it defaults to #0 (usually the whole screen). The text cursor of the stream is moved to the upper left corner.
CONT
- CONTinues program execution interrupted either by [ESC] [ESC] or as a result of STOP within a program. A program cannot be continued after being modified.
CURSOR ‹expression›
- ‹expression› must be either 0 or 1.
DATA x1[,x2,x3...]
- Defines a data section to be used by READ calls.
- Data values can be of any type (integer, real or string) as long as the corresponding READ calls use a variable of the right type.
- Example:
10 DATA "Hello, world!", 42 20 READ message$:PRINT message$ 30 READ answer:PRINT "The answer is:";answer
- See also: READ, RESTORE
DEF
- [...]
DEFINT letter range
- Forces all variables(s) starting with the specified letter(s) to be string variables. The s does not need to be added to DEFSTR variable names.
- Example:
10 DEFSTR N - sets all variables starting with letter N as strings.
DEFREAL
- [...]
DEFSTR
- Sets the default for variable(s) with the specified first letter(s) to integer. The letter range could be an inclusive range A-Z
- Example:
10 DEFINT F,S ..... (or 10 DEFINT A-Z) 20 FIRST=111.11:SECOND=22.2 30 PRINT FIRST,SECOND - prints 111 22
DEG
- Switch to degrees mode for trigonometric functions (SIN, COS...).
See also: RAD
DELETE [first line][-[last line]]
- Deletes the current program completely (without arguments) or only the given line or line range. Even
-
DELETE -
- is legal, it has the same effect as
-
DELETE
- The lines specified do not have to exist, all lines matching the range will be deleted and having no matches does not cause an error.
DI
- Disables interrupts (but not[ESC]) until re-enabled by EI command or by RETURN at end of an interrupts service routine.
DIM a[%|!|$](d1[,d2[,...]])
- Creates array
a
with single or multiple dimensions. You may optionally specify integer (%
), real (!
) or string ($
) type otherwise it defaults to the current type set for the first letter of the array name.d1
is size of first dimension-1,d2
is size of second dimension-1 and so on.DIM x(10)
will create an array with 11 elements,x(0)
is the first element,x(10)
is the eleventh and last. You can specify as many dimensions as will fit on one 255 character line, which is a maximum of 125. Trying to create an array that already exists will generate anArray already dimensioned
error. If an array is not specified byDIM
before being accessed, each dimension value defaults to 10. The maximum dimensions that can be created this way is three.
DRAW x,y[,i1 | ,[i1],i2]
- Draws a line from the current cursor position to position x,y. i1 specifies colour, i2 is the drawing style.
i2 = 0 normal colour i2 = 2 AND colour i2 = 1 XOR colour i2 = 3 OR colour
Example:
- CLG 2
- DRAW 500,400,0 :REM draws a line from 0,0 to 500,400
DRAWR xr, yr, [[i1][,i2]]
- Draws a line from current graphics cursor position to current cursor x position + xr, current cursor y position + yr. i1 and i2 as DRAW.
- Example:
Move 200,200 DRAWR 100,100,0 - draws a line from 200,200 to 300,300
EDIT line
- Copies one program line to screen in edition mode.
EI
- Enable interrupts which have been disabled by DI
END
- Indicates end of program
ENT
- [...]
ENV
- [...]
ERASE v1[% | ! | $][,v2[% | ! | $][,...]]
- Erases the specified array(s) and frees the memory used. Must specify existing array(s) or an
Improper argument
error will be generated.
ERL
- Returns the line number of the last error encountered.
ERROR i
- Returns the error message whose error code number is i.
EVERY i[,t] GOSUB ln
- BASIC branches to the subroutine at line ln every i/50 seconds.
FILL i
- Fills an area of a graphics screen i colour i (0-15). Default value of i is the current graphics pen colour. Only available in Basic 1.1.
FN
BASIC allows the program to define and use simple value returning functions. DEF FuNction is the definition part of this mechanism and creates program-specific function which works within the program in the same way as a function such a COS operates as a built-in function of BASIC. It may be invoked throughout the program. Variable types must be consistent and the DEF FN command should be written in part of the program outside the execution loop.
Syntax : DEF FN<name>[(<formal parameters>)]=<general expression>
Example: "with the definition of..."
10 gn=9.80665 20 DEF FNgrv=s0+v0*t+0.5*gn*t^2 30 s0=0:v0=0:t=5 40 PRINT "...after";t;"seconds your dropped stone falls";FNgrv;"metres"
"the results are..."
...after 5 seconds your dropped stone falls 122.58315 metres
FOR TO STEP NEXT
- [...]
FRAME
- Smooths character and graphics movement and reduces flicker (waits for a VSYNC signal). Only available in Basic 1.1. On a CPC 464 you can use CALL &BD19 instead.
GOSUB i
- Jumps to subroutine which is given as argument.
- Example:
10 PRINT "Calling subroutine" 20 GOSUB 100 30 PRINT "Back from subroutine" 40 END 100 REM Begin of the subroutine 110 PRINT "Subroutine started" 120 RETURN
GOTO i
- Jumps to the line number which is given as argument.
- Example:
10 GOTO 100 20 REM not executed 30 REM not executed 100 PRINT "Hello World!"
- GOTO is the simplest form of a jump or creating a loop without condition controll.
- Example: (unconditional and endless loop)
10 PRINT "#"; 20 GOTO 10
- Combine the GOTO command with an IF...THEN...ELSE instruction for creating a condition-controlled loop with the test at the end. Helpful because the Locomotive Basic has no practical DO...WHILE... loop.
- Example: (condition at the end)
10 I=1 20 PRINT I 30 I=I+1 40 IF I<25 THEN GOTO 10 50 END
GRAPHICS
- [...]
IF THEN ELSE
- Asks for a choice with the IF...THEN...ELSE statement.
- IF compares the entry condition in a logical way
- THEN contains instruction if the comparison is true
- ELSE contains instruction if it's false.
- Example:
10 INPUT "guess a figure:",f 20 IF f=10 THEN PRINT "right": END: ELSE GOTO 10
- In case of nested choices there's a possibility to that with an IF...THEN instruction but not very recommended:
10 INPUT "guess a figure:",f 20 IF f=10 THEN PRINT "right": END: ELSE IF f<10 THEN PRINT "too small" ELSE PRINT "too big" 30 GOTO 10
- Other nested structures like IF...THEN...ELSE...ELSE won't work first because the Locomotive Basic only looks after the first ELSE instruction found and can't execute more single commands as a block for a certain condition in comparision to e.g. "PASCAL" > begin...end-block, "C" > {...}-block.
INK
- [...]
INPUT
- [...]
KEY
- [...]
LET
- Used to define variables. You don't need to use the LET command because it is just a command which was added for compatibility reasons.
- Example:
10 LET a$ = "hello world" 20 PRINT a$
LINE INPUT
‹variable›[,
‹variable›]
- [...]
LIST
[‹line number›][-
[‹line number›]]
- [...]
LOAD ‹file name›[<code>,
‹address›]
- [...]
LOCATE x,y
- Moves the text cursor to the x,y location.
- x starts at 1 on the left and goes up to 20 (in mode 0), 40 (in mode 1) or 80 (in mode 2).
- y starts at 1 at the top and ends at 25 at the bottom.
MASK [i1][,i2]
- Sets bits in each adjacent group of 8 pixel on (1) or off (0) according to binary value of i1 (0-255). i2 determines whether the first point of the line is to plotted (1) or not (0).
- Example:
10 CLG 2:MASK 1:MOVE 0,0:DRAW 500,400 20 MASK 15:MOVE 0,0:DRAW 500,400
MEMORY add
- Allocates the amount of memory to be used by BASIC by setting the address of the highest byte it may use.
MERGE
- [...]
MID$
- [...]
MODE
- Changes the screen mode: MODE 0 is 160x200 in 16 colors, MODE 1 is 320x200 4 colors and MODE 2 is 640x200 2 colors.
MOVE x,y [[,i1][,i2]]
- Moves the graphic cursor to position x,y. The parameter i1 may be used to change the pen (drawing) colour. The parameter i2 specifies the logical colour, as in DRAW.
MOVER
- [...]
NEW
- [...]
ON BREAK CONT
- Prevents the interruption of program execution by the ESC key.
ON BREAK GOSUB ln
- Passes control to subroutine at line ln when ESC ESC pressed.
ON BREAK STOP
- Restores normal function of ESC key during program execution.
ON ERROR GOTO ln
- Passes the control to line ln if an error is detected in the program.
- ON ERROR GOTO 0, Turns of the error trap, and restores normal error processing.
ON variable GOTO ln x1, x2, x3, x4, ...
- In case of passing more choices ON variable GOTO ln x1, x2, x3, x4, ... points to a table with the jumping target.
- Example:
10 PRINT "1. LOAD - 2. SAVE - 3. EXIT" 20 INPUT choice 30 ON choice GOTO 1000, 2000, 3000 40 CLS: GOTO 10 1000 PRINT "1. LOAD":END 2000 PRINT "2. SAVE":END 3000 END
- In case that the variable choice won't fullfil the condition (in a range between line 0 and 65535) the next instruction will be executed (here: Line 40). If "choice" is smaller than 0 an error will occur.
ON variable GOSUB ln x1, x2, x3, x4, ...
- In case of passing more choices targeting to SUBROUTINES ON variable GOSUB ln x1, x2, x3, x4, ... points to a jumping table.
- Example:
10 PRINT "1. LOAD - 2. SAVE - 3. EXIT" 20 INPUT choice 30 ON choice GOSUB 1000, 2000, 3000 40 CLS: GOTO 10 1000 PRINT "1. LOAD":RETURN 2000 PRINT "2. SAVE":RETURN 3000 END
- In case that the variable choice won't fullfil the condition (in a range between line 0 and 65535) the next instruction will be executed (here: Line 40). If "choice" is smaller than 0 an error will occur.
OPENIN "datafile"
- Opens the specified data file for reading.
OPENOUT "datafile"
- Opens the specified data file for writing.
ORIGIN
- [...]
OUT add,i
- Outputs the value of i (0-255) to the I/O address add.
PAPER
- [...]
PEN
- [...]
PLOT
- [...]
PLOTR
- [...]
POKE add
- Alters contents of memory location add to value i (0-255)
PRINT
- [...]
RAD
- Switch to radians mode for trigonometric functions (SIN, COS...).
- See also: DEG
RANDOMIZE [seed]
- Resets the pseudo-random generator to the given seed. What is strange is that if no seed is given, one is interactively prompted for.
- A common idiom to have a random random seed is to do:
RANDOMIZE TIME
The algorithm used for randomizing is the following: the generator starts with the seed, adds 1, multiplies by 75 (fiddle factor), divides by 65537 and then uses the remainder -1.
READ variable
- Gets the next data item (from DATA commands), stores it in the given variable and moves to the next item.
The variable must be of the correct type.
See also: DATA, RESTORE
RELEASE
- [...]
REM [any text]
- Introduces a comment.
RENUM
[‹newLine›][,
‹oldLine› | ,
[‹oldLine›],
‹step›]
- Renumbers the lines of the current program.
- By default, the whole program is renumbered starting at line 10 with multiples of ten. Any parameter that is left out defaults to 10. It is important to note that jumps (
GOTO
,GOSUB
and the like) are automatically converted to the new line numbers.
- The whole set of parameters can be used to renumber only the last part of a program.
- Example:
10 GOTO 20 20 GOTO 30 30 GOTO 10
- becomes, after calling
RENUM 100,20,5
10 GOTO 100 100 GOTO 105 105 GOTO 10
RESTORE [line]
- Resets the data pointer used by READ. When used without parameters, resets the pointer to the first data in the program. Otherwise, resets the pointer to the given line number.
- Example:
10 DATA 10,11,12,13,14 20 DATA 20 READ i:PRINT i 10 Ready READ i:PRINT i 11 Ready RESTORE Ready READ i:PRINT i 10 Ready RESTORE 20 Ready READ i:PRINT i 20 Ready
- See also: DATA, READ
RESUME
- [...]
RETURN
- Terminates a subroutine and returns control to the line following the GOSUB call (see GOSUB)
RUN [line]
- Runs the current program, optionally starting at a given line. If no line number is given, starts at the first line.
SAVE
- [...]
SOUND
- [...]
SPC
- [...]
SPEED
- [...]
SQ (channel)
- Returns a bit significant integer showing state of the sound queue for specified channel where channel 1,2,3, = A, B, C
- Bits 0,1 and 2 Number of free entries in the queue
- Bits 3,4 and 5 Redezvous state at head of the queue
- Bit 6 Head of the queue is held
- Bit 7 Channel is currently active
STOP
- Breaks program execution at line containing the STOP statement. The message BREAK in is output with the line number.
SUB
- [...]
SWAP
- [...]
SYMBOL n,i1[,i2,i3,i4,i5,i6,i7,i8]
- Redefines the appearance of the character at index n.
- Each of the following eight integers defines the contents of one pixel row, starting at the top of the character.
- Each character fits in an 8x8 pixel grid.
- Missing lines are considered as empty.
- Example:
SYMBOL 255,255,129,129,129,129,129,129,255 PRINT CHR$(255)
- Defines character 255 to look like an empty square and prints it.
- Initially, only characters with indices ranging from 240 to 255 can be redefined.
- See also SYMBOL AFTER to allow redefinition of arbitrary characters.
SYMBOL AFTER n
- Allows the redefinition of character symbols from index n included.
- Symbol redefinitions are made using the SYMBOL command above.
- Initially, only symbols from index 240 to 255 can be redefined. This initial situation can be restored with SYMBOL AFTER 240. Symbol previously redefined are restored to their original appearance.
TAB
- [...]
TAG [#st]
- Allows text to print at graphics cursor position.
- see TAGOFF
TAGOFF [#st]
- Directs text to stream st printing it at previous text cursor position.
TROFF
- Turns off the program flow trace (see TRON)
TRON
- Turns on the program flow trace for debugging. Causes the line number of each statement executed to be displayed.
USING
- The USING assignement defines the format of the PRINT output. Its appointment happens by characters where each has a certain meaning.
Numbers / Figures
- the character:
- # stands for a figure between 0 - 9
- . stands for a decimal point
- + generates a positive sign if the value is positive
- - generates a negative sign if the value is nagative
- ** generates a asterix for each empty "location" before the printed character
- $$ generates a Dollar characters before the printed character (the same with the pound note)
- , generates a comma every each three decimals (thousands per figure) and has to be set before the decimal point or at the end if without a decimal point.
- ^ generates a scientific notation (with exponents) and a the end of the format appointment
Strings
- the character:
- ! prints out only the first character
- \xxx\ prints out only with x-numbers defined length of the string (from left to right). x means a blank sign made with the space bar
- & the whole string is printed out as given (unknown function)
- a print output (numbers) with "%" in the beginning shows that not enough positions has to be declared (at all or before the decimal point).
- Example:
10 figure=123456789 20 word$="Hello" 30 print using "+**,##########";figure 40 print using "\ \";word$ creates following output: *****+12,345,679 Hel
WAIT add, i1[,i2]
- Waits until the I/O port at add returns a value (0-255). The value returned is XORed with i2 and the ANDed with i1. This is repeated until a non-zero result occurs.
WHILE WEND
- [...]
WIDTH
- [...]
WINDOW
- [...]
WRITE [#st,] v[$], v[$]
- Writes the values of the specified variable to the specified stream.
- Example:
10 OPENOUT "DUMMY" 20 INPUT A$,A 30 WRITE #9,A$,A 40 CLOSEOUT
ZONE i
- Changes the width of the print zone. Default is 13.
Operators
AND
- [...]
MOD
- [...]
NOT
- NOT executes a bit for bit negation of the current value. The output is a 16-Bit-Word.
- Example:
10 value1=1 20 value2=NOT value1 30 PRINT value2 run -2
- for a better understanding...
10 value1=1 20 PRINT HEX$(value1):PRINT BIN$(value1,8) 30 value2=NOT value1 40 PRINT HEX$(value2):PRINT BIN$(value2,8) run 1 00000001 FFFE 1111111111111110
OR
- [...]
XOR
- [...]
Functions
ABS (n)
- Returns the absolute value of n by ignoring the sign value.
- Example
PRINT ABS(-3.5) - prints 3.5
ASC (s)
- Returns ASCII code number of first character of string s
ATN (n)
- Returns the arctangent of n.
BIN$ (i1,[i2])
- Returns binary representation of i1 between -32768 and 65535. The number of binary digits (0s and 1s) is specified by i2 (0-16)
- Example:
PRINT BIN$(66,8) - prints 01000010
CHR$ (n)
- Returns the character for a given index n. For instance CHR$(65) returns the character 'A'. Valid indices range from 0 (zero) to 255.
- As an example, try the following basic program :
10 print chr$(208+rnd(2));:goto 10
- It will draw a random maze with characters 208 and 209, which are an horizontal and a vertical bar.
CINT (n)
- Returns rounded up integer value of n between -32768 and 32767.
- Example:
PRINT CINT(3.8) - print 4
COPYCHR$ (st)
- Copies character from current position in specified stream.
COS (n)
- Returns cosine of n in degrees or radians (se DEG and RAD)
CREAL (n)
- Converts integer n to real numeric variable.
DEC$(n, format)
- Retruns the decimal string representation of n, according to the specified format (see PRINT USING)
DERR
- Gives the most recent error code number returned by Amsdos.
EOF
- Checks to see if end of specified file has been reached during input. Returns 0 (false) until the end of file, then -1 (true)
ERR
- Returns the error code number of the last error encountered.
EXP (i)
- Returns the result of calculating e to the power i.
- Example:
PRINT EXP(1) - prints 2.71828183
FIX (n)
- Removes the fractional part of n (see INT)
FRE (n/se)
- Returns the amount of unused memory, irrespective of the nature or value of the dummy argument inside the bracket.
- Examples:
PRINT FRE(o) or PRINT FRE("hello")
HEX$ (i1, i2)
- Returns a string hexadecimal digit representation of i1 (0-65535). The number of hex digits in the string is given by i2 (0-15)
HIMEM
- Returns address of the highest memory address used by BASIC.
INKEY (i)
- Checks to see if key number i is being pressed.
Value returned [SHIFT] [CTRL] Specified key -1 ignored ignored up 0 up up down 32 down up down 128 up down down 160 down down down
INKEY$
- Checkts the keyboard and returns the string character of the key pressed. The string character returned is normally assigned to a string variable. If no key pressed, a null string is returned.
INP (add)
- Returns value read from the I/O address add
INSTR
- INSTR ([startposition,]explored string, seeking string)
This function looks inside "explored string" after "seeking string" and return a number where the found string appear for the first time. Returns zero if not successfull. Startposition could be a figure between 1 and 255.
a$="ABCD":PRINT INTR(a$,"C") - returns with "3"
INT (n)
- As in FIX if n is positive; if n is negative, it rounds it down.
- Example:
PRINT INT(3.99), INT(-3.99) - prints 3 -4
JOY (i)
- Returns bit-significant value from specified joystick. i = 0 or 1.
Bit Value returned 0(up) 1 1(down) 2 2(left) 4 3(right) 8 4(fire 2) 16 5(fire 1) 32
LEFT$ (se, i)
- Returns a substring of se. The substring begins at the left-most character of se and contains i characters.
- Example:
A$="ABCDEFG":PRINT LEFT$(A$,3) - prints ABC
LEN (se)
- Returns the number of characters in se (0 - 255)
LOG (n)
- Returns the natural logarithm (to base e) of n.
LOG10 (n)
- Returns the logarithm to base 10 of n.
LOWER$ (se)
- Returns a copy of se in which all alphabetical characters are converted to lower case (see also UPPER)
- Example
PRINT LOWER$("A1B2c3") - print a1b2c3
MAX (list of n)
- Returns the maximum value from the given list.
- Example:
PRINT MAX(3,8,25,1,2,9) - prints 25
MIN (list of n)
- Returns the minimum value from the given list (see MAX)
PEEK (add)
- Returns the contents of the specified memory location (0-65535)
PI
- Returns value of PI (3.14159265)
POS (#st)
- Returns column number of print position relative to left edge of text window on stream st. st must be specified.
- Example:
PRINT POS(#0) - prints 1
REMAIN (i)
- Returns count remaining in delay timer i (0-3) then disables it.
RIGHT$ (se,i)
- Returns a substring of length i (0-255) characters from se, ending at the rightmost character of se.
- Example
PRINT RIGHT$("ABCDEFG",3) - prints EFG
RND [(n)]
- Generates the next random number in the current squence if n is positive or omitted. If n = 0, the random number generated will be the same as the last random number generated.
ROUND (n[,i1])
- Rounds n to a number of decimal places or to the power of ten specified by i. If i is negative, the n is rounded to give an absolute integer with i zeros before the decimal point.
- Example:
PRINT ROUND(1562.357,2):PRINT ROUND(1562.375,-2) - prints 1562.36 1600
SGN (n)
- Returns 1 if n is positive, 0 if n = 0, -1 if n is negative.
SIN (n)
- Returns sine of n in degree or radian mode (see DEG and RAD)
SPACE$(i)
- Creates a string containing i spaces (0-255)
SQ (channel)
- Returns a bit significant integer showing state of the sound queue for specified channel where channel 1, 2, 3 = A, B, C.
Bits 0,1 and 2 number of free entries in the queue Bits 3,4 and 5 redezvous state at head of the queue Bit 6 head of the queue is held Bit 7 channel is currently active
SQR (n)
- Returns the square root of n.
STR$(n)
- Returns the string representation of number n.
STRING$
- Returns i copies of the string character specified by s.
- Example:
PRINT STRING$(3,"*") - prints ***
TAN (n)
- Returns the tangent of n. The DEG and RAD commands can be used to force the result to either mode.
TEST (x,y)
- Moves the graphics cursor by x and y and returns the value of the ink at that position.
TESTR (x,y)
- Moves the graphics cursor by x and y relative to its current position and returns the value of ink at that position.
TIME
- Returns time elapsed since the computer was switched on or reset.
- One second = TIME/300.
UNT (add)
- Returns an integer(-32768 to 32767) which is the two's complement of add.
- Example:
PRINT UNT(&FF66) - prints -154
UPPER$(se)
- Gives copy of se with all alphabetic characters in upper case.
VAL(se)
- Returns the numeric value (including signs) of first numeric character(s) in se. Returns 0 if se starts with a non-number.
- Example:
PRINT VAL("-12.34x"),VAL("A-12") - prints -12.34 0
- Exception: if <se> starts with "&" + character (and it's between "A" and "F") the whole character will be handled like a hexadezimal numeric character (...often used in DATA Loaders). The returning numeric value is a signed integer (16-Bit Word).
PRINT VAL("&A") - returns a 10 PRINT VAL("&7FFF") - returns a 32767 PRINT VAL("&8000") - returns a -32768
VPOS (#st)
- Reports the current row (line) position of the text cursor relative to the top of the text windows of the specified stream.
XPOS
- Returns the current horizontal (x) position of the graphics cursor.
YPOS
- Returns the current vertical (y) position of the graphics cursor.
(Please, fill in. Looks like a lot of work ;-) ...)
Error codes
- 1 Unexpected NEXT -
NEXT
encountered without matchingFOR
. - 2 Syntax Error - Typing error or incorrect punctuation.
- 3 Unexpected RETURN -
RETURN
encountered when there was no activeGOSUB
. - 4 DATA exhaused - Trying to
READ
data when data pointer has reached end of data. - 5 Improper argument - The argument for a function is not legal (e.g.
PRINT SQR(-10)
). - 6 Overflow - The computer cannot handle integers smaller than -32768 (signed) or larger than 65535 (unsigned) or floating point numbers greater than ±1.7E38.
- 7 Memory full - Not enough free RAM available to complete the operation. Program too big or control structures too deeply nested.
- 8 Line does not exist - Attempt to
RUN
,GOTO
orGOSUB
a non-existent line number. - 9 Subscript out of range - Value of a subscript in an array is outside of range specified by
DIM
declaration or wrong number of dimensions supplied. - 10 Array already dimensioned - Arrays can only be
DIM
ensioned once within a program. - 11 Division by zero - Trying to divide a number by zero.
- 12 Invalid direct command - Using a statement as a direct command which is not allowed outside a program, e.g.
DEF FN
. - 13 Type mismatch - Wrong data type encountered, string data instead of numeric value or vice versa.
- 14 String space full - String memory area is full.
- 15 String too long - String may not exceed 256 characters.
- 16 String expression too complex - A string expression needs to be broken down into smaller expressions.
- 17 Cannot CONTinue -
CONT
can only be used if program was stopped by [ESC] or aSTOP
in program - not after END. If the program is modified before issuingCONT
you will also get this error. - 18 Unknown user function - A
DEF FN
must be executed before calling anFN
function. - 19 RESUME missing - End of program has been reached while in error processing mode. Use
ON ERROR GOTO
beforeRESUME
. - 20 Unexpected RESUME -
RESUME
is only used in error processing mode,ON ERROR GOTO
statement must be used first. - 21 Direct Command found - A line without a line number has found while loading a file.
- 22 Operand missing - An incomplete expression has been found.
- 23 Line too long - The line contains too many statements.
- 24 EOF met - Trying to input data beyond end of data file.
- 25 FILE type error - Using a program file instead of a data file to read or write (or vice versa).
- 26 NEXT missing - The
NEXT
of aFOR
...NEXT
loop is missing. - 27 File already open - Trying to open an open file. Use
CLOSEIN
orCLOSEOUT
first. - 28 Unknown command - Given when an unknown command follows a
|
. e.g.|DISC
on a CPC464 without AMSDOS installed. - 29 WEND missing - The
WEND
part of theWHILE
...WEND
loop is missing. - 30 Unexpected WEND -
WEND
encountered without a corresponding activeWHILE
. - 31 File not open - Attempting to read from or write to a file without
OPEN
ing it first. - Unknown error - Executing
ERROR
command with any other legal error code number (up to 255).