Google
 

Trailing-Edge - PDP-10 Archives - BB-4157D-BM - documentation/bls7b.doc
There is 1 other file named bls7b.doc in the archive. Click here to see a list.


BLISS.DOC -- Changes from V6(212) to V7B(222)
September 1977






























COPYRIGHT (C) 1977 BY
DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.


THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE
INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER
COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
TRANSFERRED.

THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
CORPORATION.

DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
                                                                Page 2


BLIS10.DOC      Changes from 6(212) to 7B(222)





1.0  SUMMARY

BLISS-10 7B(222) replacing BLISS-10 6(212).


The distribution tape contains the following files:

         BLIS10.EXE       !BLISS-10 Compiler V7B(222)
         BLIS10.ERR       !BLISS-10 Error file
         BLIS10.DOC       !BLISS-10 Document file
         BLIS10.HLP       !BLISS-10 Help file
         DEB10.EXE        !BLISS-10 Debugging compiler
         SIX12.BLI        !SIX12 Source file
         SIX12X.REL       !SIX12 Object file


This version runs on TOPS-10 monitors from 5.07 to  present.   It  can
run  on  DECsystem-20  under  the compatability package.  This version
supercedes 6(212).


A description of BLISS-10 is contained in

     DECsystem-10 BLISS-10 Programmer's Reference Manual
                 DEC-10-LBRMA-A-D





2.0  EXTERNAL CHANGES

The major  changes  to  the  compiler  have  been  to  the  once  only
initialization  module  and  the  declaration  processing  modules  to
incorporate the first two new language features described below.





2.1  New Features Added Since Version 6(212).

     Five new features have been added.
                                                                Page 3


     1.  Initialization  of  OWN  and  GLOBAL  data  segments  is  now
         possible.   Initialization  of  a segment is specified within
         its OWN or GLOBAL declaration and consists of an equal  sign,
         "=",   followed  by  a  plit  argument.   The  initialization
         specification follows the segment name (and size if any).  An
         initialization  specification  must not be factored, nor must
         the number of words initialized exceed the data segment size.


         Examples:
                    OWN X=1,Y[2]=(4,5);
                    GLOBAL STRING[4]= 'This is a String';

         The delcaration

                    OWN X:Y:Z = 1:

         only initializes X and gives the warning message  for  Y  and
         for Z that factorization of initialization is not allowed.

         The declaration

                    OWN X = (2,3),Y;

         produces a warning message  stating  that  overinitialization
         has  taken place;  in this example X will be initialized to 2
         and Y to 3.

     2.  It is now possible to have more than one module in the  input
         file.   Each  module is compiled independently and the object
         file produced is the concatenation of the  ones  produced  by
         compiling  each  module separately.  This new feature is also
         the fix of bug 13 listed below.  Each module must start on  a
         new  line.   Delimiters  following  and  on  the same line as
         ELUDOM are ignored.


     3.  Register assignments for each module are  now  identified  in
         the  relocatable object file.  To achieve this, the following
         names

              .SREG
              .FREG
              .VREG
              .DREGS

         are predeclared by the compiler and  globally  bound  to  the
         negative  of  SREG,  FREG,  VREG,  and the preserved register
         mask,  respectively.   Thus,  two  modules   with   differing
         register  assignments  will  produce multiply defined symbols
         when linked.  These names appear in the listing file as well.
         The default register assignment produces:

              .SREG=:0
              .FREG=:-2
                                                                Page 4


              .VREG=:-3
              .DREGS=:-174000

         This states that SREG is  0,  FREG  is  2,  VREG  is  3,  and
         registers 17, 16, 15, 14, and 13 (octal) are preserved.


     4.  A new command line switch, /Z, is now available.  With /Z the
         LCG register assignments are chosen as the default.  That is,
         SREG=#17, FREG=#15, VREG=#1, DREGS=7,  and  #0  and  #16  are
         reserved.  Of course explicit assignments given in the module
         head will override this default.


     5.  A require file declaration may also have the form

              REQUIRE 'file-specification';

         where a file-specification is written

              device:filename.extension[ppn]

         with device:, .extension, and  [ppn]  being  optional.   This
         corrects the deficiency #10 listed below in section 3.





3.0  KNOWN BUGS AND DEFICIENCIES

The following bugs and  deficiencies  remain  (numbers  refer  to  the
cumulative bug list below):

1,2,3,4,6,9,14,15,16,19,20,23,36, and 38.


The following bugs have been fixed:

5,7,8,10,11,12,13,17,18,21,22,24,25
26,27,28,29,30,31,32,33,34,35, and 37.


     1.  DEFICIENCY
         Case Folding (translation of lower case to upper  case)  does
         not work with macro formal names in strings.

         Ex.
              EXTERNAL TYPSTR;          ! Types an ASCIZ string
              MACRO M(H)=TYPSTR('THE MESSAGE IS :h')$;
              M(WRONG)

         This should type:

              THE MESSAGE IS:WRONG
                                                                Page 5


         Instead it types:

              THE MESSAGE IS:h

     2.  BUG
         When processing a quoted string longer than  1000  characters
         the compiler gives an error message and aborts.

     3.  BUG
         A compiler error occurs if allocation declarations (LOCAL  or
         OWN) appear in a BEGIN ... END block of a structure.

     4.  BUG
         A global routine should have a compound expression  or  block
         as  its  body.   Otherwise,  an "illegal up level addressing"
         error message may occur.


         Ex:
              MODULE AAA=
              BEGIN
                  REGISTER A;
                  GLOBAL ROUTINE MLIST=-2;
                  A=-1;
              END
              ELUDOM

     5.  BUG FIXED 7(215)
         Bad code is generated for the last argument to the call  when
         it is in a structure accessing definition.

         Ex:
              STRUCTURE FOO[I,J]=(BAZ(@.FOO,.I,.J));

         The call to BAZ has nonsense for its last argument.  This may
         be  fixed  by inserting parenthesis around the last argument,
         thus

              STRUCTURE FOO[I,J]=(BAX(@.FOO,.I,(.J)));

     6.  BUG
         An INDEXES name will give an  error  ("an  operator  must  be
         followed  by  a  simple expression") if it is not enclosed in
         parentheses.

         Ex.
              BIND B=PLIT(C INDEXES 4,5,6):
              IF .X EQL C THEN ...  fails.

         However,

              IF .X EQL (C) THEN ...

         works.
                                                                Page 6


     7.  BUG FIXED 7(215)
         Bind within binds yield an infinite loop  or  illegal  memory
         reference

         Ex.
              BIND A=(BIND FOO=1;  FOO+5);

     8.  BUG FIXED 7(215)
         On rare occasion BLISS will lose track of the register  where
         it has stored the value of an OWN and bad code is generated.

         Ex:
              OWN T;
              T=#123456654321;
              T<18,6>=0;
              T=..T +.(.T+1);

     9.  DEFICIENCY
         If a main module (with  "STACK"  or  "START"  in  its  module
         header)  without  "TIMER=EXTERNAL(SIX12)",  or  the  like  is
         compiled with "/D", an error message is produced.  A  default
         timer specification should be assumed.

    10.  DEFICIENCY REMOVED 7B(222)
         BLISS will not accept a request for a  require  file  if  its
         name begins with a number.

         Ex:
              123.BLI

         This problem  may  now  be  avoided  by  enclosing  the  file
         specification in quotes--e.g., '123.BLI'.

    11.  BUG FIXED 7B(222)
         A zero index on an indirect vector  access  causes  an  error
         message.

         Ex:
              STRUCTURE S[I]=(..S+.I);
              LOCAL S X;
              X[0]=.X[0] +1;

    12.  BUG FIXED 7(215)
         When # is not followed by  an  octal  digit,  the  result  is
         equivalent  to  #0.   Hence  #-14  is  decimal -14.  No error
         message is given.

    13.  BUG FIXED 7(215)
         One cannot have several modules defined in a file.  Only  the
         first module gets compiled.

    14.  BUG
         An error message may occur if a control expression  involving
         VREG is the right operand of an assignment.  For example,
                                                                Page 7


              A=IF .B THEN .C ELSE .VREG +1

         is an error, but

              A=(IF .B THEN .C ELSE .VREG+1)

         is not.

    15.  BUG
         Setting the CREF switch in module header with  no  list  file
         specified  in  the  command  string causes the compilation to
         abort, sometimes with the error  message  "PDL  OVERFLOW"  or
         "I/O TO UNDEFINED CHANNEL".

         Ex:
              .R BLIS10
              *A=FILE.BLI

         where FILE.BLIS contains:

                MODULE SSS(STACK,XREF)=
                BEGIN
                EXTERNAL A;
                 A=12;
                END
                ELUDOM

    16.  BUG
         MACHOP JUMP instructions compile incorrectly.

    17.  BUG FIXED 7(215)
         MACHOPS #127,#126 PRODUCE DPB,IDPB  machine  instructions  in
         the   list  file.   It  should  produce  FLTR,  FIXR  machine
         instructions.  In any case, the instructions in the REL  file
         are okay.

    18.  BUG FIXED 7B(222)
         BIND to REGISTER does not work.

         Ex:
              REGISTER A;
              BIND B=A;     %FAILS%
              BIND C=(A);   %WORKS%

    19.  BUG
         Occassionally a BIND to a pointer with the indirect  bit  set
         causes an error message.

         Ex:
              BIND A=(-1)<0,36,FREG,1>;

    20.  BUG
         A structure containing a compound expression may not generate
         correct code.
                                                                Page 8


         Ex:
              STRUCTURE XXX[I.J]=
                   [1](.I=I+.I;  .J=J+.J);
              OWN U,V,X,Y,XXX Z[2,3];
               .
               .
               .
              Z[(IF .X THEN U ELSE V),Y];

    21.  BUG FIXED 7(215)
         Negative replication counts in PLITS may cause a  variety  of
         problems  such  as:   infinite  loops,  empty plit areas, and
         nonsense PLITs.

         Ex:
              BIND B = PLIT(1,2,3,-2:(4))

    22.  BUG FIXED 7(215)
         A TDZA instruction preceded by a SKIPN causes the wrong value
         to be loaded into the register.

         Ex:
              EXTERNAL X,Y,Z;
              ROUTINE T(S) =
                 BEGIN
                 CASE .S OF
                 SET
                     X = (.Y NEQ 0);
                     X = .Z
              TES;
              END;

         The code generated is incorrect code.

    23.  BUG
         More  than  eight  consecutive  assignments  cause  an  error
         message (the limit is eight) and an ill-mem-ref.

    24.  BUG Fixed 7B(222)
         BREG is declared to be both LOCAL and EXTERNAL  by  BLISS-10,
         in the listing file.

    25.  BUG FIXED 7(215)
         Multiple FORWARD declarations are not allowed.

         Example:
              FORWARD  A;
              FORWARD  A;

    26.  BUG FIXED 7(215)
         Actual arguments pushed on the stack by a routine call may be
         overwritten  when  one of the arguments is a block containing
         locals.

         Ex:
                                                                Page 9


              EXTERNAL  BAZ;
              BAZ (1,2,BEGIN
                           LOCAL I,J,K;
                           K_10;
                           .K
                       END , 3)

    27.  BUG FIXED 7(215)
         REQUIRE file names cannot have the same name or extension  as
         a previously declared symbol.  This causes an error message.

         Ex:
              BIND  ABC=2;
              REQUIRE  ABC.REQ;

    28.  BUG FIXED 7(215)
         When MACROs consisting only of comments are used
         excessively, a PDL overflow occurs.

         Ex:
             MACRO  X=!!$;
             X  ABCDE
             X  ABCDE
             .
             .
             .
             X  ABCDE

    29.  BUG FIXED 7(215)
         The peephole optimizer attempts to replace a  store  followed
         by  a  load  with  a single store.  Unfortunately, a sequence
         such as

                    MOVEM   3,1(2)
                    PUSHJ   0,Y
                    MOVE    3,1(2)

         is incorrectly optimized.

         The optimizer does not know that a routine  call  can  change
         register  3.   This bug would arise in the following BLISS-10
         routine:

           ROUTINE  R =
               BEGIN
               EXTERNAL X,Y,Z;
               LOCAL T;
               T = X();
               Y();
               Z = .Z+.T
               END;

    30.  BUG FIXED 7(215)
         The character manipulation built-in  functions  INCP,  SCANI,
         REPLACEI,  COPYNI, COPYIN, and COPYII, produce a side effect,
                                                               Page 10


         i.e.  incrementing a byte pointer, that BLISS-10 is sometimes
         unaware  of.  If the byte pointer is brought from memory to a
         register, BLISS-10 may use the register value even though the
         memory value has been changed by one of the above functions.

         Example:

           ROUTINE R =
               BEGIN
               EXTERNAL X;
               LOCAL T;
               T = .X;
               IF SCANI(T)  THEN X = .T
               END;

         The updated value of T is not placed back in X.

    31.  BUG FIXED 7B(222)
         The chain of external references to a  given  symbol  is  not
         constructed  properly when some of the references fall in the
         low segment.  As a result the program is not linked properly.

         Example:

           EXTERNAL  A,B;
           BIND  C = PLIT (A,B);
           BIND  D = PLIT (A,A);

         If PLITS are put in the low segment,  a  linking  error  will
         result.

    32.  DEFICIENCY FIXED 7B(222)
         An error message is given each time an  undefined  symbol  is
         referenced  in  a  block.   A warning message should be given
         only for the first instance of the symbol.

    33.  BUG FIXED 7B(222)
         The peeophole optimizer tries to  replace  a  MOVE  and  test
         sequence with a SKIP instruction.  Thus,

           MOVE R,X
           TLNN R, #400000

         becomes SKIPL R,X.  This should not be  done,  however,  when
         the test instruction is labelled.

         Example:

           REGISTER R;
           EXTERNAL X,Y;
           R = .X;
           WHILE .R<35,1> DO Y();

         This generates the above sequence.
                                                               Page 11


    34.  BUG FIXED 7B(222)
         Extra blank characters are inserted into a quoted  string  if
         the string extends over more than one source line.

         Example:

           PLIT( 'HELLO-
           BLISS-10' );

         This string contains one extra blank character.

    35.  BUG FIXED 7B(222)
         Sometimes incorrect code for SELECT expressions is generated.

         Example:

           EXTERNAL X;
           ROUTINE XXX=
           BEGIN
           SELECT .X OF
           NSET
           1: RETURN 1;
           2:  RETURN 2;
           OTHERWISE: RETURN 0
           TESN;
           END;

    36.  BUG 
         When processing a complicated test expression  in  a  control
         expression, BLISS-10 may have difficulty attempting to dump a
         common subexpression contained in a register  to  the  stack.
         The  result  is  a  dangling  pointer  which may subsequently
         destroy the free storage chain and cause an ill-mem-ref.

    37.  BUG FIXED 7B(222)
         If ELUDOM is followed by a semicolon, or any other  delimiter
         except MODULE, the compiler loops.

    38.  BUG
         A name prefixed by the escape character "?" is not  processed
         properly when it appears in a macro body.

         Example:

                    MACRO X = ?X%Y$;
                    OWN X;

         This gives the error message that X%Y is undefined.
                                                               Page 12


4.0  INSTALLATION INSTRUCTIONS

The BLIS10.EXE and BLIS10.ERR files go on SYS:.  The  file  BLIS10.DOC
goes on DOC:.





5.0  INTERNAL CHANGES

The error file is once again BLIS10.ERR.



6.0  SUGGESTIONS

If you suspect bad code is being generated, try recompiling the module
with   /U.   This  turns  off  optimization--in  particular,  peephole
optimization.


[End of BLIS10.DOC]



BLIS10.DOC                             Changes from 5A(124) to 6(212)
January, 1977


!
!
! Copyright (C) 1976, 1977
! Digital Equipment Corporation,  Maynard, Massachusetts  01754
!
! This software is furnished under a license for use only on  a
! single computer system and may be copied only with the inclu-
! sion of the above copyright notice.  This  software,  or  any
! other  copies  thereof, may not be provided or otherwise made
! available to any other person except for use on  such  system
! and  to  one who agrees to these license terms.  Title to and
! ownership of the software shall at all times remain in DEC.
!
! The information in this software is subject to change without
! notice and should not be construed as a commitment by Digital
! Equipment Corporation.
!
! DEC assumes no responsibility for the use or  reliability  of
! its software on equipment which is not supplied by DEC.
!
!
!
!
                                                                Page 2


1.0  SUMMARY


BLISS-10 6(212) replacing BLISS-10 5A(124).


This version runs on TOPS-10 monitors from 5.07 to  present.   It  can
run  on  DECsystem-20  under  the compatability package.  This version
supercedes 5A(124).


A description of BLISS-10 is contained in

     DECsystem-10    BLISS-10    Programmer's     Reference     Manual
     DEC-10-LBRMA-A-D


2.0  External Changes


The macro code generated by BLISS-10 now places the  PLIT  area  after
the code, constant, and literal areas.  This is reflected in the macro
listing and the REL file.


3.0  Known Bugs and Deficiencies


 1.  Case Folding (translation of lower case to upper case)  does  not
     work with macro formal names in strings.

     Ex.

          EXTERNAL TYPSTR;              ! Types an ASCIZ string
          MACRO M(H)=TYPSTR('THE MESSAGE IS :h')$;
          M(WRONG)

     This should type:

          THE MESSAGE IS:WRONG

     Instead it types:

          THE MESSAGE IS:h

 2.  A quoted string longer than  1000  characters  gives  a  compiler
     error and dies.

 3.  A compiler error occurs if allocation declarations (LOCAL or OWN)
     appear in BEGIN ... END block of a structure.

 4.  A global routine should have a compound expression  or  block  as
     its  body.   Otherwise,  an  "illegal  up level addressing" error
     message may occur.
                                                                Page 3


     Ex:  MODULE AAA=
          BEGIN
              REGISTER A;
              GLOBAL ROUTINE MLIST=-2;
              A=-1;
          END
          ELUDOM

 5.  Bad code is generated for the last argument to the call  when  it
     is in a structure accessing definition.

     Ex:

          STRUCTURE FOO[I,J]=(BAZ(@.FOO,.I,.J));

     The call to BAZ has nonsense for its last argument.  This may  be
     fixed by inserting parenthesis around the last argument, thus

          STRUCTURE FOO[I,J]=(BAX(@.FOO,.I,(.J)));

 6.  An INDEXES name will give an error ("an operator must be followed
     by a simple expression") if it is not enclosed in parentheses.

     Ex.

          BIND B=PLIT(C INDEXES 4,5,6):
          IF .X EQL C THEN ...  fails.

     However,

          IF .X EQL (C) THEN ...

     works.

 7.  Bind within binds  yield  an  infinite  loop  or  illegal  memory
     reference

     Ex.

          BIND A=(BIND FOO=1;  FOO+5);

 8.  On rare occasion BLISS will lose track of the register  where  it
     has stored the value of an OWN and bad code is generated.

     Ex:

          OWN T;
          T=#123456654321;
       T<18,6>=0;
       T=..T +.(.T+1);

 9.  If a main module (with "STACK" or "START" in its  module  header)
     without  "TIMER=EXTERNAL(SIX12)",  or  the  like is compiled with
     "/D", an error message is produced.
                                                                Page 4


10.  BLISS will not accept a request for a require file  if  its  name
     begins with a number.

     Ex:

          123.BLI

11.  A zero index  on  an  indirect  vector  access  causes  an  error
     message.

     Ex:

          STRUCTURE S[I]=(..S+.I);
          LOCAL S X;
          X[0]=.X[0] +1;

12.  When #  is  not  followed  by  an  octal  digit,  the  result  is
     equivalent  to  #0.  Hence #-14 is decimal -14.  No error message
     is given.

13.  One cannot have several modules defined  in  a  file.   Only  the
     first module gets compiled.

14.  An error message may occur if a control expression involving VREG
     is the right operand of an assignment.  For example,

          A=IF .B THEN .C ELSE .VREG +1

     is an error, but

          A=(IF .B THEN .C ELSE .VREG+1)

     is not.

15.  Setting the CREF switch  in  module  header  with  no  list  file
     specified  in  the  command string bombs.  Sometimes it gives the
     error message "PDL OVERFLOW" or "I/O TO UNDEFINED CHANNEL".

     Ex:

          .R BLIS10
          *A=FILE.BLI
          WHERE FILE.BLIS CONTAINS:
            MODULE SSS(STACK,XREF)=
            BEGIN
            EXTERNAL A;
             A=12;
            END
          ELUDOM

16.  MACHOP JUMP instructions compile incorrectly.

17.  MACHOPS #127,#126 PRODUCE DPB,IDPB machine  instructions  in  the
     list file.  It should produce FLTR,FIXR machine instructions.  In
     any case, the instructions in the REL file are okay.
                                                                Page 5


18.  BIND to REGISTER does not work.

     Ex:

          REGISTER A;
          BIND B=A;     %FAILS%
          BIND C=(A);   %WORKS%

19.  Occassionally a BIND to a  pointer  with  the  indirect  bit  set
     causes an error message.

     Ex:

          BIND A=(300)<0,36,FREG,1>;

20.  A structure containing a compound  expression  may  not  generate
     correct code.

     Ex:

          STRUCTURE XXX[I.J]=
               [1](.I=I+.I;  .J=J+.J);
          OWN U,V,X,Y,XXX Z[2,3];
           .
           .
           .
          Z[(IF .X THEN U ELSE V),Y];

21.  Negative replication counts in PLIT;s  may  cause  a  variety  of
     problems such as:  infinite loops, empty plit areas, and nonsense
     PLITs.

     Ex:

          BIND B = PLIT(1,2,3,-2:(4))

22.  A TDZA instruction preceded by a SKIPN causes the wrong value  to
     be loaded into the register.

     Ex: EXTERNAL X,Y,Z;

         ROUTINE T(S) =
             BEGIN
             CASE .S OF
             SET
                 X = (.Y NEQ 0);
                 X = .Z
         TES;
         END;

     The code generated is incorrect code.

23.  More than eight consecutive assignments cause  an  error  message
     (the limit is eight) and an ill-mem-ref.
                                                                Page 6


24.  BREG is declared to be both LOCAL and EXTERNAL by BLISS-10.


4.0  Installation Instructions


The BLIS10.EXE and BL10ER.ERR files go on SYS:.  The  file  BLIS10.DOC
goes on DOC:.


5.0  Internal Changes


There are two major internal changes:  numerous bugs have  been  fixed
and several new features have been added.


5.1  New Features Added Since Version 5A(124).


These are as follows:

 1.  ALLMACHOP -
     JSYS the TOPS-20 monitor interface command has been added to  the
     ALLMACHOP list.  Its value is octal 104.

 2.  EXTERNAL -
     Multiple declaration of a name as external in the same  block  is
     now allowed.

 3.  MACROS -
     For various reasons, a user may wish to include a comment in  the
     body  of a MACRO.  To do this, the user may now use a double "!".
     No separation may appear between the  exclamation  marks.   Macro
     formals  are not expanded within a comment.  A "$" may not appear
     as part of any comment inside a MACRO.  If  one  does  appear  it
     will  terminate the MACRO definition.  If the comment was started
     with a single "!" or with a "%" then the  comment  will  also  be
     terminated.   If  the  comment was started with a double "!" then
     the comment in the  definition  will  also  be  terminated.   The
     comment  in  the  expansion, however will not be terminated until
     the end of the line on which the macro name occurs.

 4.  LOWER CASE -
     Lower to upper case conversion is done for identifiers.

 5.  LINKAGE -
     (A)  All  declaration  usages  formerly  allowing   an   optional
          structure-name now allow an optional linkage name to precede
          the optional structure name.  Thus, the  following  are  now
          correct:

               LOCAL /LINKX/ /STRUX/ NAME /[...]/ ...
               MAP /LINKX/ /STRUX/ NAME /[...]/ ...
                                                                Page 7


          where by /.../ is meant an optional item  and  by  LINKX  is
          meant a name declared in a linkage declaration of the form:

               LINKAGE LINKX=ENTXIT(...,...);

          LINKAGE NAMES USED IN THIS WAY ARE NOT INTENDED TO HAVE  ANY
          EFFECT AT PRESENT.

     (B)  LINKAGE  NAMES  MAY  APPEAR  IN  FORWARD  AND   IN   ROUTINE
          DECLARATIONS AS FOLLOWS:

               FORWARD /LINKX/ NAME, ...
               ROUTINE /LINKX/ NAME .....

          If a name has a linkage name associated with  it  through  a
          forward  declaration,  then  it must not have a linkage name
          associated with it when it is redeclared later as a routine.

          The effect of  these  declarations  is  to  alter  the  code
          generated  at  routine  entry  and exit:  instead of .ENT.0,
          .ENT.1, ...  AND .EXT.0, ..., names derived from the linkage
          declaration  of the linkage name will be used.  Furthermore,
          the use of the XXXX.0 forms is not optional:  every entry to
          and  return from a routine declared with linkage will be via
          an XXXX.N form.

          A sample program showing proper coding follows:

          LINKAGE INOUT=ENTXIT(WAYIN,WAYOUT);
          EXTERNAL ?WAYI.0,?WAYI.1,?WAYI.2, ..., ?WAYI.5
          EXTERNAL ?WAYO.0,?WAYO.1,?WAYO.2, ... ,?WAYO.5
          FORWARD INOUT R1,R2,R4;
          ROUTINE R1=1;
          ROUTINE R2=2;
          ROUTINE INOUT R3=3;
          ROUTINE R4=4;

          -----WAYIN  is  presumably  a  macro  program  assembled  in
          high-seg with the names WAYI.1, etc., declared "INTERN".

     Linkage is not provided for functions or co-routines.

 6.  PORTAL -
     The keyword "PORTAL" may optionally replace the keyword  "GLOBAL"
     before  "ROUTINE".   The  effect of this substitution is to cause
     the portal instruction "JRST 01,.+1" to be generated as the first
     instruction  at the entry to the routine and otherwise to compile
     the routine as if it had been declared "GLOBAL ROUTINE".

     The use  of  "PORTAL"  conflicts  with  the  inspect  feature  of
     BLISS-10;  thus it should not be used in a program being compiled
     under /I.  "PORTAL" may be used with /D and /T.

     Usage:  PORTAL is to be used when a program is to be protected at
     level  6.   A  routine  declared  with  PORTAL may be called from
                                                                Page 8


     low-seg.  Thus PORTAL is expected to be  used  only  for  entries
     actually  called  from lo-seg.  If a BLISS program is compiled in
     low-seg and called from high-seg, then PORTAL will not work:  the
     solution  is  a  linkage  to  exit  from the lo-seg routine via a
     linkage  segment  in  high-seg  which  begins   with   a   PORTAL
     instruction.

     MACRO programs in  lo-seg  must  be  compiled  with  literals  in
     lo-seg,  for it will not be possible to read literals in high-seg
     from lo-seg.

 7.  UPLIT -
     UPLIT is now a reserved word.  It may be used as PLIT is used and
     has the effect of creating a PLIT without a preceding count word.

 8.  OFFSET -
     OFFSET(FORMAL = -N , for the Nth parameter (i.e.,  FORMAL)  TO  A
     ROUTINE.

     OFFSET(LOCAL) = +N , where local  is  stored  N  words  down  the
     stack.

     OFFSET(LOCAL)  is  not  treated  internally  as  a  literal   and
     therefore not all usages are allowed.  The following are allowed:

     PLIT(OFFSET(LOCAL));
     PLIT(#123456^18+OFFSET(LOCALL));
     PLIT(#123456^18+OFFSET(LOCAL+DELTA));

     Note:  if X is a local or a routine formal, then
          .(.FREG+OFFSET(X)) is equivalent to .X.

 9.  NULL SWITCH -
     NULL SWITCH for module head and switches declaration.

     Action:  none.

10.  INPUT LINE LENGTH -
     Maximum input line length is now 145 characters  (tabs  count  as
     one character).

11.  COMMAND LIST "#" -
     A command line consisting of a file name followed by a  "#"  will
     cause  the program on that file to be run.  The default device is
     "SYS".  This is same as "!" except "!" causes the program  to  be
     started at its starting point plus 1.

12.  CHARACTER "&" -
     The character "&" may be used as an alphabetic character in names
     without  preceding the name with a "?".  It is equivalent to ".",
     which may still be used with old "?" notation.

     Example:  'WAIT&1' is equivalent to '?WAIT.1'.

13.  LINK TIME CONSTANTS -
                                                                Page 9


     Link time constants have been expanded.  Link time constants  are
     the legal entries in a PLIT.

     <LTC> = <CTC>
             <VAR TYP1>
             <VAR TYP2>
             <VAR TYP1> + <CTC>
             <CTC> + <VAR TYP1>
             <VAR TYP1> = <CTC>

     <VAR TYP1> = <OWN VARIABLE>
             <GLOBAL VARIABLE>
             <EXTERNAL VARIABLE>
             <PLIT>

     <VAR TYP2> = <ROUTINE>
             <FORWARD>
             <FUNCTION>
             <GLOBAL ROUTINE>

     <CTC> = <COMPILE TIME CONSTANT>

14.  GLOBAL BIND -
     Global binds may be made to any link time constant.

15.  BLISS-36C SPECIAL FEATURES -
     The three module head switches  "BLS36",  "IDELETE"  and  "B10NL"
     have  been  added.  Also two new keywords, "LOAD&" and "LIBRARY&"
     with the  corresponding  special  declarations  are  implemented.
     These  special  features  are  intended  only  to  facilitate the
     processing of BLISS-36C programs.


6.0  Suggestions


None


[End of BLIS10.DOC]