Introduction to the Microsoft BASIC Interpreter
Special Characters
Variable Type Declaration Chars
Edit Mode Subcommands
Program Statements (except I/O)
PRINT USING Format Field Specifiers
Input/Output Statements
Arithmetic Functions
String Functions
I/O and Special Functions
Interpreter Error Codes
Introduction to the Microsoft BASIC Compiler
Compiler Commands and Switches
Compiler Error Messages
:Introduction to the Microsoft BASIC Interpreter

    This  HELP File is derived from the "Microsoft BASIC Reference  Book",
and  it  is divided into two parts -- one covering the Interpreter and  the
other  covering the Compiler.   These programs process programs written  in
almost  exactly  the  same language -- Microsoft  BASIC;  there  are  minor
differences between the two,  however,  and these are discussed in the file
under the Compiler Introduction.

    The MBASIC (Microsoft BASIC) Interpreter is invoked as follows --

         MBASIC [<filename>][/F:<# files>][/M:<memory loc>]

If  <filename> is present,  MBASIC proceeds as if a RUN <filename>  command
were typed after initialization is complete.   A default extension of  .BAS
is  assumed.   If /F:<# files> is present,  it sets the number of disk data
files  that may be open at any one time during the execution of a  program.
The  default  here  is 3.   The /M:<memory loc>  sets  the  highest  memory
locations that will be used by MBASIC.   All memory to the start of FDOS is
used by default.
:Special Characters
^A        Enters Edit Mode on line being typed or last line typed
^C        Interrupts program execution and returns to MBASIC
^G        Rings <BELL> at terminal
^H        Deletes last char typed
^I        Tab (every 8)
^O        Halts/resumes program output
^R        Retypes the line currently being typed
^S        Suspends program execution
^Q        Resumes execution after ^S
^U,^X     Deletes line being typed
<CR>      Ends every line being typed in
<LF>      Breaks a logical line into physical lines
<DEL>     Deletes last char typed
<ESC>     Escapes Edit Mode Subcommands
        Current line for EDIT, RENUM, DELETE, LIST, LLIST commands
&O,&      Prefix for Octal Constant
&H        Prefix for Hex Constant
:        Separates statements typed on the same line
?        Equivalent to PRINT statement
:Variable Type Declaration Characters

$    String              0 to 255 chars

%    Integer             -32768 to 32767

!    Single Precision    7.1 digit floating point

#    Double Precision    17.8 digit floating point

Command   Syntax                        Function
AUTO      AUTO [line][,inc]             Generate line numbers
CLEAR     CLEAR [,[exp1][,exp2]]        Clear program variables;  Exp1 sets
                                       end  of memory and Exp2 sets amount
                                       of stack space
CONT      CONT                          Continue program execution
DELETE    DELETE [[start][-[end]]]      Delete program lines
EDIT      EDIT line                     Edit a program line

FILES     FILES [filename]              Directory
LIST      LIST [line[-[line]]]          List program line(s)
LLIST     LLIST [line[-[line]]]         List program line(s) on printer
LOAD      LOAD filename[,R]             Load program; ,R means RUN
MERGE     MERGE filename                Merge prog on disk with that in mem

NAME      NAME old AS new               Change the name of a disk file
NEW       NEW                           Delete current prog and vars
NULL      NULL exp                      Set num of <NULL>s after each line
RENUM     RENUM [[new][,[old][,inc]]]   Renumber program lines
RESET     RESET                         Init CP/M; use after disk change

Command   Syntax                        Function
RUN       RUN [line number]             Run a prog (from a particular line)
         RUN filename[,R]              Run a prog on disk
SAVE      SAVE filename[,A or ,P]       Save prog onto disk;  ,A saves prog
                                       in ASCII and ,P protects file
SYSTEM    SYSTEM                        Return to CP/M
TROFF     TROFF                         Turn trace off
TRON      TRON                          Turn trace on
WIDTH     WIDTH [LPRINT] exp            Set term or printer carriage width;
                                       default is 80 (term) and 132 (prin)
:Edit Mode Subcommands
A         Abort -- restore original line and restart Edit
nCc       Change n characters
nD        Delete n characters
E         End edit and save changes; don't type rest of line
Hstr<ESC> Delete rest of line and insert string
Istr<ESC> Insert string at current pos
nKc       Kill all chars up to the nth occurrance of c
L         Print the rest of the line and go to the start of the line
Q         Quit edit and restore original line
nSc       Search for nth occurrance of c
Xstr<ESC> Goto the end of the line and insert string
<DEL>     Backspace over chars; in insert mode, delete chars
<CR>      End edit and save changes
:Program Statements (except I/O)
Statement Syntax                        Function
CALL      CALL variable [(arg list)]    Call assembly or FORTRAN routine
CHAIN     CHAIN [MERGE] filename [,[line exp][,ALL][,DELETE range]]
              Call  a program and pass variables to it;  MERGE with  ASCII
              files allows overlays; start at line exp if given; ALL means
              all variables will be passed (otherwise COMMON only); DELETE
              allows deletion of an overlay before CHAIN is executed
COMMON    COMMON list of vars           Pass vars to a CHAINed prog
DEF       DEF FNx[(arg list)]=exp       Arith or String Function
         DEF USRn=address              Define adr for nth assembly routine
         DEFINT range(s) of letters    Define default var type INTeger
         DEFSNG "        "   "         "         "     "   "   Single
         DEFDBL "        "   "         "         "     "   "   Double
         DEFSTR "        "   "         "         "     "   "   String
DIM       DIM list of subscripted vars  Allocate arrays

END       END                           Stop prog and close files
ERASE     ERASE var [,var ... ]         Release space and var names
ERROR     ERROR code                    Generate error code/message
FOR       FOR var=exp TO exp [STEP exp] FOR loop

Statement Syntax                        Function
GOSUB     GOSUB line number             Call BASIC subroutine
GOTO      GOTO line number              Branch to specified line
IF/GOTO   IF exp GOTO line [ELSE stmt ... ]
                                       IF exp <> 0 then GOTO
IF/THEN   IF exp THEN stmt[:stmt] [ELSE stmt ... ]
                                       IF exp <> 0 then ... else ...
LET       [LET] var=exp                 Assignment

MID$      MID$(string,n[,m])=string2    Replace  a  portion of string  with
                                       string2; start at pos n for m chars
NEXT      NEXT var[,var ... ]           End FOR
ON ERROR  ON ERROR GOTO line            Error trap subroutine
ON/GOSUB  ON exp GOSUB line[,line]      Computed GOSUB
ON/GOTO   ON exp GOTO line[,line]       Computed GOTO

Statement Syntax                        Function
OPTION    OPTION BASE n                 Min val for subscripts (n=0,1)
OUT       OUT port,byte                 Output byte to port
POKE      POKE address,byte             Memory put
RANDOMIZE RANDOMIZE [exp]               Reseed random number generator
REM       REM any text                  Remark -- comment

RESTORE   RESTORE [line]                Reset DATA pointer
RESUME    RESUME or RESUME 0            Return from ON ERROR GOTO
         RESUME NEXT                   Return to stmt after error line
         RESUME line                   Return to specified line
RETURN    RETURN                        Return from subroutine
STOP      STOP                          Stop prog and print BREAK msg
WAIT      WAIT prot,mask[,select]       Pause until input port [XOR select]
                                       AND mask <> 0

WHILE/    WHILE exp stmts ... WEND      Execute stmts as long as exp is T
:PRINT USING Format Field Specifiers
Numeric Specifiers

Specifier Digits    Chars     Definition
 #         1         1       Numeric field
 .         0         1       Decimal point
 +         0         1       Print leading or trailing sign
 -         0         1       Trailing sign (- if neg, <sp> otherwise)
 **        2         2       Leading asterisk

 $$        1         2       Floating  dollar  sign;  placed in  front  of
                             leading digit
 **$       2         3       Asterisk fill and floating dollar sign
 ,         1         1       Use comma every three digits
 ^^^^      0         4       Exponential format
 _         0         1       Next character is literal

String Specifiers

Specifier                     Definition
 !                           Single character
 /<spaces>/                  Character field; width=2+number of <spaces>
 &                           Variable length field
:Input/Output Statements

Statement Syntax/Function
CLOSE     CLOSE [[#]f[,[#]f ... ]]
          Close disk files; if no arg, close all
DATA      DATA constant list
          List data for READ statement
FIELD     FIELD [#]f,n AS string var [,n AS string var ...]
          Define fields in random file buffer
GET       GET [#]f[,record number]
          Read a record from a random disk file
INPUT     INPUT [;] [prompt string;] var [,var ...]
         INPUT [;] [prompt string,] var [,var ...]
          Read  data from the terminal;  leading semicolon suppresses echo
          of  <CR>/<LF> and semicolon after prompt string causes  question
          mark  after prompt while comma after prompt suppresses  question

Statement Syntax/Function

KILL      KILL filename
          Delete a disk file
LINE      LINE INPUT [;] [prompt string;] string var
INPUT      Read an entire line from terminal;  leading semicolon suppresses
          echo of <CR>/<LF>
         LINE INPUT #f,string var
          Read an entire line from a disk file
LSET      LSET field var=string exp
          Store data in random file buffer left-justified or  left-justify
          a non-disk string in a given field
OPEN      OPEN mode,[#] f,filename
          Open a disk file; mode must be one of --
              I = sequential input file
              O = sequential output file
              R = random input/output file
Statement Syntax/Function

PRINT     PRINT [USING format string;] exp [,exp ...]
          Print data at the terminal using the format specified
         PRINT #f, [USING format string;] exp [,exp ...]
          Write data to a disk file
         LPRINT [USING format string;] var [,var ...]
          Write data to a line printer
PUT       PUT [#] f [,record number]
          Write data from a random buffer to a data file
READ      READ var [,var ...]
          Read data from a DATA statement into the specified vars
RSET      RSET field var = string exp
          Store  data  in  a random file buffer right justified  or  right
          justify a non-disk string in a given field
WRITE     WRITE [list of exps]
          Output data to the terminal
         WRITE #f, list of exps
          Output data to a sequential file or a random field buffer

Symbol    Function
=        Assignment or equality test
-        Negation or subtraction
+        Addition or string concatenation
*        Multiplication
/        Division (floating point result)
^        Exponentiation
\        Integer division (integer result)
MOD       Integer modulus (integer result)
NOT       One's complement (integer)
AND       Bitwise AND (integer)
OR        Bitwise OR (integer)
XOR       Bitwise exclusive OR (integer)
EQV       Bitwise equivalence (integer)
IMP       Bitwise implication (integer)
=,>,<,    Relational tests (TRUE=-1, FALSE=0)

The precedence of operators is --
1.  Expressions in parentheses     8.  Relational Operators
2.  Exponentiation                 9.  NOT
3.  Negation (Unary -)            10.  AND
4.  *,/                           11.  OR
5.  \                             12.  XOR
6.  MOD                           13.  IMP
7.  +,-                           14.  EQV
:Arithmetic Functions
Function       Action

ABS(exp)       Absolute value of expression
ATN(exp)       Arctangent of expression (in radians)
CDBL(exp)      Convert the expression to a double precision number
CINT(exp)      Convert the expression to an integer
COS(exp)       Cosine of the expression (in radians)

CSNG(exp)      Convert the expression to a single precision number
EXP(exp)       Raises the constant E to the power of the expression
FIX(exp)       Returns truncated integer of expression
FRE(exp)       Gives memory free space not used by MBASIC
INT(exp)       Evaluates the expression for the largest integer

LOG(exp)       Gives the natural log of the expression
RND[(exp)]     Generates a random number
                exp <0 seeds new sequence
                exp =0 returns previous number
                exp >0 or omitted returns new random number

Function       Action

SGN(exp)       1 if exp >0
              0 if exp =0
              -1 if exp <0
SIN(exp)       Sine of the expression (in radians)
SQR(exp)       Square root of expression
TAN(exp)       Tangent of the expression (in radians)
:String Functions
Function       Action

ASC(str)       Returns ASCII value of first char in string
CHR$(exp)      Returns a 1-char string whose char has ASCII code of exp
FRE(str)       Returns remaining memory free space
HEX$(exp)      Converts a number to a hexadecimal string
INPUT$(length [,[#]f])
              Returns a string of length chars read from console or from a
              disk file; characters are not echoed

              Returns  the first position of the first occurrence of  str2
              in str1 starting at position exp
LEFT$(str,len) Returns leftmost length chars of the string expression
LEN(str)       Returns the length of a string
              Returns chars from the middle of the string starting at  the
              position  specified  to the end of the string or for  length

Function       Action

OCT$(exp)      Converts an expression to an Octal string
              Returns rightmost length chars of the string expression
SPACE$(exp)    Returns a string of exp spaces
STR$(exp)      Converts a numeric expression to a string
              Returns  a string length long containing the first  char  of
              the str
              Returns  a string length long containing chars with  numeric
              value exp
VAL(str)       Converts  the  string  representation of  a  number  to  its
              numeric value
:I/O and Special Functions

Function       Action
CVI(str)       Converts a 2-char string to an integer
CVS(str)       Converts a 4-char string to a single precision number
CVD(str)       Converts an 8-char string to a double precision number

EOF(f)         Returns TRUE (-1) if file is positioned at its end
ERL            Error Line Number
ERR            Error Code Number
INP(port)      Inputs a byte from an input port
LOC(f)         Returns next record number to read or write (random file) or
              number of sectors read or written (sequential file)
LPOS(n)        Returns carriage position of line printer (n is dummy)

MKI$(value)    Converts an integer to a 2-char string
MKS$(value)    Converts a single precision values to a 4-char string
MKD$(value)    Converts a double precision value to an 8-char string

Function       Action

PEEK(exp)      Reads a byte from memory location speci
fied by exp
POS(n)         Returns carriage position of terminal (n is dummy)

SPC(exp)       Used in PRINT statements to print spaces
TAB(exp)       Used in PRINT statements to tab to specified position

USR[n](arg)    Calls the user's machine language subroutine with the arg

VARPTR(var)    Returns address of var in memory or zero if var has not been
              assigned a value
VARPTR(#f)     Returns the address of the disk I/O buffer assigned to  file
:Interpreter Error Codes
Code Error                         Code Error
 1  NEXT without FOR               14  Out of string space
 2  Syntax error                   15  String too long
 3  RETURN without GOSUB           16  String formula too complex
 4  Out of data                    17  Can't continue
 5  Illegal function call          18  Undefined user function
 6  Overflow                       19  No RESUME
 7  Out of memory                  20  RESUME without error
 8  Undefined line                 21  Unprintable error
 9  Subscript out of range         22  Missing operand
10  Redimensioned array            23  Line buffer overflow
11  Division by zero               26  FOR without NEXT
12  Illegal direct                 29  WHILE without WEND
13  Type mismatch                  30  WEND without WHILE

Disk Errors --
Code Error                         Code Error

50  Field overflow                 58  File already exists
51  Internal error                 61  Disk full
52  Bad file number                62  Input past end
53  File not found                 63  Bad record number
54  Bad file mode                  64  Bad file name
55  File already open              66  Direct statement in file
57  Disk I/O error                 67  Too many files
:Introduction to the Microsoft BASIC Compiler

    The following direct mode commands are NOT implemented on the compiler
and will generate an error message --

         AUTO      CLEAR     CLOAD
         CSAVE     CONT      DELETE
         EDIT      LIST      LLIST
         RENUM     COMMON    SAVE
         LOAD      MERGE     NEW

    The  following statements are used differently with the compiler  than
with the interpreter (refer to the manual for details) --

         CALL      DEFINT    DEFSNG
         DEFDBL    DEFSTR    DIM
         ERASE     END       ON ERROR GOTO
         RESUME    STOP      TRON
         TROFF     USRn
:BASIC Compiler Commands and Switches

    The compiler is invoked by the BASCOM command; it may be called by --

         BASCOM command line

where "command line" is --

[dev:][obj file][,[dev:][lst file]]=[dev:]source file[/switch ...]

    If  just BASCOM is used,  the user will be prompted with an  asterisk,
after which he should enter the command line.

Switches --

/E   Use this switch if ON ERROR GOTO with RESUME <line number> is used

/X   Use this switch if ON ERROR GOTO with RESUME, RESUME 0, or RESUME NEXT
    is used

/N   Do not list generated object code

/D   Generate debug/checking code at runtime

/S   Write quoted strings of more than 4 chars as they are encountered

/4   Recognize Microsoft 4.51 BASIC Interpreter conventions

/C   Relax  line  numbering   constraints;   lines  need  not  be  numbered
    sequentially; /4 and /C may not be used together

/Z   Use Z80 opcodes
:BASIC Compiler Error Messages
Compile-Time Fatal Errors

    SN   Syntax error             OM   Out of memory
    SQ   Sequence error           TM   Type mismatch
    TC   Too complex              BS   Bad subscript
    LL   Line too long            UC   Unrecognizable command
    OV   Math overflow            /0   Division by zero

    DD   Array already dim'ed     FN   FOR/NEXT error
    FD   Function already def     UF   Function not defined
    WE   WHILE/WEND error         /E   Missing /E switch
                                  /X   Missing /X switch

Compile-Time Warning Errors

    ND   Array not dimensioned    SI   Statement ignored

Run-Time Error Messages

     2   Syntax error             52   Bad file number
     3   RETURN without GOSUB     53   File not found
     4   Out of data              54   Bad file mode
     5   Illegal function call    55   File already open
     6   Floating/Integer ovfl    57   Disk I/O error

     9   Subscript out of range   58   File already exists
    11   Division by zero         61   Disk full
    14   Out of string space      62   Input past end
    20   RESUME without error     63   Bad record number
    21   Unprintable error        64   Bad filename

    50   Field overflow           67   Too many files
    51   Internal error