@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            SYS221
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                           ISSUE 11~
~V9 -1
~P
~V9 1
~YSYS221
~S1~M~OSYS IMPLEMENTATION DESCRIPTION.
~S1~M~OSection 22. Version 1.
~S1~OSection 22.1. System maintenance.
~S1~O1. General Description.
~BThis module provides the facility to update common segments of
the system.
~S1~O2. Interfaces.~
~
Other modules used~
~
   Section  3. (Drum manager)~
   Section 13. (Process management)~
   Section 14. (Virtual store manager)~
   Section 16. (File management)~
~
~
Organisational commands~
~
   UPDATE.CS(FILENAME,VERSION,COMMON.SEG,PT.FLAG,PAGE.T.SIZE)~
~S1~O2.1. Hardware Interface.~
~
   None.~
~S1~O2.2. Software Interface.~
~
   None.~
~S1~O3. Implementation.
~S1~O3.1. Outline of Operation.
~BThe operation of this module is straightforward.
~S1~O3.2. Data Structures.~
~
   None.~
~S1~O3.3. Special Notes.~
~
   None.~
~Y
~V9 -1
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H                SYS221
~V9 -1
~F
@TITLE SYS22(1,11)

@COL 1S-2R-3R-4R-5R-6F

@FLOW 1-2-3-4-5-6

@BOX 1.0
SYSTEM MAINTENANCE
@BOX 4.0
PROCEDURES IN MODULE:
   INT1 WRITE CS
   CMD1 UPDATE CS
@BOX 6.0
END
@BOX 1.1
#SYS22/1
MODULE SYS22 (UPDATE.CS);
@BOX 4.1
*CODE 2;
PSPEC WRITE.CS (INTEGER, INTEGER);
   #SYSINT22.1
*CODE 15;
LSPEC UPDATE.CS (ADDR [LOGICAL8], INTEGER, INTEGER, INTEGER, INTEGER);
   #SYSCMD22.1
@BOX 6.1
*END
@END


@TITLE SYS22/1(1,11)

@COL 1S-2R-3R-4R

@FLOW 1-2-3-4

@BOX 1.0
EXTERNAL ENVIRONMENT
@BOX 2.0
OTHER MODULES USED
   SYS03 DRUM MANAGER
   SYS13 PROCESS MANAGER
   SYS14 VIRTUAL STORE MANAGER
   SYS16 FILE MANAGER
@BOX 1.1
::EXTERNAL ENVIRONMENT
@BOX 2.1
IMPORT LITERAL INITIAL.DATA.SEG, INITIAL.DATA.MAPPED.SEG, NO.OF.INITIAL.DATA.SEG
S;
INTEGER VERSION.NO;
INTEGER [NO.OF.INITIAL.DATA.SEGS] DRUM.ADDRS1, DRUM.ADDRS2;
PSPEC VALIDATE (ADDR, LOGICAL) / INTEGER;
@BOX 3.1
PSPEC SYS03.TRANSFER.DRUM.BLOCK.PAGES (LOGICAL, INTEGER, INTEGER,
   INTEGER, INTEGER) / INTEGER;
PSPEC SYS13.INT.PROC (LOGICAL, LOGICAL);
PSPEC SYS13.ENTER.INT.LEVEL (ADDR SYS13.INT.PROC, LOGICAL, LOGICAL);
IMPORT LITERAL SYS14.PAGE.SHIFT, SYS14.ON.DRUM, SYS14.PAGE.SIZE;
IMPORT LITERAL ADDR SYS14.SEG.SIZE;
PSPEC SYS14.GET.BLOCK (INTEGER, INTEGER) / INTEGER32;
PSPEC SYS14.REL.BLOCK (INTEGER32);
PSPEC SYS14.CMD.MAP (INTEGER, INTEGER);
PSPEC CREATE.SEGMENT (INTEGER, ADDR);
PSPEC RELEASE.SEGMENT (INTEGER);
PSPEC OPEN.FILE (ADDR[LOGICAL8], LOGICAL64, INTEGER, LOGICAL);
ADDR PW0, PW1, PW2, PW3;
@END


@TITLE SYSINT22.1(1,9)

@COL 1S-2T-3R-4R-5R
@COL 6F


@ROW 3-6

@FLOW 1-2NO-3-4-5-2YES-6

@BOX 1.0
WRITE CS (SIZE / SEG, ADDRESS)
@BOX 2.0
AT END OF COMMON SEGMENT?
@BOX 3.0
GET BLOCK OF FILE
[SYS14]
@BOX 4.0
REQUEST DRUM TRANSFER
[SYS03]
@BOX 5.0
RELEASE BLOCK OF FILE
[SYS14]
@BOX 6.0
END
@BOX 1.1
PROC WRITE.CS (SIZE.SEG, CSEG.ADDR);
INTEGER BLOCK, SEG.SIZE, FILE.SEG;
INTEGER32 CORE.ADDR;
0 => BLOCK;
SIZE.SEG / 256 => SEG.SIZE;
SEG.SIZE * 256 -: SIZE.SEG => FILE.SEG;
@BOX 2.1
IF 1 -> SEG.SIZE < 0
@BOX 3.1
SYS14.GET.BLOCK (FILE.SEG, BLOCK) => CORE.ADDR;
@BOX 4.1
SYS03.TRANSFER.DRUM.BLOCK.PAGES (0, CSEG.ADDR + BLOCK,
   CORE.ADDR ->> SYS14.PAGE.SHIFT, 1, 1);
1 +> BLOCK;
@BOX 5.1
SYS14.REL.BLOCK (CORE.ADDR);
@BOX 6.1
END
@END


@TITLE SYSCMD22.1(1,11)

@COL 1S-13T-12R-2T-3T-4R-11T-10T-5R-6R-7R-8F
@COL 14R-9R-15N

@ROW 14-12
@ROW 5-9

@FLOW 1-13OK-12-2OK-3NO-4-11NO-10PAGE TABLE-5-6-7-8
@FLOW 2FAIL-8
@FLOW 3YES-9-15-8
@FLOW 11YES-9
@FLOW 10NONE-6
@FLOW 13FAIL-14-15

@BOX 1.0
UPDATE CS (FILE NAME, VERSION, COMMON SEG, PAGE TABLE SIZE)
@BOX 2.0
OPEN FILE
@BOX 3.0
IF COMMON SEGMENT INVALID?
@BOX 4.0
NOTE SIZE AND DISC ADDRESS
OF COMMON SEGMENT
@BOX 5.0
CREATE PAGE TABLE
@BOX 6.0
ENTER INTERRUPT LEVEL TO
COPY FILE TO DRUM
@BOX 7.0
RELEASE FILE SEGMENT
@BOX 8.0
END
@BOX 9.0
RELEASE FILE SEGMENT AND
RETURN FAULT STATUS -50
(ILLEGAL PARAMETER)
@BOX 10.0
PAGE TABLE NEEDED?
@BOX 11.0
IS VERSION VALID?
@BOX 12.0
FIND PAGE TABLE SIZE
@BOX 13.0
VALIDATE FILE NAME
@BOX 14.0
RETURN FAULT STATUS -8
(VALIDATE FAIL)
@BOX 1.1
PROC UPDATE.CS (F.NAME, VER, C.SEG, PT.FLAG, PAGE.T.SIZE);
INTEGER FILE.SEG, FILE.SIZE, CSEG.SIZE, CSEG.ADDR, MAPPED.SEG,
   PT.SEG, I, CSEG.ADDR1, CSEG.ADDR2, PT.SIZE, PS.FACTOR;
ADDR [LOGICAL32] PT;
INTEGER J, K;
0 => PW0;
@BOX 2.1
OPEN.FILE (F.NAME, 0, -1, %1E);
IF PW0 /= 0
@BOX 3.1
IF C.SEG < 0 OR C.SEG >= NO.OF.INITIAL.DATA.SEGS
@BOX 4.1
PW1 => FILE.SEG;
IF PW3 & %20 /= 0 THEN
   PW2 => FILE.SIZE;
ELSE
   PW2 ->> SYS14.PAGE.SHIFT => FILE.SIZE;
FI
SYS14.CMD.MAP (INITIAL.DATA.SEG, INITIAL.DATA.MAPPED.SEG);
PW1 => MAPPED.SEG;
DRUM.ADDRS1 [C.SEG] => CSEG.ADDR1;
DRUM.ADDRS2 [C.SEG] => CSEG.ADDR2;
(IF 1 -> VER = 0 THEN CSEG.ADDR1 ELSE CSEG.ADDR2) => CSEG.ADDR;
SYS14.CMD.MAP (MAPPED.SEG, INITIAL.DATA.MAPPED.SEG);
@BOX 5.1
CREATE.SEGMENT (-1, PT.SIZE);
PW1 => PT.SEG;
MAKE (LOGICAL32, PT.SIZE, PT.SEG * SYS14.SEG.SIZE) => PT;
FOR I < FILE.SIZE / PS.FACTOR DO
   CSEG.ADDR / PS.FACTOR + 1 + I ! SYS14.ON.DRUM => PT^ [I];
OD
SYS13.ENTER.INT.LEVEL (^WRITE.CS, 256 * PS.FACTOR + PT.SEG, CSEG.ADDR);
PS.FACTOR +> CSEG.ADDR;
RELEASE.SEGMENT (PT.SEG);
@BOX 6.1
SYS13.ENTER.INT.LEVEL (^WRITE.CS, FILE.SIZE * 256 + FILE.SEG, CSEG.ADDR);
@BOX 7.1
RELEASE.SEGMENT (FILE.SEG);
@BOX 8.1
END
@BOX 9.1
RELEASE.SEGMENT (PW1);
-50 => PW0;
@BOX 10.1
IF PT.FLAG = 0
@BOX 11.1
IF CSEG.ADDR1 /= CSEG.ADDR2 AND [VER < 0 OR VER > 1 OR VER = VERSION.NO]
@BOX 12.1
IF PAGE.T.SIZE = 0 THEN
   SYS14.PAGE.SIZE => PT.SIZE;
ELSE
   PAGE.T.SIZE => PTSIZE;
FI
PT.SIZE / SYS14.PAGE.SIZE => PS.FACTOR;
@BOX 13.1
IF VALIDATE (BYTE (^F.NAME^ [0]), %C) /= 0
   OR VALIDATE (BYTE (^F.NAME^ [SIZE (F.NAME) - 1]), %C) /= 0
@BOX 14.1
-8 => PW0;
@END



