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 If a program contains ON ERROR GOTO and RESUME 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 [()] where and are supplied by you. 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. ( must be the name of the subroutine in a FORTRAN SUBROUTINE statement or a PUBLIC symbol in an assembly language routine.) 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 OR RUN where 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 - - - - WEND where and are supplied by you. As long as 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.