@X @~
~V7 56 2 -5
~D10
~H                MUSS
~
~
~HVOLUME        16
~D10
~M~OSYSTEM MAINTENANCE UTILITIES~
~D10
~MUNIVERSITY OF MANCHESTER~
~V9 -1
~P
~D10
~MVolume 16  CONTENTS
~
~
~MSYM011  -  Download Library~
~
~NSYM021  -  ROM Tools~
~P
~D10
~H                    MUSS
~
~
~D10
~H            SYM011
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YSYM011
~S1~M~OSYM IMPLEMENTATION DESCRIPTION
~S1~M~OSection 1 Version 1
~S1~OSection 1.1 Download Library
~S1~O1. General Description
~S1~O1.1 Local Mode Commands
~S1~O1.1.1 Local Mode Commands Specifications
~S1~O1.1.2 The LOAD Sequence
~S1~O1.1.3 Store Usage
~S1~O1.1.4 Interrupt Vectoring
~S1~O1.1.5 Device Initialisation
~S1~O1.1.6 Monitor Start-Up
~S1~O1.2 Services Available
~S1~O1.2.1 Remote Mode - The TRANSMIT Sequence
~S1~O4. Compile Jobs
~X%`
~S4.1 Compiling the Downline Loading Library on VAX
~BThis compile job produces the DOWNLD5 library.~
~X%`
::BEGIN CDLD\ FOR PAGED MACHINES~
DO 0 CDLD\LOG %200~
ED MU6S:SYM011~
(FD/::VAX/)               *FOR MCZ*~
(FD/::PTV/)               *FOR MC5*~
(FD/::VAX/)               *FOR MC3*~
(FD/::MU6/)               *FOR MC7*~
(FD/::GEM/)              *FOR GEM*~
(FD/::PDP/)              *FOR MC2*~
EED~
(FD/SYS14.SEG.SHIFT/I/16/)     *FOR XMC3*~
(FD/SYS14.SEG.SHIFT/I/18/)     *FOR XMC5*~
(FD/SYS14.SEG.SHIFT/I/18/)     *FOR XMC7*~
E~
ED~
(FD/::HALFK PAGE /)     *FOR MC3*~
(FD/::1K PAGE /)     *FOR MC5*~
(FD/::1K PAGE /)     *FOR WL5* *FOR MC2*~
(FD/::2K PAGE /)     *FOR MC7*~
E
FLIP 0 1~
SYM01~
DI 4~
MUSL 0 DOWNLD\ 5 8~
**TLSEG 0 %0 %140000 -1     *FOR XMC3*~
**TLSEG 1 %0 %0 -3~
**TLSEG 2 %0 %150000 -3     *FOR XMC3*~
**TLSEG 3 %0 %160000 -3     *FOR XMC3*~
**TLSEG 0 %0 %500000 -1     *FOR XMC5*~
**TLSEG 2 %0 %540000 -3     *FOR XMC5*~
**TLSEG 3 %0 %580000 -3     *FOR XMC5*~
**TLSEG 0 %0 %500000 -1     *FOR XMC7*~
**TLSEG 2 %0 %540000 -3     *FOR XMC7*~
**TLSEG 3 %0 %580000 -3     *FOR XMC7*~
*TLLOAD 1 2;~
*TLLOAD 2 10;~
*TLLOAD 3 11;~
*INFORM %2400;~
**SELECTINPUT 4~
ENDINPUT 4~
STOP
::END CDLD FOR PAGED MACHINES~
~Y
~V9 -1
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H               SYM011
~V9 -1
~X%%
~F
@TITLE SYM01(1,11)

@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
DOWN LOAD
@BOX 4.0
PROCEDURES IN MODULE
     UTILITY PROCS
   1 LOAD
   2 OUT.SEG
   3 UPDATE
   4 FORMAT
   5 BOOT
@BOX 6.0
END
@BOX 1.1
MODULE (LOAD, OUT.SEG, UPDATE, FORMAT, BOOT);
@BOX 3.1
*GLOBAL 2;
ADDR PW0, PW1, PW2, PW3, PW4, PW5, PW6;
*GLOBAL 10;
LOGICAL8 [%4000] SRC;
*GLOBAL 11;
LOGICAL8 [%4000] FMT;
@BOX 4.1
PSPEC S.AND.W () / INTEGER;
PSPEC OUT.FN (LOGICAL64);
LSPEC LOAD (LOGICAL32, LOGICAL64, ADDR, LOGICAL8);
LSPEC OUT.SEG (INTEGER, INTEGER, LOGICAL64, LOGICAL8, INTEGER);
LSPEC UPDATE (LOGICAL64, LOGICAL8);
LSPEC FORMAT (LOGICAL64, INTEGER);
LSPEC BOOT (LOGICAL64, INTEGER)
PSPEC MAKE.NAME (LOGICAL64, ADDR [LOGICAL8])/ADDR [LOGICAL8];
   #SYM01/2
   #SYM01.1
   #SYM01.2
   #SYM01.3
   #SYM01.4
   #SYM01.5
PROC MAKE.NAME (FILE.N, NAME);
INTEGER I;
8 => I;
WHILE FILE.N /= 0 DO
   FILE.N => NAME^ [1 -> I];
   FILE.N ->> 8 => FILE.N;
OD
PART (NAME, I, 7) => MAKE.NAME;
END
@BOX 6.1
*END
@END

@TITLE SYM01/2(1,10)

@COL 1S
@BOX 1.0
UTILITY PROCEDURES
   S AND W
   OUT FN
@BOX 1.1
PROC S.AND.W;
INTEGER C.IN;
   BREAK.OUTPUT (-1);
   CURRENT.INPUT () => C.IN;
   SELECT.INPUT (0);
   PROMPT (%">>");
   BREAK.INPUT (0);
   IN.CH () - "@" => S.AND.W;
   SELECT.INPUT (C.IN);
END

PROC OUT.FN (WORD);
INTEGER I, J;
   FOR I < 8 DO
      (7-I) <<- 3 => J;
      OUT.CH (WORD ->> J & %FF);
   OD
END
@END

@TITLE SYM01.1(1,11)

@COL 11T-12R
@COL 1S-2T-3T-4R-5R-6R-7R-8R-14T-9R-10F
@COL 13R
@ROW 11-3
@ROW 12-5-13
@FLOW 1-2N-3Y-4-5-6-7-8-14YES-9-10
@FLOW 2Y-11Y-5
@FLOW 11N-12-10
@FLOW 3N-13-10
@FLOW 14NO-7
@BOX 1.0
LOAD (POSITION, FILE NAME, LIMIT, DENSITY)
@BOX 2.0
FILE = 0?
@BOX 3.0
OPEN FILE OK?
@BOX 4.0
INTERCHANGE SEGS
@BOX 5.0
OBTAIN LIMIT
@BOX 6.0
SET UP FOR OUTPUT
@BOX 7.0
OUTPUT DISC POSITION
@BOX 8.0
OUTPUT "CODE"
AND CHECKSUM
@BOX 9.0
TIDY UP
@BOX 10.0
END
@BOX 11.0
SEGMENT STATUS OK?
@BOX 12.0
SEGMENT DOES NOT EXIST
@BOX 13.0
UNABLE TO OPEN FILE
@BOX 14.0
TRANSFER OK?
@BOX 1.1
PROC LOAD (POSITION, FILE, LIMIT, DENSITY);
INTEGER COUNT, O.OUT, N.OUT, CH, SEG;
INTEGER32 CHECKSUM;
ADDR PTR, SEG.SIZE;
LOGICAL8 [8] F.NAME;
@BOX 2.1
IF FILE = 0
@BOX 3.1
OPEN.FILE (MAKE.NAME(FILE, ^F.NAME), 0, -1, %1E);
IF PW0 /= 0
@BOX 4.1
PW2 => SEG.SIZE;
INTERCHANGE (PW1 => SEG, 21);
@BOX 5.1
IF LIMIT =< 0 THEN
   SEG.SIZE => LIMIT;
   WHILE SRC [1 -> LIMIT] = 0 AND LIMIT > 256 DO OD
ELSE
   IF 1 -> LIMIT > SEG.SIZE THEN
      SEG.SIZE - 1 => LIMIT;
   FI
FI
@BOX 6.1
DEFINE.OUTPUT (-1, %"REP0*", %8000, %40000) => N.OUT;
CURRENT.OUTPUT () => O.OUT;
SELECT.OUTPUT (N.OUT);
@BOX 7.1
OUT.HDR (%"$N$N");
OUT.CH ("^");
(IF DENSITY = "D" THEN 6 ELSE
   (IF DENSITY = "S" THEN 5 ELSE 4)
) => CH;
OUT.CH (CH);
OUT.CH ("^");
32 => COUNT;
WHILE 4 -> COUNT >= 0 DO
   OUT.CH (POSITION ->> COUNT & %F + "A");
OD
@BOX 8.1
0 => COUNT => CHECKSUM;
::GEM POSITION +> CHECKSUM;
FOR PTR < LIMIT + 1 DO
   OUT.CH (SRC [PTR] => CH ->> 4 + "A");
   OUT.CH (CH & %F + "A");
   CH + CHECKSUM & %3F(7) => CHECKSUM;
   IF 1 +> COUNT = 24 THEN
      0 => COUNT;
      NEW.LINES (1);
   FI
OD
OUT.CH ("^");
32 => COUNT;
WHILE 4 -> COUNT >= 0 DO
   OUT.CH (CHECKSUM ->> COUNT & %F + "A");
OD
@BOX 9.1
SELECT.OUTPUT (O.OUT);
END.OUTPUT (N.OUT, 0);
RELEASE.SEGMENT (21);
IF FILE /= 0 THEN
   INTERCHANGE (SEG, 21);
FI
@BOX 10.1
END
@BOX 11.1
READ.SEGMENT.STATUS (21);
PW1 => SEG.SIZE;
IF PW0 = 0
@BOX 12.1
0 => PW0;
CAPTION (%"SEGMENT DOES NOT EXIST$L");
@BOX 13.1
0 => PW0;
CAPTION (%"UNABLE TO OPEN FILE$L");
@BOX 14.1
IF S.AND.W () /= 0
@END

@TITLE SYM01.2(1,11)

@COL 1S-2R-6T-7T-8R-3R-4R-5F
@FLOW 1-2-6PAGED-7OK-8-3-4-5
@FLOW 6UNPAGED-3
@FLOW 7FAIL-5
@BOX 1.0
OUT.SEG (SECTOR, SECTOR COUNT, FN, DENSITY, PAGE TABLE SIZE)
@BOX 2.0
CALCULATE TRANSFER SIZE
@BOX 3.0
DOWN LINE LOAD
@BOX 4.0
COMPLETION MESSAGE
@BOX 5.0
END
@BOX 6.0
PAGED OR UNPAGED?
@BOX 7.0
CREATE SEGMENT FOR
PAGE TABLE
@BOX 8.0
CREATE PAGE TABLE AND
LOAD TO DISC
@BOX 1.1
PROC OUT.SEG (SECTOR, SEC.COUNT, FN, DENSITY, PT.SIZE);
INTEGER I, TEMP;
ADDR TRAN.SIZE;
ADDR [LOGICAL8] SEG.PTR;
INTEGER P.SIZE, P.DIV, PT.GAP, OFFSET;
@BOX 2.1
::HALFK PAGE 512 => P.SIZE; 2 => P.DIV; 8 => PT.GAP;
::1K PAGE 1024 => P.SIZE; 4 => P.DIV; 4 => PT.GAP;
::2K PAGE 2048 => P.SIZE; 8 => P.DIV; 2 => PT.GAP;
::4K PAGE 4096 => P.SIZE; 16 => P.DIV; 1 => PT.GAP;
::VAX 1 => PT.GAP;
0 => OFFSET;
::PTV 32 => OFFSET;
::GEM 32 => OFFSET;
::RTV 32 => OFFSET;
SEC.COUNT <<- 8 => TRAN.SIZE;
IF DENSITY = "S" THEN
   SECTOR <<- 1 => SECTOR;
   SEC.COUNT <<- 1 => SEC.COUNT;
ELSE
   "D" => DENSITY;
FI
@BOX 3.1
LOAD (SECTOR + OFFSET, FN, TRAN.SIZE, DENSITY);
@BOX 4.1
CAPTION (%"OUT.SEG");
OUT.I (SECTOR, 6);
OUT.I (SEC.COUNT, 6);
SPACES (1);
OUT.FN (FN);
CAPTION (%"  COMPLETE AT ");
OUT.TIME ();
NEW.LINES (1);
@BOX 5.1
END
@BOX 6.1
IF PT.SIZE = 0
@BOX 7.1
CREATESEGMENT (21, P.SIZE);
IF PW0 /= 0
@BOX 8.1
MAKE (LOGICAL8, P.SIZE, 21 <<- SYS14.SEG.SHIFT) => SEG.PTR;
IF PT.SIZE < 0 THEN
   SEC.COUNT => PT.SIZE;
FI
FOR I < PT.SIZE / P.DIV DO
   SECTOR / P.DIV + I + PT.GAP => TEMP;
   TEMP => SEG.PTR^ [I * 4 + 3];
   TEMP ->> 8 => SEG.PTR^ [I * 4 + 2];
   1 => SEG.PTR^ [I * 4];
OD
LOAD (SECTOR + OFFSET, 0, P.SIZE, DENSITY);
PT.GAP * P.DIV +> SECTOR;
@END

@TITLE SYM01.3(1,11)

@COL 8R
@COL 1S-7T-2T-4R-5F
@COL 6R
@ROW 8-4-6
@FLOW 1-7N-2Y-4-5
@FLOW 2N-6-5
@FLOW 7Y-8-5
@BOX 1.0
UPDATE (MNEM, DENSITY)
@BOX 2.0
UPDATE ENTITY EXISTS?
@BOX 4.0
UPDATE COMMON SEGMENTS
@BOX 5.0
END
@BOX 6.0
NAME NOT RECOGNIZED
@BOX 7.0
IS ENTITY BOOTSTRAP?
@BOX 8.0
UPDATE BOOTSTRAP
@BOX 1.1
PROC UPDATE (MNEM, DENSITY);
LITERAL / INTEGER    BASIC.SYSTEM = 4;
INTEGER UPD.TYPE, VERSION, I, LIMIT;
:: UPDATE DATAVECS
::RTV #SYM01.3.1
::PTV #SYM01.3.2
::VAX #SYM01.3.3
::MU6 #SYM01.3.4
::GEM #SYM01.3.2
::PDP #SYM01.3.6
@BOX 2.1
-1 => UPD.TYPE;
WHILE 1 +> UPD.TYPE < NO.OF.UPDS AND
   MNEMS [UPD.TYPE] /= MNEM DO OD
IF UPD.TYPE = NO.OF.UPDS
@BOX 4.1
ENTRY.NO [UPD.TYPE] => I;
ENTRY.NO [UPD.TYPE + 1] => LIMIT;
IF UPD.TYPE < BASIC.SYSTEM THEN
   WHILE I < LIMIT DO
      OUT.SEG (V1.D.ADDR [I], V1.D.SIZE [I],
         FILE.NAME [I], DENSITY,PT.SIZE[I]);
      1 +> I;
   OD
ELSE
   WHILE I < LIMIT DO
      OUT.SEG (V1.D.ADDR [I], V1.D.SIZE [I],
         FILE.NAME [I], DENSITY,PT.SIZE[I]);
      1 +> I;
   OD
FI
@BOX 5.1
END
@BOX 6.1
CAPTION (%"NAME NOT RECOGNIZED$L");
@BOX 7.1
IF MNEM = "BOOT"
@BOX 8.1
(IF DENSITY /= "S" THEN 2 ELSE 1) => I;
OUT.SEG (-16, 0, I <<- 8 ! "PBOOT50F", "S", 0);
OUT.SEG (0, 16, "BOOT50" ! I, DENSITY, 0);
FOR I < SIZE (^SR.NAMES) DO
   OUT.SEG (SR.D.ADDR [I], 16,
      SR.NAMES [I], DENSITY, 0);
OD
@END

@TITLE SYM01.3.1(1,11)

@COL 1S
@BOX 1.0
UPDATE DATAVECS
@BOX 1.1
LITERAL NO.OF.UPDS = 15;
DATAVEC MNEMS (LOGICAL64)
   "SYS" "LIB" "DIR" "UTL" "MSL" "MSL"
   "MRD" "DOC" "MFN" "CWU"
   "FIO" "FTN" "PAS" "PIO"
   "COPY"
END
DATAVEC FILE.NAME (LOGICAL64)
   :: SYS
   "BSYSZ13" "BSYSZ14" "BSYSZ15" "BSYSZ16"
   :: LIB
   "BLIBZ18"
   :: DIR
   "TLDIRZ1"
   :: UTL
   "BUTLZ100"
   :: END OF BASIC SYSTEM
   "BMSLZ100" "BMTLZ100" "BMTLZ110"
   "BMRDZ100" "BDOCZ100" "BMFNZ100"
   :: ONE VERSION ONLY
   "BCWUZ00"
   "ACOPYBIN"
END
DATAVEC V1.D.ADDR (INTEGER32)
   112 240
   384 368
   984 916
   ????
   2284
   2544 2804
   2024
   1504
   1764
   1244
   48
END
DATAVEC V1.D.SIZE (INTEGER16)
   128 128
   192  16
   256  64
   ????
   256
   256 256
   256
   256
   256
   256
   16
END
DATAVEC PT.SIZE (INTEGER);
   0 [4]
   -1 -1
   ???
   -1 512 0
   -1 [4]
   0
END
DATAVEC ENTRY.NO (INTEGER8)
   0 4 5 6 7 8
   10 11 12 13 14
END
DATAVEC SR.NAMES (LOGICAL64)
   "SR53" "SR55" "SR55M"
END
DATAVEC SR.D.ADDR (INTEGER32)
::?   48 80 64
END
@END

@TITLE SYM01.3.2(1,11)

@COL 1S
@BOX 1.0
UPDATE DATAVECS
@BOX 1.1
LITERAL NO.OF.UPDS = 17;
DATAVEC MNEMS (LOGICAL64)
   "SYS" "LIB" "DIR" "UTL" "MSL" "MTL"
   "MRD" "DOC" "MFN" "CWU"
   "FIO" "PIO" "BIO" "CIO" "COPY"
   "MON" "DON"
END
DATAVEC FILE.NAME (LOGICAL64)
   :: SYS
   "BSYS5110" "BSYS5120" "BSYS5100" "BSYS5130"
   "BSYS5150"
   :: LIB
   "BLIB5100"
   :: DIR
   "TLDIR51"
   ::UTL
   "BUTL5100"
   :: END OF BASIC SYSTEM
   "BMSL5100" "BMTL5100" "BMTL5101"
   "BMRD5100" "BDOC5100" "BMFN5100"
   "BCWU5100" "BFIO5100"
   "BPIO5100" "BBIO5100" "BCIO5100"
   ::PTV "BROM530"
   ::GEM "BMON30"
   :: GEMSTONE MONITOR
   "BMON00" "BMON00"
END
DATAVEC V1.D.ADDR (INTEGER32)
   64 256 512 784
   448
   896 864
   3488
   2080
   2368 2624
   1824
   1440
   1728
   1184
   2880
   3072
   3200
   3776
   ::PTV 48
   ::GEM 32
   %1FE0 0
END
DATAVEC V1.D.SIZE (INTEGER16)
  192 192 256  64
    64
   256  32
   256
   256
   256 256
   256
   256
   256
   256
160   128   256  128
128
   128 128
END
DATAVEC PT.SIZE (INTEGER);
   0 0 0 0
   0
   0  0
   0
   0 0 0
   0 0 0
   0 0 0
   0
   0
   0
   0 0
END
DATAVEC ENTRY.NO (INTEGER8)
   0 5 6 7 8 9
   11 12 13 14 15
   16 17 18 19 20 21 22
END
DATAVEC SR.NAMES (LOGICAL64)
   "SR53" "SR55" "SR55M"
END
DATAVEC SR.D.ADDR (INTEGER32)
::?   48 80 64
END
@END

@TITLE SYM01.3.3(1,11)

@COL 1S
@BOX 1.0
UPDATE DATAVECS
@BOX 1.1
LITERAL NO.OF.UPDS = 11;
DATAVEC MNEMS (LOGICAL64)
   "SYS" "LIB" "DIR" "UTL" "MSL" "MTL"
   "MRD" "DOC" "MFN" "CWU"
   "MON"
END
DATAVEC FILE.NAME (LOGICAL64)
   :: SYS
   "BSYS3100" "BSYS3110" "BSYS3120" "BSYS3130" "BSYS3140"
   :: LIB
   "BLIB3100"
   :: DIR
   "TLDIR31"
   ::UTL
   "BUTL3100"
   :: END OF BASIC SYSTEM
   "BMSL3100" "BMTL3100" "BMTL3110"
   "BMRD3100" "BDOC3100" "BMFN3100"
   "BCWU3100"
   "BBST3100" "BMON3100" "BMON3120" "BMON3130"
   "BPMD3100"
END
DATAVEC V1.D.ADDR (INTEGER32)
       800    160    416    672   736
      1088
      1056
      1344
      1984   2240   2496
      1728   2624   1600
      2880
      0   2   34   66
      98
END
DATAVEC V1.D.SIZE (INTEGER16)
       256    256    256     64    64
       256
        32
       256
       256    256    128
       256    256    128
       256
       2   32   32   32
       8
END
DATAVEC PT.SIZE (INTEGER);
   0 [20]
END
DATAVEC ENTRY.NO (INTEGER8)
   0 5 6 7 8 9 11
   12 13 14
   15 20
END
DATAVEC SR.NAMES (LOGICAL64)
   "SR53" "SR55" "SR55M"
END
DATAVEC SR.D.ADDR (INTEGER32)
::?   48 80 64
END
@END

@TITLE SYM01.3.4(1,11)

@COL 1S
@BOX 1.0
UPDATE DATAVECS
@BOX 1.1
LITERAL / INTEGER NO.OF.UPDS = 15;
DATAVEC MNEMS (LOGICAL64)
   "SYS" "LIB" "DIR" "MSL"
   "MTL" "MRD" "DOC" "MFN"
   "CWU" "UTL" "FIO" "FTN" "PAS"
   "PIO" "MON"
END
DATAVEC FILE.NAME (LOGICAL64)
   :: SYS
   "BSYS7110" "BSYS7120" "BSYS7100"
   "BSYS7130" "BSYS7140"
   :: LIB
   "BLIB7100"
   :: DIR
   "TLDIR71"
   :: END OF BASIC SYSTEM
   "BMSL7100" "BMTL7100" "BMTL7101"
   "BMRD7100" "BDOC7100" "BMFN7100"
   :: ONE VERSION ONLY
   "BCWU7100" "BUTL7100"
   "BFIO7100" "BFTN700" "BFTN701"
   "BPAS7100" "BPAS7110" "BPAS7120" "BPAS7121"
   "BPIO7100"
   "BMON7100" "BMON7120" "BMON7130"
END
DATAVEC V1.D.ADDR (INTEGER32)
      1280 1792 256
   3648 3328
   2304
   3392
   3904 4416 4672
   5440 6208 5952
   7232 6720
   27456 26432 26688
   24384 24640 24896 25152
   25408
   0 128 192
END
DATAVEC V1.D.SIZE (INTEGER16)
   1024 [26]
END
DATAVEC PT.SIZE (INTEGER);
   0 [26]
END
DATAVEC ENTRY.NO (INTEGER8)
   0  5  6  7  8
   10 11 12 13 14
   15 16 18 22
   23 26
END
DATAVEC SR.NAMES (LOGICAL64)
 0
END
DATAVEC SR.D.ADDR (INTEGER32)
 0
END
@END

@TITLE SYM01.3.5(1,11)

@COL 1S
@BOX 1.0
UPDATE DATAVECS
@BOX 1.1
LITERAL NO.OF.UPDS = 14;
DATAVEC MNEMS (LOGICAL64)
   "SYS" "LIB" "DIR" "UTL" "MSL" "MTL"
   "MRD" "DOC" "MFN" "CWU"
   "FIO" "PIO" "COPY"
   "MON"
END
DATAVEC FILE.NAME (LOGICAL64)
   :: SYS
   "BSYS5110" "BSYS5120" "BSYS5100" "BSYS5130"
   "BSYS5150"
   :: LIB
   "BLIB5100"
   :: DIR
   "TLDIR51"
   ::UTL
   "BUTL5100"
   :: END OF BASIC SYSTEM
   "BMSL5100" "BMTL5100" "BMTL5101"
   "BMRD5100" "BDOC5100" "BMFN5100"
   "BCWU5100" "BFIO5100"
   "BPIO5100"
   "BROM530"
   :: GEMSTONE MONITOR
   "BMON00"
END
DATAVEC V1.D.ADDR (INTEGER32)
   64 256 512 784
   448
   896 864
   3488
   2080
   2352 2624
   1808
   1440
   1712
   1168
   2880
   3056
   48
   %1FE0
END
DATAVEC V1.D.SIZE (INTEGER16)
  192 192 256  64
    64
   256  32
   256
   256
   256 256
   256
   256
   256
   256
160   128
128
   128
END
DATAVEC PT.SIZE (INTEGER);
   0 0 0 0
   0
   0  0
   0
0
::GEM 256 256
   -1 0 -1
   -1 0 0

   0
   0
END
DATAVEC ENTRY.NO (INTEGER8)
   0 5 6 7 8 9
   11 12 13 14 15
   16 17 18 19
END
DATAVEC SR.NAMES (LOGICAL64)
   "SR53" "SR55" "SR55M"
END
DATAVEC SR.D.ADDR (INTEGER32)
::?   48 80 64
END
@END

@TITLE SYM01.3.6(1,11)

@COL 1S
@BOX 1.0
UPDATE DATAVECS
@BOX 1.1
LITERAL NO.OF.UPDS = 9;
DATAVEC MNEMS (LOGICAL64)
   "SYS" "LIB" "DIR" "MVL" "MSL" "MTL"
   "DOC" "MON" "FEP"
END
DATAVEC FILE.NAME (LOGICAL64)
   :: SYS
   "BSYS2100" "BSYS2110" "BSYS2120" "BSYS2130" "BSYS2140"
   "BSYS2150" "BSYS2160" "BSYS2170" "BSYS2180" "BSYS2190"
   :: LIB
   "BLIB2100" "BLIB2110" "BLIB2120" "BLIB2130" "BLIB2140"
   :: DIR
   "TLDIR21"
   :: END OF BASIC SYSTEM
   "BMVL2100"
   "BMSL2100" "BMSL2110" "BMSL2120"
   "BMTL2100" "BMTL2110" "BMTL2120"
   "BDOC2100" "BDOC2110" "BDOC2120" "BDOC2130"
   "BBST2100" "BMON2100" "BCPY2100" "BFMT2100"
   "BFEP7100" "BFEP7110" "BFEP7120"
END
DATAVEC V1.D.ADDR (INTEGER32)
   516  324  612  420  960 484 580 896 992 388
   676  2400 836  3104 2432
   3392
   2976
   2528 2624 2656
   2752 2784 2848
   3040 3008 3840 3136
   0    4    36    68
   1536 1280 1408
END
DATAVEC V1.D.SIZE (INTEGER16)
   64  64  64  64  32  32  32 64 32 32
   160 32  32  32  32
   32
   32
   96  32  32
   32  64  128
   64  32  128 64
   4    32    32    32
   96 80 8
END
DATAVEC PT.SIZE (INTEGER);
   0[35]
END
DATAVEC ENTRY.NO (INTEGER8)
   0 10 15 16 17 20 23 27 31 34
END
DATAVEC SR.NAMES (LOGICAL64)
   "SR53" "SR55" "SR55M"
END
DATAVEC SR.D.ADDR (INTEGER32)
::?   48 80 64
END
@END

@TITLE SYM01.4(1,11)

@COL 21N-17R-23N
@COL 1S-2T-3R-4T-5R-25R-6R-7R-22N-8T-9T-10R-24N-11R-14F
@COL 15R-16R-20N
@ROW 3-15
@ROW 5-16
@ROW 10-17
@ROW 21-22
@ROW 23-24
@FLOW 1-2YES-3-4YES-5-25-6-7-22-8NO-9NO-10-24-23-21-22
@FLOW 8YES-11-14
@FLOW 2NO-15-20-14
@FLOW 4NO-16-20
@FLOW 9YES-17-23
@BOX 1.0
FORMAT (FILE NAME, REQ SIZE)
@BOX 2.0
OPEN FILE OK?
@BOX 3.0
GET REQUIRED SIZE
@BOX 4.0
CREATE SEGMENT OK?
@BOX 5.0
INTERCHANGE SEGMENTS
@BOX 6.0
FORMAT FIRST SECTOR
@BOX 7.0
INITIALIZE VARIABLES FOR
FORMATTING INTERMEDIATE
SECTORS
@BOX 8.0
END OF "INPUT"?
@BOX 9.0
END OF SECTOR?
@BOX 10.0
PROCESS SOURCE
@BOX 11.0
FORMAT EXIT SEQUENCE
#SYM01.4.2
@BOX 14.0
END
@BOX 15.0
UNABLE TO OPEN FILE
@BOX 16.0
UNABLE TO CREATE SEGMENT
@BOX 17.0
SET UP SECTOR HEADER
@BOX 25.0
DEAL WITH DEFAULT CONDITION
@BOX 1.1
PROC FORMAT (FILE.NAME, REQ.SIZE);
LITERAL / LOGICAL8 SP = %20, CR = %D;
INTEGER SRC.I, FMT.I, I, MOD, SRC.SEG, FMT.SEG,
   CURR.SIZE;
LOGICAL8 [8] F.NAME;
LOGICAL16 ADDRESS;
LOGICAL8 CH;
DATAVEC HEX (LOGICAL8)
   "0123456789ABCDEF"
END
DATAVEC SECTOR.0.HDR (LOGICAL8)
   %40 "X0000 " :: HEADER
   "00 05 00 00 " :: GIVES INITIAL SSP OF %D0000
   "00 00 F0 00 " :: GIVES INITAL PC OF %8F000
END
@BOX 2.1
OPEN.FILE (MAKE.NAME (FILE.NAME, ^F.NAME), 0, -1, %1E);
IF PW0 /= 0
@BOX 3.1
PW1 => SRC.SEG;
IF REQ.SIZE =< 0 OR REQ.SIZE > PW2 THEN
   PW2 => REQ.SIZE => CURR.SIZE;
ELSE
   0 => CURR.SIZE;
FI
@BOX 4.1
CREATE.SEGMENT (-1, %10000);
IF PW0 /= 0
@BOX 5.1
INTERCHANGE (PW1 => FMT.SEG, 22);
INTERCHANGE (SRC.SEG, 21);
@BOX 6.1
-1 => FMT.I;
FOR I < SIZE (^SECTOR.0.HDR) DO
   SECTOR.0.HDR [I] => FMT [1 +> FMT.I];
OD
7 => I;
WHILE 1 +> I < 40 DO
   "0" => FMT [1 +> FMT.I] => FMT [1 +> FMT.I];
   SP => FMT [1 +> FMT.I];
OD
@BOX 7.1
0 => MOD;
-1 => SRC.I;
%F000 => ADDRESS;
39 => I;
@BOX 8.1
IF SRC.I >= REQ.SIZE
@BOX 9.1
IF 1 +> I = 40
@BOX 10.1
1 +> SRC.I;
HEX [SRC [SRC.I] => CH ->> 4] => FMT [1 +> FMT.I];
HEX [CH & %F] => FMT [1 +> FMT.I];
SP => FMT [1 +> FMT.I];
@BOX 11.1
:: FORMAT EXIT SEQUENCE
#SYM01.4.2
@BOX 14.1
END
@BOX 15.1
0 => PW0;
CAPTION (%"UNABLE TO OPEN FILE$L");
@BOX 16.1
0 => PW0;
CAPTION (%"UNABLE TO CREATE SEGMENT$L");
@BOX 17.1
:: SET HEADER
#SYM01.4.1
-1 => I;
@BOX 25.1
IF CURR.SIZE /= 0 THEN
   WHILE SRC [1 -> CURR.SIZE] = 0 DO OD
   IF CURR.SIZE & 1 + 8 +> CURR.SIZE < REQ.SIZE THEN
      CURR.SIZE => REQ.SIZE;
   FI
FI
@END

@TITLE SYM01.4.1(1,10)

@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
SET HEADER
@BOX 2.0
PROCESS ADDRESS ETC
@BOX 3.0
END
@BOX 1.1
:: SET HEADER
BEGIN
INTEGER SHIFT;
@BOX 2.1
CR => FMT [1 +> FMT.I];
:: MARK END OF PREVIOUS SECTOR
1 +> MOD & %1F => FMT [1 +> FMT.I];
"X" => FMT [1 +> FMT.I];
16 => SHIFT;
WHILE 4 -> SHIFT >= 0 DO
   HEX [ADDRESS ->> SHIFT & %F] => FMT [1 +> FMT.I];
OD
SP => FMT [1 +> FMT.I];
40 +> ADDRESS;
@BOX 3.1
END
@END

@TITLE SYM01.4.2(1,11)

@COL 1S-11R-12R-2F
@FLOW 1-11-12-2
@BOX 1.0
FORMAT EXIT SEQUENCE
@BOX 2.0
END
@BOX 11.0
FORMAT FINAL SECTOR
@BOX 12.0
TIDY UP
@BOX 1.1
:: FORMAT EXIT SEQUENCE
BEGIN
@BOX 2.1
END
@BOX 11.1
IF I >= 0 THEN
   WHILE 1 +> I < 40 DO
      "0" => FMT [1 +> FMT.I] => FMT [1 +> FMT.I];
      SP => FMT [1 +> FMT.I];
   OD
   :: SET HEADER
   #SYM01.4.1
FI
%80 !> FMT [FMT.I - 6];
:: MARK AS FINAL SECTOR
CR => FMT [1 +> FMT.I];
"E" => FMT [1 +> FMT.I];
"N" => FMT [1 +> FMT.I];
"D" => FMT [1 +> FMT.I];
CR => FMT [1 +> FMT.I];
FOR 116 DO
   0 => FMT [1 +> FMT.I];
OD
@BOX 12.1
OUT.I (1 +> FMT.I, 6);
CAPTION (%" BYTES OF FORMATTED CODE$L");
IF FMT.I > %F00 THEN
   CAPTION (%">>>***FORMAT LIMIT EXCEEDED$L");
FI
CHANGE.SIZE (22, FMT.I);
INTERCHANGE (21, SRC.SEG);
INTERCHANGE (22, FMT.SEG);
RELEASE.SEGMENT (SRC.SEG);
FILE (MAKE.NAME(FILE.NAME <<- 8 ! "F", ^F.NAME), 0, FMT.SEG);
IF PW0 = 0 THEN
   RELEASE.SEGMENT (FMT.SEG);
ELSE
   0 => PW0;
   CAPTION (%"UNABLE TO FILE FORMATTED CODE$L");
   CAPTION (%"SEGMENT NUMBER = ");
   OUT.I (FMT.SEG, 0);
   NEW.LINES (1);
FI
@END

@TITLE SYM01.5(1,10)
@COL 7R
@COL 1S-2R-3T-4T-5R-6R-9N-10F
@COL 8R
@ROW 7-6-8
@FLOW 1-2-3OK-4OK-5-6-9-10
@FLOW 3WRONG NAME-8-9
@FLOW 4INV. VERSION-7-9
@BOX 1.0
PROC BOOT (MNEM, VERSION)
@BOX 2.0
OPEND DIRECTORY MUSM
@BOX 3.0
BOOT NAME VALID ?
@BOX 4.0
VERSION VALID ?
@BOX 5.0
GET TRANSFER LIMITS
@BOX 6.0
TRANSFER ALL FILES
@BOX 7.0
ILLEGAL VERSION
@BOX 8.0
NAME NOT RECOGNISED
@BOX 10.0
END
@BOX 1.1
PROC BOOT (MNEM, VERSION);
INTEGER F.INDEX, F.END, BOOT.TYPE;
LOGICAL64 FILE.NAME;
:: BOOT DATAVECS
   #SYM01.5.1
@BOX 2.1
@BOX 3.1
-1 => BOOT.TYPE;
WHILE 1 +> BOOT.TYPE < SIZE (^BOOT.NAME) AND
   BOOT.NAME [BOOT.TYPE] /= MNEM DO OD
IF BOOT.TYPE = SIZE (^BOOT.NAME)
@BOX 4.1
IF BOOT.TYPE < TWO.VERSIONS THEN
   IF VERSION = 0 THEN
      1 => VERSION
   ELSE
      IF VERSION > 2 THEN
         -1 => VERSION
      FI
   FI
ELSE
   IF VERSION /= 0 THEN
      -1 => VERSION
   FI
FI
IF VERSION < 0
@BOX 5.1
ENTRY.NO [BOOT.TYPE] => F.INDEX;
ENTRY.NO [BOOT.TYPE + 1] => F.END;
@BOX 6.1
WHILE F.INDEX < F.END DO
   LOAD (C.ADDR [F.INDEX],
      F.NAME [F.INDEX] ! VERSION => FILE.NAME, 0, 0);
   OUT.FN (FILE.NAME );
   CAPTION (%"  loaded at ");
   OUT.TIME ();
   NEW.LINES (1);
   1 +> F.INDEX;
OD
CAPTION (%"$LBootstrap loading completed$L");
@BOX 7.1
CAPTION (%"illegal version");
@BOX 8.1
CAPTION (%"Name not recognised");
@BOX 10.1
END
@END
@TITLE SYM01.5.1(1,10)
@COL 1S
@BOX 1.0
BOOTSTRAP DATAVECS
@BOX 1.1
DATAVEC BOOT.NAME (LOGICAL64)
   "MUSS"
END
DATAVEC F.NAME (LOGICAL64)
   "MC68030" "MC68040" "MC68050" "MC68080" "LIBDIR50" "MC68060"
END
DATAVEC C.ADDR (LOGICAL32)
   %80C00 %A0000 %88000 %94000 %A6000 %B0000
END
DATAVEC ENTRY.NO (INTEGER)
   0 6
END
LITERAL TWO.VERSIONS = 1;
@END
