@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            AP7511
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YAP7511
~S~M~OAP7 IMPLEMENTATION DESCRIPTION
~S~M~OSection 51 Version 1
~S~O51.1 Monitor Drum Appendix (MU6G)
~S1~O1. General Description
~BThis module implements polling type disc procedures for use
by the monitor, the disc copy module and other similar
utilities.
~S1~O2. Interfaces
~S1~O2.2 Software Interface~
~
   1) DISC.TRAN (D.ADDR, C.ADDR, DISC.TYPE, TRAN.SIZE, DIRECTION)~
   2) FORMAT (DISC.TYPE)~
   3) READ.SYSTEM (VERSION, DISC.TYPE)~
   4) DISC.TYPES~
   5) SECTOR.SIZE~
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~S1~O3.2 Data Structures
~T% 20
~
~
DISC.TYPES~IThis is a datavec containing the addresses
of other datavectors which specify the disc options
provided by this module.~
~
DT0/DT1/DT2~IThese are datavecs containing the names of the
disc options.~
~S1~O3.3 Special Notes
~Y
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H               AP7511
~V9 -1
~F
@TITLE AP751(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
MU6G MONITOR DISC MODULE
@BOX 2.0
DECLARATIONS
@BOX 3.0
PROCEDURES IN THIS MODULE
   1 INIT DISC
   2 DISC TRAN
   3 DISC STATUS
   4 FORMAT
   5 READ SYSTEM
@BOX 4.0
END
@BOX 1.1
PSPEC PRINT (ADDR [LOGICAL8]);
PSPEC PUT.HEX.CONS (LOGICAL32, INTEGER);
PSPEC PUT.CONS (LOGICAL);
IMPORT LITERAL NO.V1.SEGS, NO.V2.SEGS, SYS14.PAGE.SHIFT, BAD.BLOCK.TABLE.SIZE;
IMPORT LITERAL INTEGER32 BAD.BLOCK.TABLE, BAD.BLOCK.CORE.ADDR;
LOGICAL [NO.V1.SEGS] V1.TRAN.SIZE;
ADDR [NO.V1.SEGS] V1.DISC.ADDR, V1.CORE.ADDR;
LOGICAL [NO.V2.SEGS] V2.TRAN.SIZE;
ADDR [NO.V2.SEGS] V2.DISC.ADDR, V2.CORE.ADDR;
MODULE (INIT.DISC, DISC.TRAN, FORMAT, DISC.TYPES,
   READ.SYSTEM, NUM.D.TYPES, DEFAULT.D, DISC.SIZE, TRACK.SIZE);
@BOX 2.1
#AP751/1
@BOX 3.1
PSPEC INIT.DISC () / INTEGER;
PSPEC DISC.TRAN (LOGICAL32, LOGICAL32, LOGICAL, LOGICAL, LOGICAL) / INTEGER;
PSPEC DISC.STATUS (LOGICAL8, LOGICAL8) / INTEGER;
PSPEC FORMAT (INTEGER);
PSPEC READ.SYSTEM (INTEGER, INTEGER) / ADDR;
#AP751.1
#AP751.2
#AP751.3
#AP751.4
#AP751.5
@BOX 4.1
*END
@END
@TITLE AP751/1(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
DECLARATIONS
@BOX 2.0
VSTORE
@BOX 3.0
LITERALS AND DATAVECS
@BOX 4.0
END
@BOX 1.1
::DECLARATIONS
@BOX 2.1
**TLSEG 21 4 %D800 -3 0
*TLLOAD 21 21;
*GLOBAL 21;
INTEGER VERSION.NO;
*GLOBAL 3;
VSTORE V.UNIBUS.EXTENSION %4800C;
VSTORE V.MU6G.EXTENSION %48004;
VSTORE V.CSR %4F704;
VSTORE V.COUNT %4F70C;
VSTORE V.CADDR %4F724;
VSTORE V.DADDR %4F71C;
VSTORE V.ERROR %4F72C;
VSTORE V.CYL %4F714;
VSTORE V.SC %4F754;
@BOX 3.1
*GLOBAL 3;
LITERAL / LOGICAL READ = 0, WRITE = 1;
LITERAL / LOGICAL8 LF = %A;
LITERAL DEFAULT.D = 0;
*GLOBAL 1;
DATAVEC DT0 (LOGICAL8)
   "CDC" LF
END
DATAVEC DT1 (LOGICAL8)
   "CDC" LF
END
LITERAL NUM.D.TYPES = 2;
DATAVEC DISC.TYPES (ADDR [LOGICAL8])
   DT0 DT1
END
DATAVEC DISC.SIZE (LOGICAL)
   15637 15637
END
DATAVEC TRACK.SIZE (LOGICAL)
   64 64
END
DATAVEC ERROR.MESS (LOGICAL8)
   " Error = "
END
DATAVEC READ.MSG (LOGICAL8)
   LF "Read"
END
DATAVEC WRITE.MSG (LOGICAL8)
   LF "Write"
END
DATAVEC NOT.IMPL (LOGICAL8)
   LF "Not implemented" LF
END
*GLOBAL 3;
*CODE 1;
@BOX 4.1
::END
@END
@TITLE AP751.1(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
INIT.DISC
@BOX 2.0
SET UNIBUS ADDRESS
EXTENSION REGISTER
@BOX 3.0
RETURN DEFAULT DISC TYPE
@BOX 4.0
END
@BOX 1.1
PROC INIT.DISC;
@BOX 2.1
%3F => V.UNIBUS.EXTENSION;
@BOX 3.1
DEFAULT.D => INIT.DISC;
@BOX 4.1
END
@END
@TITLE AP751.2(1,11)

@COL 1S-2R-3R-4R-5R-8R-9F
@FLOW 1-2-3-4-5-8-9
@BOX 1.0
DISC TRANSFER (D.ADDR, C.ADDR, DISC.TYPE, TRAN.SIZE, DIRN)
@BOX 2.0
RESERVE DISC CONTROLLER
@BOX 3.0
SET DISC REGISTERS
FOR TRANSFER
@BOX 4.0
SEND COMMAND
@BOX 5.0
WAIT FOR TRANSFER
TO COMPLETE
@BOX 8.0
GET STATUS
@BOX 9.0
END
@BOX 1.1
PROC DISC.TRAN (D.ADDR, C.ADDR, DISC.TYPE, TRAN.SIZE, DIRN);
INTEGER I, CYL;
D.ADDR ->> 1 => D.ADDR;
TRAN.SIZE ->> 1 => TRAN.SIZE;
@BOX 2.1
1 => V.SC;
WHILE V.SC & %80 = 0 DO OD
@BOX 3.1
D.ADDR / 608 => CYL;
DISC.TYPE <<- 10 ! CYL => V.CYL;
CYL * 608 -: D.ADDR => V.DADDR;
256 * TRAN.SIZE => V.COUNT;
C.ADDR => V.CADDR;
C.ADDR ->> 15 => V.MU6G.EXTENSION;
@BOX 4.1
(IF DIRN = READ THEN %5 ELSE %3) => V.CSR;
@BOX 5.1
WHILE V.CSR & %80 = 0 DO OD
0 => V.SC;
@BOX 8.1
DISC.STATUS (DIRN, DISC.TYPE) => DISC.TRAN;
@BOX 9.1
END
@END
@TITLE AP751.3(1,11)
@COL 1S-2T-3R-4F
@FLOW 1-2-3-4
@FLOW 2YES-4
@BOX 1.0
DISC.STATUS
@BOX 2.0
ERROR STATUS = 0?
@BOX 3.0
GET ERROR STATUS
PRINT ERROR MESSAGE
@BOX 4.0
END
@BOX 1.1
PROC DISC.STATUS (IO.TYPE, DISC.TYPE);
0 => DISC.STATUS;
@BOX 2.1
IF V.ERROR & %FFFF = 0
@BOX 3.1
IF IO.TYPE = READ THEN
   PRINT (^READ.MSG);
ELSE
   PRINT (^WRITE.MSG);
FI
PRINT (^ERROR.MESS);
PUT.HEX.CONS (V.ERROR, 16);
PUT.CONS (LF);
-1 => DISC.STATUS;
@BOX 4.1
END
@END
@TITLE AP751.4(1,11)
@COL 1S-3R-4F
@FLOW 1-3-4
@BOX 1.0
FORMAT DISK
@BOX 3.0
OBTAIN DISK TYPE
ISSUE FORMAT COMMAND
@BOX 4.0
END
@BOX 5.0
OUTPUT ERROR MESSAGE
@BOX 1.1
PROC FORMAT (DISC.TYPE);
@BOX 3.1
DISC.STATUS (WRITE, DISC.TYPE);
PRINT (^NOT.IMPL);
@BOX 4.1
END
@END
@TITLE AP751.5(1,11)

@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
READ SYSTEM (VERSION, DRIVE, DISC)
@BOX 2.0
INITIALISE POINTERS
@BOX 3.0
READ IN SYSTEM
@BOX 4.0
SET VERSION AND DISC NUMBERS
@BOX 5.0
END
@BOX 1.1
PROC READ.SYSTEM (VERSION, DISC.TYPE);
INTEGER SECTOR.SHIFT, I, T.SIZE, SCALE;
INTEGER NO.BOOT.SEGS;
ADDR C.ADDR, D.ADDR;
ADDR [LOGICAL] TRAN.SIZE;
ADDR [ADDR] CORE.ADDR, DISC.ADDR;
@BOX 2.1
IF VERSION = 1 THEN
   ^V1.DISC.ADDR => DISC.ADDR;
   ^V1.TRAN.SIZE => TRAN.SIZE;
   ^V1.CORE.ADDR => CORE.ADDR;
   NO.V1.SEGS => NO.BOOT.SEGS;
ELSE
   ^V2.DISC.ADDR => DISC.ADDR;
   ^V2.TRAN.SIZE => TRAN.SIZE;
   ^V2.CORE.ADDR => CORE.ADDR;
   NO.V2.SEGS => NO.BOOT.SEGS;
FI
@BOX 3.1
SYS14.PAGE.SHIFT - 8 => SCALE;
FOR I < NO.BOOT.SEGS DO
   DISC.ADDR^ [I] <<- SCALE => D.ADDR;
   CORE.ADDR^ [I] => C.ADDR;
   TRAN.SIZE^ [I] <<- SCALE => T.SIZE;
   DISC.TRAN (D.ADDR, C.ADDR, DISC.TYPE, T.SIZE, READ);
OD
DISC.TRAN (BAD.BLOCK.TABLE.SIZE * 8 - 8 + BAD.BLOCK.TABLE,
   BAD.BLOCK.CORE.ADDR, DISC.TYPE, 8, READ);
@BOX 4.1
VERSION - 1 => VERSION.NO;
@BOX 5.1
CORE.ADDR^ [2] => READ.SYSTEM;
END
@END

