Google
 

Trailing-Edge - PDP-10 Archives - ap-c796e-sb - blis10.rnd
There are no other files named blis10.rnd in the archive.
.LM0.RM75.PARA0,2,4.F.J
.title
BLISS.DOC Changes from 6(212) to 7E(227)
.br
January, 1978
.FG 30
.para.lc.uc.nf.nj
 COPYRIGHT (c) 1978 BY
 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
.bl1
 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.
.bl1
 THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
 AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
 CORPORATION.
.bl1
 DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
 SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
.ps58,70
.page
.title
BLISS.DOC Changes from 6(212) to 7E(227)
.br
January, 1978
.lm0.rm70.f.j.uc
.hl1Summary
.para
BLISS-10 7E(227) replacing BLISS-10 6(212).
.bl1
The distribution tape contains the following files:
.bl1.lm9.ts26.nf.nj
BLIS10.EXE	!BLISS-10 Compiler V7E(227)
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
.bl1.lm0.f.j
This version runs on TOPS-10 monitors from 5.07 to present.
It can run on DECsystem-20 under the compatability package.
This version supersedes 6(212).
.bl1
A description of BLISS-10 is contained in
.bl1.lm5.nf.nj
DECsystem-10 BLISS-10 Programmer's Reference Manual
.lm0.f.j
.hl1External Changes
.para
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.
.lm0.f.j
.hl2New Features Added Since Version 6(212).
.lm20
*** WARNING ***
.LM5
.PARA
Here 6 below may affect some current programs. Review it carefully
before using V7E.
.lm0
.para
#####Six new features have been added.
.bl1.lm9.i-4.f.j
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, and the number of words initialized must not exceed the data segment size.
.bl1
Examples:
.i11.nf.nj
OWN X=1,Y[2]=(4,5);
.i11
GLOBAL STRING[4]=#'This is a String';
.bl1.f.j
The declaration
.bl1.i11.nf.nj
OWN X:Y:Z#=#1:
.bl1.f.j
only initializes X and gives the warning message for Y and for Z that
factorization of initialization is not allowed.
.bl1
The declaration
.bl1.i11.nf.nj
OWN X#=#(2,3),Y;
.bl1.f.j
produces a warning message stating that overinitialization has taken
place; in this example X will be initialized to 2 and Y to 3.
.bl1.i-4.f.j
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.
.bl1.i-4
3.##Register assignments for each module are now identified in the relocatable object file.
To achieve this, the following names
.bl1.i5.nf.nj
_.SREG
.I5
_.FREG
.I5
_.VREG
.I5
_.DREGS
.I5
.lm9.bl1.f.j
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:
.bl1.i5.nf.nj
_.SREG=:0
.I5
_.FREG=:-2
.I5
_.VREG=:-3
.I5
_.DREGS=:-174000
.BL1.F.J
This states that SREG is 0, FREG is 2, VREG is 3, and registers 17, 16,
15, 14, and 13 (octal) are preserved.
.bl1.i-4
4.##A new command line switch, /Z, is now available. The /Z switch establishes alternative
default register assignments, as follows: 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.
.para.i-4
5.##A require file declaration may also have the form
.bl1.i5.nf.nj
REQUIRE 'file-specification';
.bl1
where a file-specification is written
.bl1.i5
device:filename.extension[ppn]
.bl1.f.j
with device:, .extension, and [ppn] being optional.  This corrects the deficiency _#10 listed below
in section 3.
.bl1.i-4.f.j
6.##Within a macro definition, two new conventions are now available to
incorporate a dollar sign character into the text of the macro
being defined. First, the ? name convention is now used
by the macro scanner to find names in the macro body. Specifically,
if a name begins with ? any contiguous $ will become part of the macro
body and not terminate the macro definition. (This does not affect
the use of $ adjacent to non-? names.) Second, a sequence of two adjacent dollar signs
will be incorporated in the macro body as a single dollar sign
character and will not terminate the macro definition. This is
needed to permit the dollar sign character to be used in quoted strings
within the macro body. Note in particular, that the ? convention
takes precedence over the adjacent $ convention so that two adjacent
$ in a ? name will give two $'s in the expansion.
.bl1.lm9.f.j
WARNING: This convention is not intended to allow macro
expansions to produce (nested) macro definitions.
Unpredictable results will occur if this is attempted.
.bl1
Example:
.bl1.i5.f.j
MACRO
.i5
####TEXT##=#'ab$$'$,
.i5
####NAME1#=#_?X$#$,
.i5
####NAME2#=#_?X$$Y#$,
.i5
####NAME3#=#X$;
.bl1
defines TEXT to be the five character sequence 'ab$', NAME1 to 
be the sequence ?X$, NAME2 to be the sequence ?X$$Y and NAME3
to be the sequence X.
.bl2
Some macros used with compilers prior to V7E may need to be
changed for proper operation. For example:
.bl1
#####MACRO JBDAT = ?.JBDAT$;
.BL1
must be changed to
.bl1
#####MACRO JBDAT = ?.JBDAT $;
.BL1
that is, a space (or tab) must precede the $ that terminates the
macro body.
.bl1
.lm0.f.j
.hl1Known Bugs and Deficiencies
.bl1
.hl2Documentaion
.para
The following documentaion problems exist in the BLISS-10
Programmer's Reference Manual, DEC-10-LBRMA-A-D:
.bl1.lm9.i-4.f.j
1.##_^ Operator
.bl1
The _^ operator is described as an arithmetic shift, but
is actually a logical shift.
.bl1.i-4.f.j
2.##_@ Operator with Formal Name in Structure Definition
.bl1
Several users have reported problems when the _@ fetch
operator is used with a formal name in a structure definition,
such as
.bl1
########STRUCTURE V = .V + @I;
.bl1
They expect that the "@" works like "_." to cause the formal
I to refer to an access actual parameter, but this is incorrect.
Since no dot preceeds the formal I it is interpreted as an
allocation parameter to which the "@" operator is applied.
Since allocation parameters are always constant values,
optimization effects often give the appearance of missing
code.
.bl1
As a general rule, it is almost never meaningful to use
the "@" (or "_\") operator preceeding a formal name in a
structure definition. Such usage is not, however, an actual
error and hence can not be diagnosed by the compiler.
.bl1.i-4.f.j
3.##Discrepancy between GLOBAL BIND and EXTERNAL references
.bl1
There is a discrepancy between the effects obtained from a
GLOBAL BIND definition of a name and the corresponding EXTERNAL
definition of the name in a separate module.
Consider this example:
.bl1.nf.nj
########MODULE =
########BEGIN
########BIND A = 1;
########GLOBAL BIND B = 2;
########EXTERNAL C;
########VREG = A;
########VREG = B;
########VREG = C;
########END
########ELUDOM
.bl1
The compiled code is:
.bl1
##########MOVEI###$V,1
##########MOVEI###$V,2
##########MOVE####$V,MA1N.C+0
##########...
MA1N.C:###XWD#####004400,,C
.bl1
One would expect that if C is defined by the declaration
.bl1
########GLOBAL BIND C=2;
.bl1.f.j
in another module, that the value of C assigned
to $V would not have 004400 in the left half-word, since that
is what happens for A and B.
.bl1
This discrepancy illustrates an inherent ambiguity in the definition
of BLISS-10; there is no practical resolution. For symbol B
in the above example, the compiler knows that the value of B and
treats it in the "natural" way. The value of C is not known
and is treated like a relocatable storage name, which gives
rise to the byte pointer value of the name.
.bl1
The assignment
.bl1
########VREG = C<0,0>
.bl1
will have the intended effect for the case where C is defined as
a constant value. Note that a further implication of this problem
is that constant values defined in a GLOBAL BIND effectively
must be treated as 18-bit values in other routines.
.bl1.i-4.f.j
4.##LOWSEG module head switch
.bl1
The LOWSEG is mis-printed as LOSEG in the BLISS-10 syntax
in the appendix A. LOWSEG module head switch forces the entire
compilation into the low segment. LOSEG switch has no effect and
is ignored by the BLISS-10 compiler.
.lm0.f.j
.hl2Compiler
.para
The following bugs remain (numbers refer to the cumulative
bug list below):
.bl1
6,19,20,47 and 52.
.bl1
The following bugs have been fixed:
.bl1
4,5,7,8,10,11,12,13,17,18,21,22,24,25,
.br
26,27,28,29,30,31,32,33,34,35,36,37,
.br
38,39,40,41,42,43,44,45,46,48,49,50 and 51.
.para
The following deficiencies are determined to be not repairable
or not worth correction and are left as is:
.bl1
1,2,3,9,14,15,16 and 23.
.bl1.lm9.i-4.f.j.ts40
1.##DEFICIENCY
.bl1
Case Folding (translation of lower case to upper case)
does not work with macro formal names in strings.
.bl1
Ex.
.lm14.nf.nj
EXTERNAL TYPSTR;	! Types an ASCIZ string
MACRO M(H)=TYPSTR('THE MESSAGE IS :h')$;
M(WRONG)
.bl1.lm9
This should type:
.bl1.lm14
THE MESSAGE IS:WRONG
.lm9.bl1
Instead it types:
.bl1.lm14
THE MESSAGE IS:h
.lm9.i-4.bl1
2.##DEFICIENCY
.bl1.f.j
When processing a  quoted string longer than 1000 characters the compiler gives an error
message and aborts.
.bl1.i-4
3.##DEFICIENCY
.bl1
A compiler error occurs if allocation declarations (LOCAL or OWN) appear
in a  BEGIN#...#END block of a structure.
.bl1.i-4
4.##BUG FIXED 7E(225)
.bl1.f.j
A global routine should have a compound expression or block as its
body.  Otherwise, an "illegal up level addressing" error message may occur.
The above error occurs if one defines nested global routines and
declares registers with the same names in each global routine.
.bl1
Ex:
.lm14.nf.nj
MODULE AAA=
BEGIN
.LM18
REGISTER A;
GLOBAL ROUTINE MLIST=-2;
A=-1;
.LM14
END
ELUDOM
.bl2
GLOBAL ROUTINE ONE=
BEGIN
.LM19
REGISTER R,S,T;
BEGIN
.LM24
GLOBAL ROUTINE TWO=
BEGIN
.LM29
REGISTER R,S,T;
R=S=T=2;
.LM24
END;
.LM19
END;
R=S=T=1;
.LM14
END;
.bl1.lm9.i-4.f.j
5.##BUG FIXED 7(215)
.bl1
Bad code is generated for the last argument to the call when it is
in a structure accessing definition.
.bl1
Ex:
.i5
STRUCTURE FOO[I,J]=(BAZ(@.FOO,.I,.J));
.bl1
The call to BAZ has nonsense for its last argument.  This may be fixed
by inserting parenthesis around the last argument, thus
.bl1.i5
STRUCTURE FOO[I,J]=(BAX(@.FOO,.I,(.J)));
.bl1.i-4.f.j
6.##BUG
.bl1
An INDEXES name will give an error ("an operator must be
followed by a simple expression") if it is not enclosed in
parentheses.
.bl1
Ex.
.i5
BIND B=PLIT(C INDEXES 4,5,6):
.I5
IF .X EQL C THEN ...
fails.
.bl1
However,
.bl1.i5
IF .X EQL (C) THEN ...
.bl1
works.
.bl1.i-4.f.j
7.##BUG FIXED 7(215)
.bl1
Bind within binds yield an infinite loop or illegal memory reference
.bl1
Ex.
.i5
BIND A=(BIND FOO=1; FOO+5);
.bl1.i-4
8.##BUG FIXED 7(215)
.bl1
On rare occasion BLISS will lose track of the register where
it has stored the value of an OWN and bad code is generated.
.bl1
Ex:
.lm14.nf.nj
OWN T;
T=_#123456654321;
.LM14
T<18,6>=0;
T=..T +.(.T+1);
.bl1.lm9.i-4.f.j
9.##DEFICIENCY
.bl1
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.
.bl1.lm9.i-5
10.##DEFICIENCY REMOVED 7B(222)
.bl1
BLISS will not accept a request for a require file if its name
begins with a number.
.bl1
Ex:
.i5
123.BLI
.bl1
This problem may now be avoided by enclosing the file specification in quotes--e.g., '123.BLI'.
.bl1.i-5
11.##BUG FIXED 7B(222)
.bl1
A zero index on an indirect vector access causes an error message.
.bl1
Ex:
.lm14.nf.nj
STRUCTURE S[I]=(..S+.I);
LOCAL S X;
X[0]=.X[0] +1;
.bl1.lm9.i-5.f.j
12.##BUG FIXED 7(215)
.bl1
When _# is not followed by an octal digit, the result
is equivalent to _#0.  Hence _#-14 is decimal -14.  No error message
is given.
.bl1.lm9.i-5.f.j
13.##BUG FIXED 7(215)
.bl1
One cannot have several modules defined in a file.
Only the first module gets compiled.
.bl1.i-5
14.##DEFICIENCY
.bl1
An error message may occur if a control expression involving VREG is the
right operand of an assignment.  For example,
.bl1.i5
A=IF .B THEN .C ELSE .VREG +1
.bl1
is an error, but
.bl1.i5
A=(IF .B THEN .C ELSE .VREG+1)
.bl1
is not.
.bl1.lm9.i-5.f.j
15.##DEFICIENCY
.bl1
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".
.bl1
Ex:
.lm14.nf.nj
_.R BLIS10
*A=FILE.BLI
.bl1.lm9
where FILE.BLIS contains:
.bl1.lm16
MODULE SSS(STACK,XREF)=
BEGIN
EXTERNAL A;
#A=12;
END
ELUDOM
.bl1.lm9.i-5.f.j
16.##DEFICIENCY
.bl1
MACHOP JUMP instructions compile incorrectly.
.bl1.i-5
17.##BUG FIXED 7(215)
.bl1
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.
.bl1.i-5
18.##BUG FIXED 7B(222)
.bl1
BIND to REGISTER does not work.
.bl1
Ex:
.lm14.nf.nj
REGISTER A;
BIND B=A;#####%FAILS%
BIND C=(A);###%WORKS%
.bl1.lm9.i-5.f.j
19.##BUG
.bl1
Occassionally a BIND to a pointer with the indirect bit set causes
an error message.
.bl1
Ex:
.i5
BIND A=(-1)<0,36,FREG,1>;
.bl1.i-5
20.##BUG
.bl1
A structure containing a compound expression may not generate correct code.
.bl1
Ex:
.lm14.nf.nj
STRUCTURE XXX[I.J]=
.I5
[1](.I=I+.I;##.J=J+.J);
OWN U,V,X,Y,XXX#Z[2,3];
#.
#.
#.
Z[(IF .X THEN U ELSE V),Y];
.bl1.lm9.i-5.f.j
21.##BUG FIXED 7(215)
.bl1
Negative replication counts in PLITS may cause a variety
of problems such as:  infinite loops, empty PLIT areas, and nonsense PLITs.
.bl1
Ex:
.i5
BIND B = PLIT(1,2,3,-2:(4))
.BL1.LM9.I-5.F.J
22.##BUG FIXED 7(215)
.bl1
A TDZA instruction preceded by a SKIPN causes the wrong
value to be loaded into the register.
.bl1
Ex:
.lm14.nf.nj
EXTERNAL#X,Y,Z;
ROUTINE#T(S)#=
.LM17
BEGIN
CASE .S OF
SET
.LM21
X#=#(.Y NEQ 0);
X#=#.Z
.LM14
TES;
END;
.bl1.lm9.f.j
The code generated is incorrect code.
.bl1.lm9.i-5
23.##DEFICIENCY
.bl1
More than eight consecutive assignments cause an error message (the
limit is eight) and an ILL-MEM-REF. This is a user error (more than
eight are not allowed), but the compiler should not crash.
.bl1.i-5
24.##BUG FIXED 7B(222)
.bl1
BREG is declared to be both LOCAL and EXTERNAL by BLISS-10, in the listing file.
.bl1.i-5
25.##BUG FIXED 7(215)
.bl1
Multiple FORWARD declarations are not allowed.
.bl1
Example:
.lm14.nf.nj
FORWARD##A;
FORWARD##A;
.bl1.lm9.i-5.f.j
26.##BUG FIXED 7(215)
.bl1
Actual arguments pushed on the stack by a routine call may be overwritten
when one of the arguments is a block containing locals.
.bl1.nf.nj
Ex:
#####EXTERNAL##BAZ;
#####BAZ#(1,2,BEGIN
##################LOCAL#I,J,K;
##################K__10;
##################_.K
##############END#,#3)
.bl1.lm9.i-5.f.j
27.##BUG FIXED 7(215)
.bl1
REQUIRE file names cannot have the same name or
extension as a  previously declared symbol.  This causes an error
message.
.bl1
Ex:
.lm14.nf.nj
BIND##ABC=2;
REQUIRE##ABC.REQ;
.bl1.lm9.i-5
28.##BUG FIXED 7(215)
.bl1
When MACROs consisting only of comments are used
excessively, a PDL overflow occurs.
.bl1.nf.nj
Ex:
####MACRO##X=!!_$;
####X##ABCDE
####X##ABCDE
####_.
####_.
####_.
####X##ABCDE
.bl1.lm9.i-5.f.j
29.##BUG FIXED 7(215)
.bl1
The peephole optimizer attempts to replace a store followed by a load
with a single store.  Unfortunately, a sequence such as
.bl1.i11.nf.nj
MOVEM###3,1(2)
.i11
PUSHJ###0,Y
.i11
MOVE####3,1(2)
.bl1.f.j
is incorrectly optimized.
.bl1
The optimizer does not know that a routine call can change register 3.  This bug would
arise in the following BLISS-10 routine:
.bl1.lm11.nf.nj
ROUTINE##R#=
####BEGIN
####EXTERNAL X,Y,Z;
####LOCAL T;
####T#=#X();
####Y();
####Z#=#.Z+.T
####END;
.bl1.lm9.i-5.f.j
30.##BUG FIXED 7(215)
.bl1
The character manipulation built-in functions INCP, SCANI, REPLACEI, COPYNI,
COPYIN, and COPYII, produce a side effect, 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.
.bl1
Example:
.lm11.bl1.nf.nj
ROUTINE R#=
####BEGIN
####EXTERNAL X;
####LOCAL T;
####T#=#.X;
####IF SCANI(T)##THEN X#=#.T
####END;
.bl1.lm9.f.j
The updated value of T is not placed back  in X.
.bl1.lm9.i-5.f.j
31.##BUG FIXED 7B(222)
.bl1
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.
.bl1
Example:
.bl1.lm11.nf.nj
EXTERNAL##A,B;
BIND##C#=#PLIT (A,B);
BIND##D#=#PLIT (A,A);
.lm9.bl1.f.j
If PLITS are put in the low segment, a linking error will result.
.bl1.lm9.i-5
32.##DEFICIENCY FIXED 7B(222)
.bl1
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.
.bl1.i-5
33.##BUG FIXED 7B(222)
.bl1
The peeophole optimizer tries to replace a MOVE and test sequence with a SKIP
instruction.  Thus,
.bl1.lm11.nf.nj
MOVE R,X
TLNN R, _#400000
.bl1.lm9.f.j
becomes SKIPL R,X.  This should not be done, however, when the test instruction is labelled.
.bl1
Example:
.bl1.lm11.nf.nj
REGISTER R;
EXTERNAL X,Y;
R#=#.X;
WHILE .R<35,1> DO Y();
.bl1.lm9.f.j
This generates the above sequence.
.bl1.i-5
34.##BUG FIXED 7B(222)
.bl1
Extra blank characters are inserted into a quoted string if the string extends over more than one source
line.
.bl1
Example:
.bl1.lm11.nf.nj
PLIT(#'HELLO-
BLISS-10'#);
.bl1.lm9.f.j
This string contains one extra blank character.
.bl1.lm9.i-5.f.j
35.##BUG FIXED 7B(222)
.bl1
Sometimes incorrect code for SELECT expressions is generated.
.bl1
Example:
.bl1.lm11.nf.nj
EXTERNAL X;
ROUTINE XXX=
BEGIN
SELECT .X OF
NSET
1:#RETURN 1;
2:# RETURN 2;
OTHERWISE:#RETURN 0
TESN;
END;
.bl1.lm9.i-5.f.j
36.##BUG FIXED 7C(223) 
.bl1
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.
.bl1.i-5
37.##BUG FIXED 7B(222)
.bl1
If ELUDOM is followed by a semicolon, or any other delimiter except MODULE, the
compiler loops.
.bl1.i-5
38.##BUG FIXED 7E(225)
.bl1
A name prefixed by the escape character "?" is not processed properly when it appears in a macro
body.
.bl1
Example:
.bl1.i11.nf.nj
BEGIN
.I11
BIND ?X%Y=1;
.I11
MACRO FOO#=#?X%Y$;
.I11
BIND A=FOO;
.I11
END;
.bl1.f.j
This gives the error message that X is undefined, because
%Y is considered to be the start of a comment. This is 
corrected by new feature _#6 described above. Note, however, that
this example must now be written as
.bl1
########MACRO FOO#=#?X%Y#$;
.BL1
where the space between Y and $ is necessary to prevent $ from being
included in the ?-name.
.bl1.lm9.i-5.f.j
39.##BUG FIXED 7C(223)
.bl1
Incorrect code is generated when a memory location is updated
using a dynamically constructed byte pointer. The byte pointer
is constructed and used to correctly modify memory, but
 BLISS-10 does not invalidate the previous copy of the
memory from the register table. This can be avoided by declaring 
it as a register type.
.bl1
Example:
.lm11.bl1.nf.nj
ROUTINE R#=
####BEGIN
####LOCAL X,Y,Z;
####X#=#1;
####X<.Y<10,3>,5>#=#2;
####Z#=#@X
####END;
.bl1.lm9.i-5.f.j
40.##BUG FIXED 7C(223)
.bl1
Bad symbol name is generated if the symbol is declared using '?' and
mixture of upper and lower case characters.
.bl1
Example:
.lm11.bl1.nf.nj
GLOBAL ?HelLo;
EXTERNAL ?JbInt;
.bl1.lm9.i-5.f.j
41.##BUG FIXED 7C(223)
.bl1
Lower case character in a string in a MACRO body is translated
to upper case during MACRO expansion.
.bl1
Example:
.lm11.bl1.nf.nj
MACRO TEST = VREG = "a" $;
TEST;
.bl1.lm9.i-5.f.j
42.##BUG FIXED 7D(225)
.bl1
BLISS-10 generates the error message, "Illegal up level addressing"
for inner declaration of "REGISTER T" in the following example.
.bl1
Example:
.lm11.bl1.nf.nj
GLOBAL ROUTINE R =
BEGIN
REGISTER T;
##BEGIN
##GLOBAL ROUTINE RR =
####BEGIN
####REGISTER T;
#######.
#######.
#######.
####END;
##END
END;
.bl1.lm9.i-5.f.j
43.##BUG FIXED 7C(223)
.bl1
Bad code is generated when constant CASE or constant IF control
expressions are used. BLISS-10 tries to use VREG as a target
register. It should have processed it like any other ordinary
expression.
.bl1
Example:
.lm11.bl1.nf.nj
EXTERNAL SRSEMP,SRSUBP,F;
STRUCTURE SRSTACK[I]=
##(IF .I LSS 0
###THEN (.SRSEMP + (.I + 1))<0,36>
###ELSE (.SRSUBP + .I)<0,36>
###);
EXTERNAL#SRSTACK#SRSTK;
STRUCTURE SRELEM[X,I,P,S]=(@SRSTK[.SRELEM] +
#############################(.i - .X))<.P,>s>;
BIND SRELEM SEMO = -1;
ROUTINE SR26=
###BEGIN
###LOCAL LEX;
###LEX = .SEMO[0,2,0,36]; 
###SEMO[0,2,0,36] = F(2);
###.VREG
###END;
.bl1.lm9.i-5.f.j
44.##BUG FIXED 7E(227)
.bl1
BLISS-10 does not give a very meaningful error message when the illegal /-V
switch is used. The error message produced is " ?P is an illegal
switch ".
.bl1
Example:
.lm11.bl1.nf.nj
_.R BLIS10
*,A=A/-V
.bl1.lm9.i-5.f.j
45.##DEFICIENCY FIXED 7C(223)
.bl1
BLISS-10 does not allow $'s in comments in a MACRO body.
.bl1
Example:
.lm11.bl1.nf.nj
MACRO NOGO = %This is a dollar ... $ %$;
.bl1.lm9.f.j
See item 6 of section 2 for an alternative approach.
.bl1.i-5.f.j
46.##BUG FIXED 7C(223)
.BL1
Bad code is generated when common subexpressions are involved in 
a control expression and a expression which uses the control expression.
.bl1
Example:
.lm11.bl1.nf.nj
MACRO INDEX(ADDR) =
BEGIN
###IF ADDR THEN 1
########## ELSE IF (ADDR AND #777)
################ THEN 2
################ ELSE 3
END$;
ROUTINE R(ADDR) =
#####((.ADDR AND #777) + INDEX(.ADDR));
.bl1.lm9.i-5.f.j
47.##BUG
.BL1
Bad code is generated for the following example.
.bl1
Example:
.lm11.bl1.nf.nj
MODULE L(DREGS=2,RESERVE(9,10,11,12,13,14,15)) =
BEGIN
###GLOBAL ROUTINE R =
###BEGIN
###MACRO S(X) = PUSH(SREG,X)$;
###S(2);S(3);S(4);S(5);S(6);S(7);S(8);S(9);S(10);S(11);
###S(12);S(13);S(14);S(15);
###INCR I TO 12 DO
###INCR J TO  3 DO
#####RETURN (.I + .J)
###END;
END ELUDOM
.bl1.lm9.f.j
The DREGS=2 and RESERVE( ) in MODULE head have some effects 
on this program.
.bl1.lm9.i-5.f.j
48.##BUG FIXED 7C(223)
.bl1
Bad code was generated when routine definitions nested in other
control expression contexts use INCR or DECR loop expressions.
BLISS-10 did not preserve the savable temporaries
across the routines.
.bl1
Example:
.bl1
ROUTINE ONE=
.i11.nf.nj
###BEGIN
###LOCAL A[3];
###INCR I FROM 1 TO 3 DO A[.I]=3;
#####BEGIN
######ROUTINE TWO=
#########BEGIN
#########LOCAL A[4];
#########INCR I FROM 1 TO 3 DO A[.I]=4;
#########END;
#####END
###END;
.bl1.lm9.i-5.f.j
49.##BUG FIXED#7D(224)
.bl1
BLIS10 compiler loops in the following context.
BLIS10 did not free all references to a register when that register
was not free and used by MOD function. The register content was
saved onto a stack, but did not free all it's references.
.bl1
Example:
.LM11.bl1.NF.NJ
MACRO
#####TAB=#11$,
#####INBUFLEN=3000$,
#####CR=#15$;
EXTERNAL#READLINE;
STRUCTURE
###BYTE[I]=[(I+4)/5](.BYTE+(.I/5))<29-7*(.I MOD 5),7>;
OWN
###IN,
###INSEQ,
###BYTE INLINE[INBUFLEN],
###BYTE LINE[80],
###INEND;

ROUTINE GETLINE(POS)=
BEGIN
##LOCAL CH,LEN,I,N;
##IF (LEN=READLINE(@IN,LINE,INSEQ)) LSS 0 THEN RETURN;
##I=-1;
##INLINE[@POS+72]=" ";
##WHILE (CH=.LINE[I=@I+1]) NEQ CR DO
####BEGIN
####IF @CH EQL TAB 
#######THEN N=8-(@POS MOD 8)
#######ELSE
#######INLINE[@POS]=@CH;
####END;
##POS=@POS-1
##END;
.bl1.lm9.i-5.f.j
50.##DEFICIENCY FIXED 7E(225)
.bl1
Byte pointer creation.
.bl1
BLISS-10 would give the warning ("Value in field selector outside
permitted range") for the following field selection cases.
The cases are P < 0, S < 0, X < 0, I < 0, P > 36, 
S > 36, X > 15, and I > 1. Where P = position
field, S = size field, X = index register value, I = indirect
bit value.
.bl1.lm9.i-5.f.j
51.##DEFICIENCY FIXED 7E(225)
.bl1
The machine instruction mnemonics used in the listing are limited to KA10 instructions.
.bl1
All KI10 machine instructions are now added. The previous
compiler was outputting wrong mnemonics into the listing file.
Now, the listing file would have the correct mnemonics.
In any case, the instructions in the REL file are okay. The 
added instructions are
.bl1
DFAD,DFSB,DFMP,DFDV,DMOVE,DMOVN,FIX,DMOVEM,DMOVNM,FIXR,FLTR,
MAP.
.bl1
Note that these instructions are never generated by the compiler
except by an explicit MACHOP in the program source.
.bl1.i-5.f.j
52.##BUG
.bl1
Bad code was generated for the following case. The BLISS-10 
compiler did not distinguish the symbol 'COUNT' use in different
context. The loop name 'COUNT' is different from the external name used in the 
expression '.COUNT' .
.lm11.bl1.nf.nj
EXTERNAL COUNT,VALUE;
DECR COUNT FROM .COUNT TO 0
##########DO##VALUE=1;
.lm0.f.j
.hl1Installation Instructions
.para
The BLIS10.EXE and BLIS10.ERR files go on SYS:.  The file
BLIS10.DOC goes on DOC:.
.lm0.f.j
.hl1Internal Changes
.para
The error file is once again BLIS10.ERR.
.lm0.f.j
.hl1Suggestions
.para
If you suspect bad code is being generated, try recompiling the module with /U.
This turns off optimization--in particular, peephole optimization.
.bl3
[End of BLIS10.DOC]
.BL1
[BLIS10 V6(212) is appended as an integral part of BLIS10 V7E(226)]
.page
.LM0.RM70.PARA0,2,4.F.J
.TS39
^^BLIS10.DOC ^CHANGES FROM 5^A(124) TO 6(212)
.BR
^JANUARY, 1977
.fg 30
.PARA.LC.UC.NF.NJ
Copyright (C) 1976, 1977
Digital Equipment Corporation,  Maynard, Massachusetts  01754
.bl1
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.
.bl1
The information in this software is subject to change without
notice and should not be construed as a commitment by Digital
Equipment Corporation.
.bl1
DEC assumes no responsibility for the use or  reliability  of
its software on equipment which is not supplied by DEC.
.PAGE
.LM0.F.J.UC
1.0##^SUMMARY
.PARA
^^BLISS-10\\ 6(212) REPLACING ^^BLISS-10\\ 5^A(124).
.PARA
^THIS VERSION RUNS ON ^^TOPS\\-10 MONITORS FROM 5.07 TO PRESENT.
^IT CAN RUN ON ^D^E^CSYSTEM-20 UNDER THE COMPATABILITY PACKAGE.
^THIS VERSION SUPERCEDES 5^a(124).
.PARA
^A DESCRIPTION OF ^^BLISS-10\\ IS CONTAINED IN
.BL1.LM5
^D^E^CSYSTEM-10 ^^BLISS-10\\ ^PROGRAMMER'S ^REFERENCE ^MANUAL ^^DEC-10-LBRMA-A-D\\
.PARA.LM0.F.J
2.0##^EXTERNAL ^CHANGES
.PARA
^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 ^R^E^L FILE.
.PARA
3.0##^KNOWN ^BUGS AND ^DEFICIENCIES
.PARA.LM5.I-4.F.J.TS40
1.##^CASE ^FOLDING (TRANSLATION OF LOWER CASE TO UPPER CASE)
DOES NOT WORK WITH MACRO FORMAL NAMES IN STRINGS.
.BL1
^EX.
.BL1.LM10.NF.NJ
^^EXTERNAL TYPSTR;\\	! ^TYPES AN ^^ASCIZ\\ STRING
^^MACRO M(H)=TYPSTR('THE MESSAGE IS :\\H')$;
^^M(WRONG)\\
.BL1.LM5
^THIS SHOULD TYPE:
.BL1.I5
^^THE MESSAGE IS:WRONG\\
.BL1
^INSTEAD IT TYPES:
.BL1.I5
^^THE MESSAGE IS:\\H
.BL1.I-4.F.J
2.##^A QUOTED STRING LONGER THAN 1000 CHARACTERS GIVES A COMPILER ERROR AND DIES.
.BL1.I-4
3.##^A COMPILER ERROR OCCURS IF ALLOCATION DECLARATIONS (^^LOCAL\\ OR ^O^W^N) APPEAR
IN ^^BEGIN#...#END\\ BLOCK OF A STRUCTURE.
.BL1.I-4
4.##^A GLOBAL ROUTINE SHOULD HAVE A COMPOUND EXPRESSION OR BLOCK AS ITS
BODY.  ^OTHERWISE, AN "ILLEGAL UP LEVEL ADDRESSING" ERROR MESSAGE MAY OCCUR.
.BL1
^EX:##^^MODULE#AAA=
.LM10.NF.NJ
^^BEGIN
.LM14
REGISTER A;
GLOBAL ROUTINE MLIST=-2;
A=-1;
.LM10
END
ELUDOM\\
.BL1.LM5.I-4.F.J
5.##^BAD CODE IS GENERATED FOR THE LAST ARGUMENT TO THE CALL WHEN IT IS
IN A STRUCTURE ACCESSING DEFINITION.
.BL1
^EX:
.BL1.I5
^^STRUCTURE FOO[I,J]=(BAZ(@.FOO,.I,.J));\\
.BL1
^THE CALL TO ^B^A^Z HAS NONSENSE FOR ITS LAST ARGUMENT.  ^THIS MAY BE FIXED
BY INSERTING PARENTHESIS AROUND THE LAST ARGUMENT, THUS
.BL1.I5
^^STRUCTURE FOO[I,J]=(BAX(@.FOO,.I,(.J)));\\
.BL1.I-4.F.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.
.BL1
^EX.
.BL1.I5
^^BIND B=PLIT(C INDEXES 4,5,6):
.I5
IF .X EQL C THEN ...\\
FAILS.
.BL1
^HOWEVER,
.BL1.I5
^^IF .X EQL (C) THEN ...\\
.BL1
WORKS.
.BL1.I-4.F.J
7.##^BIND WITHIN BINDS YIELD AN INFINITE LOOP OR ILLEGAL MEMORY REFERENCE
.BL1
^EX.
.BL1.I5
^^BIND A=(BIND FOO=1; FOO+5);\\
.BL1.I-4
8.##^ON RARE OCCASION ^^BLISS\\ WILL LOSE TRACK OF THE REGISTER WHERE
IT HAS STORED THE VALUE OF AN ^O^W^N AND BAD CODE IS GENERATED.
.BL1
^EX:
.BL1.LM10.NF.NJ
^^OWN T;
T=_#123456654321;
.LM7
T<18,6>=0;
T=..T +.(.T+1);\\
.BL1.LM5.I-4.F.J
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.
.BL1.LM5.I-5
10.##^^BLISS\\ WILL NOT ACCEPT A REQUEST FOR A REQUIRE FILE IF ITS NAME
BEGINS WITH A NUMBER.
.BL1
^EX:
.BL1.I5
123.^B^L^I
.BL1.I-5
11.##^A ZERO INDEX ON AN INDIRECT VECTOR ACCESS CAUSES AN ERROR MESSAGE.
.BL1
^EX:
.BL1.LM10.NF.NJ
^^STRUCTURE S[I]=(..S+.I);
LOCAL S X;
X[0]=.X[0] +1;\\
.BL1.LM5.I-5.F.J
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.
.BL1.LM5.I-5.F.J
13.##^ONE CANNOT HAVE SEVERAL MODULES DEFINED IN A FILE.
^ONLY THE FIRST MODULE GETS COMPILED.
.BL1.I-5
14.##^AN ERROR MESSAGE MAY OCCUR IF A CONTROL EXPRESSION INVOLVING ^^VREG\\ IS THE
RIGHT OPERAND OF AN ASSIGNMENT.  ^FOR EXAMPLE,
.BL1.I5
^^A=IF .B THEN .C ELSE .VREG +1\\
.BL1
IS AN ERROR, BUT
.BL1.I5
^^A=(IF .B THEN .C ELSE .VREG+1)\\
.BL1
IS NOT.
.BL1.LM5.I-5.F.J
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".\\
.BL1
^EX:
.BL1.LM10.NF.NJ
_.^^R BLIS10
*A=FILE.BLI
WHERE FILE.BLIS CONTAINS:
.LM12
MODULE SSS(STACK,XREF)=
BEGIN
EXTERNAL A;
#A=12;
END
.LM10
ELUDOM
.BL1.LM5.I-5.F.J
16.##^^MACHOP JUMP\\ INSTRUCTIONS COMPILE INCORRECTLY.
.BL1.I-5
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 ^R^E^L FILE ARE OKAY.
.BL1.I-5
18.##^^BIND\\ TO ^^REGISTER\\ DOES NOT WORK.
.BL1
^EX:
.BL1.LM10.NF.NJ
^^REGISTER A;
BIND B=A;#####%FAILS%
BIND C=(A);###%WORKS%\\
.BL1.LM5.I-5.F.J
19.##^OCCASSIONALLY A ^^BIND\\ TO A POINTER WITH THE INDIRECT BIT SET CAUSES
AN ERROR MESSAGE.
.BL1
^EX:
.BL1.I5
^^BIND A=(300)<0,36,FREG,1>;\\
.BL1.I-5
20.##^A STRUCTURE CONTAINING A COMPOUND EXPRESSION MAY NOT GENERATE CORRECT CODE.
.BL1
^EX:
.BL1.LM10.NF.NJ
^^STRUCTURE XXX[I.J]=
.I5
[1](.I=I+.I;##.J=J+.J);
OWN U,V,X,Y,XXX#Z[2,3];
#.
#.
#.
Z[(IF .X THEN U ELSE V),Y];\\
.BL1.LM5.I-5.F.J
21.##^NEGATIVE REPLICATION COUNTS IN ^^PLIT\\;S MAY CAUSE A VARIETY
OF PROBLEMS SUCH AS:  INFINITE LOOPS, EMPTY ^^PLIT\\ AREAS, AND NONSENSE ^^PLIT\\S.
.BL1
^EX:
.BL1.I5
^^BIND B = PLIT(1,2,3,-2:(4))
.BL1.LM5.I-5.F.J
22.##^A ^^TDZA\\ INSTRUCTION PRECEDED BY A ^^SKIPN\\ CAUSES THE WRONG
VALUE TO BE LOADED INTO THE REGISTER.
.BL1
^EX:#^^EXTERNAL#X,Y,Z;
.BL1.LM9.NF.NJ
ROUTINE#T(S)#=
.LM13
BEGIN
CASE .S OF
SET
.LM17
X#=#(.Y NEQ 0);
X#=#.Z
.LM9
TES;
END;\\
.BL1.LM5.F.J
^THE CODE GENERATED IS INCORRECT CODE.
.BL1.I-5
23.##^MORE THAN EIGHT CONSECUTIVE ASSIGNMENTS CAUSE AN ERROR MESSAGE (THE
LIMIT IS EIGHT) AND AN ^^ILL-MEM-REF\\.
.BL1.I-5
24.##^^BREG\\ IS DECLARED TO BE BOTH ^^LOCAL\\ AND ^^EXTERNAL\\ BY ^^BLISS-10\\.
.PARA.LM0.F.J
4.0##^INSTALLATION ^INSTRUCTIONS
.PARA
^THE ^^BLIS10.EXE\\ AND ^^BL10ER.ERR\\ FILES GO ON ^S^Y^S:.  ^THE FILE
^^BLIS10.DOC\\ GOES ON ^D^O^C:.
.PARA
5.0##^INTERNAL ^CHANGES
.PARA
^THERE ARE TWO MAJOR INTERNAL CHANGES:  NUMEROUS BUGS HAVE BEEN
FIXED AND SEVERAL NEW FEATURES HAVE BEEN ADDED.
.PARA.LM0.F.J
5.1##^NEW ^FEATURES ^ADDED ^SINCE ^VERSION 5^A(124).
.PARA
^THESE ARE AS FOLLOWS:
.BL1.LM5.I-5.F.J
#1.##^^ALLMACHOP#-
.BR
JSYS\\ THE ^^TOPS\\-20 MONITOR INTERFACE COMMAND HAS BEEN
ADDED TO THE ^^ALLMACHOP\\ LIST.  ^ITS VALUE IS OCTAL 104.
.BL1.I-5
#2.##^^EXTERNAL\\#-
.BR
^MULTIPLE DECLARATION OF A NAME AS EXTERNAL IN THE SAME BLOCK IS
NOW ALLOWED.
.BL1.I-5
#3.##^^MACROS\\#-
.BR
^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.
.BL1.I-5
#4.##^^LOWER CASE\\#-
.BR
^LOWER TO UPPER CASE CONVERSION IS DONE FOR IDENTIFIERS.
.BL1.I-5
#5.##^^LINKAGE\\#-
.BR
.LM10.I-5.F.J
(^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:
.BL1.I5
^^LOCAL /LINKX/ /STRUX/ NAME /[...]/ ...
.I5
MAP /LINKX/ /STRUX/ NAME /[...]/ ...\\
.BL1
WHERE BY /.../ IS MEANT AN OPTIONAL ITEM AND BY ^^LINKX\\ IS MEANT A NAME
DECLARED IN A LINKAGE DECLARATION OF THE FORM:
.BL1.I5
^^LINKAGE LINKX=ENTXIT(...,...);
.BL1
^LINKAGE NAMES USED IN THIS WAY ARE NOT INTENDED TO HAVE ANY EFFECT AT PRESENT.
.BL1.I-5
(^B)##^LINKAGE NAMES MAY APPEAR IN FORWARD AND IN ROUTINE DECLARATIONS AS FOLLOWS:
.BL1.I5
^^FORWARD /LINKX/ NAME, ...
.I5
ROUTINE /LINKX/ NAME .....\\
.BL1
^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.
.BL1
^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.
.BL1
^A SAMPLE PROGRAM SHOWING PROPER CODING FOLLOWS:
.BL1.NF.NJ
^^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;
.BL1.F.J
-----WAYIN\\ IS PRESUMABLY A MACRO PROGRAM ASSEMBLED IN HIGH-SEG WITH
THE NAMES ^^WAYI.1, \\ETC., DECLARED ^^"INTERN"\\.
.BL1.LM5
^LINKAGE IS NOT PROVIDED FOR FUNCTIONS OR CO-ROUTINES.
.BL1.LM5.I-5.F.J
#6.##^^PORTAL\\#-
.BR
^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\\".
.BL1
^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.
.BL1
^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 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.
.BL1
^^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.
.BL1.I-5
#7.##^^UPLIT\\#-
.BR
^^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.
.BL1.I-5
#8.##^^OFFSET\\#-
.BR
^^OFFSET(FORMAL#=#-N\\#, FOR THE ^NTH PARAMETER (I.E., ^^FORMAL) TO A ROUTINE.
.BL1
^^OFFSET(LOCAL)#=#+N\\#, WHERE LOCAL IS STORED ^N WORDS DOWN THE STACK.
.BL1
^^OFFSET(LOCAL)\\ IS NOT TREATED INTERNALLY AS A LITERAL AND THEREFORE NOT
ALL USAGES ARE ALLOWED.  ^THE FOLLOWING ARE ALLOWED:
.BL1.NF.NJ
^^PLIT(OFFSET(LOCAL));
PLIT(_#123456_^18+OFFSET(LOCALL));
PLIT(_#123456_^18+OFFSET(LOCAL+DELTA));\\
.BL1
^NOTE:##IF ^X IS A LOCAL OR A ROUTINE FORMAL, THEN
.I5
_.(.^^FREG+OFFSET(X))\\ IS EQUIVALENT TO .^X.
.BL1.LM5.I-5.F.J
#9.##^^NULL SWITCH\\#-
.BR
^^NULL SWITCH\\ FOR MODULE HEAD AND SWITCHES DECLARATION.
.BL1
^ACTION:##NONE.
.BL1.I-5
10.##^^INPUT LINE LENGTH\\#-
.BR
^MAXIMUM INPUT LINE LENGTH IS NOW 145 CHARACTERS (TABS COUNT AS ONE
CHARACTER).
.BL1.I-5
11.##^^COMMAND LIST "_#"\\#-
.BR
^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.
.BL1.I-5
12.##^^CHARACTER "_&"\\#-
.BR
^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.
.BL1
^EXAMPLE:##^^'WAIT_&1'\\ IS EQUIVALENT TO ^^'?WAIT.1'\\.
.BL1.I-5
13.##^^LINK TIME CONSTANTS\\#-
.BR
^LINK TIME CONSTANTS HAVE BEEN EXPANDED.  ^LINK TIME CONSTANTS ARE THE
LEGAL ENTRIES IN A ^^PLIT\\.
.BL1.NF.NJ
^^<LTC>#=#<CTC>
.LM13
<VAR TYP1>
<VAR TYP2>
<VAR TYP1>#+#<CTC>
<CTC> + <VAR TYP1>
<VAR TYP1>#=#<CTC>
.BL1.LM5
<VAR TYP1>#=#<OWN VARIABLE>
.LM13
<GLOBAL VARIABLE>
<EXTERNAL VARIABLE>
<PLIT>
.BL1.LM5
<VAR TYP2> = <ROUTINE>
.LM13
<FORWARD>
<FUNCTION>
<GLOBAL ROUTINE>
.BL1.LM5
<CTC>#=#<COMPILE TIME CONSTANT>\\
.BL1.LM5.I-5.F.J
14.##^^GLOBAL BIND\\#-
.BR
^GLOBAL BINDS MAY BE MADE TO ANY LINK TIME CONSTANT.
.BL1.I-5
15.##^^BLISS-36C SPECIAL FEATURES\\#-
.BR
^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.
.PARA.LM0.F.J
6.0##^SUGGESTIONS
.PARA
^NONE
.PARA
[^END OF ^^BLIS10.DOC]\\