mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
379 lines
15 KiB
379 lines
15 KiB
Introduction
|
|
Format notation
|
|
A sample session
|
|
Writing a Basic program to be compiled
|
|
Compiler-interpreter differences
|
|
New programming features
|
|
Second menu: Compiling, linking & loading, errors
|
|
:INTRODUCTION
|
|
|
|
The Microsoft BASIC Compiler is a highly efficient programming tool that
|
|
converts BASIC programs from BASIC source code into machine code. This
|
|
provides much faster BASIC program execution than has previously been
|
|
possible. It can make programs run an average of 3 to 10 times faster than
|
|
programs run under BASIC-80. Compiled programs can be up to 30 times
|
|
faster than interpreted programs if maximum use of integer variables is
|
|
made.
|
|
:FORMAT NOTATION
|
|
|
|
Wherever the format for a statement or command is given throughout this
|
|
HELP file, the following rules apply:
|
|
|
|
1. Items in capital letters must be input as shown.
|
|
|
|
2. Items in lower case letters enclosed in angle brackets ( < > )
|
|
are to be supplied by the user.
|
|
|
|
3. Items in sqare brackets ( [ ] ) are optional.
|
|
|
|
4. All punctuation except angle brackets and square brackets
|
|
(i.e., commas, parentheses, semicolons, hyphens, and equal
|
|
signs) must be included where shown.
|
|
|
|
5. Items followed by an ellipsis ( ... ) may be repeated any
|
|
number of times (up to the length of the line).
|
|
|
|
6. Items separated by a vertical bar ( \ ) are mutually exclusive;
|
|
choose one.
|
|
:SAMPLE SESSION
|
|
|
|
The following instructions will take you step by step through the compila-
|
|
tion process, from typing in the program to running the compiled version of
|
|
it.
|
|
|
|
STEP 1: PRELIMINARIES
|
|
|
|
Load BASIC-80 (NOT included in the BASCOM package) from disk. The program
|
|
will sign on and the letters
|
|
|
|
ok
|
|
|
|
will appear on the screen. Now enter:
|
|
|
|
AUTO 100, 100
|
|
|
|
This command instructs BASIC-80 to automatically generate line numbers,
|
|
beginning with line 100 and incrementing by 100 each time you press ENTER.
|
|
|
|
STEP 2: ENTER THE PROGRAM
|
|
|
|
You are now ready to begin typing in your BASIC program. Anything that you
|
|
know runs in BASIC-80 will do. Alternatively, just read in a BASIC-80
|
|
program you already use.
|
|
|
|
STEP 3: SAVE THE PROGRAM
|
|
|
|
In order for the compiler to process it, you must save your source program
|
|
in ASCII format. To do so, enter:
|
|
|
|
SAVE "MYPROG",A
|
|
|
|
There is now a BASIC program called MYPROG.BAS on your diskette that is
|
|
ready to be compiled. (A program that is not yet compiled is called the
|
|
source file.)
|
|
|
|
Return to CP/M by typing SYSTEM.
|
|
|
|
STEP 4: CHECK FOR ERRORS
|
|
|
|
At this point, it is a good idea to check the program for syntax errors.
|
|
Removing syntax errors now will reduce the possibility of having to recom-
|
|
pile later. To do this, enter:
|
|
|
|
BASCOM =MYPROG
|
|
|
|
This command loads the BASIC Compiler and compiles the source file without
|
|
producing an object or listing file. If you have made any syntax errors, a
|
|
two-letter code will appear on the screen. If this happens, return to STEP
|
|
1, use the BASIC-80 interpreter again, and correct the errors.
|
|
|
|
If no errors were encountered, you are ready to continue.
|
|
|
|
STEP 5: COMPILE SOURCE FILE
|
|
|
|
These commands instruct the BASIC Compiler to compile MYPROG.BAS, to put
|
|
the object in a file named MYPROG.REL, and to put the listing in a file
|
|
named MYPROG.LST. (.REL and .LST are default extensions supplied by the
|
|
BASIC Compiler.)
|
|
|
|
There are now a relocatable object file called MYPROG.REL and a listing
|
|
file called MYPROG.LST on the disk. The object file contains the machine-
|
|
readable code generated by the compiler. The listing file contains the
|
|
BASIC program statements along with the machine language generated by each
|
|
statement.
|
|
|
|
STEP 6: LOAD AND EXECUTE THE PROGRAM
|
|
|
|
The LINK-80 linking loader is used to produce an executable program. To use
|
|
it, enter:
|
|
|
|
L80 MYPROG,MYPROG/N/E
|
|
|
|
This command runs LINK-80, which in turn loads the object file MYPROG.REL
|
|
into the correct memory locations, then writes it to disk as a .COM file.
|
|
During this process (which can take some time), runtime routines are drawn
|
|
from the BASLIB.REL runtime library.
|
|
|
|
The compiled program which you stored on your own diskette can be run at
|
|
any time, all by itself, without using any part of the BASIC Compiler. It
|
|
works just like a standard CP/M command file. To execute, just enter:
|
|
|
|
MYPROG
|
|
|
|
The program should then work just as it did in the interpreter .. only much
|
|
faster.
|
|
:WRITING A BASIC PROGRAM TO BE COMPILED
|
|
|
|
BASIC programs which are to be compiled are, for most part, written in just
|
|
the same way you have always written them to run with the interpreter.
|
|
However, there are some differences between the statements and commands
|
|
implemented in BASIC-80 and those implemented in the BASIC Compiler that
|
|
must be taken into consideration.
|
|
|
|
The Compiler interacts with the console only to read compiler commands.
|
|
These specify what files are to be compiled. There is no "direct mode", as
|
|
with the MBASIC interpreter. Commands that are usually issued in the direct
|
|
mode with MBASIC are not implemented on the compiler. The following state-
|
|
ments and commands are not implemented and will generate an error message.
|
|
|
|
AUTO CLEAR* CLOAD CSAVE CONT
|
|
DELETE EDIT LIST LLIST RENUM
|
|
SAVE LOAD MERGE NEW COMMON*
|
|
SYSTEM
|
|
*
|
|
(Note: Newer releases of the compiler which include the BRUN runtime module
|
|
do support CHAINing with COMMON and CLEAR with certain restrictions.)
|
|
|
|
:FEATURES USED DIFFERENTLY BY THE BASIC COMPILER
|
|
|
|
DEFINT/SNG/DBL/STR
|
|
The compiler does not "execute" DEFxxx statements; it reacts to the static
|
|
occurrence of these statements, regardless of the order in which program
|
|
lines are executed. A DEFxxx statement takes effect as soon as its line is
|
|
encountered. Once the type has been defined for a given letter, it remains
|
|
in effect until the end of the program or until a different DEfxxx state
|
|
ment with that letter takes effect.
|
|
|
|
USRn Functions
|
|
USRn functions are significantly different from the interpreter versions.
|
|
The argument to the USRn function is ignored and an integer result is
|
|
returned in the HL registers. It is recommended that USRn functions be
|
|
replaced by the CALL statement. (See New BASIC Programming Features for
|
|
definition of CALL.)
|
|
|
|
DIM and ERASE
|
|
The DIM statement is similar to the DEFxxx statement in that it is scanned
|
|
rather than executed. That is, DIM takes effect when its line is encoun-
|
|
tered. If the default dimension (10) has already been established for an
|
|
array variable and that variable is later encountered in a DIM statement, a
|
|
DD (redimensioned array) error results. There is no ERASE statement in the
|
|
compiler, so arrays cannot be erased and redimensioned. An ERASE statement
|
|
will produce a fatal error.
|
|
|
|
Also note that the values of the subscripts in a DIM statement must be
|
|
integer constants; they may not be variables, arithmetic expressions, of
|
|
floating point values. For example,
|
|
|
|
DIM A1(I)
|
|
DIM A1(3+4)
|
|
|
|
are both illegal statements.
|
|
|
|
END
|
|
During execution of a compiled program, an END statement closes files and
|
|
returns control to the operating system. The compiler assumes an END at the
|
|
end of the program, so it is not necessary to insert an END statement in
|
|
order to get proper program termination.
|
|
|
|
FOR/NEXT
|
|
All FOR/NEXT loops must be statically nested with only 1 NEXT statement for
|
|
each FOR statement.
|
|
|
|
ON ERROR GOTO/RESUME <line number>
|
|
If a program contains ON ERROR GOTO and RESUME <line number> statements,
|
|
the /E compilation switch must be used. If the RESUME NEXT, RESUME, or
|
|
RESUME 0 form is used, the /X switch must also be included.
|
|
|
|
REM
|
|
REM statements or remarks starting with a single quotation mark do not make
|
|
up time or space during execution, and so may be used as freely as desired.
|
|
|
|
STOP
|
|
The STOP statement is identical to the END statement. Open files are closed
|
|
and control returns to the operating system.
|
|
|
|
TRON/TROFF
|
|
In order to use TRON/TROFF, the /D compilation switch must be used. Other-
|
|
wise, TRON and TROFF are ignored and a warning message is generated.
|
|
:NEW BASIC PROGRAMMING FEATURES
|
|
|
|
The BASIC Compiler also adds new features that will add power and
|
|
efficiency to your programming. Keep in mind when utilizing these new
|
|
features that while they will compile with no problems, you cannot run a
|
|
program using these features with your interpreter, since BASIC-80
|
|
doesn't recognize them.
|
|
|
|
CALL Statement
|
|
The CALL Statement allows you to call and transfer flow to an assembly
|
|
language or FORTRAN subroutine.
|
|
|
|
The format of the CALL Statement is:
|
|
|
|
CALL <variable name> [(<argument list>)]
|
|
|
|
where <variable name> and <ergument list> are supplied by you.
|
|
|
|
<variable name> is the name of the subroutine you wish to call. This name
|
|
must be 1 to 6 characters long and must be recognized by LINK-80 as a
|
|
global symbol. (<variable name> must be the name of the subroutine in a
|
|
FORTRAN SUBROUTINE statement or a PUBLIC symbol in an assembly language
|
|
routine.)
|
|
|
|
<argument list> is optional and contains the arguments that are passed to
|
|
the assembly language or FORTRAN subroutine.
|
|
|
|
Example: 120 CALL MYROUT (I,J,K)
|
|
|
|
CHAIN (or RUN)
|
|
The CHAIN and RUN statements both perform the same function: they allow you
|
|
to load a file from diskette into memory and run it. CHAIN (or RUN) closes
|
|
all open files and deletes the current contents of memory before loading
|
|
the designated program. The format of the CHAIN (or RUN) statement is as
|
|
follows:
|
|
|
|
CHAIN <filename>
|
|
OR
|
|
RUN <filename>
|
|
|
|
where <filename> is the name used when the file was saved. (With CP/M the
|
|
default extension .BAS is supplied.)
|
|
|
|
WHILE...WEND
|
|
The WHILE...WEND statement is a conditional statement that executes a
|
|
series of statements in a loop as long as a given condition is true.
|
|
|
|
The format of WHILE...WEND is:
|
|
|
|
WHILE <expression>
|
|
-
|
|
-
|
|
<loop statements>
|
|
-
|
|
-
|
|
WEND
|
|
|
|
where <expression> and <loop statements> are supplied by you.
|
|
|
|
As long as <expression> is true (i.e., not zero), loop statements are
|
|
executed until the WEND statement is encountered. BASIC then returns to the
|
|
WHILE statement and checks "expression". If it is still true, the process
|
|
is repeated. If it is not true, execution resumes with the statement
|
|
following the WEND statement.
|
|
|
|
WHILE/WEND loops may be nested to any level, as long as they are statically
|
|
nested. Each WEND will match the most recent WHILE. An unmatched WHILE
|
|
statement causes a "WHILE without WEND" error, and an unmatched WEND state-
|
|
ment causes a "WEND without WHILE" error.
|
|
|
|
Example:
|
|
090 'BUBBLE SORT ARRAY A$
|
|
100 FLIPS=1 'FORCE ONE PASS THRU LOOP
|
|
110 WHILE FLIPS
|
|
115 FLIPS=0
|
|
120 FOR I=1 TO J=1
|
|
130 IF A$(I)>A$(I+1) THEN
|
|
SWAP A$(I),A$(I+1):FLIPS=1
|
|
140 NEXT I
|
|
150 WEND
|
|
|
|
Double Precision Transendental Functions
|
|
SIN, COS, TAN, SQR, LOG, and EXP now return double precision results if
|
|
given double precision arguments. Exponentiation with double precision
|
|
operands will return double precision results.
|
|
|
|
Long Variable Names
|
|
Variable names may be up to 40 characters long with all 40 characters
|
|
significant. Letters, numbers, and the decimal characters are allowed in
|
|
variable names, but the name must begin with a letter. Variable names may
|
|
also include all BASIC-80 commands, statements, function names, and
|
|
operator names.
|
|
|
|
Expression Evaluation in the BASIC Compiler
|
|
During program compilation, when the BASIC Compiler evaluates expressions,
|
|
the operands of each operator are converted to the same type, that of the
|
|
most precise operand. For example,
|
|
|
|
QR=J%+A!+Q
|
|
|
|
causes J% to be converted to single precision and added to A!. This result
|
|
is coverted to single precision and added to Q.
|
|
|
|
The Compiler is more limited than the interpreter in handling numeric
|
|
overflow. For example, when run on the interpreter the following program
|
|
|
|
I%=20000
|
|
J%=20000
|
|
K%=-30000
|
|
M%=I%+J%-K%
|
|
|
|
yields 10000 for M%. That is, it adds I% to J% and, because the number is
|
|
too large, it converts the result into a floating point number. K% is then
|
|
converted to floating point nd subtracted. The result of 10000 is found,
|
|
and is converted back to integer and saved as M%.
|
|
|
|
The Compiler, however, must make type conversion decisions during compila-
|
|
tion. It cannot defer until the actual values are known. Thus, the compiler
|
|
would generate code to perform the entire operation in integer mode. If the
|
|
/D switch were set, the error would be detected. otherwise, an incorrect
|
|
answer would be produced.
|
|
|
|
In order to produce optimum efficiency in the compiled program, the
|
|
compiler may perform any number of valid algebraic transformations before
|
|
generating the code. For axample, the program
|
|
|
|
I%=20000
|
|
J%=-18000
|
|
K%=20000
|
|
M%=I%+J%+K%
|
|
|
|
could produce an incorrect result when run. If the compiler actually per-
|
|
forms the arithmetic in the order shown, no overflow occurs. However, if
|
|
the compiler performs I%+K% first and then adds J%, an overflow will occur.
|
|
|
|
The Compiler follows the rules of operator precedence and parenthetic
|
|
modification of such precedence, but no other guarantee of evaluation order
|
|
can be made.
|
|
|
|
Using Integer Variables To Optimize Speed
|
|
In order to produce the fastest and most compact object code possible, make
|
|
use of integer variables. For example, this program
|
|
|
|
FOR I=1 TO 10
|
|
A(I)=0
|
|
NEXT I
|
|
|
|
can execute approximately 30 times faster by simply substituting "I%" for
|
|
"I". It is especially advantageous to use integer variables to compute
|
|
array subscripts. The generated code is significantly faster and more
|
|
compact.
|
|
|
|
Maximum Line Length
|
|
The Compiler cannot accept a physical line that is more than 253 characters
|
|
in length. A logical statement, however, may contain as many physical lines
|
|
as desired. Use line feed to start a new physical line within a logical
|
|
statement.
|
|
::BASCOM2.HQP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a random file.
|
|
51 Internal error
|
|
An internal malfunc
|