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).