@X @~
~V7 56 2 -5
~D 10
~H                    MUSS
~
~
~D 10
~H             BSC051
~D 10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                            ISSUE 11~
~V9 -1
~P
~V9 1
~YBSC051
~S~M~OBASIC IMPLEMENTATION MANUAL
~S~M~OSection 5
~S~OSection 5 Transput Statement Processing
~S~O1. General Description
~BThis section processes the transput statements.  The interface
procedures in the section are grouped into input, output and file
handling procedures.
~S~O2. Interfaces
~S~O2.1 Section Interfaces Used
~S~O2.2 Section Interface
~
Exported Procedures:~
   TRANS.READ~
   TRANS.MAT.READ~
   TRANS.INPUT~
   TRANS.LINE.INPUT~
   TRANS.MAT.INPUT~
   TRANS.MAT.LINE.INPUT~
   DATA~
   TRANS.RESTORE~
~
Configurations Parameters:~
   DATA.B.Z~
   RESTORE.B.Z~
~S11) DATA.B.Z
~BNumber of elements in DATA.B.
~S12) RESTORE.B.Z
~BNumber of elements in RESTORE.B.
~S~O3. Implementation
~S~O3.1 Outline of Operation
~S11) DATA statement processing
~BDuring a program unit the datum list of each DATA statement is
buffered in DATA.B.  At the end of the program unit an incode
vector 'DATA.DV', is planted containing the datum lists buffered in
DATA.B.  A local variable; DATA.POS; is declared to maintain the current
position within this incode vector.  'DATA.POS' is initialised to
zero in the program prelude, whenever the program unit contains READ
statements.  On a RESTORE statement 'DATA.POS' is reset to zero if
there is no label present, or to the position of the associated datum
list in DATA.DV if this is known, otherwise reset from an incode
vector 'RESTORE.DV'.  The incode vectors are planted in the code
at the end of the program unit.
~S~O3.2 Data Structures
~T# 14
~
DATA.B~IVector of bytes used to buffer datum lists from DATA statements
during the compilation of a program unit.~
~
LAST.B~IIndex into DATA.B of last byte of DATA.B used.~
~
DATA.MN~IMUTL name of 'DATA.DV' (see 3.1 above).  DATA.MN
plus one is the MUTL name of 'DATA.POS'.  A value of zero
indicates no READ or RESTORE statements so far in the current
program unit.~
~
RESTORE.DV.MN~IMUTL name of 'RESTORE.DV' (see 3.1 above).  A
value of zero indicates no RESTORE statements which forward reference
DATA statements encountered so far in the current program unit.~
~
LAST.R~IIndex into 'RESTORE.DV' of last entry used.~
~
RESTORE.B~IBuffer holding information concerning 'RESTORE.DV'.
If a RESTORE statement forward references a DATA statement an
entry is added to RESTORE.B containing the label value.  On
processing a DATA statement if there is an entry in RESTORE.B
its entry is replaced with the index of the associated datum
list in DATA.DV.  Thus at the end of a program unit, providing
all DATA labels referenced are defined, RESTORE.B contains all
the values of RESTORE.DV.~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                BSC051
~V9 -1
~F
//14
@TITLE BSC05(1,11)
@COL 1S-2R-3R-4R-5R-6R-7F
@FLOW 1-2-3-4-5-6-7
@BOX 1.0
TRANSPUT STATEMENT PROCESSING
@BOX 2.0
IMPORTS AND
MODULE HEADING
@BOX 3.0
TYPES
@BOX 4.0
DATA STRUCTURES
@BOX 5.0
INPUT STATEMENT PROCEDURES
TRANS.READ.INPUT [05.1]
DATA [05.7]
TRANS.RESTORE [05.8]
OUTPUT STATEMENT PROCEDURES
TRANS.PRINT.WRITE [05.10]
TRANS.SET [05.13]
TRANS.IMAGE [05.14]
FILE STATEMENT PROCEDURES
TRANS.OPEN [05.20]
CLOSE [05.21]
ASK [05.22]
ERASE [05.23]
FILE POINTER MANIPULATION STATEMENTS
RESET [05.30]
COMMON PROCESSING PROCEDURES
IO.REC [05.46]
@BOX 6.0
INITIALISATION CODE
@BOX 7.0
END
@BOX 1.1
::TRANSPUT SECTION
@BOX 2.1
#BSC05/1
MODULE (TRANS.READ.INPUT,TRANS.SET,TRANS.IMAGE,
DATA.B,RESTORE.B,TRANS.PRINT.WRITE,TRANS.OPEN, CLOSE, ASK,
ERASE, RESET, LAST.R,  OPEN.ID.MN,
DATA,TRANS.RESTORE,DATA.MN,LAST.B,RESTORE.DV.MN);
@BOX 3.1
@BOX 4.1
*GLOBAL 5;
$LI/ADDR[$LO8] NIL =;
$IN OPEN.ID.MN, PU.STATS;
$IN LAST.B,DATA.MN,RESTORE.DV.MN,LAST.R;
$LO8[DATA.B.Z] DATA.B;
$LO16[RESTORE.B.Z] RESTORE.B;
*GLOBAL 6;
DATAVEC MAT.TY($LO8)
%40 %48 %50 %10 %18 %C0
END;
DATAVEC BIO.PRINT($LO8)
18 19 20 21 22
23 24 25 26 27 28
END;
DATAVEC BIO.IN($LO8)
31 32 33 34 35 36
37 38 39 40 41 42
END;
@BOX 5.1
PSPEC TRANS.READ.INPUT($IN);
PSPEC DATA();
PSPEC TRANS.RESTORE();
PSPEC TRANS.PRINT.WRITE($IN);
PSPEC TRANS.SET();
PSPEC TRANS.IMAGE();
PSPEC TRANS.OPEN ();
PSPEC CLOSE();
PSPEC ASK();
PSPEC ERASE();
PSPEC RESET();
PSPEC IO.REC();
*GLOBAL 0;
#BSC05.1
#BSC05.7
#BSC05.8
#BSC05.10
#BSC05.13
#BSC05.14
#BSC05.20
#BSC05.21
#BSC05.22
#BSC05.23
#BSC05.30
#BSC05.46
@BOX 6.1
@BOX 7.1
*END
@END
//16
@TITLE BSC05/1(1,11)
@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
EXTERNAL ENVIRONMENT
@BOX 2.0
TYPES
@BOX 3.0
LITERALS AND DATA STRUCTURES
@BOX 4.0
PROCEDURES
@BOX 1.1
::IMPORTS
@BOX 2.1
TYPE ITYPE IS $LO8 TAG,ST $LO16 IND;
TYPE NLIST.ENT IS $LO16 BASICN,HASH,MUTLN,DETAIL,DETAIL1 $LO8 K,T;
@BOX 3.1
$IM $LI $LO8 BIO.READ.FN, BIO.END.READ.FN, BIO.MARGIN.FN,
            BIO.ZONE.FN, BIO.OPEN.FN;
$IM $LI TLO8, TADPROC, TSTR, TCONST, T.UNQ.STRING, TSTRING;
$IN AP;
$IM $LI ZERO, NIL.STRING, KMAT, KVEC, BADDR;
$IM $LI $LO16 ONE;
$IM $LI LBUFF.Z, AS.Z, STR.LIST.Z, CON.STK.Z, ARRAYS.Z;
ITYPE [LBUFF.Z] LBUFF;
$IN BINT, LAST.MN, IPTR, LAB.MN, A.AP;
$LO8[STR.LIST.Z] STR.LIST;
$LO8[32] TL.TYP;
ITYPE D.MISSING,D.TO,D.EXIT,D.DO,D.FOR,D.THERE,D.TAB,
      D.BEGIN, D.END, D.NEXT, D.SAME, D.IF,
      COMMA,COLON,LB,RB,QUESTION.MARK,HASH.D,D.SKIP,D.REST,
     D.SEQUENTIAL, D.STREAM, D.INPUT, D.OUTPUT, D.OUTIN, D.DISPLAY,
      D.INTERNAL, D.VARIABLE, D.LENGTH, D.CAPABILITY, D.COLLATE,
      D.DATUM, D.KEY, D.POINTER, D.RECORD,
      D.MARGIN,D.ZONEWIDTH,D.NAME,EOS,S.COLON,
     D.ACCESS,D.ORGANIZATION,D.REC.TYPE,D.REC.SIZE;
$IM LITERAL DATA.B.Z,RESTORE.B.Z,NLISTZ,CH.T.Z,CH.LIST.Z;
$LO8[CH.T.Z] CH.T;
ADDR[$LO8] IMAGE.STR;
$IN STAT.LAB, IMAGE.POS, DEF.BASE;
NLIST.ENT[NLISTZ] NLIST;
$IN16[AS.Z] AS;
$LO16 G.LIT.16.0;
$LO32 G.LIT.32.0;
$IN[CON.STK.Z] CON.STK;
$IN[ARRAYS.Z] ARRAYS;
@BOX 4.1
$PS PL.STK.LB ($IN);
$PS MONITOR($IN);
$LS BIO.ENC.FORMAT (ADDR [$LO8], ADDR [$LO8]) / $IN;
$PS MONITOR.N($IN, $IN);
$PS MONITOR.S($IN,ADDR[$LO8]);
$PS PL.CD.SEQ(ADDR[$LO16]);
$PS GET.LAB () / $LO32;
$PS LAB ($LO32,$IN) / $LO16;
$PS IN.EXPR ($IN) / $IN;
$PS EXPR($IN, $IN)/ $IN;
$PS MONITOR.P($IN, $IN);
$PS CODE.EXPR ($IN,$IN) / $IN;
$PS CODE.NODE ($IN, $IN);
$PS GET.N(ITYPE)/$IN;
$PS SET.A.TYPE($IN);
$PS CODE.STR.EXPR($IN,$IN);
$PS SRCH.CON.STK($IN)/$IN;
@END
//17 27.JUL.83
@TITLE BSC05.1(1,11)
@COL 15R-16R
@COL 1S-2R-3T-4R-5R-6R-7T-8T-9R-10T-11R-12T-13R-14F
@COL 17R-18T-19R-20R
@ROW 15-9-17
@ROW 16-11
@ROW 13-18
@FLOW 1-2-3N-4-5-6-7N-8N-9-10N-11-12N-13-14
@FLOW 3Y-5
@FLOW 7Y-17-10Y-16-12Y-18N-19-20-14
@FLOW 18Y-20
@FLOW 8Y-15-9
@BOX 1.0
TRANS.READ.INPUT(STAT)
STAT INTERPRETED AS FOLLOWS
  0  READ
  2  MAT READ
  4  INPUT
  6  LINE INPUT
  8  MAT INPUT
 10  MAT LINE INPUT
PROCESS INPUT AND READ
STATEMENTS
@BOX 2.0
VECTOR OF STATEMENT ATTRIBUTES
[05.1.1]
@BOX 3.0
NEXT ITEM NOT #
@BOX 4.0
READ CHANNEL EXPRESSION[BSC07]
@BOX 5.0
SELECT STATEMENT ATTRIBUTES
@BOX 6.0
PROCESS INPUT CONTROLS [05.1.2]
@BOX 7.0
INPUT FROM CHANNEL
@BOX 8.0
'DATA' VARIABLES NOT DECLARED?
@BOX 9.0
PLANT CALL TO BIO.READ
@BOX 10.0
MAT STATEMENT?
@BOX 11.0
PROCESS INPUT LIST [05.1.3]
@BOX 12.0
INPUT FROM CHANNEL?
@BOX 13.0
PLANT CALL TO BIO END READ
@BOX 14.0
END
@BOX 15.0
DECLARE 'DATA' VARIABLES
@BOX 16.0
PROCESS REDIM ARRAY LIST [05.1.4]
@BOX 17.0
CODE CHANNEL PARAMETER
PLANT CALL TO BIO INPUT
@BOX 18.0
ELAPSED NOT SPECIFIED AS
INPUT CONTROL
@BOX 19.0
PLANT CALL TO BIO ELAPSED
@BOX 20.0
PLANT CALL TO BIO END INPUT
@BOX 1.1
PROC TRANS.READ.INPUT(STAT);
$IN CH.AP, ELAPSED.AP,TIME.AP,PROMPT.AP,
  TYP,N,J,L.CNT,IN,T, S.BITS, I, MN, M, OPC;
$LO16 CNTRL,STATUS,MAT.STATUS,A;
$LO8 S,TG,K,KA;
$IN W0, VZ, VK, PK;
$IN[4] BNDS;
$IN ST;
0 => ELAPSED.AP => PROMPT.AP => CH.AP;
@BOX 2.1
#BSC05.1.1
@BOX 3.1
IF LBUFF[1+IPTR] /= HASH.D
@BOX 4.1
1 +> IPTR;
IN.EXPR(5) => CH.AP;
1 +> STAT;
@BOX 5.1
STAT.ATT[STAT] => A;
@BOX 6.1
#BSC05.1.2
@BOX 7.1
IF A & %40 = 0
@BOX 8.1
IF DATA.MN = 0
@BOX 9.1
BEGIN
DATAVEC SEQ($LO16)
%48 %C000
%46 %83
%21 %8000
%41 %3000
%46 %84
%22 %8001
%41 %3000
%22 %8003
%41 %3000
%42 %0
END
PL.CD.SEQ(^SEQ);
END
@BOX 10.1
IF A & %200 /= 0
@BOX 11.1
#BSC05.1.3
@BOX 12.1
IF A & %40 = 0
@BOX 13.1
BEGIN
DATAVEC SEQ($LO16)
%48 %C001
%A000
%20 %8001
END
PL.CD.SEQ(^SEQ);
SET.A.TYPE(%209);
END
@BOX 14.1
END
@BOX 15.1
TL.S.DECL(NIL,%80,-1);
TL.S.DECL(%"DATA.POS", %84, 0);
1+>LAST.MN => DATA.MN + 1 => LAST.MN;
@BOX 16.1
#BSC05.1.4
@BOX 17.1
IF CH.AP /= 0 THEN
   CODE.EXPR(CH.AP, %9);
ELSE
   SET.A.TYPE(%9);
   TL.PL(%22, ZERO);
FI
DATAVEC SEQ($LO16)
%48 %C002
%41 %3000
%46 %84
%22 %8003
%41 %3000
END
IF STAT = 1  OR STAT=3 THEN
   %200 !> STATUS;
FI
STATUS => G.LIT.16.0;
PL.CD.SEQ(^SEQ);
IF PROMPT.AP = 0 THEN
   SET.A.TYPE(%C18);
   TL.PL(%22, NIL.STRING);
ELSE
   CODE.STR.EXPR(PROMPT.AP,0);
FI
TL.PL(%41, %3000);
IF STATUS & %20 = 0 THEN
   SET.A.TYPE(%A);
   TL.PL(%22, ZERO);
ELSE
   CODE.EXPR(TIME.AP, %A);
FI
TL.PL (%41, %3000);
TL.PL(%42,0);
@BOX 18.1
IF ELAPSED.AP = 0
@BOX 19.1
BEGIN
DATAVEC SEQ($LO16)
%1003
%A000
END
PL.CD.SEQ(^SEQ);
END
SET.A.TYPE(%20A);
SET.A.TYPE( AS[ELAPSED.AP] ->> 11 ! %100);
CODE.NODE(19, ELAPSED.AP);
@BOX 20.1
BEGIN
DATAVEC SEQ($LO16)
%1055
%A000
END
PL.CD.SEQ(^SEQ);
END
@END
///16
@TITLE BSC05.1.1(1,11)
@COL 1S
@BOX 1.0
VECTOR OF READ/INPUT STATEMENT ATTRIBUTES
VECTOR INDEXED BY STATEMENT KIND ENCODES AS
 0  -  READ
 1  -  READ from channel
 2  -  MAT READ
 3  -  MAT READ from channel
 4  -  INPUT
 5  -  INPUT from channel
 6  -  LINE INPUT
 7  -  LINE INPUT from channel
 8  -  MAT INPUT
 9  -  MAT INPUT from channel
10  -  MAT LINE INPUT
11  -  MAT LINE INPUT from channel
ELEMENTS OF THE VECTOR ARE ENCODED AS FOLLOWS
Bits 0-5  Permiited input controls
     %1   IF MISSING recovery specifier allowed
     %2   PROMPT specifier allowed
     %4   TIMEOUT specifier allowed
     %8   ELAPSED specifier allowed
     %20  Record setter specifier allowed.
Bit 6 = 1 Input from 'DATA'
Bit 7 = 1 SKIP REST allowed
Bit 8 = 1 Statement has variable list
Bit 9 = 1 Statement has redim-array list
Bit 10= 1 LINE statement all items in list must be strings
Bit 11= 1 Variable length vectors permitted in redim-array list
Bit 12= 1 MAT LINE INPUT
Bit 15= 1 Statement has explicit channel specifier
@BOX 1.1
DATAVEC STAT.ATT($LO16)
%0141  ::READ WITHOUT CHANNEL SPECIFIER
%81A1  ::WITH CHANNEL SPECIFIER
%0241  ::MAT READ
%8221
%010E  ::INPUT
%81AF
%040E  ::LINE INPUT
%842F
%0A0E  ::MAT INPUT
%8A2F
%160E  ::MAT LINE INPUT
%962F
END
@END
//17 22.JUL.83
@TITLE BSC05.1.2(1,11)
@COL 13R-14R-15R
@COL 1S-2R-3T-4T-5T-6T-7T-8R-9N-10T-11T-12F
@ROW 13-7
@ROW 15-12
@FLOW 1-2-3N-4N-5N-6N-7N-8-4Y-9-10N-11N-12
@FLOW 3Y-5Y-9
@FLOW 6Y-13
@FLOW 7Y-14
@FLOW 10Y-12
@FLOW 11Y-15
@BOX 1.0
INPUT CONTROLS
@BOX 2.0
RESET CONTROLS PRESENT
@BOX 3.0
COMMA NOT REQUIRED?
@BOX 4.0
NEXT ITEM NOT COMMA?
@BOX 5.0
NEXT ITEM NOT START OF INPUT CONTROL
SPECIFIER
@BOX 6.0
SPECIFIER ALREADY SEEN?
@BOX 7.0
SPECIFIER NOT ALLOWED
@BOX 8.0
PROCESS INPUT CONTROL SPECIFIER
[BSC05.1.2.1]
@BOX 10.0
INPUT CONTROL COLON NOT REQUIRED?
@BOX 11.0
NEXT ITEM NOT COLON?
@BOX 12.0
END
@BOX 13.0
FAULT
@BOX 14.0
FAULT
@BOX 15.0
SYNTAX FAULT
@BOX 1.1
::INPUT CONTROLS
@BOX 2.1
IF A & %1000 /= 0 THEN
   %40 => STATUS;
ELSE
   %0  => STATUS;
FI
0 => CNTRL;
@BOX 3.1
IF A & %8000 = 0
@BOX 4.1
IF LBUFF[1+>IPTR] /= COMMA
@BOX 5.1
IF TAG OF LBUFF[1+>IPTR] => TG<4
   OR TG>5
   OR ST OF LBUFF[IPTR] => ST & %80 = 0
@BOX 6.1
IF ST & %F => S > 4 THEN
   5 => S;
FI
IF 1 <<- S => S.BITS & CNTRL /= 0
@BOX 7.1
IF A & S.BITS = 0
@BOX 8.1
S.BITS !> CNTRL;
#BSC05.1.2.1
@BOX 10.1
1-> IPTR;
IF A & %8000 = 0 AND CNTRL = 0
@BOX 11.1
IF LBUFF[1+>IPTR] /= COLON
@BOX 12.1
::END
@BOX 13.1
MONITOR (%1033);
@BOX 14.1
MONITOR (%1034);
@BOX 15.1
MONITOR (%1000);
@END
///17 22.JUL.83
@TITLE BSC05.1.2.1(1,11)
@COL 14C-15R-16C-17R
@COL 1S-2R-3C-4T-8R-9R-10C-11R-12R-13F
@COL 21R-22C-23R-24R
@ROW 14-3
@ROW 9-21
@ROW 16-10-22
@FLOW 1-2
@FLOW 3-4N-8-9-13
@FLOW 4Y-21
@FLOW 14-15-13
@FLOW 16-17-13
@FLOW 10-11-12-13
@FLOW 22-23-24-13
@BOX 1.0
INPUT CONTROL SPECIFIER
@BOX 2.0
SWITCH ON SPECIFIER KIND
@BOX 3.0
IF MISSING SPECIFIER
@BOX 4.0
NEXT ITEM NOT 'MISSING'?
@BOX 8.0
PROCESS I.O RECOVERY
[05.46]
@BOX 9.0
UPDATE SPECIFIER STATUS
@BOX 10.0
TIMEOUT
SPECIFIER
@BOX 11.0
PROCESS NUMERIC EXPR
@BOX 12.0
UPDATE SPECIFIER STATUS
@BOX 13.0
END
@BOX 14.0
RECORD SETTER
SPECIFIER
@BOX 15.0
UPDATE SPECIFIER STATUS
@BOX 16.0
PROMPT
@BOX 17.0
PROCESS STRING EXPRESSION
@BOX 21.0
SYNTAX FAULT
@BOX 22.0
ELAPSED SPECIFIER
@BOX 23.0
PROCESS NUMERIC VARIABLE
@BOX 24.0
UPDATE SPECIFIER STATUS
@BOX 1.1
::INPUT CONTROL SPECIFIER
@BOX 2.1
SWITCH S\B3,B16,B10,B22,B14,B14;
@BOX 3.1
B3:;
@BOX 4.1
IF LBUFF[1+>IPTR] /= D.MISSING
@BOX 8.1
IO.REC();
@BOX 9.1
1 !> STATUS;
@BOX 10.1
B10:;
@BOX 11.1
IN.EXPR (%5) => TIME.AP;
@BOX 12.1
%20 !>STATUS;
@BOX 13.1
::END
@BOX 14.1
B14:;
@BOX 15.1
DATAVEC RS($LO16)
%8 %10 %80 %100
END
RS[ST & %F -5] !> STATUS;
@BOX 16.1
B16:;
@BOX 17.1
IN.EXPR(%6) => PROMPT.AP;
@BOX 21.1
MONITOR (%1000);
@BOX 22.1
B22:;
@BOX 23.1
IN.EXPR (%15) => ELAPSED.AP;
@BOX 24.1
%2 !> STATUS;
@END
///16 21.JUL.83
@TITLE BSC05.1.3(1,11)
@COL 1S-10T-11T-12R-2R-4T-5R-6T-13R-7F
@COL 9R
@ROW 5-9
@FLOW 1-10Y-2-4N-5-6N-13-7
@FLOW 4Y-9-6
@FLOW 6Y-10N-11Y-2
@FLOW 11Y-12-7
@BOX 1.0
INPUT VARIABLE LIST
@BOX 2.0
DETERMINE KIND OF EXPRESSION
PERMITTED
RECOGNISE A SINGLE OPERAND EXPRESSION[07]
@BOX 4.0
LINE INPUT OR STRING VARIABLE
@BOX 5.0
SELECT AND PLANT CALL TO APPR
BIO INPUT/READ PROC
@BOX 6.0
NEXT ITEM COMMA?
@BOX 7.0
END
@BOX 9.0
IF ARRAY ELEMENT SET WRITE ACCESS IN PROPERTIES
PLANT CALL TO BIOINSTR
OR BIOLINEINSTR
@BOX 10.0
SKIP REST NOT ALLOWED
@BOX 11.0
NEXT 2 SYMBOLS NOT
SKIP REST
@BOX 12.0
PLANT CALL TO BIO.SKIP.REST
@BOX 13.0
ADJUST IPTR
@BOX 1.1
::INPUT VARIABLE LIST
DATAVEC VAR.TY($LO8)
%48 %50 %10 %18
END
@BOX 2.1
%14 => T;
IF STAT & %1E = 6 THEN
   %16 => T;
FI
IN.EXPR (T) => AP;
@BOX 4.1
IF AS[AP] ->> 8 & %F8 => W0 = %C0
@BOX 5.1
W0 & %C0 => VK;
W0 & %38 => VZ;
-1 => T;
WHILE VAR.TY[1 +> T] => PK & %C0 /= VK
      OR PK & %38 < VZ DO OD
PL.STK.LB(BIO.IN[T]);
TL.PL(%42,0);
SET.A.TYPE(PK ->> 3);
IF W0 /= PK THEN
   SET.A.TYPE(W0 ->> 3 ! %100);
FI
CODE.NODE (19, AP);
@BOX 6.1
IF LBUFF[1+>IPTR] = COMMA
@BOX 7.1
::END
@BOX 9.1
IF AS[AP] & %8F = %82 THEN
   8 !> DETAIL1 OF NLIST[AS[AP+2]];
FI
35 => T;
IF STAT & %FE = 6 THEN
   36 => T;
FI
PL.STK.LB(T);
CODE.STR.EXPR(AP,0);
TL.PL(%41, %3000);
TL.PL(%42, 0);
@BOX 10.1
IF A & %80 = 0
@BOX 11.1
IF LBUFF[1+IPTR] /= D.SKIP OR
   LBUFF[2+IPTR] /= D.REST
@BOX 12.1
2 +> IPTR;
BEGIN
DATAVEC SEQ($LO16)
%48 %C004
%42 %0
END
PL.CD.SEQ(^SEQ);
END
@BOX 13.1
1-> IPTR;
@END
//16 21.JUL.83
@TITLE BSC05.1.4(1,11)
@COL 26R-18R-19R-20T-27T-21T-22T-23R-31R-28R-25R
@COL 1S-2R-3R-4R-5T-6T-7T-8T-9R-10T-11R-12T-29T-13R-14R-15T-16T-30R-17F
@ROW 26-6
@ROW 20-9
@FLOW 1-2-3-4-5N-6N-7N-8N-9-10N-11-12N-29N-13-14-15N-16N-30-17
@FLOW 5Y-26
@FLOW 6Y-18
@FLOW 7Y-14
@FLOW 8Y-20N-27N-21N-22N-23-14
@FLOW 20Y-25
@FLOW 21Y-19
@FLOW 22Y-19
@FLOW 10Y-12Y-19
@FLOW 15Y-17
@FLOW 16Y-4
@FLOW 27Y-28
@FLOW 29Y-31
@BOX 1.0
REDIM-ARRAY LIST
@BOX 2.0
SUB PROCEDURE
REDIM ARRAY BOUND [05.1.4.1]
@BOX 3.0
INIT LIST COUNT
@BOX 4.0
GET IDENTIFIER NAME
[BSC03]
NOTE MUTL NAME OF ARRAY AND
WHETHER DEREFERENCE IS REQUIRED
SET WRITE ACCESS IN PROPERTIES
@BOX 5.0
INCR LIST COUNT
ITEM NOT AN ARRAY
@BOX 6.0
LINE INPUT AND ARRAY TYPE
NOT STRING
@BOX 7.0
NEXT ITEM NOT (
@BOX 8.0
NEXT ITEM '?'
@BOX 9.0
PROCESS BOUND [05.1.4.1]
@BOX 10.0
NEXT ITEM NOT ,
@BOX 11.0
PROCESS BOUND [05.1.4.1]
@BOX 12.0
NEXT ITEM NOT )
@BOX 13.0
PLANT CALL TO BIO.REDIM1/2
@BOX 14.0
PLANT CALL TO
MAT INPUT PROCEDURE
@BOX 15.0
VARIABLE LENGTH VECTOR
JUST PROCESSED?
@BOX 16.0
NEXT ITEM ,
@BOX 17.0
END
@BOX 18.0
FAULT
@BOX 19.0
SYNTAX FAULT
@BOX 20.0
VARIABLE LENGTH VECTORS
ALLOWED?
@BOX 21.0
NOT FIRST ITEM IN LIST?
@BOX 22.0
NEXT ITEM NOT )
@BOX 23.0
SET STATUS
@BOX 25.0
FAULT
@BOX 26.0
FAULT
@BOX 27.0
ARRAY NOT A VECTOR
@BOX 28.0
FAULT
@BOX 29.0
NO. OF DIMENSIONS INCORRECT?
@BOX 30.0
DECR IPTR
@BOX 31.0
FAULT
@BOX 1.1
::REDIM-ARRAY LIST
@BOX 2.1
PSPEC REDIM.BOUND();
#BSC05.1.4.1
@BOX 3.1
0 => L.CNT;
@BOX 4.1
IF GET.N(LBUFF[1 +> IPTR]) => IN < 0 THEN
   0 -:> IN;
FI
0 => MAT.STATUS;
DETAIL1 OF NLIST[IN] ->> 5 & 1 + %21 => OPC;
MUTLN OF NLIST[IN] => MN;
8 !> DETAIL1 OF NLIST[IN];
@BOX 5.1
1 +> L.CNT;
IF K OF NLIST[IN] => K/= KVEC /= KMAT
@BOX 6.1
IF A & %400 /= 0 AND T OF NLIST[IN] /= %C0
@BOX 7.1
IF LBUFF[1+IPTR] /= LB
@BOX 8.1
IF LBUFF[1+>IPTR + 1] = QUESTION.MARK
@BOX 9.1
KVEC => KA;
0 => N;
REDIM.BOUND();
@BOX 10.1
IF LBUFF[1+IPTR] /= COMMA
@BOX 11.1
1 +> IPTR;
2 => N;
KMAT => KA;
REDIM.BOUND();
@BOX 12.1
IF LBUFF[1+>IPTR] /= RB
@BOX 13.1
PL.STK.LB(120 + K);
SET.A.TYPE(%C00 ! BADDR);
TL.PL(OPC, MN + 1);
TL.PL(%41, %3000);
SET.A.TYPE(T OF NLIST[IN] ->> 3 ! %C00);
TL.PL(OPC, MN);
TL.PL(%45, TL.TYP[BADDR] ! %4000);
TL.PL(%41, %3000);
SET.A.TYPE(BADDR ! %200);
FOR M < 2 + N DO
   IF BNDS[M] /= 0 THEN
      CODE.EXPR(BNDS[M], BADDR);
      -1 => A.AP;
      ELSE
      SET.A.TYPE(B.ADDR);
      TL.CLIT.16(%44, DEF.BASE);
      TL.PL(%22, 0);
   FI
   TL.PL(%41, %3000);
OD
TL.PL(%42, 0);
@BOX 14.1
-1 => I;
WHILE MAT.TY[1+>I] /= T OF NLIST[IN] DO OD
PL.STK.LB(BIO.IN[I + 6]);
SET.A.TYPE(T OF NLIST[IN] ->> 3 ! %C00);
TL.PL(OPC, MN);
TL.PL(%41, %3000);
SET.A.TYPE(%C00 ! BADDR);
TL.PL(OPC, MN + 1);
TL.PL(%41, %3000);
IF T OF NLIST[IN] & %F8 = %C0 THEN
   SET.A.TYPE(9);
   IF OPC = %21 THEN
      TL.CLIT.16(%44, ARRAYS[DETAIL OF NLIST[IN] -1]);
      0 => MN;
   ELSE
      1 -> MN;
   FI
   TL.PL(%22, MN);
   TL.PL(%41, %3000);
FI
SET.A.TYPE(9);
TL.CLIT.16(%44, MAT.STATUS ! K);
TL.PL(%22, 0);
TL.PL(%41, %3000);
TL.PL(%42, 0);
@BOX 15.1
IF MAT.STATUS & 4 /= 0
@BOX 16.1
IF LBUFF[1+>IPTR] = COMMA
@BOX 17.1
::END
@BOX 18.1
MONITOR( %1035);
@BOX 19.1
MONITOR( %1000);
@BOX 20.1
1 +> IPTR;
IF A & %800 = 0
@BOX 21.1
IF L.CNT /= 1
@BOX 22.1
IF LBUFF[1+>IPTR] /= RB
@BOX 23.1
4 => MAT.STATUS;
@BOX 25.1
MONITOR (%1036);
@BOX 26.1
MONITOR(%1032);
@BOX 27.1
IF K /= KVEC
@BOX 28.1
MONITOR (%1038);
@BOX 29.1
IF K /= KA
@BOX 30.1
1 -> IPTR;
@BOX 31.1
MONITOR.N(%1037, IN);
@END
//15
@TITLE BSC05.1.4.1(1,11)
@COL 1S-2R-3T-4R-5R-6R-7F
@COL 8R
@ROW 4-8
@FLOW 1-2-3N-4-5-6-7
@FLOW 3Y-8-6
@BOX 1.0
REDIM BOUND
@BOX 2.0
RECOGNISE NUMERIC EXPRESSION
@BOX 3.0
NEXT ITEM NOT 'TO'
@BOX 4.0
SAVE EXPR PTR AS LOWER BOUND
@BOX 5.0
RECOGNISE NUMERIC EXPRESSION
@BOX 6.0
SAVE EXPR PTR AS UPPER BOUND
@BOX 7.0
END
@BOX 8.0
NOTE NO LOWER BOUND
@BOX 1.1
PROC REDIM.BOUND;
$IN AP;
@BOX 2.1
IN.EXPR(5) => AP;
@BOX 3.1
IF LBUFF[1+IPTR] /= D.TO
@BOX 4.1
1 +> IPTR;
AP => BNDS[N];
@BOX 5.1
IN.EXPR(5) => AP;
@BOX 6.1
AP => BNDS[N+1];
@BOX 7.1
END
@BOX 8.1
0 => BNDS[N];
@END
///8
@TITLE BSC05.7(1,11)
@COL 1S-2R-3R-4T-5T-6R-7R-8R-9T-10T-11R-12R-13F
@COL 14R-15R
@ROW 6-14
@ROW 11-15
@FLOW 1-2-3-4N-5N-6-7-8-9N-10N-11-4Y-14-9Y-12-13
@FLOW 5Y-15
@FLOW 10Y-15
@BOX 1.0
PROCESS DATA STATEMENT
@BOX 2.0
SUB PROCEDURES
PUT.DATA.CH [05.7.1]
@BOX 3.0
UPDATE LABEL PROPERTIES WITH
POSITION IN BUFFER OF DATA [08]
@BOX 4.0
NEXT ITEM AN UNQUOTED STRING
CONSTANT
@BOX 5.0
NOT A QUOTED STRING CONSTANT
@BOX 6.0
PUT " IN DATA BUFFER
@BOX 7.0
COPY QUOTED STRING TO BUFFER
REPLACING " BY ""
@BOX 8.0
PUT " IN BUFFER
@BOX 9.0
NEXT SYM EOS
@BOX 10.0
NEXT SYM /= ,
@BOX 11.0
PUT , IN DATA BUFFER
@BOX 12.0
PUT NL IN BUFFER
@BOX 13.0
END
@BOX 14.0
COPY UNQUOTED STRING
TO DATA BUFFER
@BOX 15.0
FAULT
@BOX 1.1
PROC DATA;
$LO8 TG, CH;
$IN I;
ITYPE ITEM;
@BOX 2.1
PSPEC PUT.DATA.CH($LO8);
#BSC05.7.1
@BOX 3.1
LAB(STAT.LAB, 5);
@BOX 4.1
IND OF LBUFF[1 +> IPTR] => I;
IF TAG OF LBUFF[IPTR] => TG = T.UNQ.STRING
@BOX 5.1
IF TG /= TSTRING
@BOX 6.1
PUT.DATA.CH('");
@BOX 7.1
WHILE STR.LIST[I] => CH /= 0 DO
   IF CH = '" THEN
      PUT.DATA.CH(CH);
   FI
   PUT.DATA.CH(CH);
   1 +> I;
OD
@BOX 8.1
PUT.DATA.CH('");
@BOX 9.1
IF LBUFF[1 + IPTR] => ITEM = EOS
@BOX 10.1
IF ITEM /= COMMA
@BOX 11.1
1 +> IPTR;
PUT.DATA.CH(',);
@BOX 12.1
PUT.DATA.CH('$L);
@BOX 13.1
END
@BOX 14.1
WHILE STR.LIST[I] => CH /= 0 DO
   PUT.DATA.CH(CH);
   1 +> I;
OD
@BOX 15.1
MONITOR(%1000);
@END
///1
@TITLE BSC05.7.1(1,11)
@COL 1S-2T-3R-4R-5R-6F
@FLOW 1-2N-3-4-5-6
@FLOW 2Y-5
@BOX 1.0
PUT.DATA.CH(CHAR)
@BOX 2.0
BUFFER NOT FULL?
@BOX 3.0
FAULT
@BOX 4.0
RESET BUFFER INDEX
@BOX 5.0
PUT CH IN BUFFER
@BOX 6.0
END
@BOX 1.1
PROC PUT.DATA.CH(CH);
@BOX 2.1
IF 1 +> LAST.B < DATA.B.Z
@BOX 3.1
MONITOR.S(%F, %"DATA BUFFER");
@BOX 4.1
0 => LASTB;
@BOX 5.1
CH => DATA.B[LASTB];
@BOX 6.1
END
@END
//17 22.JUL.83
@TITLE BSC05.8(1,11)
@COL 1S-2T-3R-6T-7R-8R-9T-11T-12R-14R-4R-5F
@COL 15R-16R
@ROW 7-15
@ROW 11-16
@FLOW 1-2N-3-6N-7-8-9N-11N-12-14-4-5
@FLOW 2Y-6Y-15-4
@FLOW 9Y-16-4
@FLOW 11Y-14
@BOX 1.0
TRANS RESTORE
@BOX 2.0
DATA BUFFER VARIABLES ALLOCATED?
@BOX 3.0
DECLARE DATABUFFER VECTOR
AND POSITION VARIABLE
@BOX 4.0
PLANT CODE TO RESET DATA
POSITION VARIABLE
@BOX 5.0
END
@BOX 6.0
NEXT ITEM NOT A POSSIBLE LABEL
@BOX 7.0
GET LABEL
@BOX 8.0
PROCESS DATA STATEMENT LABEL
REFERENCE [08]
@BOX 9.0
LABEL DEFINED?
@BOX 11.0
RESTORE DATAVEC ALREADY DECLARED?
@BOX 12.0
DECLARE RESTORE DATAVECTOR
@BOX 14.0
PLANT
   B = RESTORE DATAVECTOR INDEX
   D = REF RESTORE DATAVECTOR
   SEL EL
SET RESTORE OPERAND TO D[]
@BOX 15.0
SET RESTORE OPERAND TO ZERO
@BOX 16.0
SET RESTORE OPERAND TO CURRENT
LITERAL VALUE CONTAINING INDEX
OF DATA IN BUFFER
@BOX 1.1
PROC TRANS.RESTORE;
$IN OPD;
$LO16 L;
@BOX 2.1
IF DATA.MN /= 0
@BOX 3.1
TL.SDECL (NIL, TLO8, -1);
TL.SDECL (%"DATA.POS", %84, 0);
LASTMN + 1 => DATA.MN + 1 => LAST.MN;
@BOX 4.1
SET.A.TYPE(%11);
TL.PL (%22, OPD);
TL.PL (%20, DATA.MN + 1);
@BOX 5.1
END
@BOX 6.1
IF TAG OF LBUFF[1+IPTR] /= TCONST
    OR ST OF LBUFF[1+IPTR] & %C7 /= %40
@BOX 7.1
GET.LAB() => L;
@BOX 8.1
LAB(L,4) => OPD;
@BOX 9.1
IF OPD & %8000 = 0
@BOX 11.1
IF RESTORE.DV.MN /= 0
@BOX 12.1
TL.SDECL(NIL, %84, -1);
1+>LAST.MN => RESTORE.DV.MN;
@BOX 14.1
TL.CLIT16(%84,OPD & %7FFF);
TL.PL(%02,0);
TL.PL(%61,RESTORE.DV.MN);
TL.PL(%64,0);
%1004 => OPD;
@BOX 15.1
ZERO => OPD;
@BOX 16.1
TL.CLIT.16(%44,OPD);
0 => OPD;
@END
//17 22.JUL.83
@TITLE BSC05.10(1,11)
@COL 1S-2R-3R-4T-5R-6R-7R-8R-9T-10T-20R-11R-13R-14F
@COL 21R-15T-16R-17T-18T-19T-22R
@ROW 5-21
@ROW 8-16
@ROW 10-17
@FLOW 1-2-3-4N-5-6-7-8-9N-10N-20-11-13-14
@FLOW 4Y-21-15N-16
@FLOW 15Y-6
@FLOW 9Y-17N-18N-19N-22-13
@FLOW 17Y-11
@FLOW 18Y-16
@FLOW 10Y-17
@FLOW 19Y-13
@BOX 1.0
TRANS.PRINT.WRITE(STAT)
PROCESSES PRINT AND WRITE STATEMENTS
STAT INTERPRETED AS FOLLOWS
 0 PRINT
 2 MAT PRINT
 7 WRITE
 8 MAT WRITE
@BOX 2.0
SUBPROCEDURES FOR PROCESSING PRINT LISTS
EXPR.ITEM[05.10.8]
ARR.ITEM[05.10.9]
@BOX 3.0
VECTOR OF STATEMENT ATTRIBUTES
[05.10.1]
@BOX 4.0
NEXT ITEM NOT #?
@BOX 5.0
PROCESS CHANNEL EXPR [
@BOX 6.0
SELECT STATEMENT ATTRIBUTE
@BOX 7.0
PROCESS CONTROL ITEMS[05.10.2]
@BOX 8.0
PLANT CALL TO BIO.OUTPUT
@BOX 9.0
STATEMENT HAS NO EXPLICIT CHANNEL
NOR ANY PRINT CONTROLS
@BOX 10.0
NEXT ITEM NOT :
@BOX 11.0
PROCESS LIST
OUTPUT LIST [05.10.3]
PRINT LIST [05.10.4]
MAT PRINT LIST[05.10.5]
WRITE LIST [05.10.6]
WRITE ARRAY LIST[05.10.7]
@BOX 13.0
PLANT CALL TO
BIO.END.OUTPUT
@BOX 14.0
END
@BOX 15.0
STATEMENT NOT WRITE?
@BOX 16.0
SYNTAX FAULT
@BOX 17.0
END OF STATEMENT?
@BOX 18.0
LIST MANDATORY?
@BOX 19.0
NOT PRINT LIST ITEM?
@BOX 20.0
INCR IPTR
@BOX 21.0
NOTE NO EXPLICIT
CHANNEL
@BOX 22.0
NOTE NEWLINE REQUIRED AT END OUTPUT TIME
@BOX 1.1
PROC TRANS.PRINT.WRITE(STAT);
$LO16 A,CNTRL,STATUS,S, S.BITS;
$IN COL.FL,CS,CN,SN,LS,RS,INFO,TG,ST,AP,FL,T, END.ST, CH.AP;
ITYPE ITEM;
0 => END.ST;
@BOX 2.1
PSPEC EXPR.ITEM();
PSPEC ARRAY.ITEM($IN);
#BSC05.10.8
#BSC05.10.9
@BOX 3.1
#BSC05.10.1
@BOX 4.1
0 => COL.FL;
IF LBUFF[1+IPTR] /= HASH.D
@BOX 5.1
1 => COL.FL;
1 +> STAT;
1 +> IPTR;
IN.EXPR(5) => CH.AP;
@BOX 6.1
STAT.ATT[STAT] => A;
@BOX 7.1
#BSC05.10.2
@BOX 8.1
IF CH.AP /= 0 THEN
   CODE.EXPR (CH.AP, %9);
ELSE
   SET.A.TYPE(%9);
   TL.PL (%22, ZERO);
FI;
BEGIN
DATAVEC SEQ($LO16)
%1006
%6000
%46 %84
%22 %8003
%6000
%A000
END
IF STAT = 8 OR STAT = 9 THEN
   1 !> STATUS;
FI
STATUS => G.LIT.16.0;
PL.CD.SEQ(^SEQ);
END
@BOX 9.1
IF COL.FL = 0
@BOX 10.1
IF LBUFF[1+IPTR]/= COLON
@BOX 11.1
ALTERNATIVE A ->> 8 & %F FROM
BEGIN
#BSC05.10.4
END
BEGIN
#BSC05.10.3
END
BEGIN
#BSC05.10.5
END
BEGIN
#BSC05.10.6
END
BEGIN
#BSC05.10.7
END
END
@BOX 13.1
BEGIN
DATAVEC SEQ($LO16)
%1056
%46 %84
%22 %8003
%6000
%A000
END
END.ST => G.LIT.16.0;
PL.CD.SEQ(^SEQ);
END
@BOX 14.1
END
@BOX 15.1
IF STAT < 7
@BOX 16.1
MONITOR(%1000);
@BOX 17.1
IF LBUFF[1+IPTR] => ITEM /= EOS AND ITEM /= COLON
@BOX 18.1
IF A & %80 /= 0
@BOX 19.1
IF A & %0F00 /= 0
@BOX 20.1
1 +> IPTR;
@BOX 21.1
0 => CH.AP;
@BOX 22.1
1 !> END.ST;
@END
@TITLE BSC05.10.1(1,11)
@COL 1S
@BOX 1.0
VECTOR OF PRINT/WRITE ATTRIBUTES
VECTOR INDEXED BY STAT ENCODED AS
0 PRINT
1 PRINT to channel
2 MAT PRINT
3 MAT PRINT to channel
4 PRINT formatted
5 PRINT formatted to channel
6 MAT PRINT formatted
7 MAT PRINT formatted to channel
8 WRITE
9 MAT WRITE
ELEMENTS OF THE VECTOR ARE ENCODED AS FOLLOWS
Bits  0-5  Permitted print controls
      %1   IF THERE recovery specifier allowed
      %10  USING specifier allowed
      %20  Record setter specifier allowed

Bit   7=1  means list is mandatory

Bits  8-10 specify type of list
       0   Print list
       1   Output list
       2   MAT print list
       3   Expression list
       4   Array list

Bit  15=1  means statement has explicit channel specifier
@BOX 1.1
DATAVEC STAT.ATT($LO16)
%0010
%8031
%0290
%82B1
%0110
%8131
%0290
%82B1
%03A1
%84A1
END
@END
////17 23.JUL.83
@TITLE BSC05.10.2(1,11)
@COL 13R-14R
@COL 1S-2R-3T-4T-15R-5T-6T-7T-8R-9N-12F
@ROW 13-7
@FLOW 1-2-3N-4N-15-5N-6N-7N-8-4Y-9-12
@FLOW 3Y-5Y-9
@FLOW 6Y-13
@FLOW 7Y-14
@BOX 1.0
OUTPUT CONTROLS
@BOX 2.0
RESET CONTROLS PRESENT
@BOX 3.0
COMMA NOT REQUIRED?
@BOX 4.0
NEXT ITEM NOT COMMA?
@BOX 5.0
NEXT ITEM NOT START OF I/O CONTROL ITEM
SPECIFIER
@BOX 6.0
SPECIFIER ALREADY SEEN?
@BOX 7.0
SPECIFIER NOT ALLOWED
@BOX 8.0
PROCESS OUTPUT CONTROL SPECIFIER
[BSC05.10.2.1]
NOTE COLON REQUIRED IF
LIST PRESENT
@BOX 12.0
END
@BOX 13.0
FAULT
@BOX 14.0
FAULT
@BOX 15.0
INCR IPTR
@BOX 1.1
::OUTPUT CONTROLS
@BOX 2.1
0 => STATUS;
0 => CNTRL;
@BOX 3.1
IF A & %8000 = 0
@BOX 4.1
IF LBUFF[1+IPTR] /= COMMA
@BOX 5.1
IF TAG OF LBUFF[1+IPTR] => TG<4
   OR TG > 5
   OR ST OF LBUFF[1 + IPTR] => ST & %80 = 0
@BOX 6.1
1 +> IPTR;
IF ST & %F => S > 4 THEN
   5 => S;
FI
IF 1 <<- S => S.BITS & CNTRL /= 0
@BOX 7.1
IF A & S.BITS = 0
@BOX 8.1
S.BITS !> CNTRL;
#BSC05.10.2.1
1 => COL.FL;
@BOX 12.1
::END
@BOX 13.1
MONITOR(%1030);
@BOX 14.1
MONITOR (%1031);
@BOX 15.1
1 +> IPTR;
@END
//17 23.JUL.83
@TITLE BSC05.10.2.1(1,11)
@COL 8C-9R-10R-11C-12R
@COL 1S-2R-3C-4T-5R-6R-7F
@COL 10R
@ROW 8-3
@ROW 5-10
@FLOW 1-2
@FLOW 3-4N-5-6-7
@FLOW 8-9-7
@FLOW 4Y-10
@FLOW 11-12-7
@BOX 1.0
PRINT CONTROL SPECIFIERS
@BOX 2.0
SWITCH ON SPECIFIER KEYWORD
@BOX 3.0
IF?
@BOX 4.0
NEXT ITEM NOT 'THERE'
@BOX 5.0
PROCESS IO RECOVERY [05.46]
@BOX 6.0
UPDATE BIO OUTPUT STATUS
@BOX 7.0
END
@BOX 8.0
BEGIN
END
NEXT
SAME
@BOX 9.0
UPDATE BIO OUTPUT STATUS
@BOX 10.0
SYNTAX FAULT
@BOX 11.0
USING
@BOX 12.0
PROCESS USING SPECIFIER
[5.10.2.2]
@BOX 1.1
::PRINT CONTROL SPECIFIERS
@BOX 2.1
IF S = 0, -> B3;
IF S = 4, -> B11;
-> B8;
@BOX 3.1
B3:;
@BOX 4.1
IF LBUFF[1+>IPTR] /= D.THERE
@BOX 5.1
IO.REC();
@BOX 6.1
2 !> STATUS;
@BOX 7.1
::END
@BOX 8.1
B8:;
@BOX 9.1
ST & %F - 4 <<- 4 !> STATUS;
@BOX 10.1
MONITOR(%1000);
@BOX 11.1
B11:;
@BOX 12.1
#BSC05.10.2.2
@END
//16
@TITLE BSC05.10.3(1,11)
@COL 9S-1R-3R-4T-5T-6R-8F
@FLOW 9-1-3-4N-5N-6-8
@FLOW 4Y-3
@FLOW 5Y-8
@BOX 1.0
NOTE NEWLINE TERMINATOR NEEDED
@BOX 3.0
PROCESS EXPR AND PLANT CALL
APPROPRIATE BIO.PRINT CALL [05.10.8]
@BOX 4.0
NEXT SYMBOL ,
@BOX 5.0
NEXT SYMBOL NOT ;
@BOX 6.0
NOTE NO NEWLINES NEEDED
@BOX 7.0
PLANT CALL TO BIO END.FORMAT
@BOX 8.0
END
@BOX 9.0
PROCESS FORMATTED OUTPUT LIST
@BOX 1.1
3 => END.ST;
1 -> IPTR;
@BOX 3.1
1 +> IPTR;
EXPR.ITEM();
@BOX 4.1
IF LBUFF[1+IPTR] => ITEM = COMMA
@BOX 5.1
IF ITEM /= S.COLON
@BOX 6.1
1 +> I.PTR;
2 => END.ST;
@BOX 8.1
::END
@BOX 9.1
::OUTPUT LIST
@END
///16
@TITLE BSC05.10.4(1,11)
@COL 34N-14T-15R-16R-17T-18R-19T-20R-21T-22R-33N
@COL 1S-2R-3R-4T-5R-6T-7R-8T-9T-11T-12R-13N
@COL 23T-24R-25F-27T-28R-30R-31T-26R
@ROW 34-3
@ROW 14-9
@ROW 11-23
@FLOW 1-2-3-4N-5-4Y-6N-7-4
@FLOW 6Y-8N-9N-11N-12-13-33-34-3
@FLOW 8Y-14N-15-17N-18-19N-20-21N-22-9
@FLOW 14Y-16-17Y-19Y-21Y-9
@FLOW 9Y-23N-24-25
@FLOW 23Y-25
@FLOW 11Y-27N-28-30-31Y-13
@FLOW 27Y-26
@FLOW 31N-26
@BOX 1.0
PROCESS PRINT LIST WITHOUT
FORMATTING
@BOX 2.0
SET CURRENT SEPARATOR TO COMMA
@BOX 3.0
SET COMMA CNT TO 0
SET SEMI-COLON CNT TO 0
@BOX 4.0
NEXT ITEM NOT A COMMA
@BOX 5.0
INCR COMMA CNT
@BOX 6.0
NEXT ITEM NOT A SEMI-COLON?
@BOX 7.0
INCR SEMI-COLON CNT
@BOX 8.0
SEPARATORS PRESENT?
@BOX 9.0
NEXT ITEM EOS OR STAT SEP
@BOX 11.0
NEXT ITEM A TAB?
@BOX 12.0
RECOGNISE PRINT LIST EXPR
AND PLANT CALL TO APPROPRIATE
BIO PRINT PROCEDURE[05.10.8]
@BOX 14.0
COMMA CNT ZERO?
@BOX 15.0
NOTE REQUIRED SEP IS COMMA
@BOX 16.0
NOTE REQUIRED SEP IS SEMI-COLON
@BOX 17.0
REQUIRED SEP IS CURRENT SEP
@BOX 18.0
PLANT CALL TO BIO.SEP
TO SELCT NEW SEPARATOR
@BOX 19.0
NEXT SYMBOL NOT EOS?
@BOX 20.0
INCR COMMA CNT BY 1
@BOX 21.0
COMMA CNT < 2
@BOX 22.0
PLANT CALL TO BIO.PRINT.SEP
TO ADVANCE COLUMN POSITION
@BOX 23.0
STATEMENT DID END
WITH A PRINT SEPARATOR
@BOX 24.0
NOTE NEWLINE REQUIRED AT END OUTPUT TIME
@BOX 25.0
END
@BOX 26.0
FAULT
@BOX 27.0
NEXT SYMBOL NOT (
@BOX 28.0
COMPILE EXPRESSION
[BSC07]
@BOX 30.0
PLANT CALL TO BIO.TAB
@BOX 31.0
NEXT SYMBOL )
@BOX 1.1
::BEGIN
@BOX 2.1
0 => CS;
@BOX 3.1
0 => CN => SN => LS;
@BOX 4.1
IF LBUFF[1+>IPTR] => ITEM /= COMMA
@BOX 5.1
1 +> CN;
0 => LS;
@BOX 6.1
IF ITEM /= S.COLON
@BOX 7.1
1 +> SN;
1 => LS;
@BOX 8.1
IF CN+SN>0
@BOX 9.1
IF ITEM = EOS OR ITEM = COLON
@BOX 11.1
IF ITEM = D.TAB
@BOX 12.1
1 -> IPTR;
EXPR.ITEM();
@BOX 13.1
::END
@BOX 14.1
IF CN = 0
@BOX 15.1
0 => RS;
@BOX 16.1
1 => RS;
@BOX 17.1
IF CS = RS
@BOX 18.1
BEGIN
DATAVEC SEQ ($LO16)
%1009
%A000
END
PL.CD.SEQ(^SEQ);
END;
RS => CS;
@BOX 19.1
IF ITEM /= EOS
@BOX 20.1
1 +> CN;
@BOX 21.1
IF CN < 2
@BOX 22.1
BEGIN
DATAVEC SEQ($LO16)
%1008
%46 %44
%22 %8003
%6000
%A000
END
CN-1 => G.LIT.16.0;
PL.CD.SEQ(^SEQ);
END
@BOX 23.1
1 -> IPTR;
IF CN+SN /= 0
@BOX 24.1
1 => END.ST;
@BOX 25.1
::END
@BOX 26.1
MONITOR(%1000);
@BOX 27.1
IF LBUFF[1+>IPTR] /= LB
@BOX 28.1
EXPR(5,9);
@BOX 30.1
BEGIN
DATAVEC SEQ($LO16)
%100B
%6000
%A000
END
PL.CD.SEQ(^SEQ);
END
@BOX 31.1
IF LBUFF[1+>IPTR] = RB
@END
@TITLE BSC05.10.8(1,11)
@COL 1S-2R-3T-4R-5F
@COL 6R
@ROW 4-6
@FLOW 1-2-3N-4-5
@FLOW 3Y-6-5
@BOX 1.0
PROCESS PRINT EXPRESSION
@BOX 2.0
READ IN EXPRESSION [BSC07]
@BOX 3.0
STRING EXPRESSION
@BOX 4.0
PLANT CALL TO APPROPRIATE
BIO.PRINT PROCEDURE
RESET A USE INFO
@BOX 5.0
END
@BOX 6.0
PROCESS STRING EXPRESSION
VALUE
@BOX 1.1
PROC EXPR.ITEM;
DATAVEC PRINT.TY($LO8)
%48 %50 %10 %18
END;
$IN AP, K, T, EK, EZ, W0;
@BOX 2.1
IN.EXPR (%4) => AP;
@BOX 3.1
AS[AP] ->> 8 => W0 & %C0 => EK;
IF EK = %C0
@BOX 4.1
W0 & %38 => EZ;
-1 => T;
WHILE PRINT.TY[1 +> T] => K & %C0 /= EK
      OR K & %38 < EZ DO OD
PL.STK.LB(BIO.PRINT[T]);
CODE.EXPR(AP, K ->> 3);
TL.PL(%41,%3000);
-1 => A.AP;
TL.PL(%42,0);
@BOX 5.1
END
@BOX 6.1
BEGIN
DATAVEC CD.SEQ($LO16)
%48  %C016
%41  %3000
%42  %0
END;
CODE.STR.EXPR(AP,0);
PL.CD.SEQ(^CD.SEQ);
END
@END
///18 28.JUL.83
@TITLE BSC05.10.5(1,11)
@COL 1S-3R-7R-8T-9T-10R-11T-12R-13R-14T-15T-20N-16R-21F
@COL 18R-19R
@ROW 9-18
@FLOW 1-3-7-8N-9N-10-11N-12-13-14N-15Y-16-21
@FLOW 8Y-18-11Y-13
@FLOW 9Y-19-11
@FLOW 14Y-16
@FLOW 15Y-20-7
@BOX 1.0
MAT PRINT LIST
@BOX 3.0
SET CURRENT SEP TO COMMA
@BOX 7.0
SAVE PTR TO NEXT ITEM
(HOPEFULLY ARRAY NAME)
@BOX 8.0
NEXT ITEM A COMMA?
@BOX 9.0
NEXT ITEM A SEMI-COLON
@BOX 10.0
NOTE NO SEP
SET REQUIRED SEP TO COMMA
@BOX 11.0
IS CURRENT SEP REQUIRED SEP
OR FORMATTED OUTPUT?
@BOX 12.0
PLANT CALL TO BIO SEP
TO SELECT NEW SEPARATOR
@BOX 13.0
PLANT CALL TO APPROPRIATE
BIO.MAT.PRINT PROCEDURE
@BOX 14.0
NEXT SYM = EOS
@BOX 15.0
NO SEP PRESENT
@BOX 16.0
NOTE NEWLINE REQUIRED IF
NO SEP AT END OF LINE
@BOX 18.0
NOTE REQUIRED SEP IS COMMA
@BOX 19.0
NOTE REQUIRED SEP IS SEMI-COLON
@BOX 21.0
END
@BOX 1.1
::MAT PRINT LIST
@BOX 3.1
0 => CS;
@BOX 7.1
0 => S;
1+>IPTR=>T;
@BOX 8.1
IF LBUFF [1+>IPTR] => ITEM = COMMA
@BOX 9.1
IF ITEM = S.COLON
@BOX 10.1
1 -> IPTR;
1 => S;
0 => RS;
@BOX 11.1
IF CS=RS OR CNTRL & %20 /= 0
@BOX 12.1
BEGIN
DATAVEC SEQ($LO16)
%1009
%A000
END
PL.CD.SEQ(^SEQ);
END
RS => CS;
@BOX 13.1
ARRAY.ITEM(T);
@BOX 14.1
IF LBUFF[1+IPTR] = EOS
@BOX 15.1
IF S /= 0
@BOX 16.1
S !> END.ST;
@BOX 18.1
0 => RS;
@BOX 19.1
1 => RS;
@BOX 21.1
::END
@END
@TITLE BSC05.10.6(1,11)
@COL 1S-2R-3T-4F
@FLOW 1-2-3N-4
@FLOW 3Y-2
@BOX 1.0
WRITE EXPR LIST
@BOX 2.0
CODE EXPR ITEM AND PLANT
APPROPRIATE CALL TO BIO.PRINT
DEPENDING ON EXPR TYPE
[05.10.8]
@BOX 3.0
NEXT ITEM = ,
@BOX 4.0
END
@BOX 1.1
::WRITE EXPR LIST
@BOX 2.1
EXPR.ITEM();
@BOX 3.1
IF LBUFF[1+>IPTR] = COMMA
@BOX 4.1
1 -> IPTR
::END
@END
@TITLE BSC05.10.7(1,11)
@COL 1S-2R-3T-4F
@FLOW 1-2-3N-4
@FLOW 3Y-2
@BOX 1.0
WRITE ARRAY LIST
@BOX 2.0
CODE ARRAY ITEM AND PLANT
APPROPRIATE CALL TO BIO.MAT.PRINT
DEPENDING ON EXPR TYPE[05.10.9]
@BOX 3.0
NEXT ITEM , ?
@BOX 4.0
END
@BOX 1.1
::WRITE ARRAY LIST
@BOX 2.1
ARRAY.ITEM(1+>IPTR);
@BOX 3.1
IF LBUFF[1+>IPTR] = COMMA
@BOX 4.1
1 -> IPTR;
::END
@END
//15
@TITLE BSC05.10.9(1,11)
@COL 1S-2R-3T-4R-5R-6F
@COL 7R
@ROW 4-7
@FLOW 1-2-3N-4-5-6
@FLOW 3Y-7
@BOX 1.0
ARRAY LIST ITEM (IPTR)
@BOX 2.0
GET IDENTIFIER
@BOX 3.0
IDENTIFIER NOT AN ARRAY?
@BOX 4.0
SELECT BIO.MAT.PRINT
ACCORDING TO TYPE
@BOX 5.0
PLANT CALL TO APPR
BIO.MAT.PROC
@BOX 6.0
END
@BOX 7.0
FAULT
@BOX 1.1
PROC ARRAY.ITEM(IP);
$IN I, DEREF;
@BOX 2.1
IF GETN(LBUFF[IP]) => I < 0 THEN
   0 -:> I;
FI
SELECT NLIST[I];
@BOX 3.1
IF K /= KVEC /= KMAT
@BOX 4.1
-1 => I;
WHILE MAT.TY[1 +> I] /= T DO OD
@BOX 5.1
PL.STK.LB(BIO.PRINT[I + 5]);
SET.A.TYPE(T ->> 3 ! %C00);
DETAIL1 ->> 5 & 1 => DEREF;
TL.PL(%21 + DEREF, MUTLN);
TL.PL(%41, %3000);
SET.A.TYPE(BADDR ! %C00);
TL.PL(%21 + DEREF, MUTLN + 1);
TL.PL(%41, %3000);
IF T & %F8 = %C0 THEN
   SET.A.TYPE(9);
   IF DEREF = 0 THEN
      TL.CLIT.16(%44, ARRAYS[DETAIL -1]);
      0 => I;
   ELSE
      MUTLN - 1 => I;
   FI
   TL.PL(%22, I);
   TL.PL(%41, %3000);
FI
TL.PL(%42, 0);
@BOX 6.1
END
@BOX 7.1
MONITOR (%1032);
@END
///16
@TITLE BSC05.13(1,11)
@COL 10R
@COL 1S-2T-3R-13T-4T-5T-6R-7R-8R-9F
@COL 11R-12R
@ROW 10-8
@ROW 11-3
@ROW 12-5
@FLOW 1-2N-3-13N-4N-5N-6-7-8-9
@FLOW 13Y-10
@FLOW 2Y-11-4Y-12-7
@FLOW 5Y-10
@BOX 1.0
TRANS.SET
PROCESS SET STATEMENT
@BOX 2.0
NEXT ITEM /= HASH.D
@BOX 3.0
PROCESS AND CODE CHANNEL EXPR
@BOX 4.0
NEXT ITEM MARGIN
@BOX 5.0
NEXT ITEM NOT ZONEWIDTH
@BOX 6.0
NOTE ZONEWIDTH
@BOX 7.0
PROCESS EXPR INDEX
@BOX 8.0
PLANT CALL TO BIO.MARGIN
OR BIO.ZONE
@BOX 9.0
END
@BOX 10.0
SYNTAX FAULT
@BOX 11.0
PLANT ACC = 0
@BOX 12.0
NOTE MARGIN
@BOX 13.0
NEXT ITEM NOT :
@BOX 1.1
PROC TRANS.SET;
ITYPE IT;
$IN AP,ET;
$LO32 FN;
@BOX 2.1
IF LBUFF[1+IPTR] /= HASH.D
@BOX 3.1
1 +> IPTR;
EXPR(5, %9);
@BOX 4.1
IF LBUFF[1+>IPTR] => IT = D.MARGIN
@BOX 5.1
IF IT /= D.ZONEWIDTH
@BOX 6.1
BIO.ZONE.FN => FN;
9 => ET;
@BOX 7.1
IN.EXPR(5) => AP;
@BOX 8.1
PL.STK.LB (FN);
TL.PL(%41,%3000);
CODE.EXPR(AP, ET);
TL.PL(%41,%3000);
TL.PL(%42,0);
@BOX 9.1
END
@BOX 10.1
MONITOR(%1000);
@BOX 11.1
SET.A.TYPE(9);
TL.PL(%22,ZERO);
@BOX 12.1
BIO.MARGIN.FN => FN;
3 => ET;
@BOX 13.1
IF LBUFF[1 +> IPTR] /= COLON
@END
///8
@TITLE BSC05.14(1,11)
@COL 7R
@COL 1S-3T-2T-4R-5R-6F
@ROW 7-4
@FLOW 1-3N-2N-4-5-6
@FLOW 2Y-6
@FLOW 3Y-7
@BOX 1.0
TRANS.IMAGE
PROCESS IMAGE STATEMENT
@BOX 2.0
NO STATEMENT LABEL
@BOX 3.0
CALL BIO.ENC.FORMAT TO CHECK
AND ENCODE FORMAT
FORMAT FAULTY
@BOX 4.0
GET MUTL NAME FOR IMAGE
LINE FORMAT [08]
@BOX 5.0
DEFINE INCODE VECTOR FOR
ENCODED FORMAT
@BOX 6.0
END
@BOX 7.0
FAULT
@BOX 1.1
PROC TRANS.IMAGE;
$LO8[2048] IMAGE;
$IN Z,N;
@BOX 2.1
IF STAT.LAB =< 0
@BOX 3.1
IF BIO.ENC.FORMAT(IMAGE.STR, ^IMAGE) => Z < 0
@BOX 4.1
LAB(STAT.LAB,3) => N;
@BOX 5.1
TL.ASS(N,-1);
TL.C.LIT.S(TLO8,PART(^IMAGE,0,Z-1));
TL.ASS.VALUE(0,1);
TL.ASS.END();
@BOX 6.1
END
@BOX 7.1
MONITOR.P(%1018, Z - IMAGE.POS);
@END
//14
@TITLE BSC05.20(1,11)
@COL 1S-3T-2R-16T-4T-5R-15R-6T-7T-8T-9R-10R-11R-12F
@COL 13R-14R
@ROW 5-13
@ROW 9-14
@FLOW 1-3N-2-16N-4N-5-15-6N-7N-8N-9-6Y-10-11-12
@FLOW 16Y-13
@FLOW 4Y-13
@FLOW 3Y-13
@FLOW 7Y-13
@FLOW 8Y-14
@BOX 1.0
TRANS.OPEN
PROCESS OPEN STATEMENT
@BOX 2.0
READ CHANNEL EXPRESSION [BSC07]
@BOX 3.0
NEXT ITEM NOT# ?
@BOX 4.0
NEXT ITEM NOT NAME
@BOX 5.0
READ FILENAME EXPRESSION [BSC07]
@BOX 6.0
NEXT ITEM NOT ,
@BOX 7.0
NEXT ITEM NOT
ACCESS
ORGANIZATION
RECTYPE
RECSIZE
@BOX 8.0
ATTRIBUTE ALREADY SPECIFIED
@BOX 9.0
PROCESS ATTRIBUTE ITEM
[BSC05.20.1]
@BOX 10.0
PLANT CALL TO BIO.OPEN
@BOX 11.0
NOTE PU CONTAINS OPEN
STATEMENTS
@BOX 12.0
END
@BOX 13.0
SYNTAX FAULT
@BOX 14.0
FAULT
@BOX 15.0
RESET BIO.OUTPUT STATUS
@BOX 16.0
NEXT ITEM NOT :
@BOX 1.1
PROC TRANS.OPEN;
$IN CH.AP, FN.AP, SET;
$LO16 STAT, ATTR, S, N, STRN;
ITYPE IT;
$IN T;
@BOX 2.1
IN.EXPR(5) => CH.AP;
@BOX 3.1
IF LBUFF[1+>IPTR] /= HASH.D
@BOX 4.1
IF LBUFF[1 +> IPTR] /= D.NAME
@BOX 5.1
IN.EXPR(6) => FN.AP;
@BOX 6.1
IF LBUFF[1+IPTR] /= COMMA
@BOX 7.1
1+> IPTR;
IF LBUFF[1+>IPTR] => IT = D.ACCESS THEN
   0 => T;
ELSE IF IT = D.ORGANIZATION THEN
   1 => T;
ELSE IF IT = D.REC.TYPE THEN
   2 => T;
ELSE IF IT = D.REC.SIZE THEN
   3 => T;
ELSE
   -1 => T;
FI FI FI FI
IF T < 0
@BOX 8.1
IF 1 <<- T => S & ATTR /= 0
@BOX 9.1
S !> ATTR;
#BSC05.20.1
@BOX 10.1
PL.STK.LB(BIO.OPEN.FN);
CODE.EXPR(CH.AP, %9);
TL.PL(%41,%3000);
CODE.STR.EXPR(FN.AP, 0);
STAT => G.LIT.16.0;
BEGIN
DATAVEC SEQ($LO16)
%6000
%46 %44
%22 %8003
%6000
%A000
END
PL.CD.SEQ(^SEQ);
END
@BOX 11.1
1 !> PU.STATS;
@BOX 12.1
END
@BOX 13.1
MONITOR(%1000);
@BOX 14.1
MONITOR (%1060);
@BOX 15.1
0 => ATTR => STAT;
@BOX 16.1
IF LBUFF[1 +> IPTR] /= COLON
@END
//16
@TITLE BSC05.20.1(1,11)
@COL 8C-9T-10N
@COL 1S-22R-2R-3C-4T-5R-7R-23F
@COL 11C-12T-13N-14C-15T-16R-18T-19R-20R
@ROW 8-3-11
@FLOW 1-22-2
@FLOW 3-4N-5-7-23
@FLOW 4Y-7
@FLOW 8-9N-10-7
@FLOW 9Y-5
@FLOW 11-12N-13-7
@FLOW 12Y-5
@FLOW 14-15N-16-18N-19-20-7
@FLOW 15Y-18Y-7
@BOX 1.0
FILE ATTRIBUTE ITEM
@BOX 2.0
SWITCH ON ATTRIBUTE SPECIFIER
@BOX 3.0
ORGANIZATION
@BOX 4.0
NEXT ITEM
     SEQUENTIAL
     STREAM
@BOX 5.0
PROCESS STRING EXPR
PLANT CALL TO APPROPRIATE BIO.SET
PROCEDURE
@BOX 7.0
UPDATE STATUS
@BOX 8.0
ACCESS
@BOX 9.0
NEXT ITEM NOT
     INPUT
     OUTPUT
     OUTIN?
@BOX 11.0
RECTYPE
@BOX 12.0
NEXT ITEM NOT
     DISPLAY
     INTERNAL?
@BOX 14.0
RECSIZE
@BOX 15.0
NEXT ITEM VARIABLE
@BOX 16.0
PROCESS STRING EXPR
PLANT CALL TO BIO.SET.R.KIND
@BOX 18.0
NEXT ITEM /= LENGTH
@BOX 19.0
UPDATE STATUS
@BOX 20.0
PROCESS INDEX EXPR
PLANT CALL TO
BIO.SET.LENGTH
@BOX 22.0
GET NEXT ITEM
@BOX 23.0
END
@BOX 1.1
::BSC05.20.1
@BOX 2.1
0 => SET;
SWITCH T \ B8, B3, B11, B14;
@BOX 3.1
B3:;
@BOX 4.1
IF IT = D.SEQUENTIAL THEN
   %10 => N;
ELSE IF IT = D.STREAM THEN
   %18 => N;
ELSE
   %8 => N;
   77 => SET;
FI FI
IF SET = 0
@BOX 5.1
1 -> IPTR;
CODE.STR.EXPR(IN.EXPR(6),0);
PL.STK.LB(SET);
TL.PL(%41, %3000);
TL.PL(%42, 0);
@BOX 7.1
N !> STAT;
@BOX 8.1
B8:;
@BOX 9.1
IF IT = D.INPUT THEN
   2 => N;
ELSE IF IT = D.OUTPUT THEN
   3 => N;
ELSE IF IT = D.OUTIN THEN
   4 => N;
ELSE
   1 => N;
   76 => SET;
FI FI FI
IF SET /= 0
@BOX 11.1
B11:;
@BOX 12.1
IF IT = D.DISPLAY THEN
   %80 => N;
ELSE IF IT = D.INTERNAL THEN
   %C0 => N;
ELSE
   %40 => N;
    78 => SET;
FI FI
IF SET /= 0
@BOX 14.1
B14:;
@BOX 15.1
%800 => N
IF IT = D.VARIABLE
@BOX 16.1
1 -> IPTR;
CODE.STR.EXPR (IN.EXPR(6),0);
PL.STK.LB(79);
TL.PL(%41,%3000);
TL.PL(%42,0);
@BOX 18.1
IF LBUFF [1+IPTR] /= D.LENGTH
@BOX 19.1
%1000 => N;
@BOX 20.1
1 +> IPTR;
EXPR (5,9);
PL.STK.LB (80);
TL.PL (%41,%3000);
TL.PL (%42,0);
@BOX 22.1
LBUFF [1 +> IPTR] => IT;
@BOX 23.1
::END
@END
///13
@TITLE BSC05.21(1,11)
@COL 1S-2T-3R-4F
@COL 5R
@FLOW 1-2N-3-4
@ROW 5-3
@FLOW 2Y-5
@BOX 1.0
CLOSE
COMPILE close-statement
@BOX 2.0
NEXT ITEM NOT #
@BOX 3.0
COMPILE CHANNEL EXPRESSION
PLANT CALL TO BIO.CLOSE
@BOX 4.0
END
@BOX 5.0
FAULT
@BOX 1.1
PROC CLOSE;
@BOX 2.1
IF LBUFF [1+>IPTR] /= HASH.D
@BOX 3.1
EXPR (5,9);
DATAVEC SEQ ($LO16);
%1051
%6000
%A000
END
PL.CD.SEQ (^SEQ);
@BOX 4.1
END
@BOX 5.1
MONITOR (%1000);
@END
///14
@TITLE BSC05.22(1,11)
@COL 1S-2T-3R-16T-4R-5T-17T-6R-7R-9R-10T-11R-12T-13F
@COL 14R-18R
@ROW 6-14
@ROW 7-18
@FLOW 1-2N-3-16N-4-5N-17N-6-7-9-10N-11-6
@FLOW 2Y-4
@FLOW 16Y-14
@FLOW 5Y-14
@FLOW 10Y-12N-13
@FLOW 12Y-5
@FLOW 17Y-18-6
@BOX 1.0
ASK
COMPILE ask-statement
@BOX 2.0
NEXT ITEM NOT #
@BOX 3.0
READ CHANNEL EXPR [BSC07]
@BOX 4.0
PLANT CALL TO BIO.ASK
@BOX 5.0
NEXT ITEM NOT AN
ask-attribute-name
@BOX 6.0
DETERMINE TYPE OF VARIABLE EXPECTED
@BOX 7.0
READ IN EXPR
@BOX 9.0
PLANT
BIO.ASK.INT/STRING(ATTR) => VAR
@BOX 10.0
NOT RECSIZE
@BOX 11.0
RESET INFO FOR
SECOND VAR
@BOX 12.0
NEXT ITEM NOT,
@BOX 13.0
END
@BOX 14.0
FAULT
@BOX 16.0
NEXT ITEM NOT :?
@BOX 17.0
ask-attribute-name ALREADY SEEN?
@BOX 18.0
FAULT
@BOX 1.1
PROC ASK;
ITYPE IT;
$IN N, CH.AP, V.AP, S.STAT, N.STAT, STAT, LB.N, T, K;
@BOX 2.1
0 => S.STAT => N.STAT => CH.AP;
IF LBUFF[1 + IPTR] /= HASH.D
@BOX 3.1
1 +> IPTR;
IN.EXPR(5) => CH.AP;
@BOX 4.1
IF CH.AP = 0 THEN
   TL.PL(%46, %44);
   TL.PL(%22, ZERO);
ELSE
   CODE.EXPR(CH.AP, 9);
FI
BEGIN
DATAVEC SEQ($LO16)
%1052
%6000
%A000
END;
PL.CD.SEQ(^SEQ);
END
@BOX 5.1
IF LBUFF[1 +> IPTR] => IT = D.ACCESS THEN
   %C0 => N
ELSE IF IT = D.CAPABILITY THEN
   %C5 => N
ELSE IF IT = D.COLLATE THEN
   %C3 => N
ELSE IF IT = D.DATUM THEN
   %C6 => N
ELSE IF IT = D.KEY THEN
   %C7 => N
ELSE IF IT = D.MARGIN THEN
   0 => N
ELSE IF IT = D.NAME THEN
   %C8 => N
ELSE IF IT = D.ORGANIZATION THEN
   %C1 => N
ELSE IF IT = D.POINTER THEN
   %C9 => N
ELSE IF IT = D.RECORD THEN
   1 => N
ELSE IF IT = D.RECSIZE THEN
   %C4 => N
ELSE IF IT = D.RECTYPE THEN
   %C2 => N
ELSE IF IT = D.ZONEWIDTH THEN
   3 => N
ELSE
   -1 => N
FI FI FI FI FI FI FI FI FI FI FI FI FI
IF N < 0
@BOX 6.1
IF N & %C0 = 0 THEN
   %15 => K;
   %54 => LB.N;
ELSE
   %16 => K;
   %53 => LB.N;
FI
@BOX 7.1
IN.EXPR(K) => V.AP;
@BOX 9.1
BEGIN
DATAVEC SEQ($LO16);
%46 %44
%22 %8003
%6000
%A000
END
N & %3F => G.LIT.16.0;
PL.STK.LB(LB.N);
PL.CD.SEQ(^SEQ);
IF K = %15 THEN
   SET.A.TYPE(%209);
   SET.A.TYPE(AS[VAP] ->> 11 ! %100);
ELSE
   SET.A.TYPE(%E18);
FI
CODE.NODE(19, VAP);
END;
@BOX 10.1
IF N /= %C4
@BOX 11.1
2 => N;
@BOX 12.1
IF LBUFF[1 +> IPTR] = COMMA
@BOX 13.1
1 -> IPTR;
END
@BOX 14.1
MONITOR(%1000);
@BOX 16.1
IF LBUFF[1 +> IPTR] /= COLON
@BOX 17.1
N & %F => T;
1 <<- T => T;
IF N & %C0 = 0 THEN
   NSTAT => STAT ! T => NSTAT;
ELSE
   SSTAT => STAT ! T => SSTAT;
FI
IF STAT & T /= 0
@BOX 18.1
MONITOR(%61);
@END
///13
@TITLE BSC05.23(1,11)
@COL 1S-2T-3R-4T-5R-6R-7F
@COL 8R
@ROW 5-8
@FLOW 1-2N-3-4N-5-6-7
@FLOW 2Y-4Y-8
@BOX 1.0
ERASE
COMPILE erase-statement
@BOX 2.0
NEXT ITEM NOT REST
@BOX 3.0
NOTE REST NOT PRESENT
@BOX 4.0
NEXT ITEM NOT #
@BOX 5.0
READ IN CHANNEL EXPRESSION
@BOX 6.0
PLANT CALL TO BIO.ERASE
@BOX 7.0
END
@BOX 8.0
FAULT
@BOX 1.1
PROC ERASE;
$IN AP, ST;
@BOX 2.1
0 => G.LIT.16.0;
IF LBUFF[1 + IPTR] /= D.REST
@BOX 3.1
1 => G.LIT.16.0;
1 +> IPTR;
@BOX 4.1
IF LBUFF[1 +> IPTR] /= HASH.D
@BOX 5.1
IN.EXPR(5) => AP;
@BOX 6.1
DATAVEC SEQ($LO16)
%1057
%6000
%22 %8003
%6000
%A000
END
CODE.EXPR(AP, 9);
PL.CD.SEQ(^SEQ);
@BOX 7.1
END
@BOX 8.1
MONITOR(%1000);
@END
//17 22.JUL.83
@TITLE BSC05.30(1,11)
@COL 1S-2T-3R-4T-5T-6T-15R-7T-8R-9T-10R-11F
@COL 12R-13T-14R
@ROW 6-12
@FLOW 1-2N-3-4N-5N-6N-15-7N-8-9N-10-11
@FLOW 2Y-12
@FLOW 4Y-12
@FLOW 5Y-13N-14-7Y-9Y-5
@FLOW 13Y-12
@FLOW 6Y-12
@BOX 1.0
RESET
COMPILE reset-statement
@BOX 2.0
NEXT ITEM NOT #
@BOX 3.0
READ IN CHANNEL EXPRESSION
@BOX 4.0
NEXT ITEM NOT COMMA
@BOX 5.0
NEXT ITEM IF
@BOX 6.0
ITEM NOT A VALID RECORD SETTER
@BOX 7.0
FIRST OCCURRANCE OF RECORD CONTROL ITEM
@BOX 8.0
FAULT
@BOX 9.0
NEXT ITEM  ,
@BOX 10.0
PLANT CALL TO BIO.RESET
@BOX 11.0
END
@BOX 12.0
FAULT
@BOX 13.0
NEXT ITEM NOT THERE OR MISSING
@BOX 14.0
NOTE io-recovery SEEN
PROCESS io-recovery LABEL [BSC05.46]
@BOX 15.0
NOTE record-setter SEEN
@BOX 1.1
PROC RESET;
$IN M, N, CH.AP, REC.ST, IO.ST, S;
ITYPE IT;
@BOX 2.1
IF LBUFF[1 +> IPTR] /= HASH.D
@BOX 3.1
0 => M => REC.ST => IO.ST;
IN.EXPR(5) => CH.AP;
@BOX 4.1
IF LBUFF[1 +> IPTR] /= COMMA
@BOX 5.1
0 => N;
IF LBUFF[1 +> IPTR] => IT = D.IF
@BOX 6.1
IF ST OF IT & %80 = 0
    OR ST OF IT & %F - 5 => S < 0
    OR S > 3
@BOX 7.1
IF M & N = 0
@BOX 8.1
MONITOR(%1062);
@BOX 9.1
N !> M;
IF LBUFF[1 +> IPTR] = COMMA
@BOX 10.1
1 -> IPTR;
DATAVEC SEQ($LO16)
%1058
%6000
%22 %8003
%6000
%A000
END
CODE.EXPR(CH.AP, 9);
IO.ST ! REC.ST => G.LIT.16.0;
PL.CD.SEQ(^SEQ);
@BOX 11.1
END
@BOX 12.1
MONITOR(%1000);
@BOX 13.1
IF LBUFF[1 +> IPTR] => IT = D.THERE THEN
   1 => IO.ST
ELSE IF IT = D.MISSING THEN
   2 => IO.ST
ELSE
   0 => IO.ST
FI FI
IF IO.ST = 0
@BOX 14.1
2 => N;
IO.REC();
@BOX 15.1
%80 <<- S => REC.ST;
1 => N;
@END
//17 22.JUL.83
@TITLE BSC05.10.2.2(1,11)
@COL 1S-6T-7R-9R-10R-12F
@COL 13R
@ROW 7-13
@FLOW 1-6N-7-9-10-12
@FLOW 6Y-13-10
@BOX 1.0
USING SPECIFIER
@BOX 6.0
NEXT ITEM AN INTEGER?
@BOX 7.0
READ IN EXPRESSION [07]
@BOX 9.0
PLANT CALL TO BIO.ENC.RUN.FORMAT
@BOX 10.0
SET FORMATTED IN STATUS
SELECT NEW ATTRIBUTES
@BOX 12.0
END
@BOX 13.0
GET MUTL NAME FOR
IMAGE LINE[08]
PLANT CALL TO BIO FORMAT
@BOX 1.1
::USING SPECIFIER
@BOX 6.1
IF TAG OF LBUFF[IPTR+1]=TCONST
   AND ST OF LBUFF[IPTR+1] & %C7 = %40
@BOX 7.1
IN.EXPR(%6) => AP;
@BOX 9.1
CODE.STR.EXPR(AP, 0);
BEGIN
DATAVEC SEQ($LO16)
%100C
%6000
%A000
END
PL.CD.SEQ(^SEQ);
END
@BOX 10.1
%80 !> STATUS;
STAT.ATT[4+>STAT] => A;
@BOX 12.1
::END
@BOX 13.1
LAB(GET.LAB(),2) => LAB.MN;
BEGIN
DATAVEC SEQ($LO16)
%101E
%46 %83
%21 %8004
%6000
%A000
END
PL.CD.SEQ(^SEQ);
END
@END
///17 23.JUL.83
@TITLE BSC05.46(1,11)
@COL 2R
@COL 1S-5T-6T-3T-7R-8R-13F
@COL 20R-21R
@ROW 2-7-20
@FLOW 1-5N-6N-3N-7-8-13
@FLOW 5Y-20-8
@FLOW 6Y-21
@FLOW 3Y-2
@BOX 1.0
I/O RECOVERY
@BOX 2.0
FAULT
@BOX 3.0
SEARCH CONTROL STACK[BSC04]
FOR MOST RECENT DO OR FOR
NOT FOUND
@BOX 5.0
NEXT ITEM NOT EXIT?
@BOX 6.0
NEXT ITEM NOT DO OR FOR
@BOX 7.0
GET MUTL NAME FOR EXIT DO IF NECESSARY
GET MUTL NAME FOR EXIT
LABEL
@BOX 8.0
PLANT CALL TO BIO.SET.LABEL
@BOX 13.0
END
@BOX 20.0
GET LABEL
@BOX 21.0
SYNTAX FAULT
@BOX 1.1
PROC IO.REC;
ITYPE IT;
$IN I, J;
@BOX 2.1
MONITOR(J & 1 -: %103C);
@BOX 3.1
IF SRCH.CONSTK(J) => I < 0
@BOX 5.1
IF LBUFF[1+>IPTR]/=D.EXIT
@BOX 6.1
IF LBUFF[1+>IPTR] = D.DO THEN
   3 => J;
ELSE IF LBUFF[IPTR] = D.FOR THEN
   0 => J;
ELSE
   -1 => J;
FI FI
IF J < 0
@BOX 7.1
IF J = 0 THEN
   CON.STK[I - 4] + 1 => LAB.MN;
ELSE
   IF CON.STK[I - 1] => LAB.MN = 0 THEN
      TL.LABEL.SPEC(NIL, 1);
      1 +> LAST.MN => LAB.MN => CON.STK[I -1];
   FI
FI
@BOX 8.1
::MUTL NAME OF LABEL IN GLOBAL LAB.MN
DATAVEC SEQ($LO16)
%1005
%46 %30
%21 %8004
%6000
%A000
END;
PL.CD.SEQ(^SEQ);
@BOX 13.1
END
@BOX 20.1
1 -> IPTR;
LAB(GET.LAB(), 0) => LAB.MN;
@BOX 21.1
MONITOR(%1000);
@END

