          IDENT  ESMD
          CIPPU

          TITLE  ESMD - NOS/VE ESM/STORNET DRIVER FOR FILE SERVER
          COMMENT *SMD* LVL=01
          COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC. 1992.
          EJECT
*****     ESMD - ESM/STORNET PP DRIVER FOR NOS/VE FILE SERVER.
*
***       ESMD is a driver PP program which operates on behalf of the NOS/VE
*         File Server subsystem using an ESM/STORNET device to link from two
*         to eight mainframes together in a File Server configuration.
*
*         Both the ESM and STORNET device are supported by this driver, in
*         fact the program is not aware of which device is present. The driver
*         utilizes the "four bit flag registers" and one "low speed port";
*         the ESM/STORNET "fast transfer mode" is selected only when the driver
*         instructed to utilize the I4 DMA ENHANCE C170 ADAPTER channel.
*
*         This program will function in one of serveral modes depending on
*         configuration parameters passed to the driver via the File Server
*         Queue Interface Table (QIT).
*           Number of PPs:
*             File Server may utilize either one or two PP drivers. If one is
*             specified it performs both SEND TO and READ FROM ESM/STORNET
*             operations. If two is specified, one is responsible for processing
*             requests in the "Request Buffer", the other is responsible for
*             detecting and processing request in ESM/STORNET memory.
*           I/O Channel:
*             This program requires one channel, and expects exclusive access to
*             the assigned channel. The following channel types are supported -
*                Standard CY170 channel
*                I4 with DMA ENHANCED C170 ADAPTER
*                I0/S0 CYBER 170 Channel Adapter (ICI)
*
*
**        ESMD ASSEMBLY OPTIONS.
*
 ERETRY   EQU    10D         MAXIMUM NUMBER OF RETRIES ON ERROR

**        ESMD CONSTANTS.
*
 MAXREQ   EQU    14D         MAXIMUM PP REQUEST LENGTH - CM WORDS
 MLUC     EQU    1           MAXIMUM NUMBER OF LOGICAL UNITS SUPPORTED
 PAGSZ    EQU    4096        OPTIMUM SIZE OF I/O BUFFER IN 8 BIT BYTES
 PPMSZ    EQU    4096        PP MEMORY SIZE IN PP WORDS

**        ESMD / FILE SERVER CONSTANTS.
*         REFERENCE DECKS:
*             DFC$ESM_ALLOCATION_CONSTANTS
*             DFT$QUEUE_INDEX
*
 MAXDIV   EQU    16D         MAXIMUM NUMBER OF ESM DIVISIONS
 MAXIDN   EQU    8D          MAXIMUM NUMBER OF MACHINES
 MAXIND   EQU    64          MAXIMUM INDIRECT LIST LENGTH IN CM WORDS
 MAXQDE   EQU    16D         MAXIMUM NUMBER OF QUEUE DIRECTORY ENTRIES
 POLLQEI  EQU    1           POLL TASK'S QUEUE ENTRY INDEX
          EJECT
** FILE SERVER / ESMD OVERVIEW.
*
*  The players in a file server system consist of 'client tasks' which reside
*  on the 'client side', and 'server tasks' which reside on the 'server side'
*  of a file server configuration. The client initiates communication with the
*  server through a queue entry in a client to server queue. The queue entry is
*  processed by the client side PP driver (ESMD) which sends to the server side
*  PP driver. The server side PP driver receives into buffers pointed to by the
*  corresponding queue entry in a server to client queue.
*  The link between the client side ESMD and the server side ESMD is extended
*  semiconductor memory (ESM) and also known as a STORNET device.
*
*  ESMD provides for sending and receiving data from/to two separate central
*  memory buffers pointed to by each queue entry. The first of these is a
*  preallocated buffer, the length of which is 4096 bytes at most. The second
*  may be from 1 to 64 buffer areas, each of which may not cross a CM page
*  boundary. ESMD knows nothing of the contents of the data, however, by file
*  server definition the preallocated buffer is used for file server commands
*  and responses, and the list of from 1 to 64 buffers is used for file data.
*
*  ESM resources are divided among the ESM connected mainframes according to
*  parameters in the ESM record of the queue interface table. The contents of
*  the ESM record must be the same for all the mainframe's PP drivers so that
*  each PP knows which portion of ESM belongs to itself (source), and every
*  other PP (destination).
*
*  A block of ESM memory is set aside for each machine in the file server
*  configuration. Each block is subdivided into the number of specified
*  divisions, and an ESM four bit flag register is associated with each
*  subdivision of each block and with each machine in the configuration.
*  Each subdivision will be large enough to accomodate 4096 bytes of
*  command/response data, and from 16384 to 262144 bytes of file page data
*  depending on configuration parameters, and 24 bytes of "header" information
*  create by the PP driver (ESMD).
*
*  Each mainframe identifies itself and all other mainframes by a machine id
*  number assigned when the file server system configuration is defined. Each PP
*  is informed of it's own (source) machine id number via the queue directory
*  header record source id number field, and of the other mainframe's machine id
*  numbers which are specified in each driver queue header destination id number
*  field. The machine id number is a value of from one to "MAXIDN". The first
*  block of ESM memory belongs to machine id number one, the second to machine
*  id number two, etc. The subdivisions of a block provide a pool of ESM
*  buffers. The availability of a subdivision is determined via the
*  corresponding ESM four bit flag register.
*
*  A mainframe's PP driver sends to another mainframe by reserving a subdivision
*  of the ESM memory block belonging to the mainframe it is sending to, writing
*  the message data into ESM memory, and then indicating that the block's
*  subdivision is full. A mainframe's PP driver always receives (inputs) from
*  the ESM block which corresponds to it's (source) id number. The ESM four bit
*  flag register associated with each ESM memory block subdivision is the
*  mechanism which provides the 'reserved' and 'full' indications. The sending
*  PP sets the indicators, the receiving PP clears them. Any contention for
*  the same four bit flag register by multiple senders is resolved by ESM.
          EJECT
** ILLUSTRATION OF A TWO MACHINE FILE SERVER CONFIGURATION.
*
*       MACHINE ID NO. 1                         MACHINE ID NO. 2                      .
*   .........................               .........................
*  .      CLIENT SIDE        .             .       SERVER SIDE       .
* .                           .           .                           .
* ******************             *******             ******************
* *CLIENT TO SERVER*    *****    * ESM *    *****    *SERVER TO CLIENT*
* * ID NO.2 QUEUE  *  <---<-----<-------<-----<---<  * ID NO.1 QUEUE  *
* *----------------* /  * E *    *BLK 1*    * E *  \ *----------------*
* * QUEUE ENTRY 1  */   * S *    *     *    * S *   \* QUEUE ENTRY 1  *
* *----------------*\   * M *    *-----*    * M *   /*----------------*
* * QUEUE ENTRY 2  * \  * D *    *     *    * D *  / * QUEUE ENTRY 2  *
* *----------------*  \ *   *    * ESM *    *   * /  *----------------*
* *----------------*   >-->----->------->----->-->   *----------------*
* * QUEUE ENTRY N  *    *****    *BLK 2*    *****    * QUEUE ENTRY N  *
* ******************             *******             ******************
*
*
*  There are eight low speed ports on the ESM hardware, and each mainframe's PP
*  driver requires low speed port access to ESM. This limits an ESM connected
*  file server configuration to a maximum of eight mainframes. The maximum
*  number of subdivisions has been arbitrarily set at "MAXDIV", any real
*  limitation would be a function of ESM memory size.
          EJECT
** NOS/VE FILE SERVER / ESMD PP DRIVER INTERFACE.
*
*  ESMD utilizes the standard NOS/VE IOU interface tables. The PP interface
*  table (PIT) is used by ESMD as any typical NOS/VE PP driver uses it. The PIT
*  provides support of PP requests and information about the PP response buffer.
*  The difference between ESMD and typical NOS/VE PP drivers is in the request
*  queueing scheme. Instead of the unit interface table 'RMA of next request'
*  field pointing to the top of a unit request queue, for ESMD the same field is
*  the RMA of the file server 'queue interface table'.
*
*  The queue interface table contains information about -
*         1. the 'request buffer' - a circular buffer of entries
*            stored by file server CPU routines. each entry consists
*            of a queue index and queue entry index.
*         2. 'ESM base address' record - which defines the number of
*            mainframes in the ESM file server configuration, and
*            parameters used by ESMD to determine the allocation of
*            ESM among the mainframes.
*         3. the 'queue directory' - a table of 'driver queue' RMA's
*            indexed by queue index. the queue directory header
*            contains information about the number of driver queues
*            pointed to by the directory, and parameters for ESMD
*            initialization.
*
*  Each driver queue consists of -
*         1. a 'queue header' - which defines the queue type
*            ('client to server' or 'server to client'), number of
*            queue entries contained in the queue, and the machine
*            id number and queue index which this queue is connected
*            to in the file server configuration.
*         2. from 1 to 127 'queue entries' - each of which contain
*            control, command, and event/status flags, RMA's of the
*            preallocated send and receive buffers, and the RMA of a
*            list of from 1 to 4 RMA's of send/receive buffers.
*
*  The request buffer serves as the ESMD request queue. A file server task
*  obtains a queue entry, sets the appropriate command flags and RMA's, stores
*  file server command/response and/or page data in the buffers, and arranges
*  for the queue index/queue entry index to be placed in the next available
*  request buffer entry.
*
*  The request buffer entries are stored on a first come first served basis.
*  The request buffer is a circular buffer, the 'in' offset is an index to the
*  next available slot. the 'out' offset, used and advanced by ESMD, is an index
*  to the next entry to be processed.
*
*  When ESMD determines that the task (which owns the queue entry) is needed to
*  process the results of the request, a response is written to the PP response
*  buffer. The file server PP response processor will located and activate the
*  file server task.
          EJECT
** DRIVER QUEUE HEADER DEFINITION.
*
* DRIVER QUEUE HEADER -
*       *-------------------------------------------------------*
*    1  * I           *  INT/PORT   *             *     NQE     *
*       *-------------------------------------------------------*
*    2  * S           *    SIDN     *             * SQI    SQEI *
*       *-------------------------------------------------------*
*    3  * S           *    DIDN     *             * DQI    DQEI *
*       *-------------------------------------------------------*
*    4  *             *             *             *             *
*       *-------------------------------------------------------*
*
*       CM word 1 -
*         I        = Boolean, TRUE if queue is IDLE.
*         INT/PORT = Interrupt selection and port number.
*         NQE      = Number of queue entries in this queue.
*       CM word 2 -
*         S        = Boolean, TRUE if queue type is SERVER TO CLIENT.
*         SIDN     = Source machine id number.
*         SQI      = Source queue index.
*         SQEI     = Source queue entry index.
*       CM word 3 -
*         S        = Boolean, TRUE if queue type is SERVER TO CLIENT.
*         DIDN     = Destination machine id number.
*         DQI      = Destination queue index.
*         DQEI     = Destination queue entry index.
*       CM word 4 - (unused driver queue header word)
*
*       ESM Header -
*         The ESM header is derived from CM words 2 and 3 of the
*         driver queue header plus one additional CM word.
*       *-------------------------------------------------------*
*    1  * S           *    SIDN     *             * SQI    SQEI *
*       *-------------------------------------------------------*
*    2  * S           *    DIDN     *             * DQI    DQEI *
*       *-------------------------------------------------------*
*    3  *    FLAGS    *    SPMSG    *     WCB     *     WCD     *
*       *-------------------------------------------------------*
*
*       CM word 1 - Same as driver queue header CM word 2.
*       CM word 2 - Same as driver queue header CM word 3.
*       CM word 3 -
*         FLAGS    = identify special message types
*                    ERR - special message is error condition code.
*                    INQ - special message is Inquiry message.
*         SPMSG    = the special message value.
*         WCB      = CM word count of buffer data in ESM.
*         ECD      = CM word count of page data in ESM.

** QUEUE ENTRY FLAGS DEFINITION.
*
* Queue Entry Control Flags -
*  The queue entry control flags determine which file server component has
*  access to the queue entry. As a general rule the CPU component has access to
*  the queue entry as long as the subsystem action flag is true. The driver has
*  access to the queue entry as long as the subsystem action flag is false.
*  The active entry flag is set when the queue entry is assigned to a file
*  server task.
*
* ACTIVE ENTRY     - Set by subsystem when queue entry assigned.
*  'ACTIVE'          Cleared by subsystem when queue entry released.
*
* DRIVER ACTION    - Set by subsystem to indicate request is ready for driver.
*  'DRIVER'          Cleared by driver when request process.
*
* SUBSYSTEM ACTION - Set by dfp$process_server_response prior to task activate.
*  'SUBSYS'          Cleared by subsystem when queue entry released.
*
* PROCESS RESPONSE - Set by driver when server response written.
*  'PRORSP'          Cleared by dfp$process_server_response.
*
* ERROR ALERT      - Set by driver when error detected.
*  'ERRALT'          Cleared by subsystem when error processed.
*
*
* Driver Command Flags -
*  The queue entry "command" flags are set by the subsystem. These flags define
*  the action to be taken by the driver. The driver clears the command flag as
*  the specified action is executed.
*
* SEND BUFFER      - Set by subsystem to command driver to send
*  'SNDBUF'          data contained in preallocated send buffer.
*                    Cleared by driver after buffer data sent.
*
* SEND DATA        - Set by subsystem to command driver to send PAGE
*  'SNDDAT'          data at specified address (indirect option).
*                    Cleared by driver after page data sent.
*
* SEND DATA PROMPT - Set by subsystem to command driver to read
*  'SNDPMT'          page data (held over in ESM from previous request).
*                    Cleared by driver after held over page data read.
*
*
* Queue Entry Event/Status Flags -
*  The queue entry "event status" flags are set by the driver. These flags
*  indicate events which have occurred and allow the subsystem to determine the
*  state of the request. The subsystem clears these flags after recognition
*  and appropriate processing.
*
* BUFFER SENT      - Set by driver after data in preallocated
*  'BUFSNT'          send buffer is sent.
*                    Cleared by subsystem.
*
* DATA SENT        - Set by driver after page data at specified
*  'DATSNT'          address is sent (indirect option).
*                    Cleared by subsystem.
*
* BUFFER RECEIVED  - Set by driver after data received and stored
*  'BUFRCV'          in preallocated RECEIVE BUFFER.
*                    Cleared by subsystem.
*
* DATA RECEIVED    - Set by driver after page data received and
*  'DATRCV'          stored at specified address (indirect option).
*                    Cleared by subsystem
          EJECT
**  PP RESPONSE DECISION TABLE.
*  ESMD knows nothing of the contents of the data passed between the mainframes
*  in a file server configuration, however, queue type and buffer type sent or
*  received are used by ESMD to enforce file server subsystem/ESMD protocol
*  rules which define when ESMD will store a PP response buffer entry.
*
*   ALERT SUBSYSTEM VIA PP RESPONSE BUFFER ENTRY -
*
*    *--------------------------------------------------------*
*    * DRIVER SETS    *    STORE PP RESPONSE BUFFER ENTRY     *
*    * CURRENT EVENT  * CLIENT TO SERVER  * SERVER TO CLIENT  *
*    *  FLAGS         *   QUEUE ENTRY     *   QUEUE ENTRY     *
*    *--------------------------------------------------------*
*    * BUFSNT = TRUE  *        NO         *       NO          *
*    * DATSNT = FALSE *                   * CLEAR QUEUE ENTRY *
*    *--------------------------------------------------------*
*    * BUFSNT = TRUE  *        NO         *       YES         *
*    * DATSNT = TRUE  *                   *                   *
*    *--------------------------------------------------------*
*    * BUFSNT = FALSE *        NO         *       YES         *
*    * DATSNT = TRUE  *                   *                   *
*    *--------------------------------------------------------*
*    * BUFRCV = TRUE  *        YES        *       YES         *
*    * DATRCV = FALSE *                   *                   *
*    *--------------------------------------------------------*
*    * BUFRCV = TRUE  *        YES        *       YES         *
*    * DATRCV = TRUE  *                   *                   *
*    *--------------------------------------------------------*
*    * BUFRCV = FALSE *        YES        *       YES         *
*    * DATRCV = TRUE  *                   *                   *
*    *--------------------------------------------------------*
*    * DRVERR = TRUE  *        YES        *       YES         *
*    * ALL OTHERS N/A *                   *                   *
*    *--------------------------------------------------------*
          EJECT
*** PROTOCOL EXAMPLES.
*
** KEY -
*   C = client task
*   D = PP driver ESMD
*   S = server task
*
*   The character '<' and '>' represent arrows indicating which program is
*   writing or reading the four bit flag registers.
*   NOTE - The SUBSYS ACTION flag is shown here as being set by the PP driver
*          when in fact it is set by dfp$process_server_response just prior
*          to task activation.
*
*
** I. Write Page Request
*    (to SERVER without page space pre-allocated)
*
* /------- CLIENT SIDE ----------------\ /---------------- SERVER SIDE -------\
*      CLIENT TO SERVER QE         ESM  .  ESM         SERVER TO CLIENT QE
*   --------.-------.--------     FLAGS . FLAGS     --------.-------.--------
*    QUEUE  .DRIVER . EVENT       ----- . -----      QUEUE  .DRIVER . EVENT
* S  CONTROL.COMMAND. STATUS      D R R . D R R      CONTROL.COMMAND. STATUS  S
* U --------.-------.--------     A E E . A E E     --------.-------.-------- U
* B  A D S D.S S U S.B D B D      T A S . T A S      A D S D.S S U S.B D B D  B
* S  C R U R.N N N N.U A U A   D  A D E . A D E  D   C R U R.N N N N.U A U A  S
* Y  T I B V.D D U D.F T F T   R  H Y R . H Y R  R   T I B V.D D U D.F T F T  Y
* S  I V S E.B D S P.S S R R   I  E   V . E   V  I   I V S E.B D S P.S S R R  S
* T  V E Y R.U A E M.N N C C   V  L   E . L   E  V   V E Y R.U A E M.N N C C  T
* E  E R S R.F T D T.T T V V   E  D   D . D   D  E   E R S R.F T D T.T T V V  E
* M --------.-------.--------  R  ----- . -----  R   -------.-------.-------- M
*           .       .                   .                   .       .
* C> 1 0 0 0 0 0 0 0 0 0 0 0                         1 0 0 0 0 0 0 0 0 0 0 0
* C> 1 1 0 0 1 1 0 0 0 0 0 0
*                              D--------> 0 1 1  D>  1 0 1 0 0 0 0 0 0 0 1 0
*    1 0 0 0 0 0 0 0 1 1 0 0  <D          1 0 1 <D
*                                                             RESPONSE ------>S
*
*                                                    1 1 0 0 0 0 0 1 0 0 0 0 <S
*                                         1 0 1  D>  1 0 1 0 0 0 0 0 0 0 0 1
*                                         0 0 0 <D
*                                                             RESPONSE ------>S
*
*                                                    1 1 0 0 1 0 0 0 0 0 0 0 <S
*    1 0 1 0 0 0 0 0 1 1 1 0  <D  0 1 1 <--------D
*                              D> 0 0 0          D>  1 0 0 0 0 0 0 0 0 0 0 0
* C<------- RESPONSE
*
* C> 0 0 0 0 0 0 0 0 0 0 0 0
          EJECT
** II. Write Page Request
*      (to SERVER with page space pre_allocated)
*
* /------- CLIENT SIDE ----------------\ /---------------- SERVER SIDE -------\
*      CLIENT TO SERVER QE         ESM  .  ESM         SERVER TO CLIENT QE
*   --------.-------.--------     FLAGS . FLAGS     --------.-------.--------
*    QUEUE  .DRIVER . EVENT       ----- . -----      QUEUE  .DRIVER . EVENT
* S  CONTROL.COMMAND. STATUS      D R R . D R R      CONTROL.COMMAND. STATUS  S
* U --------.-------.--------     A E E . A E E     --------.-------.-------- U
* B  A D S D.S S U S.B D B D      T A S . T A S      A D S D.S S U S.B D B D  B
* S  C R U R.N N N N.U A U A   D  A D E . A D E  D   C R U R.N N N N.U A U A  S
* Y  T I B V.D D U D.F T F T   R  H Y R . H Y R  R   T I B V.D D U D.F T F T  Y
* S  I V S E.B D S P.S S R R   I  E   V . E   V  I   I V S E.B D S P.S S R R  S
* T  V E Y R.U A E M.N N C C   V  L   E . L   E  V   V E Y R.U A E M.N N C C  T
* E  E R S R.F T D T.T T V V   E  D   D . D   D  E   E R S R.F T D T.T T V V  E
* M --------.-------.--------  R  ----- . -----  R   -------.-------.-------- M
*           .       .                   .                   .       .
* C> 1 0 0 0 0 0 0 0 0 0 0 0                         1 0 0 0 0 0 0 0 0 0 0 0
* C> 1 1 0 0 1 1 0 0 0 0 0 0
*                              D--------> 0 1 1  D>  1 0 1 0 0 0 0 0 0 0 1 1
*    1 0 0 0 0 0 0 0 1 1 0 0  <D          0 0 0 <D
*                                                             RESPONSE ------>S
*
*                                                    1 1 0 0 1 0 0 0 0 0 0 0 <S
*    1 0 0 1 0 0 0 0 1 1 1 0  <D  0 1 1 <--------D
*                              D> 0 0 0          D>  1 0 0 0 0 0 0 0 0 0 0 0
* C<------- RESPONSE
*
* C> 0 0 0 0 0 0 0 0 0 0 0 0
          EJECT
** III. Read Page Request
*       (from SERVER, page space pre_allocated)
*
* /------- CLIENT SIDE ----------------\ /---------------- SERVER SIDE -------\
*      CLIENT TO SERVER QE         ESM  .  ESM         SERVER TO CLIENT QE
*   --------.-------.--------     FLAGS . FLAGS     --------.-------.--------
*    QUEUE  .DRIVER . EVENT       ----- . -----      QUEUE  .DRIVER . EVENT
* S  CONTROL.COMMAND. STATUS      D R R . D R R      CONTROL.COMMAND. STATUS  S
* U --------.-------.--------     A E E . A E E     --------.-------.-------- U
* B  A D S D.S S U S.B D B D      T A S . T A S      A D S D.S S U S.B D B D  B
* S  C R U R.N N N N.U A U A   D  A D E . A D E  D   C R U R.N N N N.U A U A  S
* Y  T I B V.D D U D.F T F T   R  H Y R . H Y R  R   T I B V.D D U D.F T F T  Y
* S  I V S E.B D S P.S S R R   I  E   V . E   V  I   I V S E.B D S P.S S R R  S
* T  V E Y R.U A E M.N N C C   V  L   E . L   E  V   V E Y R.U A E M.N N C C  T
* E  E R S R.F T D T.T T V V   E  D   D . D   D  E   E R S R.F T D T.T T V V  E
* M --------.-------.--------  R  ----- . -----  R   -------.-------.-------- M
*           .       .                   .                   .       .
* C> 1 0 0 0 0 0 0 0 0 0 0 0                         1 0 0 0 0 0 0 0 0 0 0 0
* C> 1 1 0 0 1 0 0 0 0 0 0 0
*                              D--------> 0 1 1  D>  1 0 1 0 0 0 0 0 0 0 1 0
*    1 0 0 0 0 0 0 0 1 0 0 0  <D          0 0 0 <D
*                                                             RESPONSE ------>S
*
*                                                    1 1 0 0 1 1 0 0 0 0 0 0 <S
*    1 0 1 0 0 0 0 0 1 0 1 1  <D  0 1 1 <--------D
*                              D> 0 0 0          D>  1 0 1 0 0 0 0 0 1 1 0 0
* C<------- RESPONSE                                          RESPONSE ------>S
*
* C> 0 0 0 0 0 0 0 0 0 0 0 0                         1 0 0 0 0 0 0 0 0 0 0 0 <S
          EJECT
** IV. Read Page Request
*      (from SERVER, page space not pre-allocated)
*
* /------- CLIENT SIDE ----------------\ /---------------- SERVER SIDE -------\
*      CLIENT TO SERVER QE         ESM  .  ESM         SERVER TO CLIENT QE
*   --------.-------.--------     FLAGS . FLAGS     --------.-------.--------
*    QUEUE  .DRIVER . EVENT       ----- . -----      QUEUE  .DRIVER . EVENT
* S  CONTROL.COMMAND. STATUS      D R R . D R R      CONTROL.COMMAND. STATUS  S
* U --------.-------.--------     A E E . A E E     --------.-------.-------- U
* B  A D S D.S S U S.B D B D      T A S . T A S      A D S D.S S U S.B D B D  B
* S  C R U R.N N N N.U A U A   D  A D E . A D E  D   C R U R.N N N N.U A U A  S
* Y  T I B V.D D U D.F T F T   R  H Y R . H Y R  R   T I B V.D D U D.F T F T  Y
* S  I V S E.B D S P.S S R R   I  E   V . E   V  I   I V S E.B D S P.S S R R  S
* T  V E Y R.U A E M.N N C C   V  L   E . L   E  V   V E Y R.U A E M.N N C C  T
* E  E R S R.F T D T.T T V V   E  D   D . D   D  E   E R S R.F T D T.T T V V  E
* M --------.-------.--------  R  ----- . -----  R   -------.-------.-------- M
*           .       .                   .                   .       .
* C> 1 0 0 0 0 0 0 0 0 0 0 0                         1 0 0 0 0 0 0 0 0 0 0 0
* C> 1 1 0 0 1 0 0 0 0 0 0 0
*                              D--------> 0 1 1  D>  1 0 1 0 0 0 0 0 0 0 1 0
*    1 0 0 0 0 0 0 0 1 0 0 0  <D          0 0 0 <D
*                                                             RESPONSE ------>S
*
*                                                    1 1 0 0 1 1 0 0 0 0 0 0 <S
*    1 0 1 0 0 0 0 0 1 0 1 0  <D  0 1 1 <--------D
*                              D> 1 0 1          D>  1 0 1 0 0 0 0 0 1 1 0 0
* C<------- RESPONSE                                          RESPONSE ------>S
*
*                                                    1 0 0 0 0 0 0 0 0 0 0 0 <S
* C> 1 1 0 0 0 0 0 1 0 0 0 0
*    1 0 0 0 0 0 0 0 0 0 0 1  <D  1 0 1
*                              D> 0 0 0
* C<------- RESPONSE
*
* C> 0 0 0 0 0 0 0 0 0 0 0 0
          EJECT
** V. Attach File Request
*     (or any exchange message type request)
*
* /------- CLIENT SIDE ----------------\ /---------------- SERVER SIDE -------\
*      CLIENT TO SERVER QE         ESM  .  ESM         SERVER TO CLIENT QE
*   --------.-------.--------     FLAGS . FLAGS     --------.-------.--------
*    QUEUE  .DRIVER . EVENT       ----- . -----      QUEUE  .DRIVER . EVENT
* S  CONTROL.COMMAND. STATUS      D R R . D R R      CONTROL.COMMAND. STATUS  S
* U --------.-------.--------     A E E . A E E     --------.-------.-------- U
* B  A D S D.S S U S.B D B D      T A S . T A S      A D S D.S S U S.B D B D  B
* S  C R U R.N N N N.U A U A   D  A D E . A D E  D   C R U R.N N N N.U A U A  S
* Y  T I B V.D D U D.F T F T   R  H Y R . H Y R  R   T I B V.D D U D.F T F T  Y
* S  I V S E.B D S P.S S R R   I  E   V . E   V  I   I V S E.B D S P.S S R R  S
* T  V E Y R.U A E M.N N C C   V  L   E . L   E  V   V E Y R.U A E M.N N C C  T
* E  E R S R.F T D T.T T V V   E  D   D . D   D  E   E R S R.F T D T.T T V V  E
* M --------.-------.--------  R  ----- . -----  R   -------.-------.-------- M
*           .       .                   .                   .       .
* C> 1 0 0 0 0 0 0 0 0 0 0 0                         1 0 0 0 0 0 0 0 0 0 0 0
* C> 1 1 0 0 1 0 0 0 0 0 0 0
*                              D--------> 0 1 1  D>  1 0 1 0 0 0 0 0 0 0 1 0
*    1 0 0 0 0 0 0 0 1 0 0 0  <D          0 0 0 <D
*                                                             RESPONSE ------>S
*
*                                                    1 1 0 0 1 0 0 0 0 0 0 0 <S
*    1 0 1 0 0 0 0 0 1 0 1 0  <D  0 1 1 <--------D
*                              D> 0 0 0          D>  1 0 0 0 0 0 0 0 0 0 0 0
* C <------ RESPONSE
*
* C> 0 0 0 0 0 0 0 0 0 0 0 0
          EJECT
          TITLE  MACRO DEFINITIONS
*** COMMON DECKS
*
*COPYC IODMAC1    "RECORD DEFINITION MACROS"
*COPYC IODMAC2    "LOAD/STORE MACROS"
*COPYC IODMAC3    "GENERAL MACROS"
*COPYC IODMAC4    "GENERAL MACROS"
          SPACE  4,13
*** LOCAL MACROS.
** NAME-- PAGEIO.
*
** PURPOSE-- DEFINE RETURN JUMP TO *CIO* INSTRUCTIONS SO THAT
*            LOCATIONS CAN BE SAVED IN A TABLE.

PAGEIO    MACRO
          LOCAL  TAG
 TAG      RJM    CIO
 TCIO     RMT
          CON    TAG+1
          RMT
PAGEIO    ENDM
          SPACE  4,10
** NAME-- RECOVER.
*
** PURPOSE-- CALLS SUBROUTINE 'ENG' TO BUILD ENGINEERING ERROR LOG RESPONSE
*            AND DETERMINE IF RECOVERY MAY BE ATTEMPTED.
*

RECOVER   MACRO  TAG
          RJM    ENG
          LJM    TAG
RECOVER   ENDM
          TITLE  TABLE RECORD DEFINITIONS
*
* PP TABLE.
*
 PT       RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 PART     PPWORD             PARTNER PP NUMBER
 PIT      RMA                PP INTERFACE TABLE ADDRESS (RMA)
 PITPVA   STRUCT 24          PP INTERFACE TABLE ADDRESS (PVA)

 PT       RECEND
          SPACE  6
*
* PP INTERFACE TABLE.
*
 PIT      RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT
 UNITC    PPWORD             NUMBER OF UNITS
          ALIGN  0,64
 INT      RMA                INTERRUPT WORD (RMA)
 CHAN     RMA                CHANNEL TABLE (RMA)
          ALIGN  16,64
 CBUFL    PPWORD             COMMUNICATION BUFFER LENGTH
 CBUF     RMA                COMMUNICATION BUFFER (RMA)
 LOCK     BOOLEAN            PP REQUEST QUEUE LOCK
          ALIGN  48,64
 LOCKPP   PPWORD             PP REQUEST QUEUE LOCK OWNER
          ALIGN  16,64
 PPQPVA   STRUCT 6           NEXT QUEUED PP REQUEST (PVA)
          ALIGN  32,64
 PPQ      RMA                NEXT QUEUED PP REQUEST (RMA)
          ALIGN  16,64
 RSPVA    STRUCT 14          RESPONSE BUFFER (PVA)
          ALIGN  32,64
 RSBUF    RMA                RESPONSE BUFFER (RMA)
          ALIGN  48,64
 IN       PPWORD             IN POINTER
          ALIGN  48,64
 OUT      PPWORD             OUT POINTER
          ALIGN  48,64
 LIMIT    PPWORD             LIMIT POINTER

 PIT      RECEND
          EJECT
*
* UNIT DESCRIPTORS.
*
 UD       RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 UQTPVA   STRUCT 6           UNIT INTERFACE TABLE (PVA)
 CHAN     SUBRANGE 0,377B    CHANNEL NUMBER
 CNTRLR   SUBRANGE 0,377B    CONTROLLER NUMBER
 UNIT     PPWORD             PHYSICAL UNIT NUMBER
 UQT      RMA                UNIT INTERFACE TABLE (RMA)

 UD       RECEND
          SPACE  6
*
* UNIT INTERFACE TABLE.
*
 UIT      RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 DSABLE   BOOLEAN            UNIT IS ENABLED/DISABLED. (SET = DISABLED)
          ALIGN  32,64
 UTYPE    PPWORD             UNIT TYPE
                               = 400B, 844-4X
                               = 401B, 885-1X
                               = 402B, 885-42
 QCNT     PPWORD             QUEUE COUNT
*
          ALIGN  16,64
 UBUFL    PPWORD             UNIT COMMUNICATION BUFFER LENGTH
 UBUF     RMA                UNIT COMMUNICATION BUFFER (RMA)
 ULOCK    BOOLEAN            UNIT IS RESERVED FOR EXCLUSIVE USE
          ALIGN  48,64
 ULOCKP   PPWORD             UNIT LOCK OWNER
 QLOCK    BOOLEAN            UNIT QUEUE LOCK
          ALIGN  48,64
 QLOCKP   PPWORD             UNIT QUEUE LOCK OWNER
          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)

 UIT      RECEND
          EJECT

******* QUEUE INTERFACE TABLE ************************************
*
*   REQUEST BUFFER DIRECTORY.

 RBD      RECORD PACKED

          ALIGN  48,64
 IN       PPWORD             REQUEST BUFFER IN OFFSET

          ALIGN  48,64
 OUT      PPWORD             REQUEST BUFFER OUT OFFSET

          ALIGN  48,64
 LIMIT    PPWORD             REQUEST BUFFER LIMIT OFFSET

          ALIGN  32,64
 RBRMA    RMA                REQUEST BUFFER RMA

          ALIGN  16,64
 RBPVA    STRUCT 6           REQUEST BUFFER PVA

 RBD      RECEND

*
*   ESM BASE ADDRESSES.
*    THIS RECORD IS CONTAINED WITHIN THE QUEUE INTERFACE TABLE

 ESM      RECORD PACKED
          ALIGN  0,64
 NMACH    PPWORD             NUMBER OF MACHINES
 NDIVS    PPWORD             NUMBER OF DIVISIONS PER MACHINE
 BFLGA    PPWORD             BASE ESM FLAG REGISTER ADDRESS
 BMEMA    PPWORD             UPPER BITS OF BASE ESM MEMORY ADDRESS / 100(8)
          PPWORD             LOWER 16 BITS OF BASE ESM MEMORY ADDRESS / 100(8)
 DIVSZ    PPWORD             ESM DIVISION SIZE IN 60 BIT ESM WORDS / 100(8)
 D12CW    PPWORD             ESM DIVISION SIZE IN 12 BIT CHANNEL WORDS / 100(8)
 D16CW    PPWORD             ESM DIVISION SIZE IN 16 BIT CHANNEL WORDS / 100(8)

 ESM      RECEND

*
*   MAXIMUM_DATA_BYTES.
*

 MXB      RECORD PACKED
          ALIGN  0,64
          INTEGER            MAXIMUM ESM DATA RECORD BYTES
 MXB      RECEND

*
*   QUEUE DIRECTORY HEADER.
*

 QDH      RECORD PACKED
 DMASND   BOOLEAN            DMA ENHANCED CY170 ADAPTER PRESENT ON SEND CHANNEL
 DMARCV   BOOLEAN            DMA ENHANCED CY170 ADAPTER PRESENT ON RECV CHANNEL
 IOUMI0   BOOLEAN            IOU MODEL I0 (CYBER 930)

          ALIGN  16,64
 SNDPP    PPWORD             PP NUMBER TO PROCESS REQUEST BUFFER (SEND)
 RCVPP    PPWORD             PP NUMBER TO PROCESS ESM SOURCE FLAGS (RECEIVE)
 FILL1    PPWORD             UNUSED

 FILL2    PPWORD             UNUSED
 FILL3    PPWORD             UNUSED
 SIDN     PPWORD             SOURCE IDENTIFICATION NUMBER
 NQDE     PPWORD             NUMBER OF QUEUE DIRECTORY ENTRIES

 QDH      RECEND

*
* QUEUE DIRECTORY ENTRY.
*

 QDE      RECORD PACKED

          ALIGN 32,64
 DQRMA    RMA                DRIVER QUEUE RMA

 QDE      RECEND

** QUEUE INTERFACE TABLE RECORD OFFSETS **

 QIT.RBD  EQU    0               OFFSET TO REQUEST BUFFER DIRECTORY
 QIT.ESM  EQU    C.RBD           OFFSET TO ESM BASE ADDRESSES
 QIT.MXB  EQU    QIT.ESM+C.ESM   OFFSET TO MAXIMUM DATA BYTES
 QIT.QDH  EQU    QIT.MXB+C.MXB   OFFSET TO QUEUE DIRECTORY HEADER
 QIT.QDE  EQU    QIT.QDH+C.QDH   OFFSET TO QUEUE DIRECTORY ENTRIES

******************************************************************

*
* REQUEST BUFFER ENTRY.
*

 RBE     RECORD PACKED

 PRV      BOOLEAN            PREVIOUSLY PROCESSED FLAG
 INQ      BOOLEAN            INQUIRY MESSAGE FLAG
          ALIGN  16,64
          PPWORD             (NOT USED)
 SPMSG    PPWORD             SPECIAL MESSAGE (STATE INQUIRY)
 QI       CHARC              QUEUE INDEX
 QEI      CHARC              QUEUE ENTRY INDEX

 RBE     RECEND
FSSR     EJECT
*
* FILE SERVER SPECIAL RESPONSE.
*

 FSSR     RECORD PACKED
 SRFL     PPWORD             SPECIAL RESPONSE FLAGS AND LENGTH WORD
*   SR       BOOLEAN            SPECIAL RESPONSE
*   SW       BOOLEAN            SINGLE WORD RESPONSE
*   ERR      BOOLEAN            ERROR RESPONSE
*   INQ      BOOLEAN            INQUIRY MESSAGE RESPONSE
*   TPR      BOOLEAN            TERMINATION PSEUDO RESPONSE (NEVER SET BY PP)
*   ENG      BOOLEAN            ENGINEERING ERROR LOG RESPONSE
*            ALIGN  8,64
*   LEN      CHARC              SPECIAL RESPONSE LENGTH IN BYTES
 SRPAR    PPWORD             SPECIAL RESPONSE PARAMETERS (ERROR OR INQUIRY)
 LUN      PPWORD             LOGICAL UNIT
 QI       CHARC              QUEUE INDEX
 QEI      CHARC              QUEUE ENTRY INDEX

 FSSR     RECEND

*
* FILE SERVER ENGINEERING ERROR LOG PP RESPONSE RECORD.
*

 ENGRSP   RECORD PACKED

          ALIGN  0,64
 URE      BOOLEAN            UNRECOVERED ERROR
 ADP      BOOLEAN            C170 DMA ADAPTER DRIVER MODE
 DIO      BOOLEAN            ERROR OCCURRED WHILE EXECUTING IN *DIO*
 TRL      BOOLEAN            FIRST T REGISTER LOAD SUCCESSFUL
          ALIGN  8,64
 CNT      STRUCT 1           RETRY ATTEMPT COUNT
 ERR      PPWORD             INITIAL FAILURE CONDITION CODE
 LCF      PPWORD             LAST FUNCTION ISSUED ON CHANNEL PRIOR TO FAILURE
 LPF      PPWORD             ICI/ESM LOW SPEED PORT FUNCTION

          ALIGN  0,64
 LPS      PPWORD             ESM LOW SPEED PORT STATUS
 ADR      PPWORD             ESM ADDRESS (UPPER BITS)
          PPWORD             ESM ADDRESS (LOWER BITS)
 RBC      PPWORD             RESIDUAL CHANNEL WORD COUNT AFTER BLOCK I/O INST.

          ALIGN  0,64
 XBC      PPWORD             TRANSFER BYTE COUNT
 TRC      PPWORD             CY170 DMA ADAPTER 'T' REGISTER BYTE COUNT
          PPWORD             CY170 DMA ADAPTER 'T' REGISTER MSB CM ADDRESS
          PPWORD             CY170 DMA ADAPTER 'T' REGISTER LSB CM ADDRESS

          ALIGN  0,64
 ADF      PPWORD             CY170 DMA ADAPTER FUNCTION CODE
 CRC      PPWORD             CY170 DMA ADAPTER CONTROL REGISTER
 AES      PPWORD             CY170 DMA ADAPTER ERROR STATUS REGISTER
 OPS      PPWORD             CY170 DMA ADAPTER OPERATIONAL STATUS REGISTER

          ALIGN  0,64
          PPWORD             (UNUSED)
 ITR      PPWORD             INITIAL CY170 DMA ADAPTER 'T' REGISTER BYTE COUNT
          PPWORD             INITIAL CY170 DMA ADAPTER 'T' REGISTER MSB CM ADRS
          PPWORD             INITIAL CY170 DMA ADAPTER 'T' REGISTER LSB CM ADRS

 ENGRSP   RECEND
          SPACE  6

*
* DRIVER QUEUE HEADER.
*

 DQH      RECORD PACKED

          ALIGN  0,64
 IDLE     BOOLEAN            DRIVER QUEUE IDLE FLAG
          ALIGN  16,64
 RECOV    SUBRANGE 0,3       (ERROR RECOVERY OPTIONS N/A)
                                0 - ATTEMPT RECOVERY
                                1 - SUPPRESS RECOVERY, TERMINATE WITH
                                     ABNORMAL STATUS.
                                2 - RESERVED FOR FUTURE USE.
                                3 - SUPPRESS RECOVERY, CONTINUE THE REQUEST
                                     IGNORING ERROR CONDITIONS.
 INT      BOOLEAN            INTERRUPT CPU IF SET
 PORT     SUBRANGE 0,37B     MEMORY PORT USED FOR INTERRUPTS
          ALIGN  40,64
 PRIOR    SUBRANGE 0,377B    (PRIORITY N/A)

          ALIGN  48,64
 NQE      PPWORD             NUMBER OF QUEUE ENTRIES

          ALIGN  0,64
 SQTYP    BOOLEAN            SOURCE QUEUE TYPE SERVER TO CLIENT IF SET
          ALIGN  16,64
 SIDN     PPWORD             SOURCE IDENTIFICATION NUMBER
 FILL1    PPWORD             FILL
 SQI      CHARC              SOURCE QUEUE INDEX
 SQEI     CHARC              SOURCE QUEUE ENTRY INDEX

          ALIGN  0,64
 DQTYP    BOOLEAN            DESTINATION QUEUE TYPE SERVER TO CLIENT
          ALIGN  16,64
 DIDN     PPWORD             DESTINATION IDENTIFICATION NUMBER
 FILL2    PPWORD             FILL
 DQI      CHARC              DESTINATION QUEUE INDEX
 DQEI     CHARC              DESTINATION QUEUE ENTRY INDEX

 DQH      RECEND

*
* HEADER MESSAGE.
*         THIS RECORD IS APPENDED TO THE QUEUE HEADER
*         TO FORM THE ESM HEADER.

 HMSG     RECORD PACKED
 ERR      BOOLEAN            ERROR MESSAGE FLAG
 INQ      BOOLEAN            INQUIRY MESSAGE FLAG
          ALIGN  16,64
 SPMSG    PPWORD             SPECIAL MESSAGE (INQUIRY, OR ERROR)
 WCB      PPWORD             CM WORD COUNT OF DATA IN ESM BUFFER AREA
 WCD      PPWORD             CM WORD COUNT OF DATA IN ESM DATA AREA
 HMSG     RECEND

*
* DRIVER QUEUE ENTRY.
*
 DQE      RECORD PACKED

* QUEUE CONTROL FLAGS -
 ACTIVE   BOOLEAN            ACTIVE QUEUE ENTRY
 DRIVER   BOOLEAN            DRIVER ACTION
 SUBSYS   BOOLEAN            SYSTEM ACTION
 ERRALT   BOOLEAN            ERROR ALERT

* COMMAND FLAGS -
 SNDBUF   BOOLEAN            SEND BUFFER
 SNDDAT   BOOLEAN            SEND PAGE DATA
 FILL1    BOOLEAN            UNUSED
 SNDPMT   BOOLEAN            PROMPT FOR PAGE DATA

* EVENT STATUS FLAGS -
 BUFSNT   BOOLEAN            BUFFER SENT
 DATSNT   BOOLEAN            PAGE DATA SENT
 BUFRCV   BOOLEAN            BUFFER RECEIVED
 DATRCV   BOOLEAN            PAGE DATA RECEIVED

* RESERVED -
 FILL2    BOOLEAN            UNUSED
 FILL3    BOOLEAN            UNUSED
 PRORSP   BOOLEAN            PROCESS SERVER RESPONSE
 FILL5    BOOLEAN            UNUSED

 ERRCON   PPWORD             DRIVER DETECTED ERROR CONDITION
 HWCD     PPWORD             HELD OVER DATA WORD COUNT
 HDIV     PPWORD             HELD OVER DIVISION NUMBER (HELD OVER DATA)

 SIND     BOOLEAN            INDIRECT ADDRESS FLAG (DATA LIST IF SET)
          ALIGN  16,64
 SLEN     PPWORD             SEND BUFFER LENGTH
 SRMA     RMA                SEND BUFFER RMA

 RIND     BOOLEAN            INDIRECT ADDRESS FLAG (DATA LIST IF SET)
          ALIGN  16,64
 RLEN     PPWORD             RECEIVE BUFFER LENGTH
 RRMA     RMA                RECEIVE BUFFER RMA

 IND      BOOLEAN            INDIRECT ADDRESS FLAG (DATA LIST IF SET)
          ALIGN  16,64
 LEN      PPWORD             DATA/DATA LIST LENGTH
 RMA      RMA                DATA/DATA LIST RMA

 DQE      RECEND
          SPACE  6
*
* UNIT COMMUNICATION AREA.
*
 UCA      RECORD PACKED
 IN       PPWORD
 LIMIT    PPWORD
          ALIGN  0,64        RESERVED
 BID      STRUCT 32          SIXTEEN BLOCK ID ENTRIES

 UCA      RECEND
          SPACE  6
*
* PP REQUESTS.
*
 RQ       RECORD PACKED

          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)
 LEN      PPWORD             REQUEST LENGTH
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS
                               0 - ATTEMPT RECOVERY
                               1 - SUPPRESS RECOVERY, TERMINATE WITH
                                    ABNORMAL STATUS.
                               2 - RESERVED FOR FUTURE USE.
                               3 - SUPPRESS RECOVERY, CONTINUE THE REQUEST
                                    IGNORING ERROR CONDITIONS.
 INT      BOOLEAN            INTERRUPT CPU (IF SET)
 PORT     SUBRANGE 0,37B     MEMORY PORT USED FOR INTERRUPTS
          ALIGN  40,64
 PRIOR    SUBRANGE 0,377B    PRIORITY
          ALIGN  48,64
 LONGB    BOOLEAN            LONG INPUT BLOCK (LSB OF ALERT MASK)
          ALIGN  0,64
 SECADR   INTEGER            SECONDARY ADDRESS
 CMND     INTEGER            COMMAND SEQUENCE

 RQ       RECEND
          SPACE  6
*
* PP COMMAND.
*
 CM       RECORD PACKED

 CODE     SUBRANGE 0,377B    COMMAND CODE
 STOR     BOOLEAN            STORE RESPONSE (IF SET)
 INDIR    BOOLEAN            INDIRECT ADDRESS (IF SET)
          ALIGN  16,64
 LEN      PPWORD             LENGTH OF CM AREA (EITHER DATA AREA OR
                             LENGTH/ADDRESS WORD PAIR LIST)
 RMA      RMA                ADDRESS OF CM AREA
          MGEN   N.CODE
 M.CODE   EQU    MASK$

 CM       RECEND
          SPACE  6
*
* PP REQUEST RESPONSE.
*
 RS       RECORD PACKED

          ALIGN  16,64
 PVA      STRUCT 6           PVA OF REQUEST

          ALIGN  32,64
 REQ      RMA                RMA OF REQUEST

 RESPL    PPWORD             RESPONSE LENGTH  (8-BIT BYTES)
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS (FROM REQUEST)
 INT      BOOLEAN            INTERRUPT CPU (IF SET)
 PORT     SUBRANGE 0,37B     MEMORY PORT USED FOR INTERRUPTS
          ALIGN  40,64
 PRIOR    SUBRANGE 0,377B    PRIORITY
          ALIGN  48,64
 LONGB    BOOLEAN            LONG INPUT BLOCK (LSB OF ALERT MASK)

 ABNFL    PPWORD             ABNORMAL STATUS FLAGS
                               1XXX...X - INTERFACE ERROR
                               X1XX...X - FS ERROR
                               XX1X...X - FORCED TERMINATION, STOP UNIT
                               XXX1...X - PREMATURE TERMINATION, INPUT
 IEC      PPWORD             INTERFACE ERROR CODE
 RC       SUBRANGE 0,3       RESPONSE CODE
                               0 - NOT USED
                               1 - NOT USED
                               2 - NORMAL REQUEST TERMINATION
                               3 - ABNORMAL REQUEST TERMINATION
          ALIGN  40,64
          STRUCT 3           UNUSED

          ALIGN  0,64
 RXFERC   STRUCT 4           REQUESTED TRANSFER COUNT
 LASTC    RMA                LAST COMMAND RMA

          MASKP  INT
 K.INT    EQU    MSK
          MGEN   N.PORT
 M.PORT   EQU    MASK$

 RS       RECEND

*
* ESM MEMORY ADDRESS RECORD.
* THIS RECORD IS CREATED AND USED BY THIS DRIVER PROGRAM.
*

 EMA      RECORD
 FRG      PPWORD             FLAG REGISTER ADDRESS
 HDR      PPWORD             UPPER 12 BITS OF HEADER AREA ADDRESS
          PPWORD             LOWER 12 BITS OF HEADER AREA ADDRESS
 BUF      PPWORD             UPPER 12 BITS OF BUFFER AREA ADDRESS
          PPWORD             LOWER 12 BITS OF BUFFER AREA ADDRESS
 DAT      PPWORD             UPPER 12 BITS OF DATA AREA ADDRESS
          PPWORD             LOWER 12 BITS OF DATA AREA ADDRESS
 EMA      RECEND
          TITLE  MISCELLANEOUS EQUATES
 MAXFCL   EQU    16          MAX FUNCTION CODE LENGTH = 16 BITS
 HEADLN   EQU    32          REQUEST HEADER LENGTH = 32 BYTES
 CMDLEN   EQU    4           I/O COMMAND LENGTH IN PP WORDS
 PITLEN   EQU    C.PIT+C.UD*MLUC LENGTH OF PP INTERFACE TABLE IN CM WORDS
 LENRS    EQU    40          PP'S RESPONSE BUFFER LENGTH IN BYTES

**        FOR CHANNEL TABLE.
*         CHANNEL VALUES (THE CHANNEL NUMBER IS INSERTED LATER).
*         (BIT 2**5 IS ONLY USED ON IAN AND DCN INSTRUCTIONS).

 CH00     EQU    00          WITHOUT CHANNEL BIT
 CH40     EQU    40B         WITH CHANNEL BIT
 CH14     EQU    14B         TAG FOR CHANNEL 14B
 MCH      EQU    17B         MAINTENANCE CHANNEL

** DST-DSP COMMUNICATIONS CHANNEL NUMBER.
*
 DSC      EQU    0           DST-DSP COMMUNICATIONS CHANNEL

*
**        PP COMMAND CODES.
*
 C.PC0    EQU    0           ACKNOWLEDGE
 C.PC1    EQU    1           STOP UNIT
 C.PC4    EQU    4           IDLE
 C.PC5    EQU    5           RESUME
 RSUMCMD  EQU    C.PC5       PP RESUME COMMAND

*
**        ESM MEMORY ALLOCATION.
*
 EHRDCM   EQU    3               SIZE OF HEADER IN 64 BIT CM WORDS
 EHRDES   EQU    EHRDCM*64/60+8  HEADER ESM WORDS PLUS ONE 8 WORD ESM RECORD
 EHRDSZ   EQU    EHRDES/8*8      SIZE OF HEADER AREA IN 60 BIT ESM WORDS

 EBUFCM   EQU    PAGSZ/8         SIZE OF BUFFER IN 64 BIT CM WORDS
 EBUFES   EQU    EBUFCM*64/60+8  BUFFER ESM WORDS PLUS ONE 8 WORD ESM RECORD
 EBUFSZ   EQU    EBUFES/8*8      SIZE OF BUFFER AREA IN 60 BIT ESM WORDS

 EBUFOF   EQU    EHRDSZ         BUFFER AREA OFFSET WITHIN DIVISION
          ERRNG  77B-EBUFOF     IF SUBROUTINE SEA MUST CHANGE TO SAVE OVERFLOW
 EDATOF   EQU    EHRDSZ+EBUFSZ  PAGE DATA AREA OFFSET WITHIN DIVISION
          TITLE  HARDWARE INTERFACE EQUATES.
** DMA ENHANCED CY170 ADAPTER FUNCTION CODES.
*         REF. CYBER 180
*              DMA ENHANCED CY170 ADAPTER
*              ENGINEERING SPECIFICATION NO. 22132530.

 FC.AMC   EQU    100000B     (8000H) ADAPTER MASTER CLEAR
 FC.CTR   EQU    101000B     (8200H) CLEAR 'T' REGISTERS
 FC.INP   EQU    102402B     (8500H) DMA INPUT / FAST TRANSFER / PP WC=2
 FC.OUT   EQU    103402B     (8702H) DMA OUTPUT / FAST TRANSFER / PP WC=2
 FC.CDM   EQU    104000B     (8800H) CLEAR DMA MODE
 FC.DTM   EQU    106000B     (8C00H) DISABLE TEST MODE
 FC.ETM   EQU    107000B     (8E00H) ENABLE TEST MODE
 FC.RCR   EQU    110000B     (9000H) READ CONTROL REGISTERS
 FC.WCR   EQU    111000B     (9200H) WRITE CONTROL REGISTERS
 FC.ESR   EQU    112000B     (9400H) READ ERROR STATUS REGISTER
 FC.OSR   EQU    114000B     (9800H) READ OPERATIONAL STATUS REGISTER
 FC.RTR   EQU    116000B     (9C00H) READ 'T' REGISTER
 FC.WTR   EQU    117000B     (9E00H) WRITE 'T' PRIME REGISTER

** ADAPTER OPERATIONAL STATUS REGISTER BIT MASKS.
 OS.XIP   EQU    0001B       TRANSFER IN PROGRESS
 OS.TRE   EQU    0002B       'T' PRIME REGISTER EMPTY
 OS.HLT   EQU    0004B       DMA TRANSFER HALTED
 OS.INP   EQU    0010B       DMA INPUT
 OS.OUT   EQU    0020B       DMA OUTPUT
 OS.PWZ   EQU    0040B       PP WORD COUNT EQUAL ZERO
 OS.TST   EQU    0100B       TEST MODE
 OS.CLW   EQU    0200B       EXTERNAL CLOCK PRESENT
 OS.FXM   EQU    0400B       FAST TRANSFER MODE
 OS.IDA   EQU    1000B       INPUT DATA AVAILABLE
 OS.IBF   EQU    2000B       INPUT BUFFER FULL
 OS.OBF   EQU    4000B       OUTPUT BUFFER FULL

** ADAPTER OPERATIONAL STATUS REGISTER BIT POSITION.
 OB.XIP   EQU    00D         TRANSFER IN PROGRESS
 OB.TRE   EQU    01D         'T' PRIME REGISTER EMPTY
 OB.HLT   EQU    02D         DMA TRANSFER HALTED
 OB.INP   EQU    03D         DMA INPUT
 OB.OUT   EQU    04D         DMA OUTPUT
 OB.PWZ   EQU    05D         PP WORD COUNT EQUAL ZERO
 OB.TST   EQU    06D         TEST MODE
 OB.CLW   EQU    07D         EXTERNAL CLOCK PRESENT
 OB.FXM   EQU    08D         FAST TRANSFER MODE
 OB.IDA   EQU    09D         INPUT DATA AVAILABLE
 OB.IBF   EQU    10D         INPUT BUFFER FULL
 OB.OBF   EQU    11D         OUTPUT BUFFER FULL

** CY930 ICI/C170 CONVERTER FUNCTION CODES.
*         REF. CYBER 930 (SO)
*              ENGINEERING SPECIFICATION NO. 19269753.
*              ENGINEERING SPECIFICATION NO. 19269663.

 ICI.DES  EQU    100000B     (8000H) DESELECT C170 CONVERTER
 ICI.CON  EQU    110000B     (9000H) SET CONVERTION MODE (12/16 PACK/UNPACK)
 ICI.12B  EQU    120000B     (A000H) SET 12 BIT MODE
 ICI.SSM  EQU    130000B     (B000H) SET STORNET SUBSYS MODE
 ICI.SEL  EQU    170000B     (F000H) SELECT C170 CONVERTER

*
** ESM PPU/LOW SPEED PORT FUNCTION CODES.
*         REF. CDC EXTENDED SEMICONDUCTOR MEMORY II (ESM II)
*              HARDWARE REFERENCE MANUAL NO. 60458590.

*  DATA CODES -
 FC.RED   EQU    5001B       READ ESM FUNCTION
 FC.FLG   EQU    FC.RED      FLAG FUNCTION
 FC.WRT   EQU    5002B       WRITE FUNCTION
 FC.STA   EQU    5004B       READ STATUS BITS FUNCTION
 FC.PMC   EQU    5010B       LOW SPEED PORT MASTER CLEAR

*  MODE SELECT CODES -
 FC.UBM   EQU    5401B       USE UPPER HALF BUFFER MEMORY
 FC.HST   EQU    5402B       ENABLE HIGH SPEED DATA TRANSFER
 FC.LBM   EQU    5601B       USE LOWER HALF BUFFER MEMORY
 FC.LST   EQU    5602B       DISABLE HIGH SPEED DATA TRANSFER

* ESM 4 BIT FLAG REGISTER FUNCTIONS.
 FF.ZSL   EQU    4600B       ZERO SELECT
 FF.SET   EQU    5400B       SELECTIVE SET
 FF.STA   EQU    6400B       STATUS
 FF.DER   EQU    6500B       DETECT ERROR STATUS
 FF.EQU   EQU    6600B       EQUALITY STATUS
 FF.CLR   EQU    7400B       SELECTIVE CLEAR

** ESM SUBDIVISION STATUS 4 BIT FLAG REGISTER BIT MASKS.
 FR.RSV   EQU    01B         ESM RESERVED
 FR.RDY   EQU    02B         ESM READY
 FR.HLD   EQU    04B         ESM HELD OVER PAGE DATA
 FR.XXX   EQU    10B         (NOT USED)

** ESM LOW SPEED PORT STATUS BIT MASKS.
 PS.ABT   EQU    0001B       ABORT
 PS.AOV   EQU    0002B       ADDRESS OVERFLOW IF ABORT BIT SET
 PS.DBE   EQU    0004B       DOUBLE BIT ERROR
 PS.WRT   EQU    0010B       BUSY WITH WRITE OPERATION
 PS.CPE   EQU    0020B       CHANNEL PARITY ERROR
 PS.MAP   EQU    0040B       MEMORY ADDRESS PARITY ERROR (STORNET ONLY)

          TITLE  FILE SERVER QUEUE ENTRY EQUATES.
**        QUEUE ENTRY FLAG MASKS.
*
* QUEUE CONTROL FLAGS -
 ACTIVE   EQU    100000B     ACTIVE QUEUE ENTRY
 DRIVER   EQU    040000B     DRIVER ACTION
 SUBSYS   EQU    020000B     SYSTEM ACTION
 ERRALT   EQU    010000B     ERROR ALERT

* COMMAND FLAGS -
 SNDBUF   EQU    004000B     SEND BUFFER
 SNDDAT   EQU    002000B     SEND PAGE DATA
*FILL1    EQU    001000B     UNUSED
 SNDPMT   EQU    000400B     PROMPT FOR PAGE DATA

* EVENT STATUS FLAGS -
 BUFSNT   EQU    000200B     BUFFER SENT
 DATSNT   EQU    000100B     PAGE DATA SENT
 BUFRCV   EQU    000040B     BUFFER RECEIVED
 DATRCV   EQU    000020B     PAGE DATA RECEIVED

* DRIVER STATUS FLAGS -
 PRORSP   EQU    000002B     PROCESS SERVER RESPONSE (RESULTS IN SUBSYS)

** REQUEST BUFFER ENTRY FLAG.
 RBE.PRV  EQU    100000B     PREVIOUSLY PROCESSED REQUEST BUFFER ENTRY FLAG
 RBE.INQ  EQU    040000B     INQUIRY MESSAGE REQUEST FLAG

**        SPECIAL RESPONSE FLAGS AND LENGTH WORD EQUATES.
*
* SPECIAL RESPONSE FLAGS EQUATES -
 SRF.SR   EQU    100000B     SPECIAL RESPONSE FLAG
 SRF.SW   EQU    040000B     SINGLE WORD RESPONSE FLAG
 SRF.ERR  EQU    020000B     ERROR RESPONSE FLAG
 SRF.INQ  EQU    010000B     INQUIRY MESSAGE RESPONSE FLAG
 SRF.TPR  EQU    004000B     PSEUDO TERMINATION (NEVER ISSUED BY DRIVER)
 SRF.ENG  EQU    002000B     ENGINEERING ERROR LOG RESPONSE FLAG

**        ESM HEADER FLAG EQUATES.
*
 HMF.ERR  EQU    100000B     SPECIAL MESSAGE FIELD OF HEADER IS ERROR CODE
 HMF.INQ  EQU    040000B     SPECIAL MESSAGE FIELD OF HEADER IS INQUIRY MESSAGE

**        ENGINEERING ERROR LOG RESPONSE FLAGS.
*
 ERF.URE  EQU    100000B     UNRECOVERED ERROR
 ERF.ADP  EQU    040000B     C170 DMA ADAPTER DRIVER MODE
 ERF.DIO  EQU    020000B     ERROR OCCURRED WHILE EXECUTING *DIO* SUBROUTINE
 ERF.TRL  EQU    010000B     FIRST T REGISTER LOAD SUCCESSFUL
          TITLE  REQUEST RESPONSE EQUATES.
*
**        RESPONSE CODES.
*
 R.NRM    EQU    100000B     NORMAL REQUEST TERMINATION
 R.ABN    EQU    140000B     ABNORMAL REQUEST TERMINATION

*
**        ABNORMAL STATUS FLAGS.
*
 ABN.IE   EQU    100000B     INTERFACE ERROR
 ABN.FE   EQU    040000B     FILE SERVER ERROR
 ABN.FT   EQU    020000B     FORCED TERMINATION - STOP UNIT N/A
 ABN.PT   EQU    010000B     PREMATURE TERMINATION ON INPUT N/A
          TITLE  ERROR CODES
**        FATAL HARDWARE FAILURE ERROR CODES.
 ER.BASE  EQU    0           FATAL HARDWARE FAILURE ERROR CODE BASE

 ER.FTO   EQU    ER.BASE+1   CHANNEL FUNCTION TIMEOUT ERROR
 ER.IPE   EQU    ER.BASE+2   IOU CHANNEL PARITY ERROR
 ER.CPE   EQU    ER.BASE+3   ESM DETECTED CHANNEL PARITY ERROR
 ER.DBE   EQU    ER.BASE+4   ESM DOUBLE BIT PARITY ERROR
 ER.MAP   EQU    ER.BASE+5   ESM MEMORY ADDRESS PARITY ERROR
 ER.ABT   EQU    ER.BASE+6   UNEXPECTED ABORT ON ESM FUNCTION
 ER.CME   EQU    ER.BASE+7   ADAPTER - DMA UNCORRECTED CM ERROR
 ER.CMR   EQU    ER.BASE+8   ADAPTER - CM REJECT
 ER.ICR   EQU    ER.BASE+9   ADAPTER - INVALID CM RESPONSE
 ER.CRP   EQU    ER.BASE+10  ADAPTER - CM RESPONSE CODE PARITY ERROR
 ER.CMI   EQU    ER.BASE+11  ADAPTER - CMI READ DATA PARITY ERROR
 ER.CLK   EQU    ER.BASE+12  ADAPTER - CLOCK FAULT
 ER.IBO   EQU    ER.BASE+13  ADAPTER - OVERFLOW ERROR
 ER.IER   EQU    ER.BASE+14  ADAPTER - INPUT ERROR
 ER.CVN   EQU    ER.BASE+15  ADAPTER - 12/16 CONVERSION ERROR
 ER.JYD   EQU    ER.BASE+16  ADAPTER - JY DATA ERROR
 ER.BAS   EQU    ER.BASE+17  ADAPTER - BAS PARITY ERROR
 ER.KZE   EQU    ER.BASE+18  ADAPTER - KZ BOARD ERROR
 ER.JYE   EQU    ER.BASE+19  ADAPTER - JY BOARD ERROR
 ER.KXE   EQU    ER.BASE+20  ADAPTER - KX BOARD ERROR
 ER.OVF   EQU    ER.BASE+21  OVERFLOW ESM ADDRESS ERROR
 ER.INA   EQU    ER.BASE+22  INACTIVE CHANNEL ERROR
 ER.HLT   EQU    ER.BASE+23  DMA XFER HALTED EARLY ERROR
 ER.DMT   EQU    ER.BASE+24  LOW SPEED PORT DEADMAN TIMEOUT
 ER.UU2   EQU    ER.BASE+25  (UNUSED)
 ER.UU3   EQU    ER.BASE+26  (UNUSED)
 ER.UU4   EQU    ER.BASE+27  (UNUSED)
 ER.UU5   EQU    ER.BASE+28  (UNUSED)
 ER.UU6   EQU    ER.BASE+29  (UNUSED)

**        SOFTWARE INTERFACE ERROR CODES.

 IE.E01   EQU    ER.BASE+30  INVALID COMMAND CODE
 IE.E02   EQU    ER.BASE+31  INVALID LENGTH SPECIFICATION IN COMMAND
 IE.E03   EQU    ER.BASE+32  INVALID ADDRESS SPECIFICATION IN COMMAND
 IE.E04   EQU    ER.BASE+33  INVALID LENGTH SPECIFICATION IN INDIRECT LIST
 IE.E05   EQU    ER.BASE+34  INVALID ADDRESS SPECIFICATION IN INDIRECT LIST
 IE.E06   EQU    ER.BASE+35  RESERVED FIELD IN INDIRECT LIST NOT 0
 IE.E07   EQU    ER.BASE+36  LOCKWORD ERROR
 IE.E08   EQU    ER.BASE+37  MISSING HOLD OVER INFORMATION IN QUEUE ENTRY
 IE.E09   EQU    ER.BASE+38  INVALID QUEUE INDEX
 IE.E10   EQU    ER.BASE+39  INVALID QUEUE ENTRY INDEX
 IE.E11   EQU    ER.BASE+40  INSUFFICIENT LENGTH SPECIFICATION ERROR
 IE.E12   EQU    ER.BASE+41  DRIVER ACTION FLAG NOT SET
 IE.E13   EQU    ER.BASE+42  DESTINATION MACHINE DOWN
 IE.E14   EQU    ER.BASE+43  QUEUE IDLE
 IE.E15   EQU    ER.BASE+44  INACTIVE QUEUE ENTRY
 IE.E16   EQU    ER.BASE+45  ZERO QUEUE REAL MEMORY ADDRESS
 IE.E17   EQU    ER.BASE+46  (UNUSED)
 IE.E18   EQU    ER.BASE+47  (UNUSED)
 IE.E19   EQU    ER.BASE+48  (UNUSED)
 IE.E20   EQU    ER.BASE+49  (UNUSED)

 OBSINQ   EQU    77B         OBSOLETE OR UNWANTED INQUIRY REQUEST ERROR

 ERCODM   EQU    67B         MASK FOR ERROR CODES

*
** ERROR CODE BASE.
*

 PITERR   EQU    1000B       PIT INTERFACE ERROR CODE BASE
 UITERR   EQU    1400B       UIT INTERFACE ERROR CODE BASE
 RQHERR   EQU    2000B       REQUEST HEADER INTERFACE ERROR CODE BASE
          TITLE  DIRECT CELLS
          CON    PRS-1       START OF PRESET (INITIALIZATION) ROUTINE

 T0       EQU    0
 T1       BSSZ   1           SCRATCH CELLS
 T2       BSSZ   1
 T3       BSSZ   1
 T4       BSSZ   1
 T5       BSSZ   1
 T6       BSSZ   1
 T7       BSSZ   1
 T8       BSSZ   1
 T9       BSSZ   1
 T10      BSSZ   1
 T11      BSSZ   1

 SI       BSSZ   1           SOURCE ID NUMBER
 QI       BSSZ   1           QUEUE INDEX
 EI       BSSZ   1           QUEUE ENTRY INDEX
 QF       BSSZ   1           CURRENT COPY OF DRIVER QUEUE ENTRY FLAGS
 ID       BSSZ   1           SOURCE/DESTINATION ID NUMBER
 DI       BSSZ   1           SOURCE/DESTINATION ESM DIVISION NUMBER
 PS       BSSZ   1           ESM LOW SPEED PORT STATUS
 ER       BSSZ   1           ERROR CONDITION CODE

 WC       BSSZ   1           CM WORD COUNT
 P1       BSSZ   1
 P2       BSSZ   1
 P3       BSSZ   1
 P4       BSSZ   1

 CM       BSSZ   3           CENTRAL MEMORY ADDRESS
 TA       BSSZ   1           FORMA TEMPORARY ADDRESS

 RBLIM    BSSZ   1           REQUEST BUFFER LIMIT OFFSET IN CM WORDS
 RSLIM    BSSZ   1           RESPONSE BUFFER LIMIT OFFSET IN BYTES
 NDIVS    BSSZ   1           NUMBER OF ESM DIVISIONS PER MACHINE

 AI       BSSZ   1           DQENTR ADDRESS DESCRIPTOR INDEX
 LI       BSSZ   1           INDIRECT LIST INDEX IN PP WORDS
 LL       BSSZ   1           INDIRECT LIST LENGTH IN PP WORDS
 XC       BSSZ   1           CM WORD COUNT TO TRANSFER
 AC       BSSZ   1           ACTUAL I/O CM WORD COUNT
 RC       BSSZ   1           REQUESTED I/O CM WORD COUNT
 PC       BSSZ   1           CURRENT PAGE REMAINING LENGTH IN CM WORDS
 CC       BSSZ   1           CHANNEL WORD COUNT (12 OR 16 BIT)
 XBC      BSSZ   1           TRANSFER BYTE COUNT
 EMA      BSSZ   1           POINTER TO ESM ADDRESS LAST USED
 ELEC     BSSZ   1           ERROR LOG ENTRY CONDITION
 ENGPA    CON    ENGOFF      *ENG* SUBROUTINE PROCESSING ADDRESS

*         THE NEXT FIVE CELLS ARE USED BYE *RSP* AND MUST BE CONTIGUOUS.
*         TEMP STORAGE IS VALID UNTIL SUBROUTINE *RSP* EXECUTES.

 ET1      EQU    *           (TEMP STORAGE FOR SUBROUTINE *ENG*)
          BSSZ   1           (INP-3 = NEW IN POINTER IN BYTES)
 RB       EQU    *           (TEMP RESIDUAL BYTE COUNT IN 'A' REG AFTER I/O)
          BSSZ   1           (INP-2 = TOTAL RESPONSE LENGTH IN CM WORDS)
          BSSZ   1           (INP-1 = CURRENT IN POINTER IN CM WORDS)
 INP      BSSZ   1           CURRENT RESPONSE BUFFER IN POINTER IN BYTES
 OUTP     BSSZ   1           PP RESPONSE BUFFER OUT POINTEIN BYTES

*         REFORMATTED REAL MEMORY ADDRESSES
 CM.PIT   BSSZ   3           CMA OF PP INTERFACE TABLE
 CM.RBI   BSSZ   3           CMA OF REQUEST BUFFER 'IN' POINTER
 CM.QIT   EQU    CM.RBI      CMA OF QUEUE INTERFACE TABLE
 CM.RBD   EQU    CM.RBI      CMA OF REQUEST BUFFER DESCRIPTOR
 CM.RB    BSSZ   3           CMA OF REQUEST BUFFER
          ORG    72B
 PPIT     BSSZ   2           REAL MEMORY WORD ADDRESS OF PP INTERFACE TABLE
 QEBRB    BSSZ   1           QUEUE ENTRY NUMBER BLOCKING REQUEST BUFFER
 MLPRTN   BSSZ   1           MAIN LOOP RETURN ADDRESS
          ORG    76B
 PP       BSSZ   1           LOGICAL PP NUMBER
 LU       BSSZ   1           LOGICAL UNIT NUMBER
          SPACE  4

          ERRNZ  /RBD/P.IN-3 IF QIT ORDER CHANGED

 CMADR    EQU    CM          USED BY 'LOAD' MACROS
          TITLE  MAIN LOOP
*
*         MAIN LOOP.
*
          ORG    100B
          DATA   L'ESMD'
 ESMD     BSS    0
 MLP      BSS    0
          LDC    MLP1
          STDL   MLPRTN
          LJM    CPR         CHECK FOR PP REQUEST

 MLP1     LDC    1           PP IDLE FLAG SET/CLEARED VIA PP REQUEST
 PPIDLE   EQU    *-1         (PP IDLE FLAG, NONZERO IF PP IDLE)
          NJK    MLP         IF PP IDLE SKIP REQUEST BUFFER AND ESM FLAG CHECK

          LDC    **          PP NUMBER OF PP TO SEND
 SNDPP    EQU    *-1         (PP NUMBER TO PROCESS REQUEST BUFFER ENTRIES)
          SBDL   PP
          NJN    MLP2        IF THIS PP IS NOT PROCESSING REQUEST BUFFER

          LDC    MLP2
          STDL   MLPRTN
          LJM    FSQ         PROCESS REQUEST BUFFER REQUEST

 MLP2     LDC    **          PP NUMBER OF PP TO RECEIVE
 RCVPP    EQU    *-1         (PP NUMBER TO PROCESS ESM SOURCE FLAGS)
          SBDL   PP
          NJK    MLP         IF THIS PP IS NOT PROCESSING ESM SOURCE FLAGS

          LDC    MLP
          STDL   MLPRTN
          LJM    FRQ         PROCESS ESM FLAG REGISTER REQUEST
          TITLE  PROCESS REQUEST BUFFER ENTRIES (SEND)
** CSQ -  CLEAR SEND REQUEST AT REQUEST BUFFER ENTRY.
*
** PURPOSE -
*         REMOVES THE REQUEST FROM THE QUEUE BY CLEARING THE REQUEST
*         BUFFER ENTRY AND UPDATING THE OUT POINTER.
*
** INPUT -
*         P1 THRU P4 = REQUEST BUFFER ENTRY.
*         OUT    = REQUEST BUFFER OUT OFFSET IN CM WORDS.
*         RBLIM  = REQUEST BUFFER LIMIT OFFSET IN CM WORDS.
*
** OUTPUT -
*         OUT    = UPDATED REQUEST BUFFER OUT OFFSET IN CM WORDS.
*
** USES - P1 THRU P4.

 CSQ1     STDL   OUT         RESET REQUEST BUFFER OUT OFFSET

 CSQ      SUBR               ENTRY/EXIT
          LDN    0           CLEAR REQUEST BUFFER ENTRY IN PP
          STDL   P1+/RBE/P.PRV
          STDL   P1+/RBE/P.SPMSG
          STDL   P1+/RBE/P.QEI
          LOADC  CM.RB       ADDRESS OF REQUEST BUFFER
          ADDL   OUT
          CWDL   P1          CLEAR REQUEST BUFFER ENTRY IN CM
          AODL   OUT         INCREMENT OUT POINTER
          SBDL   RBLIM       REQUEST BUFFER LIMIT IN CM WORDS
          ZJN    CSQ1        IF OUT EQUAL LIMIT
          RETURN
ISQ       SPACE    4,24
** ISQ -  INITIALIZE SEND REQUEST.
*
** PURPOSE -
*         THIS SUBROUTINE ATTEMPTS TO RESERVE DESTINATION ESM SPACE
*         FOR SEND REQUESTS. A SEND PROMPT REQUEST DOES NOT REQUIRE
*         NEW RESERVATION SINCE IT IS A CONTINUATION OF A RECEIVE
*         REQUEST.
*
** INPUT -
*         (TOQP)    = IF NONZERO, QUEUE INDEX OF TOP OF REQUEST BUFFER ENTRY
*         (P1 - P4) = REQUEST BUFFER ENTRY.
*
** OUTPUT -
*         (A)    = ZERO, IF REQUEST BUFFER REQUEST INITIALIZED.
*                = NEGATIVE, IF REQUEST BUFFER ENTRY NOT PROCESSABLE.
*                = NON ZERO, IF ERROR DETECTED.
*         (HMSG) = INITIALIZED TO ZERO, IF NORMAL FILE SERVER REQUEST.
*                = INQ FLAG TRUE, IF STATE INQUIRY MESSAGE.
*                = SPMSG FROM REQUEST BUFFER IF INQUIRY.
*
** CALLS  - CIQ, RDQ, RSV.

 ISQ5     LDC    -1          REQUEST NOT READY

 ISQX     BSS    0
 ISQ      SUBR               ENTRY/EXIT
          LDDL   P1+/RBE/P.QEI  QUEUE INDEX / QUEUE ENTRY INDEX
          ZJN    ISQ5        IF REQUEST NOT READY

*         RESTORE RESPONSE WORD FOR NON INQUIRY REQUESTS.
          LDK    SRF.SR+SRF.SW+B.FSSR
          STML   RSPBUF+/FSSR/P.SRFL  RESPONSE FLAGS AND LENGTH FOR NON INQUIRY
          LDDL   P1+/RBE/P.INQ
          SHN    2+/RBE/L.INQ  INQUIRY FLAG TO SIGN POSITION
          PJN    ISQ1        IF NOT INQUIRY

*         INCASE AN ERROR OCCURS ON INQUIRY MESSAGE.
          LDK    SRF.SR+SRF.SW+SRF.INQ+B.FSSR
          STML   RSPBUF+/FSSR/P.SRFL  RESPONSE FLAGS AND LENGTH FOR INQUIRY

 ISQ1     LDDL   P1+/RBE/P.QEI  QUEUE INDEX / QUEUE ENTRY INDEX
          RJM    RDQ         READ QUEUE HEADER AND QUEUE ENTRY
          NJN    ISQX        IF QUEUE RELATED ERROR
          RJM    CIQ         CHECK IDLE OR INACTIVE QUEUE ENTRY
 ISQ1.1   BSS    0           (HOP SCOTCH TO ISQX EXIT)
          NJN    ISQX        IF QUEUE IS IDLE OR QUEUE ENTRY INACTIVE
          STML   HMSG+/HMSG/P.ERR     CLEAR HEADER FLAGS FOR SPECIAL MESSAGE
          STML   HMSG+/HMSG/P.SPMSG   CLEAR HEADER SPECIAL MESSAGE FIELD
          STML   HMSG+/HMSG/P.WCB     BUFFER CM WORD COUNT
          STML   HMSG+/HMSG/P.WCD     DATA CM WORD COUNT
          LDDL   P1+/RBE/P.INQ
          SHN    2+/RBE/L.INQ  INQUIRY FLAG TO SIGN POSITION
          PJN    ISQ2        IF NOT INQUIRY
          LDML   DQHEAD+/DQH/P.SQTYP
          SHN    2+/DQH/L.SQTYP
          MJN    ISQ1.2      IF SERVER TO CLIENT SEND INQUIRY RESPONSE
          LDDL   QF          CHECK IF INQUIRY REQUEST STILL VALID
          LPK    DRIVER+SUBSYS+SNDBUF+SNDDAT+SNDPMT+PRORSP
          ZJN    ISQ1.2      IF NOTHING GOING ON INQUIRY REQUEST IS VALID
          LDK    OBSINQ      OBSOLETE OR UNWANTED INQUIRY REQUEST
          STD    ER          FAKE ERROR ON OBSOLETE INQUIRY REQUES
          UJN    ISQ1.1      (SKIP TO EXIT)

 ISQ1.2   BSS    0
          LDK    HMF.INQ     SET INQUIRY FLAG IN HEADER MESSAGE
          STML   HMSG+/HMSG/P.INQ
          LDDL   P1+/RBE/P.SPMSG  STATE INQUIRY WORD
          STML   HMSG+/HMSG/P.SPMSG
          UJN    ISQ3        ATTEMPT ESM RESERVATION

 ISQ2     LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LPC    SNDBUF+SNDDAT
          ZJN    ISQ4        IF NOT SEND BUFFER OR DATA (SNDPMT)
          LDML   DQENTR+/DQE/P.HDIV  HELDOVER DIVISION NUMBER
          ZJN    ISQ3        IF NO HELD OVER DATA
*         HELD OVER PAGE DATA WAS NOT PROMPTED FOR, RELEASE RESERVED DEVISION.
          STDL   DI          SET DIVISION NUMBER
          LDDL   SI          SOURCE ID NUMBER
          STDL   ID          SOURCE ID NUMBER
          LDN    SADESM      ESMADR OFFSET OF SOURCE ESM ADDRESSES
          RJM    SEA         SETUP ESM ADDRESSES
          RJM    CFR         CLEAR SOURCE ESM FLAG REGISTER (RECORDS ERROR)
          LDN    0           CLEAR HOLDOVER INFORMATION IN QUEUE ENTRY
          STML   DQENTR+/DQE/P.HWCD
          STML   DQENTR+/DQE/P.HDIV
*
*         IF *FSR* IS "LOOKING AHEAD" IN THE REQUEST BUFFER WHEN THE REQUEST AT
*         THE TOP OF THE REQUEST BUFFER COULD NOT BE INITIATED THEN (TOQP) IS
*         THE QUEUE INDEX OF THAT REQUEST. IF THE CURRENT REQUEST REQUIRES ESM
*         RESERVATION AND IT'S FROM THE SAME QUEUE AS THE REQUEST AT THE TOP OF
*         THE REQUEST BUFFER IT WILL NOT BE INITIATED.
 ISQ3     BSS    0
          LDDL   QI          QUEUE INDEX OF REQUEST
          LMDL   TOQP        QUEUE INDEX WHICH CAUSE LOOK AHEAD
          ZJK    ISQ5        IF CURRENT QI SAME AS THAT WHICH CAUSED LOOK AHEAD

          RJM    RSV         RESERVE DESTINATION MACHINE ESM SPACE
*                            (A) = ZERO, DESTINATION ESM RESERVED.
*                                = NEGATIVE, DESTINATION NOT RESERVED.
*                                = NON ZERO, HARDWARE ERROR.
 ISQ4     RETURN
FSQ       EJECT
** FSQ -  FIND A SEND REQUEST IN THE REQUEST BUFFER.
*
** PURPOSE -
*         THIS SUBROUTINE SCANS THE REQUEST BUFFER, BEGINNING AT THE
*         OUT OFFSET, CLEARING CONTIGUOUS PREVIOUSLY PROCESSED REQUESTS
*         AND UPDATING THE OUT OFFSET UNTIL A NON-PREVIOUSLY PROCESSED
*         REQUEST IS FOUND OR UNTIL ALL ENTRIES HAVE BEEN EXAMINED.
*         IF THE FIRST NON-PREVIOUSLY PROCESSED REQUEST CAN BE
*         INITIALIZED IT IS CLEARED FROM THE REQUEST BUFFER, THE OUT
*         OFFSET IS UPDATED, AND THE REQUEST IS PROCESSED. IF THE FIRST
*         NON-PREVIOUSLY PROCESSED REQUEST CANNOT BE INITIALIZED AN
*         ATTEMPT IS MADE TO INITIALIZE ONE OF THE REMAINING REQUESTS.
*         IF IN THIS 'LOOK AHEAD' SITUATION A REQUEST IS INITIALIZED,
*         IT IS FLAGED AS A PREVIOUSLY PROCESSED REQUEST IN THE REQUEST
*         BUFFER, THE OUT OFFSET IS NOT UPDATED, AND THE REQUEST IS
*         PROCESSED.
*
** INPUT -
*         CM.RBI = REQUEST BUFFER IN POINTER REFORMATTED CM ADDRESS.
*         CM.RB  = REQUEST BUFFER REFORMATTED CM ADDRESS.
*         RBLIM  = REQUEST BUFFER LIMIT OFFSET IN CM WORDS.
*
** OUTPUT -
*
** USES - T5, T7 THRU T11, P1 THRU P4.
*
** CALLS - CSQ, IRS, ISQ, PSQ, UQE.

 IOUT     EQU    T5          INITIAL OUT POINTER VALUE
 OUT      EQU    T10         REQUEST BUFFER OUT POINTER (T7-T10)
 INN      EQU    T11         REQUEST BUFFER IN POINTER
 TOUT     EQU    OUT-2       TEMPORARY REQUEST BUFFER OUT POINTER
 TOQP     EQU    OUT-3       TOP OF REQUEST BUFFER POINTER


 FSQ      BSS    0           ENTRY
          LDN    0
          STDL   EI          CLEAR QUEUE ENTRY INDEX
          RJM    IRS         INITIALIZE SINGLE WORD RESPONSE BUFFER
          LOADC  CM.RBI      ADDRESS OF REQUEST BUFFER IN POINTER
          CRDL   INN-3       READ REQUEST BUFFER IN POINTER
          ADN    /RBD/C.OUT-/RBD/C.IN
          CRDL   OUT-3       READ REQUEST BUFFER OUT POINTER
          LDDL   OUT         OUT OFFSET IN BYTES
          SHN    -3          /8 FOR CM WORD OFFSET
          STDL   OUT         OUT OFFSET IN CM WORDS
          STDL   IOUT        SAVE INITIAL VALUE OF OUT POINTER
          LDDL   INN         IN OFFSET IN BYTES
          SHN    -3          /8 FOR CM WORD OFFSET
          STDL   INN         IN OFFSET IN CM WORDS
          SBDL   RBLIM       REQUEST BUFFER LIMIT IN CM WORDS
          NJN    FSQ1        IF IN NOT EQUAL LIMIT
          STDL   INN         RESET IN POINTER (CM UPDATING 'IN')
*
*         FIND AND CLEAR PREVIOUSLY PROCESS REQUEST BUFFER ENTRIES.
*
 FSQ1     LDDL   INN
          SBDL   OUT
          ZJN    FSQ5        IF IN = OUT, NO MORE REQUEST ENTRIES
          LOADC  CM.RB       ADDRESS OF REQUEST BUFFER
          ADDL   OUT         FORM REQUEST BUFFER ENTRY ADDRESS
          CRDL   P1          READ REQUEST BUFFER ENTRY
          LDDL   P1+/RBE/P.PRV
          SHN    2+/RBE/L.PRV
          PJN    FSQ3        IF NOT A PREVIOUSLY PROCESSED ENTRY
          RJM    CSQ         CLEAR REQUEST BUFFER ENTRY, UPDATE OUT
 FSQ2     UJK    FSQ1        CHECK NEXT ENTRY

*
*         ATTEMPT TO INITIALIZE THE FIRST REQUEST FOUND.
*
 FSQ3     RJM    ISQ         INITIALIZE REQUEST BUFFER REQUEST
          PJN    FSQ4        IF ABLE TO PROCESS REQUEST AT 'OUT'

*         BECAUSE FILE SERVER RELIES ENTIRELY ON SOFTWARE TO DETERMINE THE
*         PRESENCE OR ABSENCE OF A PARTNER MACHINE, IT IS POSSIBLE FOR THIS
*         DRIVER TO ASSUME THAT A MACHINE IS AVAILABLE TO RECEIVE MESSASGES
*         WHEN IN FACT IT IS NOT. THIS SITUATION OCCURS IF A PARTNER MACHINE'S
*         "MACHINE_UP" FLAG (4 bit flag register) IS ERRONIOUSLY LEFT IN THE
*         STATE WHICH INDICATES THE MACHINE IS "UP". THE "MACHINE_UP" FLAG IS
*         SET TO INDICATE MACHINE "UP" WHEN A "RESUME_PP" REQUEST IS PROCESSED;
*         THE FLAG IS SET TO INDICATE MACHINE "DOWN" AT DRIVER INITIALIZATION
*         TIME AND WHEN A "IDLE_PP" REQUEST IS PROCESSED. ANY SYSTEM FAILURE OR
*         HARDWARE FAILURE WHICH PREVENTS THE SETTING OF THE "MACHINE_UP" FLAG
*         TO "DOWN" WILL CAUSE ITS PARTNER TO CONTINUE TO ASSUME IT IS "UP".
*         THIS DRIVER STORES (send) MESSAGES INTO AN "UP" PARTNER MACHINE'S ESM
*         DIVISION SPACE AS LONG AS SPACE IS AVAILABLE. WHEN ALL SPACE IS FULL
*         REQUEST TO THAT MACHINE ARE "HELD" IN THE REQUEST BUFFER UNTIL SPACE
*         BECOMES AVAILABLE OR UNTIL THE DESTINATION MACHINE'S "MACHINE_UP" FLAG
*         INDICATES THE MACHINE IS "DOWN".  BECAUSE THE REQUEST BUFFER IS A
*         CIRCULAR BUFFER WITH "IN" AND "OUT" OFFSETS, AS LONG AS A REQUEST IS
*         BEING HELD IN THE REQUEST BUFFER THE "OUT" OFFSET CANNOT BE ADVANCED
*         AND THE POTENTIAL FOR A FULL REQUEST BUFFER CONDITION INCREASES.
*         IF FILE SERVER IS SUPPORTING MORE THAN ONE CONNECTION THE ACTIVE
*         CONNECTION MAY TERMINATE AS A RESULT OF NOT BEING ABLE TO
*         COMMUNICATE WITH IT'S PARTNER BECAUSE OF THE FULL REQUEST BUFFER.
*
*         THE FOLLOWING CODE IS TO PREVENT A REQUEST BUFFER FULL CONDITION
*         WHEN MORE THAN ONE CONNECTION IS BEING ACTIVATED. IN THIS CASE THE
*         REQUEST WHICH PREVENTS THE ADVANCEMENT OF OUT IS AN INQUIRY MESSAGE
*         AS TO THE STATUS OF A POLL MESSAGE TO A MACHINE WHICH HAS NOT YET
*         BEEN ACTIVATED.

          LDDL   QEBRB       QEI BLOCKING ADVANCEMENT OF 'OUT' SECOND TIME
          SBN    POLLQEI     CHECK IF POLLER'S QEI
          NJN    FSQ6        IF NOT POLLER'S QEI BLOCKING ADVANCEMENT OF 'OUT'
          LDDL   P1+/RBE/P.INQ
          SHN    2+/RBE/L.INQ  (INQUIRY REQUEST FLAG TO SIGN POSITION)
          PJN    FSQ6        IF NOT AN INQUIRY REQUEST
          LDK    OBSINQ      OBSOLETE OR UNWANTED INQUIRY REQUEST ERROR
          STDL   ER          FAKE ERROR SO INQUIRY REQUEST IS REMOVED
 FSQ4     BSS    0
          RJM    CSQ         CLEAR REQUEST BUFFER ENTRY, UPDATE OUT
 FSQ5     LJM    FSQ9        UPDATE OUT POINTER

*         THE FIRST REQUEST FOUND COULD NOT BE INITIALIZED.
*         LOOK AHEAD IN REQUEST BUFFER FOR A REQUEST WHICH CAN BE INITIALIZED
*
 FSQ6     LDDL   OUT         CURRENT OUT POINTER
          STDL   TOUT        TEMPORARY OUT POINTER
          LDDL   P1+/RBE/P.QI  FIRST ENTRY WHICH COULD NOT BE INITIATED
          SHN    /RBE/L.QI-/RBE/L.QEI
          STDL   TOQP        SAVE TOP OF REQUEST BUFFER QI
          LDDL   EI
          STDL   QEBRB       QUEUE ENTRY INDEX BLOCKING ADVANCEMENT OF 'OUT'

*         REQUEST BUFFER LOOK AHEAD LOOP.
 FSQ7     LDN    0
          STDL   EI          CLEAR QUEUE ENTRY INDEX
          AODL   TOUT        INCREMENT TEMP OUT POINTER
          SBDL   RBLIM
          NJN    FSQ8        IF TOUT NOT EQUAL LIMIT
          STDL   TOUT        RESET TEMP OUT POINTER
 FSQ8     LDDL   TOUT
          SBDL   INN
          ZJN    FSQ9        IF NO MORE ENTRIES
          LOADC  CM.RB       ADDRESS OF REQUEST BUFFER
          ADDL   TOUT        TEMP OUT POINTER
          CRDL   P1          READ REQUEST BUFFER ENTRY
          LDDL   P1+/RBE/P.PRV
          SHN    2+/RBE/L.PRV
          MJK    FSQ7        IF A PREVIOUSLY PROCESSED ENTRY

*         ATTEMPT TO INITIALIZE NEXT ENTRY IN REQUEST BUFFER.
          RJM    ISQ         INITIALIZE REQUEST BUFFER REQUEST
          ZJN    FSQ8.1      IF NO ERROR FOUND
          MJK    FSQ7        IF UNABLE TO INITIALIZE REQUEST
          RJM    CSQ         CLEAR REQUEST BUFFER ENTRY, UPDATE OUT
          UJK    FSQ9        UPDATE OUT POINTER
*
*         MARK REQUEST BUFFER ENTRY AS A PREVIOUSLY PROCESSED ENTRY.
*
 FSQ8.1   BSS    0
          LDK    RBE.PRV
          STDL   P1+/RBE/P.PRV  SET PREVIOUSLY PROCESSED FLAG
          LOADC  CM.RB      ADDRESS OF REQUEST BUFFER
          ADDL   TOUT       TEMP OUT POINTER
          CWDL   P1         WRITE ENTRY INTO REQUEST BUFFER
*
*         UPDATE REQUEST BUFFER OUT POINTER IN CM IF CONTIGUOUS ENTRIES FROM
*         TOP OF REQUEST BUFFER PROCESSED.
*
 FSQ9     LDDL   IOUT        INITIAL VALUE OF OUT IN CM WORDS
          SBDL   OUT         NEW REQUEST BUFFER OUT POINTER IN CM WORDS
          ZJN    FSQ10       IF NO CHANGE IN INITIAL OUT POINTER
          LDN    0           RESTORE HIGH ORDER BITS OF CM OUT POINTER
          STDL   OUT-1       ZERO
          STDL   OUT-2       ZERO
          STDL   OUT-3       ZERO
          STDL   QEBRB       CLEAR QUEUE ENTRY BLOCKING REQUEST BUFFER
          LDDL   OUT         OUT OFFSET IN CM WORDS
          SHN    3           *8 FOR BYTE OFFSET
          STDL   OUT         OUT OFFSET IN BYTES
          LOADC  CM.RBD      ADDRESS OF REQUEST BUFFER DIRECTORY
          ADK    /RBD/C.OUT  OFFSET OF OUT POINTER
          CWDL   OUT-3       WRITE UPDATED REQUEST BUFFER OUT POINTER

 FSQ10    LDDL   ER          ERROR CONDITION CODE
          ZJN    FSQ11       IF NO ERROR INITIALIZING REQUEST
          LMK    OBSINQ      CHECK IF OBSOLETE OR UNWANTED INQUIRY REQUEST
          ZJN    FSQX        IF FAKE ERROR TO DISPOSE OF INQUIRY REQUEST
          LJM    UQE         REPORT ERROR AND EXIT

 FSQ11    LDDL   EI
          NJN    PSQ         IF PROCESSABLE REQUEST FOUND

 FSQX     LJM    0,MLPRTN    EXIT
PSQ       SPACE  4,35
** PSQ - PROCESS SEND REQUEST.
*
** PURPOSE -
*       FOR FILE SERVER COMMAND/RESPONSE REQUESTS -
*         THE QUEUE ENTRY COMMAND FLAGS DEFINE THE ACTION TO BE TAKEN.
*         ONLY THE SEND COMMAND/RESPONSE (SNDBUF) AND SEND PAGE DATA (SNDDAT)
*         COMMANDS MAY OCCUR TOGETHER AND IF TOGETHER, THE SEND COMMAND/RESPONSE
*         IS PROCESSED FIRST. IF THE SEND PROMPT COMMAND IS PRESENT IT IS
*         PROCESSED AND THE OTHER COMMAND FLAGS ARE NOT EXAMINED.
*
*       FOR STATE INQUIRY REQUESTS -
*         THE QUEUE ENTRY IS NOT USED OR EFFECTED FOR STATE INQUIRY REQUEST.
*
** INPUT -
*         DQENTR = DRIVER QUEUE ENTRY.
*         DQHEAD = DRIVER QUEUE HEADER.
*         DESMAD = DESTINATION ESM ADDRESSES.
*         QI     = QUEUE INDEX.
*         EI     = QUEUE ENTRY INDEX.
*         SINGLE WORD RESPONSE -
*                   QIQEI = QUEUE INDEX / QUEUE ENTRY INDEX.
*
** OUTPUT -
*
** CALLS  - CFR, CIO/DIO, ERR, IEM, RIL, WEH, UQE.

 PSQ      BSS    0           ENTRY
          LDML   HMSG+/HMSG/P.INQ
          SHN    2+/HMSG/L.INQ
          PJN    PSQ1        IF NOT STATE INQUIRY
*
*         PROCESS 'STATE INQUIRY' REQUEST.
*
          RJM    WEH         WRITE ESM HEADER WITH STATE INQUIRY
          NJN    PSQ2        IF ERROR (QE NOT UPDATED ON INQUIRY FAILURE)
          LJM    0,MLPRTN    EXIT TO MAIN LOOP

*
*         PROCESS NON 'STATE INQUIRY' REQUEST.
*
 PSQ1     BSS    0
          LDDL   QF
          LPK    DRIVER      CHECK IF DRIVER ACTION FLAG SET
          NJN    PSQ3        IF DRIVER ACTION FLAG SET
          STDL   EI          CLEAR ENTRY INDEX SO IT'S NOT UPDATED
          LDK    IE.E12      ** DRIVER ACTION FLAG NOT SET **
 PSQ2     LJM    PSQ8        RECORD ERROR, RELEASE RESERVATION, UPDATE QE

*
*         PROCESS SEND FILE SERVER COMMAND/RESPONSE OR PROMPT REQUEST.
*
 PSQ3     BSS    0
          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LPK    ACTIVE+SNDBUF+SNDDAT+SNDPMT
          STDL   QF          RETIAN ONLY ACTIVE AND COMMAND FLAGS
          SHN    2+/DQE/L.SNDPMT
          PJN    PSQ4        IF NOT SEND PROMPT COMMAND
          LJM    PMT         PROCESS DATA PROMPT COMMAND

 PSQ4     LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          SHN    2+/DQE/L.SNDBUF
          PJN    PSQ6        IF NOT SNDBUF
*
*         PROCESS SEND BUFFER COMMAND.
*
          LDK    /DQE/P.SIND SEND BUFFER DESCRIPTOR OFFSET
          RJM    RIL         SETUP LENGTH/ADDRESS LIST
          NJN    PSQ5        IF ERROR FROM ADDRESS VALIDATION
          LDC    DESMAD+/EMA/P.BUF
          PAGEIO             CIO/DIO READ CM AND OUTPUT TO ESM
 PSQ5     NJN    PSQ8        IF ERROR
          LDDL   AC          NUMBER OF CM WORDS OUTPUT
          STML   HMSG+/HMSG/P.WCB  STORE CM WORD COUNT OF BUFFER

          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LMK    SNDBUF+BUFSNT  CLEAR SNDBUF, SET BUFSNT
          STDL   QF

 PSQ6     LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          SHN    2+/DQE/L.SNDDAT
          PJN    PSQ7        IF NOT SNDDAT
*
*         PROCESS SEND DATA COMMAND.
*
          LDK    /DQE/P.IND  PAGE DATA DESCRIPTOR OFFSET
          RJM    RIL         SETUP LENGTH/ADDRESS LIST
          NJN    PSQ8        IF ERROR
          LDC    DESMAD+/EMA/P.DAT
          PAGEIO             CIO/DIO READ CM AND OUTPUT TO ESM
          NJN    PSQ8        IF ERROR
          LDDL   AC          NUMBER OF CM WORDS OUTPUT
          STML   HMSG+/HMSG/P.WCD  STORE CM WORD COUNT OF PAGE DATA

          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LMK    SNDDAT+DATSNT  CLEAR SNDDAT, SET DATSNT
          STDL   QF
*
*         WRITE HEADER TO ESM.
*
 PSQ7     RJM    WEH         WRITE ESM HEADER TO ESM
          ZJN    PSQ9        IF NO ERROR
*
*         ERROR PROCESSING.
*
 PSQ8     RJM    ERR         RECORD ERROR
          LDN    DADESM      ESMADR OFFSET OF DESTINATION ESM ADDRESSES
          RJM    CFR         CLEAR DESTINATION FLAG REGISTER (RECORDS ERROR)
*
*         COMPLETE THE REQUEST.
*
 PSQ9     LJM    UQE         UPDATE QUEUE ENTRY AND RETURN TO MAIN LOOP
PMT       EJECT
** PMT -  PROMPT COMMAND PROCESS.
*
** PURPOSE -
*         THE SEND PROMPT COMMAND PROVIDES FOR THE COMPLETION OF A
*         RECEIVE REQUEST, PROCESSED EARLIER, WHICH CONTAINED PAGE
*         DATA, BUT BUFFER SPACE FOR THE PAGE DATA WAS NOT ASSIGNED
*         FOR THE QUEUE ENTRY. THE PP SAVED THE ESM DIVISION
*         NUMBER IN THE RECEIVING QUEUE ENTRY SO THAT WHEN A SEND
*         PROMPT COMMAND IS DETECTED THE DATA TO BE RECEIVED CAN
*         BE LOCATED WITHOUT SEARCHING ESM HEADERS FOR IT.
*         THE TASK, INFORMED OF HOW MUCH PAGE DATA IS TO BE RECEIVED
*         VIA THE COMMAND/RESPONSE MESSAGE, HAS ALLOCATED AND ASSIGNED
*         PAGE DATA SPACE, STORED THE BUFFER POINTER AND SEND PROMPT
*         (SNDPMT) COMMAND IN THE QUEUE ENTRY, AND QUEUED THE REQUEST
*         BUFFER ENTRY.
*
** INPUT -
*         QI     = QUEUE INDEX.
*         EI     = QUEUE ENTRY INDEX.
*         DQHEAD = DRIVER QUEUE HEADER.
*         DQENTR = DRIVER QUEUE ENTRY.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = NON ZERO, IF ERROR OCCURRED -
*                            - HELD DIVISION NUMBER IS ZERO.
*                            - HELD DATA COUNT IS ZERO.
*                            - ERROR FROM CALLED ROUTINE.
*         DI     = HELD OVER ESM DIVISION NUMBER.
*
** CALLS - CFR, ERR, RED, SEA, UQE.

 PMT      BSS    0           ENTRY
          LDML   DQENTR+/DQE/P.HDIV  HELDOVER DIVISION NUMBER
          ZJN    PMT3        IF HELD DIVISION NUMBER MISSING
          STDL   DI          SET DIVISION NUMBER
          LDDL   SI          SOURCE ID NUMBER
          STDL   ID          SOURCE ID NUMBER
          LDN    SADESM      ESMADR OFFSET OF SOURCE ESM ADDRESSES
          RJM    SEA         SETUP ESM ADDRESSES
          LDML   DQENTR+/DQE/P.HWCD
          ZJN    PMT3        IF HELD DATA COUNT MISSING
          STML   HMSG+/HMSG/P.WCD (SO 'RED' FINDS CORRECT WORD COUNT FOR PROMPT)
          RJM    RED         READ PAGE DATA FROM ESM
          ZJN    PMT1        IF NO ERROR
          RJM    ERR         RECORD MEDIA ERROR
 PMT1     LDN    SADESM      ESMADR OFFSET OF SOURCE ESM ADDRESSES
          RJM    CFR         CLEAR SOURCE ESM FLAG REGISTER (RECORDS ERROR)
          LDN    0           CLEAR HOLDOVER INFORMATION IN QUEUE ENTRY
          STML   DQENTR+/DQE/P.HWCD
          STML   DQENTR+/DQE/P.HDIV
 PMT2     LJM    UQE         UPDATE QUEUE ENTRY AND RETURN TO MAIN LOOP

*
*         INTERFACE ERROR PROCESSING.
*
 PMT3     LDK    IE.E08      ** MISSING HOLD OVER INFORMATION IN QE **
          RJM    ERR         RECORD ERROR
          UJN    PMT2        COMPLETE THE REQUEST
          TITLE  PROCESS SOURCE ESM FLAG REGISTERS (RECEIVE)
** FRQ -  FIND A RECEIVE REQUEST IN SOURCE ESM FLAG REGISTERS.
*
** PURPOSE -
*         ALL RECEIVE REQUESTS FOR THIS PP ARE POSTED IN THE ESM FLAG
*         REGISTERS ASSIGNED TO THIS PP. THIS SUBROUTINE TESTS EACH
*         OF THESE ESM FLAG REGISTERS UNTIL A RECEIVE REQUEST IS FOUND
*         OR UNTIL ALL FLAG REGISTERS HAVE BEEN TESTED ONCE.
*
** INPUT - NONE.
*
** OUTPUT -
*         (A)    = ZERO, IF INCOMING REQUEST FOUND.
*                = ERROR CODE, IF ERROR OCCURRED.
*         DI     = SOURCE DIVISION NUMBER.
*         ID     = SOURCE ID NUMBER.
*
** USES - T3, T4.
*
** CALL - CIQ, ERR, IRS, FOP, RDQ, REH, RSP, SEA.

 FRQ      BSS    0           ENTRY
          RJM    IRS         INITIALIZE SINGLE WORD RESPONSE BUFFER
          LDC    0           LAST DIVISION NUMBER PROCESSED
 FRQA     EQU    *-1         (LAST DIVISION NUMBER PROCESSED)
          STDL   DI
          LDK    FR.RSV+FR.RDY  FIND RESERVED AND READY ESM FLAG
          STDL   T3          SAVE 4 BIT FLAG WORD
          LDK    FF.EQU      EQUALITY STATUS FLAG FUNCTION
          STDL   T4          SAVE FLAG FUNCTION

*         SCAN SOURCE FLAG REGISTERS FROM DIVISION (FRQA)+1 TO (FRQA).
 FRQ1     LDDL   DI          LAST DIVISION CHECKED
          SBDL   NDIVS       NUMBER OF ESM DIVISIONS PER MACHINE
          NJN    FRQ2        IF NOT MAX DIVISION NUMBER
          STDL   DI          RESET/CLEAR DIVISION NUMBER
 FRQ2     AODL   DI          INCREMENT TO NEXT DIVISION NUMBER (1 THRU 8)
          ADML   TBFLGA,SI   BASE ESM FLAG REGISTER ADDRESS FOR SOURCE
          SBN    1           ADJUST DIVISION FLAG ADDRESS
          RJM    FOP         FLAG OPERATION
          ZJN    FRQ5        IF READY RESERVED FLAG FOUND
          PJN    FRQ3        IF HARDWARE ERROR  (RESPONSE ONLY, NO QE)
          LDDL   DI          LAST DIVISION CHECKED
          SBML   FRQA        LAST DIVISION NUMBER PROCESSED
          NJN    FRQ1        IF NOT COMPLETE CYCLE
          LJM    0,MLPRTN    TO MAIN LOOP

*         ERROR PROCESSING.
 FRQ3     RJM    ERR         RECORD ERROR
          LJM    UQE         WRITE RESPONSE (NO QUEUE ENTRY) AND GO TO MAIN LOOP


*         INPUT REQUEST FOUND.
 FRQ5     LDDL   DI          CURRENT DIVISION NUMBER
          STML   FRQA        SAVE AS LAST DIVISION PROCESSED

*
*         INITIALIZE RECEIVE REQUEST.
*
*         SET SOURCE ESM ADDRESSES.
 IRQ      BSS    0
          LDDL   SI          SOURCE ID NUMBER
          STDL   ID          SAVE SOURCE ID NUMBER
          LDN    SADESM      ESMADR OFFSET OF SOURCE ESM ADDRESSES
          RJM    SEA         SETUP ESM MEMORY ADDRESSES

*         READ HEADER FROM ESM.
          RJM    REH         READ ESM HEADER
          ZJN    IRQ2        IF NO ERROR
 IRQ1     LJM    PRQ5        CLEAR SOURCE FLAG REG

 IRQ2     LDML   HMSG+/HMSG/P.INQ
          SHN    2+/HMSG/L.INQ
          PJN    IRQ3        IF NOT INQUIRY MESSAGE
          LDK    SRF.SR+SRF.SW+SRF.INQ+B.FSSR
          STML   RSPBUF+/FSSR/P.SRFL  RESPONSE FLAGS AND LENGTH FOR INQUIRY

*         ESTABLISH QUEUE AND QUEUE ENTRY INDEX FROM ESM HEADER
 IRQ3     LDML   DQHEAD+/DQH/P.DQEI  DESTINATION QI AND QEI

*         READ QUEUE HEADER AND QUEUE ENTRY.
          RJM    RDQ         READ QUEUE HEADER AND QUEUE ENTRY
          NJN    IRQ3.1      IF QUEUE RELATED ERROR THROW AWAY REQUEST
          RJM    CIQ         CHECK IDLE QUEUE OR INACTIVE QUEUE ENTRY
 IRQ3.1   BSS    0
          NJK    IRQ4        IF QUEUE IDLE OR ENTRY INACTIVE THROW AWAY REQUEST
          LDML   HMSG+/HMSG/P.INQ
          SHN    2+/HMSG/L.INQ
          PJN    PRQ         IF NOT STATE INQUIRY REQUEST
*
*         PROCESS INCOMING 'STATE INQUIRY' REQUEST/RESPONSE.
*
          LDML   HMSG+/HMSG/P.SPMSG
          STML   RSPBUF+/FSSR/P.SRPAR  STORE STATE INQUIRY IN RESPONSE
          RJM    RSP         WRITE SINGLE WORD RESPONSE/INTERRUPT (IGNORE ERROR)
*
*         CLEAR SOURCE ESM FLAG REGISTER AND EXIT TO MAIN LOOP.
*
 IRQ4     BSS    0           CLEAR OUT FLAG REGISTER INCOMING REQUEST
          LDN    SADESM      ESMADR OFFSET OF SOURCE ESM ADDRESSES
          RJM    CFR         CLEAR SOURCE ESM FLAG REGISTER (RECORDS ERROR)
          ZJN    IRQ5        IF NO ERROR
          LDN    0
          STML   RSPBUF+/FSSR/P.QI   CLEAR QI/QEI FOR ONE WORD RESPONSE
          RJM    RSP         REPORT FAILURE ON FLAG OP
 IRQ5     LJM    0,MLPRTN    EXIT TO MAIN LOOP

PRQ       SPACE  4,40
** PRQ -  PROCESS RECEIVE REQUEST.
*
** PURPOSE -
*         THE ESM HEADER INDICATES THE QUEUE AND QUEUE ENTRY TO WHICH THIS
*         RECEIVE REQUEST IS DIRECTED. THE OPERATION TO BE PERFORMED IS
*         INDICATED BY COMMAND/RESPONSE WORD COUNT, AND PAGE DATA WORD
*         COUNT FIELDS OF THE ESM HEADER.
*
*         ANY INCOMING (RECEIVE) REQUEST DIRECTED TO A QUEUE WHICH IS IDLE,
*         A QUEUE ENTRY WHICH IS INACTIVE, OR A QUEUE ENTRY WITH THE DRIVER
*         ACTION FLAG SET WILL BE REMOVED FROM ESM AND IGNORED.
*
*         IF BOTH COMMAND/RESPONSE WORD COUNT AND PAGE DATA WORD
*         COUNT FIELDS ARE NON ZERO, THE COMMAND/RESPONSE RECEIVE
*         IS PROCESSED FIRST. IF THE PAGE DATA RECEIVE CAN BE
*         PROCESSED (PAGE BUFFER SPACE ASSIGNED) THE ESM FLAG
*         REGISTER WILL BE CLEARED. IF PAGE DATA BUFFER SPACE IS
*         NOT ASSIGNED TO THE QUEUE ENTRY, THE ESM DIVISION NUMBER
*         IS SAVED IN THE QUEUE ENTRY AND THE ESM FLAG REGISTER IS
*         CHANGED TO INDICATE 'HELD' PAGE DATA. THIS 'HELD' PAGE
*         DATA CONDITION IS CLEARED WHEN THE PP PROCESSES THE
*         SEND PROMPT COMMAND QUEUED VIA THE REQUEST BUFFER.
*
** INPUT -
*         DI     = SOURCE DIVISION NUMBER.
*         DQHEAD = DRIVER QUEUE HEADER.
*         DQENTR = DRIVER QUEUE ENTRY.
*         HMSG   = ESM HEADER MESSAGE.
*         QI     = QUEUE INDEX.
*         EI     = QUEUE ENTRY INDEX.
*         SESMAD = SOURCE ESM MEMORY ADDRESSES.
*
** OUTPUT -
*
** USES - T3, T4.
*
** CALL - CFR, FOP, IEM, RED, RIL, WEH, UQE.


 PRQ10    UJN    IRQ4        CLEAR SOURCE FLAG AND GO TO MAIN LOOP

 PRQ      BSS    0           ENTRY
          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          SHN    2+/DQE/L.DRIVER  CHECK IF SEND REQUEST QUEUED
          MJN    PRQ10       IF SEND REQUEST QUEUED THROW AWAY INCOMING REQUEST

          LDML   DQHEAD+/DQH/P.SQTYP  (THIS MACHINES QUEUE HEADER)
          SHN    2+/DQH/L.SQTYP
          PJN    PRQ1        IF NOT SERVER TO CLIENT QUEUE TYPE

*         REQUEST FOR SERVER SIDE.
          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LPK    ACTIVE+SUBSYS+PRORSP
          STDL   QF          RETAIN ONLY ACTIVE FLAG FOR SERVER IF NOT BUSY
          LPK    SUBSYS+PRORSP
          ZJN    PRQ2        IF SERVER NOT BUSY WITH QE
          UJN    IRQ5        LEAVE INCOMMING REQUEST FOR NEXT TIME AROUND

*         RESPONSE FOR CLIENT SIDE.
 PRQ1     LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LPK    ACTIVE+SUBSYS+BUFSNT+DATSNT+PRORSP
          STDL   QF          RETAIN ONLY ACTIVE AND SENT EVENT FLAGS IF NOT BUSY
          LPK    SUBSYS+PRORSP
          NJN    PRQ10       CLIENT HAS QUEUE ENTRY, DUMP INCOMING RESPONSE
          LDDL   QF
          LPK    BUFSNT      THIS FLAG MUST BE SET TO RECEIVE RESPONSE
          ZJN    PRQ10       CLIENT IS NOT EXPECTING ANY RESPONSE, DUMP IT

 PRQ2     LDML   HMSG+/HMSG/P.WCB
          ZJN    PRQ3        IF NO BUFFER DATA
*
*         GET COMMAND/RESPONSE DATA FROM ESM MEMORY.
*
          LDK    /DQE/P.RIND RECEIVE BUFFER DESCRIPTOR OFFSET
          RJM    RIL         SETUP LENGTH/ADDRESS LIST
          NJN    PRQ4        IF ERROR
          LDML   HMSG+/HMSG/P.WCB
          STDL   RC          SET REQUESTED NUMBER OF CM WORDS TO INPUT
          LDC    SESMAD+/EMA/P.BUF
          PAGEIO             CIO/DIO INPUT FROM ESM AND WRITE TO CM
          NJN    PRQ4        IF ERROR

          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LMK    BUFRCV      SET BUFFER RECEIVED FLAG
          STDL   QF

 PRQ3     LDML   HMSG+/HMSG/P.WCD
          ZJN    PRQ5        IF NO PAGE DATA
          LDML   DQENTR+/DQE/P.LEN  INDIRECT LIST LENGTH
          ZJN    PRQ8        IF PAGE DATA ADDRESS NOT ESTABLISHED
*
*         GET PAGE DATA FROM ESM MEMORY.
*
          RJM    RED         READ PAGE DATA FROM ESM
          ZJN    PRQ5        IF NO ERROR

*         RECORD ERROR.
 PRQ4     RJM    ERR         RECORD ERROR

*         CLEAR SOURCE ESM FLAGS AND COMPLETE REQUEST.
 PRQ5     LDN    SADESM      ESMADR OFFSET OF SOURCE ESM ADDRESSES
          RJM    CFR         CLEAR SOURCE ESM FLAG REGISTER (RECORDS ERROR)
 PRQ6     BSS    0           (UNUSED TAG)
 PRQ7     LJM    UQE         UPDATE QUEUE ENTRY AND RETURN TO MAIN LOOP

*
*         HOLD DATA UNTIL PROMPT FROM REQUEST BUFFER.
*
 PRQ8     BSS    0
          LDK    FF.SET      SELECTIVE SET FLAG FUNCTION
          STDL   T4          SAVE FLAG FUNCTION
          LDK    FR.RSV+FR.HLD  SET RESERVED AND HELD ESM FLAGS
          STDL   T3          FLAG WORD
          LDML   SESMAD+/EMA/P.FRG  SOURCE ESM FLAG REGISTER ADDRESS
          RJM    FOP         FLAG REGISTER OPERATION
          NJN    PRQ4        IF HARDWARE ERROR OR REJECTION
          LDDL   DI          ESM DIVISION NUMBER
          STML   DQENTR+/DQE/P.HDIV  SAVE HELD DIVISION NUMBER
          LDML   HMSG+/HMSG/P.WCD  PAGE DATA CM WORD COUNT
          STML   DQENTR+/DQE/P.HWCD  SAVE HELD PAGE DATA WORD COUNT
          UJN    PRQ7        UPDATE QUEUE ENTRY
          TITLE  SEND/RECEIVE REQUEST COMPLETION
UQE       EJECT
** UQE -  UPDATE QUEUE ENTRY FLAGS
*
** PURPOSE -
*         THE EVENT STATUS FLAGS IN THE QUEUE ENTRY INDICATE WHAT
*         OPERATION(S) THE PP HAS PERFORMED SO THAT THE TASK WHICH
*         CURRENTLY OWNS THE QUEUE ENTRY CAN TAKE APPROPRIATE ACTION
*         WHEN IT REGAINS ACCESS TO THE QUEUE ENTRY.
*         NOTE THAT IF ONLY A SEND COMMAND/RESPONSE (SNDBUF) COMMAND
*         HAS BEEN PROCESSED FROM A SERVER TO CLIENT QUEUE ALL QUEUE
*         ENTRY FLAGS (EXCEPT ASSIGNED) ARE CLEARED BY THE PP. THIS IS
*         BECAUSE THE SERVER TASK HAS COMPLETED THE LAST OF THE
*         OPERATIONS ASSOCIATED WITH A FILE SERVER REQUEST, AND FOR THE
*         PP TO ALERT THE SERVER TASK TO CLEAR THE QUEUE ENTRY FLAGS
*         WOULD BE A POOR USE OF CP TIME.
*
*         A RESPONSE BUFFER ENTRY INDIRECTLY CAUSES SOME ACTION TO
*         BE TAKEN BY THE TASK WHICH CURRENTLY OWNS THE QUEUE ENTRY.
*         THIS PORTION OF THE PROTOCOL IS BUILT INTO THIS SUBROUTINE,
*         AND THE RULES FOR DETERMINING WHEN TO WRITE A RESPONSE
*         BUFFER ENTRY ARE AS FOLLOWS -
*             WITHOUT REGARD TO QUEUE TYPE -
*                1. WHEN AN ERROR CONDITION IS INDICATED IN THE QUEUE
*                   ENTRY CONTROL FLAGS.
*                2. WHEN A COMMAND/RESPONSE MESSAGE IS RECEIVED
*                   (ESM FLAG REGISTER REQUEST) WITH OR WITHOUT PAGE
*                   DATA RECEIVED AT SAME TIME.
*                3. WHEN ONLY PAGE DATA IS RECEIVED AS A RESULT
*                   OF PROCESSING A SEND PROMPT (SNDPMT) COMMAND VIA
*                   THE REQUEST BUFFER.
*             FOR SERVER TO CLIENT QUEUE TYPE -
*                4. WHEN SEND PAGE DATA (SNDDAT) COMMAND IS PROCESSED
*                   VIA THE REQUEST BUFFER.
*
** INPUT -
*         DQENTR = DRIVER QUEUE ENTRY.
*         DQHEAD = DRIVER QUEUE HEADER.
*         EI     = QUEUE ENTRY INDEX.
*         MLPRTN = MAIN LOOP RETURN ADDRESS.
*         QF     = CURRENT DRIVER QUEUE ENTRY FLAGS WORD.
*         QI     = QUEUE INDEX.
*         RSPBUF = RESPONSE FLAGS.
*
** OUTPUT -
*         UQEA   = ZERO.
*
** USES   - T1, T2, T11.
*
** CALLS  - RSP.

 UQE      BSS    0           ENTRY (NO RETURN)
          LDML   RSPBUF+/FSSR/P.SRFL  RESPONSE FLAGS
          LPK    SRF.INQ
          NJN    UQE1        IF INQUIRY, RESPONSE ONLY, NO QUEUE ENTRY UPDATE
          LDDL   EI          CURRENT QUEUE ENTRY INDEX
          NJN    UQE2        IF QUEUE ENTRY
 UQE1     LJM    UQE6        RESPONSE ONLY, QUEUE ENTRY INDEX UNKNOWN

 UQE2     LDML   DQHEAD+/DQH/P.SQTYP
          SHN    2+/DQH/L.SQTYP
          MJN    UQE3        IF SERVER TO CLIENT QUEUE TYPE
*
*         QUEUE TYPE = CLIENT TO SERVER.
*
          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LPK    ERRALT+BUFRCV+DATRCV
          NJN    UQE4        IF BUFFER AND/OR DATA RECEIVED, OR ERROR
          UJN    UQE5        WRITE QUEUE ENTRY TO CM
*
*         QUEUE TYPE = SERVER TO CLIENT.
*
 UQE3     LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LPK    ERRALT+DATSNT+BUFRCV+DATRCV
          NJN    UQE4        IF DATA SENT, BUFFER/DATA RECEIVED, ERROR
          LDDL   QF
          LPK    ACTIVE      CLEAR ALL FLAGS EXCEPT 'ACTIVE'
          STDL   QF
          UJN    UQE5

 UQE4     LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LMK    PRORSP      PROCESS SERVER RESPONSE (MAY ACTIVATE SUBSYSTEM)
          LPK    -DRIVER     INSURE DRIVER ACTION IS CLEAR
          STDL   QF
*
*         WRITE QUEUE ENTRY FIRST WORD TO CM.
*
 UQE5     LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          STML   DQENTR+/DQE/P.ACTIVE  UPDATE QUEUE ENTRY FLAG WORD
          LDDL   QI          DRIVER QUEUE INDEX
          SHN    2           *4 = PP WORD INDEX INTO DQDIR
          STDL   T1          SAVE DQDIR INDEX (4 WORDS/ENTRY)
          LDDL   EI          DRIVER QUEUE ENTRY INDEX
          SHN    2           *4 = FOUR CM WORDS PER ENTRY
          STDL   T2          SAVE OFFSET TO QUEUE ENTRY
          LDN    1
          STDL   T11         (NUMBER OF CM WORDS TO WRITE)
          LOADR  DQDIR-4,T1  CM ADDRESS OF DRIVER QUEUE
          ADDL   T2          PLUS CM WORD OFFSET TO QUEUE ENTRY
          CWML   DQENTR,T11  WRITE DRIVER QUEUE ENTRY FIRST WORD TO CM
          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          SHN    2+/DQE/L.PRORSP
          PJN    UQE7        IF NO SERVER RESPONSE TO BE WRITTEN
 UQE6     RJM    RSP         WRITE SINGLE WORD RESPONSE/INTERRUPT
 UQE7     LJM    0,MLPRTN    RETURN TO MAIN LOOP
          TITLE  SUBROUTINES
CBC       SPACE 4,42
** CBC -  CONVERT BYTE COUNT TO CHANNEL WORD COUNT.
*
** PURPOSE -
*         MULTIPLY BYTE COUNT BY 2/3 AND ROUND UP.
*
** INPUT -
*         (A)    = NUMBER OF CM WORDS.
*
** OUTPUT -
*         (A)    = NUMBER OF 12 BIT CHANNEL WORDS.
*         CC     = NUMBER OF 12 BIT CHANNEL WORDS.
*
** USES - T1, T2.

 CBC4     BSS    0           ZERO CHANNEL WORDS

 CBC      SUBR               ENTRY/EXIT
          ZJN    CBC4        IF ZERO CM COUNT
          SHN    3           *8 FOR BYTE COUNT
          STDL   T1          8 BIT BYTE COUNT
          LDK    3           DIVIDE BY 3
          SHN    14
          STDL   T2
          LDN    0           CLEAR CHANNEL COUNT
          STDL   CC

*         DIVIDE LOOP.

 CBC1     LDDL   CC
          SHN    1
          STDL   CC
          LDDL   T1
          SBDL   T2
          MJN    CBC2
          STDL   T1
          AODL   CC          INCREMENT CHANNEL COUNT
 CBC2     LDDL   T2
          SHN    -1
          STDL   T2
          NJN    CBC1        THIS CHECK WILL MULTIPLY BY 2
          LDDL   T1
          ZJN    CBC3        IF NO NEED TO ROUND UP
          AODL   CC          ROUND UP IF REMAINDER
 CBC3     LDDL   CC          NUMBER OF 12 BIT CHANNEL WORDS
          RETURN
CFR       SPACE  4,30
** CFR -  CLEAR ESM FLAG REGISTER.
*
** PURPOSE -
*         CLEAR THE ESM FOUR BIT FLAG REGISTER, THEREBY REMOVING
*         RECEIVE REQUEST FROM QUEUE.
*
** INPUT -
*         (A)    = ESMADR OFFSET TO SOURCE/DESTINATION ESM ADDRESSES.
*
** OUTPUT -
*         (A)    = ZERO, IF ESM FLAG REGISTER CLEARED.
*                = NON ZERO, IF ERROR.
*
** USES - T1, T3, T4.
*
** CALLS - ERR, FOP.

 CFR1     RJM    ERR         RECORD ERROR

 CFR      SUBR               ENTRY/EXIT
          STDL   T1          SAVE FWA OF ESM ADDRESSES
          LDK    FF.CLR      SELECTIVE CLEAR FLAG FUNCTION
          STDL   T4
          LDK    FR.XXX+FR.HLD+FR.RDY+FR.RSV  CLEAR ALL SOURCE FLAGS
          STDL   T3          FLAG WORD
          LDML   ESMADR+/EMA/P.FRG,T1  ESM FLAG REGISTER ADDRESS
          RJM    FOP         PERFORM ESM FLAG FUNCTION
          NJN    CFR1        IF ERROR ON FLAG CLEAR OPERATION
          RETURN
CIQ       EJECT
** CIQ -  CHECK FOR IDLE QUEUE AND INACTIVE QUEUE ENTRY.
*
** PURPOSE -
*
** INPUT -
*         DQHEAD - DRIVER QUEUE HEADER.
*         QF     - DRIVER QUEUE ENTRY FLAGS.
*
** OUTPUT -
*         (A) = ZERO, IF QUEUE IS NOT IDLE AND QUEUE ENTRY IS ACTIVE.
*             = IE.E14, IF QUEUE IS IDLE.
*               IE.E15, IF QUEUE ENTRY IS INACTIVE.
*
** CALLS - ERR.

 CIQ1     LDK    IE.E14      ** QUEUE IDLE ERROR CODE **
          UJN    CIQ3        RECORD ERROR IN RESPONSE BUFFER

 CIQ2     STDL   EI          CLEAR ENTRY INDEX SO IT'S NOT EFFECTED
          LDK    IE.E15      ** INACTIVE QUEUE ENTRY ERROR CODE **
 CIQ3     RJM    ERR         RECORD ERROR IN RESPONSE BUFFER

 CIQ      SUBR               ENTRY/EXIT
          LDML   DQHEAD+/DQH/P.IDLE
          SHN    2+/DQH/P.IDLE
          MJN    CIQ1        IF QUEUE IDLE
          LDDL   QF
          LPK    ACTIVE
          ZJN    CIQ2        IF INACTIVE QUEUE ENTRY, CLEAR EI
          LDN    0           INDICATE NO ERROR
          RETURN
CPR       EJECT
** CPR -  CHECK FOR PP REQUEST.
*
** PURPOSE -
*         DETERMINE IF THERE ARE ANY PP REQUESTS TO PROCESS.
*         IF THERE ARE, LOAD AND EXECUTE OVERLAY.
*
** INPUT - NONE.
*
** OUTPUT - NONE.
*
** CALLS - LOV, PPR.
*
** USES - P1 THRU P4

 CPR      BSS    0           ENTRY
          LOADC  CM.PIT      CM ADDRESS TO A AND R FOR READ
          ADK    /PIT/C.PPQ  OFFSET TO NEXT PP REQUEST RMA
          CRDL   P1          READ NEXT PP REQUEST RMA FROM PIT
          LDDL   P3          GET FIRST HALF OF RMA OF 1ST REQUEST
          ADDL   P4          PLUS SECOND HALF
          NJN    CPR1        IF PP REQUEST QUEUED
          LJM    0,MLPRTN    TO MAIN LOOP, NO REQUESTS FOUND

 CPR1     RJM    LOV         LOAD PP OVERLAY
          LJM    PPR         PROCESS PP REQUEST

CIO       EJECT
** CIO -  CHANNEL INPUT/OUTPUT.
*
** PURPOSE -
*         PERFORM NON-DMA INPUT/OUTPUT WITH ESM.
*
** INPUT -
*         (A)    = LOCATION OF STARTING ESM ADDRESS.
*         PC     = FIRST PAGE REMAINING LENGTH TO READ/WRITE (CM WORDS).
*         RC     = REQUESTED NUMBER OF CM WORDS TO INPUT FROM CHANNEL.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = ERROR CODE, IF ERROR.
*         AC     = ACTUAL CM WORD COUNT INPUT FROM CHANNEL.
*         OVLWIPE= NONZERO, OVERLAY WIPED OUT.
*         RC     = REQUESTED CM WORD COUNT TO INPUT FROM CHANNEL.
*
** USES - T6, T9.
*
** CALLS - CBC, FCN, PST, RWI, VLN.

 CIOX     EQU    *           INSUFFICIENT BUFFER SPACE ERROR EXIT

 CIO      SUBR               ENTRY/EXIT
          STDL   EMA         SAVE POINTER TO STARTING ESM ADDRESS
          STML   CIOA        STORE LOCATION OF STARTING ESM ADDRESS
          ADC    -DESMAD
          MJN    CIO1        IF INPUT FROM ESM OPERATION
          LDK    FC.WRT      ESM WRITE FUNCTION
          STDL   T6          FUNCTION CODE
          LDML   ICRM.WC     READ CM WC LONG WORDS INSTRUCTION
          UJN    CIO2

 CIO1     BSS    0
          RJM    VLN         VERIFY INDIRECT LIST BYTE LENGTHS
          NJN    CIOX        IF INSUFFICIENT BUFFER SPACE ERROR
          LDK    FC.RED      ESM READ FUNCTION
          STDL   T6          FUNCTION CODE
          LDML   ICWM.WC     WRITE CM WC LONG WORDS INSTRUCTION

*         INITIALIZE WORD COUNTERS, FUNCTION ESM, AND SEND ESM ADDRESS.
 CIO2     BSS    0
          STML   RWIA        ** MODIFY INSTRUCTION IN *RWI* **
          STML   OVLWIPE     SET OVERLAY WIPED OUT FLAG

 CIO3     BSS    0           ATTEMPT ERROR RECOVERY FROM THIS POINT
          LDDL   RC          REQUESTED CM WORD COUNT
          STDL   XC          NUMBER OF CM WORDS TO TRANSFER
          LDML   INDLST+1    FIRST PAGE NUMBER OF BYTES
          SHN    -3          /8 FOR NUMBER OF CM WORDS
          STDL   PC          NUMBER OF CM WORDS LEFT TO READ/WRITE
          LDN    0           CLEAR
          STDL   LI          RESET INDIRECT LIST ENTRY INDEX
          STDL   AC          ACTUAL CM WORD COUNT TRANSFERRED
          LDDL   T6          ESM READ OR WRITE FUNCTION
          RJM    FCN         FUNCTION CHANNEL
          ZJN    CIO4        IF NO FUNCTION TIMEOUT ERROR
          LJM    CIO14       SKIP PORT STATUS, CHECK RECOVERY

 CIO4     ACN    CH40
          LDN    3           THREE BYTES
          STDL   XBC         ESM ADDRESS TRANSFER BYTE COUNT
          LDN    2           (TWO 12 BIT PP WORDS)
          OAM    *,CH00      OUTPUT ESM STARTING ADDRESS (12 BIT)
 CIOA     EQU    *-1         (LOCATION OF ESM ADDRESS)

*         INPUT/OUTPUT LOOP.
 CIO5     BSS    0
          LDC    IOBUFL      BUFFER SIZE IN CM WORDS
          SBDL   XC          NUMBER OF CM WORDS TO I/O
          PJN    CIO6        IF ENOUGH SPACE IN BUFFER
          RADL   XC          REDUCE TO FIT IN BUFFER
 CIO6     LDDL   T6          CHECK IF READ (5001) OR WRITE (5002) FUNCTION
          SHN    17-1        (TEST WRITE 5002)
          PJN    CIO9        IF ESM READ OPERATION (5001)

*         WRITE ESM.
          RJM    RWI         READ CM VIA INDIRECT LIST INTO IOBUF
          LDDL   XC          NUMBER OF CM WORDS TO WRITE TO ESM
          SHN    3           CONVERT TO BYTE COUNT
          STDL   XBC
          SHN    -3          BACK TO CM WORDS COUNT
          RJM    CBC         CONVERT TO 12 BIT CHANNEL COUNT
          OAPM   IOBUF,CH00  OUTPUT PACKED ON CHANNEL
 CIO7     IJM    CIO8,CH00   CHANNEL INACTIVE ERROR
          FJM    CIO7,CH00   WAIT FOR CHANNEL EMPTY
          UJN    CIO11       CHECK END OF TRANSFER

 CIO8     BSS    0           INACTIVE CHANNEL
          STDL   RB          SAVE RESIDUAL BYTE COUNT
          LDK    ER.INA      ** CHANNEL INACTIVE ERROR **
          UJN    CIO13       CHECK DETAILED PORT STATUS

*         READ ESM.
 CIO9     BSS    0
          LDDL   XC          NUMBER OF CM WORDS READ FROM ESM
          SHN    3           CONVERT TO BYTE COUNT
          STDL   XBC
          SHN    -3          BACK TO CM WORDS COUNT
          RJM    CBC         CONVERT TO 12 BIT CHANNEL COUNT
          IAPM   IOBUF,CH00  INPUT PACKED FROM CHANNEL
 CIO10    IJM    CIO8,CH00   IF CHANNEL INACTIVE ERROR
          EJM    CIO10,CH00  IF CHANNEL EMPTY, WAIT FOR FULL
          RJM    RWI         WRITE IOBUF TO CM VIA INDIRECT LIST

*         CHECK FOR END OF TRANSFER.
 CIO11    BSS    0
          LDDL   XC          NUMBER OF WORDS TRANSFERED
          RADL   AC          UPDATE ACTUAL TRANSFER COUNT
          LDDL   T7          END OF LIST FLAG
          NJN    CIO12       IF END OF LIST ENCOUNTERED
          LDDL   RC          REQUESTED COUNT
          SBDL   AC          TRANSFERED COUNT
          ZJN    CIO12       IF ALL CM WORDS TRANSFERRED
          STDL   XC          NUMBER OF CM WORDS LEFT TO TRANSFER
          UJK    CIO5        CONTINUE TRANSFER

 CIO12    DCN    CH40        DISCONNECT CHANNEL
          LDN    0           NO CHANNEL FAILURE
          CFM    CIO13,CH00  IF CHANNEL ERROR FLAG NOT SET (ELSE CLEAR FLAG)
          LDK    ER.CPE      ** CHANNEL PARITY ERROR CODE **

*         CHECK FOR ESM ERRORS.

 CIO13    STDL   T9          SAVE POSSIBLE INACTIVE CHANNEL ERROR
          RJM    PST         CHECK PORT STATUS
          LPK    ERCODM      MASK FOR ERROR CODES
          NJN    CIO14       IF DETAILED ERROR CODE
          LDDL   T9          (POSSIBLE INACTIVE CHANNEL ERROR)
 CIO14    BSS    0
          RECOVER  CIO3      CHECK ERROR RECOVERY STATUS
          RETURN
ENG       EJECT
** ENG  - ENGINEERING ERROR LOG STATISTICS COLLECTIONS.
*         This subroutine builds the error log PP response. Information
*         contained in this response will be used to make an entry into
*         the Engineering Error Log.
*
** CALLING SEQUENCE -
*         MUST USE RECOVER MACRO.
*
** INPUT -
*         (A)    = Contents of 'A' register at recovery point (error code).
*
** OUTPUT - (see ERROR LOG PP RESPONSE).
*         (A) = SAME AS ON ENTRY.
*
** USES -  NONE.
*
** CALLS - EOF, EON, FCN, LOV, RSP, WED.
*
** ERROR LOG PP RESPONSE -
*
*  REC    = Recovered status (1=RECOVERED, 0=UNRECOVERED).
*  CNT    = Retry attempt count.
*  ERR    = Initial failure condition code.
*  LCF    = Last function issued on channel prior to failure.
*  LPF    = ESM LSP function code -
*            upper 4 bits = C170 ICI function code,
*            lower 12 bits = ESM LSP function code.
*  LPS    = ESM LSP status at time of initial failure.
*
*  ADR    = ESM first word address.
*  RBC    = Residual channel word count after block I/O instruction.
*  XBC    = Transfer byte count.
*
*  TRC    = CY170 DMA ADAPTER 'T' register contents -
*            1. CM byte count
*            2. most significant CM address bits
*            3. least significant CM address bits
*  ADF    = CY170 DMA ADAPTER function code.
*  CRC    = CY170 DMA ADAPTER Control Register contents.
*  AES    = CY170 DMA ADAPTER error status.
*  OPS    = CY170 DMA ADAPTER Operational Status Register contents.
*

 ENG7     BSS    0           RETRY OPERATION EXIT
          LDDL   ELEC
          SHN    18-1        RESTORE ENTRY CONDITION


 ENG      SUBR               ENTRY/EXIT
 ENGA     EQU    *-1         (RETURN ADDRESS INCREMENTED BY 2 IF NO RETRY)

          SHN    1           PRESERVER SIGN BIT ON ENTRY
          STDL   ELEC        (ENGINEERING LOG ENTRY CONDITION)
          LJM    0,ENGPA     (JUMP TO TAG *ENGOFF* OR *ENGON*)

*
*         PROCESSING ADDRESS WHEN COLLECTION MODE TURNED ON.
*
 ENGON    BSS    0           PROCESS ENTRY WHEN CURRENTLY IN COLLECTION MODE
          LDDL   ELEC        ENTRY CONDITION
          SHN    18-1        RESTORE TO ORIGINAL FORM
          MJN    ENG5        IF ABORT BIT FROM FLAG OPERATION (NO ERROR)
          ZJN    ENG5        IF NO ERROR CODE

 ENG1     BSS    0           (UNUSED TAG)
 ENG2     BSS    0           (UNUSED TAG)

*         THE ERROR PERSISTS, CLEAR THE HARDWARE.
 ENG3     BSS    0
 ENGB     UJN    ENG4        (CHANGE TO PASS IF CY930)

          RJM    CIC         MASTER CLEAR CY930 ICI CHANNEL

 ENG4     BSS    0
 ENGC     EQU    *           (ICI.12B FUNCTION ADDED TO LSP FUNCTION IF CY930)
          LDC    FC.PMC      ESM LOW SPEED PORT MASTER CLEAR FUNCTION
          RJM    FCN         (IGNORE TIMEOUT IF ANY)

          AOML   ENGRSP+/ENGRSP/P.CNT  INCREMENT RETRY COUNT
          LPN    77B         (RETRY COUNT FIELD)
          LMN    ERETRY      (MAXIMUN ERROR RETRY COUNT)
          NJK    ENG7        IF NOT MAXIMUM NUMBER OF ATTEMPTS TO RECOVER
          LDK    ERF.URE     UNRECOVERED ERROR FLAG
          RAML   ENGRSP+/ENGRSP/P.URE  SET UNRECOVERED ERROR FLAG

 ENG5     BSS    0           RECOVERED FROM ERROR
          RJM    RSP         WRITE ENGINEERING RESPONSE
          RJM    EOF         TURN OFF COLLECTION MODE
          LDDL   ELEC        ENTRY CONDITION
          SHN    18-1
*         ESM DOUBLE BIT ERROR IS ONLY DETECTED ON A READ ESM OPERATION.
          LMC    ER.DBE
          NJN    ENG6        IF NOT ESM DOUBLE BIT ERROR
          RJM    LOV         LOAD OVERLAY IF NOT PRESENT
          RJM    WED         WRITE SOURCE ESM DIVISION (CLEAR ERROR ATTEMPT)

 ENG6     BSS    0           NO ERROR OR NO RETRY EXIT
          LDN    2             (INSTRUCTION MODIFICATION MUST BE 5 LOCS APART)
          RAML   ENGA        INCREMENT RETURN ADDRESS FOR NO RETRY/NO ERROR
          UJK    ENG7        RETURN

*
*         PROCESSING ADDRESS WHEN COLLECTION MODE TURNED OFF.
*
 ENGOFF   BSS    0
          LDDL   ELEC
          SHN    18-1        RESTORE ENTRY CONDITION
          MJN    ENG6        IF ABORT BIT FROM FLAG OPERATION (NO ERROR)
          ZJN    ENG6        IF NO ERROR CODE
          RJM    EON         TURN ON COLLECTION MODE
          UJK    ENG3        CLEAR HARDWARE

EOF       SPACE  4,20
** EOF - TURN OFF ENGINEERING ERROR LOG STATISTIC COLLECTION.
*         THIS SUBROUTINE INITIALIZES THE ENGINEERING RESPONSE BUFFER.
*
** INPUT - NONE.
*
** OUTPUT -
*     ENGBUF -
*       ENGRSP RECORD -
*         UNR = FALSE (ZERO), UNRECOVERED RECOVERED ERROR IF TRUE.
*         CNT = ZERO, RECOVERY RETRY ATTEMPT COUNT.
*     ENGPA = PP ADDRESS OF *ENGOFF* (OFF PROCESSING).
*     RSPA = ADDRESS OF RSPBUF RESPONSE LENGTH.
*     RSPC = ADDRESS OF RSPBUF RESPONSE BUFFER.
*
** USES - NONE.
*
** CALLS - NONE.

 EOF      SUBR               ENTRY/EXIT
          LDC    ENGOFF      INITIAL *ENG* PROCESS ADDRESS
          STDL   ENGPA       SET *ENG* PROCESSING ADDRESS TO OFF
          LDN    0           CLEAR
          STML   ENGRSP+/ENGRSP/P.URE  UNRECOVERED FLAG AND RETRY COUNT

*         MODIFY SUBROUTINE *RSP* TO WRITE RESPONSE FROM RSPBUF.
          LDC    RSPBUF
          STML   RSPC        RESTORE ADDRESS OF RESPONSE BUFFER
          ADK    /RS/P.RESPL
          STML   RSPA        RESTORE ADDRESS OF RESPONSE LENGTH

          RETURN
EON       SPACE  4,20
** EON - TURN ON ENGINEERING ERROR LOG STATISTIC COLLECTION.
*
** PURPOSE -
*         THE FIRST OCCURRENCE OF AN I/O PROCESS FAILURE HAS OCCURED.
*         THIS SUBROUTINE COLLECTS STATISTICS PERTENANT TO THE FAILURE
*         AND BUILDS THE PP STATISTICS RESPONSE.
*
** INPUT -
*     RSPBUF = INITIALIZED FILE SERVER SPECIAL RESPONSE (SEE FSSR RECORD).
*     ENGBUF -
*       FSSR RECORD -
*         SPECIAL RESPONSE FLAGS -
*           SR  = TRUE, SPECIAL RESPONSE.
*           SW  = FALSE, SINGLE WORD.
*           ERR = FALSE, ERROR RESPONSE.
*           INQ = FALSE, INQUIRY RESPONSE.
*           TPR = FALSE, TERMINATION PSEUDO RESPONSE.
*           ENG = TRUE, ENGINEERING ERROR LOG RESPONSE.
*         LEN   = B.FSSR+B.ENGRSP, SPECIAL RESPONSE LENGTH IN 8 BIT BYTES.
*         SRPAR = ZERO, SPECIAL RESPONSE PARAMETER.
*         LUN   = LOGICAL UNIT NUMBER.
*       ENGRSP RECORD -
*         UNR    = FALSE (ZERO), UNRECOVERED RECOVERED ERROR IF TRUE.
*         ADP    = FALSE (ZERO), C170 DAM ADAPTER DRIVER MODE IF TRUE.
*         CNT    = ZERO, RECOVERY RETRY ATTEMPT COUNT.
*         ERR    = ZERO, INITIAL ERROR CONDITION CODE.
*       ELEC   = SHIFTED (A) ON ENTRY TO *ENG* (INITIAL ERROR CONDITION CODE).
*       FNCA   = LAST FUNCTION ISSUED ON CHANNEL.
*       T6     = INTENDED ESM LSP FUNCTION (i.e. READ/WRITE/FLAG OPERATIONS).
*       PS     = ESM LOW SPEED PORT STATUS.
*       EMA    = FIRST PP ADDRESS CONTAINING STARTING ESM MEMORY ADDRESS.
*       RB     = RESIDUAL BYTE COUNT (LEFT OVER IF CHANNEL INACTIVE ON I/O.)
*       XBC    = TRANSFER EIGHT BIT BYTE COUNT ATTEMPTED.
*       RTRA   = C170 DMA ADAPTER T REGISTER BYTE COUNT.
*       RTRA+1 = C170 DMA ADAPTER T REGISTER UPPER BITS OF CM ADDRESS.
*       RTRA+2 = C170 DMA ADAPTER T REGISTER LOWER BITS OF CM ADDRESS.
*       T7     = C170 DMA ADAPTER INTENDED FUNCTION CODE.
*       RCRA   = C170 DMA ADAPTER CONTROL REGISTER CONTENTS.
*       RESB   = C170 DMA ADAPTER ERROR STATUS REGISTER CONTENTS.
*       ROSA   = C170 DMA ADAPTER OPERATIONAL STATUS REGISTER CONTENTS.
*
** OUTPUT -
*     ENGPA  = PP ADDRESS OF *ENGON* (ON PROCESSING)
*     ENGBUF -
*       FSSR RECORD -
*         QI    = RSPBUF+/FSSR/P.QI
*         QEI   = RSPBUF+/FSSR/P.QEI
*       ENGRSP RECORD -
*         ERR    = RESTORED (A) ON ENTRY TO *ENG*, INITIAL ERROR CONDITION CODE.
*         LCF    = (FCNA), LAST FUNCTION ISSUED ON CHANNEL.
*         LPF    = (T6), INTENDED ESM LOW SPEED PORT FUNCTION.
*         LPS    = (PS), ESM LOW SPEED PORT STATUS.
*         ADR    = ESM MEMORY FIRST WORD ADDRESS (24 BITS OCTAL).
*         RBC    = (RB), RESIDUAL BYTE COUNT.
*         XBC    = (XC), TRANSFER BYTE COUNT.
*         TRC    = (RTRA - RTRA+2), CY170 DMA ADAPTER T REGISTER CONTENTS.
*         ADF    = (T7), C170 DMA ADAPTER INTENDED FUNCTION CODE.
*         CRC    = (RCRA), C170 DMA ADAPTER CONTROL REGISTER.
*         AES    = (RESB), C170 DMA ADAPTER ERROR STATUS REGISTER.
*         OPS    = (ROSA), C170 DMA ADAPTER OPERATIONAL STATUS REGISTER.
*     RSPA = ADDRESS OF ENGINEERING RESPONSE LENGTH (EONA).
*     RSPC = ADDRESS OF ENGINEERING RESPONSE BUFFER.
*
** USES - NONE.
*
** CALLS - EOD.


 EON      SUBR               ENTRY/EXIT
          LDC    ENGON       PP ADDRESS OF *ENG* PROCESS (ON PROCESSING)
          STDL   ENGPA       SET *ENG* PROCESSING ADDRESS TO ON

*         MODIFY SUBROUTINE *RSP* TO WRITE RESPONSE FROM ENGBUF.
          LDC    ENGBUF
          STML   RSPC        SET ADDRESS OF ENGINEERING RESPONSE BUFFER
          LDC    EONB
          STML   RSPA        SET ADDRESS OF ENGINEERING RESPONSE LENGTH

          LDML   RSPBUF+/FSSR/P.QI  COPY QUEUE AND QUEUE ENTRY INDEX
          STML   ENGQQE      (TO FSSR RECORD PORTION OF RESPONSE)
          LDDL   ELEC
          SHN    18-1        RESTORE (A) ON ENTRY TO *ENG*
          STML   ENGRSP+/ENGRSP/P.ERR
          LDML   FCNA        LAST FUNCTION ISSUED ON CHANNEL
          STML   ENGRSP+/ENGRSP/P.LCF
          LDDL   T6          INTENDED ESM LSP FUNCTION
          STML   ENGRSP+/ENGRSP/P.LPF
          LDDL   PS          ESM LOW SPEED PORT STATUS
          STML   ENGRSP+/ENGRSP/P.LPS

*         FORM 21 BIT ESM ADDRESS
          LDIL   EMA         UPPER 9 BITS OF ESM ADDRESS
          SHN    18-4        RIGHT JUSTIFY UPPER 5 BITS OF 9 BIT PORTION
          STML   ENGRSP+/ENGRSP/P.ADR  STARTING ESM ADDRESS UPPER 5 BITS
          SHN    -2          POSITION LOWER 5 BITS OF UPPER 9 TO START AT BIT 12
          SCN    77B         CLEAR LEFTOVERS
          STDL   ET1         SAVE PARTIALLY FORMED 16 BIT WORD
          AODL   EMA         INCREMENT INDIRECT ADDRESS OF ESM ADDRES
          LDIL   EMA         LOWER 12 BITS OF ESM ADDRESS
          ADDL   ET1         FORM LOWER 16 BITS OF ESM ADDRESS
          STML   ENGRSP+/ENGRSP/P.ADR+1

          LDDL   RB          RESIDUAL BYTE COUNT AFTER INACTIVE CHANNEL ON I/O
          STML   ENGRSP+/ENGRSP/P.RBC
          LDDL   XBC         TRANSFER 8 BIT BYTE COUNT
          STML   ENGRSP+/ENGRSP/P.XBC

 EONA     EQU    *           (THIS RETURN JUMP IS NOP IF NOT USING DMA ADAPTER)
          RJM    EOD         COLLECT ERROR LOG INFORMATION FOR DMA ADAPTER

          RETURN


 EONB     CON    B.FSSR+B.ENGRSP  LENGTH OF ERROR LOG RESPONSE
ERR       EJECT
** ERR -  ERROR PROCESSING.
*
** PURPOSE -
*         IF (A) NON ZERO THEN -
*           STORE ERROR CONDITION CODE INTO SINGLE WORD RESPONSE
*           AND QUEUE ENTRY ERROR CODE FIELDS.
*         IF (A) ZERO THEN RETURN TO CALLER.
*
** INPUT -
*         (A)    = ERROR CONDITION CODE.
*
** OUTPUT -
*         (A)    = ERROR CONDITION CODE.
*         SINGLE WORD RESPONSE -
*            SRFL    = SRF.ERR SET (SRF.SR, SRF.SW, AND SRL.SW ALREADY SET)
*            SRPAR   = ERROR CONDITION CODE.
*         QUEUE ENTRY -
*            ERRALT = TRUE.
*            ERRCON = ERROR CONDITION CODE.

 ERR      SUBR               ENTRY/EXIT
          STDL   ER          SAVE MOST RECENT ERROR CODE
          ZJN    ERR1        IF NO ERROR
          LDML   ERR         (CALLER'S RETURN ADDRESS)
          STML   ERRA
          LDML   RSPBUF+/FSSR/P.SRFL
          LPK    SRF.ERR
          NJN    ERR1        IF ERROR PRIOR TO CURRENT

          LDK    SRF.ERR
          RAML   RSPBUF+/FSSR/P.SRFL  SET ERROR RESPONSE FLAG
          LDDL   ER
          STML   RSPBUF+/FSSR/P.SRPAR  STORE ERROR IN SINGLE WORD RESPONSE

*         (IF NO QUEUE ENTRY (EI = 0) NOTHING HURT.
          STML   DQENTR+/DQE/P.ERRCON  STORE ERROR INTO QUEUE ENTRY
          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LMK    ERRALT      SET QUEUE ENTRY ERROR ALERT FLAG
          STDL   QF

 ERR1     LDDL   ER          RESTORE ERROR CODE TO (A)
          RETURN

 ERRA     CON    0           CALLER'S RETURN ADDRESS FOR LAST ERROR
FCN       EJECT
** FCN -  FUNCTION.
*
** PURPOSE -
*         ISSUE FUNCTION TO ESM.
*
** ENTRY - (A) = FUNCTION CODE.
*
** OUTPUT -
*         (A)    = ZERO, IF FUNCTION ISSUED WITHOUT ERROR.
*                = ERROR CODE, IF ERROR.
*                  ER.FTO - FUNCTION TIMEOUT ERROR.
*
** USES - NONE.


 FCN3     LDN    0           NO ERROR RETURN

 FCN      SUBR               ENTRY/EXIT
          STML   FCNA        SAVE FUNCTION CODE  *INSTRUCTION MODIFICATION*
          LDN    0
          STDL   RB          CLEAR RESIDUAL BYTE COUNT
          LDN    0           (MUST HAVE 5 INSTRUCTIONS BETWEEN MODIFIED INST)
          LDN    0           (MUST HAVE 5 INSTRUCTIONS BETWEEN MODIFIED INST)
          LDN    0           (MUST HAVE 5 INSTRUCTIONS BETWEEN MODIFIED INST)
 FCN1     FNC    **,CH40     ISSUE FUNCTION  *MODIFIED INSTRUCTION*
 FCNA     EQU    *-1         (FUNCTION CODE)
          LDC    77B         TIMEOUT DELAY FOR ALL FUNCTIONS
 FCN2     IJM    FCN3,CH00   IF FUNCTION ACCEPTED
          SBN    1           (COUNT DOWN TIMEOUT DELAY)
          PJN    FCN2        IF NOT TIMEOUT

          DCN    CH40        DEACTIVATE CHANNEL
          LDK    ER.FTO      ** FUNCTION TIMEOUT ERROR CODE **
          RETURN
FOP       EJECT
** FOP -  FLAG OPERATION.
*
** PURPOSE -
*         PERFORM SPECIFIED ESM 4 BIT FLAG REGISTER OPERATION.
*
**        FORMATION OF 24 BIT FLAG REFERENCE WORD
*         FOR FOUR BIT FLAG REGISTERS.
*
*         (F = FUNCTION, W = FLAG WORD, X = ADDRESS)
*
*                             1 1 1 1 1 1
*                             5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
* ESM FLAG REGISTER          ---------------------------------
* BASE ADDRESS                0 0 X X X X X X X X X X X X X X
*    - PLUS -                --------------------------------.
* ESM FLAG REGISTER          --------------------------------.
* RELATIVE ADDRESS            0 0 X X X X X X X X X X X X X X.
*    - PLUS -                ----.---------------------------.
* ESM FUNCTION       ------------.                           .--------
* AND FLAG WORD       1 F F 1 F 0.                           .W W W W
*                    .-----------.                           .-------.
*    - TO -          .           .                           .       .
*                    .1 1        .           /1 1            .       .
*                    .1 0 9 8 7 6.5 4 3 2 1 0/1 0 9 8 7 6 5 4.3 2 1 0.
* LS 12 BITS OF      ------------------------/------------------------
* TWO PP MEMORY       1 F F 1 F 0 X X X X X X/X X X X X X X X W W W W
* WORDS (2 CHAN WDS) ------------------------/------------------------
* ARE THE 24 BIT ESM                         /
* FLAG REFERENCE WORD
*
** INPUT -
*         (A)  = FLAG REGISTER ADDRESS.
*         (T3) = 4 BIT FLAG WORD.
*         (T4) = 4 BIT FLAG REGISTER FUNCTION.
*
** OUTPUT -
*         (A)  = ZERO, IF OPERATION ACCEPTED.
*              = NEGATIVE, IF FLAG OPERATION REJECTED.
*              = ERROR CODE, IF HARDWARE ERROR OCCURRED.
*
** USES - T6.
*
** CALL - FCN, PST.

 FOP      SUBR               ENTRY/EXIT
          STDL   T6          SAVE STARTING ESM ADDRESS (MAXIMUM 14 BIT ADDRESS)
          SHN    4           LEFT JUSTIFY IN 12 BITS LOWER 8 BITS ADRS
          LMDL   T3          MERGE 4 BIT FLAG WORD AND 8 BITS OF ADRS
          LPC    7777B
          STML   FOPB+1      SAVE LOWER 12 BITS OF 24 BIT OPERATION
          LDDL   T6          (STARTING ESM FLAG ADDRESS)
          SHN    -8          RIGHT JUSTIFY UPPER 6 BITS OF ADRS (END OFF SHIFT)
          LPN    77B
          LMDL   T4          MERGE 6 BIT FLAG FUNC WITH UPPER 6 OF ADRS
          STML   FOPB        SAVE UPPER 12 BITS OF 24 BIT OPERATION
          LDN    3           THREE BYTES
          STDL   XBC         ESM ADDRESS TRANSFER BYTE COUNT

*         FORM ESM ADDRESS FOR ERROR LOG RESPONSE.
          LDDL   T6          STARTING ESM ADDRESS
          LPC    7777B
          STML   FOPC+1      SAVE LOWER 12 BITS OF STARTING ESM ADDRESS
          LDDL   T6          STARTING ESM ADDRESS
          SHN    -12         RIGHT JUSTIFY REMAINING BITS
          STML   FOPC        SAVE UPPER BITS OF STARTING ESM ADDRESS
          LDC    FOPC
          STDL   EMA         SAVE POINTER TO STARTING ESM ADDRESS

 FOP1     BSS    0           ATTEMPT RECOVERY FROM THIS POINT
 FOPA     LDC    FC.FLG      FLAG FUNCTION CODE (PLUS ICI.12B IF CY930)
          STDL   T6          SAVE OPERATION FUNCTION CODE
          RJM    FCN         ISSUE FUNCTION
          NJN    FOP4        IF CHANNEL TIMEOUT ERROR
          ACN    CH40        ACTIVATE CHANNEL
          LDN    2           NUMBER OF 12 BIT WORDS
          OAM    FOPB,CH00
 FOP2     IJM    FOP5,CH00   IF CHANNEL INACTIVE ERROR
          FJM    FOP2,CH00   WAIT FOR CHANNEL EMPTY
          DCN    CH40        DEACTIVATE CHANNEL
 FOP3     BSS    0
          LDK    ER.CPE      ** CHANNEL PARITY ERROR CODE **
          SFM    FOP4,CH00   IF CHANNEL ERROR FLAG SET
          RJM    PST         READ LOW SPEED PORT STATUS
 FOP4     BSS    0
          RECOVER  FOP1      CHECK RECOVERY STATUS
          RETURN

 FOP5     BSS    0
          STDL   RB          SAVE RESIDUAL BYTE COUNT
          LDK    ER.INA      ** INACTIVE CHANNEL ERROR **
          UJN    FOP4        CHECK RECOVERY STATUS

 FOPB     BSSZ   2           24 BIT FLAG FUNCTION, ADDRESS, FLAG WORD
 FOPC     BSSZ   2           12 BITS (UPPER AND LOWER) STARTING ESM ADDRESS
IRS       EJECT
** IRS - INITIALIZE RESPONSE.
*
** PURPOSE -
*         THIS SUBROUTINE INITIALIZES THE PP BUFFER WHICH CONTAINS
*         INFORMATION USED TO CONSTRUCT THE SINGLE WORD RESPONSE
*         ENTRY WHICH WILL BE WRITTEN TO THE PP RESPONSE BUFFER ENTRY
*         AT THE IN POINTER.
*
** INPUT -
*         LU     = LOGICAL UNIT NUMBER.
*
** OUTPUT -
*         ER     = ZERO.
*         EI     = ZERO.
*         RSPBUF = SINGLE WORD RESPONSE -
*            /FSSR/P.SRFL    = SRF.SR, SRF.SW, AND SRL.SW.
*            /FSSR/P.SRPAR   = ZERO.
*            /RS/P.RESPL     = B.FSSR.
*            /RS/P.INT       = ZERO.


 IRS      SUBR               ENTRY/EXIT
          LDK    SRF.SR+SRF.SW+B.FSSR
          STML   RSPBUF+/FSSR/P.SRFL  SINGLE WORD RESPONSE FLAGS AND LENGTH
          LDN    0           CLEAR
          STDL   ER          MOST RECENT ERROR CODE
          STML   RSPBUF+/FSSR/P.SRPAR RESPONSE ERROR CONDITION CODE
          STML   RSPBUF+/FSSR/P.QI    RESPONSE QUEUE AND QUEUE ENTRY
          STDL   EI          CURRENT QUEUE ENTRY INDEX
          LDDL   LU
          STML   RSPBUF+/FSSR/P.LUN   RESPONSE LOGICAL UNIT NUMBER

*         THESE VALUES SET TO ALLOW SHARING SUBROUTINE *RSP*
*         FOR BOTH SINGLE AND MULTI WORD RESPONSES.
          LDK    B.FSSR              SINGLE WORD RESPONSE LENGTH (8 BYTES)
          STML   RSPBUF+/RS/P.RESPL  (TO SHARE *RSP* WITH PP REQ RESP)
          LDN    0                   (CLEAR INTERRUPT FLAG AND PORT)
          STML   RSPBUF+/RS/P.INT    (TO SHARE *RSP* WITH PP REQ RESP)
          RETURN
LOV       EJECT
** LOV  - LOAD OVERLAY.
*         READS PP REQUEST PROCESSING CODE FROM PP COMMUNICATION BUFFER
*         IF NOT ALREADY IN PP MEMORY.
*
** INPUT -
*         CM.CB   = REFORMATTED RMA OF PP COMMUNICATION BUFFER.
*         OVLWIPE = ZERO, IF OVERLAY ALREADY IN PP MEMORY.
*                 = NONZERO, IF OVERLAY NOT IN PP MEMORY.
*
** OUTPUT -
*         OVLWIPE = ZERO, IF OVERLAY READ INTO PP MEMORY.
*
** USES - WC.

 CM.CB    BSSZ   3           REFORMATTED CMA OF PP COMMUNICATION BUFFER

 LOV      SUBR               ENTRY/EXIT
          LDC    **          OVERLAY WIPED OUT FLAG
 OVLWIPE  EQU    *-1         (OVERLAY WIPED OUT IF NONZERO)
          ZJN    LOV1        IF OVERLAY ALREADY PRESENT
          LDK    OVLSZ       LENGTH OF OVERLAY IN CM WORDS
          STDL   WC          SAVE CPU WORD COUNT FOR CM READ
          LOADC  CM.CB       (LOAD REFORMATTED CM ADDRESS)
          CRML   OVLSA,WC    READ OVERLAY INTO PP
          LDN    0
          STML   OVLWIPE     INDICATE OVERLAY LOADED
 LOV1     RETURN
MST       EJECT
** MST -  MACHINE STATUS CHECK.
*
** PURPOSE -
*         CHECK MACHINE STATUS AS CONTAINED IN MACHINE STATUS FLAG REGISTER.
*
** INPUT -
*         ID     = MACHINE ID NUMBER.
*
** OUTPUT -
*         (A)    = IE.E13, DESTINATION MACHINE DOWN.
*                = ZERO, DESTINATION MACHINE UP.
*
** USES - T4.
*
** CALLS - MSR.

 MST1     LDK    IE.E13      ** DESTINATION MACHINE DOWN ERROR **

 MST      SUBR               ENTRY/EXIT
          LDK    FF.EQU      4 BIT FLAG REGISTER EQUALITY STATUS FUNCTION
          STDL   T4
          LDDL   ID          MACHINE ID NUMBER
          RJM    MSR         DO STATUS FUNCTION FOR MACHINE STATUS
          MJN    MST1        IF ABORT MACHINE'S ID NUMBER NOT IN STATUS FLAG
          LDN    0           MACHINE IS UP
          RETURN
MSR       SPACE  2,20
** MSR -  MACHINE STATUS REGISTER FLAG OPERATION.
*
** PURPOSE -
*         PERFORM MACHINE STATUS 4 BIT FLAG REGISTER FUNCTIONS.
*
** INPUT -
*         (A)    = MACHINE ID.
*         (T4)   = ESM 4 BIT FLAG REGISTER FUNCTION CODE.
*
** OUTPUT -
*         (A)    = (A) AS OUTPUT OF *FOP* SUBROUTINE.
*                      ZERO, IF ACCEPT,
*                      MINUS, IF ABORT,
*                      NONZERO, IF CHANNEL ERROR.
*
** USES - T1, T3.

 MSR      SUBR               ENTRY/EXIT
          STDL   T3          (USE MACHINE ID AS MASK)
          LDML   MSFLGB      BASE MACHINE STATUS FLAG REGISTER ADDRESS
          ADDL   T3          MACHINE ID NUMBER
          SBN    1           FORM MACHINE STATUS FLAG REGISTER ADDRESS
          RJM    FOP         PERFORM FLAG REGISTER OPERATION
          RETURN
PST       EJECT
** PST -  PORT STATUS.
*
** PURPOSE -
*         READ LOW SPEED PORT STATUS AND CHECK FOR ERROR.
*
*   LOW SPEED PORT STATUS BIT ASSIGNMENTS (BITS COUNTED RIGHT TO LEFT)
*
*      BIT      DESCRIPTION
*     -----    -------------
*       0        ABORT FOR A FLAG OPERATION IF BIT 1 IS CLEAR.
*                OVERFLOW ADDRESS IF BIT 1 ALSO SET.
*       1        ACCEPT FOR FLAG OPERATION OR MEMORY TRANSFER OPERATION IF
*                BIT 0 IS CLEAR.
*                OVERFLOW ADDRESS IF BIT 0 IS SET.
*       2        DOUBLR BIT ERROR.
*       3        LOW SPEED PORT IS BUSY WITH WRITE OPERATION.
*       4        CHANNEL PARITY ERROR.
*     5-8        (UNUSED)
*       9        UPPER HALF OF BUFFER MEMORY ENABLED.
*      10        HIGH SPEED DATA TRANSFER ENABLED.
*      11        (UNUSED)
*
** INPUT - NONE.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR DETECTED / ACCEPT.
*                = NEGATIVE, IF ABORT STATUS BIT (FLAG OPERATIONS)
*                = ERROR CODE, IF ERROR.
*                  ER.OVF - ESM ADDRESS OVERFLOW ERROR.
*                  ER.DBE - ESM DOUBLE BIT ERROR.
*                  ER.FTO - CHANNEL/FUNCTION TIMEOUT ERROR.
*                  ER.DMT - LOW SPEED PORT DEADMAN TIMEOUT.
*                  ER.CPE - CHANNEL PARITY ERROR.
*                  ER.MAP - MEMORY ADDRESS PARITY ERROR.
*         PS     = LOW SPEED PORT STATUS.
*
** CALLS - FCN.

 PST9     DCN    CH40        DEACTIVATE CHANNEL
          LDK    ER.DMT      ** LOW SPEED PORT DEADMAN TIMEOUT ERROR CODE **

 PST      SUBR               ENTRY/EXIT
          LDN    0
          STDL   PS          CLEAR SAVED ESM LOW SPEED PORT STATUS
          LDN    77B
          STML   PSTB        INITIALIZE WAIT COUNT
          LDN    2           THREE BYTES
          STDL   XBC         LOW SPEED PORT STATUS BYTE COUNT

 PST1     BSS    0
          SOML   PSTB        DECREMENT WAIT COUNT
          ZJN    PST9        IF WRITE STATUS NOT CLEAR AFTER WAITING
 PSTA     LDC    FC.STA      STATUS FUNCTION CODE (PLUS ICI.12B IF CY930)
          RJM    FCN
          NJN    PSTX        IF FUNCTION TIMEOUT ERROR
          ACN    CH40        ACTIVATE CHANNEL
          LDK    77B         DELAY COUNT
 PST2     FJM    PST3,CH00   JUMP IF CHANNEL FULL
          IJM    PST7,CH00   JUMP IF CHANNEL INACTIVE
          SBN    1
          NJN    PST2        IF WAITING
          UJN    PST9        TIME OUT ERROR

 PST3     IAN    CH40        INPUT IF ACTIVE AND FULL
          STDL   PS          SAVE STATUS
          DCN    CH40        DEACTIVATE CHANNEL
          LPK    PS.WRT      WRITE STATUS BIT
          NJN    PST1        IF WRITE STATUS SET

          LDDL   PS          LOW SPEED PORT STATUS
          LPK    PS.ABT+PS.AOV
          LMK    PS.ABT+PS.AOV
          ZJN    PST5        IF ADDRESS OVERFLOW ERROR
          LDDL   PS
          LPK    PS.DBE+PS.CPE+PS.MAP
          NJN    PST4        IF PARITY OR DOUBLE BIT ERROR

*         NO ERROR STATUS RETURN ABORT/ACCEPT BIT IN SIGN POSITION.
          LDDL   PS          ABORT/ACCEPT BIT
          LPK    PS.ABT      (THIS IS ACTUALLY A MASK BUT SERVES DOCUMENTATION)
          SHN    17          POSITION ABORT BIT 0 TO SIGN
 PSTX     RETURN

 PST4     LPK    PS.DBE
          NJN    PST6        IF DOUBLE BIT ERROR
          LPK    PS.MAP
          NJN    PST8        IF MEMORY ADDRESS PARITY ERROR
          LDK    ER.CPE      ** CHANNEL PARITY ERROR CODE **
          UJN    PSTX

 PST5     LDK    ER.OVF      ** ESM ADDRESS OVERFLOW ERROR CODE **
          UJK    PSTX

 PST6     LDK    ER.DBE      ** ESM DOUBLE BIT ERROR CODE **
          UJK    PSTX

 PST7     LDK    ER.INA      ** INACTIVE CHANNEL ERROR **
          UJK    PSTX

 PST8     LDK    ER.MAP      ** MEMORY ADDRESS PARITY ERROR **
          UJK    PSTX

 PSTB     CON    0           WAIT FOR 'WRITE STATUS TO CLEAR' COUNT
RED       EJECT
** RED -  READ PAGE DATA FROM ESM.
*
** PURPOSE -
*         IF PAGE DATA IS READ WITHOUT ERROR THE DRIVER QUEUE ENTRY
*         FLAGS (PP COPY) ARE UPDATED.
*
** INPUT -
*         QF     = CURRENT COPY OF QUEUE ENTRY FLAGS.
*         SESMAD = SOURCE ESM ADDRESSES.
*
** OUTPUT -
*         (A)    = ZERO, IF PAGE DATA READ WITHOUT ERROR.
*                = NON ZERO, IF ERROR.
*         QF     = UPDATE QUEUE ENTRY FLAGS -
*                  DATRCV (PAGE DATA RECEIVED) = SET,
*                  SNDPMT (PROMPT COMMAND)     = CLEARED.
*         RC     = NUMBER OF CM WORDS FROM ESM HEADER.
*
** CALLS - CIO/DIO, RIL.

 RED      SUBR               ENTRY/EXIT
          LDK    /DQE/P.IND  QUEUE ENTRY OFFSET TO DESCRIPTOR
          RJM    RIL         SETUP LENGTH/ADDRESS LIST
          NJN    RED1        IF INDIRECT LIST NOT VALID
          LDML   HMSG+/HMSG/P.WCD  (IF PROMPT, THIS WAS FILLED FROM /DQE/P.HWCD)
          STDL   RC          SAVE REQUESTED PAGE DATA CM WORD COUNT
          LDC    SESMAD+/EMA/P.DAT
          PAGEIO             CIO/DIO INPUT FROM ESM AND WRITE TO CM
          NJN    RED1        IF READ ERROR
          LDDL   QF          CURRENT QUEUE ENTRY FLAGS
          LPK    -SNDPMT     CLEAR PROMPT COMMAND IN CASE SET
          LMK    DATRCV      SET DATRCV EVENT FLAG
          STDL   QF
          LDN    0           NO ERROR
 RED1     RETURN
REH       EJECT
** REH -  READ ESM HEADER.
*
** PURPOSE -
*         READ THE ESM HEADER FROM ESM MEMORY.
*
** INPUT -
*         SESMAD = SOURCE ESM ADDRESSES.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = NONZERO, IF HARDWARE ERROR.
*         DQHEAD = HEADER FROM ESM, INCLUDING /HMSG/ RECORD.
*
** USES - NONE.
*
** CALL - ENG, RWH.

 REH      SUBR               ENTRY/EXIT
          LDC    SESMAD+/EMA/P.HDR
          STDL   EMA         SAVE POINTER TO STARTING ESM ADDRESS

 REH1     BSS    0           ATTEMPT ERROR RECOVERY FROM THIS POINT
 REHA     LDC    FC.RED      ESM READ FUNCTION CODE (PLUS ICI.SSM IF CY930)
          RJM    RWH         READ ESM HEADER
          RECOVER  REH1      CHECK ERROR RECOVERY
          RETURN
RDQ       EJECT
** RDQ -  READ DRIVER QUEUE HEADER AND ENTRY.
*
** PURPOSE -
*         THIS SUBROUTINE VALIDATES THE QUEUE INDEX AND QUEUE ENTRY INDEX,
*         READS THE DRIVER QUEUE HEADER AND THE QUEUE ENTRY FROM CM, AND
*         AND SETS THE ESM HEADER DESTINATION AND SOURCE QUEUE AND QUEUE
*         ENTRY INDEXES INCASE A MASSAGE IS TO BE SENT FROM THIS MACHINE.
*
** INPUT -
*         (A)    = QUEUE INDEX/QUEUE ENTRY INDEX.
*
** OUTPUT -
*         (A)    = ZERO, IF QUEUE AND QUEUE ENTRY INDEX VALID.
*                = IE.E16, IF ZERO QUEUE RMA.
*                = IE.E09, IF INVALID QUEUE INDEX.
*                = IE.E10, IF INVALID QUEUE ENTRY INDEX.
*         DQENTR = DRIVER QUEUE ENTRY RECORD.
*         DQHEAD = DRIVER QUEUE HEADER RECORD -
*                  /DQH/P.DQEI = SOURCE QUEUE ENTRY INDEX.
*                  /DQH/P.SQEI = SOURCE QUEUE ENTRY INDEX.
*         EI     = ZERO, IF INVALID QUEUE OR QUEUE ENTRY INDEX.
*                = QUEUE ENTRY INDEX, IF VALID QUEUE AND QUEUE ENTRY INDEX.
*         QI     = QUEUE INDEX.
*         QF     = CURRENT COPY OF DRIVER QUEUE ENTRY FLAG WORD.
*         (RSPBUF) - INTERRUPT FLAG AND PORT.
*                  - QUEUE INDEX AND QUEUE ENTRY INDEX.
*
** CALLS - ERR.
*
** USES - T1, T2.

 RDQ1     LDK    IE.E16      ** ZERO QUEUE ADDRESS ERROR CODE **
          UJN    RDQ4        RECORD ERROR

 RDQ2     LDK    IE.E09      ** INVALID QUEUE INDEX ERROR CODE **
          UJN    RDQ4        RECORD ERROR

 RDQ3     LDK    IE.E10      ** INVALID QUEUE ENTRY INDEX ERROR CODE **
 RDQ4     RJM    ERR         RECORD ERROR

 RDQ      SUBR               ENTRY/EXIT
          STDL   T1          SAVE QI/QEI
          LPK    377B        GET QEI
          STDL   T2          SAVE QEI
          LDDL   T1
          SHN    /DQH/L.DQI-/DQH/L.DQEI  RIGHT JUSTIFY QI
          LPK    377B
          STDL   QI          SAVE QUEUE INDEX
          ZJK    RDQ2        IF QUEUE INDEX ZERO, ERROR
          SHN    2           QI*4 = PP WORD INDEX INTO DQDIR
          STDL   T1          SAVE DQDIR INDEX (4 PP WORDS/ENTRY)
          LDC    *           NUMBER OF QUEUES
 RDQA     EQU    *-1         (NUMBER OF QUEUES SET AT INITIALIZATION TIME)
          SBDL   QI
          MJK    RDQ2        IF QUEUE INDEX .GT. NUMBER OF QUEUES, ERROR
          LDML   DQDIR-4,T1  RMA UPPER OF QUEUE
          ADML   DQDIR-4+1,T1  RMA LOWER OF QUEUE
          ZJK    RDQ1        IF REFERENCE TO NON EXISTANT QUEUE

          LDK    C.DQH       DRIVER QUEUE HEADER LENGTH IN CM WORDS
          STDL   WC
          LOADR  DQDIR-4,T1  CM ADDRESS OF DRIVER QUEUE
          STDL   CM+2        SAVE (A) OF CM ADDRESS
 ICRM.WC  EQU    *           (INSTRUCTION READ FROM CM WC LONG WORDS)
          CRML   DQHEAD,WC   READ DRIVER QUEUE HEADER

          LDML   DQHEAD+/DQH/P.NQE  NUMBER OF QUEUE ENTRIES
          SBDL   T2          (QEI)
          MJK    RDQ3        IF INVALID QUEUE ENTRY INDEX
          LDK    C.DQE       DRIVER QUEUE ENTRY LENGTH IN CM WORDS
          STDL   WC
          LDDL   T2          (QEI)
          ZJK    RDQ3        IF QUEUE ENTRY INDEX ZERO, ERROR

          STDL   EI          STORE QUEUE ENTRY INDEX
          SHN    2           *4 = FOUR CM WORDS PER ENTRY
          ADDL   CM+2        PLUS FWA OF DRIVER QUEUE
          LMK    400000B     SET RELO BIT
          CRML   DQENTR,WC   READ DRIVER QUEUE ENTRY

*
*         SET DESTINATION QUEUE ENTRY INDEXES
*         INTO HEADER FOR OUTPUT TO ESM HEADER AREA.
*
          LDML   DQHEAD+/DQH/P.DQI  DESTINATION QUEUE INDEX
          LPK    -377B       SAVE DESTINATION QUEUE INDEX
          ADDL   EI          PLUS SOURCE QUEUE ENTRY INDEX
          STML   DQHEAD+/DQH/P.DQEI  SET DESTINATION QI/QEI FOR ESM HDR

*
*         SET SOURCE QUEUE ENTRY INDEXES
*         INTO HEADER FOR OUTPUT TO ESM HEADER AREA,
*         AND QI/QEI, INTERRUPT FLAG/PORT FOR SINGLE WORD RESPONSE.
*
          LDDL   QI          SOURCE QUEUE INDEX (ON THIS MACHINE)
          SHN    /DQH/L.SQEI (LEFT JUSTIFY QUEUE INDEX)
          ADDL   EI          ADD QUEUE ENTRY INDEX
          STML   DQHEAD+/DQH/P.SQI   SET SOURCE QI/QEI FOR ESM HEADER
          STML   RSPBUF+/FSSR/P.QI   SET SOURCE QI/QEI FOR ONE WORD RESPONSE
          LDML   DQHEAD+/DQH/P.INT   INTERRUPT FLAG AND PORT
          STML   RSPBUF+/RS/P.INT    (TO SHARE *RSP* WITH PP REQ RESP)
          LDML   DQENTR+/DQE/P.ACTIVE  DRIVER QUEUE ENTRY FLAG WORD
          STDL   QF          CURRENT COPY OF QUEUE ENTRY FLAGS
          LDN    0           NO ERROR
          RETURN
RIL       EJECT
** RIL -  READ INDIRECT LIST.
*
** PURPOSE -
*         READ INDIRECT ADDRESS LIST INTO *INDLST*.
*
** INPUT -
*         (A)    = DQENTR OFFSET OF ADDRESS DESCRIPTOR.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = ERROR CODE, IF INVALID ADDRESS OF LIST LENGTH.
*         AI     = PP WORD OFFSET INTO DQENTR FOR  THE
*                  ADDRESS DESCRIPTOR TO BE USED.
*         INDLST = INDIRECT LIST (LENGTH/RMA),
*                  WITH LENGTH IN BYTES,
*                  UNFORMATTED RMA'S.
*         LL     = INDIRECT LIST LENGTH IN PP WORDS.
*
** CALLS - VIL.

 RIL4     LDK    IE.E03      ** INVALID ADDRESS SPECIFICATION **

 RIL      SUBR               ENTRY/EXIT
          STDL   AI          SAVE ADDRESS DESCRIPTOR INDEX
          LDML   DQENTR+2,AI
          ADML   DQENTR+3,AI
          ZJN    RIL4        IF ZERO RMA ERROR
          LDML   DQENTR+3,AI   LOWER HALF OF RMA
          LPN    7
          NJN    RIL4        IF NOT ON CM WORD BOUNDRY
          LDML   DQENTR,AI   INDIRECT ADDRESS FLAG
          SHN    2+/DQE/L.IND
          MJN    RIL1        IF INDIRECT LIST

          LDN    0
          STML   INDLST      CLEAR FLAG/COMMAND FIELD
          LDML   DQENTR+1,AI
          STML   INDLST+1    LENGTH IN BYTES
          LDML   DQENTR+2,AI
          STML   INDLST+2    RMA PART 1
          LDML   DQENTR+3,AI
          STML   INDLST+3    RMA PART 2
          LDN    4
          STDL   LL          LIST LENGTH IN PP WORDS
          UJN    RIL2        VERIFY ADDRESS

 RIL1     LDML   DQENTR+1,AI   GET LENGTH OF INDIRECT LIST IN BYTES
          LPN    7           MASK OFF LOWER THREE BITS
          NJN    RIL3        ERROR IF LENGTH NOT A MULTIPLE OF 8

          LDML   DQENTR+1,AI   GET LENGTH OF INDIRECT LIST IN BYTES
          SHN    -1          /2 FOR PP WORD COUNT
          STDL   LL          SAVE INDIRECT LIST LENGTH IN PP WORDS
          SHN    -2          /4 FOR LIST LENGTH IN CM WORDS
          STDL   WC
          ZJN    RIL3        ERROR IF LENGTH OF INDIRECT LIST IS ZERO
          ADC    -MAXIND-1   SUBTRACT 1 MORE THAN MAX ALLOWED INDIRECTS
          PJN    RIL3        ERROR IF TOO MANY INDIRECTS

*         READ INDIRECT LIST INTO INDLST.

          LOADF  DQENTR+2,AI   SET UP CM ADDRESS IN A AND R
          CRML   INDLST,WC   READ INDIRECT LIST
 RIL2     RJM    VIL         VERIFY INDIRECT LIST
 RILX     RETURN

 RIL3     LDK    IE.E02     ** INVALID LENGTH IN COMMAND **
          UJN    RILX
RSP       EJECT
** RSP -  RESPONSE.
*
** PURPOSE -
*         WRITE RESPONSE TO CM RESPONSE BUFFER.
*
** INPUT -
*         RSPBUF - FOR SINGLE WORD RESPONSE -
*                  /FSSR/      = FILE SERVER SPECIAL RESPONSE RECORD.
*                  /RS/P.RESPL = 8, RESPONSE LENGTH.
*                  /RS/P.INT   = INTERRUPT SELECTOR FROM QUEUE HEADER.
*                  /RS/P.PORT  = PORT NUMBER FROM QUEUE HEADER.
*
*                - FOR PP REQUEST RESPONSE -
*                  /RS/ = PP REQUEST RESPONSE RECORD.
*
** USES - CM+2, INP THRU INP-3, WC.

 CM.INT   BSSZ   3           REFORMATTED CM ADDRESS OF INTERRUPT WORD.
 CM.RS    BSSZ   3           REFORMATTED CM ADDRESS OF PP RESPONSE BUFFER


 RSP      SUBR               ENTRY/EXIT

*         READ IN AND OUT POINTERS OF RESPONSE BUFFER.
 RSP1     LOADC  CM.PIT      LOAD ADDRESS OF PP INTERFACE TABLE
          ADK    /PIT/C.OUT  OFFSET OF OUT POINTER
          CRDL   OUTP-3      READ OUT POINTER
          SBN    /PIT/C.OUT-/PIT/C.IN  OFFSET OF 'IN' POINTER
          CRDL   INP-3       READ 'IN' POINTER

*         CHECK IF THERE IS ROOM FOR THE RESPONSE IN THE RESPONSE BUFFER.
          LDDL   INP
          SBDL   OUTP
          MJN    RSP2        IF IN .LT. OUT
          LDDL   RSLIM       RESPONSE BUFFER LIMIT OFFSET IN BYTES
          RADL   OUTP        IN .GE. OUT, SET OUT = OUT + LIMIT
 RSP2     LDML   RSPBUF+/RS/P.RESPL  GET RESPONSE LENGTH
 RSPA     EQU    *-1         (ADDRESS OF RESPONSE LENGTH)
          STML   RSPB        SAVE RESPONSE LENGTH
          STDL   INP-3       (RESPONSE LENGTH)
          SBDL   RSLIM       RESPONSE BUFFER LIMIT
          ZJN    RSP3        IF RESPONSE FITS INTO BUFFER
          PJN    *           RESPONSE IS TOO LARGE FOR BUFFER, HANG ***
 RSP3     BSS    0
          LDDL   INP         (CURRENT IN POINTER)
          RADL   INP-3       FORM NEW IN POINTER (RESPONSE LENGTH + CURRENT IN)
          SBDL   OUTP        CHECK IF ENOUGH ROOM IN BUFFER FOR RESPONSE
          PJK    RSP1        IN NOT ENOUGH ROOM IN BUFFER, LOOP

          LDDL   INP-3       NEW IN POINTER IN BYTES
          SBDL   RSLIM       RESPONSE BUFFER LIMIT
          MJN    RSP4        IF NEW IN POINTER NOT BEYOND LIMIT
          STDL   INP-3       SET NEW IN POINTER = NUMBER OF BYTES BEYOND LIMIT

*         WRITE RESPONSE TO CM.
 RSP4     BSS    0
          LDDL   INP         ('IN' POINTER IN BYTES)
          SHN    -3
          STDL   INP-1       CURRENT 'IN' POINTER IN WORDS
          LDC    **          RESPONSE LENGTH IN BYTES
 RSPB     EQU    *-1         (STORED HERE AT RSP2)
          SHN    -3          /3 CONVERT TO CM WORDS
          STDL   WC          NUMBER OF CM  WORDS FOR 1ST BLOCK
          STDL   INP-2       TOTAL RESPONSE LENGTH IN WORDS
          LDDL   INP-3       NEW IN POINTER
          SBDL   INP         MINUS OLD IN POINTER
          PJN    RSP5        IF ONLY 1 BLOCK WRITE REQUIRED (OLD IN < NEW IN)
          LDDL   RSLIM       FIRST BLOCK WRITE = (LIMIT - IN) WORDS
          SBDL   INP
          SHN    -3
          STDL   WC          NUMBER OF WORDS TO TRANSFER ON 1ST BLOCK
          SHN    2           CONVERT TO NUMBER OF PP WORDS
          ADML   RSPC        ADD FWA OF PP RESPONSE BUFFER
          STML   RSPD        RESPONSE ADDRESS FOR 2ND BLOCK WRITE

 RSP5     LOADC  CM.RS       LOAD CM ADDRESS OF RESPONSE BUFFER
          STDL   CM+2        SAVE CM ADDRESS
          ADDL   INP-1       ADD 'IN' OFFSET (IN CM WORDS)
          CWML   RSPBUF,WC   WRITE RESPONSE TO CM
 RSPC     EQU    *-1         (PP ADDRESS OF RESPONSE BUFFER)
          LDDL   INP-2       TOTAL RESPONSE LENGTH IN WORDS
          SBDL   WC          WORDS TRANSFERRED ON 1ST BLOCK
          ZJN    RSP6        IF ONLY 1 BLOCK WRITE REQUIRED
          STDL   WC          NUMBER OF WORDS TO TRANSFER ON 2ND BLOCK
          LDDL   CM+2        LOAD ADDRESS OF RESPONSE BUFFER
          LMK    400000B
 ICWM.WC  EQU    *           (INSTRUCTION WRITE TO CM WC LONG WORDS)
          CWML   **,WC       WRITE 2ND PART OF RESPONSE TO CM
 RSPD     EQU    *-1         (PP ADDRESS OF UNWRITTEN RESPONSE)

 RSP6     LDML   RSPBUF+/RS/P.INT  CHECK IF INTERRUPT WAS SELECTED
          LPK    /RS/K.INT
          NJN    RSP7        IF INTERRUPT SELECTED
          LDC    2400B       PSN INSTRUCTION
          UJN    RSP8

*         SET UP INTERRUPT INSTRUCTION.
 RSP7     LDML   RSPBUF+/RS/P.PORT  PROCESSOR PORT NUMBER TO INTERRUPT
          SHN    -16+/RS/L.PORT+/RS/N.PORT
          LPK    /RS/M.PORT
          ADC    102600B     INPN INSTRUCTION
 RSP8     STML   RSPE

*         UPDATE RESPONSE BUFFER 'IN' POINTER IN CM.
          LDDL   INP-3       NEW IN POINTER
          STDL   INP
          LDN    0           RESTORE CM IN POINTER FIELDS
          STDL   INP-1
          STDL   INP-2
          STDL   INP-3
          LOADC  CM.PIT      LOAD ADDRESS OF PP INTERFACE TABLE
          ADK    /PIT/C.IN   OFFSET OF 'IN' POINTER
          CWDL   INP-3       WRITE NEW 'IN' POINTER TO CM

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD.
          CWDL   PP-3        SET LAST BYTE NON-ZERO.
          LDN    0           (6 LSB's = 0 for INPN/S0 ENG.SPEC.19269753 PAGE 43)
 RSPE     INPN   1           (INTERRUPT OR PSN INSTRUCTION)
          CRDL   INP-3       "THROW-AWAY" CM READ FOR S1
          RETURN             EXIT
RSV       EJECT
** RSV -  RESERVE DESTINATION ESM SPACE.
*
** PURPOSE -
*         RESERVES DESTINATION ESM SPACE FOR THE SPECIFIED MACHINE
*         MACHINE ID NUMBER.
** INPUT -
*         DQHEAD = DRIVER QUEUE HEADER.
*
** OUTPUT -
*         (A)    = ZERO, IF DESTINATION ESM SPACE RESERVED.
*                = NEGATIVE, IF DESTINATION SPACE NOT AVAILABLE.
*                = ERROR CODE, IF ERROR OCCURRED.
*         DESMAD = DESTINATION ESM ADDRESSES.
*         DI     = DESTINATION ESM DIVISION NUMBER.
*         ID     = DESTINATION ID NUMBER.
*
** USES - T3, T4.
*
** CALLS - ERR, FOP, MST, SEA.

 RSV4     RJM    ERR         RECORD ERROR ON FLAG OPERATION

 RSVX     EQU    *
 RSV      SUBR               ENTRY/EXIT
          LDML   DQHEAD+/DQH/P.DIDN
          STDL   ID          SAVE DESTINATION ID NUMBER
          RJM    MST         CHECK DESTINATION MACHINE STATUS
          NJN    RSV4        IF DESTINATION MACHINE DOWN
          LDN    0
          STDL   DI          INITIALIZE DIVISION NUMBER
          LDK    FR.RSV      RESERVE ESM SPACE
          STDL   T3          SAVE 4 BIT FLAG WORD
          LDK    FF.ZSL      ZERO/SELECT FLAG FUNCTION
          STDL   T4          SAVE FLAG FUNCTION

 RSV1     AODL   DI          INCREMENT DIVISION NUMBER
          ADML   TBFLGA,ID   BASE ESM FLAG REGISTER ADDRESS FOR ID
          SBN    1           ADJUST DIVISION FLAG ADDRESS
          RJM    FOP         FLAG OPERATION
          ZJN    RSV2        IF RESERVATION OBTAINED
          PJN    RSV4        IF ERROR ON FLAG OPERATION
          LDDL   DI          CURRENT DIVISION
          SBDL   NDIVS       NUMBER OF ESM DIVISIONS PER MACHINE
          NJN    RSV1        IF MORE DIVISIONS
          LDN    PS.ABT      (THIS IS ACTUALLY A MASK BUT SERVES DOCUMENTATION)
          SHN    17          RESTORE ABORT FLAG IN SIGN BIT POSITION
          UJN    RSV3        RETURN

 RSV2     LDN    DADESM      ESMADR OFFSET OF DESTINATION ESM ADDRESSES
          RJM    SEA         SETUP ESM ADDRESSES
          LDN    0           NO ERROR
 RSV3     RETURN
RWH       EJECT
** RWH -  READ / WRITE ESM HEADER.
*
** PURPOSE -
*         CODE COMMON TO READ/WRITE ESM HEADER SUBROUTINES *REH* AND *WEH*.
*
** INPUT -
*         DESMAD = DESTINATION ESM ADDRESSES (IF WRITING ESM HEADER).
*         SESMAD = SOURCE ESM ADDRESSES (IF READING ESM HEADER).
*         DQHEAD = DRIVER QUEUE HEADER WITH DESTINATION
*                  QUEUE ENTRY INDEX, FOLLOWED BY /HMSG/ RECORD.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = NONZERO, IF HARDWARE ERROR.
*
** USES - T6, T9.
*
** CALL - FCN, PST.

 RWH12    BSS    0           FUNCTION TIMEOUT ERROR EXIT

 RWH      SUBR               ENTRY/EXIT
          STDL   T6          SAVE OPERATION FUNCTION CODE
          SHN    17-1        (TEST WRITE 5002)
          MJN    RWH1        IF WRITING HEADER
          LDC    SESMAD+/EMA/P.HDR  ESM ADDRESS TO READ FROM
          UJN    RWH2        (STORE ESM ADDRESS IN OUTPUT INSTRUCTION)

 RWH1     LDC    DESMAD+/EMA/P.HDR  ESM ADDRESS TO WRITE TO
 RWH2     STML   RWHA        (MODIFY ADDRESS OUTPUT INSTRUCTION)
          LDDL   T6          (FUNCTION CODE)
          RJM    FCN         ISSUE FUNCTION
          NJN    RWH12       IF FUNCTION TIMEOUT ERROR
          LDN    3           THREE BYTES
          STDL   XBC         ESM ADDRESS TRANSFER BYTE COUNT
          ACN    CH40        ACTIVATE CHANNEL
          LDN    2
          OAM    **,CH00     (INSTRUCTION MODIFIED)
 RWHA     EQU    *-1         (ESM ADDRESS SET ON ENTRY)
 RWH3     IJM    RWH11,CH00   IF CHANNEL INACTIVE ERROR
          NJN    RWH3        WAIT FOR ZERO COUNT

 RWHB     EQU    *           (DCN CH40 - MODIFIED AT INITIALIZATION IF CY930)
          UJN    RWH4        SKIP 'DCN/ACN' WHEN NOT CY930/ICI
*         THIS IS NECESSARY FOR ICI CHANNEL TO SWITCH TO PACKING MODE.
*         DCN    CH40        TO ICI CHANNEL ONLY, ESM DOES NOT SEE THIS
          ACN    CH40        TO ICI CHANNEL ONLY, ESM DOES NOT SEE THIS

 RWH4     LDK    B.HMSG      ESM HEADER BYTE COUNT
          STDL   XBC         ESM HEADER TRANSFER BYTE COUNT
          LDDL   T6          FUNCTION CODE
          SHN    17-1        (TEST WRITE 5002)
          MJN    RWH6        IF WRITING HEADER

*         READ ESM HEADER.
 RWHC     EQU    *
          LDN    EHSIZC      ESM HEADER SIZE IN 12 BIT CHANNEL WORDS
 RWHD     EQU    *           (*IAM* MODIFIED AT INITIALIZATION IF CY930)
          IAPM   DQHEAD+/DQH/P.SQTYP,CH00
 RWH5     IJM    RWH11,CH00   IF CHANNEL INACTIVE ERROR
          EJM    RWH5,CH00   WAIT FOR CHANNEL FULL
          UJN    RWH8        DEACTIVATE CHANNEL

*         WRITE ESM HEADER.
 RWH6     BSS    0
 RWHE     EQU    *           (EHSIZ - MODIFIED AT INITIALIZATION IF CY930)
          LDN    EHSIZC      ESM HEADER SIZE IN 12 BIT CHANNEL WORDS
 RWHF     EQU    *           (*OAM* MODIFIED AT INITIALIZATION IF CY930)
          OAPM   DQHEAD+/DQH/P.SQTYP,CH00
 RWH7     IJM    RWH11,CH00   IF CHANNEL INACTIVE ERROR
          FJM    RWH7,CH00   WAIT FOR ESM TO TAKE LAST WORD OFF CHANNEL

 RWH8     BSS    0
          DCN    CH40        DEACTIVATE CHANNEL
          LDN    0           CLEAR INACTIVE CHANNEL ERROR
          CFM    RWH9,CH00   IF CHANNEL ERROR FLAG NOT SET
          LDK    ER.IPE      ** IOU CHANNEL PARITY ERROR **
 RWH9     STDL   T9
          RJM    PST         GET PORT STATUS AND CHECK IF ERROR
          LPK    ERCODM      MASK FOR ERROR CODES
          NJN    RWH10       IF DETAIL ERROR CODE
          LDDL   T9          (POSSIBLE INACTIVE CHANNEL ERROR)
 RWH10    RETURN

 RWH11    STDL   RB          SAVE RESIDUAL BYTE COUNT
          LDK    ER.INA      ** INACTIVE CHANNEL ERROR **
          UJK    RWH9        CHECK DETAIL STATUS

RWI       EJECT
** RWI -  READ/WRITE INDIRECT.
*
** PURPOSE -
*         THIS SUBROUTINE FILLS/EMPTIES THE PP I/O BUFFER FROM/TO
*         THE CM BUFFER POINTED TO BY THE INDIRECT ADDRESS LIST.
*
** INPUT -
*         INDLST = LIST OF LENGTH AND RMA -
*                  LENGTHS IN BYTES,
*                  UNFORMATTED RMA'S.
*         LI     = INDIRECT LIST INDEX IN PP WORDS.
*         LL     = INDIRECT LIST LENGTH IN PP WORDS.
*         PC     = CURRENT PAGE REMAINING LENGTH IN CM WORDS.
*         XC     = NUMBER OF CM WORDS TO TRANSFER.
*         RWIA   = CM READ/WRITE INSTRUCTION MODIFIED.
*
** OUTPUT -
*         T7     = NON ZERO, IF END OF INDIRECT LIST.
*         LI     = UPDATED TO CURRENT INDIRECT LIST INDEX IN PP WORDS.
*         PC     = PAGE REMAINING LENGTH IN CM WORDS.
*         XC     = NUMBER OF CM WORDS ACTUALLY TRANSFERRED.
*
** USES - T1, T7, T8, T9.

 RWI      SUBR               ENTRY/EXIT
          LDDL   XC          REQUESTED CM WORD COUNT TO MOVE
          STDL   WC
          LDN    0           CLEAR
          STDL   T1          ACTUAL CM WORD COUNT TRANSFERRED
          STDL   T7          RESET END OF LIST FLAG
          LDC    IOBUF
          STML   RWIB        RESET IOBUF INITIAL ADDRESS

 RWI1     LDDL   PC          CHECK REMAINING PAGE LENGTH
          SBDL   WC
          PJN    RWI2        IF ENOUGH ROOM IN THIS PAGE
          RADL   WC          NUMBER OF CM WORDS LEFT FOR THIS PAGE

 RWI2     LDML   INDLST+1,LI GET PAGE LENGTH IN BYTES
          SHN    -3          /8 FOR CM WORDS
          SBDL   PC          MINUS CURRENT PAGE LENGTH IN CM WORDS
          SHN    3           *8 FOR BYTE OFFSET
          ADML   INDLST+3,LI ADD INITIAL LOWER HALF OF UNFORMATTED RMA
          STDL   T9          SAVE LOWER HALF OF RMA FOR READ/WRITE
          SHN    -16         POSITION CARRY
          ADML   INDLST+2,LI ADD INITIAL UPPER HALF OF RMA
          STDL   T8          SAVE UPPER HALF OF RMA FOR READ/WRITE
          LOADF  T8          FORMAT AND LOAD CM RMA ADDRESS

 RWIA     EQU    *           (*CIO* STORES CM READ/WRITE INSTRUCTION)
          CRML   *,WC        ** INSTRUCTION MODIFIED (READ/WRITE) **
 RWIB     EQU    *-1         (*RWI* STORES ADDRESS WITHIN PP IOBUF)

          LDDL   WC          NUMBER OF CM WORDS MOVED TO/FROM CM
          SHN    2           *4 IN PP WORDS
          RAML   RWIB        UPDATE IOBUF ADDRESS
          LDDL   PC          CURRENT PAGE REMAINING LENGTH BEFORE MOVE
          SBDL   WC          MINUS NUMBER OF CM WORDS MOVED
          STDL   PC          UPDATE PAGE REMAINING LENGTH IN CM WORDS
          NJN    RWI3        IF ANY CM WORDS LEFT IN THIS PAGE
          LDN    4           INCREMENT TO NEXT LIST ENTRY
          RADL   LI          INDIRECT LIST INDEX
          SBDL   LL          CHECK AGAINST LIST LENGTH
          PJN    RWI4        IF END OF LIST
          LDML   INDLST+1,LI NEXT PAGE LENGTH IN BYTES
          SHN    -3          /8 FOR CM WORDS
          STDL   PC          SET NEXT LIST PAGE LENGTH IN CM WORDS

 RWI3     LDDL   WC          NUMBER OF CM WORDS MOVED
          RADL   T1          UPDATE TRANSFER COUNT
          LDDL   XC          NUMBER OF CM WORDS REQUESTED TO MOVE
          SBDL   T1
          ZJN    RWI5        IF ALL CM WORDS TRANSFERRED
          STDL   WC          NUMBER OF CM WORDS LEFT TO READ/WRITE
          UJK    RWI1        CONTINUE TRANSFER

 RWI4     LDDL   T1          UPDATE TRANSFER COUNT
          ADDL   WC
          STDL   XC
          STDL   T7          SET END OF LIST FLAG
 RWI5     RETURN
SEA       EJECT
** SEA -  SETUP ESM ADDRESSES.
*
** PURPOSE -
*         SETUP ESM MEMORY FIRST WORD ADDRESSES OF FLAG REGISTER, HEADER,
*         BUFFER, AND DATA AREAS.
*         THE 17 BIT BASE ESM MEMORY ADDRESS IS INCREMENTED TO THE ADDRESS
*         OF THE BLOCK OF MEMORY ASSIGNED TO THE SPECIFIED MACHINE ID, AND
*         THEN TO THE ADDRESS OF THE SPECIFIED SUBDIVISION WITH THAT BLOCK.
*         THIS 17 BIT ADDRESS IS MULTIPLIED BY 100(8) WHEN THE 24 BIT
*         HEADER, BUFFER, AND DATA AREA BUFFERS ARE FORMED.
*
*   FORMATION OF 24 BIT ESM MEMORY REFERENCE WORD.
*
*         (X = ADDRESS BITS)
*
*                       1 1 1 1 1 1 1
*                       7 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
*                       ----------------------------------
* ESM BASE ADRS/100(8)  X X X X X X X X X X X X X X X X X
*                      .---------------------------------.
*    - PLUS -          .                                 .
*                      . --------------------------------.
* ESM RA/100(8)        .  0 0 0 0 X X X X X X X X X X X X.
*                      . --------------------------------.
*    - TO -            .                                 .
*                     1.1                    /1 1        .
*                     1.0 9 8 7 6 5 4 3 2 1 0/1 0 9 8 7 6.5 4 3 2 1 0
* LS 12 BITS OF      ------------------------/------------------------
* TWO PP MEMORY       0 X X X X X X X X X X X/X X X X X X 0 0 0 0 0 0
* WORDS (2 CHAN WDS) ------------------------/------------------------
* ARE THE 24 BIT ESM                         /
* MEMORY REFERENCE WORD
*
** INPUT -
*         (A)  = ESMADR OFFSET TO STORE ESM ADDRESSES (SESMAD/DESMAD).
*         ID   = ID NUMBER.
*         DI   = DIVISION NUMBER.
*
** OUTPUT - AT SPECIFIED ADDRESS PLUS:
*           /EMA/P.FRG = 16 BIT ESM ADDRESS OF FLAG REGISTER
*           /EMA/P.HDR = 24 BIT ESM MEMORY ADDRESS OF HEADER AREA
*           /EMA/P.BUF = 24 BIT ESM MEMORY ADDRESS OF BUFFER AREA
*           /EMA/P.DAT = 24 BIT ESM MEMORY ADDRESS OF DATA AREA
*
** USES - T2, T3.

 SEA      SUBR               ENTRY/EXIT
          STDL   T3          SAVE ESM ADDRESS STORAGE OFFSET
          LDML   TBFLGA,ID   BASE FLAG REGISTER ADDRESS PER ID NUMBER
          ADDL   DI          DIVISION NUMBER
          SBN    1           ADJUST DIVISION FLAG ADDRESS
          STML   ESMADR+/EMA/P.FRG,T3  ESM FLAG REGISTER ADDRESS

*         THIS CODE WILL ACCOMODATE A MAXIMUM BASE ESM MEMORY ADDRESS
*         OF 8,388,544 (DECIMAL).
          LDML   BMEMAD      UPPER BIT OF BASE ESM MEMORY ADDRESS/100(8)
          SHN    16-0        (POSITION UPPER BIT OF BASE ADDRESS)
          ADML   BMEMAD+1    LOWER 16 BITS OF BASE ESM MEMORY ADDRESS/100(8)
          ADML   TBMOFF,ID   BASE ESM MEMORY ADDRESS OFFSET/100(8) FOR ID NUMBER
          ADML   TDIVOF,DI   ADD DIVISION OFFSET/100(8)
          STDL   T2          (TEMP SAVE LOWER 6 BITS OF ADDRESS)
          SHN    12          POSITION UPPER 12 OF REGISTER
          LPC    7777B       (UPPER 12 BITS)
          STML   ESMADR+/EMA/P.HDR,T3  UPPER 12 BITS OF HEADER AREA ADR
          STML   ESMADR+/EMA/P.BUF,T3  UPPER 12 BITS OF BUFFER AREA ADR
          STML   ESMADR+/EMA/P.DAT,T3  UPPER 12 BITS OF DATA AREA ADR
          LDDL   T2          LOWER 6 BITS OF ADDRESS
          LPN    77B
          SHN    6                MULTIPLY BY 100B
          STML   ESMADR+/EMA/P.HDR+1,T3  LOWER 12 BITS OF HEADER AREA
          ADN    EBUFOF           ADD OFFSET TO BUFFER AREA (MAX OFFSET 77B)
          STML   ESMADR+/EMA/P.BUF+1,T3  LOWER 12 BITS OF BUFFER AREA
          ADC    EDATOF-EBUFOF    ADD OFFSET TO DATA AREA
          STDL   T2               (SAVE OVERFLOW OF 12 BITS)
          LPC    7777B            (LOWER 12 BITS)
          STML   ESMADR+/EMA/P.DAT+1,T3  LOWER 12 BITS OF DATA AREA
          LDDL   T2
          SHN    -12              POSITION POSSIBLE CARRY DIGIT (END OFF SHIFT)
          RAML   ESMADR+/EMA/P.DAT,T3    ADD TO UPPER 12 BITS OF DATA AREA
          RETURN
VIL       EJECT
** VIL -  VERIFY INDIRECT LIST.
*
** PURPOSE -
*         VERIFY INDIRECT ADDRESSES IN LIST AT *INDLST*.
*
** INPUT -
*         INDLST = INDIRECT LIST (LENGTH/RMA),
*                  WITH LENGTH IN BYTES.
*         LL     = INDIRECT LIST LENGTH IN PP WORDS.
*
** OUTPUT -
*         (A)    = ZERO, IF VALID LIST.
*                = ERROR CODE, IF INVALID LIST.
*         LI     = INDIRECT LIST INDEX INITIALIZED TO ZERO.
*         INDLST = VALIDATED UNFORMATTED RMA ADDRESSES.
*                  WITH LENGTH IN BYTES.
*         RC     = TOTAL CM WORD COUNT PROVIDED BY LIST.

 VIL2     LDK    IE.E04      ** INVALID LENGTH IN INDIRECT LIST **
          UJN    VILX        CONTINUE
 VIL3     LDK    IE.E05      ** INVALID ADDRESS IN INDIRECT LIST **
          UJN    VILX        CONTINUE
 VIL4     LDK    IE.E06      ** RESERVED FIELD IN INDIRECT LIST NOT ZERO **
 VILX     BSS    0           COMMAND SEQUENCE ERROR

 VIL      SUBR               ENTRY/EXIT

*         VERIFY LIST.  ALL ADDRESS MUST BE ON WORD BOUNDARIES AND ALL
*         LENGTHS MUST BE MULTIPLES OF 8.

          LDN    0           INITIALIZE
          STDL   LI          INDIRECT LIST INDEX
          STDL   RC          REQUESTED TOTAL CM WORD COUNT

 VIL1     LDML   INDLST+1,LI GET LENGTH FROM ADDRESS/LENGTH PAIR
          ZJN    VIL2        ERROR IF LENGTH IS ZERO
          LPN    7           MASK LOWER THREE BITS OF LENGTH
          NJN    VIL2        IF LENGTH NOT MULTIPLE OF 8 ERROR
          LDML   INDLST+1,LI GET LENGTH FROM ADDRESS/LENGTH PAIR
          SHN    -3          /8 FOR CM WORD COUNT
          RADL   RC          COMPUTE TOTAL LENGTH FOR LIST
          MJN    VIL2        ERROR IF NEG (TOO LARGE)
          LDML   INDLST+3,LI GET LOWER HALF OF ADDRESS FROM LIST
          LPN    7           MASK OFF LOWER 3 BITS OF ADDRESS
          NJN    VIL3        ERROR IF ADDRESS NOT ON WORD BOUNDRY
          LDML   INDLST,LI   GET COMMAND AND FLAG FIELDS FROM INDIRECT
          NJN    VIL4        ERROR IF NOT ZERO
          LDK    4
          RADL   LI          POINT TO NEXT ITEM IN LIST
          SBDL   LL          LIST LENGTH IN PP WORDS
          MJN    VIL1        IF NOT DONE

          LDN    0           NO ERROR
          STDL   LI          RESET INDIRECT LIST INDEX TO ZERO
          RETURN
VLN       EJECT
** VLN -  VERIFY LENGTH.
*
** PURPOSE -
*         VERIFIES THE TOTAL LENGTH PROVIDED BY ADDRESS LIST.
*         SINCE THE TOTAL CM WORD COUNT TO INPUT COMES FROM THE ESM
*         HEADER, THE TOTAL NUMBER OF BYTES MUST BE ACCOMODATED IN THE
*         INDIRECT LIST LENGTH PARAMETERS. THE LAST NEEDED INDIRECT
*         LIST ENTRY'S LENGTH IS CHANGED TO REQUIRED LENGTH FOR LAST
*         ENTRY, AND THE *LL* VALUE IS ADJUSTED SO THAT SUBROUTINE
*         *DIO* DOES NOT INPUT FROM ESM MORE THAN NEEDED.
*         THIS ADJUSTMENT HAS NO IMPACT ON SUBROUTINE *CIO* BECAUSE IT
*         COUNTS DOWN TOTAL CM WORD COUNT TO INPUT, HOWEVER, THE LENGTH
*         VERIFICATION IS A VALID OPERATION FOR *CIO*.
*
** INPUT -
*         INDLST = LIST OF LENGTH AND RMA ENTRIES
*                  (4 WORDS/ENTRY, LENGTH IN BYTES, UNFORMATTED RMA).
*         LL     = INDIRECT LIST LENGTH IN PP WORDS.
*         RC     = REQUESTED NUMBER OF CM WORDS TO INPUT FROM CHANNEL.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = IE.E11 - INSUFFICIENT LENGTH SPECIFICATION.
*         INDLST = LAST INDLST ENTRY LENGTH UPDATED.
*         LL     = NEEDED INDIRECT LIST LENGTH IN PP WORDS.
*
** USES - T1, T5, T6.

 VLNX     BSS    0           ERROR EXIT
 VLN      SUBR               ENTRY/EXIT
          LDDL   RC          REQUESTED CM WORD COUNT
          STDL   T5          CURRENT REQUESTED CM WORD COUNT
          LDN    0
          STDL   T1          INITIALIZE LIST INDEX

 VLN1     LDML   INDLST+1,T1 ENTRY SIZE IN BYTES
          SHN    -3          /8
          STDL   T6          LIST ENTRY SIZE IN CM WORDS
          SBDL   T5          MINUS CURRENT REQUESTED WORD COUNT
          PJN    VLN2        IF .LE. CURRENT ENTRY LENGTH
          LDDL   T5
          SBDL   T6          DECREMENT BY LENGTH OF CURRENT ENTRY
          STDL   T5          WORDS LEFT FOR REMAINNING ENTRIES
          LDN    4
          RADL   T1          INCREMENT TO NEXT LIST ENTRY
          SBDL   LL
          MJN    VLN1        IF NOT END OF LIST ENTRIES

          LDDL   T5          CM WORDS REMAINNING
          ZJN    VLNX        IF ALL BYTES ACCOUNTED FOR
          LDK    IE.E11      ** INSUFFICIENT LENGTH SPECIFICATION ERROR **
          UJN    VLNX        ERROR RETURN

 VLN2     LDDL   T5          REMAINNING WORD COUNT
          SHN    3           *8
          STML   INDLST+1,T1 SET NUMBER OF BYTES FOR LAST ENTRY
          LDN    4
          RADL   T1
          STDL   LL          SET LIST LENGTH TO LAST ENTRY
          LDN    0           NO ERROR
          RETURN
WEH       EJECT
** WEH -  WRITE ESM HEADER.
*
** PURPOSE -
*         WRITE HEADER TO ESM, AND SET DESTINATION ESM
*         FLAG REGISTER TO READY/RESERVED.
*
** INPUT -
*         DESMAD = DESTINATION ESM ADDRESSES.
*         DQHEAD = DRIVER QUEUE HEADER WITH DESTINATION
*                  QUEUE ENTRY INDEX, FOLLOWED BY /HMSG/ RECORD.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = NONZERO, IF HARDWARE ERROR.
*
** USES - T3, T4, T6.
*
** CALL - ERR, FCN, FOP, PST.

 WEH      SUBR               ENTRY/EXIT
          LDC    DESMAD+/EMA/P.HDR
          STDL   EMA         SAVE POINTER TO STARTING ESM ADDRESS

 WEH1     BSS    0           ATTEMPT ERROR RECOVERY FROM THIS POINT
 WEHA     LDC    FC.WRT      ESM WRITE FUNCTION CODE (PLUS ICI.SSM IF CY930)
          RJM    RWH         WRITE ESM HEADER
          RECOVER  WEH1      CHECK ERROR RECOVERY
          NJN    WEH2        IF ERROR ON WRITE TO ESM
*
*         SET DESTINATION ESM FLAG REGISTER READY.
*
          LDK    FF.SET      SELECTIVE SET FLAG FUNCTION
          STDL   T4
          LDK    FR.RSV+FR.RDY  SET FLAG REGISTER RESERVED AND READY
          STDL   T3
          LDML   DESMAD+/EMA/P.FRG  DESTINATION FLAG REGISTER ADDRESS
          RJM    FOP         PERFORM ESM FLAG FUNCTION
 WEH2     BSS    0
          RETURN
          TITLE  GENERAL PURPOSE SUBROUTINES
FORMA     EJECT
** FORMA - FORMAT ADDRESS.
*
** PURPOSE -
*         FORMAT A CM REAL MEMORY ADDRESS.
*
*     THE (ADDRESS), WORD 0 BITS 0-13, AND WORD 1 BITS 3-15,
*     ARE REFORMATTED TO *CM* WORD 0 BITS 0-9, WORD 1 BITS 0-11,
*     AND WORD 2 BITS 0-5.
*     THE REFORMATTED RMA CAN BE USED BY THE LOADC MACRO.
*
** CALLING SEQUENCE - LDC    ADDRESS
*                     RJM    FORMA
*
** INPUT -
*         (A)    = ADDRESS OF A 2-WORD CM BYTE ADDRESS.
*
** OUTPUT -
*         CM - CM+2 = REFORMATTED CM RMA.

 FORMA    SUBR               ENTRY/EXIT
          STDL   TA
          LDIL   TA
          LPN    37B
          SHN    16
          LMML   1,TA
          SHN    9
          STDL   CM+1
          SHN    6
          LPN    77B
          STDL   CM+2
          LDIL   TA
          SHN    -5
          STDL   CM
          LRD    CM
          LDDL   CM+2
          LMK    400000B
          RETURN
          TITLE  ADDRESS TABLES
** ESM ADDRESS TABLES.
*
* TABLE OF ESM MEMORY DIVISION OFFSETS/100B (16 BITS).

 TDIVOF   EQU    *-1         TABLE OF ESM DIVISION OFFSETS/100(8)
          BSSZ   MAXDIV      (INDEXED BY VALUES 1 THROUGH 16)


* TABLE OF BASE ESM MEMORY ADDRESS OFFSETS /100B PER ID NUMBER (16 BITS).

 TBMOFF   EQU    *-1         TABLE OF BASE ESM MEMORY ADDRESS OFFSETS
          BSSZ   MAXIDN      BASE MEMORY ADDRESS OFFSETS FOR ID NUMBER 1 THRU 8

* TABLE OF BASE ESM FLAG REGISTER ADDRESSES PER ID NUMBER (16 BITS),
* OF ESM SUBDIVISION STATUS FLAGS.

 TBFLGA   EQU    *-1         TABLE OF BASE ESM FLAG ADDRESSES
          BSSZ   MAXIDN      BASE FLAG ADDRESSES FOR ID NUMBER 1 THROUGH 8

* BASE ESM 4 BIT FLAG REGISTER ADDRESS OF MACHINE STATUS FLAG (16 BITS).

 MSFLGB   BSS    1           BASE MACHINE STATUS 4 BIT FLAG ADDRESS

* BASE ESM MEMORY ADDRESS/100(8)

 BMEMAD   BSS    2           BASE ESM MEMORY ADDRESS/100(8)  (17 BITS)

* CURRENT SOURCE AND DESTINATION ESM ADDRESSES.

 ESMADR   BSSZ   P.EMA*2
 SESMAD   EQU    ESMADR      SOURCE ESM ADDRESSES
 DESMAD   EQU    SESMAD+P.EMA  DESTINATION ESM ADDRESSES
 SADESM   EQU    SESMAD-ESMADR  OFFSET TO SOURCE ADDRESSES
 DADESM   EQU    DESMAD-ESMADR  OFFSET TO DESTINATION ADDRESSES


** REFORMATTED RMA DRIVER QUEUE DIRECTORY.

 DQDIR    BSSZ   P.QDE*MAXQDE  REFORMATTED DRIVER QUEUE RMA'S
          TITLE  COMMON VARIABLES AND STORAGE

* DRIVER QUEUE HEADER
* ESM HEADER
 EHSIZA   EQU    P.DQH-/DQH/P.SQTYP+P.HMSG  ACTUAL ESM HEADER SIZE IN PP WORDS
 EHSIZB   EQU    EHSIZA*16   ESM HEADER SIZE IN BITS
 EHSIZC   EQU    1+EHSIZB/12 ESM HEADER SIZE IN 12 BIT CHANNEL WORDS + 1
 EHSIZ    EQU    1+EHSIZA    ESM HEADER SIZE IN 16 BIT CHANNEL WORDS + 1

 DQHEAD   BSSZ   P.DQH       DRIVER QUEUE HEADER
 HMSG     BSSZ   P.HMSG      APPENDED HEADER MESSAGE
          BSSZ   1           (PADDING FOR EXTRA CHANNEL WORD)

* DRIVER QUEUE ENTRY
 DQENTR   BSSZ   P.DQE       DRIVER QUEUE ENTRY

* INDIRECT LIST
 INDLST   BSSZ   MAXIND*4    INDIRECT LIST BUFFER (LENGTH/ADDRESS)

* RESPONSE BUFFER
 RSPBUF   BSSZ   P.RS        PP REQUEST RESPONSE BUFFER SHARED FOR ONE WORD RSP

* ENGINEERING ERROR LOG RESPONSE BUFFER
 ENGBUF   EQU    *
*         THIS IS FSSR RECORD FOR ERROR LOG RESPONSE.
          CON    SRF.SR+SRF.ENG+B.FSSR+B.ENGRSP  SPECIAL RESPONSE FLAGS/LENGTH
          CON    0           SPECIAL RESPONSE PARAMETER
 ENGLUN   CON    0           (LOGICAL UNIT SET BY *IQI*)
 ENGQQE   CON    0           (QUEUE INDEX AND QUEUE ENTRY INDEX SET BY *EON*)
*         THIS IS ENGRSP RECORD FOR ERROR LOG RESPONSE.
 ENGRSP   BSSZ   P.ENGRSP

**********************************************************************

* I/O BUFFER BEGINS HERE FOR NON-DMA ENHANCED CY170 ADAPTER I/O.

 IOBUF    EQU    *           ADDRESS OF IO BUFFERS

 PPWRDS   EQU    PPMSZ-IOBUF  NUMBER OF 16 BIT PP WORDS AVAILABLE
          ERRNG  PPWRDS       NO AVAILABLE BUFFER SPACE

*         IOBUF SIZE MUST BE MULITPLE OF 3 64 BIT CM WORDS WHICH
*         EQUALS 12 16 BIT PP WORDS, 16 12 BIT CHANNEL WORDS.
*         THIS INSURES THAT ONLY FULL CM, PP, AND CHANNEL WORDS
*         ARE BEING MANIPULATED. (192 BITS = 3*64 = 12*16 = 16*12)

 PGBIT    EQU    PAGSZ*8      NUMBER OF BITS PER CM PAGE
 RNDPGB   EQU    PGBIT-1+192  PAGE BIT COUNT ROUNDED UP TO 192 MULTIPLE

 OPBSZ    EQU    RNDPGB/192*3 ONE PAGE BUFFER SIZE IN CM WORDS
 AVBSZ    EQU    PPWRDS/12*3  AVAIL SIZE IN CM WORDS
          ERRZR  AVBSZ        NO BUFFER SPACE

          IFMI   OPBSZ-AVBSZ
*         AVAILABLE SIZE .GT. ONE PAGE+ SIZE.
 IOBUFL   EQU    OPBSZ        ONE PAGE+ BUFFER SIZE IN CM WORDS
          ELSE
 IOBUFL   EQU    AVBSZ        BUFFER SIZE IN CM WORDS (MULTI OF 3 CM)
          ENDIF
          EJECT
**        THESE TABLES ARE NOT REQUIRED AT I/O TIME.

 PITBL    BSSZ   P.PIT       PP INTERFACE TABLE
*   NOTE THIS MUST IMMEDIATLY FOLLOW PITBL
 UNITD    BSSZ   P.UD*MLUC   UNIT DESCRIPTOR PART OF PIT FOR MLUC UNITS

 UITBL    BSSZ   P.UIT       UNIT INTERFACE TABLE

 RBDIR    BSSZ   P.RBD       REQUEST BUFFER DIRECTORY

 DQDHD    BSSZ   P.QDH       DRIVER QUEUE DIRECTORY HEADER

 REQBUF   BSSZ   MAXREQ*4    PP REQUEST BUFFER LENGTH

          TITLE  COLLECT CY170 ADAPTER ERROR INFO.
** EOD -  ERROR LOG RESPONSE INFORMATION FOR CY170 DMA ADAPTER.
*         THIS SUBROUTINE IS CALLED ONLY FROM *EON* WHEN THE C170 DMA ADAPTER
*         IS BEING USED. THE CODE HAS BEEN SEPARATED AND PLACED HERE SO THAT PP
*         MEMORY USED AS BUFFER SPACE FOR NON DMA DRIVER MODE.
*
** OUTPUT -
*     ENGBUF -
*       ENGRSP RECORD -
*         ADP    = TRUE (ONE), C170 DMA ADAPTER DRIVER MODE IF TRUE.
*         DIO    = TRUE (ONE), IF ERROR OCCURRED WHILE EXECUTING *DIO*.
*         TL1    = TRUE (ONE), IF FIRST T REGISTER LOAD SUCCESSFUL.
*         TRC    = (RTRA - RTRA+2), C170 DMA ADAPTER T REGISTER CONTENTS.
*         ADF    = (T7), C170 DMA ADAPTER INTENDED FUNCTION CODE.
*         CRC    = (RCRA), C170 DMA ADAPTER CONTROL REGISTER.
*         AES    = (RESB), C170 DMA ADAPTER ERROR STATUS REGISTER.
*         OPS    = (ROSA), C170 DMA ADAPTER OPERATIONAL STATUS REGISTER.
*
** USES - NONE.


 EOD      SUBR               ENTRY/EXIT
          LDK    ERF.ADP     C170 DMA ADAPTER DRIVER MODE FLAG
          RAML   ENGRSP+/ENGRSP/P.ADP
          LDC    0
 EODA     EQU    *-1         (NONZERO,IF EXECUTING CY170 DMA TRANSFER CODE)
          NJN    EOD1        IF EXECUTING CY170 DMA ADAPTER TRANSFER CODE
          STML   ENGRSP+/ENGRSP/P.ADF    ZERO INTENDED ADAPTER OP FUNCTION
          STML   ENGRSP+/ENGRSP/P.CRC    ZERO CONTROL REGISTER
          STML   ENGRSP+/ENGRSP/P.AES    ZERO ERROR STATUS REGISTER
          STML   ENGRSP+/ENGRSP/P.OPS    ZERO OPERATIONAL STATUS REGISTER
          STML   ENGRSP+/ENGRSP/P.TRC    ZERO T REGISTER AT FAILURE BYTE COUNT
          STML   ENGRSP+/ENGRSP/P.TRC+1  ZERO T REGISTER MSB CM ADRS AT FAILURE
          STML   ENGRSP+/ENGRSP/P.TRC+2  ZERO T REGISTER LSB CM ADRS AT FAILURE
          UJN    EOD2        ZERO T REGISTER HOLDERS

 EOD1     BSS    0           ERROR OCCURRED WHILE EXECUTING IN *DIO*
          LDK    ERF.DIO     ERROR OCCURRED WHILE EXECUTING *DIO* SUBROUTINE
          RAML   ENGRSP+/ENGRSP/P.DIO
          LDDL   T7          INTENDED ADAPTER FUNCTION
          STML   ENGRSP+/ENGRSP/P.ADF
          LDML   RCRA        CONTROL REGISTER CONTENTS
          STML   ENGRSP+/ENGRSP/P.CRC
          LDML   RESB        ERROR STATUS REGISTER CONTENTS
          STML   ENGRSP+/ENGRSP/P.AES
          LDML   ROSA        OPERATIONAL STATUS REGISTER CONTENTS
          STML   ENGRSP+/ENGRSP/P.OPS

          LDC    0
 EODB     EQU    *-1         (NONZERO, IF T REGISTER LOADED FIRST TIME)
          NJN    EOD3        IF T REGISTER LOADED FIRST TIME
 EOD2     STML   ENGRSP+/ENGRSP/P.TRC    ZERO T REGISTER BYTE COUNT
          STML   ENGRSP+/ENGRSP/P.TRC+1  ZERO T REGISTER MSB CM ADDRESS
          STML   ENGRSP+/ENGRSP/P.TRC+2  ZERO T REGISTER LSB CM ADDRESS
          STML   ENGRSP+/ENGRSP/P.ITR    ZERO INITIAL T REGISTER BYTE COUNT
          STML   ENGRSP+/ENGRSP/P.ITR+1  ZERO INITIAL T REGISTER MSB CM ADDRESS
          STML   ENGRSP+/ENGRSP/P.ITR+2  ZERO INITIAL T REGISTER LSB CM ADDRESS
          UJN    EOD4

 EOD3     BSS    0           ERROR OCCURRED AFTER FIRST T REGISTER LOAD
          LDK    ERF.TRL     FIRST T REGISTER LOAD SUCCESSFUL
          RAML   ENGRSP+/ENGRSP/P.TRL
          LDML   RTRA        T REGISTER BYTE COUNT
          STML   ENGRSP+/ENGRSP/P.TRC
          LDML   RTRA+1      T REGISTER CM ADDRESS (MOST SIGNIFICANT BITS)
          STML   ENGRSP+/ENGRSP/P.TRC+1
          LDML   RTRA+2      T REGISTER CM ADDRESS (LEAST SIGNIFICANT BITS)
          STML   ENGRSP+/ENGRSP/P.TRC+2
          LDML   INDLST+1    INITIAL T REGISTER BYTE COUNT
          STML   ENGRSP+/ENGRSP/P.ITR    ZERO INITIAL T REGISTER BYTE COUNT
          LDML   INDLST+2    INITIAL T REGISTER MSB CM ADDRESS BITS
          STML   ENGRSP+/ENGRSP/P.ITR+1  ZERO INITIAL T REGISTER MSB CM ADDRESS
          LDML   INDLST+3    INITIAL T REGISTER LSB CM ADDRESS BITS
          STML   ENGRSP+/ENGRSP/P.ITR+2  ZERO INITIAL T REGISTER LSB CM ADDRESS
 EOD4     RETURN
          TITLE  DMA ENHANCED CY170 ADAPTER I/O ROUTINES.
** DIO -  DMA INPUT/OUTPUT.
*
** PURPOSE -
*         PERFORM ESM INPUT/OUTPUT VIA THE CY170 CHANNEL DMA ADAPTER.
*
** INPUT -
*         (A)    = LOCATION OF STARTING ESM ADDRESS.
*         RC     = REQUESTED NUMBER OF CM WORDS TO INPUT FROM CHANNEL.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = ERROR CODE, IF ERROR.
*         AC     = ACTUAL CM WORD COUNT INPUT FROM CHANNEL.
*
** USES - T6, T7, T8, T9.
*
** CALLS - WTR, FCN, RCR, RES, ROS, RTR, VLN.

 DIOX     BSS    0           SOFT ERROR EXIT

 DIO      SUBR               ENTRY/EXIT
          STDL   EMA         SAVE POINTER TO STARTING ESM ADDRESS
          STML   DIOA        STORE LOCATION OF STARTING ESM ADDRESS
          ADC    -DESMAD     MINUS LOCATION OF DESTINATION ESM ADDRESS
          MJN    DIO1        IF DMA INPUT OPERATION

*         OUTPUT OPERATION.
*          INCREMENT LAST INDIRECT LIST ENTRY LENGTH BY TWO BYTES
*          TO INSURE THAT THE LAST CHANNEL WORD GETS FILLED OUT.
          LDN    2
          RAML   INDLST+1-4,LL  INCREMENT LAST ENTRY LENGTH BY TWO
          LDK    FC.WRT      ESM WRITE FUNCTION
          STDL   T6          ESM FUNCTION CODE
          LDK    FC.OUT      DMA OUTPUT / FAST TRANSFER / PP WC=2
          UJN    DIO2

*         INPUT OPERATION.
 DIO1     BSS    0
          RJM    VLN         VERIFY IND LIST TOTAL LENGTH .GE. RC
          NJN    DIOX        IF INSUFFICIENT LENGTH FOR INPUT ERROR
          LDK    FC.RED      ESM READ FUNCTION
          STDL   T6          ESM FUNCTION CODE
          LDK    FC.INP      DMA INPUT / FAST TRANSFER / PP WC=2

 DIO2     BSS    0
          STDL   T7          ADAPTER FUNCTION CODE

 DIO3     BSS    0           ATTEMPT ERROR RECOVERY FROM THIS POINT
          LDK    FC.AMC      ADAPTER MASTER CLEAR
          RJM    FCN         FUNCTION ADAPTER (IGNORE POSSIBLE TIMEOUT ERROR)

          AOML   EODA        SET EXECUTING CY170 TRANSFER FLAG FOR *EOD*

*         INITIALIZE WORD COUNTERS.
          LDDL   RC          REQUESTED CM WORD COUNT
          STML   AC          ACTUAL CM WORD COUNT
          LDDL   LL          LIST LENGTH IN PP WORDS
          SHN    -2          /4 FOR NUMBER OF ENTRIES IN LIST
          STDL   T8          NUMBER OF INDIRECT LIST ENTRIES
          LDC    INDLST+1
          STML   WTRA        STORE ADDRESS OF FIRST LEN/ADRS ENTRY

*         SEND FUNCTIONS TO ESM.
          LDK    FC.HST      ENABLE ESM HIGH SPEED DATA TRANSFER
          RJM    FCN         FUNCTION ESM FOR HIGH SPEED TRANSFER
          NJN    DIO7        IF ESM FUNCTION TIMEOUT ERROR
          LDDL   T6          ESM READ/WRITE FUNCTION
          RJM    FCN         FUNCTION ESM FOR READ OR WRITE
          NJN    DIO7        IF ESM FUNCTION TIMEOUT ERROR

*         WRITE ADAPTER 'T' REGISTER.
          RJM    WTR         WRITE 'T' PRIME REGISTER (FIRST)
          NJN    DIO7        IF INACTIVE ON OUTPUT ERROR

          AOML   EODB        SET T REGISTER LOADED FIRST TIME FLAG

          LDDL   T7          ADAPTER START DMA INPUT OR OUTPUT
          RJM    FCN         FUNCTION ADAPTER I/O / FAST XFER / PP WC=2
          NJN    DIO7        IF ADAPTER FUNCTION TIMEOUT ERROR

          LDN    3           THREE BYTES
          STDL   XBC         ESM ADDRESS TRANSFER BYTE COUNT

*         SEND ESM ADDRESS.
          ACN    CH40
          LDN    2
          OAM    *,CH00      OUTPUT ESM STARTING ADDRESS
 DIOA     EQU    *-1         (LOCATION OF STARTING ESM ADDRESS)
 DIO4     IJM    DIO13,CH00  IF CHANNEL INACTIVE ERROR
          NJN    DIO4        WAIT FOR ZERO COUNT
          DCN    CH40
          LDK    ER.CPE      ** CHANNEL PARITY ERROR CODE **
          SFM    DIO11,CH00   IF CHANNEL ERROR FLAG SET

*         DMA INPUT/OUTPUT LOOP.
 DIO6     LDDL   T8          INDIRECT LIST ENTRY COUNT
          ZJN    DIO10       IF NO MORE INDIRECT LIST ENTRIES
          RJM    WTR         WRITE 'T' PRIME REGISTER
 DIO7     NJN    DIO11       IF NOT THREE WORDS ACCEPTED BY ADAPTER ERROR

*         WAIT FOR 'T' PRIME REGISTER EMPTY.
 DIO8     RJM    ROS         READ ADAPTER OPERATIONAL STATUS
          NJN    DIO11       IF CHANNEL ERROR ON READ OPERATIONAL STATUS
          LDDL   T1          ADAPTER OPERATIONAL STATUS
          SHN    17-OB.TRE
          MJN    DIO6        IF ADAPTER 'T' PRIME REGISTER EMPTY CHECK FOR MORE
          LDDL   T1          ADAPTER OPERATIONAL STATUS
          SHN    17-OB.HLT
          PJN    DIO8        IF NOT DMA TRANSFER HALTED
 DIO9     LDK    ER.HLT      ** DMA XFER HALTED EARLY ERROR **
          UJN    DIO11       CHECK STATUS FOR DETAIL ERROR

*         NO MORE INDIRECT LIST ENTRIES TO SEND ADAPTER.
*         WAIT FOR DMA TRANSFER TO COMPLETE.
 DIO10    RJM    DIW         WAIT FOR I/O TRANSFER TO COMPLETE
*           (A) = ZERO, IF TRANSFER COMPLETED NORMALLY.
*               = ERROR CODE, IF ABNORMAL TRANSFER STOP

*         (SAVE ERROR CODE IN T9 INCASE NO DETAILS AVAILABLE.)
*         DMA TRANSFER STOPPED, CLEAR DMA MODE AND CHECK FOR ERRORS.
 DIO11    STDL   T9          SAVE/CLEAR ERROR CODE
          RJM    RCR         READ CONTROL REGISTER CONTENTS
          RJM    RTR         READ ADAPTER T REGISTERS
          RJM    RES         READ ESM AND ADAPTER ERROR STATUS
          NJN    DIO12       IF ESM OR ADAPTER ERROR
          LDDL   T9          ZERO OR PREVIOUS ERROR CONDITION CODE
 DIO12    RECOVER  DIO3      CHECK ERROR RECOVERY STATUS
          STDL   T9          SAVE (A)
          LDN    0
          STML   EODA        TURN OFF EXECUTING *DIO* CODE FLAG
          STML   EODB        TURN OFF FIRST T REGISTER LOAD FLAG
          LDDL   T9          RESTORE (A)
          RETURN

 DIO13    STDL   RB          SAVE RESIDUAL BYTE COUNT
          LDK    ER.INA      ** CHANNEL INACTIVE ERROR CODE **
          UJN    DIO11
DIW       SPACE  4
** DIW  - DIO WAIT FOR TRANSFER TO COMPLETE
*
** INPUT - NONE.
*
** OUTPUT -
*         (A) = ZERO, IF TRANSFER COMPLETED WITHOUT ERROR.
*             = NONZERO, IF TRANSFER HAS NOT COMPLETED. THE NONZERO VALUE IS
*                        AN ERROR CODE -
*                        ER.FTO = CHANNEL FUNCTION TIMEOUT (FROM *ROS*)
*                        ER.HLT = TRANSFER HALTED EARLY OPERATIONAL STATUS
*                        ER.INA = TRANSFER FAILED TO COMPLETE IN ALOTTED TIME
*                        ER.CLK = TRANSFER FAILED TO COMPLETE, NO EXTERNAL CLOCK
*
** CALLS - ROS.
*
** USES -

 DIW      SUBR               ENTRY/EXIT
          LDK    777B
          STML   DIWA        ESTABLISH WAIT COUNT

*         WAIT FOR DMA TRANSFER TO COMPLETE.
 DIW1     RJM    ROS         READ ADAPTER OPERATIONAL STATUS
          NJN    DIW5        IF ERROR
          LDDL   T1          ADAPTER OPERATIONAL STATUS
          SHN    17-OB.HLT
          PJN    DIW2        IF NOT DMA XFER HALTED EARLY
          LDK    ER.HLT      ** DMA XFER HALTED EARLY **
          UJN    DIW5        RETURN WITH ERROR

 DIW2     LDDL   T1          ADAPTER OPERATIONAL STATUS
          SHN    17-OB.XIP   CHECK TRANSFER IN PROGRESS BIT
          PJN    DIW4        IF TRANSFER COMPLETED
          SOML   DIWA        DECREMENT WAIT COUNT
          NJN    DIW1        IF NOT TIME TO GIVE UP

*         WAITED BEYOND MAXIMUM TIME.
          LDDL   T1
          SHN    17-OB.CLW
          MJN    DIW3        IF EXTERNAL CLOCK PRESENT
          LDK    ER.CLK      ** TRANSFER FAILED TO COMPLETE, NO EXTERNAL CLOCK *
          UJN    DIW5        RETURN WITH ERROR

 DIW3     LDK    ER.INA      ** TRANSFER FAILED TO COMPLETE IN ALOTTED TIME **
*         UJN    DIW5        RETURN WITH ERROR

 DIW4     LDN    0           NO ERROR
 DIW5     RETURN

 DIWA     CON    0           WAIT COUNT
RCR       EJECT
** RCR -  READ ADAPTER CONTROL REGISTER.
*
** PURPOSE -
*         READ DMA ADAPTER CONTROL REGISTER.
*
** INPUT - NONE.
*
** OUTPUT -
*         RCRA   = ADAPTER CONTROL REGISTER CONTENTS.
*
** USES - NONE.
*
** CALLS - FCN.

 RCR      SUBR               ENTRY/EXIT
          LDN    0
          STML   RCRA        CLEAR SAVED CONTROL REGISTER CONTENTS
          LDK    FC.RCR      READ CONTROL REGISTER
          RJM    FCN         FUNCTION ADAPTER
          NJN    RCR2        IF ADAPTER FUNCTION TIMEOUT ERROR
          ACN    CH40
          LDN    1
 RCR1     IJM    RCR2,CH00   IF CHANNEL INACTIVE ERROR
          EJM    RCR1,CH00   WAIT FOR CHANNEL FULL
          IAM    RCRA,CH40   INPUT ADAPTER CONTROL REGISTER
          DCN    CH40
 RCR2     RETURN

 RCRA     CON    0           ADAPTER CONTROL REGISTER CONTENTS
RES       EJECT
** RES -  READ ERROR STATUS REGISTER.
*
** PURPOSE -
*         THIS SUBROUTINE READS THE ADAPTER'S ERROR STATUS REGISTER, AND CALLS
*         'PST' TO READ ESM LSP STATUS. IF NO ERROR IS DETECTED IN THE ESM LSP
*         STATUS, AND IF THE ADAPTER ERROR STATUS REGISTER IS ZERO NO ERROR
*         OCCURRED AND (A) IS ZERO ON EXIT.
*         IF THE ADAPTER ERROR STATUS REGISTER IS NON ZERO AN ADAPTER ERROR
*         CODE IS DETERMINED.
*
*   ERROR STATUS REGISTER BIT ASSIGNMENTS -
*
*      BIT                DESCRIPTION
*     -----              -------------
*    15 / 48     ZERO,N/A.
*    14 / 49     ZERO,N/A.
*    13 / 50     UNCORRECTED ERROR RESPONSE FROM CM ON READ/WRITE.
*    12 / 51     REJECT RESPONSE FROM CM.
*    11 / 52     ILLEGAL RESPONSE CODE FROM CM.
*    10 / 53     PE ON CM RESPONSE CODE (IF KX=0, DETECTED BY I4/CMI).
*     9 / 54     READ DATA PE ON DMA XFER DETECTED BY I4/CMI.
*     8 / 55     EXTERNAL CLOCK FAULT.
*     7 / 56     OVERFLOW, DATA RECEIVED AFTER INPUT BUFFER FULL.
*     6 / 57     PE ON INPUT DATA.
*     5 / 58     12/16 CONVERSION ERROR (IF KZ=1, KZ BOARD ERROR).
*     4 / 59     JY DATA PARITY ERROR (BIT 62 SHOULD = 1).
*     3 / 60     BAS PARITY ERROR (BIT 63 SHOULD = 1)
*     2 / 61     KZ BOARD DETECTED ERROR.
*     1 / 62     JY BOARD DETECTED ERROR.
*     0 / 63     KX BOARD DETECTED ERROR.
*
** INPUT - NONE.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = ERROR CODE, IF ERROR.
*         RESB   = ADAPTER ERROR STATUS.
*
** USES - T10.
*
** CALLS - FCN, PST.

 RES3     LDML   RESB        DMA ADAPTER STATUS
 RESA     SHN    0           * MODIFIED * SHIFT NEXT STATUS BIT TO SIGN POSITION
          MJN    RES4        IF ERROR STATUS BIT 50D+(T10) SET
          AODL   T10         INCREMENT ERROR CODE INDEX
          LDN    0           (5 INSTRUCTIONS BETWEEN INSTRUCTION MODIFICATION)
          LDN    0           (5 INSTRUCTIONS BETWEEN INSTRUCTION MODIFICATION)
          LDN    0           (5 INSTRUCTIONS BETWEEN INSTRUCTION MODIFICATION)
          AOML   RESA        * INSTRUCTION MOD * INCREMENT SHIFT COUNT AT 'RESA'
          UJN    RES3        TEST NEXT HIGH ORDER STATUS BIT

 RES4     LDML   ADPERT,T10  DMA ADAPTER ERROR CODE
          UJN    RESX        RETURN

 RES5     LDK    ER.INA      ** INACTIVE ERROR ON INPUT ERROR STATUS **
 RESX     BSS    0           EXIT

 RES      SUBR               ENTRY/EXIT
          LDN    0
          STML   RESB        CLEAR SAVED ADAPTER ERROR STATUS
          STDL   PS          CLEAR ESM LOW SPEED PORT STATUS
          LDK    FC.ESR      READ ADAPTER ERROR STATUS REGISTER
          RJM    FCN         FUNCTION ADAPTER
          NJN    RESX        IF ADAPTER FUNCTION TIMEOUT ERROR
          LDN    2           TWO BYTES
          STDL   XBC         ADAPTER STATUS TRANSFER BYTE COUNT
          ACN    CH40
          LDN    1
 RES1     IJM    RES5,CH00   IF CHANNEL INACTIVE ERROR
          EJM    RES1,CH00   IF CHANNEL EMPTY
          IAM    RESB,CH40   INPUT/CLEAR ADAPTER ERROR STATUS
          DCN    CH40
          LDK    FC.CDM      CLEAR DMA MODE
          RJM    FCN         FUNCTION ADAPTER (IGNORE TIMEOUT)
          LDK    FC.LST      DISABLE ESM HIGH SPEED DATA TRANSFER
          RJM    FCN         FUNCTION ESM (IGNORE TIMEOUT)
          RJM    PST         CHECK LOW SPEED PORT ESM STATUS
          MJN    RES2        IF ESM STATUS = ABORT BIT (NO ERROR)
          NJK    RESX        IF ESM LOW SPEED PORT ERROR

 RES2     LDML   RESB        ADAPTER ERROR STATUS
          LPC    37777B      14 BITS OF VALID ADAPTER STATUS
          ZJK    RESX        IF NO ADAPTER ERROR IN STATUS
          STML   RESB

* NOTE - THE FOLLOWING CODE MODIFIES INSTRUCTION AT TAG 'RESA'.
          LDN    0
          STDL   T10         INITIALIZE ERROR CODE INDEX
          LDML   RESA        INITIALIZE SHIFT INSTUCTION TO 'SHN  4'
          LPC    -77B        RETAIN INSTRUCTION, CLEAR SHIFT COUNT
          ADN    50D-46D     SHIFT COUNT TO POSITION BIT 50 TO SIGN BIT
          STML   RESA        * INSTRUCTION MODIFICATION *
          UJK    RES3        (MOD INSTRUCTION MUST BE AT LEAST 5 LOCS AWAY)

 RESB     BSSZ   1           ADAPTER ERROR STATUS

 ADPERT   BSS    0           ADAPTER ERROR CODE TABLE
          CON    ER.CME      50 - DMA UNCORRECTED CM ERROR
          CON    ER.CMR      51 - CM REJECT
          CON    ER.ICR      52 - INVALID CM RESPONSE
          CON    ER.CRP      53 - CM RESPONSE CODE PARITY ERROR
          CON    ER.CMI      54 - CMI READ DATA PARITY ERROR
          CON    ER.CLK      55 - CLOCK FAULT
          CON    ER.IBO      56 - OVERFLOW ERROR
          CON    ER.IER      57 - INPUT ERROR
          CON    ER.CVN      58 - 12/16 CONVERSION ERROR
          CON    ER.JYD      59 - JY DATA ERROR
          CON    ER.BAS      60 - BAS PARITY ERROR
          CON    ER.KZE      61 - KZ BOARD ERROR
          CON    ER.JYE      62 - JY BOARD ERROR
          CON    ER.KXE      63 - KX BOARD ERROR

ROS       EJECT
** ROS -  READ OPERATIONAL STATUS.
*
** PURPOSE -
*         READ DMA ADAPTER OPERATIONAL STATUS REGISTER.
*
** INPUT - NONE.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = ERROR CODE, IF ERROR.
*         T1     = ADAPTER OPERATIONAL STATUS.
*         ROSA   = ADAPTER OPERATIONAL STATUS.
*
** USES - T1.
*
** CALLS - FCN.

 ROS2     LDK    ER.INA      ** CHANNEL INACTIVE ON OP STATUS INPUT **

 ROSX     BSS    0           EXIT

 ROS      SUBR               ENTRY/EXIT
          LDN    0
          STML   ROSA        CLEAR SAVED OPERATIONAL STATUS
          LDK    FC.OSR      READ OPERATIONAL STATUS REGISTER
          RJM    FCN         FUNCTION ADAPTER
          NJN    ROSX        IF ADAPTER FUNCTION TIMEOUT ERROR
          LDN    2           TWO BYTES
          STDL   XBC         ADAPTER STATUS TRANSFER BYTE COUNT
          ACN    CH40
 ROS1     IJM    ROS2,CH00   IF CHANNEL INACTIVE ERROR
          EJM    ROS1,CH00   WAIT FOR CHANNEL FULL
          IAN    CH40        INPUT ADAPTER OPERATIONAL STATUS
          STDL   T1          SAVE ADAPTER OPERATIONAL STATUS
          DCN    CH40
          STML   ROSA        SAVE ADAPTER OPERATIONAL STATUS
          LDN    0           NO ERROR
          RETURN

 ROSA     CON    0           ADAPTER OPERATIONAL STATUS REGISTER CONTENTS
RTR       EJECT
** RTR -  READ ADAPTER T REGISTERS.
*
** PURPOSE -
*         READ DMA ADAPTER T REGISTERS.
*
** INPUT - NONE.
*
** OUTPUT -
*         RTRA - RTRA + 2 = ZERO, IF UNABLE TO READ T REGISTER.
*                         = T REGISTER CONTENTS.
*
** USES - NONE.
*
** CALLS - FCN.


 RTR2     LDN    0           UNABLE TO READ ADAPTER T REGISTERS
          STML   RTRA
          STML   RTRA+1
          STML   RTRA+2

 RTR      SUBR               ENTRY/EXIT
          LDK    FC.RTR      READ T REGISTERS
          RJM    FCN         FUNCTION ADAPTER
          NJN    RTR2        IF ADAPTER FUNCTION TIMEOUT ERROR
          LDN    6           TWO BYTES
          STDL   XBC         ADAPTER T REGISTER TRANSFER BYTE COUNT
          ACN    CH40
          LDN    3
 RTR1     IJM    RTR2,CH00   IF CHANNEL INACTIVE ERROR
          EJM    RTR1,CH00   WAIT FOR CHANNEL FULL
          IAM    RTRA,CH40   INPUT ADAPTER T REGISTERS
          DCN    CH40
          RETURN

 RTRA     CON    0           BYTE COUNT
          CON    0           MOST SIGNIFICANT CM ADDRESS BITS
          CON    0           LEAST SIGNIFICANT CM ADDRESS BITS
WTR       EJECT
** WTR -  WRITE 'T' REGISTER.
*
** PURPOSE -
*         WRITE DMA ADAPTER 'T' PRIME REGISTER.
*
** INPUT -
*         WTRA   = PP ADDRESS OF LENGTH/ADDRESS INDIRECT LIST ENTRY.
*         T8     = NUMBER OF INDIRECT LIST ENTRIES TO PROCESS.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = ERROR CODE, IF ERROR.
*         WTRA   = INCREMENTED TO NEXT INDIRECT LIST ENTRY.
*         T8     = NUMBER OF INDIRECT LIST ENTRIES LEFT TO PROCESS.
*
** CALLS - FCN.

 WTR1     LDK    ER.INA      ** CHANNEL INACTIVE ERROR **

 WTRX     BSS    0           EXIT

 WTR      SUBR               ENTRY/EXIT
          LDK    FC.WTR      WRITE 'T' PRIME REGISTER
          RJM    FCN         FUNCTION ADAPTER FOR T REGISTER WRITE
          NJN    WTRX        IF ADAPTER FUNCTION TIMEOUT ERROR
          LDN    6           TWO BYTES
          STDL   XBC         ADAPTER T REGISTER TRANSFER BYTE COUNT
          ACN    CH40        ACTIVATE CHANNEL
          LDN    3           NUMBER OF 16 BIT PP WORDS
          OAM    *,CH00      OUTPUT FIRST LEN/ADRS OF INDIRECT LIST
 WTRA     EQU    *-1         (PP ADDRESS OF LEN/ADRS IN INDIRECT LIST
          DCN    CH40        DEACTIVATE CHANNEL
          NJN    WTR1        IF ADAPTER INACTIVE BEFORE 3 WORDS
          SODL   T8          DECREMENT INDIRECT LIST ENTRY COUNT
          LDN    4           FOUR PP WORDS PER INDIRECT LIST ENTRY
          RAML   WTRA        INCREMENT ADDRESS OF INDIRECT LIST ENTRY
          LDN    0           NO ERROR
          RETURN
          TITLE  CYBER 930 ICI/C170 CONVERTER I/O ROUTINES.
** CIC  - CLEAR CY930 ICI CHANNEL.
*
** PURPOSE - MASTER CLEAR ICI CHANNEL, SELECT CONVERTER, MASTER CLEAR LSP.
*
** INPUT - NONE.
*
** OUTPUT - NONE.
*
** CALLS - FCN, PAUS.

 CIC      SUBR               ENTRY/EXIT
          MCLR   CH40        MASTER CLEAR CHANNEL (I0 ONLY)
          LDN    2
          RJM    PAUS        WAIT 2 MICROSECONDS
          DCN    CH40
          LDK    ICI.SEL+FC.PMC  SELECT C170 CONVERTER/MASTER CLEAR ESM LS PORT
          RJM    FCN         (IGNORE TIMEOUT IF ANY)
          RETURN
ICI       EJECT
** ICI -  ICI CHANNEL COMMAND/RESPONSE AND PAGE INPUT/OUTPUT.
*
** PURPOSE -
*         PERFORM INPUT/OUTPUT TO ESM VIA THE CY930 ICI CHANNEL.
*         THIS SUBROUTINE USES THE CHCM/CMCH INSTRUCTIONS WHICH UTILIZE THE
*         CY930'S DMA FEATURE TO I/O DATA BETWEEN ESM AND CENTRAL MEMORY.
*
** INPUT -
*         (A)    = LOCATION OF STARTING ESM ADDRESS.
*         LL     = INDIRECT LIST LENGTH IN PP WORDS.
*         RC     = REQUESTED NUMBER OF CM WORDS TO INPUT FROM CHANNEL.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                = ERROR CODE, IF ERROR.
*         AC     = ACTUAL CM WORD COUNT INPUT FROM CHANNEL.
*         LI     = LAST PROCESSED INDIRECT LIST INDEX IN PP WORDS.
*         RC     = UNCHANGED.
*
** USES - T6, T9.
*
** CALLS - FCN, PST, VLN.

 ICIX     EQU    *           INSUFFICIENT BUFFER SPACE ERROR EXIT

 ICI      SUBR               ENTRY/EXIT
          STDL   EMA         SAVE POINTER TO STARTING ESM ADDRESS
          STML   ICIA        STORE LOCATION OF STARTING ESM ADDRESS
          ADC    -DESMAD
          MJN    ICI1        IF INPUT FROM ESM OPERATION

*         OUTPUT OPERATION.
*          INCREMENT LAST INDIRECT LIST ENTRY LENGTH BY TWO BYTES
*          TO INSURE THAT THE LAST CHANNEL WORD GETS FILLED OUT.
          LDN    2
          RAML   INDLST+1-4,LL  INCREMENT LAST ENTRY LENGTH BY TWO BYTES
          LDK    ICI.SSM+FC.WRT  ESM WRITE FUNCTION / STORNET MODE
          UJN    ICI2

*         INPUT OPERATION.
 ICI1     BSS    0
          RJM    VLN         VERIFY INDIRECT LIST BYTE LENGTHS
          NJN    ICIX        IF INSUFFICIENT BUFFER SPACE ERROR
          LDK    ICI.SSM+FC.RED  ESM READ FUNCTION / STORNET MODE

*         INITIALIZE WORD COUNTERS, FUNCTION ESM, AND SEND ESM ADDRESS.
 ICI2     BSS    0
          STDL   T6          SAVE FUNCTION CODE
          LDDL   RC          REQUESTED CM WORD COUNT
          STML   AC          ACTUAL CM WORD COUNT

 ICI3     BSS    0           ATTEMPT ERROR RECOVERY FROM THIS POINT
          LDN    0
          STDL   LI          RESET (ZERO) INDIRECT LIST INDEX
          LDDL   T6          ESM READ OR WRITE FUNCTION (PLUS STORNET MODE)
          RJM    FCN         FUNCTION CHANNEL
          ZJN    ICI4        IF NO FUNCTION TIMEOUT ERROR
          LJM    ICI12       CHECK DETAILED PORT STATUS

 ICI4     ACN    CH40        ACTIVATE CHANNEL
          LDN    3           THREE BYTES
          STDL   XBC         ESM ADDRESS TRANSFER BYTE COUNT
          LDN    2           (TWO 12 BIT PP WORDS)
          OAM    *,CH00      OUTPUT ESM STARTING ADDRESS (12 BIT)
 ICIA     EQU    *-1         (LOCATION OF ESM ADDRESS)
 ICI5     IJM    ICI8,CH00   CHANNEL INACTIVE ERROR
          NJN    ICI5        WAIT FOR ZERO COUNT
*         THIS IS NECESSARY FOR ICI CHANNEL TO SWITCH TO PACKING MODE.
 INS.DCN  DCN    CH40        TO ICI CHANNEL ONLY, ESM DOES NOT SEE THIS
          ACN    CH40        TO ICI CHANNEL ONLY, ESM DOES NOT SEE THIS

*         INPUT/OUTPUT LOOP. (ICI SWITCHES TO PACKED MODE AFTER TWO 12 BITS)
 ICI6     BSS    0
          LDML   INDLST+1,LI BYTE COUNT FROM RMA LIST
          STDL   XBC         TRANSFER BYTE COUNT
          SHN    -1          /2 CONVERT TO 16 BIT CHANNEL WORD COUNT
          STDL   CC          CHANNEL WORD COUNT
          LDDL   T6          CHECK IF READ (5001) OR WRITE (5002) FUNCTION
          SHN    17-1        (TEST WRITE 5002)
          PJN    ICI9        IF ESM READ OPERATION (5001)

*         WRITE ESM.
          LOADF  INDLST+2,LI LOAD AND FORMAT RMA IN 'A' AND 'R' REGISTERS
          CMCH   CC,CH00     OUTPUT 16 BIT CHANNEL WORDS
 ICI7     IJM    ICI8,CH00   CHANNEL INACTIVE ERROR
          FJM    ICI7,CH00   WAIT FOR CHANNEL EMPTY
          UJN    ICI11       CHECK END OF TRANSFER

 ICI8     LDDL   CC
          STDL   RB          SAVE RESIDUAL BYTE COUNT
          LDK    ER.INA      ** CHANNEL INACTIVE ERROR **
          UJN    ICI12       CHECK DETAILED PORT STATUS

*         READ ESM.
 ICI9     BSS    0
          LOADF  INDLST+2,LI LOAD AND FORMAT RMA IN 'A' AND 'R' REGISTERS
          CHCM   CC,CH00     INPUT 16 BIT CHANNEL WORDS
 ICI10    IJM    ICI8,CH00   IF CHANNEL INACTIVE ERROR
          EJM    ICI10,CH00  IF CHANNEL EMPTY, WAIT FOR FULL

*         CHECK FOR END OF TRANSFER.
 ICI11    BSS    0
          LDN    4           (PP WORDS PER LIST ENTRY)
          RADL   LI          INCREMENT INDIRECT LIST INDEX
          SBDL   LL          SUBTRACT LIST LENGTH IN PP WORDS
          MJK    ICI6        IF RMA LIST NOT EXHAUSTED

          DCN    CH40        DISCONNECT CHANNEL
          LDN    0           NO CHANNEL FAILURE
          CFM    ICI12,CH00  IF CHANNEL ERROR FLAG NOT SET (ELSE CLEAR FLAG)
          LDK    ER.CPE      ** CHANNEL PARITY ERROR CODE **

*         CHECK FOR ESM ERRORS.

 ICI12    STDL   T9          SAVE POSSIBLE INACTIVE CHANNEL ERROR
          RJM    PST         CHECK PORT STATUS
          LPK    ERCODM      MASK FOR ERROR CODES
          NJN    ICI13       IF DETAILED ERROR CODE
          LDDL   T9          (POSSIBLE INACTIVE CHANNEL ERROR)
 ICI13    BSS    0
          RECOVER  ICI3      CHECK ERROR RECOVERY STATUS
          RETURN
PAUS      EJECT
** PAUS - PAUSE.
*
** PURPOSE -
*         THIS SUBROUTINE IS CALLED BY THE 'PAUSE' MACRO (IODMAC4).
*         DELAY PROGRAM EXECUTION FOR A SPECIFIED NUMBER OF
*         MICROSECONDS.
*
** INPUT - A REGISTER SPECIFIES NUMBER OF MICROSECONDS
*          TO BE DELAYED.
*

 PAUS     SUBR               ENTRY/EXIT
 PAUS1    SBN    1           EACH ITERATION OF THIS SBN-NJN LOOP
          PSN
          PSN
          NJK    PAUS1       UTILIZES 1 MICROSECOND
          RETURN             EXIT
          TITLE  PROCESS PP REQUEST (OVERLAY)

* * *     PP REQUEST PROCESSING OVERLAY LOADED HERE.
 OVLSA    EQU    *           STARTING ADDRESS OF PP REQUEST PROCESSING OVERLAY

 PPR1     RJM    CLK         CLEAR PP LOCKWORD
 PPR2     LJM    0,MLPRTN    TO MAIN LOOP, NO REQUESTS FOUND

 PPR      BSS    0           OVERLAY PORTION OF 'PPR'
          RJM    SLK         LOCK PP-REQUEST QUEUE
          NJN    PPR2        RETURN IF PP REQUEST QUEUE ALREADY LOCKED
          LDK    PITLEN      GET LENGTH OF PIT IN CM WORDS
          STDL   WC          SAVE LENGTH FOR CM READ
          LOADC  CM.PIT      CM ADDRESS TO A AND R FOR READ
          CRML   PITBL,WC    READ IN PIT
          LDML   PITBL+/PIT/P.PPQ  GET HALF 1 OF RMA OF 1ST REQUEST
          ADML   PITBL+/PIT/P.PPQ+1
          ZJK    PPR1        IF RMA = 0 NO PP REQUEST QUEUED

          LDK    MAXREQ
          STDL   WC          SET MAX LENGTH OF PP REQUEST FOR CM READ
          LOADF  PITBL+/PIT/P.PPQ  CM ADDRESS OF REQUEST TO A AND R
          CRML   REQBUF,WC   READ PP REQUEST
          LDK    2
          STDL   WC          SET FOR 2 CM WORD TRANSFER
          LOADF  PITBL+/PIT/P.PPQ  CM ADDRESS OF REQUEST TO A AND R
          CWML   PITBL+/PIT/P.PPQPVA-1,WC  REWRITE PVA AND RMA.
          LOADC  CM.PIT      SET A AND R TO PP INTERFACE TABLE
          ADK    /PIT/C.PPQPVA  SET A AND R TO PVA IN PP INTERFACE TABLE
          CWML   REQBUF+/RQ/P.NEXTPV-1,WC  RESET PVA AND RMA TO NEXT PVA AND RMA
          LOADF  PITBL+/PIT/P.PPQ  CM ADDRESS OF REQUEST TO A AND R
          CRML   REQBUF,WC   REREAD LINK INFORMATION.
          RJM    CLK         UNLOCK PPQ
          RJM    IPR         INITIALIZE RESPONSE BUFFER FOR PP RESPONSE.
*         FALL THRU TO DO COMMAND *DCM*.
*         UJN    DCM
          ERRNZ  *-DCM       CODE ASSUMES *DCM* FOLLOWS
DCM       SPACE 4,25
** DCM -  DO COMMAND.
*
** PURPOSE -
*         PERFORM PP REQUEST COMMANDS.
*
** INPUT - COMMAND IN REQBUF.
*
** OUTPUT -
*         T1     = ADDRESS OF PP COMMAND.
*
** CALLS - DCP, EPC.
*
** USES - T1, T8, T9.

 DCM      BSS    0
          LDN    0           * INSTRUCTION MODIFICATION *
          STML   DCMC        INITIALIZE COMMAND INDEX
          LDML   REQBUF+/RQ/P.LEN  GET REQUEST LENGTH
          SBN    HEADLN      SUBTRACT HEADER LENGTH
          SHN    -3          /8 TO GET CM WORDS OF COMMANDS
          STML   DCMB        SAVE NUMBER OF COMMANDS

 DCM1     BSS    0
          LDK    REQBUF+/RQ/P.CMND  GET ADDR OF FIRST COMMAND
          ADC    **          (INSTRUCTION MODIFIED)
 DCMC     EQU    *-1
          STDL   T1          PP ADDRESS OF COMMAND

          LDK    0
          STML   RSPBUF+/RS/P.RC  CLEAR RESPONSE CODE

          LDIL   T1          GET COMMAND AND FLAGS
          SHN    -8          SHIFT OFF FLAGS
          STDL   T8          SAVE COMMAND

*         SEARCH THE COMMAND CODE TABLE FOR THIS COMMAND.
          LDN    CTBLL-2     SIZE OF PP COMMAND TABLE
          STDL   T9

 DCM2     LDDL   T8          COMMAND CODE FROM REQUEST
          SBML   CTBL,T9     COMMAND CODE FROM TABLE ENTRY
          ZJN    DCM3        ENTRY FOUND
          LCN    2
          RADL   T9          DECREMENT INDEX
          PJK    DCM2        MORE ENTRIES

          LDK    IE.E01      ** INVALID COMMAND CODE **
          RJM    EPC         (NO RETURN)

 DCM3     LDML   CTBL+1,T9   GET ADDRESS OF COMMAND ROUTINE
          STML   DCMA        SET UP JUMP * MODIFY INSTRUCTION *
          RJM    DCMAA       * VIOD INSTRUCTION PIPE FOR MODIFIED INSTRUCTION *
 DCMAA    BSS    1           *                                                *
          RJM    **          EXECUTE COMMAND * MODIFIED INSTRUCTION *
 DCMA     EQU    *-1
          SOML   DCMB        DECREMENT COMMAND COUNTER BY 1 (INSTR MODIFIER)
          ZJN    DCP         IF NO MORE COMMANDS TO DO
          LDK    CMDLEN
          RAML   DCMC        POINT TO NEXT COMMAND FIELD.
          UJK    DCM1        GO AND DO ANOTHER COMMAND

 DCMB     BSSZ   1           COMMAND COUNT
DCP       SPACE  4,10
*
*         COMPLETE COMMAND PROCESSING.
*
 DCP      LDK    R.NRM       SET NORMAL REQUEST TERMINATION INDICATOR
          RAML   RSPBUF+/RS/P.RC

 DCP1     BSS    0
          LDK    REQBUF+/RQ/P.CMND  GET PP ADDR OF FIRST COMMAND
          ADML   DCMC        GET PP ADDRESS OF LAST COMMAND
          ADC    -REQBUF     GET PP WORDS INTO REQUEST
          SHN    1           CM BYTES INTO REQUEST
          ADML   RSPBUF+/RS/P.REQ+1  ADD ON HALF 2 OF REQUEST BUFFER RMA
          STML   RSPBUF+/RS/P.LASTC+1  RMA HALF 2 OF LAST COMMAND
          SHN    -16         GET CARRY IF ANY
          ADML   RSPBUF+/RS/P.REQ  ADD ON HALF 1 OF REQUEST BUFFER RMA
          STML   RSPBUF+/RS/P.LASTC  RMA OF HALF 1 OF LAST COMMAND
          RJM    RSP         SEND RESPONSE TO CPU

 DCPA     LDN    0           (INSTRUCTION MODIFIED IF RESUME_PP COMMAND)
          ZJN    DCP2        IF NOT RESUME_PP COMMAND PROCESSED

 DCPB     EQU    *           (INSTRUCTION MODIFIED TO NOP BY *ICI*)
          RJM    IQI         COMPLETE DRIVER INITIALIZATION

 DCP2     BSS    0
          LJM    0,MLPRTN    TO MAIN LOOP
EPC       SPACE  2
** EPC -  ERROR PROCESS.
*
** PURPOSE - PROCESSING FOR ERRORS ON PP REQUESTS.
*
** INPUT -
*         (A) = INTERFACE ERROR CODE TO BE REPORTED
*
** OUTPUT -
*         RSPBUF - P.IEC = INTERFACE ERROR CODE.
*                - P.ABNFL = ABNORMAL TERMINATION.

 EPC      SUBR               ENTRY (NO RETURN)
          STML   RSPBUF+/RS/P.IEC  SET INTERFACE ERROR CODE
          LDK    ABN.IE      SET I/F ERROR FLAG
          STML   RSPBUF+/RS/P.ABNFL
*         UJK    DER         ABNORMAL TERMINATION OF REQUEST

*         DO-COMMAND ERROR PROCESSING.
 DER      LDK    R.ABN
          STML   RSPBUF+/RS/P.RC  SET ABNORMAL TERMINATION RESPONSE
          UJK    DCP1        SEND RESPONSE TO CPU
CTBL      EJECT
*         PP COMMANDS
*
 CTBL     CON    C.PC0       ACKNOWLEDGE
          CON    PC0

          CON    C.PC1       STOP UNIT
          CON    PC1

          CON    C.PC4       IDLE
          CON    PC4

          CON    C.PC5       RESUME
          CON    PC5

 CTBLL    EQU    *-CTBL      COMMAND TABLE LENGTH
PC0       EJECT
** PC0 -  PP COMMAND 0.
*
** PURPOSE -
*         PROCESS ACKNOWLEDGE COMMAND.
*
** INPUT - (NONE).
*
** OUTPUT - (NONE).
*

** PC1 - PP COMMAND 1.
*
** PURPOSE -
*         PROCESS STOP UNIT COMMAND.
*
** INPUT - (NONE)
*
** OUTPUT - (NONE)
*
 PC1      SUBR               ENTRY/EXIT
          RETURN             EXIT

 PC0      EQU    PC1         (SAME CODE AS PC1)


** PC4 - PP COMMAND 4.
*
** PURPOSE -
*         PROCESS IDLE COMMAND.
*
** INPUT - NONE.
*
** OUTPUT - NONE.
*
** CALLS - MDN.

 PC4      SUBR               ENTRY/EXIT
          AOML   PPIDLE      SET PP IDLE FLAG NONZERO
          RJM    MDN         SET MACHINE STATUS FLAG REGISTER TO DOWN

 PC4A     EQU    *           (CHANGED AT INITIALIZATION IF CY930/ICI)
          UJN    PC4.1       (PASS - IF CY930/ICI)
          LDK    ICI.DES     DESELECT C170 CONVERTER
          RJM    FCN         FUNCTION C170 CONVERTER

 PC4.1    BSS    0
          RETURN             EXIT

** PC5 -  PP COMMAND 5.
*
** PURPOSE -
*         PROCESS RESUME COMMAND.
*
** INPUT - NONE.
*
** OUTPUT - NONE.
*
** CALLS - CIC, MUP.

 PC5      SUBR               ENTRY/EXIT
          AOML   DCPA        SET FLAG FOR RESUME_PP COMMAND PROCESSED

 PC5A     EQU    *           (INSTRUCTION MODIFIED TO NOP AFTER INITIALIZATION)
          UJN    PC5.3       (CHANNEL NOT INITIALIZED YET)

 PC5B     EQU    *           (INSTRUCTION MODIFIED TO NOP IF CY930/ICI)
          UJN    PC5.2       (PASS - IF CY930/ICI)
          RJM    CIC         MASTER CLEAR CHANNEL (I0 ONLY)

 PC5.2    BSS    0
          RJM    MUP         SET MACHINE STATUS FLAG REGISTER TO UP

          LDN    0
          STML   PPIDLE      CLEAR THE PP IDLE FLAG
 PC5.3    BSS    0
          RETURN             EXIT

          TITLE  PP REQUEST PROCESSING SUBROUTINES
CLK       SPACE  4,20
** CLK -  CLEAR PP REQUEST QUEUE LOCK.
*
** PURPOSE - CLEAR THE LOCKWORD ON THE PP REQUEST QUEUE.
*
** INPUT - (NONE)
*
** OUTPUT - QUEUE LOCK IS CLEARED IN PP REQUEST QUEUE.
*           (PPLOCK) = ZERO.
*
** USES  - T5, T7.
*
** CALLS - CLW.


 CLK      SUBR               ENTRY/EXIT
          LDC    **          GET PP LOCKED FLAG
 PPLOCK   EQU    *-1         (PP LOCKED FLAG, NON ZERO IF LOCKED)

          ZJN    CLK1        RETURN IF PP NOT LOCKED ON ENTRY
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK  OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    CLW         CLEAR PP REQUEST QUEUE LOCK
          LDN    0
          STML   PPLOCK      CLEAR PP LOCKED FLAG
 CLK1     RETURN             EXIT
CLW       SPACE 6,40
** CLW -  CLEAR LOCK.
*
** PURPOSE-- CLEARS A LOCKWORD IN CENTRAL MEMORY.
*
** ALGORITHM
*         1. WRITE THE INTERMEDIATE VALUE OF FFFF FFFF 0000 0000,
*            USING A RDSL INSTRUCTION.
*            (SET T1 - T4 = FFFF FFFF 0000 0000,
*            RDSL   T1)
*
*         2. AFTER EXECUTION OF 'RDSL T1',
*            IF T1 - T2 = FFFF FFFF,
*            THEN GO BACK AND EXECUTE STEP 1,
*            ELSE GO TO STEP 3.
*
*         3. IF T4 .NE. PPNO, THIS LOCKWORD IS RESERVED TO A
*            DIFFERENT PROCESSOR.
*            RESTORE THE CONTENTS OF THIS CENTRAL MEMORY LOCATION
*            AS IT EXISTED BEFORE THE VALUE FFFF FFFF XXXX XXXX
*            WAS WRITTEN.
*            CWDL   T1.
*            SET THE A REGISTER .NE. 0, AND EXIT.
*
*         4. IF T4 = PPNO, THEN CLEAR THE LOCKWORD IN CENTRAL MEMORY.
*            SET T1 - T4 = 0000 0000 0000 0000.
*            CWDL   T1.
*            SET THE A REGISTER = 0, AND EXIT.
*
** INPUT -
*         T7 = ADDRESS OF THE 3 DIRECT CELLS WHICH CONTAIN
*              THE REFORMATED ADDRESS OF THE CM INTERFACE TABLE.
*         T5 = THE CENTRAL MEMORY EORD OFFSET WITHIN THE
*              INTERFACE TABLE WHICH CONTAINS THE LOCKWORD.
*
** OUTPUT -
*         A REGISTER = 0, IF THE LOCK WAS CLEARED.
*         A REGISTER .NE. O, IF THE LOCK WAS NOT CLEARED.
*
* USES  - T1, T2, T3, T4, T6.


 CLW      SUBR               ENTRY/EXIT

* WRITE INTERMEDIATE VALUE OF FFFF FFFF 0000 0000.
 CLW1     BSS
          LCN    0           SET INTERMEDIATE VALUE
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        CM ADDRESS OF INTERFACE TABLE
          ADDL   T5          ADD LOCKWORD OFFSET
          STDL   T6          SAVE CM ADDRESS OF LOCKWORD
          RDSL   T1          WRITE INTERMEDIATE VALUE

* CHECK IF RDSL INSTRUCTION WAS SUCCESSFUL.
* CHECK FOR LOCKWORD = FFFF FFFF XXXX XXXX(16).

          LDDL   T1
          ADDL   T2
          ADC    -177777B-177777B
          NJN    CLW2        IF THIS PP WAS FIRST TO WRITE
                             THE INTERMEDIATE VALUE
          UJK    CLW1        REPEAT THE RDSL INSTRUCTION

 CLW2     BSS
          LDDL   T4          CHECK PP NUMBER
          SBDL   PP
          ZJN    CLW3        IF THIS PP HAS THE LOCK SET

* RESTORE THE ORIGINAL CONTENTS.

          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          RESTORE THE ORIGINAL CONTENTS
          LDN    1
          UJK    CLW4        EXIT, A REGISTER NONZERO

* CLEAR THE LOCKWORD.

 CLW3     BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          CLEAR THE LOCKWORD
          LDN    0
 CLW4     RETURN             IF LOCK CLEARED EXIT, A REGISTER = 0
*                            IF LOCK NOT CLEARED EXIT, A REGISTER NONZERO
IPR       SPACE  4,40
** IPR -  INITIALIZE PP REQUEST RESPONSE.
*
** PURPOSE -
*         INITIALIZE RESPONSE IN PP BUFFER FOR A PP REQUEST RESPONSE.
*
** INPUT -
*         REQBUF - PP REQUEST.
*
** OUTPUT -
*         RSPBUF - PP REQUEST RESPONSE INITIALIZE.


 IPR      SUBR               ENTRY/EXIT
          LDK    P.RS        GET LENGTH OF RESPONSE BUFFER
          STDL   T5          SET UP LOOP COUNTER
 IPR1     LDK    0
          STML   RSPBUF      CLEAR BUFFER
          SODL   T5          DECREMENT LOOP COUNTER
          NJK    IPR1        RELOOP UNIT BUFFER CLEARED

          LDML   REQBUF+/RQ/P.NEXTPV REQUEST PVA PART 1
          STML   RSPBUF+/RS/P.PVA
          LDML   REQBUF+/RQ/P.NEXTPV+1  REQUEST PVA PART 2
          STML   RSPBUF+/RS/P.PVA+1
          LDML   REQBUF+/RQ/P.NEXTPV+2  REQUEST PVA PART 3
          STML   RSPBUF+/RS/P.PVA+2
          LDML   REQBUF+/RQ/P.NEXT   REQUEST RMA HALF 1
          STML   RSPBUF+/RS/P.REQ
          LDML   REQBUF+/RQ/P.NEXT+1 REQUEST RMA HALF 2
          STML   RSPBUF+/RS/P.REQ+1
          LDK    B.RS                PP REQUEST RESPONSE LENGTH
          STML   RSPBUF+/RS/P.RESPL  RESPONSE LENGTH
          LDML   REQBUF+/RQ/P.LU     LOGICAL UNIT
          STML   RSPBUF+/RS/P.LU
          LDML   REQBUF+/RQ/P.RECOV  RECOVERY, INTERRUPT, PORT,PRIORITY
          STML   RSPBUF+/RS/P.RECOV
          LDML   REQBUF+/RQ/P.LONGB  ALERT MASK
          STML   RSPBUF+/RS/P.LONGB
          RETURN
MDN       EJECT
** MDN -  MACHINE DOWN.
*
** PURPOSE -
*         CLEAR MACHINE ID NUMBER FROM MACHINE STATUS ESM 4 BIT FLAG REGISTER.
*
** INPUT - NONE.
*
** OUTPUT - NONE.
*
** USES - T4.
*
** CALLS - MSR.

 MDN      SUBR               ENTRY/EXIT
          LDK    FF.CLR      SELECTIVE CLEAR FLAG REGISTER FUNCTION
          STDL   T4
          LDDL   SI          THIS MACHINE'S (SOURCE) ID NUMBER
          RJM    MSR         DO FLAG OPERATION ON MACHINE STATUS REGISTER
          RETURN
MUP       SPACE  2,20
** MUP -  MACHINE UP.
*
** PURPOSE -
*         SET MACHINE ID NUMBER INTO MACHINE STATUS ESM 4 BIT FLAG REGISTER.
*
** INPUT - NONE.
*
** OUTPUT - NONE.
*
** USES - T4.
*
** CALLS - MSR.

 MUP      SUBR               ENTRY/EXIT
          LDK    FF.SET      SELECTIVE SET FLAG REGISTER FUNCTION
          STDL   T4
          LDDL   SI          THIS MACHINE'S (SOURCE) ID NUMBER
          RJM    MSR         DO FLAG OPERATION ON MACHINE STATUS REGISTER
          RETURN
SLK       SPACE  4,18
** SLK -  LOCK PP REQUEST QUEUE.
*
** PURPOSE - SETS THE PP REQUEST QUEUE LOCK IN THE
*            PP INTERFACE TABLE.
*
** INPUT - (NONE)
*
** OUTPUT - (A)      = 0 IF LOCK WAS SUCCESSFULLY SET.
*                      .NE. 0 IF LOCK COULD NOT BE SET.
*           (PPLOCK) = NON ZERO.
*
** USES -  T5, T7.
*
** CALLS - SLW.


 SLK      SUBR               ENTRY/EXIT
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK  OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    SLW         SET THE LOCKWORD
          NJN    SLK1        RETURN IF LOCK WAS NOT SET
          LDN    1
          STML   PPLOCK      SET PP LOCKED FLAG
          LDN    0           LOCK SET
 SLK1     RETURN             EXIT

** SLW -  SET LOCKWORD.
*
** PURPOSE-- SET A LOCKWORD IN CENTRAL MEMORY.
*
** ALGORITHM
*         1. WRITE THE INTERMEDIATE VALUE OF FFFF FFFF 0000 0000,
*            USING A RDSL INSTRUCTION.
*            (SET T1 - T4 = FFFF FFFF 0000 0000,
*            RDSL   T1)
*
*         2. AFTER EXECUTION OF 'RDSL T1',
*            IF T1 - T2 = FFFF FFFF,
*            THEN GO BACK AND EXECUTE STEP 1,
*            ELSE GO TO STEP 3.
*
*         3. IF T1 = 0, WRITE THE PP LOCKWORD TO CENTRAL MEMORY,
*            AS DESCRIBED IN THIS STEP.  ELSE IF T1 .NE. 0, GO TO
*            STEP 4.
*            TO WRITE THE PP LOCKWORD ID:
*            SET T1 - T4 = 8000 0000 0000 PPNO, WHERE PPNO IS THE
*            LOGICAL PP NUMBER OF THIS PP.
*            CWDL   T1.
*            SET THE A REGISTER = 0, AND EXIT.
*
*         4. IF T1 = 8000 AND T4 = PPNO, THIS LOCKWORD WAS ALREADY
*            RESERVED TO THIS PP.
*            RESTORE THE CENTRAL MEMORY LOCATION  (CWDL   T1).
*            SET THE A REGISTER = 0, AND EXIT.
*
*         5. IF T4 .NE. PPNO, THEN THIS LOCKWORD IS RESERVED TO
*            A DIFFERENT PROCESSOR.
*            SET BIT 16 OF THE LOCKWORD THAT WAS READ WITH THE
*            RDSL INSTRUCTION, AND WRITE THE CONTENTS BACK TO
*            CENTRAL MEMORY.
*            THE PURPOSE OF SETTING BIT 16 IS TO REQUEST THE
*            OTHER PROCESSOR TO GIVE UP THE LOCKWORD.
*            LDDL   T2
*            LPC    77777B
*            ADC    100000B
*            STDL   T2
*            CWDL   T1.
*            SET THE A REGISTER .NE. 0, AND EXIT.
*
** INPUT -
*         T7 = THE ADDRESS OF THE 3 DIRECT CELLS WHICH CONTAIN
*              THE REFORMATED ADDRESS OF THE CENTRAL MEMORY
*              INTERFACE TABLE.
*         T5 = THE CENTRAL MEMORY WORD OFFSET WITHIN THE
*              INTERFACE TABLE OF THE LOCKWORD.
*
** OUTPUT -
*         A REGISTER = 0, IF THE LOCK WAS SET.
*         A REGISTER .NE. O, IF THE LOCK COULD NOT BE SET.
*
** USES - T1, T2, T3, T4, T6.


 SLW      SUBR               ENTRY/EXIT

* WRITE INTERMEDIATE VALUE OF FFFF FFFF 0000 0000.

 SLW1     BSS
          LCN    0           SET INTERMEDIATE VALUE
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        UNIT/PP INTERFACE TABLE ADDRESS
          ADDL   T5          ADD LOCKWORD OFFSET, SAVE CM ADDRESS
          STDL   T6          SAVE CM ADDRESS
          RDSL   T1          WRITE INTERMEDIATE VALUE

* CHECK IF RDSL INSTRUCTION WAS SUCCESSFUL.

          LDDL   T1
          ADDL   T4
          ZJN    SLW4        IF LOCK CAN BE SET

* CHECK FOR LOCKWORD = FFFF FFFF XXXX XXXX(16).

          LDDL   T1
          ADDL   T2
          ADC    -177777B-177777B
          NJN    SLW2        IF THIS PP WAS FIRST TO WRITE
                             THE INTERMEDIATE VALUE
          UJK    SLW1        REPEAT THE RDSL INSTRUCTION

* SET BIT 16 IN THE ORIGINAL CONTENTS OF CENTRAL MEMORY AND
* WRITE IT BACK TO CENTRAL MEMORY.

 SLW2     BSS
          LDDL   T2          SET THE 'REQUEST LOCKWORD' FLAG
          LPC    77777B
          ADC    100000B
          STDL   T2
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          RESTORE THE LOCKWORD

          LDDL   T4
          SBDL   PP          CHECK IF LOCK ALREADY SET
          NJN    SLW3        IF LOCK COULD NOT BE SET, EXIT A .NE. 0
          LDDL   T1
          ADC    -100000B
 SLW3     RETURN             IF LOCK WAS ALREADY SET, EXIT A = 0
*                            IF LOCK COULD NOT BE SET, EXIT A .NE. 0

* SET THE LOCKWORD.

 SLW4     BSS
          LDC    100000B
          STDL   T1
          LDN    0
          STDL   T2
          STDL   T3
          LDDL   PP
          STDL   T4
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          SET THE LOCKWORD
          LDN    0
          UJK    SLW3        EXIT, A REGISTER = 0
WED       EJECT
** WED  - WRITE ESM DIVISION.
*         THIS SUBROUTINE IS INVOKED ON ERROR RECOVERY WHEN DOUBLE BIT
*         PARITY ERROR IS DETECTED IN ESM MEMORY.
*
** PURPOSE - WRITE ESM DIVISION TO CLEAR DOUBLE BIT ERRORS.
*
** INPUT -
*         SESMAD = SOURCE ESM ADDRESSES RECORD CONTAINS HEADER RECORD
*                  ADDRESS (BEGINNING ADDRESS) OF DIVISION TO BE WRITTEN.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR DETECTED ON WRITE.
*                = NONZERO, ERROR CODE INDICATING FAILURE,
*                     ER.FTO - CHANNEL FUNCTION TIMEOUT ERROR CODE
*                     ER.INA - INACTIVE CHANNEL ERROR CODE.
** USES - P1.
*
** CALLS - FCN.

 WED4     BSS    0
          LDK    ER.INA      ** INACTIVE CHANNEL ERROR CODE **

 WEDX     BSS    0

 WED      SUBR               ENTRY/EXIT
          LDC    FRAC        NUMBER OF FRACTIONS OF DIVISION
          STDL   P1          INITIALIZE FRACTION OF ESM DIVISION COUNTER
 WEDA     LDC    FC.WRT      ESM WRITE FUNCTION CODE (PLUS ICI.SSM IF CY930)
          RJM    FCN         FUNCTION ESM
          NJN    WEDX        IF  FUNCTION TIMEOUT ERROR

          ACN    CH40        ACTIVATE CHANNEL
          LDN    2           OUTPUT 2 12 BIT CHANNEL WORDS (ESM ADDRESS)
          OAM    SESMAD+/EMA/P.HDR,CH00  OUTPUT STARTING ESM ADDRESS
 WED1     IJM    WED4,CH00   CHANNEL INACTIVE ERROR
          FJM    WED1,CH00   WAIT FOR CHANNEL EMPTY

 WEDB     EQU    *           (CHANGED TO DCN CH40 IF CY930/ICI)
          UJN    WED2        WHEN NOT CY930/ICI
*         THIS IS NECESSARY FOR ICI CHANNEL TO SWITCH TO PACKING MODE.
*         DCN    CH40        TO ICI CHANNEL ONLY, ESM DOES NOT SEE THIS
          ACN    CH40        TO ICI CHANNEL ONLY, ESM DOES NOT SEE THIS

*         WRITE TO EACH FRACTION OF THE CURRENT ESM DIVISION.
 WED2     BSS    0
          LDC    **          12 OR 16 BIT DIV SIZE IN CH WRDS/100(8) SET BY *IEA*
 WEDC     EQU    *-1         (DIVISION SIZE IN CHANNEL WORDS/100(8) )

 WEDD     EQU    *           (CHANGED TO *OAM* AT INITIALIZATION IF ICI)
          OAPM   0001,CH00   PACKED OUTPUT FROM PP LOCATION 0001
 WED3     IJM    WED4,CH00   CHANNEL INACTIVE ERROR
          FJM    WED3,CH00   WAIT FOR CHANNEL EMPTY

          SODL   P1          DECREMENT FRACTION OF DIVISION COUNTER
          NJN    WED2        IF MORE FRACTIONS OF ESM DIVISION TO WRITE

          DCN    CH40        DEACTIVATE CHANNEL

          LDN    0           (NO ERROR)
          RETURN

 FRAC     EQU    100B        CHANNEL WORDS PER DIVISION IS DIVIDED BY 100(8)





 OVLLN    EQU    *-OVLSA     OVERLAY LENGTH IN PP WORDS
 OVLPPW   EQU    OVLLN+3     OVERLAY LENGTH IN PP WORDS PLUS 3 (ROUND UP)
 OVLSZ    EQU    OVLPPW/4    OVERLAY SIZE IN CM WORDS
          TITLE  VE PPU INITIALIZATION - PRESET
** PRS -  PRESET.
*
** PURPOSE -
*         PRESET THE DRIVER AFTER DEADSTART.
*
** INPUT - PPIT = CM REAL MEMORY ADDRESS (2 BYTES) OF THE PP INTERFACE
*                 TABLE FOR THIS PP.
*          PP   = PP NUMBER OF THIS PP.
*
** OUTPUT -
*

 UDPNT    EQU    T6          UNIT POINTER

*         PAUSE A SUFFICIENT AMOUNT OF TIME TO PERMIT THE DEADSTART PP
*         TO DISCONNECT ALL CHANNELS.
 PRS      LDK    8
          STDL   T1
 PRS1     PAUSE  125000D     DELAY 125 MILLISECONDS
          SODL   T1
          NJK    PRS1

          REFAD  PPIT,CM.PIT   PP INTERFACE TABLE RMA
*         (LOW CORE CELL *PPIT* NOW AVAILABLE FOR PP'S USE)

*         READ PP_INTERFACE_TABLE.
          LDK    PITLEN      GET LENGTH OF PIT IN CM WORDS
          STDL   WC
          LOADC  CM.PIT      PP INTERFACE TABLE CM ADDRESS
          CRML   PITBL,WC    READ PPIT AND UNIT DESCRIPTORS

*         GET THE ASSIGNED LOGICAL PP NUMBER.
          LDML   PITBL+/PIT/P.PPNO
          STDL   PP

*         REFORMAT ADDRESS OF RESPONSE BUFFER.
          REFAD  PITBL+/PIT/P.RSBUF,CM.RS    RESPONSE BUFFER RMA

*         INITIALIZE LIMIT OF RESPONSE BUFFER.
          LDML   PITBL+/PIT/P.LIMIT  GET LIMIT OF RESPONSE BUFFER
          STDL   RSLIM       RESPONSE BUFFER LIMIT OFFSET IN BYTES

*         REFORMAT ADDRESS OF PP/CPU INTERRUPT WORD.
          REFAD  PITBL+/PIT/P.INT,CM.INT  INTERRUPT ADDRESS RMA

*         GET CHANNEL NUMBER.
          LDK    0
          STDL   UDPNT       UNIT POINTER
          LDML   PITBL+/PIT/P.UNITC  GET NUMBER OF UNITS
          STDL   T1
          UJN    PRS3

 PRS2     LDK    P.UD        (SIZE OF UD ENTRY IN PP WORDS)
          RADL   UDPNT       INCREMENT UNIT POINTER
 PRS3     SODL   T1          DECREMENT NUMBER OF UNITS
          MJN    *           HANG IF NO UNIT
          LDML   UNITD+/UD/P.UQT,UDPNT  GET RMA UPPER HALF
          ADML   UNITD+/UD/P.UQT+1,UDPNT
          ZJN    PRS2        IF DUMMY ENTRY
          LDDL   UDPNT
          STML   IQIA        SAVE UNIT POINTER

 PRS4     BSS    0
          RJM    CCN         CHANGE CHANNEL NUMBERS
          UJK    MLP         ENTER MAIN LOOP WITH PPIDLE, OVERLAY LOADED
          TITLE  COMPLETE FILE SERVER PP DRIVER INITIALIZATION.
** IQI -  INITIALIZE FROM QUEUE INTERFACE TABLE.
*
** PURPOSE -
*         CONTINUATION OF DRIVER INITIALIZATION. WHEN THE DRIVER WAS LOADED
*         AND EXECUTED THE 'PRS' (PRESET) CODE, IT INITIALIZED FROM PARAMETERS
*         IN THE PP INTERFACE AND UNIT DESCRIPTOR TABLES, AND ENTERED THE
*         DRIVER'S MAIN LOOP TO WAIT FOR A "RESUME" PP COMMAND.
*         WHEN FILE SERVER STORES THE POINTER TO THE QUEUE INTERFACE TABLE
*         (IN PLACE OF POINTER TO NEXT UNIT REQUEST) AND ISSUES A RESUME PP
*         REQUEST THIS SUBROUTINE IS CALLED TO COMPLETE DRIVER INITIALIZATION
*         FROM PARAMETERS IN THE QUEUE INTERFACE TABLE.
*         INITIALIZE FROM PARAMETERS IN REQUEST BUFFER DIRECTORY, ESM BASE
*         ADDRESSES, AND DRIVER QUEUE DIRECTORY.
*
** INPUT -
*         IQIA    = UNIT TABLE INDEX.
*         PITBL   = PP INTERFACE TABLE.
*         UNITD   = UNIT DESCRIPTOR ENTRY.
*
** OUTPUT -
*         CM.RB   = REFORMATTED REQUEST BUFFER CM ADDRESS.
*         CM.RBD  = REFORMATTED REQUEST BUFFER DIRECTORY CM ADDRESS.
*         CM.RBI  = REFORMATTED REQUEST BUFFER IN POINTER CM ADDRESS.
*         DQDIR   = REFORMATTED DRIVER QUEUE DIRECTORY.
*         LU      = SOURCE LOGICAL UNIT.
*         RDQA    = NUMBER OF QUEUE DIRECTORY ENTRIES.
*         RBLIM   = REQUEST BUFFER LIMIT IN 8 BIT BYTES.
*         SI      = SOURCE ID NUMBER.
*
** CALLS - ERR, IEA, IEF, IEM, II0, MDN, RSP, SAVAD, WOV, XIO.

* UNABLE TO INITIALIZE SHOULD ANY OF THESE CONDITIONS OCCUR -
*         IF NO UNIT INTERFACE TABLE ADDRESS IN UNIT DESCRIPTOR.
*         IF NO QUEUE INTERFACE TABLE ADDRESS IN UIT (NEXT UNIT REQUEST).
*         IF INSUFFICIENT LENGTH FOR OVERLAY IN PP COMMUNICATION BUFFER.
*         IF NO FILE SERVER QUEUES SPECIFIED IN QUEUE DIRECTORY.
*         IF NUMBER OF QUEUES SPECIFIED IS GREATER THAN PP'S MAXIMUM ALLOWED.
 IQIX     BSS    0           UNABLE TO INITIALIZE

 IQI      SUBR   0           ENTRY
          LDC    *           UNIT TABLE INDEX
 IQIA     EQU    *-1         (UNIT TABLE INDEX STORED BY *PRS*)
          STDL   UDPNT
          LDML   UNITD+/UD/P.UQT,UDPNT  GET RMA UPPER HALF
          ADML   UNITD+/UD/P.UQT+1,UDPNT  ADD RMA LOWER HALF
          ZJN    IQIX        IF NO UNIT INTERFACE TABLE ADDRESS

          LDK    C.UIT       GET LENGTH OF UIT
          STDL   WC          SAVE LENGTH FOR CM READ
 IQI1     LOADF  UNITD+/UD/P.UQT,UDPNT  REFORMAT/LOAD CM ADDRESS OF UIT
          CRML   UITBL,WC   READ IN UNIT INTERFACE TABLE
          LDML   UITBL+/UIT/P.NEXT  HALF 1 OF RMA FOR QIT
          ADML   UITBL+/UIT/P.NEXT+1  IF RMA=0 NO QIT QUEUED
          ZJK    IQIX        IF QIT POINTER NOT PRESENT

 IQI2     LDML   UITBL+/UIT/P.LU
          STDL   LU          SAVE LOGICAL UNIT NUMBER
          STML   ENGLUN      SAVE LOGICAL UNIT FOR ENGINEERING RESPONSE

*         CHECK IF PP COMMUNICATION BUFFER LARGE ENOUGH FOR OVERLAY.
          LDML   PITBL+/PIT/P.CBUFL  LENGTH OF COMM BUFFER IN BYTES
          SHN    -3          /8 LENGTH OF COMM BUFFER IN CPU WORDS
          ADC    -OVLSZ      LENGTH OF OVERLAY (IN CM WORDS)
          MJK    IQIX        IF INSUFFICIENT LENGTH FOR OVERLAY

*         REFORMAT AND SAVE CM ADDRESS OF QUEUE INTERFACE TABLE
*         WHICH IS ALSO THE FWA OF THE REQUEST BUFFER DIRECTORY RECORD.
          REFAD  UITBL+/UIT/P.NEXT,CM.QIT

**        READ REQUEST BUFFER DIRECTORY RECORD.
          LDK    C.RBD       LENGTH OF REQUEST BUFFER DIRECTORY RECORD
          STDL   WC          SAVE LENGTH FOR CM READ
          LOADC  CM.RBD      ADDRESS OF REQUEST BUFFER DIRECTORY
          CRML   RBDIR,WC    READ REQUEST BUFFER DIRECTORY RECORD

*         REFORMAT AND SAVE CM ADDRESS OF REQUEST BUFFER.
          REFAD  RBDIR+/RBD/P.RBRMA,CM.RB
          LDML   RBDIR+/RBD/P.LIMIT  IN BYTES
          SHN    -3          /8 FOR CM WORDS
          STDL   RBLIM        SAVE REQUEST BUFFER LIMIT IN CM WORDS

**        READ DRIVER QUEUE DIRECTORY HEADER RECORD.
 IQI3     LDK    C.QDH       LENGTH OF DRIVER QUEUE DIRECTORY HEADER
          STDL   WC          SAVE LENGTH FOR CM READ
          LOADC  CM.QIT      ADDRESS OF QUEUE INTERFACE TABLE
          ADK    QIT.QDH     ADD OFFSET TO QUEUE DIRECTORY HEADER
          CRML   DQDHD,WC    READ DRIVER QUEUE DIRECTORY HEADER RECORD
          LDML   DQDHD+/QDH/P.NQDE
          STML   RDQA        SAVE NUMBER OF QUEUE DIRECTORY ENTRIES
          STDL   T3          (SAVE FOR READ OF QUEUE DIRECTORY)
          ZJK    IQIX        IF NO QUEUES ESTABLISHED
          SBN    MAXQDE+1    (MAXIMUM NUBER OF QUEUE ENTRIES+1)
          PJK    IQIX        IF MORE QUEUES THAN SPACE
          LDML   DQDHD+/QDH/P.SIDN
          STDL   SI          ESTABLISH SOURCE ID NUMBER

*         ESTABLISH REQUEST BUFFER (SEND) AND/OR ESM FLAG PROCESSOR (RECEIVE).
          LDML   DQDHD+/QDH/P.SNDPP
          STML   SNDPP       PP TO PROCESS REQUEST BUFFER ENTRIES (SEND)
          LDML   DQDHD+/QDH/P.RCVPP
          STML   RCVPP       PP TO PROCESS ESM SOURCE FLAGS (RECEIVE)

*         IF MACHINE IS CYBER 930 IOU MODEL I0 CHANGE I/O SUBROUTINES.
          LDML   DQDHD+/QDH/P.IOUMI0
          SHN    2+/QDH/L.IOUMI0  I0U I0 MODEL TO SIGN BIT
          PJN    IQI4        IF NOT I0 IOU
          RJM    II0         INITIAL FOR CYBER 930 IOU I0
          UJN    IQI7        CONTINUE SETUP

*         IF DMA ENHANCED CY170 ADAPTER PRESENT CHANGE I/O SUBROUTINES.
 IQI4     BSS    0
          LDML   SNDPP       SEND PP NUMBER
          LMML   RCVPP       RECEIVE PP NUMBER
          ZJN    IQI5        IF SEND AND RECEIVE PP ARE THE SAME PP
          LDML   SNDPP       SEND PP NUMBER
          LMDL   PP
          ZJN    IQI5        IF THIS PP IS THE SEND PP
          LDML   DQDHD+/QDH/P.DMARCV
          SHN    2+/QDH/L.DMARCV  DMARCV TO SIGN BIT
          UJN    IQI6        CHECK IF RECEIVE CHANNEL TO USE DMA CAPABILITY

 IQI5     LDML   DQDHD+/QDH/P.DMASND
          SHN    2+/QDH/L.DMASND  DMASND TO SIGN BIT

 IQI6     PJN    IQI7        IF NOT DMA ENHANCED CY170 ADAPTER CAPABILITY
          RJM    XIO         CHANGE I/O SUBROUTINE TO *DIO*
          UJN    IQI8

*         TURN OFF ERROR LOG DMA ADAPTER INFORMATION IF NOT DMA DRIVER MODE.
 IQI7     LDN    0
* * ASSEMBLY ERROR 9 EXPECTED ON NEXT TWO INSTRUCTIONS * *
          STML   EONA        NOP "RJM  EOD"
          STML   EONA+1      NOP "RJM  EOD"

**        READ DRIVER QUEUE DIRECTORY.
 IQI8     LOADC  CM.QIT      ADDRESS OF QUEUE INTERFACE TABLE
          ADK    QIT.QDE     ADD OFFSET TO QUEUE DIRECTORY RMA ADDRESS ENTRIES
          CRML   DQDIR,T3    READ QUEUE DIRECTORY RMA ENTRIES

*         REFORMAT DRIVER QUEUE DIRECTORY ENTRIES.
          LDN    0
          STDL   T1          INITIALIZE UNFORMATTED DQDIR OFFSET
          LDC    DQDIR
          STDL   T2          INITIALIZE ADDRESS TO SAVE REFORMATTED RMA

 IQI9     LOADF  DQDIR+/QDE/P.DQRMA,T1  REFORMAT RMA INTO *CM*
          LDML   CM+2
          RJM    SAVAD       SAVE CM - CM+2 IN (T2) - (T2)+2
          LDN    0
          STML   3,T2        CLEAR OUT LEFTOVER RMA IN (T2)+3
          LDK    P.QDE       PP WORDS PER REFORMATTED RMA (3 VALID)
          RADL   T2          INCREMENT REFORMATTED RMA SAVE ADDRESS
          LDK    P.QDE       PP WORDS PER UNFORMATTED RMA ENTRY
          RADL   T1          INCREMENT UNFORMATTED DIRECTORY OFFSET
          SHN    -2          /4 FOR NUMBER OF ENTRIES
          SBML   RDQA        NUMBER OF DIRECTORY ENTRIES
          NJK    IQI9        REFORMAT AND SAVE NEXT ENTRY

*         INITIALIZE BASE ESM ADDRESSES.
          RJM    IEA         INITIALIZE ESM BASE ADDRESSES
          RJM    CKP         CHECK PORT FUNCTIONALITY
          NJN    IQI12       IF PORT FAILURE
          LDML   SNDPP       SENDING PP NUMBER
          LMDL   PP          THIS PP'S NUMBER
          NJN    IQI10       IF THIS PP IS NOT SENDING, NO ESM INITIALIZATION
          RJM    IEF         INITIALIZE THIS MACHINE'S ESM FLAG REGISTERS
          NJN    IQI12       IF ERROR
          RJM    IEM         INITIALIZE THIS MACHINE'S ESM MEMEORY BLOCK
          NJN    IQI12       IF ERROR

*         TURN OFF DRIVER INITIALIZATION.
* * ASSEMBLY ERROR 9 EXPECTED ON NEXT THREE INSTRUCTIONS * *
 IQI10    LDN    0           CLEAR "RJM IQI" IN PP REQUEST PROCESSOR
          STML   DCPB        NOP "RJM IQI"
          STML   DCPB+1      NOP "RJM IQI"
          STML   PC5A        ALLOW CHANNEL OPERATIONS AFTER RESUME_PP COMMAND
          LDN    0
          STML   PPIDLE      CLEAR THE PP IDLE FLAG
          RJM    WOV         WRITE PP OVERLAY TO COMMUNICATIONS BUFFER
          RJM    MUP         SET MACHINE STATUS FLAG REGISTER TO UP
 IQI11    BSS    0
          RETURN


 IQI12    BSS    0           INITIALIZATION ERROR
          STML   IQIC        SAVE ERROR CODE
          RJM    IRS         INITIALIZE ONE WORD RESPONSE
          LDC    *
 IQIC     EQU    *-1         (SAVED ERROR CODE)
          RJM    ERR         STORE ERROR IN ONE WORD RESPONSE
          RJM    RSP         WRITE ONE WORD RESPONSE
          UJN    IQI11       (RETURN PP NOT INITIALIZED)
CKP       SPACE  4,20
** CKP -  CHECK PORT STATUS.
*
** PURPOSE -
*         CHECK LOW SPEED PORT FUNCTIONALITY PRIOR TO INITIALIZATION
*         OF FLAGS AND MEMORY.
*
** INPUT - INITIALIZED CHANNEL NUMBERS AND ESM ADDRESSES.
*
** OUTPUT -
*           (A)    = ZERO, IF NO PORT ERROR.
*                  = NON ZERO, IF ERROR.
*
** USES - NONE.
*
** CALLS - PST, RECOVER.

 CKP      SUBR               ENTRY/EXIT
 CKP1     RJM    PST         GET PORT STATUS
          RECOVER  CKP1      RETRY TO FORCE ENGINEERING LOG MESSAGE IF ERROR
          LPK    ERCODM      (RETAIN ONLY ERROR CODE FIELD)
          RETURN
IEA       EJECT
** IEA -  INITIALIZE ESM ADDRESSES.
*
** PURPOSE -
*         INITIALIZE TABLE OF ESM BASE ADDRESSES.
*
** INPUT - CM.QIT = REFORMATTED QUEUE INTERFACE TABLE CM ADDRESS.
*
** OUTPUT - BMEMAD = BASE ESM MEMORY ADDRESS/100(8).
*           DSZCW  = DIVISION SIZE IN CHANNEL WORDS/100(8).
*           TBFLGA = TABLE OF BASE ESM FLAG REGISTER ADDRESSES PER ID.
*           TBMOFF = TABLE OF BASE ESM MEMORY ADDRESS OFFSETS/100(8) PER ID.
*           TDIVOF = TABLE OF ESM DIVISION OFFSETS/100(8).
*           NDIVS  = NUMBER OF ESM DIVISIONS PER MACHINE.
*
** USES - T1 THRU T9.
*
** CALLS - NONE.

 IEA      SUBR               ENTRY
          LDK    C.ESM       LENGTH OF ESM BASE ADDRESSES RECORD (CM WORDS)
          STDL   T9
          LOADC  CM.QIT      ADDRESS OF QUEUE INTERFACE TABLE
          ADK    QIT.ESM     OFFSET TO ESM BASE ADDRESSES RECORD
          CRML   T1,T9       READ ESM BASE ADDRESS RECORD FROM CM

          LDDL   T1+/ESM/P.NDIVS
          STDL   NDIVS       NUMBER OF DIVISIONS PER MACHINE
          STML   FRQA        INITIALIZE LAST DIVISION PROCESSED

          LDDL   T1+/ESM/P.BMEMA
          STML   BMEMAD      SAVE UPPER BIT OF BASE ESM MEMORY ADDRESS/100(8)
          LDDL   T1+/ESM/P.BMEMA+1
          STML   BMEMAD+1    SAVE LOWER BITS OF BASE ESM MEMORY ADDRESS/100(8)

          LDDL   T1+/ESM/P.D12CW
          STML   WEDC        SAVE ESM DIVISION SIZE IN 12 BIT CHAN WORDS/100(8)
 IEAA     UJN    IEA0        (CHANGED TO PASS BY *IIO* FOR 16 BIT CHANNEL

          LDDL   T1+/ESM/P.D16CW
          STML   WEDC        SAVE ESM DIVISION SIZE IN 16 BIT CHAN WORDS/100(8)

*         BUILD TABLE OF DIVISION OFFSETS/100(8).
 IEA0     BSS    0
          LDN    1
          STDL   T9          BEGIN WITH DIVISION NUMBER ONE
          LDN    0
          STML   TDIVOF,T9   (DIVISION ONE'S OFFSET ALWAYS ZERO)

 IEA1     AODL   T9          INCREMENT DIVISION NUMBER
          LDML   TDIVOF-1,T9  PREVIOUS DIVISION'S OFFSET
          ADDL   T1+/ESM/P.DIVSZ  ADD ESM DIVISION SIZE/100(8)
          STML   TDIVOF,T9   CURRENT DIVISION'S OFFSET/100(8)
          LDDL   T9
          SBDL   NDIVS
          MJN    IEA1        IF MORE DIVISION OFFSETS

 IEA2     LDDL   T1+/ESM/P.BFLGA  BASE ESM 4 BIT FLAG REGISTER ADDRESS
          STML   MSFLGB      BASE MACHINE STATUS ESM FLAG REGISTERS ADDRESS
          ADDL   T1+/ESM/P.NMACH
          STDL   T1+/ESM/P.BFLGA  BASE DIVISION STATUS ESM FLAG REGISTER ADDRESS

          LDN    0
          STDL   T9          INITIALIZE TABLE INDEX

*         STORE BASE FLAG REGISTER ADDRESS FOR EACH MACHINE.
 IEA3     AODL   T9          INCREMENT TABLE INDEX
          LDDL   T1+/ESM/P.BFLGA   CURRENT ESM BASE FLAG ADDRESS
          STML   TBFLGA,T9         STORE IN TABLE FOR CURRENT ID
          ADDL   NDIVS             INCREMENT TO BASE FOR NEXT MACHINE
          STDL   T1+/ESM/P.BFLGA   NEXT MACHINES BASE FLAG ADDRESS

*         STORE BASE ESM MEMORY ADDRESS OFFSET FOR EACH MACHINE.
          LDML   IEAB              CURRENT ESM BASE MEMORY ADDRESS OFFSET
          STML   TBMOFF,T9         STORE IN TABLE FOR CURRENT ID
          ADML   TDIVOF,NDIVS      OFFSET TO FWA OF LAST ESM DIVISION
          ADDL   T1+/ESM/P.DIVSZ   PLUS ESM DIVISION SIZE/100(8)
          STML   IEAB              SAVE ESM BASE ADDRESS OFFSET FOR NEXT MACHINE

          LDDL   T9          TABLES INDEX
          SBDL   T1+/ESM/P.NMACH
          NJN    IEA3        IF MORE MACHINE ID NUMBERS
          RETURN

 IEAB     BSSZ   1                 CURRENT ESM BASE MEMORY ADDRESS OFFSET
IEF       EJECT
** IEF -  INITIALIZE FLAG REGISTERS.
*
** PURPOSE -
*         ESM FLAG REGISTERS FOR SPECIFIED MACHINE ID NUMBER ARE SET
*         TO ZERO.
*
** INPUT -
*         (SI)    = SOURCE MACHINE ID NUMBER (THIS MACHINES ID NUMBER).
*         NDIVS  = NUMBER OF DIVISIONS PER MACHINE.
*         TBFLGA = TABLE OF BASE FLAG REGISTER ADDRESSES.
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*                      NONZERO, IF CHANNEL ERROR.
*
** USES - T2, T3, T4.
*
** CALLS - FOP.

 IEF      SUBR               ENTRY/EXIT
          LDK    FF.CLR      SELECTIVE CLEAR FLAG FUNCTION
          STDL   T4
          LDK    FR.XXX+FR.HLD+FR.RDY+FR.RSV  CLEAR ALL FLAGS
          STDL   T3
          LDML   MSFLGB      BASE 4 BIT FLAG ADDRESS FOR MACHINE STATUS FLAGS
          ADDL   SI          THIS MACHINE'S ID IS ADDRESS OFFSET
          SBN    1
          RJM    FOP         CLEAR MACHINE STATUS 4 BIT FLAG REGISTER
          LDN    0
          STDL   T2          DIVISION OFFSET

 IEF1     LDML   TBFLGA,SI   BASE FLAG REGISTER ADDRESS PER ID
          ADDL   T2          DIVISION OFFSET
          RJM    FOP         CLEAR ESM BUFFER STATUS FLAG REGISTER
          NJN    IEF2        IF ERROR WHILE INITIALIZING FLAGS
          AODL   T2          INCREMENT DIVISION OFFSET
          SBDL   NDIVS       NUMBER OF DIVISIONS PER MACHINE
          NJN    IEF1        IF MORE DIVISIONS
 IEF2     RETURN
IEM       EJECT
** IEM -  INITIALIZE ESM MEMORY.
*
** PURPOSE -
*         INITIALIZE THE BLOCK OF ESM MEMORY ASSIGNED TO THIS PP
*         BY WRITING ESM MEMEORY.
*
** INPUT -
*         (SI)   = SOURCE MACHINE ID (MACHINE THIS PP IS ON).
*         TBMOFF = TABLE OF BASE ESM MEMORY ADDRESS OFFSETS/100(8)
*
** OUTPUT -
*         (A)    = ZERO, IF NO ERROR.
*
** USES - DI.
*
** CALLS - SEA, WED.

 IEM      SUBR               ENTRY/EXIT
          LDDL   SI          THIS PP'S ID NUMBER
          STDL   ID          (USED BY *SEA*)
          LDN    0
          STDL   DI          INITIALIZE ESM DIVISION INDEX TO ZERO

*         WRITE TO EACH ESM DIVISION FOR THIS MACHINE.
 IEM1     AODL   DI          INCREMENT TO NEXT ESM DIVISION
 IEM2     BSS    0           ATTEMPT RECOVERY FROM THIS POINT
 IEMA     LDC    FC.WRT      ESM WRITE FUNCTION CODE (PLUS ICI.SSM IF CY930)
          STDL   T6          SAVE LSP FUNCTION (DONE ONLY FOR RECOVERY CODE)
          LDN    SADESM      ADDRESS OFFSET OF ADDRESS TO STORE ESM ADDRESSES
          STDL   EMA         (SAVE POINTER TO STARTING ESM ADDRESS)
          RJM    SEA         SET ESM ADDRESSES
          RJM    WED         WRITE INTO THE DIVISION

          RECOVER  IEM2

          LDDL   DI          CURRENT ESM DIVISION
          SBDL   NDIVS       NUMBER OF ESM DIVISIONS PER MACHINE
          MJK    IEM1        IF MORE ESM DIVISIONS TO WRITE
          SFM    *,CH00      CLEAR CHANNEL ERROR FLAG
          LDK    FC.PMC      ESM LOW SPEED PORT MASTER CLEAR
          RJM    FCN
          RETURN
II0       EJECT
** II0  - INITIALIZE FOR IOU MODEL I0 CY930/C170 CONVERTER CHANNEL (ICI).
*         THIS SUBROUTINE MODIFIES I/O RELATED CODE TO ALLOW OPERATION
*         ON CY930 MACHINE VIA ICI CHANNEL C170 CONVERTER.
*
*         THIS SUBROUTINE MUST BE CALLED SOME TIME AFTER *CCN* SO THAT THE
*         CORRECT CHANNEL NUMBER IS STORED INTO THE I/O INSTRUCTIONS BELOW.
*
** CALLS - CIC, XIO.

* * * THESE ARE NOT INTENDED TO BE EXECUTED AT THIS LOCATION.
 INS.IAM  IAM    *,CH00      INPUT (A) WORDS INSTRUCTION (CHANNEL TABLE CH00)
 INS.OAM  OAM    *,CH00      OUTPUT (A) WORDS INSTRUCTION (CHANNEL TABLE CH00)
* * *

 II0      SUBR               ENTRY/EXIT

*         SET ICI CY170 CONVERTER FUNCTION TO BE ADDED TO ESM FUNCTION CODES.
          LDK    ICI.SSM/10000B  STORNET SUBSYS MODE ICI FUNCTION
          RAML   WEDA        ADD ICI.SSM FUNCTION TO *LDC* INSTRUCTION
          STML   IEMA        ADD ICI.SSM FUNCTION TO *LDC* INSTRUCTION
          STML   REHA        ADD ICI.SSM FUNCTION TO *LDC* INSTRUCTION
          STML   WEHA        ADD ICI.SSM FUNCTION TO *LDC* INSTRUCTION

          LDK    ICI.12B/10000B  12 BIT MODE ICI FUNCTION
          RAML   FOPA        ADD ICI.12B FUNCTION TO *LDC* INSTRUCTION
          STML   PSTA        ADD ICI.12B FUNCTION TO *LDC* INSTRUCTION
          STML   ENGC        ADD ICI.12B FUNCTION TO *LDC* INSTRUCTION

*         MODIFY *IEA* INITIALIZE ESM ADDRESSES SUBROUTINE.
          LDN    0           'PASS' INSTRUCTION
          STML   IEAA        ALLOW ICI 16 BIT CHANNEL WORD COUNT/100(8) DIVSIZ

*         MODIFY *WED* WRITE ESM MEMORY SUBROUTINE.
          LDML   INS.OAM     OUTPUT CH00 INSTRUCTION
          STML   WEDD        CHANGE *IAPM* TO *OAM*

*         ENABLE EXECUTION OF SELECT/DESELECT ICI CONVERTER.
*         MODIFY *PC4* IDLE PP COMMAND SUBROUTINE.
*         MODIFY *ENG* ERROR RECOVERY SUBROUTINE.
          LDN    0           'PASS' INSTRUCTION
          STML   ENGB        EXECUTE MCLR AND SELECT ICI FUNCTION
          STML   PC4A        EXECUTE DESELECT ICI FUNCTION
          STML   PC5B        EXECUTE SELECT ICI FUNCTION

*         ENABLE DCN/ACN FOR STORNET MODE TURN AROUND.
*         MODIFY *WED* WRITE ESM MEMORY SUBROUTINE.
*         MODIFY *RWH* READ/WRITE ESM HEADER SUBROUTINE.
          LDML   INS.DCN     (DCN CH40  INSTRUCTION)
          STML   WEDB        EXECUTE 'DCN/ACN' FOR ICI CHANNEL
          STML   RWHB        EXECUTE 'DCN/ACN' FOR ICI CHANNEL

*         MODIFY *RWH* READ/WRITE ESM HEADER SUBROUTINE.
          LDC    EHSIZ-EHSIZC  CHANNEL WORD COUNT DIFFERENCE FOR 16 VS 12
          RAML   RWHC        CHANGE HEADER WORD COUNT FOR 16 BIT CHANNEL WORDS
          LDML   INS.IAM     INPUT CH00 INSTRUCTION
          STML   RWHD        CHANGE *IAPM* TO *IAM*
          LDC    EHSIZ-EHSIZC  CHANNEL WORD COUNT DIFFERENCE FOR 16 VS 12
          RAML   RWHE        CHANGE HEADER WORD COUNT FOR 16 BIT CHANNEL WORDS
          LDML   INS.OAM     OUTPUT CH00 INSTRUCTION
          STML   RWHF        CHANGE *OAPM* TO *OAM*

*         MODIFY *XIO* CHANGE I/O SUBROUTINE.
          LDC    ICI         ADDRESS OF ICI CHANNEL I/O SUBROUTINE
          STML   XIOA        ADDRESS OF CM I/O SUBROUTINE
          RJM    XIO         CHANGE I/O SUBROUTINE CALLS

*         SELECT ICI CY170 CONVERTER.
          RJM    CIC         MASTER CLEAR CHANNEL (I0 ONLY)
          RETURN
CNN       EJECT
** CCN -  CHANGE CHANNEL NUMBER.
*
** PURPOSE -
*         CHANGE CHANNEL NUMBER IN CHANNEL INSTRUCTIONS.
*
** INPUT -  UDPNT = POINTER TO UNIT DESCRIPTOR TABLE.
*
** OUTPUT - (NONE)
*
** USES - T1, T2, T3.

 CCNX     BSS    0

          DCN    CH40        UNCONDITIONAL DEACTIVATE CHANNEL

 CCN      SUBR               ENTRY/EXIT
          LDML   UNITD+/UD/P.CHAN,UDPNT  GET CHANNEL
          SHN    -8
          LPN    37B
          STDL   T3          SAVE NEW CHANNEL NUMBER
          SBML   CURCH       CURRENT CHANNEL NUMBER
          ZJN    CCNX        NO CHANGE NEEDED

          RAML   CURCH       SAVE NEW CURRENT CHANNEL
          LDK    0
          STDL   T1          CHANGE CHANNEL INSTRUCTIONS

 CCN1     LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CCNX        END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMDL   T3          GET NEW CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJK    CCN1

 CURCH    CON    0           CURRENT CHANNEL NUMBER

*         CHANNEL TABLE.
*         NOTE - THE CHANNEL TABLE MUST OCCUR AFTER LAST CHANNEL INSTRUCTION.

 CONCH    BSS    0
 TCH00    HERE   TABLE CH00 - CHANNEL TABLE
 TCH40    HERE   TABLE CH40 - CHANNEL TABLE
 TTP+40B  HERE
 T40B+TP  HERE
 TTP      HERE
          CON    0
SAVAD     EJECT
** SAVAD - SAVE ADDRESS.
*
** PURPOSE -
*         MOVE A REFORMATED ADDRESS CONTAINED IN (CM)
*         TO A MEMORY LOCATION.
*
** INPUT -
*         (A)    = WORD 2 OF REFORMATTED CM RMA (CM+2).
*         CM - CM+2 = WORDS 0 AND 1 OF REFORMATTED CM RMA.
*         (T2)   = FIRST PP ADDRESS TO RECEIVE THE REFORMATED CM RMA.

 SAVAD    SUBR
          STML   2,T2
          LDDL   CM
          STIL   T2
          LDDL   CM+1
          STML   1,T2
          RETURN
WOV       EJECT
** WOV  - WRITE OVERLAY.
*
** INPUT -
*         PITBL  - PP INTERFACE TABLE.
*
** OUTPUT - NONE.
*
** USES - WC.

 WOV      SUBR               ENTRY/EXIT
*         REFORMAT AND SAVE CM ADDRESS OF PP COMMUNICATION BUFFER.
          REFAD  PITBL+/PIT/P.CBUF,CM.CB
          LDML   PITBL+/PIT/P.CBUFL  LENGTH OF COMM BUFFER IN BYTES
          SHN    -3          /8 LENGTH OF COMM BUFFER IN CPU WORDS
          ADC    -OVLSZ      LENGTH OF OVERLAY (IN CM WORDS)
          MJN    WOV1        IF INSUFFICIENT LENGTH FOR OVERLAY

*         WRITE OVERLAY TO PP COMMUNICATION BUFFER
          LDK    OVLSZ       LENGTH OF OVERLAY IN CM WORDS
          STDL   WC          SAVE CPU WORD COUNT FOR CM WRITE
          LOADC  CM.CB       (LOAD REFORMATTED CM ADDRESS)
          CWML   OVLSA,WC    WRITE OVERLAY TO CM
 WOV1     RETURN
XIO       EJECT
** XIO -  CHANGE I/O ROUTINE.
*
** PURPOSE -
*         CHANGE RETURN JUMP TO *CIO* INSTRUCTIONS TO
*         RETURN JUMP TO *DIO* INSTRUCTIONS, OR
*         IF CYBER 930, TO RETURN JUMP TO *ICI* INSTRUCTIONS.
*
** INPUT -
*         TRJCIO = TABLE OF INSTRUCTIONS TO MODIFY.
*
** OUTPUT - NONE.
*
** CALLS - FCN.
*
** USES - T1, T2.

 XIO2     BSS    0
          LDML   XIOA
          LMC    DIO
          NJN    XIOX        IF NOT CY170 DMA CHANNEL I/O ROUTINE
          LDK    FC.AMC      MASTER CLEAR DMA ADAPTER FUNCTION
          RJM    FCN

 XIOX     BSS    0
 XIO      SUBR               ENTRY/EXIT
          LDK    0
          STDL   T1
 XIO1     LDML   TRJCIO,T1   ADRS+1 OF RETURN JUMP TO CIO INSTRUCTION
          ZJN    XIO2        END OF LIST
          STDL   T2
          LDC    DIO         ADDRESS OF SUBROUTINE FOR CENTRAL MEMORY I/O
 XIOA     EQU    *-1         (*ICI* IF CY930)

          STIL   T2
          AODL   T1
          UJK    XIO1        CHANGE NEXT

*         TABLE OF RETURN JUMP TO *CIO* INSTRUCTION ADDRESS+1.
*         (GENERATED VIA *PAGEIO* MACRO)

 TRJCIO   BSS    0
 TCIO     HERE
          CON    0


          ERRPL  *-PPMSZ-1

          END    ESMD
