@X @~
~L3 COUK1247
80
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            AP5021
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YAP5021
~S1~M~OAP5 IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 2  Version 1~
~S1~OSection 2.1 Drum Appendix (ATV)~
~S1~O1. General Description~
~BThis module is concerned with driving the 'drum'
described in SYS Section 3 (Drum Manager). The 'drum' in this
instance is an
OMTI Series 10 Disc Controller, which is described
in "OMTI Storage Controller Specifications 1981".
Henceforth this disc controller will be referred to as Q.
~S1~O2. Interfaces~
Other modules used~
   SYS Section 1 (Coordinator)~
   SYS Section 12 (System Error)~
   SYS Section 14 (Virtual Store Manager)~
Ideal hardware registers used~
   V.DISC.CONTROL~
   V.DISC.SIZE~
   V.DISC.C.ADDRESS~
   V.DISC.D.ADDRESS~
Q hardware registers used~
   (AP5 name)             (MC name)~
   V.DISC.DATA~
   V.DISC.CS~
Interrupt procedures~
   Q.DISC.INT (DUMMY)~
Interface procedures~
   None~
Interface variables~
   None~
Configuration parameters~
   None~
~P~S1~O2.1 MUSS Interface~
~S1~O2.1.1 Hardware Interface~
~BThe ideal hardware registers are
described in SYS Section 3.~
~S1~O2.1.2 Software Interface~
~S11) Q.DISC.INT (DUMMY)~
~BThis procedure services Q interrupts
and is called by the system when such an
interrupt is detected.~
~S1~O2.2 Q Interface~
~BSee OMTI Handbook.~
~S1~ONote
~BThe register interface into the Q disc is arranged as follows~
~3
~Q 4
~
~M~O5000         5001                    ~O~
~N~O|  Data Byte  | Control/Status Byte |~O~
~0
~BThe Control/Status byte is arranged as follows~
~
- For Control (Write Operations)~
~3
~Q 11
~
~M~O7     6              0~O~
~N~O|IE|SEL|          |  |~O~
~X{`
~N  |  |~
~N  |  |~
~N  |   -----{1 - set select line~
~N  |        {0 - clear select line~
~N  |~
~N   --------{1 - enable interrupts~
~N           {0 - disable interrupts~
~X{{
~
- For Status (Read Operations)~
~Q 3
~
~M~O  7   6   5   4   3      0 ~O~
~N~O|BSY|REQ|I/O|C/D|MSG|0|0|0|~O~
~0
~BThe value of these bits correspond to the value of the
Signal lines with the same mnemonic.
~BHardware assistance in driving the Q disc is provided
in the following manner~
~3
~
  -  BSY going high clears the select line~
  -  REQ going high generates an interrupt if IE is set~
  -  Reading or writing to the data byte clears the interrupt~
     and sets the ACK signal.~
  -  ACK is cleared when REQ from the controller clears.~
~0
~S1~O3. Implementation~
~S1~O3.1 Outline of Implementation~
~BThe following procedures are private to this module.
~S11) DISC.CONTROL.POST.PROC~
~BThis procedure translates ideal
drum commands into Q commands.~
~S12) START.TRANSFER ()~
~BThis procedure evaluates the drum
and core addresses and initiates the transfer.~
~S1~O3.2 Data Structures~
~T%37
~
~
MAX.BYTE.XFER~IA literal giving the maximum transfer size in bytes.~
~
SECTOR.SHIFT~IAn integer 'constant' giving the sector size log}2{.~
~
SCALE~IAn integer 'constant' giving the page size / sector size ratio ~Klog}2{.~
K~
~
MAX.SECTOR.XFER~IAn integer 'constant' giving the maximum transfer
size in sectors.~
~
DISC.STATUS~IA logical variable giving the status of the disc
as follows,~
~I0 = IDLE, 1 IN TRANSFER.~
~
DIRN~IAn integer variable giving the direction of the
transfer as follows~
~I1 = READ, 2 = WRITE.~
~
AMOUNT~IAn integer variale giving the size of the
current transfer in bytes.~
~
TRAN.SIZE~IA logical variable giving the size of the
current transfer in sectors.~
~
D.SIZE~IA logical variable giving the size of the
outstanding transfers in bytes.~
~
C.ADDR~IAn ADDR variable giving the
current core address of the transfer.~
~
D.ADDR~IAn ADDR variable giving the current
disc address of the transfer.~
~S1~O3.3 Special Notes~
~BThe information concerning the disc type (Logical
Unit No) and the drive number are passed to this Appendix
in the variables DISC.TYPE and DRIVE.NO which are initialised
by the system bootstrap using information received from the initial
bootstrap.
~BThe machine-dependent code used in
driving the 'drum' is contained in the
machine functions:~
~
~MINHIBIT.INTERRUPTS~
~NALLOW.INTERRUPTS~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H               AP5021
~V9 -1
~F
@TITLE AP502(1,9)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
MC68000 (Q) DISC APPENDIX
@BOX 4.0
PROCEDURES IN MODULE:
   1 DISC CONTROL POST PROC
   2 Q DISC INT
   3 START TRANSFER
@BOX 6.0
*END
@BOX 1.1
#AP502/1
MODULE (V.DISC.CONTROL, V.DISC.D.ADDRESS, V.DISC.C.ADDRESS, V.DISC.SIZE,
   V.DRUM.CONTROL, V.DRUM.D.ADDRESS, V.DRUM.C.ADDRESS, V.DRUM.SIZE,
   V.DRUM.SECTION, Q.DISC.INT, ED.POLL);
@BOX 2.1
TYPE DISC.VARS.TYPE IS
INTEGER SECTOR.SHIFT, MAX.SECTOR.XFER
INTEGER D.SIZE
LOGICAL DISC.STATUS
ADDR C.ADDR, D.ADDR, DRUM.OFFSET;
@BOX 3.1
*GLOBAL 5;
LITERAL / LOGICAL8 BSY = %80, CTL.ID = 1, IE.SEL = %C0, SEL = %40, IO = %20, CMD
 = %10,
   REQ.CMD = %50, BSY.REQ.IO.CMD = %F0, BSY.REQ.IO.CMD.MSG = %F8;
LITERAL / LOGICAL MAX.BYTE.XFER = 256, READ = 1, WRITE = 2;
LOGICAL [SYS05.NO.OF.ED.UNITS] VV.DISC.CONTROL,
   VV.DISC.C.ADDRESS, VV.DISC.SIZE;
LOGICAL32 [SYS05.NO.OF.ED.UNITS] VV.DISC.D.ADDRESS;
VSTORE V.DISC.CONTROL [SYS05.NO.OF.ED.UNITS] VV.DISC.CONTROL > DISC.CONTROL.POST
.PROC;
VSTORE V.DISC.D.ADDRESS [SYS05.NO.OF.ED.UNITS] VV.DISC.D.ADDRESS;
VSTORE V.DISC.C.ADDRESS [SYS05.NO.OF.ED.UNITS] VV.DISC.C.ADDRESS;
VSTORE V.DISC.SIZE [SYS05.NO.OF.ED.UNITS] VV.DISC.SIZE;
LOGICAL VV.DRUM.CONTROL, VV.DRUM.C.ADDRESS, VV.DRUM.SIZE, VV.DRUM.SECTION;
LOGICAL32  VV.DRUM.D.ADDRESS;
VSTORE V.DRUM.CONTROL VV.DRUM.CONTROL > DRUM.CONTROL.POST.PROC;
VSTORE V.DRUM.D.ADDRESS VV.DRUM.D.ADDRESS;
VSTORE V.DRUM.C.ADDRESS VV.DRUM.C.ADDRESS;
VSTORE V.DRUM.SIZE VV.DRUM.SIZE;
VSTORE V.DRUM.SECTION VV.DRUM.SECTION;
*VTYPE LOGICAL8;
VSTORE V.DISC.DATA %005000;
VSTORE V.DISC.CS %005001;
INTEGER DIRN, AMOUNT, UNIT, HW.INT.COUNT, TRAN.UNIT;
LOGICAL TRAN.STATUS, TRAN.SIZE, POLL.WAIT;
DISC.VARS.TYPE [NO.OF.DISCS] DISC.VARS;
LOGICAL8 [SYS05.NO.OF.ED.UNITS] POLL.REQ;
DATAVEC DISC.SIZES (LOGICAL32)
   131040
   3968 [2]
   20448
END
@BOX 4.1
:: *CODE 2;
:: PSPEC DISC.CONTROL.POST.PROC ();
:: PSPEC DRUM.CONTROL.POST.PROC ();
:: *CODE 23;
PSPEC Q.DISC.INT (INTEGER);
PSPEC START.TRANSFER ();
PSPEC ED.POLL ();
*CODE 2;
   #AP502.1
   #AP502.2
*CODE 23;
   #AP502.3
   #AP502.4
   #AP502.5
@BOX 5.1
*CODE 7;
BEGIN
   FOR UNIT < NO.OF.DISCS DO
      SELECT DISC.VARS [UNIT];
      8 => SECTOR.SHIFT;
      MAX.BYTE.XFER ->> SECTOR.SHIFT => MAX.SECTOR.XFER;

      IF UNIT >= NO.OF.DRUM.SECTIONS THEN
         %8000 => VV.DISC.CONTROL [UNIT - NO.OF.DRUM.SECTIONS]
            => DISC.STATUS;
      ELSE
         OFFSET [UNIT] => DRUM.OFFSET;
      FI
   OD
END
@BOX 6.1
*END
@END
@TITLE AP502/1(1,9)
@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
OTHER MODULES REFERENCED
@BOX 4.0
SYS01 COORDINATOR
SYS03 DRUM MANAGER
SYS12 SYSTEM ERROR
SYS14 VIRTUAL STORE MANAGER
@BOX 1.1
:: EXTERNAL ENVIRONMENT
@BOX 2.1
IMPORT VSTORE LOGICAL ALLOW.INTERRUPTS, INHIBIT.INTERRUPTS;
IMPORT LITERAL ADDR REAL.STORE.ADDRESS;
IMPORT LITERAL NO.OF.DISCS, NO.OF.DISC.TYPES, SYS05.NO.OF.ED.UNITS,
   NO.OF.DRUM.SECTIONS;
INTEGER [NO.OF.DISCS] DISC.TYPE, DRIVE.NO;
LOGICAL32 [NO.OF.DRUM.SECTIONS] OFFSET;
@BOX 3.1
PSPEC SET.HW.INT (LOGICAL);
PSPEC CLEAR.HW.INT (LOGICAL);
@BOX 4.1
IMPORT LITERAL LOGICAL SYS01.DRUM.ACTIVITY, SYS01.DISC.ACTIVITY;
PSPEC SYS12.SYSTEM.ERROR (INTEGER);
IMPORT LITERAL INTEGER SYS14.PAGE.SHIFT;
@END
@TITLE AP502.1(1,9)
@COL 1S-2R-3R-6R-7F
@FLOW 1-2-3-6-7
@BOX 1.0
DISC CONTROL POST PROC
@BOX 2.0
INHIBIT INTERRUPTS
@BOX 3.0
NOTE DISC COMMAND
@BOX 6.0
ALLOW INTERRUPTS
@BOX 7.0
END
@BOX 1.1
PROC DISC.CONTROL.POST.PROC;
PSPEC NOTE.DISC.COMMAND ();
#AP502.1.1
@BOX 2.1
VSUB => UNIT;
INHIBIT.INTERRUPTS;
@BOX 3.1
NOTE.DISC.COMMAND ();
@BOX 6.1
ALLOW.INTERRUPTS;
@BOX 7.1
END
@END
@TITLE AP502.1.1(1,9)
@COL 1S-3R-4T-5R-7F
@FLOW 1-3-4NO-5-7
@FLOW 4YES-7
@BOX 1.0
NOTE DISC COMMAND
@BOX 3.0
CLEAR HW INT
[AP501]
@BOX 4.0
COMMAND BITS CLEAR?
@BOX 5.0
START TRANSFER
[AP502.3]
@BOX 7.0
END
@BOX 1.1
PROC NOTE.DISC.COMMAND;
@BOX 3.1
SELECT DISC.VARS [UNIT + NO.OF.DRUM.SECTIONS];
IF DISC.STATUS & %F00 /= 0 AND
   1 -> HW.INT.COUNT = 0 THEN
   CLEAR.HW.INT (SYS01.DISC.ACTIVITY);
FI
@BOX 4.1
DISC.STATUS & %8000 ! VV.DISC.CONTROL [UNIT]
   => DISC.STATUS;
IF DISC.STATUS & 3 = 0
@BOX 5.1
VV.DISC.D.ADDRESS [UNIT] + 32 => D.ADDR;
VV.DISC.C.ADDRESS [UNIT] <<- SECTOR.SHIFT
   + REAL.STORE.ADDRESS => C.ADDR;
VV.DISC.SIZE [UNIT] => D.SIZE;
START.TRANSFER ();
@BOX 7.1
END
@END
@TITLE AP502.2(1,11)
@COL 1S-2R-3R-6R-7F
@FLOW 1-2-3-6-7
@BOX 1.0
DRUM CONTROL POST PROC
@BOX 2.0
INHIBIT INTERRUPTS
@BOX 3.0
NOTE DRUM COMMAND
@BOX 6.0
ALLOW INTERRUPTS
@BOX 7.0
END
@BOX 1.1
PROC DRUM.CONTROL.POST.PROC;
PSPEC NOTE.DRUM.COMMAND ();
#AP502.2.1
@BOX 2.1
INHIBIT.INTERRUPTS;
@BOX 3.1
NOTE.DRUM.COMMAND ();
@BOX 6.1
ALLOW.INTERRUPTS;
@BOX 7.1
END
@END
@TITLE AP502.2.1(1,11)
@COL 1S-3R-4T-5R-7F
@FLOW 1-3-4NO-5-7
@FLOW 4YES-7
@BOX 1.0
NOTE DRUM COMMAND
@BOX 3.0
CLEAR HW INT
[AP501]
@BOX 4.0
COMMAND BITS CLEAR?
@BOX 5.0
START TRANSFER
[AP502.3]
@BOX 7.0
END
@BOX 1.1
PROC NOTE.DRUM.COMMAND;
@BOX 3.1
SELECT DISC.VARS [VV.DRUM.SECTION];
CLEAR.HW.INT (SYS01.DRUM.ACTIVITY);
@BOX 4.1
DISC.STATUS & %8000 ! VV.DRUM.CONTROL
   => DISC.STATUS;
IF DISC.STATUS & 3 = 0
@BOX 5.1
VV.DRUM.D.ADDRESS + DRUM.OFFSET + 32 => D.ADDR;
VV.DRUM.C.ADDRESS <<- SECTOR.SHIFT
   + REAL.STORE.ADDRESS => C.ADDR;
VV.DRUM.SIZE => D.SIZE;
START.TRANSFER ();
@BOX 7.1
END
@END
@TITLE AP502.3(1,9)

@COL 21C-22R
@COL 1S-2T-17R-18R-19R-3T-4T-6N-5R-7F
@COL 9R-10N-11R-13R-14R-16N
@ROW 17-9
@ROW 21-18
@ROW 3-10
@ROW 6-16
@FLOW 1-2NO-17-18-19-3NO-4NO-6-5-7
@FLOW 2YES-9-16
@FLOW 3YES-10-11-14
@FLOW 4YES-13-14-16-6
@FLOW 21-22-19
@BOX 1.0
Q DISC INT
@BOX 2.0
DISC INACTIVE?
@BOX 3.0
DISC IN ERROR?
@BOX 4.0
TRANSFER COMPLETE?
@BOX 5.0
NOTE DEVICE INACTIVE
START TRANSFER
[AP502.3]
@BOX 7.0
END
@BOX 9.0
HALT
@BOX 11.0
NOTE TRANSFER FAIL
@BOX 13.0
NOTE TRANSFER COMPLETE
@BOX 14.0
SET HW INT
[AP501]
@BOX 17.0
LOOP UNTIL READY FOR DATA
@BOX 18.0
TRANSFER DATA
@BOX 19.0
OBTAIN STATUS
@BOX 21.0
ERROR
@BOX 22.0
MARK STATUS FOR ERROR
@BOX 1.1
PROC Q.DISC.INT (DUMMY);
LOGICAL8 STATUS;
INTEGER I;
ADDR [LOGICAL8] CORE;
SELECT DISC.VARS [TRAN.UNIT];
@BOX 2.1
IF TRAN.STATUS = 0
@BOX 3.1
IF STATUS /= 0
@BOX 4.1
IF D.SIZE = 0
@BOX 5.1
0 => TRAN.STATUS;
START.TRANSFER ();
@BOX 7.1
END
@BOX 9.1
*#%60FE; :: BRA -2
@BOX 11.1
%200 !> DISC.STATUS;
@BOX 13.1
%100 !> DISC.STATUS;
@BOX 14.1
IF TRAN.UNIT < NO.OF.DRUM.SECTIONS THEN
   DISC.STATUS => VV.DRUM.CONTROL;
   SET.HW.INT (SYS01.DRUM.ACTIVITY);
ELSE
   DISC.STATUS => VV.DISC.CONTROL [TRAN.UNIT - NO.OF.DRUM.SECTIONS];
   IF 1 +> HW.INT.COUNT = 1 THEN
      SET.HW.INT (SYS01.DISC.ACTIVITY);
   FI
FI
@BOX 17.1
WHILE V.DISC.CS & CMD /= 0 DO OD
@BOX 18.1
MAKE (LOGICAL8, AMOUNT, C.ADDR) => CORE;
0 => STATUS;
-1 => I;
IF DIRN = READ THEN
   IF V.DISC.CS & IO = 0, -> ERROR;
   WHILE 1 +> I /= AMOUNT DO
      WHILE V.DISC.CS & REQ.CMD = 0 DO OD
      IF V.DISC.CS & CMD /= 0, -> ERROR;
      V.DISC.DATA => CORE^ [I];
   OD
ELSE
   IF V.DISC.CS & IO /= 0, -> ERROR;
   WHILE 1 +> I /= AMOUNT DO
      WHILE V.DISC.CS & REQ.CMD = 0 DO OD
      IF V.DISC.CS & CMD /= 0, -> ERROR;
      CORE^ [I] => V.DISC.DATA;
   OD
FI
AMOUNT +> C.ADDR;
TRAN.SIZE +> D.ADDR;
TRAN.SIZE -> D.SIZE;
@BOX 19.1
WHILE V.DISC.CS /= BSY.REQ.IO.CMD DO OD
V.DISC.DATA  & 7 !> STATUS;
WHILE V.DISC.CS /= BSY.REQ.IO.CMD.MSG DO OD
V.DISC.DATA;
@BOX 21.1
ERROR:
@BOX 22.1
8 => STATUS;
@END



@TITLE AP502.4(1,9)

@COL 1S-5T-10R-7T-2R-3R-8R-9R-6F

@FLOW 1-5NO-10-7FOUND-2-3-8-9-6
@FLOW 5YES-6
@FLOW 7NOT FOUND-6

@BOX 1.0
START TRANSFER
@BOX 2.0
INITIALIZE VARIABLES
FOR TRANSFER
@BOX 3.0
SET UP COMMAND BUFFER
@BOX 4.0
SET COMMAND
@BOX 5.0
TRANSFER IN PROGRESS?
@BOX 6.0
END
@BOX 7.0
SEARCH FOR OUTSTANDING TRANSFER
@BOX 8.0
SELECTION SEQUENCE
@BOX 9.0
COMMAND TRANSFER SEQUENCE
@BOX 10.0
POLL EXCHANEABLE DISCS
#AP502.4.1
@BOX 1.1
PROC START.TRANSFER;
INTEGER I;
LOGICAL8 [6] CMD.BUFFER;
@BOX 2.1
SELECT DISC.VARS [TRAN.UNIT];
1 => TRAN.STATUS;
IF D.SIZE > MAX.SECTOR.XFER THEN
   MAX.SECTOR.XFER => TRAN.SIZE;
   MAX.BYTE.XFER => AMOUNT;
ELSE
   D.SIZE => TRAN.SIZE <<- SECTOR.SHIFT => AMOUNT;
FI
@BOX 3.1
(IF DISC.STATUS & 3 => DIRN = READ THEN 8 ELSE %A)
   => CMD.BUFFER [0];
DRIVE.NO [TRAN.UNIT] <<- 5 ! (D.ADDR ->> 16 & %1F) => CMD.BUFFER [1];
D.ADDR ->> 8 => CMD.BUFFER [2];
D.ADDR => CMD.BUFFER [3];
TRAN.SIZE => CMD.BUFFER [4];
0 => CMD.BUFFER [5];
@BOX 4.1
DISC.COMMAND (^CMD.BUFFER);
@BOX 5.1
IF TRAN.STATUS /= 0
@BOX 6.1
END
@BOX 7.1
IF 1 +> TRAN.UNIT = NO.OF.DISCS THEN
   0 => TRAN.UNIT;
FI
-1 => I;
WHILE 1 +> I < NO.OF.DISCS AND
   DISC.STATUS OF DISC.VARS [TRAN.UNIT]
   & %8F03 /= 1 /= 2 DO
   IF 1 +> TRAN.UNIT = NO.OF.DISCS THEN
      0 => TRAN.UNIT;
   FI
OD
IF I = NO.OF.DISCS
@BOX 8.1
WHILE V.DISC.CS /= 0 DO OD
CTL.ID => V.DISC.DATA;
IE.SEL => V.DISC.CS;
WHILE V.DISC.CS & BSY = 0 DO OD
@BOX 9.1
FOR I < 6 DO
   WHILE V.DISC.CS & REQ.CMD /= REQ.CMD DO OD
   CMD.BUFFER [I] => V.DISC.DATA;
OD
@BOX 10.1
#AP502.4.1
@END
@TITLE AP502.4.1(1,11)
@COL 1S-2T-3T-4R-5R-6R-7R
@COL 8F

@ROW 8-4

@FLOW 1-2NO-3NO-4-5-6-7-2
@FLOW 2YES-8
@FLOW 3YES-8
@BOX 1.0
POLL EXCHANGEABLE DISCS
@BOX 2.0
NO MORE UNITS?
@BOX 3.0
POLL NOT REQUIRED YET?
@BOX 4.0
SET UP COMMAND BUFFER FOR
TEST READY COMMAND
@BOX 5.0
TRANSFER COMMAND
@BOX 6.0
READ STATUS
@BOX 7.0
NOTE ANY STATUS CHANGE
@BOX 8.0
END
@BOX 1.1
BEGIN
INTEGER UNIT;
LOGICAL STATUS;
-1 => UNIT;
@BOX 2.1
IF 1 +> UNIT >= SYS05.NO.OF.ED.UNITS
@BOX 3.1
SELECT DISC.VARS [UNIT + NO.OF.DRUM.SECTIONS];
IF POLL.REQ [UNIT] = 0 OR
   DISC.STATUS & %F00 /= 0 OR
   DISC.STATUS -= VV.DISC.CONTROL [UNIT] & 3 /= 0
@BOX 4.1
0 => POLL.REQ [UNIT];
FOR I < 6 DO
   0 => CMD.BUFFER [I];
OD
DRIVE.NO [UNIT + NO.OF.DRUM.SECTIONS] <<- 5 => CMD.BUFFER [1];
@BOX 5.1
CTL.ID => V.DISC.DATA;
SEL => V.DISC.CS;
WHILE V.DISC.CS & BSY = 0 DO OD
FOR I < 6 DO
   WHILE V.DISC.CS & REQ.CMD /= REQ.CMD DO OD
   CMD.BUFFER [I] => V.DISC.DATA;
OD
@BOX 6.1
WHILE V.DISC.CS /= BSY.REQ.IO.CMD DO OD
V.DISC.DATA <<- 8 => STATUS;
WHILE V.DISC.CS /=BSY.REQ.IO.CMD.MSG DO OD
V.DISC.DATA !> STATUS;
@BOX 7.1
IF STATUS & %0700 /= 0 THEN
   IF DISC.STATUS & %8000 = 0 THEN
      %8800 !> DISC.STATUS;
      IF DISC.STATUS & 3 /= 0 THEN
         %200 !> DISC.STATUS;
      FI
   FI
ELSE
   IF DISC.STATUS & %8000 /= 0 THEN
      %8000 -=> DISC.STATUS;
      %800 !> DISC.STATUS;
      1 <<- SECTOR.SHIFT => VV.DISC.SIZE [UNIT];
      DISC.SIZES [DISC.TYPE [UNIT + NO.OF.DRUM.SECTIONS]] => VV.DISC.DADDRESS [U
NIT];
   FI
FI
IF DISC.STATUS & %800 /= 0 THEN
   IF 1 +> HW.INT.COUNT = 1 THEN
      SET.HW.INT (SYS01.DISC.ACTIVITY);
   FI
   DISC.STATUS  => VV.DISC.CONTROL [UNIT];
FI
@BOX 8.1
END
@END
@END

@TITLE AP502.5(1,11)

@COL 1S-2T-3R-4R-5F
@FLOW 1-2NO-3-4-5
@FLOW 2YES-5
@BOX 1.0
ED POLL
@BOX 2.0
WAIT NOT ENDED?
@BOX 3.0
NOTE POLL REQUIRED
@BOX 4.0
START TRANSFER
@BOX 5.0
END
@BOX 1.1
PROC ED.POLL;
INTEGER I;
@BOX 2.1
IF 1 +> POLL.WAIT < 3
@BOX 3.1
0 => POLL.WAIT;
FOR I < SYS05.NO.OF.ED.UNITS DO
  IF DISC.TYPE [I + NO.OF.DRUM.SECTIONS] /= -1 THEN
      1 => POLL.REQ [I];
   FI
OD
@BOX 4.1
START.TRANSFER ();
@BOX 5.1
END
@END

