@X @~
~V7 56 2 -5
~L3 COUK1247
80
~D10
~H                    MUSS
~
~
~D10
~H             AP7061
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                            ISSUE 11~
~V9 -1
~P
~V9 1
~YAP7061
~S~M~OAP7 IMPLEMENTATION DESCRIPTION
~S~M~OSection 6 Version 1
~S~OSection 6.1 Remote I/O Appendix
~S~O1. General Description
~BThe Remote I/O Appendix provides MU6 with the ability to control I/O
devices connected remotely (to the front-end PDP11).  It intercepts
write commands from the I/O appendix to such devices and directs them,
via the CIU, to the I/O Manager Appendix in the PDP11.  Input
data and status reports from the remote devices are directed to the
I/O appendix as though coming from a local device.
~S~O2. Interfaces~
~
Other modules used:~
   AP103   I/O Appendix~
   AP705   CIU Appendix~
~
Ideal hardware registers used:~
   None~
~
Interrupt procedures:~
   None~
~
Interface procedures:~
   REMOTE.DEV.CONTROL (PHYSICAL.DEV.NO, CONTROL, D.ADDRESS,~
      COUNT, DEV.PARS.MODE)~
   IO.RECEIVE()~
   IO.RESET()~
   IO.INFORM()~
~
Configuration parameters:~
   SYS19.MAX.REMOTE.P.DEV.NO~
   SYS19.PDP.IO.ADDR~
   REAL.STORE.ADDRESS~
~S~O2.1 Hardware Interface
~BNone.
~S~O2.2 Software Interface
~S11) REMOTE.DEV.CONTROL(PHYSICAL.DEV.NO,CONTROL,D.ADDRESS,~
   ~GCOUNT,DEV.PARS.MODE)~G~
~BThis procedure is called by AP103 whenever the device specified by
SYS07 is a remote device.  The parameters passed by AP103, determined by the
general form of all write procedures, are used to recover the original
V-store values written by SYS07.  These are then passed to the PDP11
by calling the CIU.TRANSMIT procedure.  In the case of an initialisation
command, if P.DEV.PROTOCOL indicates a remote communications device a
conversion to the standard MUSS comms protocol indicator is performed.
Thus the AP103 in the PDP performs the protocol, rather than the AP103
in MU6.  Remote communications is indicated by setting bit 3 in Device
Class rather than bit 1 (MUSS comms).
~S12) IO.RECEIVE()
~BThis procedure is called by the CIU appendix when a control message
is received addressed to this module.  Such messages will either be
indications of events occurring in particular devices or requests
for data block transfers.  The former are dealt with by calling the
NOTIFY PROC of AP103; the latter cause data transmissions to be carried
out from the specified location and of the specified size (in the request
message).
~S13) IO.RESET()
~BThis procedure is called by the CIU appendix if a PDP11 hardware
reset is signalled.  The SYS20.INIT.DEV.TASK is called, to re-initialise
the I/O system, and the module initialisation is run.
~S14) IO.INFORM()
~BThis procedure is called by the CIU appendix to indicate completion
of a data block receive transfer.  No action is required, so this
procedure is a dummy.
~S~O3. Implementation
~BThis module acts as the initial interface between the MU6 I/O
Appendix and devices located remotely, on the PDP11 front-end
processor.  It exports a WRITE.PROC which is called by AP103
whenever the physical device type specified is a remote device.
It also exports procedures called by the CIU appendix to indicate
the occurrence of data transfer through the CIU, and itself
calls the CIU.TRANSMIT procedure to initiate such transfers.
~S~O3.1 Outline of Operation
~BThe same procedure (REMOTE.DEV.CONTROL) is called for any activity
associated with remote I/O.  The activities are distinguished by
examining the CONTROL parameter of the procedure (to detect an
initialisation) and by testing a field of the IO.REPLY.PARS table,
to distinguish between input and output.  This table is initialised
by PROC.INIT.AP706 and is then updated by subsequent initialisation
commands.  It also provides a means of associating physical and
logical device numbers; as normal write calls by AP103 only give
physical device number, it is necessary to recover the logical
number from this table.
~BThe control messages are held in 128 byte vectors, REC.MESSAGE and
TRANS.MESSAGE, and have to be packed and unpacked byte-by-byte.
This is necessary because of the DMA action of the CIU.
~BWhen an output transfer is indicated by AP103, the size of the
data message is passed across the CIU, but no data is sent.  The
PDP11 then initiates a series of data requests, using block sizes
determined by the availability of buffer space, until all the
necessary data has been transferred.  In the case of input transfers
the data is sent by the PDP11 immediately after the control message
since the MU6 buffers are larger than those of the PDP11.  Whether
a particular control message received is a request for data is
determined by examining the data marker (byte 2).
~S~O3.2 Data Structures
~3
~T% 4 19
~
IO.REPLY.PARS -~Ian array of IO.REPLY.TYPE, indexed by physical
device number, which holds data necessary to deal with replies
from remote devices.  The fields are:-~
%DEV.NO -~Icontains the logical device number corresponding to
this physical device.~
%REPLY.ADDR -~Ithe starting address of the buffer being used by this device.~
%DEV.TYPE -~Iindicates whether this is an input or output device.~
~
TRANS.MESSAGE ) }-{~Ivectors of 128 LOGICAL8 (byte) quantities in which~
REC.MESSAGE   )~Icontrol messages are formed/received.  The significance
of the individual bytes are as follows:-~
~
  0 - low order )  }destination -{ specifies which subsystem in other~
  1 - high order)                machine this message is intended for.~
~
  2 - data marker  -  specifies if data follows.  Also used to denote~
                      a data request.~
~
  3 - low order )  }logical device number{~
  4 - high order)~
~
  5 - low order )  }control -{ contains V.IO.CONTROL value. Not used~
  6 - high order)            in data request messages.~
~
  7 - lowest byte )address - in normal messages contains V.IO.ADDRESS.~
  8 -             )          In data request messages contains source~
  9 -             )          buffer address.~
 10 - highest byte)~
~
 11 - low order   ) }count  -{ in normal messages contains V.IO.COUNT.~
 12 - high order  )          In data request messages contains~
                             adjusted transfer count.~
~
 13 - physical device number                   )~
 14 - (not used)                               ) Not used in data~
 15 - physical device mode                     ) messages.~
 16 - physical device protocol                 )~
 17 - low order ) physical device              )~
 18 - high order) line parameters              )~
~0
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                AP7061
~V9 -1
~F
@TITLE AP706(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
REMOTE I/O APPENDIX
@BOX 4.0
PROCEDURES IN THIS MODULE
1  REMOTE DEVICE CONTROL PROC
2  IO RECEIVE PROC
3  IO RESET PROC
4  IO INFORM PROC
@BOX 5.0
INITIALISATION
@BOX 6.0
END
@BOX 1.1
#AP706/1
MODULE (IO.RECEIVE, REMOTE.DEV.CONTROL,
   IO.RESET, IO.INFORM);
@BOX 2.1
TYPE IO.REPLY.TYPE IS
   LOGICAL16 DEV.NO
   ADDR REPLY.ADDR
   LOGICAL8 DEV.TYPE;
@BOX 3.1
*GLOBAL 5;
LITERAL / LOGICAL8 SET = %FF, RESET = 0, COMMS.DEV = %2, DATA.REQ = %F,
   TRANSFER.DONE = %FF, TRANSFER.FAILED = 0, OUTPUT = 1;
LITERAL / LOGICAL16 INIT.CMD = 1, SHORT.MESS.PARAM = 11,
   REMOTE.COMMS.DEV = %8, COMMS.MASK = %FFF7,
   MU6.HW.RESET = %40, TR.FAILED = %20, DEV.DISENGAGED = %1000,
   START.TR.CMD = 4;
IO.REPLY.TYPE [SYS19.MAX.REMOTE.P.DEV.NO] IO.REPLY.PARS;
@BOX 4.1
PSPEC REMOTE.DEV.CONTROL (INTEGER, INTEGER,
   ADDR, LOGICAL, LOGICAL32) / LOGICAL32;
PSPEC IO.RECEIVE () / LOGICAL32;
PSPEC IO.RESET ();
PSPEC IO.INFORM ();
PSPEC INIT.AP706 ();
*CODE 2;
   #AP706.1
   #AP706.2
   #AP706.3
   #AP706.4
@BOX 5.1
*CODE 7;
INIT.AP706 ();
*CODE 2;
PROC INIT.AP706;
INTEGER P.DEV.NUM;
FOR P.DEV.NUM < SYS19.MAX.REMOTE.P.DEV.NO DO
   0 => REPLY.ADDR OF IO.REPLY.PARS [P.DEV.NUM];
   %FFFF => DEV.NO OF IO.REPLY.PARS [P.DEV.NUM];
OD
END
@BOX 6.1
*END
@END
@TITLE AP706/1(1,11)
@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
OTHER MODULES REFERENCED
@BOX 4.0
AP103 I/O APPENDIX
AP711 CIU APPENDIX
SYS19 CONFIGURATION MANAGER
@BOX 1.1
::EXTERNAL ENVIRONMENT
@BOX 3.1
IMPORT VSTORE LOGICAL CIU.CONTROL.REG, V.FI.HW;
IMPORT LITERAL ADDR REAL.STORE.ADDRESS;
IMPORT LITERAL ADDR REC.MESSAGE.RA, TRANS.MESSAGE.RA;
IMPORT LITERAL LOGICAL AP.CIU.ACTIVITY;
@BOX 4.1
PSPEC CIU.TRANSMIT (ADDR, LOGICAL, ADDR, LOGICAL) / LOGICAL8;
PSPEC CIU.INTERRUPT ();
PSPEC NOTIFY (INTEGER, LOGICAL, LOGICAL);
IMPORT LITERAL INTEGER SYS19.MAX.REMOTE.P.DEV.NO,
   SYS20.INIT.DEV.TASK, SHORT.MESSAGE.LENGTH;
IMPORT LITERAL LOGICAL16 SYS19.PDP.IO.ADDR;
PSPEC SYS20.SET.TASK (INTEGER, INTEGER);
LOGICAL8 [SHORT.MESSAGE.LENGTH] REC.MESSAGE;
LOGICAL8 [SHORT.MESSAGE.LENGTH] TRANS.MESSAGE;
LOGICAL8 CIU.TRANSMIT.BUSY;
@END
@TITLE AP706.1(1,11)
@COL 1S-13T-8R-2R-3T-4R-7R-9R-12F
@COL 14R-11R-17N
@ROW 8-14
@ROW 4-11
@ROW 9-17
@FLOW 1-13NO-8-2-3NO-4-7-9-12
@FLOW 3YES-11-7
@FLOW 13YES-14-17-12
@BOX 1.0
REMOTE DEVICE CONTROL PROC (PHYSICAL DEV NO, CONTROL,
   DEV/ADDRESS, COUNT, DEV PARS & MODE)
@BOX 2.0
ENTER DESTINATION
IN BUFFER
@BOX 3.0
INITIALISE COMMAND?
@BOX 4.0
CREATE CONTROL MESSAGE
#AP706.1.1
@BOX 7.0
CALL CIU TRANSMIT PROC
@BOX 8.0
BOOK CIU TRANSMITTER
@BOX 9.0
RETURN NULL STATUS
@BOX 11.0
CREATE INITIALISE MESSAGE
#AP706.1.2
@BOX 12.0
END
@BOX 13.0
FEP INOPERATIVE?
@BOX 14.0
RETURN DISENGAGED OR
TRANSFER FAILED STATUS
@BOX 1.1
PROC REMOTE.DEV.CONTROL (PHYSICAL.DEV.NO, CONTROL,
   D.ADDRESS, COUNT, DEV.PARS.MODE);
LOGICAL8 TRANSMIT.STATUS;
LOGICAL32 ADDRESS.TEMP;
INTEGER I;
@BOX 2.1
FOR I < SHORT.MESSAGE.LENGTH DO
   0 => TRANS.MESSAGE [I];
OD
SYS19.PDP.IO.ADDR => TRANS.MESSAGE [0];
SYS19.PDP.IO.ADDR ->> 8 => TRANS.MESSAGE [1];
SELECT IO.REPLY.PARS [PHYSICAL.DEV.NO];
@BOX 3.1
IF CONTROL = INIT.CMD
@BOX 4.1
::CREATE CONTROL MESSAGE
#AP706.1.1
@BOX 7.1
CIU.TRANSMIT (TRANS.MESSAGE.RA, SHORT.MESS.PARAM,
   0, 0) => TRANSMIT.STATUS;
@BOX 8.1
WHILE CIU.TRANSMIT.BUSY = SET DO
   WHILE V.FI.HW & AP.CIU.ACTIVITY = 0 DO OD
   CIU.INTERRUPT ();
OD
SET => CIU.TRANSMIT.BUSY;
@BOX 9.1
0 => REMOTE.DEV.CONTROL;
@BOX 11.1
::CREATE INITIALISE MESSAGE
#AP706.1.2
@BOX 12.1
END
@BOX 13.1
IF CIU.CONTROL.REG & MU6.HW.RESET /= 0
@BOX 14.1
IF CONTROL = 0 THEN
   DEV.DISENGAGED => REMOTE.DEV.CONTROL;
ELSE
   TR.FAILED => REMOTE.DEV.CONTROL;
FI
@END
@TITLE AP706.1.1(1,11)
@COL 1S-2R-3R-4R-6R-5F
@FLOW 1-2-3-4-6-5
@BOX 1.0
CREATE CONTROL MESSAGE
@BOX 2.0
FIND LOGICAL DEVICE NUMBER
AND ENTER IN BUFFER
@BOX 3.0
CALCULATE IO ADDRESS AND
ENTER IN BUFFER
ENTER ADDRESS IN REPLY TABLE
@BOX 4.0
ENTER IO CONTROL AND
IO COUNT IN BUFFER
@BOX 5.0
END
@BOX 6.0
SET DATA MARKER IF
DATA PACKET REQUIRED
@BOX 1.1
::CREATE CONTROL MESSAGE
@BOX 2.1
DEV.NO => TRANS.MESSAGE [3];
DEV.NO ->> 8 => TRANS.MESSAGE [4];
@BOX 3.1
D.ADDRESS => REPLY.ADDR - REAL.STORE.ADDRESS
   => ADDRESS.TEMP => TRANS.MESSAGE [7];
ADDRESS.TEMP ->> 8 => ADDRESS.TEMP => TRANS.MESSAGE [8];
ADDRESS.TEMP ->> 8 => ADDRESS.TEMP => TRANS.MESSAGE [9];
ADDRESS.TEMP ->> 8 => TRANS.MESSAGE [10];
@BOX 4.1
CONTROL => TRANS.MESSAGE [5];
CONTROL ->> 8 => TRANS.MESSAGE [6];
COUNT => TRANS.MESSAGE [11];
COUNT ->> 8 => TRANS.MESSAGE [12];
@BOX 5.1
::END
@BOX 6.1
IF DEV.TYPE = OUTPUT AND
   CONTROL & START.TR.CMD /= 0 THEN
   SET => TRANS.MESSAGE [2];
FI
@END
@TITLE AP706.1.2(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
CREATE INITIALISE MESSAGE
@BOX 2.0
ENTER P.DEV.NO, IO.CONTROL
AND IO.DEV.NO IN BUFFER
@BOX 3.0
SEPARATE P.DEV.PARS AND
P.DEV.MODE AND ENTER
IN BUFFER
@BOX 4.0
OBTAIN P.DEV.PROTOCOL
AND ENTER IN BUFFER
@BOX 5.0
ENTER DATA IN
REPLY TABLE
@BOX 6.0
END
@BOX 1.1
::CREATE INITIALISE MESSAGE
@BOX 2.1
PHYSICAL.DEV.NO => TRANS.MESSAGE [13];
CONTROL => TRANS.MESSAGE [5];
CONTROL ->> 8 => TRANS.MESSAGE [6];
D.ADDRESS => TRANS.MESSAGE [3];
D.ADDRESS ->> 8 => TRANS.MESSAGE [4];
@BOX 3.1
DEV.PARS.MODE => TRANS.MESSAGE [15];
DEV.PARS.MODE ->> 8 => TRANS.MESSAGE [17];
DEV.PARS.MODE ->> 16 => TRANS.MESSAGE [18];
@BOX 4.1
IF COUNT & REMOTE.COMMS.DEV /= 0 THEN
   COUNT & COMMS.MASK ! COMMS.DEV => TRANS.MESSAGE [16];
ELSE
   COUNT => TRANS.MESSAGE [16];
FI
@BOX 5.1
D.ADDRESS => DEV.NO;
COUNT & OUTPUT => DEV.TYPE;
@BOX 6.1
::END
@END
@TITLE AP706.2(1,11)
@COL 1S-8T-2R-3R-4R-7F
@COL 12R-9R-10R-11R
@ROW 2-12
@FLOW 1-8NO-2-3-4-7
@FLOW 8YES-12-9-10-11-7
@BOX 1.0
IO RECEIVE PROC
@BOX 2.0
GET MESSAGE FROM CIU BUFFER
@BOX 3.0
CALL NOTIFY PROC
@BOX 4.0
RETURN BUFFER ADDRESS
IF DATA PACKET
@BOX 7.0
END
@BOX 8.0
TRANSFER REQUEST?
@BOX 9.0
FORM REPLY
MESSAGE
@BOX 10.0
SET UP TRANSMIT
PARAMETERS
@BOX 11.0
CALL CIU TRANSMIT
@BOX 12.0
BOOK CIU TRANSMITTER
@BOX 1.1
PROC IO.RECEIVE;
INTEGER COUNT;
LOGICAL16 LOG.DEV.NO.TEMP, CONTROL.TEMP,
   COUNT.TEMP, TRANSFER.COUNT;
LOGICAL32 ADDRESS.TEMP;
LOGICAL8 TRANSMIT.STATUS;
@BOX 2.1
REC.MESSAGE [4] <<- 8 ! REC.MESSAGE [3] => LOG.DEV.NO.TEMP;
REC.MESSAGE [6] <<- 8 ! REC.MESSAGE [5] => CONTROL.TEMP;
REC.MESSAGE [12] <<- 8 ! REC.MESSAGE [11] => COUNT.TEMP;
@BOX 3.1
NOTIFY (LOG.DEV.NO.TEMP, CONTROL.TEMP, COUNT.TEMP);
@BOX 4.1
IF REC.MESSAGE [2] = SET THEN
   0 => COUNT;
   WHILE COUNT =< SYS19.MAX.REMOTE.P.DEV.NO AND
      DEV.NO OF IO.REPLY.PARS [COUNT] /= LOG.DEV.NO.TEMP DO
      1 +> COUNT;
   OD
   REPLY.ADDR OF IO.REPLY.PARS [COUNT] => IO.RECEIVE;
ELSE
   0 => IO.RECEIVE;
FI
@BOX 7.1
END
@BOX 8.1
IF REC.MESSAGE [2] = DATA.REQ
@BOX 9.1
SYS19.PDP.IO.ADDR => TRANS.MESSAGE [0];
SYS19.PDP.IO.ADDR ->> 8 => TRANS.MESSAGE [1];
DATA.REQ => TRANS.MESSAGE [2];
REC.MESSAGE [3] => TRANS.MESSAGE [3];
REC.MESSAGE [4] => TRANS.MESSAGE [4];
@BOX 10.1
REC.MESSAGE [10] <<- 8 ! REC.MESSAGE [9] <<- 8
   ! REC.MESSAGE [8] <<- 8 ! REC.MESSAGE [7]
   + REAL.STORE.ADDRESS => ADDRESS.TEMP;
REC.MESSAGE [12] <<- 8 ! REC.MESSAGE [11] => TRANSFER.COUNT;
@BOX 11.1
CIU.TRANSMIT (TRANS.MESSAGE.RA, SHORT.MESS.PARAM,
   ADDRESS.TEMP, TRANSFER.COUNT) => TRANSMIT.STATUS;
0 => IO.RECEIVE;
@BOX 12.1
WHILE CIU.TRANSMIT.BUSY = SET DO
   WHILE V.FI.HW & AP.CIU.ACTIVITY = 0 DO OD
   CIU.INTERRUPT ();
OD
SET => CIU.TRANSMIT.BUSY;
@END
@TITLE AP706.3(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
IO RESET PROC
@BOX 2.0
CALL IO INITIALISATION
TASK
@BOX 3.0
END
@BOX 1.1
PROC IO.RESET;
@BOX 2.1
SYS20.SET.TASK (SYS20.INIT.DEV.TASK, 0);
INIT.AP706 ();
@BOX 3.1
END
@END
@TITLE AP706.4(1,11)
@COL 1S-2F
@FLOW 1-2
@BOX 1.0
IO INFORM PROC
::DUMMY
@BOX 2.0
END
@BOX 1.1
PROC IO.INFORM;
@BOX 2.1
END
@END
