@X @~
~L3 COUK1247
80
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            AP7051
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                            ISSUE 11~
~V9 -1
~P
~V9 1
~YAP7051
~S~M~OAP7 IMPLEMENTATION DESCRIPTION
~S~M~OSection 5 Version 1
~S~OCIU Appendix
~S~O1. General Description
~BThe CIU appendix provides the interface with the MU6G/PDP11 CIU
hardware. Three types of procedure are involved in data
transfers through the CIU:-~
~T% 2 6
~
%1.~Iprocedures in this module, called by other system modules wishing to send d
ata.~
%2.~Iprocedures in other system modules, called by this module when data is rece
ived.~
%3.~Ia procedure in this module to service the hardware interrupts generated by
the CIU.~
~S~O2. Interfaces~
~
Other modules used:~
   Any receiving/transmitting appendix modules~
~
Ideal hardware registers used:~
   None~
~
Interrupt procedures:~
   CIU.INTERRUPT()~
~
Interface procedures:~
   CIU.TRANSMIT(SHORT.MESS.LOC,SHORT.MESS.SIZE,DATA.LOC,DATA.SIZE)~
~
Configuration parameters:~
   SYS19.NO.OF.RECEIVE.ADDRS~
   also the following CIU hardware details~
   CIU.SHIFT.VAL~
~S~O2.1 Hardware interface
~BThe interface with the CIU hardware consists of the 4 CIU registers:~
~
   CIU.CONTROL.REG~
   CIU.RX.REG~
   CIU.TR.REG~
   CIU.NO.BYTES.REG~
~
The significance of the bits in the CIU.CONTROL.REG is shown in the following di
agram:~
~3
~Q19
~
                       | | | | | | | | | | | | | | | | |~
                        | | | | | | | | | | | | | | | |~
Transmit t'fer complete   | | | | | | | | | | | | | | |~
Other machine reset-------  | | | | | | | | | | | | | |~
Other m/c ready to receive--  | | | | | | | | | | | | |~
This m/c ready to transmit----  | | | | | | | | | | | |~
EOM to other m/c----------------  | | | | | | | | | | |~
SOM to other m/c------------------  | | | | | | | | | |~
Inhibit interrupts this machine-----  | | | | | | | | |~
Engineering mode this m/c-------------  | | | | | | | |~
Receive transfer complete---------------  | | | | | | |~
This machine hardware reset---------------  | | | | | |~
This machine ready to receive---------------  | | | | |~
Other machine ready to transmit---------------  | | | |~
EOM from other machine--------------------------  | | |~
SOM from other machine----------------------------  | |~
Inhibit interrupts other machine--------------------  |~
Engineering mode other machine------------------------~
~0
~
CIU.RX.REG - loaded with the address of the buffer to which received data is to
be directed,
right-shifted as appropriate.~
CIU.TR.REG - loaded with the address of the buffer from which data is to be tran
smitted,
right-shifted as appropriate.~
CIU.NO.BYTES.REG - loaded with the amount of data to be transferred,
in the form (number of 16 bit words to be transferred -1).
~S~O2.2 Software interface
~S11) CIU.INTERRUPT()
~BThis procedure services the hardware interrupts generated by the CIU.
The nature of the interrupt is identified and appropriate action taken.
~S12) CIU.TRANSMIT (SHORT.MESS.LOC,SHORT.MESS.SIZE,DATA.LOC,~
   ~GDATA.SIZE)~G~
~BThis procedure is called by modules wishing to transmit data across
the CIU. Transmissions take the form of a short (control) message,
followed by an optional data block. The first 16 bit word of the short
message contains the destination address; the remainder of the short
message typically contains V-store information. Parameters P3 and P4
specify the data block to follow; if P4 is zero, it is assumed
that no data block transfer is required.
~S~O3. Implementation
~S~O3.1 Outline of operation
~BThis is best considered as two separate processes, transmitting and receiving.
~S13.1.1 Transmitting
~BThe module wishing to transmit does so by setting up a short message
and, if required, a data block, and then calling CIU.TRANSMIT. Provided
no other module is using the procedure, the short message details are
loaded into the CIU registers. If a data packet is to follow its details
are temporarily stored, and its presence indicated by TR.DATA.PACKET flag.
The CIU is set to transmit and the procedure exits. When the short message
has been passed, the CIU interrupts, and the interrupt service routine
is entered. At this stage TR.DATA.PACKET is checked; if set, the data
packet parameters are loaded into the CIU, TR.DATA.PACKET reset and
the CIU set to transmit again. On the next interrupt TRANSMIT.BUSY
is reset and the transmission cycle is concluded.
~S13.1.2 Receiving
~BUnlike transmission, where the CIU is only activated when necessary,
the receive channel is always left open, except when being serviced.
Thus during initialisation the address of a suitable short message
buffer is loaded to the CIU.RX.REG and the CIU set to receive.
On completion of a transfer, the interrupt procedure is entered; if
this is the first message of a pair, it will be a control packet.
Its destination is read and the appropriate RECEIVE.PROC is called.
If a data packet is to follow, the receiving module returns a suitable
buffer address; otherwise it returns zero. The buffer address is loaded
into the CIU.RX.REG register, and the CIU set to receive. On
completion of the data transfer the interrupt routine is once again
entered.  The INFORM.PROC of the receiving module is called, to inform
it that the data transfer has been completed,
and the CIU.RX.REG reset to point to the short message
buffer, in readiness for the next control packet.
~S13.1.3 Hardware reset
~BIf the other machine is reset, an interrupt is generated.  When
the interrupt procedure detects this, the RESET.PROCs of all
receiving modules are called in turn.  Finally the initialisation
procedure of this module is run.
~S~O3.2  Data structures
~BIn addition to the CIU hardware registers described in section 2.1,
the following data structures are used:~
~T% 20
~
TR.DATA.PACKET -~Ia flag set by CIU.TRANSMIT to indicate that a data
packet is to follow the current control packet. Reset when the data packet has b
een sent.~
~
TRANSMIT.BUSY -~Ia flag set whenever a transmission is taking place.
Other modules requiring to use the CIU queue on this flag.~
~
RX.DATA.PACKET -~Ia variable used to denote that the packet about to be received
is a data packet.  It contains the destination of the preceding control packet
and is used to call the correct INFORM.PROC.
Reset when the packet has been transferred.~
~
REC.MESSAGE -~Ia byte vector in which the receive control message is stored.~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H            AP7051

~F
@TITLE AP705(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
CIU APPENDIX
@BOX 4.0
PROCEDURES IN THIS MODULE
1  INITIALISATION
2  CIU INTERRUPT
3  CIU TRANSMIT
@BOX 5.0
@BOX 6.0
END
@BOX 1.1
#AP705/1
MODULE (CIU.INTERRUPT, CIU.TRANSMIT, CIU.TRANSMIT.BUSY);
@BOX 3.1
::DATA DECLARATIONS
#AP705/2
@BOX 4.1
PSPEC INIT.AP705 ();
PSPEC CIU.INTERRUPT ();
PSPEC CIU.TRANSMIT (ADDR, LOGICAL, ADDR, LOGICAL) / LOGICAL8;
*CODE 2;
   #AP705.1
   #AP705.2
   #AP705.3
@BOX 5.1
*CODE 7;
INIT.AP705 ();
@BOX 6.1
*END
@END
@TITLE AP705/1(1,11)
@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
OTHER MODULES REFERENCED
@BOX 1.1
::EXTERNAL ENVIRONMENT
@BOX 2.1
IMPORT VSTORE LOGICAL CIU.CONTROL.REG, CIU.RX.REG,
   CIU.TR.REG, CIU.NO.WORDS.REG, PURGE.CACHE;
@BOX 3.1
IMPORT LITERAL INTEGER CIU.SHIFT.VAL;
IMPORT LITERAL ADDR REC.MESSAGE.RA;
@BOX 4.1
IMPORT LITERAL INTEGER SYS19.NO.OF.RECEIVE.ADDRS,
   SHORT.MESSAGE.LENGTH;
PSPEC RECEIVE.PROC () / LOGICAL32;
ADDR RECEIVE.PROC [SYS19.NO.OF.RECEIVE.ADDRS] RECEIVE.PROCS;
PSPEC RESET.PROC ();
ADDR RESET.PROC [SYS19.NO.OF.RECEIVE.ADDRS] RESET.PROCS;
PSPEC INFORM.PROC ();
ADDR INFORM.PROC [SYS19.NO.OF.RECEIVE.ADDRS] INFORM.PROCS;
LOGICAL8 [SHORT.MESSAGE.LENGTH] REC.MESSAGE;
@END
@TITLE AP705/2(1,11)
@COL 1S
@BOX 1.0
DATA DECLARATIONS
@BOX 1.1
*GLOBAL 5;
LOGICAL8 TR.DATA.PACKET, CIU.TRANSMIT.BUSY;
LOGICAL16 RECEIVE.ADDRESS, NO.WORDS.TEMP, RX.DATA.PACKET;
LOGICAL32 DATA.LOC.TEMP, RX.DATA.BUFFER.ADDR;
LITERAL / LOGICAL16 HARDWARE.RESET = %4000, TRANSMIT.COMPLETE = %8000,
   RESET.CIU.TRANSMIT = %EFFF, RESET.CIU.TX.INTERRUPT = %8000,
   RESET.CIU.RECEIVE = %FFDF, RESET.CIU.RX.INTERRUPT = %80,
   SET.CIU.TRANSMIT = %1000, SET.CIU.RECEIVE = %20,
   CIU.INIT = %C080, INT.MASK = CIU.INIT;
LITERAL / LOGICAL8 SET = %FF, RESET = 0,
   TRANSFER.DONE = %FF, TRANSFER.FAILED = 0;
@END
@TITLE AP705.1(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
INITIALISATION PROC
@BOX 2.0
INITIALISE CIU
CONTROL REGISTER
@BOX 3.0
RESET ALL FLAGS
@BOX 4.0
LOAD BUFFER ADDRESS
TO CIU REGISTER
@BOX 5.0
SET CIU CONTROL REG
TO RECEIVE
@BOX 6.0
END
@BOX 1.1
PROC INIT.AP705;
@BOX 2.1
CIU.INIT => CIU.CONTROL.REG;
@BOX 3.1
RESET => TR.DATA.PACKET => CIU.TRANSMIT.BUSY => RX.DATA.PACKET;
@BOX 4.1
REC.MESSAGE.RA ->> CIU.SHIFT.VAL => CIU.RX.REG;
@BOX 5.1
SET.CIU.RECEIVE => CIU.CONTROL.REG;
@BOX 6.1
END
@END
@TITLE AP705.2(1,11)
@COL 1S-2T-3T-4T-5R-7R-11F
@COL 12N-8R-9R-10R-6N
@ROW 2-12
@ROW 4-8
@FLOW 1-2NO-3NO-4NO-5-6-12-2
@FLOW 2YES-11
@FLOW 4YES-7-6
@FLOW 3YES-8-9-10-6
@BOX 1.0
CIU INTERRUPT PROC
@BOX 2.0
ALL INTERRUPTS SERVICED?
@BOX 3.0
HARDWARE RESET?
@BOX 4.0
TRANSMIT TRANSFER
COMPLETE?
@BOX 5.0
SERVICE RECEIVE CHANNEL
#AP705.2.2
@BOX 7.0
SERVICE TRANSMIT CHANNEL
#AP705.2.1
@BOX 8.0
RESET CIU
@BOX 9.0
CALL ALL
RESET PROCS
@BOX 10.0
INITIALISE
CIU APPENDIX
@BOX 11.0
END
@BOX 1.1
PROC CIU.INTERRUPT;
INTEGER COUNT;
ADDR INFORM.PROC INFORM.PROC.CALL;
ADDR RECEIVE.PROC RECEIVE.PROC.CALL;
ADDR RESET.PROC RESET.PROC.CALL;
@BOX 2.1
IF CIU.CONTROL.REG & INT.MASK = 0
@BOX 3.1
IF CIU.CONTROL.REG & HARDWARE.RESET /= 0
@BOX 4.1
IF CIU.CONTROL.REG & TRANSMIT.COMPLETE /= 0
@BOX 5.1
::SERVICE RECEIVE CHANNEL
#AP705.2.2
@BOX 7.1
::SERVICE TRANSMIT CHANNEL
#AP705.2.1
@BOX 8.1
CIU.INIT => CIU.CONTROL.REG;
@BOX 9.1
FOR COUNT < SYS19.NO.OF.RECEIVE.ADDRS DO
   RESET.PROCS [COUNT] => RESET.PROC.CALL;
   RESET.PROC.CALL^ ();
OD
@BOX 10.1
INIT.AP705 ();
@BOX 11.1
END
@END
@TITLE AP705.2.1(1,11)
@COL 1S-2R-3T-4R-5R-6R-8F
@COL 7R
@ROW 4-7
@FLOW 1-2-3NO-4-5-6-8
@FLOW 3YES-7-8
@BOX 1.0
SERVICE TRANSMIT CHANNEL
@BOX 2.0
RESET CIU READY TO TRANSMIT
AND INTERRUPT BITS
@BOX 3.0
NO DATA PACKET
TO SEND?
@BOX 4.0
LOAD DATA LOCATION
AND NUMBER OF WORDS
@BOX 5.0
RESET TR. DATA
PACKET FLAG
@BOX 6.0
SET CIU READY
TO TRANSMIT
@BOX 7.0
RESET TRANSMIT
BUSY FLAG
@BOX 8.0
END
@BOX 1.1
::SERVICE TRANSMIT CHANNEL
@BOX 2.1
RESET.CIU.TX.INTERRUPT => CIU.CONTROL.REG;
@BOX 3.1
IF TR.DATA.PACKET = RESET
@BOX 4.1
DATA.LOC.TEMP ->> CIU.SHIFT.VAL => CIU.TR.REG;
NO.WORDS.TEMP => CIU.NO.WORDS.REG;
@BOX 5.1
RESET => TR.DATA.PACKET;
@BOX 6.1
SET.CIU.TRANSMIT => CIU.CONTROL.REG;
@BOX 7.1
RESET => CIU.TRANSMIT.BUSY;
@BOX 8.1
::END
@END
@TITLE AP705.2.2(1,11)
@COL 1S-14R-2R-3T-15R-4R-5R-6R-12F
@COL 7R-8R-9T-10R-11R
@ROW 15-7
@FLOW 1-14-2-3NO-15-4-5-6-12
@FLOW 3YES-7-8-9NO DATA-6
@FLOW 9DATA-10-11-6
@BOX 1.0
SERVICE RECEIVE CHANNEL
@BOX 2.0
RESET CIU READY TO RECEIVE
AND INTERRUPT BITS
@BOX 3.0
CONTROL PACKET?
@BOX 4.0
RESET CIU BUFFER
ADDRESS TO POINT
TO CONTROL BUFFER
@BOX 5.0
RESET RX DATA
PACKET FLAG
@BOX 6.0
SET CIU READY TO
RECEIVE BIT
@BOX 7.0
READ DESTINATION
@BOX 8.0
CALL APPROPRIATE
SYSTEM PROCEDURE
TO READ MESSAGE
(RETURNS BUFFER ADDRESS)
@BOX 9.0
DATA PACKET TO FOLLOW?
@BOX 10.0
LOAD BUFFER ADDRESS
TO CIU REGISTER
@BOX 11.0
WRITE DESTINATION
IN DATA PACKET FLAG
@BOX 12.0
END
@BOX 14.0
PURGE CACHE STORES
@BOX 15.0
INFORM DESTINATION
@BOX 1.1
::SERVICE RECEIVE CHANNEL
@BOX 2.1
RESET.CIU.RX.INTERRUPT => CIU.CONTROL.REG;
@BOX 3.1
IF RX.DATA.PACKET = 0
@BOX 4.1
REC.MESSAGE.RA ->> CIU.SHIFT.VAL => CIU.RX.REG;
@BOX 5.1
0 => RX.DATA.PACKET;
@BOX 6.1
SET.CIU.RECEIVE => CIU.CONTROL.REG;
@BOX 7.1
REC.MESSAGE [0] => RECEIVE.ADDRESS;
REC.MESSAGE [1] <<- 8 !> RECEIVE.ADDRESS;
@BOX 8.1
RECEIVE.PROCS [RECEIVE.ADDRESS] => RECEIVE.PROC.CALL;
RECEIVE.PROC.CALL^ () => RX.DATA.BUFFER.ADDR;
@BOX 9.1
IF RX.DATA.BUFFER.ADDR = 0
@BOX 10.1
RX.DATA.BUFFER.ADDR ->> CIU.SHIFT.VAL => CIU.RX.REG;
@BOX 11.1
RECEIVE.ADDRESS => RX.DATA.PACKET;
@BOX 12.1
::END
@BOX 14.1
0 => PURGE.CACHE;
@BOX 15.1
INFORM.PROCS [RX.DATA.PACKET] => INFORM.PROC.CALL;
INFORM.PROC.CALL^ ();
@END
@TITLE AP705.3(1,11)
@COL 1S-5R-7T-10R-11R-6R-8R-12F
@FLOW 1-5-7NO DATA-6-8-12
@FLOW 7DATA-10-11-6
@BOX 1.0
CIU TRANSMIT PROC
   (SHORT MESSAGE LOCN, SHORT MESSAGE SIZE, DATA LOCN, NO OF WORDS)
@BOX 5.0
LOAD SHORT MESSAGE
LOCATION AND
SHORT MESSAGE LENGTH
TO CIU REGS
@BOX 6.0
SET CIU READY
TO TRANSMIT
@BOX 7.0
DATA PACKET?
@BOX 8.0
RETURN
TRANSFER DONE
@BOX 10.0
STORE LOCATION OF DATA
AND NO OF WORDS
@BOX 11.0
SET TRANSMIT DATA
PACKET FLAG
@BOX 12.0
END
@BOX 1.1
PROC CIU.TRANSMIT (SHORT.MESS.LOC, SHORT.MESS.SIZE,
   DATA.LOC, DATA.SIZE);
@BOX 5.1
SHORT.MESS.LOC ->> CIU.SHIFT.VAL => CIU.TR.REG;
SHORT.MESS.SIZE => CIU.NO.WORDS.REG;
@BOX 6.1
SET.CIU.TRANSMIT => CIU.CONTROL.REG;
@BOX 7.1
IF DATA.SIZE = 0
@BOX 8.1
TRANSFER.DONE => CIU.TRANSMIT;
@BOX 10.1
DATA.LOC => DATA.LOC.TEMP;
DATA.SIZE => NO.WORDS.TEMP;
@BOX 11.1
SET => TR.DATA.PACKET;
@BOX 12.1
END
@END

