README file for
Bywater BASIC Interpreter, version 3.10
---------------------------------------------
Copyright (c) 1993, Ted A. Campbell
for bwBASIC version 2.10, 11 October 1993
Version 2.20 modifications by Jon B. Volkoff,
25 November 1995
Patch level 1 release by Jon B. Volkoff,
15 March 1996
Patch level 2 release by Jon B. Volkoff,
11 October 1997
Version 2.30 modifications by Paul Edwards,
5 March 2008
Version 2.40 modifications by Paul Edwards,
26 Jan 2009
Version 2.50 modifications by Paul Edwards,
4 June 2009
Version 2.60 modifications by Paul Edwards,
6 November 2012
Version 2.61 modifications by Paul Edwards,
4 August 2014
Version 3.00 modifications by Howard Wulf, AF5NE
12 May 2015
Version 3.10 modifications by Howard Wulf, AF5NE
27 July 2016
DESCRIPTION:
The Bywater BASIC Interpreter (bwBASIC) implements a large
superset of the ANSI Standard for Minimal BASIC (X3.60-1978)
and a significant subset of the ANSI Standard for Full BASIC
(X3.113-1987) in C. It also offers shell programming facilities
as an extension of BASIC. bwBASIC seeks to be as portable
as possible.
This version of Bywater BASIC is released under the terms of the
GNU General Public License (GPL), which is distributed with this
software in the file "COPYING". The GPL specifies the terms
under which users may copy and use the software in this distribution.
A separate license is available for commercial distribution,
for information on which you should contact the author.
OBTAINING THE SOURCE CODE:
The source code for bwBASIC is available from
http://bwbasic.sourceforge.net
COMMUNICATIONS:
email: tcamp@delphi.com (for Ted Campbell)
eidetics@cerf.net (for Jon Volkoff)
mutazilah@gmail.com (for Paul Edwards)
A LIST OF BASIC COMMANDS AND FUNCTIONS IMPLEMENTED in bwBASIC:
Be aware that many of these commands and functions will not be
available unless you have enabled a particular dialect using
the OPTION VERSION command.
# X
+ X
- X
? expressions...
A$ LIKE B$
APPEND filename$ | APPEND # filenumber
AS string-variable$ [, ...]
AUTO [start [, increment]]
BACKSPACE # X
BREAK line [, ...]]
BYE
CALL subroutine-name( [parameter [, ...] ] )
CASE ELSE
CASE constant [TO constant] | CASE IF partial-expression | CASE IS partial-expression
CHAIN filename$ [, linenumber]
CHANGE A$ TO X | CHANGE X TO A$
CLEAR
CLOAD [file-name$]
CLOAD* ArrayName
CLOSE filename$ [, ...]
CLR
CMDS
COMMON variable [, ...]
CONSOLE [WIDTH width]
CONT
CREATE filename$ [ RECL reclen ] AS filenum [ BUFF number ] [ RECS size ]
CSAVE [file-name$]
CSAVE* ArrayName
DATA constant [, ...]
DEF FNname[(arg...)] [= expression]
DEF SUB
DEFBYT letter[-letter] [, ...]
DEFCUR letter[-letter] [, ...]
DEFDBL letter[-letter] [, ...]
DEFINT letter[-letter] [, ...]
DEFLNG letter[-letter] [, ...]
DEFSNG letter[-letter] [, ...]
DEFSTR letter[-letter] [, ...]
DELETE line [- line]
DELIMIT # X, A$
DIM variable( elements [, ...]) [, ...]
DO [UNTIL|WHILE expression]
DSP variable [, ...]]
EDIT
ELSE
ELSEIF
END
END FUNCTION
END IF
END SELECT
END SUB
ERASE variable [, ...]
EXCHANGE variable, variable
EXIT
EXIT DO
EXIT FOR
EXIT FUNCTION
EXIT SUB
EXIT UNTIL
EXIT WHILE
FEND
FIELD [#] device-number, number AS string-variable$ [, ...]
FILE # X, A$
FILES A$[, ...]
FNCS
FNEND
FOR variable = start TO finish [STEP increment]
FUNCTION [ ( parameter [, ... ] ) ]
GET filename$ , scalar [, ...]
GO
GO SUB line
GO TO line
GOODBYE
GOSUB line
GOTO line
HELP name
IF END # filenum THEN line1 [ELSE line2]
IF MORE # filenum THEN line1 [ELSE line2]
IF expression THEN
IF expression THEN line1 [ELSE line2]
IMAGE "format string"
INPUT [# device-number]|[;]["prompt string";] variable [, ...]s
LINE INPUT [[#] device-number,]["prompt string";] string-variable$
LIST line1 [- line2]
LLIST line1 [- line2]
LOAD [file-name$]
LOOP [UNTIL|WHILE expression]
LPRINT [USING format-string$;] expressions...
LPRINTER [WIDTH width]
LSET string-variable$ = expression
MAINTAINER
MARGIN # filenumber, width
MAT GET filename$, arrayname
MAT INPUT arrayname
MAT PRINT arrayname
MAT PUT filename$, arrayname
MAT READ arrayname
MAT WRITE arrayname
MAT arrayname = expression
MERGE file-name
MID$( variable$, start [, count ] ) = expression
N = ABS( X )
N = ACOS( X )
N = ACS( X )
N = ACSD( X )
N = ACSG( X )
N = ANGLE( X, Y )
N = ARCSIN( X )
N = ARCTAN( X )
N = ARGC
N = ARGV( X )
N = ASC( A$ )
N = ASC( A$, X )
N = ASCII( A$ )
N = ASIN( X )
N = ASN( X )
N = ASND( X )
N = ASNG( X )
N = ATAN( X )
N = ATN( X )
N = ATND( X )
N = ATNG( X )
N = BASE
N = CATALOG
N = CATALOG( A$ )
N = CCUR( X )
N = CDBL( X )
N = CEIL( X )
N = CHDIR( A$ )
N = CINT( X )
N = CLG( X )
N = CLK( X )
N = CLNG( X )
N = CLOG( X )
N = CLOSE
N = CLOSE( X )
N = CLS
N = CODE( A$ )
N = COLOR( X, Y )
N = COS( X )
N = COSD( X )
N = COSG( X )
N = COSH( X )
N = COT( X )
N = COUNT
N = CSC( X )
N = CSH( X )
N = CSNG( X )
N = CVC( A$ )
N = CVD( A$ )
N = CVI( A$ )
N = CVL( A$ )
N = CVS( A$ )
N = DATE
N = DEF FN
N = DEG
N = DEG( X )
N = DEGREE
N = DEGREE( X )
N = DET
N = DIM( ... )
N = ENVIRON( A$ )
N = EOF( X )
N = EPS( X )
N = ERL
N = ERR
N = ERRL
N = ERRN
N = ERROR( X )
N = ERROR( X, A$ )
N = EXAM( X )
N = EXP( X )
N = FETCH( X )
N = FILEATTR( X, Y )
N = FILES
N = FILES( A$ )
N = FILL( X, Y )
N = FIX( X )
N = FLOAT( X )
N = FLOW
N = FP( X )
N = FRAC( X )
N = FRE
N = FRE( A$ )
N = FRE( X )
N = FREE
N = FREE( A$ )
N = FREE( X )
N = FREEFILE
N = GET( X )
N = GET( X, Y )
N = GRAD
N = GRADIAN
N = HCS( X )
N = HOME
N = HSN( X )
N = HTN( X )
N = INDEX( A$, B$ )
N = INITIALIZE
N = INP( X )
N = INSTR( A$, B$ )
N = INSTR( X, A$, B$ )
N = INT%( X )
N = INT( X )
N = IP( X )
N = KILL( A$ )
N = LBOUND( ... )
N = LEN( A$ )
N = LGT( X )
N = LN( X )
N = LOC( X )
N = LOCATE( X, Y )
N = LOF( X )
N = LOG( X )
N = LOG10( X )
N = LOG2( X )
N = LOGE( X )
N = LPOS
N = LTW( X )
N = LWIDTH( X )
N = MATCH( A$, B$, X )
N = MAX( X, Y )
N = MAXBYT
N = MAXCUR
N = MAXDBL
N = MAXDEV
N = MAXINT
N = MAXLEN( A$ )
N = MAXLNG
N = MAXLVL
N = MAXNUM
N = MAXSNG
N = MEM
N = MIN( X, Y )
N = MINBYT
N = MINCUR
N = MINDBL
N = MINDEV
N = MININT
N = MINLNG
N = MINNUM
N = MINSNG
N = MKDIR( A$ )
N = MOD( X, Y )
N = NAME( A$, B$ )
N = NOFLOW
N = NOTRACE
N = NULL( X )
N = NUM
N = NUM( A$ )
N = OPEN( A$, X, B$ )
N = OPEN( A$, X, B$, Y )
N = ORD( A$ )
N = OUT( X, Y )
N = PAUSE( X )
N = PDL( X )
N = PEEK( X )
N = PI
N = PI( X )
N = PIN( X )
N = POKE( X, Y )
N = POS
N = POS( A$, B$ )
N = POS( A$, B$, X )
N = POS( X )
N = PUT( X )
N = PUT( X, Y )
N = RAD
N = RAD( X )
N = RADIAN
N = RAN
N = RAN( X )
N = RANDOM
N = RANDOM( X )
N = RANDOMIZE
N = RANDOMIZE( X )
N = REMAINDER( X, Y )
N = RENAME( A$, B$ )
N = RESET
N = RMDIR( A$ )
N = RND
N = RND( X )
N = ROUND( X, Y )
N = SEC( X )
N = SEEK( X )
N = SEEK( X, Y )
N = SGN( X )
N = SHELL( A$ )
N = SIN( X )
N = SIND( X )
N = SING( X )
N = SINH( X )
N = SIZE( ... )
N = SIZE( A$ )
N = SLEEP( X )
N = SNH( X )
N = SQR( X )
N = SQRT( X )
N = STUFF( X, Y )
N = TAN( X )
N = TAND( X )
N = TANG( X )
N = TANH( X )
N = TI
N = TIM
N = TIM( X )
N = TIME
N = TIME( X )
N = TIMER
N = TOP
N = TRACE
N = TROFF
N = TRON
N = TRUNCATE( X, Y )
N = UBOUND( ... )
N = UNSAVE( A$ )
N = VAL( A$ )
N = VTAB( X )
N = WAIT( X )
N = WAIT( X, Y )
N = WAIT( X, Y, Z )
N = WIDTH( X )
N = WIDTH( X, Y )
NAME old-file-name AS new-file-name
NEW
NEXT [variable]
NOT X
OF line, ...
OLD [file-name$]
ON ERROR ...
ON ERROR GOSUB errline
ON ERROR GOTO errline
ON ERROR RESUME ...
ON ERROR RESUME NEXT
ON ERROR RETURN ...
ON ERROR RETURN NEXT
ON TIMER count GOSUB line
ON expression GOTO | GOSUB line [, ...]
OPEN file-name [FOR INPUT|OUTPUT|APPEND|BINARY|RANDOM] AS [#]device-number [LEN = record-length]
OPTION ...
OPTION ANGLE ...
OPTION ANGLE DEGREES
OPTION ANGLE GRADIANS
OPTION ANGLE RADIANS
OPTION ARITHMETIC
OPTION ARITHMETIC DECIMAL
OPTION ARITHMETIC FIXED
OPTION ARITHMETIC NATIVE
OPTION BASE X
OPTION BUGS
OPTION BUGS OFF
OPTION BUGS ON
OPTION COMMENT char
OPTION COMPARE
OPTION COMPARE BINARY
OPTION COMPARE DATABASE
OPTION COMPARE TEXT
OPTION COVERAGE
OPTION COVERAGE OFF
OPTION COVERAGE ON
OPTION DATE format
OPTION DISABLE
OPTION DISABLE COMMAND name
OPTION DISABLE FUNCTION name
OPTION DISABLE OPERATOR name
OPTION ENABLE
OPTION ENABLE COMMAND name
OPTION ENABLE FUNCTION name
OPTION ENABLE OPERATOR name
OPTION ERROR
OPTION ERROR GOSUB
OPTION ERROR GOTO
OPTION EXPLICIT
OPTION IMAGE char
OPTION IMPLICIT
OPTION INDENT number
OPTION LABELS
OPTION LABELS OFF
OPTION LABELS ON
OPTION PRINT char
OPTION ROUND
OPTION ROUND BANK
OPTION ROUND MATH
OPTION ROUND TRUNCATE
OPTION SLEEP number
OPTION STATEMENT char
OPTION STDERR filename$
OPTION STDIN filename$
OPTION STDOUT filename$
OPTION STRICT
OPTION STRICT OFF
OPTION STRICT ON
OPTION TERMINAL
OPTION TERMINAL ADM
OPTION TERMINAL ANSI
OPTION TERMINAL NONE
OPTION TIME format
OPTION TRACE
OPTION TRACE OFF
OPTION TRACE ON
OPTION USING string$
OPTION VERSION [version]
PAUSE [comment]
POP
PRINT [# device-number,][USING format$;] expressions ...
PUT filename$ , value [, ...]
QUIT
READ variable [, ...]
RECALL ArrayName
REM ...
RENAME [file-name$]
RENUM
RENUMBER
RESET filename$ [, ...]
RESTORE [line]
RESUME [ 0 | line | NEXT ]
RETURN
RSET string-variable$ = expression
RUN [line | file-name$]
S$ = ARGT$( X )
S$ = ARGV$( X )
S$ = CHAR$( X )
S$ = CHAR( X, Y )
S$ = CHR$( X )
S$ = CHR( X )
S$ = CLK$
S$ = CLK( X )
S$ = COMMAND$( X )
S$ = CUR( X, Y )
S$ = DAT$
S$ = DATE$
S$ = DATE$( X )
S$ = ENVIRON$( A$ )
S$ = ERR$
S$ = ERROR$
S$ = HEX$( X )
S$ = INKEY$
S$ = INPUT$( X )
S$ = INPUT$( X, Y )
S$ = KEY
S$ = KEY$
S$ = LCASE$( A$ )
S$ = LEFT$( A$, X )
S$ = LEFT( A$, X )
S$ = LIN( X )
S$ = LTRIM$( A$ )
S$ = MAX( A$, B$ )
S$ = MID$( A$, X )
S$ = MID$( A$, X, Y )
S$ = MID( A$, X )
S$ = MID( A$, X, Y )
S$ = MIN( A$, B$ )
S$ = MKC$( X )
S$ = MKD$( X )
S$ = MKI$( X )
S$ = MKL$( X )
S$ = MKS$( X )
S$ = NUM$( X )
S$ = OCT$( X )
S$ = REPEAT$( X, A$ )
S$ = REPEAT$( X, Y )
S$ = RIGHT$( A$, X )
S$ = RIGHT( A$, X )
S$ = RTRIM$( A$ )
S$ = SEG$( A$, X, Y )
S$ = SEG( A$, X, Y )
S$ = SPA( X )
S$ = SPACE$( X )
S$ = SPACE( X )
S$ = SPC( X )
S$ = STR$( X )
S$ = STR( X, Y )
S$ = STRING$( X, A$ )
S$ = STRING$( X, Y )
S$ = STRING( X, Y )
S$ = TAB( X )
S$ = TI$
S$ = TIME$
S$ = TIME$( X )
S$ = TRIM$( A$ )
S$ = UCASE$( A$ )
SAVE [file-name$]
SCRATCH # X
SELECT
SELECT CASE expression
STEP
STOP
STORE ArrayName
SUB name [ ( parameter [,...] ) ]
SUBEND
SWAP variable, variable
SYSTEM
TEXT letter[-letter] [, ...]
THEN line1
TIMER
TIMER OFF
TIMER ON
TIMER STOP
TLOAD [file-name$]
TO
TRACE OFF
TRACE ON
TRACE ON | OFF
TSAVE [file-name$]
UEND
UNTIL expression
USE parameter$
USER LBL
VARS
WEND
WHILE
WRITE [# device-number,] element [, .... ]
X # Y
X & Y
X * Y
X ** Y
X + Y
X - Y
X / Y
X < Y
X <= Y
X <> Y
X = Y
X =< Y
X => Y
X > Y
X >< Y
X >= Y
X AND Y
X EQ Y
X EQV Y
X GE Y
X GT Y
X IMP Y
X LE Y
X LT Y
X MAX Y
X MIN Y
X MOD Y
X NE Y
X OR Y
X XOR Y
X XRA Y
X [ Y
X \ Y
X ^ Y
[LET] variable = expression
CHANGE HISTORY
CHANGES FROM 3.00 to 3.10
* Implements most of the following BASIC dialects:
OPTION VERSION DARTMOUTH ' Dartmouth DTSS BASIC
OPTION VERSION MARK-I ' GE 265 Mainframe BASIC
OPTION VERSION MARK-II ' GE 435 Mainframe BASIC
OPTION VERSION SYSTEM-360 ' IBM System/360 BASIC
OPTION VERSION SYSTEM-370 ' IBM System/370 BASIC
OPTION VERSION CBASIC-II ' CBASIC-II for CP/M
OPTION VERSION ECMA-55 ' ANSI Minimal BASIC
OPTION VERSION HANDBOOK1 ' The BASIC Handbook, 1st Edition
OPTION VERSION HANDBOOK2 ' The BASIC Handbook, 2nd Edition
OPTION VERSION TRS-80 ' TRS-80 Model I/III/4 LBASIC
OPTION VERSION BASIC-80 ' Microsoft BASIC-80 for Xenix
OPTION VERSION ECMA-116 ' ANSI Full BASIC
* from Howard Wulf, AF5NE
CHANGES FROM 2.61 to 3.00
* Code redesign from Howard Wulf, AF5NE
CHANGES FROM 2.60 to 2.61
* Bug fix from Matthias Rustler
CHANGES FROM 2.50 to 2.60
* New maths functions and append mode support from Edmond Orignac
* Bug fixes
CHANGES FROM 2.40 to 2.50
* Bug fixes
* New compilation procedure for MVS and CMS
CHANGES FROM 2.30 to 2.40
* Bug fixes from Bill Chatfield
* Updated documentation
* Added support for compiling on CMS (another IBM mainframe OS)
CHANGES FROM 2.20pl2 to 2.30
* Minor bug fixes, cosmetic improvements and portability improvements
* Added support for compiling on MVS (IBM mainframe)
CHANGES FROM 2.20pl1 to 2.20pl2
bwb_cmd.c
Fixed calling stack level logic in RETURN statement to prevent erroneous
"RETURN without GOSUB" messages.
bwb_cnd.c
bwb_stc.c
Changed continuation condition for WHILE, ELSEIF, and LOOP UNTIL
to be != FALSE, not == TRUE. More in line with common commercial
BASIC implementations.
bwb_mth.c
Fixed initialization in VAL function so that old results are not later
returned as values.
bwb_var.c
Added parenthesis level checking to dim_getparams. Using multi-level
expressions as array subscripts was causing the program to bomb.
bwx_iqc.c
bwx_tty.c
bwb_mes.h
Added second copyright notice.
bwb_dio.c
bwb_str.c
Added support for strings longer than 255 characters.
bwb_prn.c
Disabled tab expansion and print width checks when not printing to a file.
bwb_inp.c
Fixed LINE INPUT file reads to accommodate strings of length MAXSTRINGSIZE.
bwx_ncu.h
bwx_ncu.c
New files. Code for UNIX ncurses interface, compliments of L.C. Benschop,
Eindhoven, The Netherlands.
Makefile.ncu
New files. Sample makefile for ncurses implementation.
bwbasic.h
Revised defines for MININTSIZE and MAXINTSIZE from 16-bit to 32-bit limits.
Revised define for MAXSTRINGSIZE from 255 to 5000 characters.
Changed string length from unsigned char to unsigned int to support strings
longer than 255 characters.
Added support for new ncurses package.
Revised VERSION define to reflect above changes.
CHANGES FROM 2.20 to 2.20pl1
bwb_cnd.c
Moved init routine for bwb_while so that it would be initialized regardless
of expression value, not just if TRUE. This was causing some segmentation
faults in WHILE-WEND loops.
bwb_elx.c
Plugged gaping memory leak. Temp variable space for expression evaluation
was being allocated but not freed when done (oops!).
bwb_fnc.c
Added check for NULL return from getenv to prevent segmentation faults.
bwbasic.h
Revised VERSION define to reflect above changes.
CHANGES FROM 2.10 to 2.20:
* Plugged numerous memory leaks, resolved memory overruns and allocation
difficulties.
* General cleanup and bug fixes, too many to list in detail here.
The major problem areas addressed were:
- RUN command with file name argument
- nested and cascaded FOR-NEXT loops
- PRINT USING
- EOF, LOF functions
- string concatenation
- operator hierarchy
- multi-level expression evaluation
- hex constant interpretation
- hex and octal constants in INPUT and DATA statements
* Added a CLOSE all files feature (when no argument supplied).
* Added a unary minus sign operator.
* Added a MID$ command to complement the MID$ function.
* Added a RENUM facility in a standalone program.
* Added checking in configure for unistd.h (important on Sun systems).