@X @~
~V7 56 2 -5
~D 10
~H                    MUSS
~
~
~H     VOLUME        9
~D10
~V2 -10
~M~OBASIC IMPLEMENTATION MANUAL
~
~
This manual describes the implementation of the Basic
Compiler running under MUSS on the VAX-11.
~D10
~MUNIVERSITY OF MANCHESTER
~V2 0
~V9 -1
~P
~D 10
~H                    MUSS
~
~
~D 10
~H             BSC001
~D 10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                  ISSUE 11~
~V9 -1
~P
~V9 1
~MCONTENTS
~
~
~MCOMPILER SECTIONS
~
BSC001  -  Introduction~
~
BSC011  -  Statement Driver~
~
BSC021  -  Compiler Configuration~
~
BSC031  -  Lexical Analysis~
~
BSC041  -  Declarative Statement Processing~
~
BSC051  -  Input Output Statement Processing~
~
BSC061  -  Imperative Statement Processing~
~
BSC071  -  Expression Processing~
~
BSC081  -  Name List Management~
~
BSC091  -  Fault and Reference Point Monitoring~
~
BSC101  -  Delimeter Preprocessor~
~
BSC111  -  Exception Handling and Debugging Statement Processing~
~
~
~MRUN-TIME LIBRARY SECTIONS
~
BSC201  -  Run-time Configuration~
~
BSC211  -  Program Control~
~
BSC221  -  Input Routines~
~
BSC231  -  Output Routines~
~
BSC241  -  Matrix Functions~
~
BSC251  -  Run-time Support Procedures~
~
BSC261  -  Mathematical Functions~
~
BSC271  -  File Control~
~
BSC281  -  Format Processing~
~V9 -1
~P
~V9 1
~YBSC001
~S~M~OBASIC COMPILER IMPLEMENTATION DESCRIPTION
~S~M~OSection 0 Version 1
~S~OSection 0. Introduction
~S~O1. General Description
~BThis manual documents the implementation of a standard BASIC
compiler.  The BASIC language implemented is described in the
document X3J2/80-64
and contains a few extensions for the VAX-11 BASIC compiler
described in the document VAX-11 BASIC User's Guide, September 1980.
~BEach section in this manual describes the implementation
of a particular section of the compiler and includes:~
~T# 4
~
1.~IA general description of the section, including any details
of implementor dependent features.~
~
2.~IIts interfaces with other sections.~
~
3.~IDetail of the implementation, including an outline of its
operation and data structures.~
~
4.~IFlowcharts for that section.~
~BThis compiler is written in the MUSL language using FLOCODER as
a documentation and programming aid.  All code is generated using the
MUTL interface.
~BThe BASIC compilation system is cast as a series of MUSL modules.
Modules 1 to 9 perform centralised compile time as tasks e.g. lexical
analysis, fault monitoring.  Modules 20 upwards provide the run-time
support environment for the execution of BASIC programs e.g. input/output
processing.
~S~O1.2 Current Status of Development
~BThis records the current development status of the BASIC modules.
~S~O1.3 Development Log
~BThis records the major milestones in the development and issue of the
compiler.
~
~
MAY 1982   Compiler development started.~
~S~O1.4 Suggested Design Modifications
~BThis is a log of any possible further developments or improvements
that could be made to the compiler at later stages, or by other sites.~
~
::BEGIN BIO COMPILE FOR PAGED MACHINES~
DO 0 BIO\?LOG %200~
LIB MSLX~
LIB MTLX\~
LIB L2X\~
LIB LDIR\?~
OPENDIR MUSMC~
ED MU6C:BSC201~
(FD/::VAX /)     *FOR MC3*~
(FD/::PTV /)     *FOR MC5*~
(FD/::GEM /)     *FOR MC5G*~
(FD/::MU6 /)     *FOR MC7*~
E~
FLIP 0 1~
BSC20~
**DI 7~
MUSL 0 BBIO\? %405 140~
**TLSEG 0 0 %380000 -1 6    *FOR MC3*~
**TLSEG 1 %0 %240000 -3 %C  *FOR MC3*~
**TLSEG 0 %0 %F00000  -1 6   *FOR MC5*~
**TLSEG 1 %0 %5C0000  -3 %C  *FOR MC5*~
**TLSEG 0 %0 %F00000 -1 6   *FOR MC5G*~
**TLSEG 1 %0 %240000 -3 %C  *FOR MC5G*~
**TLSEG 0 %0 %28C0000       -1 6   *FOR MC7*~
**TLSEG 1 %0 %1E00000       -3 %C  *FOR MC7*~
**TLLOAD 0 7~
**TLLOAD 1 2~
**TLSEG 2 %0 %0 -3 %C~
**TLLOAD 2 3~
*INFORM %2420;~
**SI 7~
EI 7~
DEL~
MUSL 0 0 %C00~
MODULE(R.IP, D.IP, GET.LINK, I16XSIGN, I32XSIGN,~
       ANGLE, D.ANGLE, EPS, D.EPS, LOG2, D.LOG2);~
LSPEC ANGLE($RE32,$RE32)/$RE32;~
LSPEC D.ANGLE($RE64,$RE64)/$RE64;~
LSPEC EPS($RE32)/$RE32;~
LSPEC D.EPS($RE64)/$RE64;~
LSPEC LOG2($RE32)/$RE32;~
LSPEC D.LOG2($RE64)/$RE64;~
LSPEC R.IP($RE32)/$RE32~
LSPEC D.IP($RE64)/$RE64;~
PSPEC GET.LINK(LABEL)/ADDR;~
LSPEC I16.XSIGN($IN16)/$IN16;~
LSPEC I32.XSIGN($IN32)/$IN32;~
PROC ANGLE(X,Y);
IF X = Y = 0.0 THEN 0.0 => ANGLE;~
ELSE ATAN2(Y,X) => ANGLE;~
FI~
END~
PROC D.ANGLE(X,Y);~
IF X = Y = 0.0 THEN 0.0 => D.ANGLE;~
ELSE DATAN2(Y,X) => D.ANGLE; *FOR MC3* *FOR MC7*~
ELSE ATAN2(Y,X) => D.ANGLE; *FOR MC5*~
FI~
END~
PROC EPS(X);~
$LO32 L;
$IN I;
IF X => L & %7F80 - %2E00 => I =< 0 THEN  *FOR MC3*~
   %80 => L => EPS; *FOR MC3*~
ELSE I => L => EPS; FI; *FOR MC3*~

IF X => L & %7F80(5) - %2E0(6) => I =< 0 THEN *FOR MC5*~
   %80(5) => L => EPS; *FOR MC5*~
ELSE I => L => EPS; FI; *FOR MC5*~
END~
PROC D.EPS(X);~
$LO32 L;~
$IN I;~
IF X => L & %7F80 - %6E00 => I =< 0 THEN *FOR MC3*~
   %80 => L => D.EPS; *FOR MC3*~
ELSE I => L => D.EPS; FI; *FOR MC3*~

IF X => L & %6E0(6) => I =< 0 THEN *FOR MC5*~
   %80(5) => L => D.EPS; *FOR MC5*~
ELSE I => L => D.EPS; FI; *FOR MC5*~
END~
PROC LOG2(X);~
LITERAL /$RE32 C=1.4426950369;~
LN(X) * C => LOG2;~
END~
PROC D.LOG2(X);~
LITERAL /$RE64 C=1.4426950369;~
LN(X) * C => DLOG2;~
END~
PROC R.IP(X);~
$LO32 L,L1;~
$IN T;~
IF X => L ->> 7 & %FF - 128 => T < 1 THEN *FOR MC3*~
IF X => L ->> 23 & %FF - 127 => T < 1 THEN *FOR MC5*  *FOR MC5G*~
IF X => L ->> 24 & %7F - 64 => T < 1 THEN *FOR MC7*~
   0 => R.IP~
ELSE~
   IF T > 23 THEN *FOR MC3* *FOR MC5* *FOR MC5G*~
   IF T > 24 THEN *FOR MC7*~
      X => R.IP~
   ELSE~
      24 - T => T; *FOR MC3* *FOR MC5* *FOR MC5G*~
   25 - T => T; *FOR MC7*~
      %F(8) ->> T <<- T => L1 ->> 16 ! (L1 <<- 16) & L => L=> R.IP;  *FOR MC3*~
      %F(8) <<- T & L => L => R.IP; *FOR MC5*  *FOR MC5G* *FOR MC7*~
   FI~
FI~
END~
PROC D.IP(X);~
R.IP(X) => D.IP; *FOR MC5* *FOR MC5G*~
EXIT; *FOR MC5* *FOR MC5G*~
$LO64 L, L1;~
$IN T;~
IF X => L ->> 7 & %FF => T - 128 => T < 1 THEN *FOR MC3*~
IF X => L ->> 55 & %FF => T - 127 => T < 1 THEN *FOR MC5*  *FOR MC5G*~
IF X => L ->> 56 & %7F - 64 => T < 1 THEN *FOR MC7*~
   0 => D.IP~
ELSE~
   IF T > 55 THEN *FOR MC3* *FOR MC5* *FOR MC5G*~
   IF T > 56 THEN *FOR MC7*~
      X => D.IP~
   ELSE~
      56 - T => T; *FOR MC3* *FOR MC5* *FOR MC5G*~
   57 - T => T; *FOR MC7*~
      %F(16) ->> T <<- T => L1 ->> 48   *FOR MC3*~
         ! (L1 ->> 16 & %FFFF0000)   *FOR MC3*~
         ! (L1 <<- 16 & %FFFF0(8))   *FOR MC3*~
         ! (L1 <<- 48)   *FOR MC3*~
         & L => L => D.IP;   *FOR MC3*~
      %F(16) <<- T & L => L => D.IP;   *FOR MC5*  *FOR MC5G* *FOR MC7*~
   FI~
FI~
END~
PROC GET.LINK(LAB);    *FOR MC3*~
TYPE LINK IS $IN32 W0,W1,W2,OLD.FP,OLD.PC,W5;    *FOR MC3*~
TYPE T IS LABEL L OR $IN32 L.ADDR, F.P;    *FOR MC3*~
T DUMP;    *FOR MC3*~
$IN32 REQ.FP, CUR.FP;    *FOR MC3*~
ADDR LINK P;    *FOR MC3*~
LAB => L OF DUMP;    *FOR MC3*~
FP OF DUMP => REQ.FP;    *FOR MC3*~
LL:;    *FOR MC3*~
LL => L OF DUMP;    *FOR MC3*~
FP OF DUMP => CUR.FP;    *FOR MC3*~
-1 => GET.LINK;    *FOR MC3*~
WHILE GET.LINK = -1 DO    *FOR MC3*~
   MAKE(LINK, 0, CUR.FP) => P;    *FOR MC3*~
   IF OLD.FP OF P^ => CUR.FP = REQ.FP THEN    *FOR MC3*~
      OLD.PC OF P^ => GET.LINK;    *FOR MC3*~
   FI    *FOR MC3*~
OD    *FOR MC3*~
END    *FOR MC3*~
PROC GET.LINK(LAB);    *FOR MC5* *FOR MC5G*~
TYPE LINK IS $IN32 OLD.FP,OLD.PC;    *FOR MC5* *FOR MC5G*~
TYPE T IS LABEL L OR $IN32 S.P, L.ADDR;    *FOR MC5* *FOR MC5G*~
T DUMP;    *FOR MC5* *FOR MC5G*~
$IN32 REQ.SP, CUR.FP, SP.T;    *FOR MC5* *FOR MC5G*~
ADDR LINK P;    *FOR MC5* *FOR MC5G*~
PSPEC GET.FP()/$IN32;    *FOR MC5* *FOR MC5G*~
PROC GET.FP;    *FOR MC5* *FOR MC5G*~
ADDR LINK P;    *FOR MC5* *FOR MC5G*~
MAKE(LINK, 0, SP.T) => P;    *FOR MC5* *FOR MC5G*~
OLD.FP OF P^ => GET.FP;    *FOR MC5* *FOR MC5G*~
END;    *FOR MC5* *FOR MC5G*~
LAB => L OF DUMP;    *FOR MC5* *FOR MC5G*~
SP OF DUMP => REQ.SP;    *FOR MC5* *FOR MC5G*~
LL:;    *FOR MC5* *FOR MC5G*~
LL => L OF DUMP;    *FOR MC5* *FOR MC5G*~
SP OF DUMP => SP.T;    *FOR MC5* *FOR MC5G*~
GET.FP() => CUR.FP;    *FOR MC5* *FOR MC5G*~
-1 => GET.LINK;    *FOR MC5* *FOR MC5G*~
WHILE GET.LINK = -1 DO    *FOR MC5* *FOR MC5G*~
   MAKE(LINK, 0, CUR.FP) => P;    *FOR MC5* *FOR MC5G*~
   IF OLD.FP OF P^ => CUR.FP > REQ.SP THEN    *FOR MC5* *FOR MC5G*~
      OLD.PC OF P^ => GET.LINK;    *FOR MC5* *FOR MC5G*~
   FI    *FOR MC5* *FOR MC5G*~
OD    *FOR MC5* *FOR MC5G*~
END    *FOR MC5* *FOR MC5G*~
PROC I32.XSIGN(I);~
IF I < 0 THEN~
   -1 => I32.XSIGN~
ELSE~
    1 => I32.XSIGN~
FI~
END~
PROC I16.XSIGN(I);~
IF I < 0 THEN~
   -1 => I16.XSIGN~
ELSE~
    1 => I16.XSIGN~
FI~
END~
*END~
MUSL 0 0 %C00~
**FLIP MU6C:BSC211 1~
BSC21~
**DI 7~
*INFORM %2420;~
**SI 7~
EI 7~
DEL~
MUSL 0 0 %C00~
**FLIP MU6C:BSC221 1~
BSC22~
**DI 7~
*INFORM %2420;~
**SI 7~
EI 7~
DEL~
MUSL 0 0 %C00~
**FLIP MU6C:BSC231 1~
BSC23~
**DI 7~
*INFORM %2420;~
**SI 7~
EI 7~
DEL~
MUSL 0 0 %C00~
**FLIP MU6C:BSC241 1~
BSC24~
**DI 7 ~
*INFORM %2420;~
**SI 7~
EI 7~
DEL~
MUSL 0 0 %C00~
**FLIP MU6C:BSC251 1~
BSC25~
**DI 7~
*INFORM %2420;~
**SI 7~
EI 7~
DEL~
MUSL 0 0 %C00~
**FLIP MU6C:BSC271 1~
BSC27~
**DI 7~
*INFORM %2420;~
**SI 7~
EI 7~
DEL~
MUSL 0 0 %800~
**FLIP MU6C:BSC281 1~
BSC28~
**DI 7~
*INFORM %2420;~
**SI 7~
EI 7~
DEL~
*FOR TRANDIR*~
STOP~
::END BIO COMPILE FOR PAGED MACHINES~
::BEGIN BSC COMPILE FOR PAGED MACHINES~
DO 0 BSC\?LOG %200~
LIB MSLX~
LIB MTLX\~
LIB L2X\~
LIB LDIR\?~
OPENDIR MUSMC~
LIB BBIO\?~
MUSL %0 BBSC\ %405 16~
**TLSEG 0 %0 %2A0000 -1 6  *FOR MC3*~
**TLSEG 1 %20000 %360000 -3 %C  *FOR MC3*~
**TLSEG 2 %4000 0 -3 %C~
**TLSEG 3 %0 %2B0000 -1 6  *FOR MC3*~
**TLSEG 0 %20000  %580000 -1  6  *FOR MC5*~
**TLSEG 1 %20000  %780000 -3 %C  *FOR MC5*~
**TLSEG 0 %20000  %2A0000 -1  6  *FOR MC5G*~
**TLSEG 1 %20000  %360000 -3 %C  *FOR MC5G*~
**TLSEG 0 %0      %2900000      -1  6  *FOR MC7*~
**TLSEG 1 %20000  %1DC0000      -3 %C  *FOR MC7*~
**TLLOAD 0 6~
**TLLOAD 1 5~
**TLLOAD 2 7~
**TLLOAD 3 8  *FOR MC3* *~
**TLLOAD 0 8  *FOR MC5* *FOR MC5G*  *FOR MC7*~
**FLIP MU6C:BSC021 1~
BSC02~
**ED~
(F D/::VAX/)E   *FOR MC3*~
(FD/::PTV/)E   *FOR MC5*~
(FD/::GEM/)E   *FOR MC5G*~
(FD/::MU6/)E   *FOR MC7*~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %C00~
**FLIP MU6C:BSC011 1~
BSC01~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %C00~
**FLIP MU6C:BSC031 1~
BSC03~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %C00~
**FLIP MU6C:BSC071 1~
BSC07~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %C00~
**FLIP MU6C:BSC041 1~
BSC04~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %C00~
**FLIP MU6C:BSC051 1~
BSC05~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %C00~
**FLIP MU6C:BSC061 1~
BSC06~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %C00~
**FLIP MU6C:BSC111 1~
BSC11~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %C00~
**FLIP MU6C:BSC081 1~
BSC08~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
MUSL %0 0 %800~
**FLIP MU6C:BSC091 1~
BSC09~
**DI 7~
*INFORM %2420;~
**SELECTINPUT 7~
ENDINPUT 7~
DELETE~
*FOR TRANDIR*~
STOP~
::END BSC COMPILE FOR PAGED MACHINES~
~Y
~V9 -1
~P
~D 15
~HFLOWCHARTS
~
~
~H                BSC001
~V9 -1
~F
