summaryrefslogtreecommitdiff
path: root/apps/interpreters/bas/bas.1.in
diff options
context:
space:
mode:
Diffstat (limited to 'apps/interpreters/bas/bas.1.in')
-rw-r--r--apps/interpreters/bas/bas.1.in1189
1 files changed, 1189 insertions, 0 deletions
diff --git a/apps/interpreters/bas/bas.1.in b/apps/interpreters/bas/bas.1.in
new file mode 100644
index 000000000..6b6370ab1
--- /dev/null
+++ b/apps/interpreters/bas/bas.1.in
@@ -0,0 +1,1189 @@
+' t
+.TH BAS 1 "@UPDATED@" "" "User commands"
+.SH NAME \"{{{roff}}}\"{{{
+bas \- BASIC interpreter
+.\"}}}
+.SH SYNOPSIS \"{{{
+.ad l
+.B bas
+.RB [ \-b ]
+.RB [ \-l
+.IR file ]
+.RB [ \-r ]
+.RB [ \-u ]
+.RI [ "program " [ argument "...]]"
+.br
+.B bas
+.RB [ \-\-backslash\-colon ]
+.RB [ \-\-lp
+.IR file ]
+.RB [ \-\-restricted ]
+.RB [ \-\-uppercase ]
+.RI [ "program " [ argument "...]]"
+.br
+.B bas
+.BR \-h | \-\-help
+.br
+.B bas
+.BR \-\-version
+.ad b
+.\"}}}
+.SH DESCRIPTION \"{{{
+.SS "Introduction" \"{{{
+.B Bas
+is an interpreter for the classic dialect of the programming language
+BASIC, as typically found on microcomputers of the eighties. If no
+file is given, it reads optionally numbered lines from standard input.
+Non-numbered lines are executed immediatly (direct mode), numbered
+lines are stored in ascending order. The line number must be a positive
+integer. All statements are compiled before the program is run, which
+catches syntactic and other errors. Keywords and variable names are
+not case sensitive.
+.PP
+If a program with unnumbered lines is loaded, storing or deleting
+numbered lines in direct mode is not possible. You must use \fBrenum\fP
+to renumber the program first or \fBedit\fP to modify the entire program
+inside an editor. If a numbered program is loaded, typing a line number
+with an otherwise empty line deletes that line same the \fBdelete\fP does.
+.PP
+If a \fIprogram\fP is given, it is loaded, compiled and run; \fBbas\fP
+will exit if program execution \fBstop\fPs, \fBend\fPs or just hits the
+end of the program. If the
+first line of a program file begins with \fB#!\fP, it is ignored by
+the interpreter.
+.\"}}}
+.SS "Statements" \"{{{
+Each line of a BASIC program contains one or more of the statements below.
+Multiple statements are grouped by a colon (\fB:\fP) in between them.
+Brackets (\fB[\fP and \fB]\fP) are converted to parentheses when loading
+a program for compatibility with dialects that use them e.g. to indicate
+array indices.
+.IP "[\fBcall\fP] \fIfunction\fP[\fB(\fP\fIargument\fP{\fB,\fP \fIargument\fP\fB)\fP]" \"{{{
+Call the \fIfunction\fP or procedure. The ANSI syntax requires the
+keyword \fBcall\fP, whereas other BASIC dialects don't. In \fBbas\fP,
+\fBcall\fP is optional.
+.\"}}}
+.IP "\fBchdir\fP \fIdirectory$\fP" \"{{{
+Change the current directory to \fIdirectory$\fP.
+.\"}}}
+.IP "\fBclear\fP" \"{{{
+Set all numerical variables to 0 and all string variables to the empty string.
+All arrays lose their dimension and geometry. All files are closed.
+.\"}}}
+.IP "\fBclose\fP [\fB#\fP\fIchannel%\fP{\fB,#\fP\fIchannel%\fP}]" \"{{{
+Close the specified channels. If no channels are given, all channels
+but the standard input/output channel \fB#0\fP are closed.
+.\"}}}
+.IP "\fBcls\fP" \"{{{
+Clear the screen. Not all terminals support this. The rarely used keyword
+\fBhome\fP will be converted to \fBcls\fP when loading a program.
+.\"}}}
+.IP "\fBcolor\fP [\fIforeground\fP\fB][\fB,\fP[\fP\fIbackground\fP][\fB,\fP[\fIborder\fP]]]" \"{{{
+All parameters must be between 0 and 15. If your terminal type supports
+ANSI colour codes, the foreground colour will be set to the given value.
+The background colour can only be set to one of the lower 8 colours,
+selecting a higher colour silently uses the matching lower colour
+(e.g. red instead of light red). The border colour is always ignored.
+The following colours are available: black (0), blue (1), green (2), cyan
+(3), red (4), magenta (5), brown (6), white (7), grey (8), light blue
+(9), light green (10), light cyan (11), light red (12), light magenta
+(13), yellow (14), bright white (15).
+.\"}}}
+.IP "\fBcopy\fP \fIfrom$\fP \fBto\fP \fIto$\fP" \"{{{
+Copy a file.
+.\"}}}
+.IP "\fBdata\fP \fIinput-data\fP{\fB,\fP\fIinput-data\fP}" \"{{{
+Store data to be accessed by \fBread\fP. The \fIinput-data\fP has the
+same format as data that is read by \fBinput\fP statements.
+Data can not be stored in direct mode. This statement is ignored
+during execution. Abbreviation: \fBd.\fP
+.\"}}}
+.IP "\fBdec\fP \fIlvalue\fP{\fB,\fP\fIlvalue\fP}" \"{{{
+Decrement \fIlvalue\fP.
+.\"}}}
+.IP "\fBdef fn\fP\fIfunction\fP[\fB(\fP\fIparameter\fP[\fB,\fP\fIparameter\fP...]\fB)\fP]" \"{{{
+Define a function. Function identifiers always start with \fBfn\fP.
+A function ends and returns its value using \fB=\fP\fIexpression\fP.
+Additionally, a function may return a value using \fBfnreturn\fP
+\fIexpression\fP before reaching its end. Functions can not be declared
+in direct mode. Note: Multi line functions are not supported by all
+BASIC dialects. Some dialects allow white space between the \fBfn\fP
+and the rest of the identifier, because they use \fBfn\fP as token
+to mark function identifiers for both declaration and function call.
+\fBBas\fP removes that space when loading a program.
+.\"}}}
+.IP "\fBdefdbl\fP \fIvariable\fP[\fB\-\fP\fIvariable\fP]" \"{{{
+Declare the global \fIvariable\fP as real. Only unqualified variables (no
+type extension) can be declared. Variable ranges can only be built from
+single letter variables. Declaration is done at compile time.
+.\"}}}
+.IP "\fBdefint\fP \fIvariable\fP[\fB\-\fP\fIvariable\fP]" \"{{{
+Declare the global \fIvariable\fP as integer.
+.\"}}}
+.IP "\fBdefstr\fP \fIvariable\fP[\fB\-\fP\fIvariable\fP]" \"{{{
+Declare the global \fIvariable\fP as string.
+.\"}}}
+.IP "\fBdef proc\fP\fIfunction\fP[\fB(\fP\fIparameter\fP[\fB,\fP\fIparameter\fP...]\fB)\fP]" \"{{{
+Define a procedure (function that does not return a value). Procedure
+identifiers always start with \fBproc\fP if defined this way. A procedure
+ends with \fBend proc\fP. This is the BBC BASIC syntax. Procedures can
+not be declared in direct mode.
+.\"}}}
+.IP "\fBdelete\fP [\fIfrom\fP][\fB\-\fP|\fB,\fP][\fIto\fP]" \"{{{
+Delete the specified line or range of lines. Unlike \fBlist\fP, the lines
+must exist.
+.\"}}}
+.IP "\fBdim\fP \fIvariable\fP\|\fB(\fP\fIdimension%\fP{\fB,\fP\fIdimension%\fP}\fB)\fP" \"{{{
+Dimension the array \fIvariable\fP. If the array variable already exists,
+it must first be \fBerase\fPd. The \fIdimension%\fP specifies the upper
+index of the last element, not the number of elements! The lower index
+is specified by \fBoption base\fP, it is zero by default.
+.\"}}}
+.IP "\fBdisplay\fP \fIfilename$\fP" \"{{{
+Display the contents of \fIfilename$\fP on standard output, like
+.IR cat (1)
+does.
+.\"}}}
+.IP "\fBdo\fP" \"{{{
+.IP "\fBexit do\fP"
+.IP "\fBloop\fP"
+Repeat the loop body in between \fBdo\fP and \fBloop\fP until \fBexit
+do\fP ends looping.
+.\"}}}
+.IP "\fBdo until\fP \fIcondition\fP" \"{{{
+.IP "\fBexit do\fP"
+.IP "\fBloop\fP"
+Unless the \fIcondition\fP is true or \fBexit do\fP ends looping,
+repeat the loop body in between \fBdo while\fP and \fBloop\fP.
+This is equivalent to \fBwhile not\fP/\fBwend\fP.
+.\"}}}
+.IP "\fBdo while\fP \fIcondition\fP" \"{{{
+.IP "\fBexit do\fP"
+.IP "\fBloop\fP"
+While the \fIcondition\fP is true or \fBexit do\fP ends looping,
+repeat the loop body in between \fBdo while\fP and \fBloop\fP.
+This is equivalent to \fBwhile\fP/\fBwend\fP.
+.\"}}}
+.IP "\fBdo\fP" \"{{{
+.IP "\fBexit do\fP"
+.IP "\fBloop until\fP \fIcondition\fP"
+Repeat the loop body in between \fBdo\fP and \fBloop until\fP until the
+\fIcondition\fP is true or until \fBexit do\fP ends looping. This is
+equivalent to \fBrepeat\fP/\fBuntil\fP.
+.\"}}}
+.IP "\fBedit\fP [\fIline\fP]" \"{{{
+Save the program to a temporary file, start an external editor on that
+file and load the program again from the file. If a \fIline\fP is given,
+the editor is told to start on that line. \fBBas\fP knows the calling
+conventions for a number of common editors, but if your favourite is not
+among them or does not support that feature, the line will be ignored.
+The editor is specified by the environment variable \fBVISUAL\fP, or
+\fBEDITOR\fP if \fBVISUAL\fP is not set. If that is not set as well,
+\fIvi\fP(1) is used.
+.\"}}}
+.IP "\fBend\fP" \"{{{
+End program execution. If the program was started from direct mode,
+return to direct mode, otherwise the interpreter terminates. Although
+allowed by BASIC itself, \fBbas\fP only allows \fBreturn\fP statements
+to be followed by a colon and a comment, because anything else would
+be unreachable. In interactive mode, a diagnostic message is printed
+to indicate the program did not just terminated after the last line.
+.\"}}}
+.IP "\fBenviron\fP \fIentry$\fP" \"{{{
+Modify or add an environment \fIentry$\fP of the form
+\fIvariable\fP\fB=\fP\fIvalue\fP.
+.\"}}}
+.IP "\fBerase\fP \fIvariable\fP{\fB,\fP\fIvariable\fP}" \"{{{
+Erase the array \fIvariable\fP.
+.\"}}}
+.IP "\fBfunction\fP \fIfunction\fP[\fB(\fP\fIparameter\fP[\fB,\fP\fIparameter\fP...]\fB)\fP]" \"{{{
+Define a function (ANSI BASIC style). A function ends using \fBend function\fP.
+The name of the function is a local variable inside the function and its
+value is returned as function result when program execution reaches the
+end of the function. Functions can not be declared in direct mode.
+.\"}}}
+.IP "\fBfield\fP [\fB#\fP]\fIchannel%\fP\fB,\fP\fIwidth\fP \fBas\fP \fIlvalue$\fP {\fB,\fP\fIwidth\fP \fBas\fP \fIlvalue$\fP}" \"{{{
+Allocate \fIwidth\fP bytes in the record buffer to the \fIlvalue$\fP.
+The total number of allocated bytes must not exceed the record length.
+The same record buffer can be allocated to different lvalues
+by using multiple field statements. Fielded lvalues must be set
+with \fBlset\fP and \fBrset\fP. Simple assignments to them will cause
+different storage to be allocated to them, thus not effecting the random
+access buffer.
+.\"}}}
+.IP "\fBfor\fP \fIlvalue\fP \fB=\fP \fIexpression\fP \fBto\fP \fIexpression\fP [\fBstep\fP \fIexpression\fP]" \"{{{
+.IP "\fBnext\fP \fIlvalue\fP{\fB,\fP\fIlvalue\fP}"
+The \fBfor\fP loop performs the initial variable assignment and then
+executes the statements inside the loop, if the variable is lower or equal
+than the limit (or greater than for negative steps). The \fBnext\fP
+statement verifies if the variable already reached the value of the
+\fBto\fP \fIexpression\fP. If not, it increments if by the value of
+the \fBstep\fP \fIexpression\fP and causes a new repetition. A missing
+\fBstep\fP \fIexpression\fP is treated as \fBstep 1\fP. The \fBnext\fP
+statement may be followed by a list of lvalues. Due to the dynamic variable
+geometry, the lvalues themselves
+are only checked for belonging to the same variable as those in \fBfor\fP.
+If no lvalues are given, the
+innermost loop is terminated. For loops can be left by \fBexit for\fP.
+Note: That statement is not offered by all BASIC dialects and most restrict
+loop variables to scalar variables.
+.\"}}}
+.IP "\fBget\fP [\fB#\fP]\fIchannel%\fP [\fB,\fP\fIrecord\fP]" \"{{{
+Read the record buffer of \fIchannel%\fP from the file it is connected to,
+which must be opened in \fBrandom\fP mode. If a \fIrecord\fP number is
+given, the record is read there instead of being read from the current
+record position. The first record is 1.
+.\"}}}
+.IP "\fBget\fP [\fB#\fP]\fIchannel%\fP\fB,\fP[\fIposition\fP]\fB,\fP\fIlvalue\fP" \"{{{
+Read the \fIlvalue\fP from the specified channel, which must be opened in
+\fBbinary\fP mode. If a \fIposition\fP is given, the data is read there
+instead of being read from the current position. The first position is 1.
+.\"}}}
+.IP "\fBgoto\fP \fIinteger\fP" \"{{{
+Continue execution at the specified line. If used from direct mode, the
+program will first be compiled. The older two word \fBgo to\fP will be
+converted into the newer \fBgoto\fP. Although allowed by BASIC itself,
+\fBbas\fP only allows \fBgoto\fP statements to be followed by a colon
+and a comment, because anything else would be unreachable. This also
+concerns assigned \fBgoto\fP statements.
+.\"}}}
+.IP "\fBgosub\fP \fIinteger\fP" \"{{{
+Execute the subroutine at the specified line. The older two word \fBgo
+sub\fP will be converted into the newer \fBgosub\fP. If used from direct
+mode, the program will first be compiled. The \fBreturn\fP statement
+returns from subroutines. Abbreviation: \fBr.\fP Although allowed by
+BASIC itself, \fBbas\fP only allows \fBreturn\fP statements to be followed
+by a colon and a comment, because anything else would be unreachable.
+.\"}}}
+.IP "\fBif\fP \fIcondition\fP [\fBthen\fP] \fIstatements\fP [\fBelse\fP \fIstatements\fP]" \"{{{
+If the \fIcondition\fP evaluates to a non-zero number of a non-empty
+string, the statements after \fBthen\fP are executed. Otherwise,
+the statements after \fBelse\fP are executed. If the \fBthen\fP or
+\fBelse\fP statements are directly followed by an integer, \fBbas\fP
+inserts a \fBgoto\fP statement before the number and if the condition
+is directly followed by a \fBgoto\fP statement, a \fBthen\fP is inserted.
+.IP "\fBif\fP \fIcondition\fP \fBthen\fP"
+.IP "\fBelseif\fP \fIcondition\fP \fBthen\fP"
+.IP "\fBelse\fP"
+.IP "\fBend if\fP"
+If the \fBthen\fP statement is at the end of a line, it introduces
+a multi-line construct that ends with the \fBend if\fP statement (note
+the white space between \fBend\fP and \fBif\fP). This form can not
+be used in direct mode, where only one line can be entered at a time.
+Abbreviations for \fBthen\fP and \fBelse\fP: \fBth.\fP and \fBel.\fP
+.\"}}}
+.IP "\fBimage\fP \fIformat\fP \"{{{
+Define a format for \fBprint using\fP. Instead of using string
+variables, print formats can be defined this way and referred to by the
+line number. The \fIformat\fP can be given as a string literal, which
+allows leading and trailing space, or without enclosing double quotes.
+\fBBas\fP converts the second form to a quoted string. This statement is
+ignored during execution. \fBNote\fP: No two dialects share the syntax
+and semantics for numbered print formats, but many offer it one way or
+another. This statement allows you to adapt much existing code with small
+changes, but probably differs from most dialects in one way or another.
+.\"}}}
+.IP "\fBinc\fP \fIlvalue\fP{\fB,\fP\fIlvalue\fP}" \"{{{
+Increment \fIlvalue\fP.
+.\"}}}
+.IP "\fBinput\fP [\fB#\fP\fIchannel%\fP\fB,\fP][\fB;\fP][\fIstring\fP[\fB;\fP|\fB,\fP|\fB:\fP]]\fIlvalue\fP{\fB,\fP\fIlvalue\fP}" \"{{{
+The \fBinput\fP statement prints the optional prompt \fIstring\fP and
+a trailing question mark (\fB?\fP). After, it reads comma separated
+values and assigns them to the given variables. If too few values are
+typed in, missing values will be requested with the prompt \fB??\fP.
+An empty value for a numeric variable means zero. If too much input
+data is given, a warning is printed. If a channel other
+than \fB#0\fP is specified, no question marks or error messages will be
+printed, instead an error is returned. A semicolon before the prompt
+will not move the cursor to a new line after pressing RETURN. If the
+prompt is followed by a comma, colon or no punctuation at all, no question mark will
+be printed after the prompt. \fBNote\fP: Some dialects allow a string
+expression instead of the \fIstring\fP.
+.\"}}}
+.IP "\fBkill\fP \fIfilename$\fP" \"{{{
+Delete a file.
+.\"}}}
+.IP "[\fBlet\fP] \fIlvalue\fP{\fB,\fP\fIlvalue\fP} \fB=\fP \fIexpression\fP" \"{{{
+Evaluate the \fIexpression\fP and assign its value to each \fIlvalue\fP,
+converting it, if needed.
+\fILvalues\fP are variables or array variable elements. All assignments
+are performed independently of each other.
+.\"}}}
+.IP "\fBline input\fP [\fB#\fP\fIchannel%\fP\fB,\fP][\fIstring\fP\fB;\fP|\fB,\fP]\fIlvalue$\fP" \"{{{
+The \fBline input\fP statement prints the optional prompt \fIstring\fP,
+reads one line of input and assigns unmodified it to the \fIlvalue$\fP.
+Using a comma instead of a semicolon makes no difference with this
+statement.
+.\"}}}
+.IP "[\fBl\fP]\fBlist\fP [\fIfrom\fP][\fB\-\fP|\fB,\fP][\fIto\fP]" \"{{{
+List (part of) the program text. Control structures will automatically
+be indented. If the parameter \fIfrom\fP is given, the listing starts
+at the given line instead of the beginning. Similarly, \fIto\fP causes
+the listing to end at line \fIto\fP instead of the end of the program.
+The given line numbers do not have to exist, there are merely a numeric
+range. The syntax variant using a minus sign as separator requires that
+the first line is given as a literal number. This statement may also
+be used inside programs, e.g. for \fBlist erl\fP. \fBllist\fP writes
+the listing to the lp channel.
+.\"}}}
+.IP "\fBload\fP [\fIfile$\fP]" \"{{{
+Load the program \fIfile$\fP (direct mode only). The name may
+be omitted to load a program of the name used by a previous \fBload\fP
+or \fBsave\fP statement.
+.\"}}}
+.IP "\fBlocal\fP \fIvariable\fP{\fB,\fP\fIvariable\fP}" \"{{{
+Declare a variable local to the current function. The scope ranges
+from the declaration to the end of the function.
+.\"}}}
+.IP "\fBlocate\fP \fIline\fP,\fIcolumn\fP" \"{{{
+Locate the cursor at the given \fIline\fP and \fIcolumn\fP. The first
+line and column is 1. Not all terminals support this.
+.\"}}}
+.IP "\fBlock\fP [\fB#\fP]\fIchannel%\fP" \"{{{
+Wait for an exclusive lock on the file associated with the \fIchannel%\fP
+to be granted.
+.\"}}}
+.IP "\fBlset\fP \fIvariable$\fP\fB=\fP\fIexpression\fP" \"{{{
+Store the left adjusted \fIexpression\fP value in the storage
+currently occupied by the \fIvariable$\fP. If the storage does not suffice,
+the \fIexpression\fP value is truncated, if its capacity exceeds the length
+of the \fIexpression\fP value, it is padded with spaces.
+.\"}}}
+.IP "\fBrset\fP \fIvariable$\fP\fB=\fP\fIexpression\fP" \"{{{
+Store the right adjusted \fIexpression\fP value in the storage currently
+occupied by the \fIvariable$\fP, padding with spaces from the right if
+the storage capacity exceeds the length of the \fIexpression\fP value.
+.\"}}}
+.IP "\fBmat\fP \fIvariable\fP\fB=\fP\fImatrixVariable\fP" \"{{{
+Matrix variables are one or two-dimensional array variables, but the elements
+at index 0 in each dimension are unused. The \fIvariable\fP does not
+have to be dimensioned. Note: If it is, some BASIC dialects require
+that its number of elements must be equal or greater than that of
+the \fImatrixVariable\fP, which is valid for all matrix assignments.
+The \fIvariable\fP will be (re)dimensioned to the geometry of the
+\fImatrixVariable\fP and all elements (starting at index 1, not 0)
+of the \fImatrixVariable\fP will be copied to \fIvariable\fP.
+.\"}}}
+.IP "\fBmat\fP \fIvariable\fP\fB=\fP\fImatrixVariable\fP[\fB+\fP|\fB\-\fP|\fB*\fP \fImatrixVariable\fP]" \"{{{
+The \fIvariable\fP will be (re)dimensioned as for matrix assignments
+and the matrix sum (difference, product) will be assigned to it. Note:
+Some BASIC dialects require that result matrix \fIvariable\fP must not
+be a factor of the product, e.g. \fBa=a*a\fP is illegal in those dialects.
+.\"}}}
+.IP "\fBmat\fP \fIvariable\fP\fB=(\fP\fIfactor\fP\fB)*\fP\fImatrixVariable\fP" \"{{{
+Assign the scalar product of the \fIfactor\fP and the \fImatrixVariable\fP to
+\fIvariable\fP.
+.\"}}}
+.IP "\fBmat\fP \fIvariable\fP\fB=con\fP[\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP]" \"{{{
+Assign a matrix whose elements are all \fB1\fP to \fIvariable\fP.
+If dimensions are specified, the matrix \fIvariable\fP will be
+(re)dimensioned. A missing number of \fIcolumns\fP (re)dimensions the
+variable with 2 columns, including column 0.
+.\"}}}
+.IP "\fBmat\fP \fIvariable\fP\fB=idn\fP[\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP]" \"{{{
+Assign a matrix whose diagonal elements are \fB1\fP and remaining
+elements are \fB0\fP to \fIvariable\fP. Some dialects can only
+generate square matrices and use only one argument to specify both
+rows and columns.
+.\"}}}
+.IP "\fBmat\fP \fIvariable\fP\fB=inv(\fP\fImatrixVariable\fP\fB)\fP" \"{{{
+Assign the inverse of the \fImatrixVariable\fP to \fIvariable\fP,
+(re)dimensioning it if needed. Only two-dimensional square matrixes can be inverted.
+.\"}}}
+.IP "\fBmat\fP \fIvariable\fP\fB=trn(\fP\fImatrixVariable\fP\fB)\fP" \"{{{
+Assign the transposed elements of \fImatrixVariable\fP to \fIvariable\fP,
+(re)dimensioning it if needed. Note: Some BASIC dialects require that
+\fIvariable\fP and \fImatrixVariable\fP are different. Only two-dimensional
+matrixes can be transposed.
+.\"}}}
+.IP "\fBmat\fP \fIvariable\fP\fB=zer\fP[\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP]" \"{{{
+Assign a matrix whose elements are all \fB0\fP to \fIvariable\fP.
+.\"}}}
+.IP "\fBmat input\fP [\fB#\fP\fIchannel%\fP\fB,\fP]\fIvariable\fP[\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP]{\fB,\fP \fIvariable\fP[\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP]}" \"{{{
+This statement reads all elements of a matrix \fIvariable\fP without row
+or column 0 from the specified channel (or standard input, if no channel
+is given). For two-dimensional matrices, the elements are read in row order.
+Elements are separated with a comma.
+If the channel is \fB#0\fP, the prompt \fB?\fP is printed until all elements are read.
+.\"}}}
+.IP "\fBmat print\fP [\fB#\fP\fIchannel%\fP[\fB,\fP]][\fBusing\fP \fIformat\fP\fB;\fP]\fImatrixVariable\fP{\fB;\fP|\fB,\fP \fImatrixVariable\fP}[\fB;\fP|\fB,\fP]" \"{{{
+Print the given \fImatrixVariable\fP, optionally using the \fBusing\fP
+format string or line (see \fBprint using\fP below) for
+formatting the matrix elements. If no format string is used, a following
+comma prints the elements in zoned format (default), whereas a semicolon
+prints them without extra space between them. The output starts on a new
+line, unless the output position is already at the beginning of a new line.
+A blank line is printed between matrix variables.
+.\"}}}
+.IP "\fBmat read\fP \fIvariable\fP[\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP]{\fB,\fP \fIvariable\fP[\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP]}" \"{{{
+Read constants from \fBdata\fP statemets and assign them to the elements
+of the matrix \fIvariable\fP.
+.\"}}}
+.IP "\fBmat redim\fP \fIvariable\fP\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP{\fB,\fP \fIvariable\fP\fB(\fP\fIrows\fP[\fB,\fP\fIcolumns\fP]\fB)\fP}" \"{{{
+Resize a matrix \fIvariable\fP. The matrix must not exist before, in
+which case it will be created. If it does exist, it must be of the same
+dimension, but it may be smaller or larger. Truncated elements will be
+permanently lost, new elements will be set to \fB0\fP for numeric and
+\fB""\fP for string variables. Identical positions in the old and the
+new matrix keep their value. Note: Some BASIC dialects require that
+the matrix variable must exist before, some only forbid to grow matrix
+variables beyond their original dimension and some keep the values at
+the same storage position, which appears as if they got shuffled around
+when changing the size and as if previously lost values reappear.
+.\"}}}
+.IP "\fBmat write\fP [\fB#\fP\fIchannel%\fP[\fB,\fP]]\fImatrixVariable\fP{\fB;\fP|\fB,\fP \fImatrixVariable\fP}[\fB;\fP|\fB,\fP]" \"{{{
+Write the values of the given \fImatrixVariable\fP to the specified channel or
+to standard output if no channel is given. Different values are
+separated by commas and a newline is written at the end of a line.
+Strings will be written enclosed in double quotes and positive numbers
+are not written with a heading blank.
+.\"}}}
+.IP "\fBmid$(\fP\fIlvalue$\fP\fB,\fP\fIposition%\fP[\fB,\fP\fIlength%\fP]\fB)=\fP\fIvalue$\fP" \"{{{
+Replace the characters starting at the given \fIposition%\fP inside
+\fIlvalue$\fP with the characters from \fIvalue$\fP. An optional
+\fIlength%\fP limits how many characters of \fIlvalue$\fP are replaced.
+The replacement will not go beyond the length of \fIlvalue$\fP. Note:
+Not all BASIC dialects support this statement.
+.\"}}}
+.IP "\fBmkdir\fP \fIdirectory$\fP" \"{{{
+Create a \fIdirectory$\fP.
+.\"}}}
+.IP "\fBname\fP \fIoldname$\fP \fBas\fP \fInewname$\fP" \"{{{
+Rename the file \fIoldname$\fP to \fInewname$\fP.
+.\"}}}
+.IP "\fBnew\fP" \"{{{
+Erase the program to write a new one (direct mode only).
+All files are closed and all variables removed.
+.\"}}}
+.IP "\fBon\fP \fIchoice%\fP \fBgoto\fP \fIline\fP{\fB,\fP\fIline\fP}" \"{{{
+If the integral value of \fIchoice\fP is 1, execution continues at the
+first specified \fIline\fP, if 2, on the second, etc. If the value falls
+outside the range for which lines are given, execution continues at the
+next statement.
+.\"}}}
+.IP "\fBon\fP \fIchoice%\fP \fBgosub\fP \fIline\fP{\fB,\fP\fIline\fP}" \"{{{
+This is similar to \fBon goto\fP, but a \fBgosub\fP is executed instead
+of the \fBgoto\fP.
+.\"}}}
+.IP "\fBon error goto 0\fP" \"{{{
+If executed in the context of an exception handler, re-throw the last
+exception that happened. Otherwise disable exception handling.
+.\"}}}
+.IP "\fBon error\fP \fIstatements\fP" \"{{{
+Register the \fIstatements\fP as exception handler to catch any thrown
+exceptions. Exception handlers inside procedures are always local:
+If a procedure aborts by an unhandled exception, that exception may be
+caught by its caller. If the \fIstatements\fP do not abort the program
+or jump elsewhere, execution continues at the next line. Note: This
+more general form differs from traditional interpreters that require
+\fBon error goto\fP.
+.\"}}}
+.IP "\fBon error off\fP" \"{{{
+Disable exception handling.
+.\"}}}
+.IP "\fBopen\fP \fImode$\fP\fB,\fP[\fB#\fP]\fIchannel%\fP\fB,\fP\fIfile$\fP[\fB,\fP\fIlength\fP]" \"{{{
+Open the \fIfile$\fP through the \fIchannel%\fP. The mode must be
+\fB"i"\fP for input, \fB"o"\fP for output, \fB"a"\fP for appending
+output or \fB"r"\fP for random access. Opening the file for random
+access requires the record \fIlength\fP to be specified. This syntax
+is used by MBASIC and some other interpreters.
+.\"}}}
+.IP "\fBopen\fP \fIfile$\fP [\fBfor\fP \fBinput\fP|\fBoutput\fP|\fBappend\fP|\fBrandom\fP|\fBbinary\fP] [\fBaccess\fP \fBread\fP|\fBwrite\fP|\fBread write\fP] [\fBshared\fP|\fBlock read\fP|\fBlock write\fP] \fBas file\fP [\fB#\fP]\fIchannel%\fP [\fBlen=\fP\fIlength%\fP]" \"{{{
+Open the \fIfile$\fP through the \fIchannel%\fP. Files opened in
+\fBinput\fP mode must already exist, whereas the other methods create
+them as needed. If the file is opened for random access and no record
+\fIlength\fP is specified, a record length of 1 is used. This is the
+ANSI BASIC syntax found in more modern programs. The \fBbinary\fP mode
+is similar to \fBrandom\fP mode, but there is no fixed record length:
+Data is read and written directly using \fBget\fP and \fBput\fP without
+using \fBfield\fP. If no open method is specified, the file is opened
+as \fIrandom\fP. Optionally, a file access mode can be specified.
+.IP
+The file locking implementations vary greatly between dialects: Some
+implementations offer independent locks for reading and writing,
+others offer shared locks (usually used for many readers) and
+exclusive locks (usually used for writers). Additionally, locks may
+be advisory/cooperative or mandatory. Most dialects use exclusive
+locks of highest protection by default. \fBBas\fP implements POSIX
+shared/exclusive locks, which are usually advisory, and offers the
+following:
+.RS
+.IP \fBshared\fP
+any process can read or write file
+.IP "\fBlock read\fP"
+shared lock, \fBopen\fP fails if file is locked exclusively
+.IP "\fBlock write\fP
+exclusive lock
+.IP "default"
+no lock is taken, same as \fBshared\fP
+.RE
+.IP
+Programs using locks may fail if the dialect they were written for
+had different lock semantics!
+.\"}}}
+.IP "\fBoption base\fP \fIbase\fP" \"{{{
+Specify the lowest array index for \fBdim\fP (zero by default). Note:
+Many BASIC dialects enforce the base to be 0 or 1, further they require
+the base to be specified only once and before creating any arrays.
+\fBBas\fP allows to set an individual base for any array, but all
+\fBmat\fP functions require the bases of their operands to be equal and
+to be 0 or 1.
+.\"}}}
+.IP "\fBoption run\fP" \"{{{
+Ignore terminal interrupts (usually control c) and XON/XOFF flow control (control s/control q).
+.\"}}}
+.IP "\fBoption stop\fP" \"{{{
+Accept terminal interrupts (usually control c) to stop a program and
+XON/XOFF flow control (control s/control q) to stop and resume terminal
+output.
+.\"}}}
+.IP "\fBout\fP \fIaddress\fP\fB,\fP\fIvalue\fP" \"{{{
+Write the \fPvalue\fP to the I/O port \fIaddress\fP. Direct port
+access is not available in the portable version.
+.\"}}}
+.IP "\fBpoke\fP \fIaddress\fP\fB,\fP\fIvalue\fP" \"{{{
+Write the \fPvalue\fP to the memory \fIaddress\fP. Direct memory
+access is not available in the portable version.
+.\"}}}
+.IP "[\fBl\fP]\fBprint\fP [\fB#\fP\fIchannel%\fP[\fB,\fP]][\fBusing\fP \fIformat\fP\fB;\fP]{\fIexpression\fP|\fBtab(\fP\fIposition\fP\fB)\fP|\fBspc(\fP\fIlength\fP\fB)\fP|\fB;\fP|\fB,\fP}" \"{{{
+Evaluate the expressions and print their values to the integral
+expression \fIchannel%\fP. If no channel is given, the standard output
+channel \fB#0\fP will be used. The statement \fBlprint\fP prints to the
+printer channel and no other channel can be specified. The \fBusing\fP
+format string or line may contain the following characters:
+.RS
+.IP "\fB_\fP"
+Print the following character instead of interpreting it as formatting
+command.
+.IP "\fB!\fP"
+Print the first character of a string.
+.IP "\fB\e\fP"
+Print two more characters of a string as there are
+spaces between the backslashes.
+.IP "\fB&\fP"
+Print a string without any formatting. Note: Some BASIC dialects use
+\fB&\fP characters to specify the string width. A single \fB&\fP would
+only print the first character in those dialects. In other dialects,
+an ampersand represents one digit of the numeric format, padding the
+number with zeroes.
+.IP "\fB+\fP"
+A plus at the beginning or end of a numeric format causes the sign to
+be printed at the beginning or the end.
+.IP "\fB\-\fP"
+A minus at the end of a numeric format prints a trailing minus after
+negative numbers and a space else.
+.IP "\fB,\fP"
+A comma inside the integral part of a numeric format inserts a comma
+before each three-digit group of the integral part of the number.
+It also represents one digit in the format. Although one comma suffices,
+it makes formats more readable to insert a comma every three digits.
+.IP "\fB#\fP"
+Each hash sign represents one digit of the numeric format. If there
+are fewer digits in the integral part of the value, it is preceded by
+spaces.
+.IP "\fB^\fP"
+Each caret represents one digit of the exponent. At least three carets
+are required, because the exponent is leaded by an \fBE\fP and the
+epxonent sign is always printed. The number is printed in the numeric
+format asked for by hash signs with the exponent adjusted accordingly,
+e.g. printing \fB5\fP using \fB###.##^^^^^\fP results in \fB500.00E-002\fP.
+.IP "\fB*\fP"
+Like a hash sign, but the number will not be preceded by spaces, but
+by asterisks.
+.IP "\fB0\fP"
+Like a hash sign, but the number will not be preceded by spaces, but
+by zeroes.
+.IP "\fB.\fP"
+The dot specifies the position of the decimal point between a
+pound/asterisk sign group for the integral value and an optional pound
+sign group for the precision of the fractional part.
+.IP "\fB$\fP"
+A dollar sign prefixes the number with a dollar. Further dollar signs
+increase the numeric width like \fB#\fP and \fB*\fP. If the dollar sign
+stands in front of all padding, it will precede it, otherwise it will be
+printed after any padding.
+.IP "any other character"
+Any other character is printed literally and separates different numeric
+fields of a multi-field format.
+.RE
+.IP
+If no format is given, positive values are printed with a heading space,
+negative values are printed with a heading minus, the precision is set
+as required and the number is followed by a space. \fBprint\fP without
+\fBusing\fP will advance to the next line if the value of the expression
+no longer fits into the current line.
+.IP
+A semicolon concatenates the output while a comma puts the values in
+columns. A trailing semicolon suppresses printing a trailing newline.
+The pseudo function \fBtab\fP, which must only be used within \fBprint\fP
+statements, spaces to the specified print position (column) with 0 being
+the leftmost position. If the current print position is already beyond
+\fIvalue\fP, it does nothing. If \fIvalue\fP is beyond the output width,
+advancing the position stops there. The pseudo function \fBspc\fP is similar
+to \fBtab\fP, but it prints as many spaces as specified by its argument.
+Abbreviation: \fB?\fP or \fBp.\fP
+.\"}}}
+.IP "\fBput\fP [\fB#\fP]\fIchannel%\fP [\fB,\fP\fIrecord\fP]" \"{{{
+Write the record buffer of \fIchannel%\fP to the file it is connected to,
+which must be opened in \fBrandom\fP mode. If a \fIrecord\fP number
+is given, the record is written there instead of being written to the
+current record position.
+.\"}}}
+.IP "\fBput\fP [\fB#\fP]\fIchannel%\fP\fB,\fP[\fIposition\fP]\fB,\fP\fIvalue\fP" \"{{{
+Write the \fIvalue\fP to the specified channel, which must be opened
+in \fBbinary\fP mode. If a \fIrecord\fP number is given, the data is
+written there instead of being written to the current position.
+.\"}}}
+.IP "\fBrandomize\fP [\fInumber%\fP]" \"{{{
+Seed the random number generator. If no argument is given, it will be
+initialised with a random number.
+.\"}}}
+.IP "\fBread\fP \fIlvalue\fP{\fB,\fP\fIlvalue\fP}" \"{{{
+Read constants from \fBdata\fP statements and assign them to the
+\fIlvalue\fPs.
+.\"}}}
+.IP "\fBrem\fP \fIarbitrary text\fP" \"{{{
+This statement introduces comments.
+.\"}}}
+.IP "\fBrename\fP \fIfrom$\fP \fBto\fP \fIto$\fP" \"{{{
+Rename a file.
+.\"}}}
+.IP "\fB'\fP \fIarbitrary text\fP" \"{{{
+This is an alternative form of comments, which can directly follow
+statements without a colon. An exclamation mark instead of the
+quotation mark is also recognised and converted to a quotation mark.
+.\"}}}
+.IP "\fBrenum\fP [\fIfirst\fP[\fB,\fP\fIincrement\fP]]" \"{{{
+Renumber the program. The \fIfirst\fP line number and the line number
+\fIincrement\fP can be optionally given. If omitted, a value of 10 will
+be used for both.
+.\"}}}
+.IP "\fBrepeat\fP" \"{{{
+.IP "\fBuntil\fP \fIcondition\fP"
+Execute the loop body and repeat doing so if the \fIcondition\fP is
+not zero. The loop body will be executed at least once. Abbreviation:
+\fBrep.\fP
+.\"}}}
+.IP "\fBrestore\fP [\fIline\fP]" \"{{{
+Restore the data pointer to the first \fBdata\fP statement for reading
+data again. An optional line number restores the pointer to the first
+\fBdata\fP statement in that line. Abbreviation: \fBres.\fP Note: Some
+BASIC dialects allow to specify a line without a \fBdata\fP statement
+and search beginning from that line for one. This implementation
+does not allow that, because it is more often an error than used as
+a feature.
+.\"}}}
+.IP "\fBresume\fP \fIline\fP" \"{{{
+End an exception handler and continue execution at the specified line.
+This is only needed if you intend to re-throw exceptions by on \fBon error
+goto 0\fP.
+Although allowed by BASIC itself, \fBbas\fP
+only allows \fBresume\fP statements to be followed by a colon and a comment,
+because anything else would be unreachable.
+.\"}}}
+.IP "\fBrun\fP [\fIline\fP|\fIfile$\fP]" \"{{{
+Compile the program, clear all variables, close all files and start program execution.
+If a file is specified, the file is loaded first and run from the
+beginning. If a line is specified, execution starts at the given
+line.
+.\"}}}
+.IP "\fBsave\fP [\fIfile$\fP]" \"{{{
+Save the program to the given \fIfile$\fP (direct mode only). The name may
+be omitted to save the program under the name used by a previous \fBload\fP
+or \fBsave\fP statement.
+.\"}}}
+.IP "\fBselect case\fP \fIselector\fP" \"{{{
+.IP "\fBcase\fP \fImatch\fP{\fB,\fP \fImatch\fP}"
+.IP "\fImatch\fP = \fIexpression\fP [\fBto\fP \fIexpression\fP] | \fBis\fP \fIrelop\fP \fIexpression\fP"
+.IP "\fBcase else\fP"
+.IP "\fBend select\fP"
+Execute the statements after the first \fBcase\fP statement that
+matches the \fIselector\fP expression, then skip to the \fIend select\fP
+statement. A single \fIexpression\fP matches its value, \fBto\fP matches
+the range between the first and the second \fIexpression\fP including the
+limits, and \fBis\fP compares the \fIselector\fP using the relational
+operator with the \fIexpression\fP. The \fIcase else\fP branch always
+matches if none of the above did. If the \fIselector\fP does not match
+any branch, control passes to the statement following \fBend select\fP.
+\fBNote\fP: Some BASIC dialects treat this case as an error.
+.\"}}}
+.IP "\fBshell\fP [\fIcommand$\fP]" \"{{{
+If a \fIcommand$\fP is given, it is executed as child process of
+\fBbas\fP as bourne shell command. If used without a \fIcommand$\fP,
+the shell specified by the environment variable \fBSHELL\fP (defaults
+to the bourne shell if not set) is started without arguments.
+.\"}}}
+.IP "\fBsleep\fP \fIpause\fP" \"{{{
+The program pauses for \fIpause\fP seconds. If your system allows it,
+fractional seconds can be used.
+.\"}}}
+.IP "\fBstop\fP" \"{{{
+Stop the program. Apart from printing where the program stopped, this
+is identical to \fBend\fP.
+.\"}}}
+.IP "\fBsub\fP\fIfunction\fP[\fB(\fP\fIparameter\fP[\fB,\fP\fIparameter\fP...]\fB)\fP]" \"{{{
+Define a procedure (function that does not return a value). A procedure
+ends with \fBsubend\fP; the alternative forms \fBsub end\fP and \fBend
+sub\fP are converted to \fBsubend\fP when loading programs. A procedure
+can be left by \fBsubexit\fP; again the alternative forms \fBsub exit\fP and
+\fBexit sub\fP and converted to \fBsubexit\fP when loading programs.
+Procedures can not be declared in direct
+mode. This is the ANSI syntax.
+.\"}}}
+.IP "\fBswap\fP \fIlvalue1\fP\fB,\fP\fIlvalue2\fP" \"{{{
+Swap the contents of \fIlvalue1\fP and \fIlvalue2\fP. Both must
+be of identical type.
+.\"}}}
+.IP "\fBsystem\fP" \"{{{
+Exit from \fBbas\fP. Alternatively, \fBbye\fP may be used.
+.\"}}}
+.IP "\fBtron\fP" \"{{{
+Enable tracing by printing the line number of each executed program line.
+.\"}}}
+.IP "\fBtroff\fP" \"{{{
+Disable program tracing.
+.\"}}}
+.IP "\fBtruncate\fP [\fB#\fP]\fIchannel%\fP" \"{{{
+Truncate the file after the current position. The file must be opened with
+write access.
+.\"}}}
+.IP "\fBunlock\fP [\fB#\fP]\fIchannel%\fP" \"{{{
+Release any locks on the file associated with the \fIchannel%\fP.
+.\"}}}
+.IP "\fBunnum\fP" \"{{{
+Remove all line numbers that are not needed, which is the the opposite
+to \fBrenum\fP. This command is specific to \fBbas\fP, although a
+similar command is found in Bytewater BASIC.
+.\"}}}
+.IP "\fBwait\fP \fIaddress\fP\fB,\fP\fImask\fP\fB,\fP\fIselect\fP" \"{{{
+Wait until the I/O port \fIaddress\fP (XORed with \fIselect\fP, if specified)
+masked out using \fImask\fP is not equal zero. Direct port access is not
+available in the portable version.
+.\"}}}
+.IP "\fBwhile\fP \fIexpression\fP" \"{{{
+.IP "\fBwend\fP"
+While the \fIexpression\fP is not zero, the loop body, ended by \fBwend\fP,
+will be repeatedly executed.
+.\"}}}
+.IP "\fBwidth\fP [\fB#\fP\fIchannel%\fP[\fB,\fP]] [[\fIwidth%\fP][\fB,\fP\fIzone%\fP]]" \"{{{
+Set the channel \fIwidth%\fP. After \fIwidth%\fP characters have been
+printed to the channel, a newline character is automatically sent to it
+for starting a new line. A \fIwidth%\fP of zero sets the channel width
+to infinite. Optionally, the \fIzone\fP width can be specified. Note: Some
+dialects use this, others use the \fBzone\fP statement.
+.\"}}}
+.IP "\fBwrite\fP [\fB#\fP\fIchannel%\fP[\fB,\fP]]{\fIexpression\fP|\fB,\fP|\fB;\fP}" \"{{{
+Write the values of the given expressions to the specified channel or
+to standard output if no channel is given. Different expressions are
+separated by commas and a newline is written at the end of the list.
+Strings will be written enclosed in double quotes and positive numbers
+are not written with a heading blank.
+.\"}}}
+.IP "\fBxref\fP" \"{{{
+Output a list of all functions, global variables, \fBGOSUB\fP and \fBGOTO\fP
+statements and the line numbers where they are referenced.
+.\"}}}
+.IP "\fBzone\fP [\fB#\fP\fIchannel%\fP[\fB,\fP]]\fIwidth%\fP" \"{{{
+Set the channel zone \fIwidth%\fP. A comma in PRINT advances to the
+next print zone, similar to a tabulator.
+.\"}}}
+.\"}}}
+.SS "Expressions and Functions" \"{{{
+Expressions consist of operators or functions that act on integer,
+real (floating point) or string values. Beside decimal notation,
+integer values can be written as hexadecimal values by prefixing them
+with \fB&h\fP and as octal values by prefixing them with \fB&o\fP.
+String constants may contain paired double quotes to specify double quote
+characters inside strings. If the constant is terminated by the end of
+the line, the trailing double quote can be omitted. Numeric constants
+with the suffix \fB#\fP or \fB!\fP are always regarded as floating point
+constants, \fBbas\fP ignores the precision specification, because it
+does not offer different precisions. Integer constants may be followed
+by the suffix \fB%\fP. If an integer literal is outside the integer
+value range, it is treated as a floating point literal.
+.PP
+The table below shows the available operators with decreasing priority.
+The operator \fB=>\fP is converted to \fB>=\fP, \fB=<\fP is converted
+to \fB<=\fP and \fB><\fP is converted to \fB<>\fP when programs are loaded.
+.PP
+.TS
+box,center;
+c l
+cfB l.
+operator meaning
+_
+^ exponentiation
+_
+\- unary negation
++ unary plus
+_
+* multiplication
+/ floating-point division
+\e integer division (equal to fix(a/b))
+mod modulo
+_
++ addition, string concatenation
+\- substraction
+_
+> greater than
+>= greater than or equal to
+\&= equal to
+<> not equal to
+<= less than or equal to
+< less than
+_
+not binary complement
+_
+and binary and
+_
+or binary or
+xor binary exclusive or
+eqv binary equivalent
+imp binary implication
+.TE
+.sp .5v
+.PP
+Besides operators, various builtin functions can be used in expressions.
+The dollar character (\fB$\fP) denotes that the argument must be of
+the type string. The actual parameters of functions, both builtin
+and user-defined, as well as subroutines, are passed by value. Note:
+Modern (not old) ANSI BASIC passes actual parameters by reference.
+Many classic dialects don't offer call by reference and \fBbas\fP
+follows that direction. Arguments to functions and subroutines must
+be enclosed in parentheses. Note: Some dialects allow to omit them,
+which introduces ambiguity in some cases.
+.IP "\fBabs(\fP\fIx\fP\fB)\fP"
+Return the absolute value of \fIn\fP.
+.IP "\fBasc(\fP\fIstring$\fP\fB)\fP"
+Return the numeric value of the first character of the \fIstring\fP.
+.IP "\fBatn(\fP\fIx\fP\fB)\fP"
+Return the arctangent value of \fIx\fP.
+.IP "\fBbin$(\fP\fIn%\fP\fB)\fP"
+Return a string containing the binary conversion of \fIn%\fP.
+.IP "\fBbin$(\fP\fIn%\fP\fB,\fP\fIdigits%\fP\fB)\fP"
+Return a string containing the binary conversion of \fIn%\fP
+with the specified number of \fIdigits%\fP.
+.IP "\fBchr$(\fP\fIvalue%\fP\fB)\fP"
+Return a string of length 1 that contains the character with the given
+\fIvalue%\fP.
+.IP "\fBcint(\fP\fIx\fP\fB)\fP"
+Return the integral value value nearest to \fIx\fP (rounded upwards).
+.IP "\fBcode(\fP\fIstring$\fP\fB)\fP"
+Return the numeric value of the first character of the \fIstring\fP.
+This is the same as \fBasc(\fP\fIstring\fP\fB)\fP, used by dialects
+that took non-ASCII systems into consideration.
+.IP "\fBcommand$\fP"
+Return extra command line arguments after the program name, separated
+by spaces. The program name is not part of the return value. Note:
+This function is implemented for compatibility and does not deal with
+arguments with embedded spaces.
+.IP "\fBcommand$(\fP\fIn%\fP\fB)\fP"
+Return the \fIn%\fPth argument passed to the program, starting with 1.
+The first returned argument (index 0) is the program name.
+.IP "\fBcos(\fP\fIx_rad\fP\fB)\fP"
+Return the cosine value of \fIx_rad\fP.
+.IP "\fBcvd(\fP\fIx$\fP\fB)\fP"
+Convert a string value generated by \fBmkd$(\fP\fIx\fP\fB)\fP back to
+a floating point value. The string characters contain the bytes of a
+C double precision value. The string length and the byte encoding is
+machine dependent and not portable.
+.IP "\fBcvs(\fP\fIx$\fP\fB)\fP"
+Convert a string value generated by \fBmks$(\fP\fIx\fP\fB)\fP back to
+a floating point value. The string characters contain the bytes of a
+C single precision value. The string length and the byte encoding is
+machine dependent and not portable.
+.IP "\fBcvi(\fP\fIx$\fP\fB)\fP"
+Convert a string value back to an integral value.
+The string characters contain the bytes of a signed little endian number
+and the sign bit of the last byte determines the sign of the resulting
+number.
+.IP "\fBdate$\fP"
+Return the date as a 10-character string in the form
+\fImm\fP\fB\-\fP\fIdd\fP\fB\-\fP\fIyyyy\fP.
+.IP "\fBdec$(\fP\fIx\fP,\fBformat$\fP\fB)\fP"
+Convert \fIx\fP to a string according to the \fBprint using\fP \fIformat$\fP.
+.IP "\fBdeg(\fP\fIradians\fP\fB)\fP"
+Convert radians to degrees.
+.IP "\fBdet\fP"
+Return the determinant of the last matrix inverted.
+.IP "\fBedit$(\fP\fIstring$\fP\fB,\fP\fIcode%\fP\fB)\fP"
+Return the result of editing the \fIstring$\fP as indicated by the \fIcode%\fP.
+The following editing codes are available:
+.RS
+.IP 1
+discard parity bit
+.IP 2
+discard all spaces and tabs
+.IP 4
+discard all carriage returns, line feeds, form feeds,
+deletes, escapes and nulls
+.IP 8
+discard leading spaces and tabs
+.IP 16
+convert multiple spaces and tabs to one space
+.IP 32
+convert lower case to upper case
+.IP 64
+convert left brackets to left parentheses and right
+brackes to right parentheses
+.IP 128
+discard trailing spaces and tabs
+.IP 256
+suppress all editing for characters within matching
+single or double quotes. If the matching quote is missing,
+suppress all editing up to the end of the string.
+.RE
+.IP
+The codes can be added for combined editing operations.
+.IP "\fBenviron$(\fP\fIn%\fP\fB)\fP"
+Return the \fIn%\fPth environment entry in the form
+\fIvariable\fP\fB=\fP\fIvalue\fP, starting with 1. If \fIn%\fP is larger
+than the number of entries, an empty string is returned.
+.IP "\fBenviron$(\fP\fIvariable$\fP\fB)\fP"
+Return the value of the specified environment \fIvariable$\fP. If there
+is no such variable, an empty string is returned.
+.IP "\fBeof(\fP\fIchannel%\fP\fB)\fP"
+Return true if the end of the channel has been reached. This must be
+used to avoid that \fBinput\fP tries to read past the end of a file.
+.IP "\fBerl\fP"
+Return the number of the line where the last exception was thrown.
+.IP "\fBerr\fP"
+Return a numeric code for the last exception that was thrown. The use
+of this function is not portable.
+.IP "\fBexp(\fP\fIx\fP\fB)\fP"
+Return the value of e raised to the power of \fIx\fP.
+.IP "\fBfalse\fP"
+Return 0.
+.IP "\fBfind$(\fP\fIpattern$\fP[\fB,\fP\fInth%\fP]\fB)\fP
+Return the first (or \fInth%\fP, starting from 0, if specified) filename
+that matches the given pattern or the empty string, if no filename
+matches the pattern. This function is usually used to check for the
+existance of a file. The pattern may use the wildcards \fB*\fP to match
+an arbitrary number of characters and \fB?\fP to match a single character.
+Note: On some systems, the star does not match a dot inside a filename.
+In this implementation, the star matches everything and \fB*.*\fP only
+matches files with a dot in their name, not files without an extension.
+Some systems also encode file attributes in the eigth bit of the
+file name and programs strip that bit from the output of \fBfind$\fP.
+It is recommended to use only 7-bit file names with applications using
+this function.
+.IP "\fBfix(\fP\fIx\fP\fB)\fP"
+Return the integral part of a floating point value.
+.IP "\fBfp(\fP\fIx\fP\fB)\fP"
+Return the fractional part of a floating point value.
+.IP "\fBfrac(\fP\fIx\fP\fB)\fP"
+Return the fractional part of a floating point value; same as \fBfp\fP.
+.IP "\fBfreefile\fP"
+Return the first free file handle.
+.IP "\fBhex$(\fP\fIn%\fP\fB)\fP"
+Return a string containing the hexadecimal conversion of \fIn%\fP.
+.IP "\fBhex$(\fP\fIn%\fP\fB,\fP\fIdigits%\fP\fB)\fP"
+Return a string containing the hexadecimal conversion of \fIn%\fP
+with the specified number of \fIdigits%\fP.
+.IP "\fBinkey$\fP[\fB(\fP\fItimeout%\fP[\fB,\fP\fIchannel\fP]\fB)\fP]"
+Wait at most \fItimeout\fP hundredths of a second for a character to
+be read from the terminal. If a character could be read, return it,
+otherwise return the empty string. Omitting the \fItimeout%\fP will
+return immediatly if no character is available. Note: Some BASIC
+dialects wait until a character is available if no timeout is given
+instead of returning an empty string. Convert those programs by using
+\fBinput$(1)\fP instead.
+.IP "\fBinp(\fP\fIaddress\fP\fB)\fP"
+Return the value of the I/O port \fIaddress\fP. Direct port access is
+not available in the portable version.
+.IP "\fBinput$(\fP\fIlength\fP[\fB,\fP\fIchannel\fP]\fB)\fP"
+Read a string of \fIlength\fP characters from standard input or from
+the specified \fIchannel\fP. The characters will not be echoed.
+.IP "\fBinstr(\fP\fIhaystack$\fP\fB,\fP\fIneedle$\fP\fB)\fP"
+Return the position of \fIneedle$\fP in \fIhaystack$\fP. If \fIneedle$\fP
+is not found, then 0 is returned.
+.IP "\fBinstr(\fP\fIstart%\fP\fB,\fP\fIhaystack$\fP\fB,\fP\fIneedle$\fP\fB)\fP"
+As above, but start searching at position \fIstart%\fP (first position is 1).
+.IP "\fBinstr(\fP\fIhaystack$\fP\fB,\fP\fIneedle$\fP\fB,\fP\fIstart%\fP\fB)\fP"
+As above, but some BASIC dialects have this order of parameters.
+.IP "\fBinstr(\fP\fIhaystack$\fP\fB,\fP\fIneedle$\fP\fB,\fP\fIstart%\fP\fB,\fP\fIlength%\fP\fB)\fP"
+As above, but only limit search to the first \fIlength%\fP characters
+starting at position \fIstart%\fP.
+.IP "\fBint(\fP\fIx\fP\fB)\fP"
+Return the integral value nearest to \fIx\fP (rounded downwards).
+.IP "\fBint%(\fP\fIx\fP\fB)\fP"
+Same as \fBint\fP, but return an integer.
+.IP "\fBip(\fP\fIx\fP\fB)\fP"
+Return the integral part of a floating point value; same as \fBfix\fP.
+.IP "\fBlcase$(\fP\fIstring$\fP\fB)\fP"
+Return the string with all characters changed to lower case.
+.IP "\fBlower$(\fP\fIstring$\fP\fB)\fP"
+Same as \fBlcase\fP, some dialects call it this way.
+.IP "\fBleft$(\fP\fIstring$\fP\fB,\fP\fIn%\fP\fB)\fP"
+Return the first \fIn%\fP characters of the \fIstring\fP. If \fIn\fP is
+greater than the number of characters in the string, the whole
+string is returned.
+.IP "\fBlen(\fP\fIstring$\fP\fB)\fP"
+Return the length (number of characters) of the \fIstring\fP.
+.IP "\fBloc(\fP\fIchannel%\fP\fB)\fP"
+If used on random-access files, the number of the last accessed record
+is returned. For sequential files, the current read/write position is
+returned. Note: Some BASIC dialects return the record position in bytes
+and the read/write position in pseudo-records.
+.IP "\fBlof(\fP\fIchannel%\fP\fB)\fP"
+Return the size of the file that is attached to the channel (bytes
+for sequential or binary files, records for random-access files).
+This may not work correctly for files with sizes that exceed the range
+of integer numbers. Note: Some BASIC dialects return the number of
+bytes even for random-access files.
+.IP "\fBlog(\fP\fIx\fP\fB)\fP"
+Return the natural logarithm of \fIx\fP.
+.IP "\fBlog10(\fP\fIx\fP\fB)\fP"
+Return the base-10 logarithm of \fIx\fP.
+.IP "\fBlog2(\fP\fIx\fP\fB)\fP"
+Return the base-2 logarithm of \fIx\fP.
+.IP "\fBmatch(\fP\fIneedle$\fP\fB,\fP\fIhaystack$\fP\fB,\fP\fIstart%\fP\fB)\fP"
+Return the first position of \fIneedle$\fP in \fIhaystack$\fP that
+is greater than or equal \fIstart%\fP. If the search fails or if
+\fIstart%\fP exceeds the length of \fIhaystack$\fP, 0 will be returned.
+The following characters in \fIneedle$\fP have a special meaning:
+\fB!\fP matches any letter, \fB#\fP matches any digit, \fB?\fP matches
+any character and \fB\e\fP quotes the next character, e.g. \fB\e?\fP
+matches a question mark.
+.IP "\fBmax(\fP\fIx\fP\fB,\fP\fIy\fP\fB)\fP"
+Return the maximum of \fIx\fP and \fIy\fP.
+.IP "\fBltrim$(\fP\fIstring$\fP\fB)\fP"
+Return the string without leading spaces.
+.IP "\fBmid$(\fP\fIstring$\fP\fB,\fP\fIposition%\fP[\fB,\fP\fIlen%\fP]\fB)\fP"
+Return the substring of \fIstring\fP that begins at the given
+\fIposition%\fP (the first character is at position 1). If \fIstring\fP
+is too short for a substring of \fIlen%\fP characters, fewer characters
+will be returned.
+.IP "\fBmin(\fP\fIx\fP\fB,\fP\fIy\fP\fB)\fP"
+Return the minimum of \fIx\fP and \fIy\fP.
+.IP "\fBmkd$(\fP\fIx\fP\fB)\fP"
+Return a string whose characters contain the bytes of a C double precision
+number. The string length and byte encoding depends of the machine type
+and is not portable.
+.IP "\fBmks$(\fP\fIx\fP\fB)\fP"
+Return a string whose characters contain the bytes of a C single precision
+number. The string length and byte encoding depends of the machine type
+and is not portable.
+.IP "\fBmki$(\fP\fIx\fP\fB)\fP"
+Return a string whose characters contain the bytes of a little endian
+integral value. The string length depends of the machine type, but
+the little endian encoding allows to store only e.g. the first two bytes
+if the value does not exceed the range of a signed 16 bit number.
+.IP "\fBoct$(\fP\fIn%\fP\fB)\fP"
+Return a string containing the octal conversion of \fIn%\fP.
+.IP "\fBpeek(\fP\fIaddress\fP\fB)\fP"
+Return the value of the memory \fIaddress\fP. Direct memory access is
+not available in the portable version.
+.IP "\fBpi\fP"
+Return the constant pi.
+.IP "\fBpos(\fP\fIdummy\fP\fB)\fP"
+Return the current cursor position, starting with 1 as the leftmost
+position. The numeric \fIdummy\fP argument is needed, because old BASIC
+implementations did not allow functions without arguments.
+.IP "\fBpos(\fP\fIhaystack$\fP\fB,\fP\fIneedle$\fP\fB,\fP\fIstart%\fP\fB)\fP"
+Same as \fBinstr$\fP, some dialects use this function name.
+.IP "\fBrad(\fP\fIdegrees\fP\fB)\fP"
+Convert degrees to radians.
+.IP "\fBright$(\fP\fIstring$\fP\fB,\fP\fIn%\fP\fB)\fP"
+Return the last \fIn\fP characters of the \fIstring\fP. If \fIn%\fP is
+greater than the number of characters in the string, the whole
+string is returned.
+.IP "\fBrnd(\fP[\fIx%\fP]\fB)\fP"
+Return a random integer number between 1 and \fIx%\fP. If \fIx%\fP is zero,
+one or missing, a real number between 0.0 and 1.0 is returned. If \fIx%\fP is
+negative, the random number generator will be seeded with \fB-\fP\fIx%\fP
+and the functions returns a value as if \fB-\fP\fIx%\fP had been passed
+to it.
+.IP "\fBrtrim$(\fP\fIstring$\fP\fB)\fP"
+Return the string without trailing spaces.
+.IP "\fBseg$(\fP\fIstring$\fP\fB,\fP\fIposition%\fP\fB,\fP\fIlen%\fP\fB)\fP"
+Same as \fBmid$\fP, some dialects use this function name.
+.IP "\fBsgn(\fP\fIx\fP\fB)\fP"
+Return the sign \fIx\fP: \-1 for negative numbers, 0 for 0 and 1 for
+positive numbers.
+.IP "\fBsin(\fP\fIx_rad\fP\fB)\fP"
+Return the sine value of \fIx_rad\fP.
+.IP "\fBspace$(\fP\fIlength%\fP\fB)\fP"
+Return a string containing \fIlength%\fP spaces.
+.IP "\fBsqr(\fP\fIx\fP\fB)\fP"
+Return the square root of \fIx\fP.
+.IP "\fBstr$(\fP\fIx\fP\fB)\fP"
+Return a string that contains the decimal represantation of \fIx\fP.
+.IP "\fBstring$(\fP\fIlength\fP\fB,\fP\fIx\fP\fB)\fP"
+Return a string of size \fIlength\fP whose characters have the decimal
+code \fIx\fP.
+.IP "\fBstring$(\fP\fIlength%\fP\fB,\fP\fIx$\fP\fB)\fP"
+Return a string of size \fIlength%\fP whose characters are the first
+character of \fIx$\fP.
+.IP "\fBstrip$(\fP\fIstring\fP\fB)\fP"
+Return the string with the eighth bit of each character cleared.
+.IP "\fBtan(\fP\fIx_rad\fP\fB)\fP"
+Return the tangent of \fIx_rad\fP.
+.IP "\fBtime\fP"
+Return the current value of the centisecond counter.
+.IP "\fBtime$\fP"
+Return the time as a 8-character string in the form
+\fIhh\fP\fB\-\fP\fImm\fP\fB\-\fP\fIss\fP.
+.IP "\fBtimer\fP
+Return the number of seconds elapsed since midnight local time.
+.IP "\fBtrue\fP"
+Return \-1.
+.IP "\fBucase$(\fP\fIstring$\fP\fB)\fP"
+Return the string with all characters changed to upper case.
+.IP "\fBupper$(\fP\fIstring$\fP\fB)\fP"
+Same as \fBucase$\fP, some dialects call it this way.
+.IP "\fBval(\fP\fIstring$\fP\fB)\fP"
+If possible, then convert the \fIstring$\fP into an integer or floating
+point value, ignoring trailing junk. Otherwise, return 0.0. Like
+anywhere else, hexadecimal values are specified by a leading \fB&h\fP.
+.\"}}}
+.\"}}}
+.SH OPTIONS \"{{{
+.IP "\fB\-b\fP, \fB\-\-backslash\-colon\fP"
+Convert backslashs to colons. By default, a backslash is the operator
+for integer division, but in some BASIC dialects it forms compound
+statements as the colon does.
+.IP "\fB\-l\fP \fIfile\fP, \fB\-\-lp\fP \fIfile\fP"
+Write \fBLLIST\fP and \fBLPRINT\fP output to \fIfile\fP. By default,
+that output will be written to \fB/dev/null\fP.
+.IP "\fB\-r\fP, \fB\-\-restricted\fP"
+Restricted operation which does not allow to fork a shell.
+.IP "\fB\-u\fP, \fB\-\-uppercase\fP"
+Output all tokens in uppercase. By default, they are lowercase,
+which is easier to read, but some BASIC dialects require uppercase.
+This option allows to save programs for those dialects.
+.IP "\fB\-h\fP, \fB\-\-help\fP"
+Output usage and exit.
+.IP "\fB\-v\fP, \fB\-\-version\fP"
+Display version information and exit.
+.\"}}}
+.SH AUTHOR \"{{{
+This program is copyright 1999\(en2014 Michael Haardt
+<michael@moria.de>.
+.PP
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+.PP
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+.PP
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+.\"}}}
+.SH HISTORY \"{{{
+There has been a \fIbas\fP(1) command in UNIX v7, but its syntax
+was strongly influenced by C, unlike common classic BASIC dialects, and
+thus not compatible with this implementation.
+.\"}}}
+.SH "SEE ALSO" \"{{{
+The Usenet group comp.lang.basic.misc discusses the classic BASIC dialect.
+.\"}}}