          IDENT  SDPD
          CIPPU
          MEMSEL 16
          TITLE  SDPD - NOS/VE STORNET/ESM SDP PP DRIVER
*
*         WORD 6 OF THE FOLLOWING COMMENT MUST BE A REVISION NUMBER
*         FOR CTI.
*
          COMMENT *SMD* LVL=01
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC. 1992
*
*         THIS IS THE PP DRIVER THAT SUPPORTS SIDE DOOR PORT ACCESS
*         TO STORNET/ESM. THIS DRIVER ASSUMES THAT THE CHANNEL CABLED TO
*         THE SIDE DOOR PORT IS A CYBER 170 CHANNEL. THIS DRIVER SUPPORTS
*         BOTH THE I4 AND I0 IOU'S. LOCATIONS 72-73 MUST CONTAIN THE RMA
*         OF THE PP INTERFACE TABLE AND LOCATION 0 MUST CONTAIN THE
*         STARTING ADDRESS MINUS ONE, AT WHICH EXECUTION BEGINS.
*
          LIST   -$
*COPYC IODMAC1
*COPYC IODMAC2
*COPYC IODMAC3
*COPYC IODMAC4

          LIST   B,L,N,R,G
          EJECT
*
*         GENERAL EQUATES
*
 UPKBFL   EQU    123B        LENGTH OF UNPACKED DATA BUFFER
 PKBFL    EQU    100B        LENGTH OF PACKED ERROR DATA BUFFER
 BUFFCM   EQU    21B         LENGTH OF PACKED BUFFER (CM WORDS)
 DC       EQU    22B         CHANNEL EQUATE FOR I/O INSTRUCTIONS
 PPNORM   EQU    1           NORMAL PP RESPONSE CODE
*
*         ERROR CODE EQUATES
*
 ER.CAE   EQU    2           CHANNEL ACTIVE ON ENTRY
 ER.NIF   EQU    3           NO INACTIVE TO FUNCTION
 ER.LDI   EQU    4           LOST DATA ON INPUT
 ER.CPE   EQU    5           CHANNEL PARITY ERROR ON INPUT
 ER.CNE   EQU    6           CHANNEL NOT EMPTY
 ER.CLE   EQU    7           CHANNEL LOCKWORD ERROR
*
*      SDP FUNCTION EQUATES
*
 FRSR     EQU    1040B       READ STATUS BITS REGISTERS
 FCLR     EQU    1203B       CLEAR SIDE DOOR PORT STATUS
 FREL     EQU    1010B       READ ERROR LOG
 FCEL     EQU    1011B       RESET ERROR LOG
 DCSP     EQU    1000B       DATA - SELECT CLEAR SDP STATUS
*
*      CYBER 930 ICI/C170 CHANNEL CONVERTER FUNCTION EQUATES
*
 ICI.DES  EQU    100000B     DESELECT C170 CHANNEL CONVERTER
 ICI.SEL  EQU    170000B     SELECT C170 CHANNEL CONVERTER
 ICI.12B  EQU    120000B     SET 12 BIT MODE

          SPACE  6
**
*         PPIT MEMORY MAP (SHOWS INFO ACCESSED BY SDPD)
*
*                  1 1          3 3          4 4 4 5 5 .. 6
*       0          5 6          1 2          7 8 9 0 1 .. 3
*      +------------+------------+------------+-+-+-+-+--+-+
*      |            |////////////|////////////|A|I|R|P|//|L|
* WD00 | PP NUMBER  |////////////|////////////|C|D|E|P|//|C|
*      |            |////////////|////////////|T|L|S|I|//|K|
*      +------------+------------+------------+-+-+-+-+--+-+
* WD01 |/////////////////////////|   CHANNEL TABLE RMA     |
*      +------------+------------+-------------------------+
* WD02 |////////////|////////////|   CM COMM BUFFER RMA    |
*      +-------------------------+-------------------------+
*
*         DEFINITIONS:
*          PP NUMBER  = LOGICAL PP NUMBER OF SDPD PP
*          ACT        = ACTIVE CHECK FLAG
*          IDL        = IDLE REQUEST FLAG
*          RES        = RESUME REQUEST FLAG
*          PPI        = PP IDLE STATUS FLAG
*          LCK        = LOCK FLAG

**
*         PP INTERFACE TABLE
 PIT      RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT
 UNITC    PPWORD             NUMBER OF UNITS
 ACTCH    BOOLEAN            ACTIVE CHECK, THE PP CLEARS THIS BIT WITHIN 1 MINUTE
 IDLREQ   BOOLEAN            IDLE REQUEST
 RESREQ   BOOLEAN            RESUME REQUEST
 PPIDLE   BOOLEAN            PP IDLE
          SUBRANGE 0,3777B   UNUSED
 LOCK     BOOLEAN            PP TABLE LOCK
 INT      RMA                INTERRUPT WORD (RMA)
 CHAN     RMA                CHANNEL TABLE (RMA)
          ALIGN  16,64
 CBUFL    PPWORD             COMMUNICATION BUFFER LENGTH
 CBUF     RMA                COMMUNICATION BUFFER (RMA)
 PIT      RECEND

          SPACE  10
**
*                CM COMMUNICATION BUFFER MAP
*
*      +------------+------------+-----------+------------+
* WD00 | CPU STATUS |  IOU TYPE  |  CHANNEL  |  0 0 0 0   |
*      +------------+-+----------+-----------+-+----------+
*      |            |C|          |           |C|          |
* WD01 | PPU STATUS |P| PP NUM.  |  IOU NUM. |C| CHANNEL  |
*      |            |P|          |           |H|          |
*      +------------+-+----------+-----------+-+----------+
* WD02 |                                                  |
*   :  |                  ERROR LOG DATA                  |
* WD16 |                                                  |
*      +---------------------------+----------------------+
* WD17 |   ERROR LOG DATA(36BITS)  |   000000000(28BITS)  |
*      +------------+--------------+----------------------+
* WD18 |  0 0 0 0   |    SIDE DOOR PORT STATUS(48BITS)    |
*      +------------+-------------------------------------+
*
*         DEFINITIONS:
*          CPU STATUS = 0000 CM BUFFER NOT INITIALIZED
*                       0001 CM BUFFER INITIALIZED
*          IOU TYPE       = 0000 IF I0 IOU
*                           0001 IF NON-I0 IOU
*          CHANNEL        = SIDE DOOR PORT CHANNEL NUMBER
*          PPU STATUS     = 0001 NORMAL COMPLETION STATUS
*                           0002 CHANNEL ACTIVE ON ENTRY ERROR
*                           0003 NO INACTIVE TO FUNCTION ERROR
*                           0004 LOST DATA ON INPUT ERROR
*                           0005 CHANNEL PARITY ERROR ON INPUT
*                           0006 CHANNEL NOT EMPTY ERROR
*                           0007 CHANNEL LOCKWORD ERROR
*          CPP            = 1 IF CIO PP
*                           0 IF NIO PP
*
*          PP             = PHYSICAL PP NUMBER FOR SDP DRIVER
*          IOU            = IOU NUMBER
*          CCH            = 1 IF CIO CHANNEL
*                           0 IF NIO CHANNEL
*          ERROR LOG DATA = 123(8) 12 BIT PP WORDS OF ERROR DATA
*          SDP STATUS     = 4 12 BIT PP WORDS OF SDP STATUS
*

**
*         CM COMMUNICATION RECORD STRUCTURE
*
 CB       RECORD PACKED

*         CB - WORD1
*
          ALIGN  0,64
 CPSTAT   BOOLEAN            1=COMMUNICATION BUFFER HAS BEEN INITIALIZED
          ALIGN  16,64
 IOUTYP   PPWORD             0=I0, 1=I4
 CHAN     PPWORD             LOGICAL CHANNEL NUMBER OF SDP

*         CB - WORD 2
*
          ALIGN  0,64
 PPSTAT   PPWORD             PP REQUEST STATUS
 CONPP    BOOLEAN            1=I4 CONCURRENT PP
          SUBRANGE 0,777B    UNUSED BITS
 PPNUM    SUBRANGE 0,77B     LOGICAL PP NUMBER OF PP USED TO ACCESS SDP
          SUBRANGE 0,1777B   UNUSED BITS
 IOUNO    SUBRANGE 0,77B     IOU NUMBER THAT SDP IS CONNECTED TO
 CONCH    BOOLEAN            1=CONCURRENT CHANNEL
          SUBRANGE 0,777B    UNUSED BITS
 CHNUM    SUBRANGE 0,77B     LOGICAL CHANNEL NUMBER OF SDP

*         CB - WORDS 3-18
*
 DATA     STRUCT   175B      15+ CM WORDS FOR ERROR LOG DATA

*         CB - WORD 19
*
          ALIGN    16,64
 STAT     STRUCT   6         RESERVE 48 BITS FOR SDP STATUS

 CB       RECEND

          EJECT
          CON    MAIN-1

* DIRECT CELLS

 T1       BSSZ   1
 T2       BSSZ   1
 T3       BSSZ   1
 T4       BSSZ   1
 T5       BSSZ   1
 T6       BSSZ   1
 T7       BSSZ   1
 T8       BSSZ   1

 CMADR    BSSZ   3           CENTRAL MEMORY ADDRESS
 IOUTYP   BSSZ   1           TYPE OF IOU, 0=I0 1=NON-I0
 PPNO     BSSZ   1           LOGICAL PP NUMBER FROM PPIT
 CHAN     BSSZ   1           SIDE DOOR PORT CHANNEL NUMBER
 WC       BSSZ   1           WORD COUNT FOR DATA TRANSFER
 WD       BSSZ   1           WORD COUNT FOR CM TRANSFER

 FNC      BSSZ   1           FUNCTION CODE (INTERNAL)
 LF       BSSZ   1           LAST FUNCTION
 IDLE     BSSZ   1           NONZERO IF IDLE COMMAND RECEIVED,
                             RESUME COMMAND RESETS IT TO 0
 CLF      DATA   1           CHANNEL LOCK FLAG, 0 IF LOCK SET
 ERRCODE  BSSZ   1

* REFORMATTED CENTRAL MEMORY ADDRESSES
          ORG    50B
 CM.PPIT  BSSZ   3           CM ADDRESS OF PP INTERFACE TABLE
 CM.CIT   BSSZ   3           CM ADDRESS OF CHANNEL INTERLOCK TABLE
 CM.CMB   BSSZ   3           CM ADDRESS OF CM COMMUNICATIONS BUFFER

* LOCATIONS 72-73B CONTAIN PPIT RMA AT TIME PP IS LOADED
          ORG    72B
 PITRMA   BSSZ   2

          EJECT
          ORG    100B
          TITLE  MAIN LOOP
** NAME    - MAIN
*
** PURPOSE - SDPD EXECUTION CONTROL
*
** ENTRY   - NONE
*
** EXIT    - NONE
*
 MAIN     BSS
          RJM    INIT        PP INITIALIZATION

          RJM    SCLOCK      SET CHANNEL LOCK
          LDD    IOUTYP
          NJN    MAIN5       IF NOT I0 IOU
          RJM    SEL         SELECT CYBER ICI/C170 CHANNEL CONVERTER
 MAIN5    RJM    RDSTAT      READ SIDE DOOR PORT STATUS
          RJM    CSDP        CLEAR SIDE DOOR PORT STATUS
          RJM    PKSTAT      PACK STATUS DATA
          RJM    RDLOG       READ SIDE DOOR PORT ERROR LOG
          RJM    RELOG       RESET ERROR LOG
          LDD    IOUTYP
          NJN    MAIN10      IF NOT I0 IOU
          RJM    DESEL       DESELECT ICI/C170 CHANNEL CONVERTER
 MAIN10   RJM    CCLOCK      CLEAR CHANNEL LOCK
          RJM    PKLOG       PACK ERROR LOG DATA
          RJM    TRCMB       TRANSFER DATA TO CM COMM BUFFER
          LDK    PPNORM      NORMAL PP COMPLETION STATUS
          RJM    PPSTAT      REPORT PP STATUS

 MAIN20   RJM    PPRQ        SCAN PP REQUEST QUEUE
 MAIN35   UJK    MAIN20      HANG IN SCAN LOOP

          EJECT
          TITLE  SUBROUTINES
** NAME    - CCLOCK
*
** PURPOSE - CLEARS CHANNEL LOCK.
*
** ENTRY   - NONE
*
** EXIT    - CHANNEL LOCK CLEARED
*
 CCLOCK   SUBR               SUBROUTINE ENTRY/EXIT
          LDC    CM.CIT      CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          STDL   CLF         CHANNEL LOCK FLAG
          LDDL   CHAN        CHANNEL NUMBER = OFFSET IN TABLE
          STDL   T5
          RJM    CLOCK       CLEAR CHANNEL LOCKWORD
          RETURN             EXIT

          SPACE  5,20
** NAME    - CHGCH
*
** PURPOSE - SET CHANNEL NUMBER IN CHANNEL INSTRUCTIONS
*
** ENTRY   - (CHAN) = CHANNEL NUMBER
*
** EXIT    - CHANNEL IN ALL I/O INSTRUCTIONS SET TO SDP
*            CHANNEL NUMBER.
*
 CHGCH    SUBR               SUBROUTINE ENRTY/EXIT
          LDN    0
          STDL   T1          CHANGE DISK CHANNEL INSTRUCTIONS
 CHG10    LDML   CHTAB,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          NJK    CHG12       IF MORE INSTRUCTIONS IN TABLE
          RETURN             EXIT
 CHG12    STDL   T2
          LDIL   T2
          SCN    37B
          LMDL   CHAN        CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJK    CHG10

          SPACE  5,20
** NAME    - CLOCK
*
** PURPOSE - CLEAR LOCKWORD
*
** ENTRY   - T7 = POINTER RMA
*            T5 = OFFSET TO LOCKWORD FROM RMA
*
** EXIT    - CHANNEL LOCK CLEARED.
*
 CLOCK    SUBR               SUBROUTINE ENTRY/EXIT
 CLK14    BSS
          LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        RMA OF TABLE
          ADDL   T5          ADD LOCKWORD OFFSET
          STDL   T6
          RDSL   T1          WRITE INTERMEDIATE VALUE
          LDDL   T1
          ADDL   T2
          ADC    -177777B-177777B
          ZJN    CLK14       IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS
          LDDL   PPNO
          SBDL   T4
          ZJN    CLK30       IF LOCK WAS OK
          LDDL   T6
          LMC    400000B     USE R REGISTER
          CWDL   T1          RESTORE THE LOCKWORD
          LDC    ER.CLE      CHANNEL LOCKWORD ERROR
          UJK    ERR         PROCESS ERROR
 CLK30    BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4
          LDDL   T6
          LMC    400000B     USE R REGISTER
          CWDL   T1           CLEAR THE LOCKWORD
          RETURN             EXIT


          SPACE  5,20
** NAME    - CSDP
*
** PURPOSE - CLEAR SIDE DOOR PORT STATUS.
*
** ENTRY   - NONE
*
** EXIT    - SDP STATUS WORDS ARE CLEARED.
*
 CSDP     SUBR               SUBROUTINE ENTRY/EXIT
 CSDP2    LDK    FCLR        FUNCTION CODE TO CLEAR
                             (PLUS ICI.12B IF CYBER 930)
          RJM    FAN         SEND FUNCTION CODE
          NJK    CSDP5       IF FUNCTION ACCEPTED
          LDK    ER.NIF      NO INATIVE TO FUNCTION
          UJK    ERR         PROCESS ERROR CODE
 CSDP5    LDK    DCSP        SELECT SDP CLEAR
          ACN    DC
          OAN    DC
          RJM    WCE         WAIT FOR CHANNEL EMPTY
          NJK    CSDP10      IF EMPTY RECEIVED
          LDK    ER.CNE      CHANNEL NOT EMPTY
          UJK    ERR         PROCESS ERROR CODE
 CSDP10   DCN    DC+40B      DEACTIVATE CHANNEL
          RETURN             EXIT

          SPACE  5,20
** NAME    - DESEL
*
** PURPOSE - DELSELECT THE CHANNEL CONVERTER ON CYBER 930
*
** ENTRY   - NONE
*
** EXIT    - CYBER 930 CHANNEL CONVERTER DESELECTED
*
 DESEL    SUBR               SUBROUTINE ENTRY/EXIT
          LDK    ICI.DES     DESELECT CHANNEL CONVERTER
          RJM    FAN         SEND FUNCTION
          NJN    DESEL10     IF FUNCTION ACCEPTED
          LDK    ER.NIF      NO INACTIVE TO FUNCTION
          UJK    ERR
 DESEL10  RETURN             EXIT

          SPACE  5,20
** NAME    - ERR
*
** PURPOSE - PROCESS DRIVER ERRORS
*
** ENTRY   - (A) = ERROR CODE
*
** EXIT    - PP STATUS WORD IN CM = ERROR CODE
*
 ERR      SUBR               SUBROUTINE ENTRY/EXIT
          STDL   ERRCODE
          LDDL   CLF         CHANNEL LOCK FLAG
          NJK    ERR5        IF CHANNEL NOT LOCKED
          DCN    DC+40B      UNCONDITIONALLY DISCONNECT CHANNEL
          RJM    CCLOCK      CLEAR CHANNEL LOCK
 ERR5     LDDL   ERRCODE
          RJM    PPSTAT      SET ERROR CODE IN PP STATUS WORD
          UJK    MAIN20      GOTO PP REQ LOOP

          SPACE  5,20
** NAME    - FAN
*
** PURPOSE - SEND A FUNCTION TO THE IPI CHANNEL, BUT DONT
*            PUT THE FUNCTION IN THE FUNCTION HISTORY TABLE
*
** ENTRY   - (A) = FUNCTION CODE
*
** EXIT    - FUNCTION CODE SENT TO SDP.
*
 FAN      SUBR               SUBROUTINE ENTRY/EXIT
          STDL   LF          CAPTURE LAST FUNCTION
          DCN    DC+40B      ENSURE THE CHANNEL IS INACTIVE
          FAN    DC          SEND THE FUNCTION
          RJM    IJM         WAIT FOR INACTIVE
          RETURN             EXIT

          SPACE  5,20
** NAME    - FORMA
*
** PURPOSE - FORMAT A CM REAL MEMORY ADDRESS.
*
** ENTRY   - A REGISTER- IS THE ADDRESS OF A 2-WORD CM BYTE ADDRESS.
*
** EXIT    - CMADR IS THE ADDRESS OF THE RESULTING 3-WORD REFORMATED
*            CM ADDRESS.  THE FORMAT CAN BE USED BY THE LOADC MACRO.
*            ADDRESS - WORD 0, BITS 0-13 AND
*                      WORD 1, BITS 3-15, ARE REFORMATTED TO-
*            CMADR   - WORD 0, BITS 0-9,
*                      WORD 1, BITS 0-11,
*                      WORD 2, BITS 0-5.
*
 FORMA    SUBR               ENTRY/EXIT
          STDL   T1

* REFORMAT CM ADDRESS.

          LDML   1,T1
          LPN    7
          NJN    *           RMA ADDRESS ERROR, TEMPORARY HALT
          LDIL   T1
          LPN    37B
          SHN    16
          LMML   1,T1
          SHN    9
          STD    CMADR+1
          SHN    6
          LPN    77B
          STDL   CMADR+2
          LDIL   T1
          SHN    -5
          STD    CMADR
          LRD    CMADR
          LDDL   CMADR+2
          LMC    400000B
          RETURN             EXIT

          SPACE  5,20
** NAME    - IJM
*
** PURPOSE - WAIT FOR THE INACTIVE TO BE SENT BACK ON
*            THE CHANNEL.
*
** ENTRY   - NONE
*
** EXIT    - (A) = NONZERO IF INACTIVE RECEIVED
*            (A) = ZERO IF NO INACTIVE
*
 IJM      SUBR               SUBROUTINE ENTRY/EXIT
          LCN    3
 IJM5     IJM    IJM10,DC    IF INACTIVE, EXIT
          SBN    1
          NJN    IJM5        IF NOT TIMED OUT
 IJM10    RETURN             EXIT

          SPACE  5,20
** NAME    - LOCK
*
** PURPOSE - SET THE LOCKWORD
*
** ENTRY   - T7 = POINTER RMA
*            T5 = OFFSET TO LOCKWORD FROM RMA
*
** EXIT    - A = 0 IF LOCK SUCCESSFULLY SET
*
 LOCK     SUBR               SUBROUTINE ENTRY/EXIT
 LOCK1    BSS
          LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        CIT/PPIT TABLE ADDRESS
          ADDL   T5          ADD LOCKWORD OFFSET, SAVE CM ADDRESS
          STDL   T6          SAVE CM ADDRESS
          RDSL   T1          WRITE INTERMEDIATE VALUE
          LDDL   T1
          ZJN    LOCK5       IF LOCK COULD BE SET
          ADDL   T2
          ADC    -177777B-177777B
          ZJK    LOCK1       IF INTERMEDIATE VALUE
          LDDL   T2
          LPC    77777B
          ADC    100000B
          STDL   T2          SET THE VE BIT
          LDDL   T6
          LMC    400000B     USE R REGISTER
          CWDL   T1          RESTORE THE LOCKWORD WITH THE VE BIT
          LDDL   T4
          SBDL   PPNO        CHECK IF LOCK ALREADY SET
          NJN    LOCK3       IF LOCK COULD NOT BE SET, EXIT A .NE. 0
          LDDL   T1
          ADC    -100000B
 LOCK3    RETURN             EXIT
 LOCK5    BSS
          LDC    100000B
          STDL   T1
          LDN    0
          STDL   T2
          STDL   T3
          LDDL   PPNO
          STDL   T4
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B     USE R REGISTER
          CWDL   T1          SET THE LOCKWORD
          LDN    0
          UJK    LOCK3       GOTO EXIT WITH A=0

          SPACE  5,20
** NAME    - PKLOG
*
** PURPOSE - TAKES 4 12 BIT PP WORDS FROM UNPACKED BUFFER
*            BUFFER AND PACKS IT INTO 3 16 BIT PP WORDS.
*
** ENTRY   - UNPACKED BUFFER CONTAINS ERROR LOG DATA.
*
** EXIT    - PACKED BUFFER CONTAINS ERROR LOG DATA
*
 PKLOG    SUBR               SUBROUTINE ENTRY/EXIT
          LDN    0
          STDL   T1
          STDL   T2
          LDN    25B         INTERATION COUNT
          STDL   T3
 PKLOG5   BSS                LOOP ENTRY POINT
          LDM    UPKBFWA,T1
          SHN    4
          STML   PKBDAT,T2         |    A12     |XXXX|
          LDM    UPKBFWA+1,T1
          SHN    -8
          RAML   PKBDAT,T2         |    A12     | B4 |
          LDM    UPKBFWA+1,T1
          LPK    377B
          SHN    8
          STML   PKBDAT+1,T2       |   B8   |XXXXXXXX|
          LDM    UPKBFWA+2,T1
          SHN    -4
          RAML   PKBDAT+1,T2       |   B8   |   C8   |
          LDM    UPKBFWA+2,T1
          LPN    17B
          SHN    12
          STML   PKBDAT+2,T2       | C4 |XXXXXXXXXXXX|
          LDM    UPKBFWA+3,T1
          RAML   PKBDAT+2,T2       | C4 |    D12     |
          LDN    4
          RAD    T1          UPDATE UNPACKED BUFFER WORD COUNT
          LDN    3
          RAD    T2          UPDATE PACKED BUFFER WORD COUNT
          SOD    T3          DECREMENT ITERATION COUNT
          NJK    PKLOG5      IF MORE DATA TO PACK
          RETURN             EXIT

          SPACE  5,20
** NAME    - PKSTAT
*
** PURPOSE - PACKS SIDE DOOR PORT STATUS INTO 4 16 BIT
*            WORDS. THE FIRST 16 BITS ARE ZERO FOLLOWED
*            FOLLOWED BY 48 BITS OF PACKED SIDE DOOR PORT
*            STATUS.
** ENTRY   - UNPACKED BUFFER CONTAINS SIDE DOOR PORT STATUS.
*
** EXIT    - PACKED BUFFER CONTAINS SIDE DOOR PORT STATUS
*
 PKSTAT   SUBR               SUBROUTINE ENTRY/EXIT
          BSS                LOOP ENTRY POINT
          LDN    0
          STML   PKBSTAT           |00000000|00000000| WORD1
          LDM    UPKBFWA
          SHN    4
          STML   PKBSTAT+1         |    A12     |XXXX|
          LDM    UPKBFWA+1
          SHN    -8
          RAML   PKBSTAT+1         |    A12     | B4 | WORD2
          LDM    UPKBFWA+1
          LPK    377B
          SHN    8
          STML   PKBSTAT+2         |   B8   |XXXXXXXX|
          LDM    UPKBFWA+2
          SHN    -4
          RAML   PKBSTAT+2         |   B8   |   C8   | WORD3
          LDM    UPKBFWA+2
          LPN    17B
          SHN    12
          STML   PKBSTAT+3         | C4 |XXXXXXXXXXXX|
          LDM    UPKBFWA+3
          RAML   PKBSTAT+3         | C4 |    D12     | WORD4
          RETURN             EXIT

          SPACE  5,20
** NAME    - PPRQ
*
** PURPOSE - CHECK FOR ANY PP REQUESTS ON THE PP QUEUE.
*
*                             +----+----+----+-----+
** ENTRY   - WORD 0 OF PPIT = |PPNO|FLUN|NOUN|FLAGS|
*                             +----+----+----+-----+
*              WHERE PPNO IS: LOGICAL PP NUMBER
*                    FLUN IS: FIRST LOGICAL UNIT
*                    NOUN IS: NUMBER OF UNITS
*                  FLAGS ARE: BIT 15 = ACTIVE CHECK
*                             BIT 14 = IDLE REQUEST
*                             BIT 13 = RESUME REQUEST
*                             BIT 12 = PP IDLE STATUS
*                             BIT 11
*                                :
*                             BIT 01 = UNUSED
*                             BIT 00 = LOCK
*
** EXIT    - FLAGS HAVE BEEN CHECKED/CHANGED AS APPROPRIATE
*
 PPRQ     SUBR               SUBROUTINE ENTRY/EXIT
          LCN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDC    0#7FFF
          STDL   T4
          LOADC  CM.PPIT     CM ADDRESS OF PP INTERFACE TABLE
          RDCL   T1          CLEAR ACTIVE CHECK BIT, READ PPIT WORD 1
          LDDL   T4
          SHN    /PIT/L.IDLREQ+2
          MJN    PPRQ10      IF IDLE REQUEST
          SHN    /PIT/L.RESREQ-/PIT/L.IDLREQ
          MJK    PPRQ5       IF RESUME
          RETURN             EXIT
 PPRQ5    RJM    SPLOCK      SET PP TABLE LOCK
          LDDL   T4
          LPC    0#4FFE      CLEAR ACTIVE CHECK BIT, RESUME REQUEST BIT,
          STDL   T4           IDLE STATUS BIT, AND LOCK BIT IN PP
          LDDL   CM.PPIT+2    INTERFACE TABLE
          LMC    400000B     USE R REGISTER
          CWDL   T1
          UJK    MAIN20      RESUME RECEIVED - EXIT
 PPRQ10   BSS
          RJM    SPLOCK      SET PP TABLE LOCK
          LOADC  CM.PPIT     CM ADDRESS OF PP INTERFACE TABLE
          CRDL   T1
          LDDL   T4          CLEAR ACTIVE CHECK BIT, IDLE REQUEST BIT,
          LPC    0#2FFE       AND SET IDLE STATUS BIT
          LMC    0#1000
          STDL   T4
          LDDL   CM.PPIT+2
          LMC    400000B     USE R REGISTER
          CWDL   T1
 PPRQ20   BSS
          RJM    PPRQ        WAIT FOR RESUME
          UJN    PPRQ20

          SPACE  5,20
** NAME    - PPSTAT
*
** PURPOSE - SETS PP STATUS WORD IN COMMUNICATION BUFFER
*
** ENTRY   - (A) = PP STATUS WORD
*
** EXIT    - PP STATUS SET TO NORMAL COMPLETION OR ERROR CODE
*
 PPSTAT   SUBR               SUBROUTINE ENTRY/EXIT
          STDL   T1          PP STATUS
          LDN    1
          STD    WD
          LOADC  CM.CMB
          ADN    /CB/C.PPSTAT INDEX TO CM WORD FOR PP STATUS
          CRML   CMDATA,WD    READ CM WORD
          LDDL   T1
          STML   CMDATA       SET PP STATUS
          LDN    1
          STD    WD
          LOADC  CM.CMB
          ADN    /CB/C.PPSTAT INDEX TO CM WORD WHICH CONTAINS PP STATUS
          CWML   CMDATA,WD    WRITE WORD BACK TO CM
          RETURN

          SPACE  5,20
** NAME    - RDLOG
*
** PURPOSE - RETRIEVE DATA FROM SDP ERROR LOG
*
** ENTRY   - NONE
*
** EXIT    - UNPACKED ERROR LOG HAS CONTAINS SDP ERROR LOG DATA
*
 RDLOG    SUBR               SUBROUTINE ENTRY/EXIT
          IJM    RDLOG5,DC   IF CHANNEL INACTIVE
          LDK    ER.CAE      CHANNEL ACTIVE ON ENTRY
          UJK    ERR         PROCESS ERROR
 RDLOG5   LDK    FREL        FUNCTION CODE READ ERROR LOG
                             (PLUS ICI.12B IF CYBER 930)
          RJM    FAN         SEND FUNCTION
          NJN    RDLOG10     IF FUNCTION ACCEPTED
          LDK    ER.NIF      NO INACTIVE TO FUNCTION
          UJK    ERR         PROCESS ERROR
 RDLOG10  ACN    DC+40B
          LDK    123B
          IAM    UPKBFWA,DC  INPUT ERROR LOG DATA
          DCN    DC+40B
          ZJN    RDLOG20     IF ALL WORDS INPUT
          LDK    ER.LDI      LOST DATA ON INPUT
          UJK    ERR
 RDLOG20  SFM    RDLOG30,DC  CHECK FOR CHANNEL PARITY ERROR
          RETURN             EXIT
 RDLOG30  LDK    ER.CPE      PARITY ERROR ON DATA INPUT
          UJK    ERR         PROCESS ERROR

          SPACE  5,20
** NAME    - RELOG
*
** PURPOSE - RESET ERROR LOG
*
** ENTRY   - NONE
*
** EXIT    - ERROR LOG RESET
*
 RELOG    SUBR               SUBROUTINE ENTRY/EXIT
          LDK    FCEL        FUNCTION CODE TO RESET ERROR LOG
          RJM    FAN         SEND FUNCTION CODE
          NJK    RELOG5      IF FUNCTION ACCEPTED
          LDK    ER.NIF      NO INACTIVE TO FUNCTION
          UJK    ERR         PROCESS ERROR CODE
 RELOG5   RETURN             EXIT

          SPACE  5,20
** NAME    - RDSTAT
*
** PURPOSE - RETRIEVE STATUS FROM THE SIDE DOOR PORT
*
** ENTRY   - NONE
*
** EXIT    - UNPACKED ERROR LOG CONTAINS SDP STATUS
*
 RDSTAT   SUBR               SUBROUTINE ENTRY/EXIT
          IJM    RDSTAT5,DC  IF CHANNEL INACTIVE
          LDK    ER.CAE      CHANNEL ACTIVE ON ENTRY
          UJK    ERR         PROCESS ERROR
 RDSTAT5  LDK    FRSR        FUNCTION CODE READ STATUS BITS
                             (PLUS ICI.12B IF CYBER 930)
          RJM    FAN         SEND FUNCTION
          NJN    RDSTAT10    IF FUNCTION ACCEPTED
          LDK    ER.NIF      NO INACTIVE TO FUNCTION
          UJK    ERR
 RDSTAT10 ACN    DC+40B
          LDN    4
          IAM    UPKBFWA,DC  INPUT SDP STATUS
          DCN    DC+40B
          ZJN    RDSTAT20    IF ALL WORDS INPUT
          LDK    ER.LDI      LOST DATA ON INPUT
          UJK    ERR
 RDSTAT20 SFM    RDSTAT30,DC CHECK FOR CHANNEL PARITY ERROR
          RETURN             EXIT
 RDSTAT30 LDK    ER.CPE      CHANNEL PARITY ERROR ON INPUT
          UJK    ERR

          SPACE  5,20
** NAME    - SCLOCK
*
** PURPOSE - SETS THE CHANNEL LOCK.
*
** ENTRY   - NONE
*
*  EXIT    - CHANNEL LOCK HAS BEEN SET
*
 SCLOCK   SUBR               SUBROUTINE ENTRY/EXIT
 SCL30    BSS
          LDC    CM.CIT      CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          LDDL   CHAN        CHANNEL NUMBER IS OFFSET IN TABLE
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJN    SCL30       IF LOCK WAS NOT SET
          STDL   CLF         CLEAR CHANNEL LOCK FLAG
          RETURN             EXIT, LOCK WAS SET

          SPACE  5,20
** NAME    - SEL
*
** PURPOSE - SELECT THE CHANNEL CONVERTER ON CYBER 930
*
** ENTRY   - NONE
*
** EXIT    - CYBER 930 CHANNEL CONVERTER SELECTED
*
 SEL      SUBR               SUBROUTINE ENTRY/EXIT
          IJM    SEL5,DC     IF CHANNEL INACTIVE
          LDK    ER.CAE      CHANNEL ACTIVE ON ENTRY
          UJK    ERR         PROCESS ERROR
 SEL5     LDK    ICI.SEL+FRSR  FUNCTION CODE SELECT CONVERTER
                               (FRSR CONCANTENATED TO ICI.SEL
                                TO INSURE INACTIVE RETURNED)
          RJM    FAN         SEND FUNCTION
          NJN    SEL10       IF FUNCTION ACCEPTED
          LDK    ER.NIF      NO INACTIVE TO FUNCTION
          UJK    ERR
 SEL10    ACN    DC+40B
          LDN    3
          IAM    UPKBFWA,DC  INPUT SDP STATUS (THROW AWAY)
          DCN    DC+40B
          RETURN             EXIT

          SPACE  5,20
** NAME    - SPLOCK
*
** PURPOSE - SETS THE PP TABLE LOCK IN THE
*            PP INTERFACE TABLE.
*
** ENTRY   - NONE
*
** EXIT    - PPIT LOCK HAS BEEN SET
*
*
 SPLOCK   SUBR               SUBROUTINE ENTRY/EXIT
 SPLOCK4  BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDN    1
          STDL   T4
          LOADC  CM.PPIT     CM ADDRESS OF PP INTERFACE TABLE
          RDSL   T1          ATTEMPT TO SET PP TABLE LOCK
          LDDL   T4
          LPN    1
          NJK    SPLOCK4     IF LOCK NOT SET
          RETURN             EXIT WITH LOCK SET

          SPACE  5,20
** NAME    - TRCMB
*
** PURPOSE - TRANSFER PACKED BUFFER TO CM COMMUNICATION BUFFER.
*
** ENTRY   - PACKED BUFFER CONTAINS ERROR LOG DATA
*
** EXIT    - CM BUFFER CONTAINS ERROR LOG DATA
*
 TRCMB    SUBR               SUBROUTINE ENTRY/EXIT
          LDK    BUFFCM      LENGTH OF ERROR DATA+STATUS
          STD    WD
          LOADC  CM.CMB
          ADN    /CB/C.DATA  INDEX TO FWA OF ERROR LOG DATA FIELD
          CWML   PKBDAT,WD   WRITE ERROR LOG/STATUS TO CM
          RETURN             EXIT

          SPACE  5,20
** NAME    - WCE
*
** PURPOSE - WAIT FOR THE CHANNEL TO GO EMPTY
*
** ENTRY   - NONE
*
** EXIT    - (A) = NONZERO IF CHANNEL EMPTY
*            (A) = ZERO IF NO EMPTY RECEIVED
*
 WCE      SUBR               SUBROUTINE ENTRY/EXIT
          LCN    3
 WCE5     EJM    WCE10,DC    IF CHANNEL EMPTY - EXIT
          SBN    1
          NJN    WCE5        IF NOT TIMED OUT
 WCE10    RETURN             EXIT

          SPACE  5,20
** NAME    - WCF
*
** PURPOSE - WAIT FOR THE CHANNEL TO GO FULL.
*
** ENTRY   - NONE
*
** EXIT    - (A) = NONZERO IF CHANNEL EMPTY
*            (A) = ZERO IF NO EMPTY RECEIVED
*
 WCF      SUBR               SUBROUTINE ENTRY/EXIT
          LCN    3
 WCF5     FJM    WCF10,DC    IF CHANNEL FULL - EXIT
          SBN    1
          NJN    WCF5        IF NOT TIMED OUT
 WCF10    RETURN             EXIT

          SPACE  5,20
**
* EQUATES FOR BUFFER LOCATIONS
*
 UPKBFWA  EQU    *               UNPACKED BUFFER FWA
 PPTBL    EQU    UPKBFWA         TEMP LOCATION FOR PPIT
 PKBDAT   EQU    UPKBFWA+UPKBFL  PACKED BUFFER ERROR LOG DATA
 PKBSTAT  EQU    PKBDAT+PKBFL    PACKED BUFFER SDP STATUS
 BUFFL    EQU    UPKBFL+PKBFL+4  LENGTH OF BUFFER AREA

          ORG    *+BUFFL         ALLOCATE BUFFER SPACE
 CMDATA   BSSZ   4               BUFFER SPACE FOR 1 CM WORD

          SPACE  5,20
          TITLE  INITIALIZATION
** NAME    - INIT
*
** PURPOSE - INITIALIZE THE DRIVER
*
** ENTRY   - NONE
*
** EXIT    - PP IS INITIALIZED
*
 INIT     SUBR               SUBROUTINE ENTRY/EXIT
          REFAD  PITRMA,CM.PPIT  REFORMAT ADDRESS OF PP INTERFACE TABLE
                                 AND SAVE IN CM.PPIT
          LDK    BUFFL       LENGTH OF BUFFERS
          STDL   T1
 INIT4    BSS                                                                  *

* ZERO DATA BUFFERS

          LDN    0
          STML   UPKBFWA,T1  ZERO OUT BUFFERS
          SODL   T1
          NJN    INIT4

* PICK UP CM STRUCTURE POINTERS

          LDN    C.PIT
          STDL   WD
          LOADC  CM.PPIT     LOAD CM ADDRESS OF PP INTERFACE TABLE
          CRML   PPTBL,WD    READ PP INTERFACE TABLE
          LDML   PPTBL+/PIT/P.PPNO   GET PP NUMBER
          STDL   PPNO
          REFAD  PPTBL+/PIT/P.CHAN,CM.CIT  REFORMAT CM ADDRESS OF CHANNEL
                                            TABLE AND SAVE IN CM.CIT
          REFAD  PPTBL+/PIT/P.CBUF,CM.CMB  REFORMAT ADDRESS OF COMMUNICATION
                                           BUFFER AND SAVE IN CM.CMB

* WAIT FOR CM COMMUNICATIONS BUFFER INITIALIZATION

 INIT8    BSS
          LDN    1
          STD    WD
          LOADC  CM.CMB
          CRML   CMDATA,WD   READ FIRST WORD OF CM COMM BUFFER
          LDML   CMDATA+/CB/P.CPSTAT
          ZJK    INIT8       IF INITIALIZATION NOT COMPLETE

* PICK UP IOU AND CHANNEL INFORMATION

          LDML   CMDATA+/CB/P.IOUTYP
          STDL   IOUTYP      TYPE OF IOU 0=I0 1=NON-I0
          LDML   CMDATA+/CB/P.CHAN
          STDL   CHAN        SIDE DOOR PORT CHANNEL NUMBER

* MODIFY CODE THAT IS IOU DEPENDENT

          LDDL   IOUTYP
          NJN    INIT15      IF NOT I0 IOU
          LDK    ICI.12B/10000B
          RAML   RDSTAT5
          STML   RDLOG5
          STML   CSDP2

* PLUG CHANNEL INSTRUCTIONS WITH SDP CHANNEL

 INIT15   RJM    CHGCH       CHANGE CHANNEL IN I/O INSTRUCTIONS

          RETURN             EXIT PP INITIALIZATION

 CHTAB    BSS    0           CHANNEL TABLE FOR I/O INSTRUCTIONS
 TDC+40B  HERE
 T40B+TDC HERE
 TDC      HERE
          CON    0
          END
/EOR
