*COMDECK,COMPIPI
*CALL,COMSIPI 
 RICHI$   EQU    0
          LIST   -L 
*CALL,COMPCHI 
*CALL,COMPMAC 
          LIST   *
*IF DEF,LISTDOC,1 
          LIST   X
          CTEXT  COMPIPI - IPI COMMON DISK DRIVER 
          BASE   MIXED
*IF -DEF,NOS,4
*IF -DEF,MVE
          IF     -DEF,QUAL$,1 
          QUAL   IPI
*ENDIF
  
          EJECT 
  
*         DIRECT CELL EQUATES 
  
 CHANN    EQU    10B         CURRENT CHANNEL REGISTER 
 CMMSK    EQU    11B         CONTROLLER ADDRESS MASK
 COUNTER  EQU    12B         GENERAL COUNTER
 MAJORST  EQU    13B         MAJOR CONTROLLER STATUS CELL 
 SLAVE    EQU    14B         SHIFTED CONTROLLER BIT-ADDRESS 
 TEMP1    EQU    15B         TEMPORARY SCRATCH REGISTER 
 TEMP2    EQU    16B
 TOWC     EQU    17B         TRANSFER OUT WORD COUNT
 VFW      EQU    20B         VARIABLE FUNCTION WORD 
 RUP      EQU    21B         R-REG UPPER FOR CENTRAL MEMORY TRANSFER
 RLW      EQU    22B         R-REG LOWER ...
 AREG     EQU    23B         A-REG ...
 LOOPCTR  EQU    24B         GENERAL LOOP COUNTER 
 EXPCLI   EQU    25B         EXPECTED CLASS INTERRUPT 
 BURDIR   EQU    26B         BURST DIRECTION FLAG 
 BURBCW   EQU    27B         BURST BUS CONTROL WORD 
 CHGXSM   EQU    30B         CHANGE TRANSFER MODE FLAG
 TSW      EQU    31B         TRANSFER SETTING WORD
 CURTSK   EQU    32B         CURRENT TASK NUMBER
 CURMO    EQU    33B         CURRENT MAJOR OPERATION
 TSFOA    EQU    34B         TRANSFER OUTPUT ADDRESS CELL 
 OPENFL   EQU    35B         OPERATION ENABLE FLAG STORAGE
 IBC      EQU    36B         INTERVAL BURST SECTOR COUNT
 SREG1    EQU    37B         SCRATCH REGISTER 1 
 SREG2    EQU    40B         SCRATCH REGISTER 2 
 RSPLCTR  EQU    41B         RESPONSE HANDLER LOOP COUNTER
 SECCTR   EQU    42B         TOTAL SECTOR COUNTER 
  
          EJECT 
  
*         FUNCTION WORD EQUATES 
  
 BMSFW    EQU    0#39        BAD MASTER STATUS
 CKRGFW   EQU    0#7E42      CLOCK REGISTER INPUT (10 MB/SEC) 
 CLKI4    EQU    0#FE42      I4 CLOCK REGISTER INPUT (10 MB/SEC)
 CLREI4   EQU    0#100       CLEAR ERROR STATUS REGISTER
 CLRLSI   EQU    0#22        CLEAR LSI/IPI ERROR REGISTER 
 CSRFW    EQU    0#0A81      CENTRAL STREAMING READ 
 CSWFW    EQU    0#0B81      CENTRAL STREAMING WRITE
 DITFW    EQU    0#C05B      DATA INPUT TRANSFER (BUS CONTROL)
 DMAWRT   EQU    0#C00       DMA/I4 WRITE FUNCTION
 DMARD    EQU    0#D00       DMA/I4 READ FUNCTION 
 DMATRM   EQU    0#800       I4 DMA TERMINATE FUNCTION
 DMOF     EQU    1           DROP MASTER OUT
 DOTFW    EQU    0#805B      DATA OUT TRANSFER (BUS CONTROL)
 DSFW     EQU    0#71        DESELECT CONTROLLER
 DSRMF    EQU    5           DROP SYNC OUT,KEEP MASTER OUT UP 
 DSOF     EQU    0#69        DROP SYNC OUT
 FIFW     EQU    1           FORCE IDLE STATE 
 GMSFW    EQU    0#8039      MASTER STATUS
 LIRFW    EQU    0#8200      LOGICAL INTERFACE RESET
 MCI4     EQU    0           MASTER CLEAR I4 ADAPTER
 MTFW     EQU    0#A1        MASTER TRANSFER TERMINATION
 PSELA    EQU    0#62        I4 PORT A SELECT FUNCTION
 PSELB    EQU    0#862       I4 PORT B SELECT FUNCTION
 RDERST   EQU    0#600       READ ERROR STATUS REGISTER 
 RDTREG   EQU    0#A00       READ T-REGISTERS 
 RIPIST   EQU    0#E1        READ IPI STATUS FROM ADAPTER 
 RIERFW   EQU    0#F1        READ IPI ERROR REGISTER
 RMSOF    EQU    7           RAISE MASTER OUT AND SYNC OUT
 ROPLS    EQU    0#700       READ OPERATIONAL STATUS FUNCTION 
 RPTFW    EQU    0#405B      RESPONSE PACKET TRANSFER (BUS CONTROL) 
 RSOFW    EQU    0#9213      RAISE SYNC OUT FOR MASTER RESET
 RSTFW    EQU    0#15        RESET FUNCTION WORD
 RTSFW    EQU    0#8035      REQUEST TRANSFER SETTINGS
 RQIFW    EQU    0#715       REQUEST INTERRUPTS 
 SCTFW    EQU    0#5B        SEND COMMAND TRANSFER (BUS CONTROL)
 SLF      EQU    0#29        SELECT CONTROLLER FUNCTION 
 SRTFW    EQU    0#281       STREAMING READ TRANSFER
 SVRFW    EQU    0#8400      SLAVE RESET
 SWTFW    EQU    0#381       STREAMING WRITE TRANSFER 
  
          EJECT 
  
*         CONDITIONAL ASSEMBLY TASK EQUATES 
  
          IF     DEF,ESEEK
 SEEKO    EQU    1
          ELSE
 SEEKO    EQU    0
          ENDIF 
          IF     DEF,EBUFRD 
 BUFRDO   EQU    1
          ELSE
 BUFRDO   EQU    0
          ENDIF 
          IF     DEF,EBUFWR 
 BUFWRO   EQU    1
          ELSE
 BUFWRO   EQU    0
          ENDIF 
          IF     DEF,ECMDG
 CMDGO    EQU    1
          ELSE
 CMDGO    EQU    0
          ENDIF 
          IF     DEF,EDRDG
 DRDGO    EQU    1
          ELSE
 DRDGO    EQU    0
          ENDIF 
          IF     DEF,ERQTC
 RQTCO    EQU    1
          ELSE
 RQTCO    EQU    0
          ENDIF 
          IF     DEF,EIFMT
 IFMTO    EQU    1
          ELSE
 IFMTO    EQU    0
          ENDIF 
          IF     DEF,ELCIML 
 LCIMLO   EQU    1
          ELSE
 LCIMLO   EQU    0
          ENDIF 
  
          EJECT 
  
*         IOU ENABLE EQUATES
  
          IF     DEF,EI4
 I4ON     EQU    1           TURN I4 CONDITIONAL ASSEMBLY CODE ON 
          ELSE
 I4ON     EQU    0           TURN I4 CONDITIONAL ASSEMBLY CODE OFF
          ENDIF 
          IF     DEF,EI0
 I0ON     EQU    1           TURN I0 CONDITIONAL ASSEMBLY CODE ON 
          ELSE
 I0ON     EQU    0           TURN I0 CONDITIONAL ASSEMBLY CODE OFF
          ENDIF 
          IFNE   I0ON+I4ON,0
 IOUOFF   EQU    0           TURN NO-IOU-SPECIFIED FLAG OFF 
          ELSE
 IOUOFF   EQU    1           TURN NO-IOU-SPECIFIED FLAG ON
          ENDIF 
  
          EJECT 
  
*         MISCELLANEOUS CONSTANT EQUATES
  
 ADPERR   EQU    0#400       IPI ADAPTER ERROR FOR GENERAL STATUS 
 ARMS     EQU    0#40        ASYNCRONOUS RESPONSE MAJOR STATUS
 ASYNEXP  EQU    8D          EXPECTED ASYNCRONOUS INTERRUPT BIT 
 ATTRCWL  EQU    7           ATTRIBUTE COMMAND WORD LENGTH
 BUSYF    EQU    0#40        BUSY FAILURE BIT 
 CDCL     EQU    7           CONTROLLER DIAGNOSTICS COMMAND LENGTH
 CEPID    EQU    0#17        COMMAND EXCEPTION PARAMETER ID 
 CGXSFM   EQU    4000B       CHANGE TRANSFER MODE BIT FOR SELECT FUNC 
 CH       EQU    0           DEFAULT IPI CHANNEL NUMBER 
 CHMSK    EQU    37B         CHANNEL MASK 
 CLASS1   EQU    1           CLASS 1 INTERRUPT BIT
 CLASS2   EQU    2           CLASS 2 INTERRUPT BIT
 CLASS3   EQU    4           CLASS 3 INTERRUPT BIT
 CL3RSP   EQU    3           CLASS 3 RESPONSE CODE
 CMDEXPM  EQU    0#0931      COMMAND EXCEPTION PARAMETER ID WORD
 CNSCS    EQU    0#800       CONDITIONAL SUCCESS BIT
 CSMS     EQU    2           CONDITIONAL SUCCESS BIT FOR MAJOR STATUS 
 CTWRL4   EQU    4           CM TRANSFER R-REG LOWER BURST WORD 
 CTW256   EQU    4000B       CM TRANSFER LOWER BYTE BURST WORD COUNT
 DB4      EQU    -2          DIVIDE BY 4 CONSTANT 
 DBPORTS  EQU    0#300       DOUBLE (BOTH 0 & 1) PORTS MASK 
 DCBERR   EQU    0#2000      DCB INPUT ERROR BIT
 DCBSTCT  EQU    9D          DCB STATUS WORD COUNT
 DDOM     EQU    0#8100      DRIVE DIAGNOSTICS OPCODE MODIFIER
 DGPROG   EQU    0#4000      DIAGNOSTICS IN PROGRESS BIT
 DGEND    EQU    0#2000      DIAGNOSTICS ENDED BIT
 DLINACT  EQU    172044B     CHANNEL INACTIVE DELAY LOOP LENGTH 
 DL1MS    EQU    2570B       1 MS DELAY FOR FCLT SUBROUTINE TIMER 
 DMALPCT  EQU    10467B      DMA TRANSFER SINGLE-BURST LOOP COUNT 
 DMEXID   EQU    0#26        DRIVE MACHINE EXCEPTION PARAMETER ID 
 DNOF     EQU    0#20        DRIVE NOT OPERATIONAL FAILURE BIT
 DNRF     EQU    0#10        DRIVE NOT READY FAILURE BIT
 DPINDX   EQU    3           DIAGNOSTIC IN PROGRESS PARAMETER INDEX 
 DRSV     EQU    0#800       DRIVE RESERVE
 EIGHT    EQU    8D          DECIMAL 8
 ERREG    EQU    400000B     ENABLE (R)+(A) CENTRAL MEMORY ADDRESS
 FACBSY   EQU    2           FACILITY BUSY
 FIVE     EQU    5           DECIMAL 5
 FMTCWL   EQU    7           FORMAT COMMAND WORD LENGTH 
 FOUR     EQU    4           DECIMAL 4
 FOURTN   EQU    14D         DECIMAL 14 
 FTLCLR   EQU    0#7BFF      MASK FOR CLEARING FATAL AND IPI ERROR
 FTLERR   EQU    0#8000      FATAL ERROR BIT FOR GENERAL STATUS 
 GSSCMSK  EQU    0#BFFF      MASK FOR CLEARING THE STATUS ERROR BIT 
 IRPID    EQU    0#24        INTERVENTION REQUIRED PARAMETER ID 
 LBMSK    EQU    0#FF        LOWER BYTE MASK
 LCICL    EQU    15D         LOAD CONTROLLER IML COMMAND LENGTH 
 LEFT8    EQU    8D          SHIFT LEFT COUNT = 8 
 LEFT12   EQU    12D         SHIFT LEFT COUNT = 12
 LNMSK    EQU    0#0F        LOWER NIBBLE MASK
 MASK3    EQU    7B          MASK FOR LOWER 3 BITS
 MASK4    EQU    17B         MASK FOR LOWER 4 BITS
 MAXCDA1  EQU    8D          MAXIMUM CONTROLLER/DRIVE ADDRESS + 1 
 MEXPID   EQU    0#16        MACHINE EXCEPTION PARAMETER ID 
 MINUS1   EQU    -1          CONSTANT -1
 MINUS4   EQU    -4          CONSTANT -4
 MINUS8   EQU    -8D         CONSTANT -8
 MINUS6   EQU    -6D         CONSTANT -6
 MINUS12  EQU    -12D        CONSTANT -12 
 MINUS16  EQU    -16D        CONSTANT -16 
 MMEXID   EQU    0#13        MESSAGE/MICRCODE EXCEPTION PARAMETER ID
 MRSBW    EQU    43D         MAX REMAINING SB WORDS AFTER MAJOR STATUS
 MRSBW1   EQU    44D         MAXIMUM REMAINING SB WORDS + 1 
 MXTSK1   EQU    19D         MAXIMUM TASK PLUS 1
 NCWL     EQU    9D          STANDARD COMMAND PACKET WORD COUNT 
 NINE     EQU    9D          DECIMAL 9
 NMDATA   EQU    0#10        NO MORE DATA IN ENDING STATUS
 NOTOP    EQU    0#A         NOT OPERATIONAL BIT
 NOTRDY   EQU    5           NOT READY BIT
 ONE      EQU    1           DECIMAL 1
 ONEK     EQU    1024D       ONE K-WORDS/SECTOR 
 ONES     EQU    77B         ONES FLAG
 ONEUS    EQU    1           1 USEC DELAY COUNT 
 OPLRDYT  EQU    0#6000      OPERATIONAL AND READY TRANSITION STATUS
 PAUSE    EQU    0#30        PAUSE BIT FOR ENDING STATUS
 PCCL     EQU    6           PATH CONTROL COMMAND PACKET LENGTH 
 PCD1     EQU    5           PERFORM CONTROLLER DIAGNOSTIC PARAMETER 1
 PCD2     EQU    6           PERFORM CONTROLLER DIAGNOSTIC PARAMETER 2
 PMPID    EQU    0#50        PORT MASK COMMAND PARAMETER ID 
 POM      EQU    0#4105      OPCODE MODIFIER FOR POSITION COMMAND 
 PORT0    EQU    0#100       PORT 0 MASK
 PORT1    EQU    0#200       PORT 1 MASK
 PRVOP    EQU    0#0402      PRIORITY RESERVE OPCODE/MODIFIER WORD
 RBOM     EQU    0#5200      READ BUFFER OPCODE MODIFIER
 RBPM1    EQU    0#0350      READ BUFFER PARAMETER 1
 RBPM2    EQU    0#8020      READ BUFFER PARAMETER 2
 RBP1     EQU    9D          READ BUFFER PARAMETER 1 INDEX
 RBP2     EQU    10D         READ BUFFER PARAMETER 2 INDEX
 RBWL     EQU    11D         READ BUFFER COMMAND'S WORD LENGTH
 RLOP     EQU    0#0401      RELEASE COMMAND OPCODE MODIFIER
 RDBFCL   EQU    20D         READ BUFFER COMMAND LENGTH 
 RDOM     EQU    0#1007      READ COMMAND OPCODE MODIFIER 
 RDOMAR   EQU    0#1005      READ COMMAND OPCODE MOD WITH AUTO RETRY
 RPHDRLG  EQU    5           RESPONSE PACKET HEADER LENGTH
 RQIINLC  EQU    0#92D9      REQUEST INTERRUPTS 1/2 SEC INNER LOOP COUNT
 RRPF     EQU    1           RECEIVE RESPONSE PACKET FAILURE BIT
 RSTCMMK  EQU    0#FEE0      RESET COMPLETE STATUS MASK 
 RVOP     EQU    0#0400      RESERVE COMMAND OPCODE MODIFIER
 RWCMDL   EQU    16D         STANDARD R/W COMMAND PACKET LENGTH 
 RWDF     EQU    2           READ/WRITE DATA FAILURE BIT
 SCCMS    EQU    0#18        STANDARD COMMAND COMPLETION MAJOR STATUS 
 SCCR     EQU    0#10        STANDARD COMMAND COMPLETION RESPONSE 
 SCPF     EQU    4           SEND COMMAND PACKET FAILURE BIT
 SCWL     EQU    4           SHORT COMMAND PACKET LENGTH (WORDS)
 SDLI     EQU    103010B     STARTING D-CELL LOAD INSTRUCTION 
 SDRSEQF  EQU    0#8         SELECT, DESELECT, OR RESET SEQ FAILURE BIT 
 SDSI     EQU    103410B     STARTING D-CELL STORAGE INSTRUCTION
 SELCTRL  EQU    2           SELECT CONTROLLER TASK NUMBER
 SEVEN    EQU    7           DECIMAL 7
 SHFTINS  EQU    1000B       SHIFT INSTRUCTION
 SITS     EQU    0#80        SUCCESSFUL INFORMATION TRANSFER STATUS 
 SIX      EQU    6           DECIMAL 6
 SIXMIN   EQU    360D        6 MINUTE REQUEST INTERRUPTS LOOP COUNT 
 SIXTEEN  EQU    16D         DECIMAL 16 
 SIXUS    EQU    6           6 USEC CONSTANT
 SLOB     EQU    -8D         SHIFT LEFT ONE BYTE
 STERR    EQU    0#4000      STATUS ERROR BIT FOR GENERAL STATUS WORD 
 STERMSK  EQU    0#E0        MASK FOR STATUS ERROR TYPE 
 SVISHF   EQU    6           SLAVE-IN STATUS SHIFT COUNT
 TEN      EQU    10D         DECIMAL 10 
 TENUS    EQU    10D         10 USEC COUNT
 THREE    EQU    3           DECIMAL 3
 TIPMSK   EQU    1           TRANSFER-IN-PROGRESS MASK
 TKBUSY   EQU    0#1000      TASK BUSY BIT FOR GENERAL STATUS 
 TNMS     EQU    0#58        TRANSFER NOTIFICATION MAJOR STATUS 
 TREGCT   EQU    3           T-REGISTER COUNT 
 TRSNOT   EQU    0#50        TRANSFER NOTIFICATION (MAJOR STATUS) 
 TSBIT    EQU    0#10        TRANSFER SETTINGS BIT
 TSK9CS   EQU    9D          TASK 9 CONSTANT
 TWENTY   EQU    20D         DECIMAL 20 
 TWENUS   EQU    20D         20 USEC DELAY COUNT
 TWO      EQU    2           DECIMAL 2
 TWOK     EQU    2048D       SECTOR LENGTH IN BYTES 
 UBMSK    EQU    0#FF00      UPPER BYTE MASK
 UNBMSK   EQU    0#F0        UPPER NIBBLE MASK
 UNH      EQU    40B         UN-HANG BIT FOR CHANNEL INSTRUCTIONS 
 US100    EQU    100D        100 USEC DELAY CONSTANT
 US50000  EQU    50000D      50,000 USEC DELAY CONSTANT 
 WBOM     EQU    0#6200      WRITE BUFFER OPCODE MODIFIER 
 WCLASS1  EQU    401B        2 SEC TIME-OUT CLASS 1 COUNT 
 WCLASS2  EQU    402B        2 SEC TIME-OUT CLASS 2 COUNT 
 WCLASS3  EQU    204B        1 SEC TIME-OUT CLASS 3 COUNT 
 WCLSS1A  EQU    4011B       20 SEC TIME-OUT/CLASS 1 ASYNCRONOUS COUNT
 WDOM     EQU    0#2005      WRITE COMMAND OPCODE MODIFIER
 WLCL1A   EQU    132011B     6 MIN TIME-OUT/CLASS 1 ASYNCRONOUS COUNT 
 WMCLSS1  EQU    40401B      2 MIN, 10 SEC TIME-OUT/CLASS 1 COUNT 
 WLCLSS1  EQU    702001B     30 MIN TIME-OUT/CLASS 1 ASYNCRONOUS COUNT
 XSFPN    EQU    0#50        TRANSFER PENDING STATUS
 ZERO     EQU    0           DECIMAL 0
  
          EJECT 
  
*         ERROR CODE EQUATES
  
 ECHFLL   EQU    0#B         CHANNEL IS FULL AFTER T-REGS LOADED
 EC       EQU    0#C         DMA/I4 TRANSFER-IN-PROGRESS TMO ERROR
 ED       EQU    0#D         DMA/I4 ERROR STATUS PRESENT
 FCNERRB  EQU    0#E         CHANNEL ACTIVE BEFORE A FUNCTION OUTPUT
 FCNERRA  EQU    0#F         CHANNEL ACT 1USEC AFTER A FUNCTION OUTPUT
 E11      EQU    0#11        ASYNC RESP NOT FOUND DURING SELECTIVE RESET
 E21      EQU    0#21        SLAVE-IN RISE TIME-OUT ERROR 
 E22      EQU    0#22        UNKNOWN CONTROLLER ADDRESS RECEIVED
 E23      EQU    0#23        CH ERROR AFTER SELECT STATUS BYTE RECEIVED 
 E31      EQU    0#31        SYNC-IN RISE TIME-OUT ERROR
 E32      EQU    0#32        WRONG BUS ACKNOWLEDGE BYTE RECEIVED
 E33      EQU    0#33        CH ERROR FLAG AFTER INPUT OF BUS ACK BYTE
 E34      EQU    0#34        SYNC-IN FALL TIME-OUT ERROR
 E40      EQU    0#40        BASE FOR ADAPTER FUNCTION ERROR
 E41      EQU    0#41        WORD COUNT RESIDUE AFTER INFO TRANSFER OUT 
 E42      EQU    0#42        CHANNEL WAS EMPTY WHEN ADAPTER INPUT WORD
 E51      EQU    0#51        SLAVE-IN RISE TIME-OUT ERROR 
 E52      EQU    0#52        CH ERROR FLAG AFTER ENDING SLAVE STATUS
 E53      EQU    0#53        INFORMATION TRANSFER NOT SUCCESSFUL
 E61      EQU    0#61        SLAVE INTERRUPT BYTE NOT PRESENT 
 E62      EQU    0#62        CH ERROR AFTER SLAVE INTERRUPT RECEIVED
 E63      EQU    0#63        NO CONTROLLER INTERRUPT IN ALLOTTED TIME 
 E70      EQU    0#70        BASE FOR ADAPTER FUNCTION ERROR
 E71      EQU    0#71        WORD COUNT RESIDUE AFTER INFO TRANSFER IN
 E72      EQU    0#72        CHANNEL EMPTY WHEN ADAPTER INPUT EXPECTED
 E81      EQU    0#81        SLAVE-IN FALL TIME-OUT ERROR 
 E91      EQU    0#91        SLAVE-IN RISE TIME-OUT ERROR 
 E92      EQU    0#92        CH ERROR AFTER TRANSFER SETT BYTE RECEIVED 
 E93      EQU    0#93        SLAVE-IN FALL TIME-OUT ERROR 
 ONSERR   EQU    0#E0        OPERATION NOT SUCCESSFUL 
 TSKBSY   EQU    0#E1        TASK IS BUSY (NO RESPONSE PACKET YET)
 DTSITMO  EQU    0#E2        DATA TRANSFER/SLAVE-IN TIME-OUT ERROR
 UC2REC   EQU    0#E3        AN UNEXPECTED CLASS 2 INTERRUPT RECEIVED 
 UC1REC   EQU    0#E4        AN UNEXPECTED CLASS 1 INTERRUPT RECEIVED 
 URTREC   EQU    0#E5        AN UNKNOWN RESPONSE TYPE WAS RECEIVED
 UARREC   EQU    0#E6        AN UNEXPECTED ASYNCRONOUS RESPONSE RECEIVED
 CNDSUCC  EQU    0#E7        COMMAND HAD CONDITIONAL SUCCESS
 CRITERR  EQU    0#E8        CRITICAL ERROR DURING ENDING STATUS
 UNSCDBT  EQU    0#E9        UNSUCCESSFUL DATA BURST TRANSFER 
 DNOR     EQU    0#EA        DRIVE NOT OPERATIONAL AND READY
 CNOR     EQU    0#EB        CONTROLLER NOT OPERATIONAL AND READY 
 UNRCERR  EQU    0#EC        UNRECOVERABLE DATA ERROR 
 INVTK    EQU    0#F0        INVALID TASK SPECIFIED 
 INVCA    EQU    0#F1        INVALID CONTROLLER ADDRESS SPECIFIED 
 INVDA    EQU    0#F2        INVALID DRIVE ADDRESS SPECIFIED
 ZTLERR   EQU    0#F3        NO DATA TRANSFER LENGTH SPECIFIED
  
          EJECT 
*** 
* 
*         E R R O R    H A N D L I N G    N O T E S 
* 
* 
*         WHEN EACH DEEPER-LEVEL SUBROUTINE IS CALLED AND EXECUTED,  ANY
*         ERROR CONDITION THAT ARISES WILL STOP THE  SUBROUTINE  AT  THE
*         POINT OF  ERROR AND PASS AN ERROR CODE TO IT'S CALLING ROUTINE
*         (VIA  THE  A-REG)  THAT  DESCRIBES  AND  PINPOINTS  THE  ERROR
*         CONDITION.  THERE  WILL BE NO STATE RECOVERY OR RESETS DONE TO
*         THE  IPI  HARDWARE  AFTER  AN  ERROR OCCURS.  THIS WILL BE THE
*         RESPONSIBILITY  OF  THE  OFF-LINE  PROGRAM THAT CALLED THE IPI
*         DRIVER.  A  LOGICAL  RESET  MUST  BE  PERFORMED BEFORE ANY I/O
*         OPERATIONS CAN BE RUN.  TO DO THIS, THE  OFF-LINE PROGRAM MUST
*         CALL THE IPI  DRIVER WITH A TASK CODE OF 1; A MASTER/SELECTIVE
*         (LOGICAL) RESET.
* 
*         WHEN THE PREVIOUS CALLING ROUTINE WITHIN THE IPI DRIVER NOTICE
*         THAT (A) IS NON-ZERO,  IT  WILL ABORT WITH THE SAME ERROR CODE
*         BY  PASSING  IT  UP  TO  ITS  OWN  CALLING  ROUTINE OR MODULE.
*         (SOMETIME  IT  WILL  TACK ON AN IDENTIFIER TO FURTHER PINPOINT
*         THE ERROR.) 
* 
*         WHEN  CONTROL  RETURNS  TO  THE INITIALIZATION (OR ENTRY/EXIT)
*         MODULE OR ROUTINE ANY ERROR CODE IS STORED IN DCB+LLE, AND THE
*         FAILING TASK IS STORED IN DCB+FTSK. THE MULTI-TASK TASKS (11 &
*         12) WILL NOT BE REFERENCED SINCE THEY ARE MADE UP OF THE OTHER
*         EXISTING TASKS. THE GENERAL STATUS WORD IS UPDATED ACCORDINGLY
*         WHEN EACH TASK ROUTINE IS EXECUTING  THE "CURRENT TASK" MEMORY
*         LOCATION IS LOADED WITH THE NUMBER OF THE CURRENT  TASK.  WHEN
*         EACH OF THE MAJOR CM-3/DRIVE OPERATIONS ARE  RUN, THE "CURRENT
*         MAJOR OPERATION"  LOCATION  IS  LOADED  WITH  THE  PROPER  BIT
*         SIGNIFICANT CODE. 
* 
*         THE  FOLLOWING  DESCRIPTION  EXPLAINS  THE  MEANING OF THE TWO
*         DIGIT  LOW-LEVEL  ERROR  CODES...(ALL  ERROR  CODES ARE IN THE
*         HEXADECIMAL NOTATION)...
* 
*                                 X   Y 
*                                 -   - 
*                                 !   ! 
*              ---------------              ------------------
*                     !                              !
*                     V                              V
*           CODE NUMBER OF FAILING      CODE NUMBER OF FAILING CONDITION
*           LOW-LEVEL SEQUENCE          WITHIN LOW-LEVEL SEQUENCE (0-F) 
*                  (0-F)                (SEE ERROR CODE EQUATES FOR 
*                    !                  MORE DETAILS) 
*                    V
*           LOW-LEVEL SEQUENCE
*              CODE NUMBER                 SEQUENCE/ERROR TITLE 
*           ------------------       ---------------------------------
*                  0.................IPI ADAPTER FUNCTION ERROR 
*                  1.................MASTER/SELECTIVE RESET (MSR) 
*                  2.................SELECT (SEL) 
*                  3.................BUS CONTROL (BSC)
*                  4.................INFORMATION TRANSFER OUT (ITO) 
*                  5.................ENDING STATUS (EDS)
*                  6.................RESPONSE HANDLER (RSPHDL)
*                  7.................INFORMATION TRANSFER IN (ITI)
*                  8.................DESELECT (DSL) 
*                  9.................REQUEST TRANSFER SETTINGS (RQTS) 
* 
*              THE RANGE FOR CURRENT IPI DRIVER TASK NUMBERS IS 1 - 18 .. 
* 
*                  1.......P.........MASTER/SELECTIVE RESET (CONT RESET)
*                  2.......P.........SELECT CONTROLLER
*                  3.......P.........DESELECT CONTROLLER
*                  4.......P.........RESERVE DRIVE
*                  5.......P.........RELEASE DRIVE
*                  6.......O.........SEEK (TO A CYLINDER) 
*                  7.......P.........SEEK-READ
*                  8.......P.........SEEK-WRITE 
*                  9.......O.........READ DATA FROM CONTROLLER BUFFER 
*                  10......O.........WRITE DATA TO CONTROLLER BUFFER
*                  11......P.........SELECT/SEEK-READ/DESELECT
*                  12......P.........SELECT/SEEK-WRITE/DESELECT 
*                  13......O.........PERFORM CONTROLLER DIAGNOSTICS 
*                  14......O.........PERFORM DRIVE DIAGNOSTICS
*                  15......P.........REQUEST DRIVE TYPE 
*                  16......O.........REQUEST TASK COMPLETE
*                  17......O.........INITIAL FORMAT 
*                  18......O.........LOAD CONTROLLER IML DATA 
*                  ( P= PERMANENT, O= OPTIONAL )
************************************************************************
  
 ECHMCRO  TITLE  ENABLE CHANNEL MACROS
**        ENABLE CHANNEL MACROS 
* 
          RICHI              ENABLE ALL CHANNEL MACROS
  
*         DELAY MACRO  (MOSTLY IN MICROSECONDS) 
  
          LIST   -L 
          PURGMAC DELAY 
 DELAY    MACRO  X
 M        IFLE   X,77B
 M        IFGE   X,0
          LDN    X
 M        ELSE
          LDC    X
 M        ENDIF 
          HOLD
          ENDM               END OF DELAY MACRO 
          LIST   *
 IPIDEN   TITLE  IPI DRIVER ENTRY POINT 
**        IPIDEN - IPI DRIVER ENTRY POINT 
* 
 IPIDEN   CONL   IPID        DRIVER ENTRY POINT 
          CONL   SB          FWA OF THE STATUS BUFFER 
  
*         DRIVER CONTROL BLOCK
  
 DCB      BSSZ   25D         DRIVER CONTROL BLOCK AREA
  
*         SUBSYSTEM STATUS BUFFER 
  
 SB       BSSZ   48D         STATUS BUFFER AREA 
 SBEND    EQU    *-1         LAST ADDRESS OF THE STATUS BUFFER
* 
*                  DRIVER CONTROL BLOCK LAYOUT  (DCB) 
*               I--------------------------------------I
* DCB+TSK     1 I  TASK NUMBER         (1-18)          I
*               I--------------------------------------I
* DCB+CHN     2 I  IPI CHANNEL NUMBER                  I
*               I--------------------------------------I
* DCB+CA      3 I  CONTROLLER ADDRESS  (0-7)           I
*               I--------------------------------------I
* DCB+DA      4 I  DRIVE ADDRESS       (0-7)           I
*               I--------------------------------------I
* DCB+CYL     5 I  CYLINDER ADDRESS                    I
*               I--------------------------------------I
* DCB+HD      6 I  HEAD ADDRESS                        I
*               I--------------------------------------I
* DCB+SEC     7 I  SECTOR ADDRESS                      I
*               I--------------------------------------I
* DCB+OEF     8 I  OPERATIONAL ENABLE FLAGS            I
*               I--------------------------------------I
* DCB+CDG1    9 I  TASK 13  CONTROLLER DIAG GROUP 1    I
*               I--------------------------------------I
* DCB+IBCU      I  TASK 18  IML BYTE COUNT UPPER       I
*               I--------------------------------------I
* DCB+CDG2   10 I  TASK 13  CONTROLLER DIAG GROUP 2    I
*               I--------------------------------------I
* DCB+IBCL      I  TASK 18  IML BYTE COUNT LOWER       I
*               I--------------------------------------I
* DCB+FWA1   11 I  PP FWA / DMA (R-REG) UPPER          I
*               I--------------------------------------I
* DCB+FWA2   12 I  DMA (R-REG) LOWER                   I
*               I--------------------------------------I
* DCB+FWA3   13 I  DMA (A-REG)                         I
*               I--------------------------------------I
* DCB+STC    14 I  SECTOR TRANSFER COUNT               I
*               I--------------------------------------I
* DCB+IBSC   15 I  INTERVAL BURSTING SECTOR COUNT      I
*               I--------------------------------------I
* DCB+GS     16 I  GENERAL STATUS                      I
*               I--------------------------------------I
* DCB+FTSK   17 I  FAILING TASK                        I
*               I--------------------------------------I
* DCB+LLE    18 I  LOW-LEVEL ERROR                     I
*               I--------------------------------------I
* DCB+PLLE   19 I  FIRST ERROR CAPTURED                I
*               I--------------------------------------I
* DCB+LFCN   20 I  LATEST FUNCTION SENT                I
*               I--------------------------------------I
* DCB+LSS    21 I  LATEST SELECT STATUS                I
*               I--------------------------------------I
* DCB+LBAS   22 I  LATEST BUS ACKNOWLEDGE STATUS       I
*               I--------------------------------------I
* DCB+LSVS   23 I  LATEST SLAVE STATUS                 I
*               I--------------------------------------I
* DCB+LRIS   24 I  LATEST INTERRUPT STATUS             I
*               I--------------------------------------I
* DCB+LIER   25 I  LSI ADAPTERS IPI ERROR REGISTER     I
*               I--------------------------------------I
* 
  
 ALLCB    TITLE  ALL COMMAND BUFFERS
**        ALLCB - ALL COMMAND BUFFERS 
* 
*         ATTRIBUTE COMMAND BUFFER
  
 ACB      CONL   11D         COMMAND BLOCK LENGTH IN BYTES
          CONL   1           REFERENCE NUMBER 
          CONL   0#200       OPCODE/MOD (WILL BE CHANGED) 
          CONL   0           SLAVE/DRIVE ADDRESS (WILL BE CHANGED)
          CONL   0#046C      PARAMETER ID WORD
          CONL   0#4050      REQUESTED PARAMETER IN RESPONSE PACKET 
          CONL   0#5400      REQUESTED PARAMETER IN RESPONSE PACKET 
  
*         SEEK, READ, AND WRITE COMMAND BUFFER
  
 CB       CONL   16D         COMMAND BLOCK LENGTH IN BYTES
          CONL   2           REFERENCE NUMBER 
          CONL   0           OPCODE/MOD (WILL BE CHANGED) 
          CONL   0           SLAVE/DRIVE ADDRESS (WILL BE CHANGED)
          CONL   0#0931      PARAMETER ID WORD FOR COMMAND EXTENT PARAM 
          CONL   0           COUNT UPPER
          CONL   0           COUNT LOWER
          CONL   0           DATA ADDRESS UPPER 
          CONL   0           DATA ADDRESS LOWER 
          CONL   0           BUFFER ADDRESS PARAMETER ID WORD 
          CONL   0           BUFFER ADDRESS BITS (FOR CM-3) 
  
          IFNE   IFMTO,0
*         FORMAT (INITIAL) COMMAND BUFFER 
  
 FCB      CONL   12D         COMMAND BLOCK LENGTH IN BYTES
          CONL   4           COMMAND REFERENCE NUMBER 
          CONL   0#280D      OPCODE/MODIFIER
          CONL   0           SLAVE/DEVICE ADDRESS (WILL BE CHANGED) 
          CONL   0#053B      PARAMETER ID WORD
          CONL   0           UPPER SECTOR SIZE
          CONL   0#800       LOWER SECTOR SIZE (2048) 
          ENDIF 
  
          IFNE   LCIMLO,0 
*         LOAD CONTROLLER IML COMMAND BUFFER
  
 LCICB    CONL   27D         COMMAND BLOCK LENGTH IN BYTES
          CONL   5           COMMAND REFERENCE NUMBER 
          CONL   0#6600      OPCODE/MODIFIER
          CONL   0           SLAVE/DEVICE ADDRESS (WILL BE CHANGED) 
          CONL   0#0531      PARAMETER ID WORD
          CONL   0           UPPER IML BYTE COUNT 
          CONL   0           LOWER IML BYTE COUNT 
          CONL   0#0951      PARAMETER ID WORD
          CONL   0           UPPER INTERRUPT BYTE COUNT 
          CONL   2048D       2048-BYTE INTERRUPT SIZE 
          CONL   0           UPPER BURST BYTE COUNT 
          CONL   2048D       2048-BYTE BURST SIZE 
          CONL   0#046E      PARAMETER ID WORD
          CONL   0#0280      DATA STREAMING MODE
          CONL   0
          ENDIF 
  
          IFNE   CMDGO,0
*         PERFORM CONTROLLER DIAGNOSTIC COMMAND BUFFER
  
 PCDCB    CONL   12D         COMMAND BLOCK LENGTH IN BYTES
          CONL   8D          COMMAND REFERENCE NUMBER 
          CONL   0#8000      OPCODE/MODIFIER
          CONL   0           SLAVE/DEVICE ADDRESS (WILL BE CHANGED) 
          CONL   0#0550      PARAMETER ID WORD
          CONL   0           FIRST 16 SUBTESTS
          CONL   0           LAST 10 SUBTESTS 
          ENDIF 
  
*         RESERVE COMMAND BUFFER
  
 RCB      CONL   6           COMMAND BLOCK LENGTH IN BYTES
          CONL   3           COMMAND REFERENCE NUMBER 
          CONL   0           OPCODE/MODIFIER
          CONL   0           SLAVE/DEVICE ADDRESS 
          CONL   0           EXTRA WORD 
  
 INIT     TITLE  INITIALIZATION MODULE
**        INIT - INITIALIZATION MODULE   (BEGINNING OF PROGRAM) 
* 
*         DIRECT CELL STORAGE FOR CALLING PROGRAM 
* 
 DCSTR    BSSZ   SECCTR-CHANN+1    24 DIRECT CELL STORAGE LOCATIONS 
  
*         DIRECT CELL STORAGE FOR IPI DRIVER
  
 DCELLS   BSSZ   SECCTR-CHANN+1    24 DIRECT CELL STORAGE LOCATIONS 
  
*         SAVING CALLING PROGRAM'S D-CELLS 10B-37B
  
 IPID     SUBR               ENTRY/EXIT 
          LDDL   CHANN       STARTING D-CELL INSTRUCTION ADDR FOR TEST
          STML   DCSTR       STORE IT IN 1ST WORD OF D-CELL BUFFER
          LDN    CMMSK       2ND D-CELL STORAGE LOCATION
          STDL   CHANN       STORE IN 1ST FREED D-CELL
 STLOOP   LDIL   CHANN       CONTENTS OF D-CELL TO BE SAVED 
          STML   DCSTR-CHANN,CHANN  STORE IN MEMORY BUFFER
          AODL   CHANN       INCREMENT D-CELL FETCH ADDRESS 
          SBN    SECCTR+1 
          MJN    STLOOP      IF NOT D-CELL ADDRESS + 1
  
*         CLEARING STATUS AND ERROR REGISTERS 
  
          LDC    SBEND-DCB-GS 
          STDL   LOOPCTR     SET LOOP COUNTER = DCB OUTPUT AND SB 
 CLRLP    LDN    ZERO 
          STML   DCB+GS,LOOPCTR    CLEAR A DCB STATUS WORD
          SODL   LOOPCTR     DECREMENT LOOP COUNTER 
          PJN    CLRLP       IF NOT DONE
  
*         RESUME INTERVAL BURSTING CHECK
  
          LDML   DCB+OEF     OPERATIONAL ENABLE FLAGS 
          STDL   OPENFL      SAVE FOR QUICK REFERENCE 
          LPC    BRE
          ZJN    IPID10      IF BURST RELEASE ENABLE NOT SET
          LDML   DCB+IBSC 
          ZJP    IPIDZTL     IF INTERVAL BURST SECTOR COUNT ZERO
          STDL   IBC         SAVE THE BURST COUNT 
          LDML   DBIPRG 
          ZJN    IPID10      IF DATA-BURSTING-IN-PROGRESS FLAG NOT SET
  
*         RESTORE IPI DRIVER D-CELLS
  
          LDN    CHANN       STARTING D-CELL ADDRESS
          STDL   SECCTR      STORE IN LAST D-CELL 
 RSLOOP2  LDML   DCELLS-CHANN,SECCTR GET SAVED D-CELL CONTENTS
          STIL   SECCTR      RESTORE IN PROPER D-CELL 
          AODL   SECCTR      INCREMENT D-CELL FETCH ADDRESS 
          SBN    SECCTR 
          NJN    RSLOOP2     IF ALL CELLS NOT DONE
          LDML   DCELLS-CHANN,SECCTR GET LAST D-CELL TO BE SAVED
          STDL   SECCTR      RESTORE LAST D-CELL
          RJM    DFWASTR     STORE DATA FWA'S 
          LDN    ONES 
          STML   RSMIB       SET THE RESUME INTERVAL BURSTING FLAG
          LDML   DCB+IBSC    INTERVAL BURST SECTOR COUNT
          STDL   IBC         STORE IN D-CELL
          LJM    RESUME      RESUME DATA BURSTING 
  
 IPID10   LDN    ZERO 
          STDL   CURMO       CLEAR TASK INFORMATION CELLS 
          STDL   CURTSK 
  
*         INVALID DCB ENTRY INVESTIGATION 
  
          LDML   DCB+TSK     CURRENT TASK NUMBER
          SBN    MXTSK1 
          MJN    IPID15      IF VALID TASK
          LDC    INVTK       INVALID TASK ERROR 
          UJN    IPID23      EXIT 
  
 IPID15   LDML   DCB+CA      CURRENT CONTROLLER ADDRESS 
          SBN    MAXCDA1     MAXIMUM CM-3 ADDRESS + 1 
          MJN    IPID20      IF VALID CM-3 ADDRESS
          LDC    INVCA       INVALID CM-3 ADDRESS ERROR 
          UJN    IPID23      EXIT 
  
 IPID20   LDML   DCB+TSK     CURRENT TASK 
          SBN    RESDR
          MJN    IPID25      IF TASK LESS THAN 4
          SBN    RQDT-RESDR 
          ZJN    IPID25      IF TASK 15 
          IFNE   LCIMLO,0 
          SBN    RQTC-RQDT
          ZJN    IPID25      IF TASK 16 REQUEST TASK COMPLETE 
          SBN    LCIML-RQTC 
          ZJN    IPID25      IF TASK 18 LOAD CONTROLLER IML 
          ENDIF 
          LDML   DCB+DA      CURRENT DRIVE ADDRESS
          SBN    MAXCDA1
          MJN    IPID25      IF VALID DRIVE ADDRESS 
          LDC    INVDA       INVALID DRIVE ADDRESS ERROR
 IPID23   LJM    TKEND       EXIT 
  
*         CHANNEL ADDRESS UPDATE AREA 
  
 IPID25   LDML   SMPCH       A CURRENT CHANNEL NUMBER 
          LPN    CHMSK       SAVE JUST CHANNEL NUMBER 
          STDL   TEMP1       SAVE CURRENT IPI CHANNEL ADDRESS 
          LDML   DCB+CHN     DESIRED IPI CHANNEL ADDRESS
          LPN    CHMSK       MASK OFF ANY UPPER BITS
          STDL   CHANN       SAVE IN CHANNEL D-CELL 
          SBD    TEMP1
          ZJN    IPID40      IF CURRENT EQUAL DESIRED 
  
*         UPDATE ALL CHANNEL ADDRESS REFERENCES 
  
          LDC    CHTA        FWA OF CHANNEL TABLE 
          STDL   TEMP1       SAVE IN TEMP 
 IPID30   LDIL   TEMP1       LOAD INSTRUCTION ADDRESS 
          ZJN    IPID40      IF LAST ADDRESS
          STDL   TEMP2       SAVE INSTRUCTION ADDRESS 
          LDIL   TEMP2       ACTUAL INSTRUCTION 
          SCN    CHMSK       REMOVE OLD CHANNEL NUMBER
          ADDL   CHANN       ADD NEW CHANNEL NUMBER 
          STIL   TEMP2       RESTORE MODIFIED INSTRUCTION 
          AODL   TEMP1       INCREMENT INSTRUCTION ADDRESS
          UJN    IPID30      DO NEXT INSTRUCTION
  
*         IPI CHANNEL AND ADAPTER INITIALIZATION
  
 IPID40   DCN    CH+UNH      DISCONNECT IPI CHANNEL 
          LDML   IPICHN      LAST IPI CHANNEL 
          SBML   DCB+CHN     SUBTRACT CURRENT 
          ZJN    IPID41      IF CURRENT SAME AS LAST
          LDN    0           ELSE CLEAR MULTI-PASS
          STML   MLTIPASS 
 IPID41   LDML   MLTIPASS    MULTI-PASS FLAG
          ZJN    IPID41A     IF MULTI-PASS NOT SET
          LJM    IPID50      CURRENT TASK 
  
 IPID41A  AOML   MLTIPASS    SET MULTI-PASS FLAG
          LDML   DCB+CHN
          STML   IPICHN      SAVE CURRENT CHANNEL FOR NEXT PASS 
          IFNE   IOUOFF,0,3 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          NJN    IPID42      IF I4 DRIVER ENABLED 
          IFNE   I0ON+IOUOFF,0,1
          MCLR   CH          MASTER CLEAR THE IPI CHANNEL 
          IFNE   IOUOFF,0,1 
          UJN    IPID43 
  
          IFNE   I4ON+IOUOFF,0,2
 IPID42   LDN    MCI4        MASTER CLEAR I4 ADAPTER FUNCTION 
          RJM    SENDFCN     ISSUE ADAPTER FUNCTION 
          IFNE   I0ON,0 
 IPID43   DELAY  ONEUS       DELAY 1 USEC 
          ELSE
 IPID43   LDN    ONEUS
          RJM    DELUS       DELAY 1 USEC 
          ENDIF 
          DCN    CH+UNH      DISCONNECT IPI CHANNEL 
          IFNE   IOUOFF,0,3 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          NJN    IPID45      IF I4 DRIVER IS ENABLED
          IFNE   I0ON+IOUOFF,0,1
          LDC    CKRGFW      IPI ADAPTER CLOCK FUNCTION FOR 10 MB/S 
          IFNE   IOUOFF,0,1 
          UJN    IPID46 
  
          IFNE   I4ON+IOUOFF,0,1
 IPID45   LDC    CLKI4       I4 ADAPTER CLOCK FUNCTION
 IPID46   RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER/CHECK FOR ERR 
          NJP    TKEND       IF ERROR 
  
*         DATA TRANSFER TASK INQUIRY
  
 IPID50   LDML   DCB+TSK     CURRENT TASK NUMBER
          SBN    SEKRD
          MJN    IPID70      IF TASK IS (1 TO 6)
          SBN    CMDG-SEKRD 
          MJN    IPID60      IF TASK IS (7 TO 12) 
          SBN    LCIML-CMDG 
          NJN    IPID70      IF NOT TASK 18 
  
*         TASK INVOLVES DATA TRANSFER / DATA TRANSFER INITIALIZATION
  
 IPID60   LDML   DCB+STC
          NJN    IPID65      IF SECTOR COUNT NOT 0
 IPIDZTL  LDC    ZTLERR      ZERO TRANSFER LENGTH ERROR 
          LJM    TKEND       EXIT 
  
 IPID65   RJM    DFWASTR     STORE THE DATA FWA'S 
  
*         COMMON COMMAND BUFFER SET-UP
  
 IPID70   LDML   DCB+CA      CONTROLLER ADDRESS 
          SHN    LEFT8       SHIFT 1 BYTE LEFT
          LMML   DCB+DA      XOR WITH DRIVE ADDRESS 
          STML   ACB+SA      STORE IN ACB'S ADDRESS WORD
          STML   CB+SA       STORE IN CB'S ADDRESS WORD 
          STML   RCB+SA      STORE IN RCB'S ADDRESS WORD
          IFNE   IFMTO,0,1
          STML   FCB+SA      STORE IN FCB'S ADDRESS WORD
          LDML   DCB+CA      CONTROLLER ADDRESS 
          SHN    LEFT8       SHIFT LEFT 8 BITS
          LMC    LBMSK       OR IN AN FF
          IFNE   LCIMLO,0,1 
          STML   LCICB+SA    STORE IN LCICB'S ADDRESS WORD
          IFNE   CMDGO,0,1
          STML   PCDCB+SA    STORE IN PCDCB'S ADDRESS WORD
          LDN    ZERO 
          STML   CB+CT1      CLEAR UPPER COUNT WORD 
          LDML   DCB+STC     SECTOR COUNT 
          STML   CB+CT2      STORE IN CB COUNT2 LOCATION
          LDML   DCB+CYL     CYLINDER ADDRESS 
          STML   CB+DA1      STORE IN 1ST DATA ADDRESS WORD 
          LDML   DCB+HD      HEAD ADDRESS 
          SHN    LEFT8       SHIFT LEFT 1 BYTE
          LMML   DCB+SEC     XOR WITH SECTOR ADDRESS
          STML   CB+DA2      STORE IN 2ND DATA ADDRESS WORD 
          LDN    RWCMDL      STANDARD R/W COMMAND LENGTH
          STML   CB          STORE IN 1ST WORD OF COMMAND BUFFER
          LDC    CMDEXPM     COMMAND EXCEPTION PARAMETER WORD 
          STML   CB+PM       STORE IN COMMAND BUFFER
  
*         I4 ADAPTER PORT SELECTION 
  
          IFNE   IOUOFF,0,3 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          ZJN    IPID82      IF I4 DRIVER IS NOT ENABLED
          IFNE   I4ON+IOUOFF,0
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4PB 
          NJN    IPID75      IF PORT B IS TO BE SELECTED
          LDC    PSELA       PORT SELECT A FUNCTION 
          UJN    IPID80 
  
 IPID75   LDC    PSELB       PORT SELECT B FUNCTION 
 IPID80   RJM    SENDFCN     SELECT AN I4 PORT
          NJN    TKEND       IF ERROR 
          ENDIF 
  
*         CONTROLLER ADDRESS MASK SET-UP
  
 IPID82   LDML   DCB+CA      CONTROLLER ADDRESS 
          SHN    LEFT12      SHIFT LEFT 12 BITS 
          STDL   SLAVE       STORE SHIFTED ADDRESS
          LDN    ONE
          STDL   CMMSK       STORE INITIAL CM-3 MASK
          LDML   DCB+CA 
          ZJN    IPID85      IF CONTROLLER ADDRESS ZERO 
          ADC    SHFTINS     ADD ADDRESS TO SHIFT INSTRUCTION 
          STML   VARSHFT     STORE ADJUSTED SHIFT INSTRUCTION 
          PSN                DELAY ONE INSTRUCTION
          LDDL   CMMSK       CM-3 MASK
 VARSHFT  SHN    ZERO        SHIFT CM-3 MASK LEFT X BITS
          STDL   CMMSK       SAVE CM-3 MASK ADDRESS 
  
* 
*         TASK ENTRANCE AND EXIT CONTROL
* 
*         TASK CALL CONTROL SECTION 
  
 IPID85   LDML   DCB+TSK     CURRENT TASK 
          STDL   CURTSK      STORE IN CURRENT TASK CELL 
          SBN    ONE         DECREMENT IT 
          STDL   TEMP1       STORE INDEX FOR JUMP 
          LDML   TSKTBL,TEMP1  TASK RJM ADDRESS 
          STDL   TEMP1       SAVE 
          RJM    ZERO,TEMP1  RUN SELECTED TASK
  
*         END-OF-TASK PROCESSING
  
 TKEND    DCN    CH+UNH      DISCONNECT IPI CHANNEL FOR EXIT
          NJN    IPID90      IF ERROR EXISTS
          LDML   DCB+PLLE    PREVIOUS ERROR CODE
          NJN    IPID90      IF PLLE EXISTS 
          LJM    IPIDEND     EXIT 
  
*         ERROR EXITS 
  
 IPID90   STML   DCB+LLE     STORE THE CURRENT LOW-LEVEL ERROR COD
          STDL   TEMP1       SAVE ERROR CODE
          LDML   DCB+TSK     LATEST TASK
          STML   DCB+FTSK    STORE IN DCB 
  
*         DCB INPUT ERROR CHECK 
  
          LDDL   TEMP1       ERROR CODE 
          LPC    UNBMSK      AND WITH UPPER NIBBLE MASK 
          LMC    UNBMSK 
          NJN    IPID95      IF ERROR = F0
          LDC    DCBERR      DCB ERROR BIT
          RJM    GSUPD       SET IT IN GENERAL STATUS WORD
          LJM    IPIDEND     EXIT 
  
*         STATUS ERROR CHECK
  
 IPID95   LDDL   TEMP1       ERROR CODE 
          LPC    STERMSK     MASK FOR ERROR CODE E0 
          LMC    STERMSK
          NJP    IPIE        IF ERROR CODE NOT E0 (STATUS ERROR)
          LDC    STERR       STATUS ERROR BIT 
          RJM    GSUPD       SET STATUS ERROR BIT IN GENERAL STATUS 
  
*         CONDITIONAL SUCCESS CHECK 
  
          LDDL   TEMP1       ERROR CODE 
          LMC    CNDSUCC
          NJN    IPID102     IF NOT CONDITIONAL SUCCESS ERROR 
          LDML   DCB+OEF     OPERATION FLAGS
          LPC    CSD
          NJN    IPID100     IF CONDITIONAL SUCCESS IS DISABLED 
          LDC    CNSCS       CONDITIONAL SUCCESS BIT FOR GENERAL STATUS 
          RJM    GSUPD       SET CONDITIONAL SUCCESS BIT IN GS
          UJN    IPID102
  
 IPID100  LDN    ZERO 
          STML   DCB+GS      CLEAR GENERAL STATUS 
          LJM    IPIDEND
  
*         TASK BUSY CHECK 
  
 IPID102  LDDL   TEMP1       ERROR CODE 
          LMC    TSKBSY 
          NJN    IPID104     IF NOT TASK BUSY ERROR CODE
          LDC    TKBUSY      TASK BUSY BIT
          STML   DCB+GS      SET TASK BUSY BIT IN GENERAL STATUS
          LJM    IPIDEND     JUMP AHEAD 
  
*         MASTER TERMINATION ERROR CHECK
  
 IPID104  LDDL   TEMP1       ERROR CODE 
          LMC    DTSITMO
          ZJP    IPIE        IF TRANSFER SLAVE-IN TMO ERROR 
  
*         CRITICAL CLASS 3 INTERRUPT CHECK
  
          LDDL   TEMP1       ERROR CODE 
          LMC    CRITERR
          ZJN    IPID106     IF CLASS 3 INTERRUPT ERROR 
  
*         UNRECOVERABLE DATA ERROR PRESENT
  
          LDDL   TEMP1       ERROR CODE 
          LMC    UNRCERR
          ZJN    IPID105     IF UNRECOVERED DATA ERROR
          LDDL   TEMP1       ERROR CODE 
          LMC    UNSCDBT
          NJN    IPID108     IF NOT UNSUCCESSFUL DATA BURST TRANSFER
 IPID105  LDC    WCLASS1     CLASS 1 EXPECTED INTERRUPT 
          RJM    RSPHDL      INPUT COMMAND COMPLETE RESPONSE PACKET 
          NJN    IPIDCRT     ERROR DELSELECT THE CONTROLLER 
          LJM    IPID140     SELECT OPERATION FAILURE 
  
*         CRITICAL RESPONSE PACKET PRESENT
  
 IPID106  RJM    DSL         DESELECT CONTROLLER
          NJN    IPIDCRT     ERROR CLEAR GENERAL STATUS ERROR 
          LDC    WCLASS3     EXPECTED CLASS 3 INTERRUPT FLAG
          RJM    RSPHDL      CLASS 3 RESPONSE PACKET
          NJN    IPIDCRT     ERROR CLEAR GENERAL STATUS ERROR 
          UJN    IPIE        SET FATAL ERROR BIT
  
 IPIDCRT  LDML   DCB+GS      GENERAL STATUS 
          LPC    GSSCMSK     CLEAR STATUS ERROR 
          STML   DCB+GS      RESTORE GENERAL STATUS 
 IPIE     LJM    IPID130     INCLUDE FATAL ERROR BIT
  
*         BUSY/RESERVED CHECK 
  
 IPID108  LDN    CEPID       COMMAND EXCEPTION PARAMETER ID 
          RJM    LPW         FIND THAT PARAMETER WORD IN THE SB 
          NJN    IPID110     IF COMMAND EXCEPTION PARAMETER ID NOT FOUND
          LDN    THREE
          RADL   TEMP1       POINT TO DESIRED COMMAND EXCEPTION WORD
          LDML   SB+PMW,TEMP1  EXCEPTION STATUS 
          LPC    DRSV 
          ZJN    IPID110     IF DRIVE RESERVED BIT NOT SET
 DRVBUSY  LDC    BUSYF       BUSY BIT 
          UJN    IPID135     JUMP AHEAD 
  
*         DRIVE BUSY, NOT OPERATIONAL CHECK 
  
 IPID110  LDN    IRPID       INTERVENTION REQUIRED PARAMETER ID 
          RJM    LPW         FIND THAT ID 
          NJN    IPID140     IF INTERVENTION REQUIRED PARAM ID NOT FOUND
          AODL   TEMP1       ADD 1 TO PARAMETER OFFSET
          LDML   SB+PMW,TEMP1  INTERVENTION STATUS PARAMETER WORD 
          SHN    MINUS12     RIGHT-JUSTIFY UPPER 4 BITS 
          STDL   TEMP2       SAVE STATUS
          LPN    NOTOP
          ZJN    IPID115     IF OPERATIONAL 
          LDN    DNOF        DRIVE NOT OPERATIONAL FAILURE
          RJM    GSUPD       SET THAT BIT IN GENERAL STATUS WORD
 IPID115  LDDL   TEMP2       UPPER INTERVENTION STATUS
          LPN    FACBSY 
          ZJN    IPID120     IF FACILITY BUSY NOT SET 
          UJN    DRVBUSY     SET DRIVE BUSY STATUS
  
*         DRIVE NOT READY CHECK 
  
 IPID120  LDDL   TEMP2       INTERVENTION STATUS
          LPN    NOTRDY      DRIVE NOT READY BIT
          ZJN    IPID140     IF READY 
          LDN    DNRF        DRIVE NOT READY FAILURE BIT
          UJN    IPID135     SET BIT IN GENERAL STATUS
  
*         FATAL ERROR SET-UP
  
 IPID130  LDC    FTLERR      FATAL ERROR BIT
 IPID135  RJM    GSUPD       SET IT IN THE GENERAL STATUS WORD
  
*         FAILING MAJOR OPERATION CHECK 
  
 IPID140  LDDL   CURMO
          NJN    IPID150     IF FAILING MAJOR OPERATION NOT ZERO
          LDN    SDRSEQF     (SEL,DESEL,RESET) SEQ FAILURE BIT
 IPID150  RJM    GSUPD       SET ERROR BIT IN GENERAL STATUS WO 
  
*         CALLING PROGRAM'S DIRECT CELL RESTORATION (10B - 37B) 
  
 IPIDEND  LDN    CHANN       STARTING D-CELL ADDRESS
          STDL   SECCTR      STORE IN LAST D-CELL 
 RSLOOP   LDML   DCSTR-CHANN,SECCTR  SAVED D-CELL CONTENTS
          STIL   SECCTR      RESTORE IN PROPER D-CELL 
          AODL   SECCTR      INCREMENT D-CELL FETCH ADDRESS 
          SBN    SECCTR 
          NJN    RSLOOP      DO ALL CELLS 
          LDML   DCSTR-CHANN,SECCTR  LAST D-CELL TO BE SAVED
          STDL   SECCTR      RESTORE LAST D-CELL
  
*         IPI DRIVER EXIT 
  
 DRVEXIT  LDML   DCB+GS      GENERAL STATUS 
          LJM    IPIDX       EXIT WITH GS IN THE A-REGISTER 
  
*         TASK ADDRESS TABLE
  
 TSKTBL   CONL   TA1         JUMP TABLE FOR TASK CALLS
          CONL   TA2
          CONL   TA3
          CONL   TA4
          CONL   TA5
          CONL   TA6
          CONL   TA7
          CONL   TA8
          CONL   TA9
          CONL   TA10 
          CONL   TA11 
          CONL   TA12 
          CONL   TA13 
          CONL   TA14 
          CONL   TA15 
          CONL   TA16 
          CONL   TA17 
          CONL   TA18 
  
 ESCRTN   TITLE  INTERVAL DATA BURST ESCAPE TO CALLING PROGRAM
**        ESCRTN - INTERVAL DATA BURST ESCAPE TO CALLING PROGRAM
* 
 ESCRTN   LDN    ONES 
          STML   DBIPRG      SET THE DATA BURSTING IN PROGRESS FLAG 
  
*         SAVE IPI DRIVER D-CELLS 
  
          LDDL   CHANN       STARTING D-CELL INSTRUCTION ADDR FOR TEST
          STML   DCELLS      STORE IT IN 1ST WORD OF D-CELL BUFFER
          LDN    CMMSK       2ND D-CELL STORAGE LOCATION
          STDL   CHANN       STORE IN 1ST FREED D-CELL
 STLOOP2  LDIL   CHANN       CONTENTS OF D-CELL TO BE SAVED 
          STML   DCELLS-CHANN,CHANN  STORE IN MEMORY BUFFER 
          AODL   CHANN       INCREMENT D-CELL FETCH ADDRESS 
          SBN    SECCTR+1 
          MJN    STLOOP2     IF NOT AT D-CELL ADDRESS + 1 
          LDC    TSKBSY      TASK BUSY STATUS 
          LJM    IPID90      PROCESS STATUS AND EXIT
  
*         CENTRAL MEMORY TRANSFER WORD COUNT
  
          IFNE   I0ON+IOUOFF,0,1
 CMTWC    CONL   ZERO        CENTRAL MEMORY TRANSFER WORD COUNT 
  
*         MULTI-PASS FLAG 
  
 MLTIPASS CONL   ZERO        MULTI-PASS FLAG
 IPICHN   CONL   ZERO        IPI CHANNEL FLAG 
  
*         DATA-BURSTING-IN-PROGRESS FLAG
  
 DBIPRG   CONL   ZERO        DATA-BURSTING-IN-PROGRESS FLAG 
  
*         RESUME INTERVAL BURSTING FLAG 
  
 RSMIB    CONL   ZERO        RESUME INTERVAL BURSTING FLAG
  
*         T-REGISTERS FOR I4 DMA TRANSFERS
  
          IFNE   I4ON+IOUOFF,0,3
 TREGS    CONL   2048D       SINGLE-BURST BYTE COUNT
 RMAUP    CONL   0           RMA UPPER BYTE ADDRESS 
 RMALW    CONL   0           RMA LOWER BYTE ADDRESS 
  
 ALLTSK   TITLE  TASK ROUTINES
**        TASK ROUTINES 
* 
*         IMPORTANT STANDARD ENTRY PREREQUISITES FOR ALL FUNCTIONS
*         ********* ******** ***** ************* *** *** *********
* 
*         (DCB+TSK) = TASK NUMBER    (DCB+CA)  = CONTROLLER ADDRESS 
*         (DCB+CHN)= IPI CHANNEL ADDR 
* 
*         IMPORTANT STANDARD EXIT CONDITIONS THAT ARE USED BY EVERY 
*         MODULE AND SUBROUTINE IN THIS IPI COMMON DRIVER 
*         ********************************************************* 
* 
*         (A) = 0        ... ROUTINE RAN ERROR-FREE 
*         (A) = NON-ZERO ... ERROR CODE OF FAILING CONDITION
* 
*         NOTE -- THE ONLY SUBROUTINE THAT  DOES  NOT RETURN TO THE 
*                 CALLING  ROUTINE  UPON  DISCOVERY  OF AN ERROR IS 
*                 SENDFCN.  THIS  IS BECAUSE OF THE LARGE AMOUNT OF 
*                 MEMORY THAT THIS METHOD SAVES, AND BECAUSE OF THE 
*                 SEVERITY OF THE ERROR THAT THE SENDFCN SUBROUTINE 
*                 WILL REPORT.
* 
  
 TA1      TITLE  TASK 1 - MASTER/SELECTIVE RESET
**        TA1 - TASK 1 - MASTER/SELECTIVE RESET 
* 
*         THIS MODULE WILL FIRST MASTER CLEAR THE IPI ADAPTER, THEN 
*         WILL PERFORM THE FOLLOWING RESET;  BASED ON THE STATE OF
*         THE SLAVE RESET ENABLE BIT IN WORD DCB+OEF... 
*           SLR      RESET PERFORMED
*           ---      -------------------
*            0 ..... MASTER/LOGICAL 
*            1 ..... MASTER/SLAVE 
* 
*         ENTRY - SEE STANDARD
* 
*         CALLS - MSR, SENDFCN
* 
*         USES - VFW
* 
 TA1      SUBR               ENTRY/EXIT 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    SLR
          ZJN    TA1A        IF SLAVE RESET NOT ENABLED 
          LDDL   SLAVE       SHIFTED CONTROLLER ADDRESS 
          LMC    SVRFW       OR IN THE SLAVE RESET CODE 
          UJN    TA1B        JUMP AHEAD 
  
 TA1A     LDDL   SLAVE       SHIFTED CM-3 ADDRESS 
          LMC    LIRFW       XOR WITH LOGICAL INTERFACE RESET FUNC WORD 
 TA1B     STDL   VFW         SAVE RESET FUNCTION WORD 
          RJM    MSR         DO MASTER/SELECTIVE RESET
 TA1EXT   UJN    TA1X        RETURN/EXIT
  
 TA2      TITLE  TASK 2 - SELECT CONTROLLER 
**        TA2 - TASK 2 - SELECT CONTROLLER
* 
*         THIS MODULE WILL SELECT THE DRIVE CONTROLLER (CM-3).
* 
*         ENTRY - SEE STANDARD
* 
*         CALLS - SELCT 
* 
*         USES - CURTSK, CURMO
* 
 TA2      SUBR               ENTRY/EXIT 
          LDN    SELCTRL
          STDL   CURTSK      SET CURRENT TASK = 2 
          LDN    ZERO 
          STDL   CURMO       SET MAJOR OPERATION TO ZERO
          RJM    SELCT       SELECT THE CONTROLLER
          UJN    TA2X        RETURN/EXIT
  
 TA3      TITLE  TASK 3 - DESELECT CONTROLLER 
**        TA3 - TASK 3 - DESELECT CONTROLLER
* 
*         THIS MODULE WILL DESELECT THE DRIVE CONTROLLER. 
* 
*         ENTRY - SEE STANDARD. 
* 
*         CALLS - DSL 
* 
*         USES - CURTSK, CURMO
* 
 TA3      SUBR               ENTRY/EXIT 
          LDN    DESEL
          STDL   CURTSK      SET CURRENT TASK = 3 
          LDN    ZERO 
          STDL   CURMO       SET MAJOR OPERATION TO ZERO
          RJM    DSL         DESELECT THE CONTROLLER
 TA3EXT   UJN    TA3X        RETURN/EXIT
  
 TA4      TITLE  TASK 4 - RESERVE DRIVE 
**        TA4 - TASK 4 - RESERVE DRIVE
* 
*         THIS MODULE WILL ISSUE A COMMAND TO RESERVE THE SPECIFIED 
*         DRIVE.
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS
* 
*         CALLS - CORI, SCP, RSPHDL, ORTCHK 
* 
*         USES - CURTSK, RCB+OM, TSFOA
* 
 TA4      SUBR               ENTRY/EXIT 
          LDN    RESDR
          STDL   CURTSK      SET CURRENT TASK = 4 
          LDC    RCB         RESERVE COMMAND BUFFER ADDRESS 
          STDL   TSFOA       STORE IN ITO'S TRANSFER OUT ADDRESS
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    PRE
          NJN    TA4A        IF PRIORITY RESERVE IS SET 
          LDC    RVOP        RESERVE OPCODE 
          STML   RCB+OM      STORE OPCODE/MOD WORD IN COMMAND BUFFER
          LDN    SCWL        SHORT COMMAND PACKET WORD COUNT
          RJM    CORI        ISSUE COMMAND/RECEIVE RESPONSE 
          UJN    TA4EXT      EXIT 
  
 TA4A     LDC    PRVOP       PRIORITY RESERVE OPCODE
          STML   RCB+OM      STORE OPCODE/MOD WORD IN COMMAND BUFFER
          LDN    SCWL        SHORT COMMAND PACKET WORD COUNT
          RJM    SCP         SEND COMMAND PACKET
          NJN    TA4EXT      IF ERROR 
          LDC    WMCLSS1     CLASS 1/WAIT INTERRUPT FLAG
          RJM    RSPHDL      WAIT/RECEIVE RESPONSE PACKET 
          NJN    TA4EXT      IF ERROR 
          RJM    CSCHK
          NJN    TA4EXT      IF COMMAND WAS NOT SUCCESSFUL
          LDN    TEN         CONSTANT FOR 10-PASS COUNTER 
          STDL   COUNTER     STORE INITIAL COUNT
 TA4LOOP  DELAY  US50000     DELAY 50,000 USEC
          SODL   COUNTER     DECREMENT COUNT
          NJN    TA4LOOP     IF NOT 10 PASSES 
 TA4EXT   LJM    TA4X        RETURN/EXIT
  
 TA5      TITLE  TASK 5 - RELEASE DRIVE 
**        TA5 - TASK 5 - RELEASE DRIVE
* 
*         THIS MODULE WILL ISSUE A COMMAND TO RELEASE THE SPECIFIED 
*         DRIVE.
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS
* 
*         CALLS - CORI
* 
*         USES - CURTSK, RCB+OM, TSFOA
* 
 TA5      SUBR               ENTRY/EXIT 
          LDN    RELDR
          STDL   CURTSK      SET CURRENT TASK = 5 
          LDC    RLOP        RELEASE OPCODE 
          STML   RCB+OM      STORE OPCODE/MOD IN COMMAND BUFFER 
          LDC    RCB         RESERVE COMMAND BUFFER ADDRESS 
          STDL   TSFOA       STORE IN ITO'S TRANSFER OUT ADDRESS
          LDN    SCWL        SHORT COMMAND PACKET WORD COUNT
          RJM    CORI        ISSUE COMMAND/RECEIVE RESPONSE 
 TA5EXT   UJN    TA5X        RETURN/EXIT
  
          IFNE   SEEKO,0
 TA6      TITLE  TASK 6 - SEEK
**        TA6 - TASK 6 - SEEK 
* 
*         THIS MODULE WILL COMMAND THE SPECIFIED DRIVE TO SEEK TO THE 
*         SPECIFIED CYLINDER ADDRESS. 
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS
*                 (DCB+CYL)= TARGET CYLINDER ADDRESS
* 
*         CALLS - CORI
* 
*         USES - CB+OM, TSFOA, CB+CT2 
* 
 TA6      SUBR               ENTRY/EXIT 
          LDC    POM         POSITION OPCODE/MODIFIER 
          STML   CB+OM       STORE IN COMMAND BUFFER
          LDN    ZERO 
          STML   CB+CT2      CLEAR DATA COUNT AREA IN COMMAND BUFFER
          LDC    CB          COMMAND BUFFER ADDRESS 
          STDL   TSFOA       STORE IN ITO'S TRANSFER OUT ADDRESS
          LDN    NCWL        STANDARD COMMAND WORD COUNT
          RJM    CORI        ISSUE SEEK COMMAND AND RECEIVE RESPONSE
 TA6EXT   UJN    TA6X        RETURN/EXIT
          ELSE
 TA6      TITLE  TASK 6 - SEEK
**        TASK 6 NOT SUPPORTED
* 
 TA6      SUBR               ENTRY/EXIT 
          LDC    INVTK       INVALID TASK ERROR CODE
          UJN    TA6X        RETURN 
          ENDIF 
  
 TA7      TITLE  TASK 7 - SEEK-READ DATA
**        TA7 - TASK 7 - SEEK-READ DATA 
* 
*         THIS MODULE WILL PERFORM AN IMPLIED SEEK-READ OF A SPECIFIED
*         NUMBER OF SECTORS FROM THE SPECIFIED CYLINDER, HEAD, AND
*         SECTOR ON THE DRIVE AND TRANSFER THEM INTO THE SPECIFIED PP 
*         OR CENTRAL MEMORY AREA STARTING AT THE SPECIFIED FWA. 
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS, 
*                 (DCB+CYL)=CYLINDER, (DCB+HD)=HEAD, (DCB+SEC)=SECTOR,
*                 (DCB+FWA1)=1ST WORD ADDRESS, OR (R-REG) UPPER 
*                 (DCB+FWA2)=(R-REG) LOWER FOR CM DATA TRANSFERS
*                 (DCB+FWA3)=(A-REG) FOR CM DATA TRANSFERS
*                 (DCB+STC)= NUMBER OF SECTORS TO TRANSFER
* 
*         CALLS - RDO 
* 
*         USES - CURTSK, CB+OM
* 
 TA7      SUBR               ENTRY/EXIT 
          LDN    SEKRD
          STDL   CURTSK      SET CURRENT TASK = 7 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    AR 
          NJN    TA7A        IF AUTO RETRY IS ON
          LDC    RDOM        READ OPCODE/MODIFIER 
          UJN    TA7B 
  
 TA7A     LDC    RDOMAR      READ OPCODE/MOD WITH AUTO RETRY
 TA7B     STML   CB+OM       STORE IN COMMAND BUFFER
          RJM    RDO         PERFORM READ DATA OPERATION
          UJN    TA7X        RETURN/EXIT
  
 TA8      TITLE  TASK 8 - SEEK-WRITE DATA 
**        TA8 - TASK 8 - SEEK-WRITE DATA
* 
*         THIS MODULE WILL PERFORM AN IMPLIED SEEK-WRITE TRANSFER OF A
*         SPECIFIED NUMBER OF SECTORS FROM A SPECIFIED STARTING PP OR 
*         CENTRAL MEMORY ADDRESS ONTO THE SPECIFIED DISK DRIVE AT THE 
*         SPECIFIED STARTING CYLINDER, HEAD, AND SECTOR ADDRESS.
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS, 
*                 (DCB+CYL)=CYLINDER, (DCB+HD)=HEAD, (DCB+SEC)=SECTOR,
*                 (DCB+FWA1)=1ST WORD ADDRESS, OR (R-REG) UPPER 
*                 (DCB+FWA2)=(R-REG) LOWER FOR CM DATA TRANSFERS
*                 (DCB+FWA3)=(A-REG) FOR CM DATA TRANSFERS
*                 (DCB+STC)= NUMBER OF SECTORS TO TRANSFER
* 
*         CALLS - WDO 
* 
*         USES - CURTSK, CB+OM
* 
 TA8      SUBR               ENTRY/EXIT 
          LDN    SEKWR
          STDL   CURTSK      SET CURRENT TASK = 8 
          LDC    WDOM        WRITE OPCODE/MODIFIER
          STML   CB+OM       STORE IN COMMAND BUFFER
          RJM    WDO         PERFORM WRITE DATA OPERATION 
          UJN    TA8X        RETURN/EXIT
  
          IFNE   BUFRDO,0 
 TA9      TITLE  TASK 9 - READ DATA FROM CONTROLLER BUFFER
**        TA9 - TASK 9 - READ DATA FROM CONTROLLER BUFFER 
* 
*         THIS MODULE WILL TRANSFER ONE SECTOR OF DATA (2048 BYTES) 
*         FROM THE SELECTED CONTROLLER'S DATA BUFFER TO THE SPECIFIED 
*         PP OR CENTRAL MEMORY DATA BUFFER. 
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS, 
*                 (DCB+FWA1)=1ST WORD ADDRESS, OR (R-REG) UPPER 
*                 (DCB+FWA2)=(R-REG) LOWER FOR CM DATA TRANSFERS
*                 (DCB+FWA3)=(A-REG) FOR CM DATA TRANSFERS
*                 (DCB+STC)= 1 ... DOES 2K BURST ONLY 
* 
*         CALLS - RWBCS, RDO
* 
*         USES - CB, CB+RBP1, CB+RBP2 
* 
 TA9      SUBR               ENTRY/EXIT 
          LDC    RBOM        READ BUFFER OPCODE MODIFIER
          RJM    RWBCS       SET UP COMMAND BUFFER
          LDN    RDBFCL      READ BUFFER COMMAND LENGTH 
          STML   CB          CHANGE PACKET LENGTH TO 20 
          LDC    RBPM1
          STML   CB+RBP1     STORE 1ST PARAMETER WORD 
          LDC    RBPM2
          STML   CB+RBP2     STORE 2ND PARAMETER WORD 
          RJM    RDO         PERFORM READ DATA OPERATION
          UJN    TA9X        RETURN/EXIT
          ELSE
 TA9      TITLE  TASK 9 - READ DATA FROM CONTROLLER BUFFER
**        TASK 9 NOT SUPPORTED
* 
 TA9      SUBR               ENTRY/EXIT 
          LDC    INVTK       INVALID TASK ERROR CODE
          UJN    TA9X        RETURN 
          ENDIF 
  
          IFNE   BUFWRO,0 
 TA10     TITLE  TASK 10 - WRITE DATA TO CONTROLLER BUFFER
**        TA10 - TASK 10 - WRITE DATA TO CONTROLLER BUFFER
* 
*         THIS MODULE WILL TRANSFER ONE SECTOR OF DATA (2048 BYTES) 
*         FROM PP OR CENTRAL MEMORY TO THE SELECTED CONTROLLER'S
*         DATA BUFFER.
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS, 
*                 (DCB+FWA1)=1ST WORD ADDRESS, OR (R-REG) UPPER 
*                 (DCB+FWA2)=(R-REG) LOWER FOR CM DATA TRANSFERS
*                 (DCB+FWA3)=(A-REG) FOR CM DATA TRANSFERS
*                 (DCB+STC)= 1 ... DOES 2K BURST ONLY 
* 
*         CALLS - RWBCS, WDO
* 
*         USES - NONE 
* 
 TA10     SUBR               ENTRY/EXIT 
          LDC    WBOM        READ BUFFER OPCODE MODIFIER
          RJM    RWBCS       SET UP THE COMMAND BUFFER
          RJM    WDO         PERFORM WRITE DATA OPERATION 
          UJN    TA10X       RETURN/EXIT
          ELSE
 TA10     TITLE  TASK 10 - WRITE DATA TO CONTROLLER BUFFER
**        TASK 10 NOT SUPPORTED 
* 
 TA10     SUBR               ENTRY/EXIT 
          LDC    INVTK       INVALID TASK ERROR CODE
          UJN    TA10X       RETURN 
          ENDIF 
  
 TA11     TITLE  TASK 11 - SELECT/SEEK-READ/DESELECT
**        TA11 - TASK 11 - SELECT/SEEK-READ/DESELECT
* 
*         THIS MODULE WILL PERFORM TASKS 2, 7, AND 3.  IF (DCB+OEF--
*         DRS AND/OR DRL) ARE SET, THEN TASKS 4 AND/OR 5 WILL ALSO BE 
*         CALLED. 
* 
*         ENTRY - (SEE TASKS 2, 3, 4, 5, AND 7) 
* 
*         CALLS - TA2, TA3, TA4, TA5, TA7 
* 
*         USES - NONE 
* 
 TA11     SUBR               ENTRY/EXIT 
          RJM    TA2         SELECT CONTROLLER
          NJN    TA11EXT     IF ERROR 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    DRS
          ZJN    TA11A       IF DRIVE RESERVE NOT ENABLED 
          RJM    TA4         RESERVE DRIVE
          NJN    TA11EXT     IF ERROR 
 TA11A    RJM    TA7         PERFORM SEEK-READ DATA 
          NJN    TA11EXT     IF ERROR 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    DRL
          ZJN    TA11B       IF DRIVE RELEASE NOT ENABLED 
          RJM    TA5         RELEASE DRIVE
          NJN    TA11EXT     IF ERROR 
 TA11B    RJM    TA3         DESELECT CONTROLLER
 TA11EXT  UJN    TA11X       RETURN/EXIT
  
 TA12     TITLE  TASK 12 - SELECT/SEEK-WRITE/DESELECT 
**        TA12 - TASK 12 - SELECT/SEEK-WRITE/DESELECT 
* 
*         THIS MODULE WILL PERFORM TASKS 2, 8, AND 3. IF (DCB+OEF-- 
*         DRL) ARE SET, THEN TASKS 4 AND 5 WILL ALSO BE CALLED. 
* 
*         ENTRY - (SAME AS TASKS 2, 3, 4, 5, AND 8) 
* 
*         CALLS - TA2, TA3, TA4, TA5, TA8 
* 
*         USES - NONE 
* 
 TA12     SUBR               ENTRY/EXIT 
          RJM    TA2         SELECT CONTROLLER
          NJN    TA12EXT     IF ERROR 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    DRS
          ZJN    TA12A       IF DRIVE RESERVE NOT ENABLED 
          RJM    TA4         RESERVE DRIVE
          NJN    TA12EXT     IF ERROR 
 TA12A    RJM    TA8         PERFORM SEEK-WRITE DATA
          NJN    TA12EXT     IF ERROR 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    DRL
          ZJN    TA12B       IF DRIVE RELEASE NOT ENABLED 
          RJM    TA5         RELEASE DRIVE
          NJN    TA12EXT     IF ERROR 
 TA12B    RJM    TA3         DESELECT CONTROLLER
 TA12EXT  UJN    TA12X       RETURN/EXIT
  
          IFNE   CMDGO,0
 TA13     TITLE  TASK 13 - PERFORM CONTROLLER DIAGNOSTICS 
**        TA13 - TASK 13 - PERFORM CONTROLLER DIAGNOSTICS 
* 
*         THIS MODULE WILL ISSUE THE PERFORM CONTROLLER DIAGNOSTICS 
*         COMMAND TO THE CONTROLLER AND WAIT TO RECIEVE THE STATUS
*         PACKET; CHECKING FOR A SUCCESSFUL OPERATION.
* 
*         ENTRY - (SEE STANDARD)
* 
*         CALLS - COWMRI
* 
*         USES - TSFOA, PCDCB+PCD1, PCDCB+PCD2
* 
 TA13     SUBR               ENTRY/EXIT 
          LDML   DCB+CDG1    2ND PARAMETER WORD 
          STML   PCDCB+PCD1  STORE IN COMMAND BUFFER
          LDML   DCB+CDG2    3RD PARAMETER WORD 
          STML   PCDCB+PCD2  STORE IN COMMAND BUFFER
          LDC    PCDCB       PERFORM CM-3 DIAGNOSTIC BUFFER ADDRESS 
          STDL   TSFOA       STORE IN ITO'S TRANSFER OUT ADDRESS
          LDN    CDCL        CONTROLLER DIAGNOSTIC COMMAND LENGTH 
          RJM    COWMRI      ISSUE COMMAND/RECEIVE RESPONSE 
          UJN    TA13X       RETURN/EXIT
          ELSE
 TA13     TITLE  TASK 13 - PERFORM CONTROLLER DIAGNOSTICS 
**        TASK 13 NOT SUPPORTED 
* 
 TA13     SUBR               ENTRY/EXIT 
          LDC    INVTK       INVALID TASK ERROR CODE
          UJN    TA13X       RETURN 
          ENDIF 
  
          IFNE   DRDGO,0
 TA14     TITLE  TASK 14 - PERFORM DRIVE DIAGNOSTICS
**        TA14 - TASK 14 - PERFORM DRIVE DIAGNOSTICS
* 
*         THIS MODULE WILL ISSUE THE PERFORM DRIVE DIAGNOSTICS COMMAND
*         TO THE CONTROLLER AND WAIT TO RECEIVE THE STATUS PACKET;
*         CHECKING FOR A SUCCESSFUL OPERATION.
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS
* 
*         CALLS - COWMRI
* 
*         USES - RCB+OM, TSFOA
* 
 TA14     SUBR               ENTRY/EXIT 
          LDC    DDOM        DRIVE DIAGNOSTIC OPCODE MODIFIER 
          STML   RCB+OM      STORE MODIFIER 
          LDC    RCB         RESERVE COMMAND BUFFER ADDRESS 
          STDL   TSFOA       STORE IN ITO'S TRANSFER OUT ADDRESS
          LDN    SCWL        DRIVE DIAGNOSTIC COMMAND LENGTH
          RJM    COWMRI      ISSUE COMMAND/RECEIVE RESPONSE 
          UJN    TA14X       RETURN/EXIT
          ELSE
 TA14     TITLE  TASK 14 - PERFORM DRIVE DIAGNOSTICS
**        TASK 14 NOT SUPPORTED 
* 
 TA14     SUBR               ENTRY/EXIT 
          LDC    INVTK       INVALID TASK ERROR CODE
          UJN    TA14X       RETURN 
          ENDIF 
  
 TA15     TITLE  TASK 15 - REQUEST DRIVE TYPE 
**        TA15 - TASK 15 - REQUEST DRIVE TYPE 
* 
*         THIS MODULE WILL ISSUE AN ATTRIBUTE COMMAND TO RETREIVE THE 
*         DRIVE TYPE INFORMATION FROM THE SPECIFIED DRIVE. INFORMATION
*         WILL BE IN THE SB AFTER THE TASK COMPLETES SUCCESSFULLY.
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS
* 
*         CALLS - CORI
* 
*         USES - TSFOA
* 
 TA15     SUBR               ENTRY/EXIT 
          LDC    ACB         ADDRESS OF ATTRIBUTE COMMAND BUFFER
          STDL   TSFOA       STORE INTO ITO'S TRANSFER OUT ADDRESS
          LDN    ATTRCWL     ATTRIBUTE COMMAND'S WORD LENGTH
          RJM    CORI        ISSUE COMMAND RECEIVE RESPONSE 
          UJN    TA15X       RETURN/EXIT
  
          IFNE   RQTCO,0
 TA16     TITLE  TASK 16 - REQUEST TASK COMPLETE
**        TA16 - TASK 16 - REQUEST TASK COMPLETE
* 
*         THIS MODULE WILL PERFORM A REQUEST INTERRUPTS SEQUENCE ONCE 
*         TO SEE IF A PREVIOUSLY INITIATED TASK IS COMPLETE.  IF AN 
*         INTERRUPT IS PRESENT, THE RESPONSE PACKET WILL BE INPUTTED AND
*         SUCCESSFUL WILL BE CHECKED.  OTHERWISE, A TASK BUSY IS ISSUED.
* 
*         CALLS - RSPHDL, DSL, CSCHK
* 
 TA16     SUBR               ENTRY/EXIT 
          LDN    CLASS1      CLASS 1 INTERRUPT FLAG 
          RJM    RSPHDL      HANDLE ANY INTERRUPTS ARRIVING 
          NJN    TA16EXT     IF ERROR OR BUSY 
          RJM    DSL         DESELECT THE CONTROLLER
          NJN    TA16EXT     IF ERROR 
          RJM    CSCHK       COMMAND SUCCESSFUL CHECK 
 TA16EXT  UJN    TA16X       RETURN/EXIT
          ELSE
 TA16     TITLE  TASK 16 - REQUEST TASK COMPLETE
**        TASK 16 NOT SUPPORTED 
* 
 TA16     SUBR               ENTRY/EXIT 
          LDC    INVTK       INVALID TASK ERROR CODE
          UJN    TA16X       RETURN 
          ENDIF 
  
          IFNE   IFMTO,0
 TA17     TITLE  TASK 17 - INITIAL FORMAT 
**        TA17 - TASK 17 - INITIAL FORMAT 
* 
*         THIS MODULE WILL ISSUE A COMMAND TO DO AN INITIAL FORMAT OF 
*         THE ENTIRE IPI DRIVE'S HDA WITH 2048-BYTE SECTORS.
* 
*         ENTRY - STANDARD AND (DCB+DA)= DRIVE ADDRESS
* 
*         CALLS - SCP, RSPHDL, CSCHK
* 
*         USES - TSFOA
* 
 TA17     SUBR               ENTRY/EXIT 
          LDC    FCB         ADDRESS OF FORMAT COMMAND BUFFER 
          STDL   TSFOA       STORE INTO ITO'S TRANSFER OUT ADDRESS
          LDN    FMTCWL      FORMAT COMMAND'S WORD LENGTH 
          RJM    SCP         SEND THE FORMAT COMMAND
          NJN    TA17EXT     IF ERROR 
          LDC    WLCLSS1     WAIT RESPONSE CONSTANT 
          RJM    RSPHDL      WAIT UP TO 30 MIN FOR RESPONSE 
          NJN    TA17EXT     IF ERROR 
          RJM    CSCHK       COMMAND SUCCESSFUL CHECK 
 TA17EXT  UJN    TA17X       RETURN/EXIT
          ELSE
 TA17     TITLE  TASK 17 - INITIAL FORMAT 
**        TASK 17 NOT SUPPORTED 
* 
 TA17     SUBR               ENTRY/EXIT 
          LDC    INVTK       INVALID TASK ERROR CODE
          UJN    TA17X       RETURN 
          ENDIF 
  
          IFNE   LCIMLO,0 
 TA18     TITLE  TASK 18 - LOAD CONTROLLER IML
**        TA18 - TASK 18 - LOAD CONTROLLER IML
* 
*         THIS MODULE WILL ISSUE THE COMMAND WHICH WILL DOWNLOAD (DATA
*         STREAM) A GIVEN AMOUNT OF IML DATA FROM CENTRAL MEMORY. 
*         A POWER-UP SEQUENCE IS THEN RUN BY THE CONTROLLER.
* 
*         ENTRY - SEE STANDARD
* 
*         CALLS - SCP, RSPHDL, SDS, CSCHK 
* 
*         USES - TSFOA, LCICB+CT1, LCICB+CT2
* 
 TA18     SUBR               ENTRY/EXIT 
          LDN    ONES 
          STML   RESBUR      SET THE RESIDUE BURST FLAG 
          LDML   DCB+IBCU    UPPER IML BYTE COUNT 
          LPN    LNMSK       MASK OFF THE RESIDUE BYTE COUNT
          STML   LCICB+CT1   STORE IN COMMAND BUFFER
          LDML   DCB+IBCL    LOWER IML BYTE COUNT 
          STML   LCICB+CT2   STORE IN COMMAND BUFFER
          LDC    LCICB       ADDRESS OF LOAD CM-3 IML COMMAND BUFFER
          STDL   TSFOA       STORE INTO ITO'S TRANSFER OUT ADDRESS
          LDN    LCICL       LOAD CM-3 IML COMMAND WORD LENGTH
          RJM    SCP         SEND THE FORMAT COMMAND
          NJN    TA18EXT     IF ERROR 
          LDC    WCLASS2     CLASS 2 WAIT CONSTANT
          RJM    RSPHDL      WAIT FOR TRANSFER NOTIFICATION 
          NJN    TA18EXT     IF ERROR 
          RJM    SDS         WRITE/STREAM IML DATA TO CONTROLLER
          NJN    TA18EXT     IF ERROR 
          LDC    WLCL1A      WAIT RESPONSE CONSTANT 
          RJM    RSPHDL      WAIT FOR 2 MIN FOR CLASS 1 INTERRUPT 
          NJN    TA18EXT     IF ERROR 
          LDN    MEXPID      MACHINE EXCEPTION PARAMETER ID 
          RJM    ORTCHK 
          NJN    TA18EXT     IF NOT OPERATIONAL AND READY 
          RJM    DSL         DESELECT FROM THE CONTROLLER 
          NJN    TA18EXT     IF ERROR 
          LDC    WLCL1A      6 MIN ASYNCRONOUS DELAY COUNT
          RJM    RSPHDL      WAIT FOR DESIRED DRIVE'S ASYNC RESPONSE
          NJN    TA18EXT     IF ERROR 
          LDN    DMEXID      DRIVE MACHINE EXCEPTION PARAMETER ID 
          RJM    ORTCHK      DRIVE OPERATIONAL AND READY TRANSITION 
 TA18EXT  LJM    TA18X       RETURN/EXIT
          ELSE
 TA18     TITLE  TASK 18 - LOAD CONTROLLER IML
**        TASK 18 NOT SUPPORTED 
* 
 TA18     SUBR               ENTRY/EXIT 
          LDC    INVTK       INVALID TASK ERROR CODE
          UJN    TA18X       RETURN 
          ENDIF 
  
 BBBDT    TITLE  BURST-BY-BURST DATA TRANSFER 
**        BBBDT - BURST-BY-BURST DATA TRANSFER
* 
*         THIS SUBROUTINE WILL R/W FROM THE CONTROLLER ONE SECTOR OF
*         DATA AT A TIME, UNTIL THE SPECIFIED NUMBER OF SECTORS HAS 
*         BEEN TRANSFERRED, OR UNTIL THE INTERVAL BURST COUNT = 0 AND 
*         THE BURST RELEASE ENABLE IS USED. A CLASS 2 INTERRUPT IS
*         CHECKED FOR BURST BOUNDARY.  FINALLY, THE CONTROLLER IS 
*         DESELECTED. 
* 
*         ENTRY - (A)= BURST BUS CONTROL WORD 
* 
*         CALLS - BSC, ITO, ITI, EDS, DSL, RSPHDL 
* 
*         USES - SECCTR,BURBCW,TIDA,TSFOA,RLW,RUP,TEMP1,RESBUR,RSMIB, 
*          DBIPRG,CMTWC,IBC 
* 
 BBBDT    SUBR               ENTRY/EXIT 
          STDL   BURBCW      STORE BURST BUS CONTROL WORD 
          LDML   DCB+STC     NUMBER OF SECTORS
          STDL   SECCTR      SAVE IT
 BBBLOOP  LDDL   BURBCW      BURST BUS CONTROL WORD 
          RJM    BSC         PERFORM BUS CONTROL SEQUENCE 
          NJP    BBBEXT      IF ERROR 
          LDDL   BURDIR      BURST DIRECTION
          NJN    BBB10       IF TRANSFER EQUAL OUTPUT (77)
          LDN    ONES 
          RJM    ITI         DO INFORMATION TRANSFER IN (READ DATA) 
          UJN    BBB20
  
 BBB10    RJM    ITO         DO INFORMATION TRANSFER OUT (WRITE DATA) 
 BBB20    NJP    BBBEXT      IF ERROR 
          LDC    GMSFW       GOOD MASTER STATUS FUNCTION
          RJM    EDS         DO ENDING STATUS SEQUENCE
          NJP    BBBEXT      IF ERROR 
          IFNE   I0ON+IOUOFF,0,2
          LDC    ONEK 
          STML   CMTWC       SET CM WORD COUNT TO SINGLE BURST SIZE 
          IFNE   I4ON+IOUOFF,0,2
          LDC    TWOK 
          STML   TREGS       SET I4/DMA T-REGS FOR SINGLE BURST BY
          SODL   SECCTR      DECREMENT TOTAL TRANSFER SECTOR COUNT
          IFNE   LCIMLO,0 
          ZJP    BBB50       IF SECTOR COUNT 0
          ELSE
          ZJP    BBB60       IF SECTOR COUNT 0
          ENDIF 
 BPEB     LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    BRE
          ZJN    RESUME      IF BURST-RELEASE IS NOT ENABLED
          SODL   IBC         DECREMENT THE
          ZJP    ESCRTN      IF INTERVAL BURST COUNT 0
 RESUME   LDML   ISSS        LATEST SLAVE ENDING STATUS 
          LPN    PAUSE
          ZJN    BBB25       IF NO PAUSE LOOP BACK FOR MORE DATA
          RJM    DSL         DESELECT CONTROLLER
          NJP    BBBEXT      IF ERROR 
          LDC    WCLASS2     CLASS 2 INTERRUPT BIT
          RJM    RSPHDL      WAIT/RECEIVE RESPONSE PACKET 
          NJP    BBBEXT      IF ERROR 
 BBB25    LDML   RSMIB
          ZJN    BBB30       IF RESUME INTERVAL BURSTING FLAG NOT SET 
          LDN    ZERO 
          STML   RSMIB       CLEAR THE RESUME INTERVAL BURSTING FLAG
          UJN    BBBLB       TO LOOP BACK 
  
 BBB30    LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    CMT
          IFNE   IOUOFF,0,1 
          NJN    BBBCMT      IF CENTRAL MEMORY TRANSFER 
          IFNE   I0ON,0,1 
          NJN    BBBCMI0     IF CENTRAL MEMORY TRANSFER 
          IFNE   I4ON,0,1 
          NJN    BBB40       IF CENTRAL MEMORY TRANSFER 
          LDC    ONEK        SINGLE-BURST WORD COUNT
          RAML   TIDA        REPLACE/ADD IN STORAGE ADDRESSES 
          LDC    ONEK        SINGLE-BURST WORD COUNT
          RADL   TSFOA       REPLACE/ADD IN TRANSFER OUT ADDRESS
          UJN    BBBLB       JUMP AHEAD 
  
          IFNE   IOUOFF,0,3 
 BBBCMT   LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          NJN    BBB40       IF I4 DRIVER ENABLED 
          IFNE   I0ON+IOUOFF,0,4
 BBBCMI0  LDN    CTWRL4      CENTRAL MEMORY WORDS PER BURST 
          RAD    RLW         REPLACE/ADD IN R-REG LOWER 
          SHN    MINUS12     RIGHT-JUSTIFY ANY OVERFLOW 
          RAD    RUP         REPLACE/ADD IN R-REG UPPER 
          IFNE   IOUOFF,0,1 
          UJN    BBBLB       LOOP BACK FOR ANOTHER BURST
  
          IFNE   I4ON+IOUOFF,0,4
 BBB40    LDC    CTW256      CENTRAL MEMORY WORDS PER BURST 
          RAML   RMALW       REPLACE/ADD IN RMA LOWER 
          SHN    MINUS16     RIGHT-JUSTIFY ANY OVERFLOW 
          RAML   RMAUP       REPLACE/ADD IN RMA UPPER 
 BBBLB    LJM    BBBLOOP     LOOP BACK FOR ANOTHER BURST
  
          IFNE   LCIMLO,0 
 BBB50    LDML   RESBUR 
          ZJN    BBB60       IF RESIDUE BURST FLAG NOT SET
          LDN    ONE
          STDL   SECCTR      SET SECTOR COUNT FOR LAST SECTOR 
          LDN    ZERO 
          STML   RESBUR      CLEAR RESIDUE BURST FLAG 
          LDML   DCB+IBCU    UPPER BYTE COUNT 
          SHN    MINUS4      SHIFT TO SAVE RESIDUE BYTE COUNT 
          ZJN    BBB60       IF UPPER BYTE COUNT 0
          IFNE   I4ON+IOUOFF,0,1
          STML   TREGS       STORE IN T-REGISTER
          ADN    ONE         ADD 1 BEFORE CONVERTING
          SHN    MINUS1      CONVERT BYTE COUNT TO WORD COUNT 
          IFNE   I0ON+IOUOFF,0,1
          STML   CMTWC       SAVE I0 CENTRAL MEMORY WORD COUNT
          STDL   TOWC        SAVE PP TRANSFER WORD COUNT
          LJM    BPEB        BACK 
          ENDIF 
  
 BBB60    RJM    DSL         DESELECT THE CONTROLLER
 BBBEXT   STDL   TEMP1       SAVE ERROR IF ANY
          LDN    ZERO 
          STML   DBIPRG      CLEAR DATA-BURSTING-IN-PROGRESS FLAG 
          STML   RSMIB       CLEAR RESUME INTERVAL BURSTING FLAG
          LDDL   TEMP1       ERROR IF ANY 
          LJM    BBBDTX      RETURN 
  
*         RESIDUE BURST FLAG FOR LOAD CM-3 IML COMMAND
  
 RESBUR   CONL   ZERO        RESIDUE BURST FLAG 
  
*         INTERVAL SLAVE-ENDING STATUS STORAGE
  
 ISSS     CONL   ZERO        LATEST SLAVE STATUS FOR INTERVAL BURSTING
  
 BSC      TITLE  BUS CONTROL SEQUENCE 
**        BSC - BUS CONTROL SEQUENCE
* 
*         THIS SUBROUTINE WILL READY THE IPI BUS INTERFACE FOR A
*         SPECIFIC TYPE OF INFORMATION TRANSFER, INPUT AND STORE
*         THE BUS ACKNOWLEDGE BYTE, AND COMPARE IT WITH THE 
*         EXPECTED VALUE. 
* 
*         ENTRY - (A)= BUS CONTROL FUNCTION WORD
* 
*         CALLS - SENDFCN, FCLT 
* 
*         USES - DCB+LBAS 
* 
 BSC      SUBR               ENTRY/EXIT 
          RJM    SENDFCN     SEND BUS CONTROL FUNCTION TO IPI ADAPTER 
          ACN    CH          ACTIVATE CHANNEL 
          RJM    FCLT        WAIT FOR SYNC IN TO COME UP
          NJN    BSCER1      IF ERROR 
          IAN    CH          INPUT BUS ACKNOWLEDGE BYTE 
          LPC    LBMSK       MASK LOWER BYTE
          STML   DCB+LBAS    SAVE IT
          NJN    BSCER2      IF ERROR 
          DCN    CH+UNH      DISCONNECT CHANNEL 
          SFM    BSCER3,CH   IF CHANNEL ERROR 
          LDC    DSOF        DROP SYNC-OUT FUNCTION 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          ACN    CH 
          RJM    FCLT        WAIT FOR SYNC-IN TO DROP 
          NJN    BSCER4      IF ERROR 
          DCN    CH+UNH 
 BSCEXT   UJN    BSCX        RETURN 
  
*         ERROR EXITS 
  
 BSCER1   LDN    E31         SYNC-IN UP TMO ERROR CODE
          UJN    BSCEXT      EXIT 
  
 BSCER2   LDN    E32         UNEXP BUS ACK BYTE ERROR 
          UJN    BSCEXT      EXIT 
  
 BSCER3   LDN    E33         CHANNEL ERROR FLAG SET ERROR CODE
          RJM    RIPIER      LOG ERROR AND READ IPI ERROR REGISTER
          UJN    BSCEXT      EXIT 
  
 BSCER4   LDN    E34         SYNC-IN DROP TMO ERROR CODE
          UJN    BSCEXT      EXIT 
  
 CORI     TITLE  COMMAND OUT / RESPONSE IN
**        CORI - COMMAND OUT / RESPONSE IN
* 
*         THIS SUBROUTINE WILL SEND THE CONTENTS OF THE COMMAND BUFFER
*         TO THE CONTROLLER AND INPUTS THE CONTROLLER'S RESPONSE PACKET 
*         TO COMPLETE THE SPECIFIED OPERATION.  IT ALSO CHECKS FOR
*         SUCCESSFUL MAJOR STATUS.
* 
*         ENTRY - (A)= COMMAND BLOCK LENGTH IN 16-BIT WORDS 
* 
*         CALLS - SCP, RSPHDL, CSCHK
* 
 CORI     SUBR               ENTRY/EXIT 
          RJM    SCP         SEND COMMAND PACKET
          NJN    CORIEXT     IF ERROR 
          LDC    WCLASS1     CLASS 1 INTERRUPT FLAG 
          RJM    RSPHDL      WAIT/RECEIVE RESPONSE PACKET 
          NJN    CORIEXT     IF ERROR 
          RJM    CSCHK       COMMAND SUCCESSFUL CHECK 
 CORIEXT  UJN    CORIX       RETURN 
  
          IFNE   CMDGO+DRDGO,0
 COWMRI   TITLE  COMMAND OUT/RESPONSE IN (WITH 2 MINUTE RESPONSE TMO) 
**        COWMRI - COMMAND OUT/RESPONSE IN (WITH 2 MINUTE RESPONSE TMO) 
* 
*         THIS SUBROUTINE WILL SEND THE CONTENTS OF THE COMMAND BUFFER
*         TO THE CONTROLLER AND THEN WAIT UP TO 2 MINUTES FOR AN
*         INTERRUPT FROM THE CONTROLLER.  IF NO INTERRUPT APPEARS,
*         AN ERROR IS GENERATED;  OTHERWISE THE RESPONSE PACKET IS
*         INPUTTED AND THE SUCCESSFUL STATUS IS CHECKED.
* 
*         ENTRY - (A)= COMMAND BLOCK LENGTH IN 16-BIT WORDS 
* 
*         CALLS - SCP, RSPHDL, CSCHK
* 
 COWMRI   SUBR               ENTRY/EXIT 
          RJM    SCP         SEND COMMAND PACKET
          NJN    COWMEXT     IF ERROR 
          LDC    WMCLSS1     CLASS 1/WAIT INTERRUPT FLAG
          RJM    RSPHDL      WAIT/RECEIVE RESPONSE PACKET 
          NJN    COWMEXT     IF ERROR 
          RJM    CSCHK       COMMAND SUCCESSFUL CHECK 
 COWMEXT  UJN    COWMRIX     RETURN 
          ENDIF 
  
 CSCHK    TITLE  COMMAND SUCCESSFUL CHECK 
**        CSCHK - COMMAND SUCCESSFUL CHECK
* 
*         THIS SUBROUTINE WILL CHECK THE MAJOR STATUS WORD OF THE SB FOR
*         SUCCESSFUL OR CONDITIONAL SUCCESS BITS SET.  IF NOT SUCCESSFUL
*         OR IF CONDITIONAL SUCCESS IS SET, THEN (A) WILL BE ZERO UPON
*         EXIT. 
* 
*         EXIT - (A) = 0   ... COMMAND WAS SUCCESSFUL 
*                (A) NOT 0 ... ERROR CODE FOR FAILING CONDITION 
* 
*         USES - DCB+PLLE 
* 
 CSCHK    SUBR               ENTRY/EXIT 
          LDDL   MAJORST     MAJOR STATUS 
          LPC    LBMSK       LOWER BYTE 
          LMN    SCCMS
          ZJN    CSCEXT      IF STANDARD COMMAND COMPLETION STATUS
          LDDL   MAJORST     MAJOR STATUS 
          LPN    LNMSK       MAJOR CODE 
          SBN    CSMS 
          ZJN    CSCER       IF CONDITIONAL SUCCESS 
          LDC    ONSERR      OPERATION NOT SUCCESSFUL ERROR 
 CSCEXT   UJN    CSCHKX      RETURN 
  
 CSCER    LDC    CNDSUCC     CONDITIONAL SUCCESS ERROR
          STML   DCB+PLLE    STORE THE ERROR
          LDN    ZERO        SET INDICATOR TO CONTINUE
          UJN    CSCEXT      EXIT 
  
          IFNE   IOUOFF+I4ON,0
 DELUS    TITLE  DELAY MICROSECONDS 
**        DELUS - DELAY MICROSECONDS
* 
*         THIS SUBROUTINE WILL DELAY THE NUMBER OF MICROSECONDS 
*         INDICATED BY THE CONTENTS OF REGISTER A ON ENTRY. 
* 
*         ENTRY - (A)= NUMBER OF MICROSECONDS TO DELAY
* 
 DELUS    SUBR               ENTRY/EXIT 
 DELOOP   PSN                DELAY 150-250 USECS
          PSN                DELAY 150-250 USECS
          SBN    ONE         DECREMENT DELAY COUNT
          NJN    DELOOP      IF NOT EXHAUSTED 
          UJN    DELUSX      RETURN 
          ENDIF 
  
 DFWASTR  TITLE  DATA FWA STORAGE 
**        DFWASTR - DATA FWA STORAGE
* 
*         THIS SUBROUTINE WILL STORE THE CURRENT DCB FWA'S INTO THE 
*         INPUT/OUTPUT PP INSTRUCTIONS.  (HANDLES BOTH I0 AND I4
*         FWA'S)
* 
*         CALLS - NONE
* 
*         USES - RUP, RLW, AREG, RMAUP, RMALW 
* 
 DFWASTR  SUBR               ENTRY/EXIT 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    CMT
          IFNE   IOUOFF,0,1 
          NJN    DFWA10      IF CENTRAL MEMORY TRANSFER 
          IFNE   I0ON,0,1 
          NJN    DFWA20      IF CENTRAL MEMORY TRANSFER 
          IFNE   I4ON,0,1 
          NJN    DFWA30      IF CENTRAL MEMORY TRANSFER 
          LDML   DCB+FWA1    PP FWA 
          STDL   TSFOA       STORE IN TRANSFER OUTPUT WORD
          STML   TIDA        STORE IN TRANSFER INPUT INSTRUCTION
          UJN    DFWAEXT     EXIT 
  
          IFNE   IOUOFF,0,3 
 DFWA10   LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          NJN    DFWA30      IF I4 DRIVER ENABLED 
          IFNE   I0ON+IOUOFF,0
 DFWA20   LDML   DCB+FWA1    ADDRESS FOR R-REG UPPER
          STDL   RUP         SAVE ADDRESS 
          LDML   DCB+FWA2    ADDRESS FOR R-REG LOWER AND A-REG
          STDL   RLW         SET UP (R-REG) LOWER 
          LDML   DCB+FWA3    (A-REG) FOR CENTRAL MEMORY ADDRESS 
          STDL   AREG        STORE IN D-CELL FOR A-REG
          LDC    ONEK 
          STML   CMTWC       CENTRAL MEMORY WORD COUNT FOR ONE SECTOR 
          ENDIF 
          IFNE   IOUOFF,0,1 
          UJN    DFWAEXT     EXIT 
  
          IFNE   I4ON+IOUOFF,0,6
 DFWA30   LDML   DCB+FWA1    UPPER CENTRAL MEMORY ADDRESS 
          STML   RMAUP       SAVE ADDRESS 
          LDML   DCB+FWA2    LOWER CENTRAL MEMORY ADDRESS 
          STML   RMALW       SET UP (R-REG) LOWER 
          LDC    TWOK 
          STML   TREGS       LOAD 2048 BYTE COUNT INTO T-REGS 
 DFWAEXT  LJM    DFWASTRX    RETURN 
  
          IFNE   I4ON+IOUOFF,0
 DMAI4    TITLE  DMA/I4 DATA TRANSFER 
**        DMAI4 - DMA/I4 DATA TRANSFER
* 
*         THIS SUBROUTINE WILL TRANSFER ONE 2K-PAGE OF STREAMING DATA 
*         ACROSS THE IPI CHANNEL. 
* 
*         ENTRY - (A) = I4 DMA TRANSFER FUNCTION
* 
*         CALLS - SENDFCN 
* 
*         USES - COUNTER
* 
 DMAI4    SUBR               ENTRY/EXIT 
          RJM    SENDFCN     ISSUE IPI ADAPTER FUNCTION 
          LDN    TREGCT      T-REG COUNT
          ACN    CH 
          OAM    TREGS,CH    SEND T-REGISTER DATA 
          FJM    DMAER3,CH   IF CHANNEL FULL
          DCN    CH+UNH 
          LDC    DMALPCT     DMA LOOP COUNT (500 USEC)
          STDL   COUNTER     SAVE IN COUNTER
 DMALOOP  LDC    ROPLS       READ OPERATIONAL STATUS FUNCTION 
          RJM    SENDFCN     ISSUE IPI ADAPTER FUNCTION 
          ACN    CH 
          IAN    CH          INPUT OPERATIONAL STATUS 
          DCN    CH+UNH 
          LPN    TIPMSK 
          ZJN    DMA10       IF TRANSFER-IN-PROGRESS NOT SET
          SODL   COUNTER     DECREMENT LOOP COUNTER 
          NJN    DMALOOP     IF NOT 0 
          UJN    DMAER1      FOR TIME-OUT ERROR 
  
 DMA10    LDC    RDERST      READ ERROR STATUS FUNCTION 
          RJM    SENDFCN     ISSUE IPI ADAPTER FUNCTION 
          ACN    CH 
          IAN    CH          INPUT ERROR STATUS 
          DCN    CH+UNH 
          NJN    DMAER2      IF ERROR STATUS NOT 0
 DMAEXT   LJM    DMAI4X      RETURN 
  
 DMAER1   LDC    DMATRM      TERMINATE DMA MODE FUNCTION
          RJM    SENDFCN     ISSUE IPI ADAPTER FUNCTION 
          LDN    EC          TRANSFER-IN-PROGRESS TMO ERROR 
          UJN    DMAEXT      EXIT 
  
 DMAER2   LDC    CLREI4      CLEAR ERROR REGISTER (I4) FUNCTION 
          RJM    SENDFCN     ISSUE IPI ADAPTER FUNCTION 
          LDN    ED          DMA/I4 ERROR STATUS PRESENT
          UJN    DMAEXT      EXIT 
  
 DMAER3   LDC    ECHFLL      CHANNEL NOT EMPTY AFTER T-REGS LOADED
          UJN    DMAEXT      EXIT 
          ENDIF 
  
 DSL      TITLE  DESELECT CONTROLLER SEQUENCE 
**        DSL - DESELECT CONTROLLER SEQUENCE
* 
*         THIS SUBROUTINE WILL SEND THE DESELECT FUNCTION WORD TO THE 
*         CONTROLLER AND WAIT FOR THE SLAVE IN SIGNAL TO DROP.
* 
*         ENTRY - NONE
* 
*         CALLS - SENDFCN, FCLT 
* 
*         USES - NONE 
* 
 DSL      SUBR               ENTRY/EXIT 
          LDC    DSFW        DESELECT FUNCTION WORD 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          ACN    CH 
          RJM    FCLT        WAIT FOR SLAVE-IN TO DROP
          NJN    DSLER1      IF ERROR 
          DCN    CH+UNH 
          SFM    DSL1        IF CHANNEL ERROR STATUS
 DSLEXT   UJN    DSLX        RETURN 
  
*         IF CHANNEL ERROR DETECTED ON DESELECT CLEAR ERROR AND EXIT
  
 DSL1     BSS    0           ENTRY POINT
          IFNE   IOUOFF,0 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4          CHECK IF I4 DRIVER ENABLED 
          NJN    DSL2        IF I4 CLEAR I4 ERROR STATUS
          LDC    CLRLSI      THE CLEAR IPI ERROR REGISTER FUNCTION
          RJM    SENDFCN     ISSUE ADAPTER FUNCTION 
          LDC    CKRGFW      SET INTERNAL CLOCK (10 MB) 
          UJN    DSL3 
  
 DSL2     LDC    CLREI4      CLEAR I4 ERROR STATUS FUNCTION 
          ENDIF 
          IFNE   I0ON,0,3 
          LDC    CLRLSI      CLEAR IPI ERROR REGISTER FUNCTION
          RJM    SENDFCN     ISSUE ADAPTER FUNCTION 
          LDC    CKRGFW      SET INTERNAL CLOCK (10 MB) 
          IFNE   I4ON,0,1 
          LDC    CLREI4      CLEAR I4 ERROR STATUS FUNCTION 
 DSL3     RJM    SENDFCN     ISSUE ADAPTER FUNCTION 
          LDN    0           DONT PROCESS ANY ERRORS
          UJN    DSLX 
  
*         ERROR EXITS 
  
 DSLER1   LDC    E81         SLAVE-IN DROP TIME-OUT ERROR 
          UJN    DSLEXT      EXIT 
  
 EDS      TITLE  ENDING STATUS SEQUENCE 
**        EDS - ENDING STATUS SEQUENCE
* 
*         THIS SUBROUTINE WILL SEND THE MASTER STATUS BYTE TO THE 
*         CONTROLLER, THEN INPUT AND STORE THE SLAVE ENDING STATUS. 
* 
*         ENTRY - (A) = MASTER STATUS FUNCTION WORD 
* 
*         CALLS - SENDFCN, FCLT 
* 
*         USES - DCB+LSVS, DCB+PLLE 
* 
 EDS      SUBR               ENTRY/EXIT 
          RJM    SENDFCN     SEND MASTER STATUS/DROP MASTER OUT 
          ACN    CH 
          RJM    FCLT        WAIT FOR SLAVE-IN TO COME UP 
          NJN    EDSER1      IF ERROR 
          IAN    CH          INPUT SLAVE (CM-3) STATUS
          LPC    LBMSK       MASK LOWER BYTE
          STML   DCB+LSVS    STORE IN DCB OUTPUT AREA 
          STML   ISSS        SAVE ALSO FOR INTERVAL BURSTING
          DCN    CH+UNH 
          SFM    EDSER2,CH   IF CHANNEL ERROR FLAG SET
          LPC    SITS 
          NJN    EDS10       IF SUCCESSFUL
          LDML   DCB+LSVS    SLAVE STATUS 
          LPN    LNMSK       MASK ENCODED ENDING STATUS 
          SBN    CL3RSP 
          NJN    EDSER3      IF NOT CLASS 3 RESPONSE
  
*         CRITICAL RESPONSE OCCURRED
  
          LDC    CRITERR     CRITICAL CLASS 3 ERROR CODE
          UJN    EDSEXT      EXIT 
  
 EDS10    LDN    ZERO        INDICATE NO ERRORS 
 EDSEXT   LJM    EDSX        RETURN 
  
*         ERROR EXITS 
  
 EDSER1   LDC    E51         CH FULL TIME-OUT WAITING FOR ENDING STATUS 
          UJN    EDSEXT      EXIT 
  
 EDSER2   LDC    E52         CHANNEL ERROR AFTER ENDING STATUS RECEIVED 
          RJM    RIPIER      LOG ERROR AND READ IPI ERROR REGISTER
          UJN    EDSEXT      EXIT 
  
 EDSER3   LDDL   CURMO       MAJOR OPERATION INDICATOR
          LPN    RWDF 
          ZJN    EDSNS       IF PREVIOUS TRANSFER WAS NOT DATA
          RJM    DSL         DESELECT THE CONTROLLER
          LDC    UNSCDBT     UNSUCC DATA BURST TRANSFER ERROR 
          UJN    EDSEXT      EXIT 
  
 EDSNS    LDC    E53         INFORMATION TRANSFER NOT SUCCESSFUL ERROR
          UJN    EDSEXT      EXIT 
  
 FCLT     TITLE  FULL CHANNEL USEC LOOP TIMER 
**        FCLT - FULL CHANNEL USEC LOOP TIMER 
* 
*         THIS SUBROUTINE WILL WAIT FOR THE IPI CHANNEL TO BECOME FULL
*         OR UNTIL 1 MILLISECOND HAS EXPIRED. 
* 
*         ENTRY - (A) = DESIRED DELAY CONSTANT
* 
*         EXIT - (A)=0 ... ERROR-FREE, (A)=77B ... TIME-OUT ERROR 
* 
* 
 FCLT     SUBR               ENTRY/EXIT 
          LDC    DL1MS       1 MS LOOP COUNT
 FCLT10   FJM    FCLT20,CH   IF CHANNEL FULL
          SBN    ONE         DECREMENT DELAY COUNT
          NJN    FCLT10      IF NOT ZERO
          LDN    ONES        SET ERROR
          UJN    FCLTEXT     EXIT 
  
 FCLT20   LDN    ZERO        FLAG NO ERROR
 FCLTEXT  UJN    FCLTX       RETURN 
  
 GSUPD    TITLE  GENERAL STATUS UPDATE
**        GSUPD - GENERAL STATUS UPDATE 
* 
*         THIS SUBROUTINE WILL EXCLUSIVE-OR THE (A) UPON ENTRANCE 
*         WITH THE CURRENT CONTENTS OF THE DCB'S GENERAL STATUS WORD. 
* 
*         ENTRY - (A) = DESIRED STATUS BIT TO BE SET. 
* 
*         USES - DCB+GS 
* 
 GSUPD    SUBR               ENTRY/EXIT 
          LMML   DCB+GS      SET DESIRED STATUS INTO COPY OF GS 
          STML   DCB+GS      STORE NEW GENERAL STATUS WORD
          UJN    GSUPDX      RETURN 
  
 ITI      TITLE  INFORMATION TRANSFER IN SEQUENCE 
**        ITI - INFORMATION TRANSFER IN SEQUENCE
* 
*         THIS SUBROUTINE WILL INPUT THE SPECIFIED RESPONSE PACKET OR 
*         DATA BLOCK FROM THE CONTROLLER/DRIVE AND STORES IT IN THE 
*         SPECIFIED PP OR CENTRAL MEMORY ADDRESS. 
* 
*         ENTRY - (FLAG)= 0 ... STATUS TRANSFER 
*                 (FLAG)= NON-ZERO ... DATA TRANSFER
* 
*         CALLS - SENDFCN, EDS, DSL 
* 
*         USES - LOOPCTR, CMTWC, DCB+PLLE 
* 
 ITI      SUBR               ENTRY/EXIT 
          ZJP    RSPXSF      IF STATUS TRANSFER 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    CMT
          ZJN    ITI10       IF NOT CENTRAL MEMORY TRANSFER 
          LDC    CSRFW       CENTRAL STREAMING READ FUNCTION
          UJN    ITI15
  
 ITI10    LDC    SRTFW       STREAMING READ TRANSFER FUNCTION 
 ITI15    RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    CMT
          IFNE   IOUOFF,0,1 
          NJP    CMW         IF CENTRAL MEMORY TRANSFER 
          IFNE   I0ON,0,1 
          NJP    CMW5        IF CENTRAL MEMORY TRANSFER 
          IFNE   I4ON,0,1 
          NJP    CMW10       IF CENTRAL MEMORY TRANSFER 
  
*         INPUT DATA FROM DISK TO PP MEMORY 
  
          ACN    CH 
          LDC    ONEK        DATA WORD COUNT
  
***       NEXT INSTRUCTION GETS MODIFIED      *** 
  
          IAM    ZERO,CH     INPUT PP DATA BLOCK
 TIDA     EQU    *-1         TRANSFER IN DATA ADDRESS 
          LJM    ITI20
  
*         INPUT RESPONSE PACKET FROM CONTROLLER TO STATUS 
*         BUFFER INTO PP MEMORY.
  
 RSPXSF   LDC    SRTFW       STREAMING READ TRANSFER FUNCTION 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          ACN    CH 
          LDN    RPHDRLG     WORD COUNT OF 5
          IAM    SB,CH       INPUT 1ST 5 WORDS OF RESPONSE PACKET 
          LDML   SB          NUMBER OF BYTES TO EXPECT
          ADN    THREE       ADD THREE TO BYTE COUNT
          SHN    MINUS1      DIVIDE BY 2 FOR NUMBER OF WORDS
          SBN    RPHDRLG     SUBTRACT AMOUNT TRANSFERRED SO FAR 
          ZJP    ITIGOOD     IF ALL WORDS READ
          STDL   LOOPCTR     SAVE ACTUAL REMAINING WORD COUNT 
          SBN    MRSBW1      MAXIMUM REMAINING SB WORD COUNT + 1
          PJN    OVFLW10     IF REMAINING WORD COUNT GREATER THAN MAX 
          LDDL   LOOPCTR     ACTUAL REMAINING WORD COUNT
          IAM    SB+5,CH     INPUT REMAINDER OF RESPONSE PACKET 
          LJM    ITI20       TRANSFER RESIDUE CHECK 
  
*         SB OVERFLOW HANDLER 
  
 OVFLW10  LDN    MRSBW       MAXIMUM REMAINING SB WORD COUNT
          IAM    SB+5,CH     INPUT TO END OF THE STATUS BUFFER
 OVFLW20  IAN    CH+UNH      INPUT A WORD OF OVERFLOW STATUS
          IJM    ITIGOOD,CH  IF CHANNEL INACTIVE
          UJN    OVFLW20     LOOP BACK TO INPUT ANOTHER WORD
  
*         INPUT DATA FROM DISK TO CENTRAL MEMORY
  
          IFNE   IOUOFF,0,3 
 CMW      LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          NJN    CMW10       IF I4 DRIVER ENABLED 
          IFNE   I0ON+IOUOFF,0
 CMW5     ACN    CH 
          LRD    RUP         LOAD R-REGISTERS 
          LDDL   AREG        CONTENTS OF A-REG
          ADC    ERREG       SET BIT 17 FOR (R)+(A) USAGE 
          CHCM   CMTWC,CH    INPUT BURST OF CENTRAL MEMORY DATA 
          LDML   CMTWC       FETCH REMAINING TRANSFER WORD COUNT
          ENDIF 
          IFNE   IOUOFF,0,1 
          LJM    ITI20       JUMP AHEAD 
  
*         I4/IPI DMA TRANSFER 
  
          IFNE   I4ON+IOUOFF,0
 CMW10    LDC    DMAWRT      DMA/I4 WRITE FUNCTION
          RJM    DMAI4       PERFORM DMA TRANSFER 
          ZJP    ITIEXT      IF NO DMA TRANSFER ERRORS
          LMC    E70         ADD TO BASE TRANSFER ERROR 
          STML   DCB+PLLE    STORE AS PREVIOUS LOW-LEVEL ERROR
          LDC    RDTREG      READ T-REGS FUNCTION 
          RJM    SENDFCN     ISSUE READ T-REGISTERS FUNCTION
          ACN    CH 
          EJM    ITIER2,CH   IF CHANNEL EMPTY 
          IAN    CH          INPUT THE T-REG BYTE COUNT RESIDUE 
          DCN    CH+UNH      DISCONNECT CHANNEL 
          ADN    ONE         ADD 1 BEFORE CONVERTING
          SHN    MINUS1      SHIFT TO CONVERT TO WORD COUNT 
          STDL   TEMP1       SAVE RESIDUE WORD COUNT
          LDC    RIPIST      READ IPI STATUS FUNCTION 
          RJM    SENDFCN     ISSUE THE FUNCTION 
          ACN    CH 
          EJM    ITIER2,CH   IF CHANNEL EMPTY 
          IAN    CH          INPUT THE IPI STATUS 
          SHN    SVISHF      SHIFT THE SLAVE-IN STATUS TO UPPER BIT 
          MJN    ITISIT      SLAVE-IN TIMEOUT ERROR 
          UJN    ITITMO1     JUMP AHEAD 
          ENDIF 
  
*         ENDING SECTION FOR ALL INPUT TRANSFERS
  
 ITI20    STDL   TEMP1       SAVE TRANSFER RESIDUE
          NJN    ITIER1      IF RESIDUE NOT 0 
          LDC    DLINACT     INPUT DELAY COUNT
 ITILP    IJM    ITIGOOD,CH  IF CHANNEL INACTIVE
          SBN    ONE         DECREMENT COUNT
          NJN    ITILP       LOOP UNTIL ZERO
 ITISIT   LDC    DTSITMO     SLAVE-IN TIME-OUT ERROR
          UJN    ITIEXT      EXIT 
  
 ITIGOOD  LDN    ZERO 
 ITIEXT   LJM    ITIX        RETURN 
  
*         ERROR EXITS 
  
 ITIER1   LDC    E71         TRANSFER LENGTH ERROR
 ITITMO   STML   DCB+PLLE    STORE PRIOR ERROR CODE 
          DCN    CH+UNH 
 ITITMO1  LDC    BMSFW       UNSUCCESSFUL MASTER STATUS FUNCTION
          RJM    EDS         PERFORM ENDING STATUS SEQUENCE 
          NJN    ITIEXT      IF ERROR 
          RJM    DSL         DESELECT FROM CONTROLLER 
          NJN    ITIEXT      IF ERROR 
 ITITMO2  LDDL   TEMP1       TRANSFER RESIDUE COUNT 
          LMC    ONEK 
          NJN    IER2EXT     GREATER THAN 0 WORDS TRANSFERRED 
          LDML   DCB+LSVS    LATEST ENDING STATUS 
          LPC    PAUSE       CLEAR ALL BITS EXCEPT PAUSE BITS 
          LMN    NMDATA 
          NJN    IER2EXT     IF MORE DATA 
          LDC    UNRCERR     UNRECOVERABLE DATA ERROR 
          UJN    ITIEXT      EXIT 
  
 IER2EXT  LDML   DCB+PLLE    PRIMARY ERROR CODE 
          UJN    ITIEXT      EXIT 
  
 ITIER2   LDC    E72         CHANNEL EMPTY WHEN ADAPTER INPUT EXPECTED
          LJM    ITIEXT      EXIT 
  
 ITO      TITLE  INFORMATION TRANSFER OUT SEQUENCE
**        ITO - INFORMATION TRANSFER OUT SEQUENCE 
* 
*         THIS SUBROUTINE WILL OUTPUT TO THE CONTROLLER/DRIVE THE 
*         SPECIFIED COMMAND, PP DATA, OR CENTRAL MEMORY DATA BLOCK. 
* 
*         ENTRY - (A) = 0 ... COMMAND TRANSFER TYPE 
*                 (A) = 77... DATA TRANSFER TYPE
*                 (TOWC)= TRANSFER OUT WORD COUNT 
* 
*         CALLS - SENDFCN, EDS, DSL 
* 
*         USES - CMTWC, DCB+PLLE
* 
 ITO      SUBR               ENTRY/EXIT 
          ZJN    ITO10       IF COMMAND TRANSFER
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    CMT
          IFNE   IOUOFF,0,1 
          NJN    CMR         IF CENTRAL MEMORY TRANSFER 
          IFNE   I0ON,0,1 
          NJN    CMR5        IF CENTRAL MEMORY TRANSFER 
          IFNE   I4ON,0,1 
          NJN    CMR10       IF CENTRAL MEMORY TRANSFER 
 ITO10    LDC    SWTFW       STREAMING WRITE TRANSFER FUNCTION
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
  
*         COMMAND OR PP DATA OUTPUT TRANSFER
  
          LDDL   TSFOA       TRANSFER OUTPUT ADDRESS
          STML   TOA         STORE IN OUTPUT INSTRUCTION
          ACN    CH 
          LDDL   TOWC        TRANSFER OUT WORD COUNT
  
***       NEXT INSTRUCTION GETS MODIFIED      *** 
  
          OAM    ZERO,CH     OUTPUT INFORMATION BLOCK 
 TOA      EQU    *-1         TRANSFER OUT ADDRESS 
          LJM    ITO20
  
*         CENTRAL MEMORY OUTPUT DATA TRANSFER 
  
          IFNE   IOUOFF,0,3 
 CMR      LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          NJN    CMR10       IF I4 DRIVER ENABLED 
          IFNE   I0ON+IOUOFF,0
 CMR5     LDC    CSWFW       CENTRAL STREAMING WRITE FUNCTION 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          ACN    CH 
          LRD    RUP         LOAD R-REGISTERS 
          LDDL   AREG        CONTENTS OF A-REG
          ADC    ERREG       SET BIT 17 FOR (R)+(A) USAGE 
          CMCH   CMTWC,CH    OUTPUT BURST OF CENTRAL MEMORY DATA
          LDML   CMTWC       FETCH REMAINING TRANSFER WORD COUNT
          ENDIF 
          IFNE   IOUOFF,0,1 
          LJM    ITO20       JUMP AHEAD 
  
*         I4/IPI DMA TRANSFER 
  
          IFNE   I4ON+IOUOFF,0
 CMR10    LDC    SWTFW       STREAMING WRITE TRANSFER FUNCTION
          RJM    SENDFCN     ISSUE FUNCTION TO ADAPTER
          LDC    DMARD       DMA/I4 READ FUNCTION 
          RJM    DMAI4       PERFORM DMA TRANSFER 
          ZJP    ITOEXT      IF NO DMA TRANSFER ERRORS
          LMC    E40         ADD TO BASE TRANSFER ERROR 
          STML   DCB+PLLE    STORE AS PREVIOUS LOW-LEVEL ERROR
          LDC    RDTREG      READ T-REGS FUNCTION 
          RJM    SENDFCN     ISSUE READ T-REGISTERS FUNCTION
          ACN    CH 
          EJM    ITOER2,CH   IF CHANNEL EMPTY 
          IAN    CH          INPUT THE T-REG BYTE COUNT RESIDUE 
          DCN    CH+UNH      DISCONNECT CHANNEL 
          ADN    ONE         ADD 1 BEFORE CONVERTING
          SHN    MINUS1      SHIFT TO CONVERT TO WORD COUNT 
          STDL   TEMP1       SAVE RESIDUE WORD COUNT
          LDC    RIPIST      READ IPI STATUS FUNCTION 
          RJM    SENDFCN     ISSUE THE FUNCTION 
          ACN    CH 
          EJM    ITOER2,CH   IF CHANNEL EMPTY 
          IAN    CH          INPUT THE IPI STATUS 
          SHN    SVISHF      SHIFT THE SLAVE-IN STATUS TO UPPER BIT 
          MJN    ITOSIT      SLAVE IN TIMEOUT ERROR 
          UJN    ITOTMO1     JUMP AHEAD 
          ENDIF 
  
*         END OF ALL TRANSFERS
  
 ITO20    STDL   TEMP1       SAVE ANY RESIDUE 
          NJN    ITOER1      IF RESIDUE 
          LDC    DLINACT     INACTIVE DELAY COUNT 
 ITOLP    IJM    ITOGOOD,CH  IF CHANNEL INACTIVE
          SBN    ONE         DECREMENT DELAY COUNT
          NJN    ITOLP       LOOP BACK UNTIL ZERO 
 ITOSIT   LDC    DTSITMO     SLAVE-IN TIME-OUT ERROR
          UJN    ITOEXT      EXIT 
  
 ITOGOOD  LDN    ZERO 
 ITOEXT   LJM    ITOX        RETURN 
  
*         ERROR EXITS 
  
 ITOER1   LDC    E41         OUTPUT TRANSFER LENGTH ERROR 
 ITOTMO   STML   DCB+PLLE    STORE FOR PREVIOUS ERROR 
          DCN    CH+UNH      DISCONNECT CHANNEL 
 ITOTMO1  LDN    BMSFW       UNSUCCESSFUL MASTER STATUS FUNCTION
          RJM    EDS         PERFORM ENDING STATUS SEQUENCE 
          NJN    ITOEXT      IF ERROR 
          RJM    DSL         DESELECT FROM CONTROLLER 
          NJN    ITOEXT      IF ERROR 
 ITOTMO2  LDDL   TEMP1       TRANSFER RESIDUE COUNT 
          LMC    ONEK 
          NJN    OER2EXT     GREATER THAN 0 WORDS TRANSFERRED 
          LDML   DCB+LSVS    LATEST ENDING STATUS 
          LPC    PAUSE       CLEAR ALL BITS EXCEPT PAUSE BITS 
          LMN    NMDATA 
          NJN    OER2EXT     IF MORE DATA 
          LDC    UNRCERR     UNRECOVERABLE DATA ERROR 
          UJN    ITOEXT      EXIT 
  
 OER2EXT  LDML   DCB+PLLE    PRIMARY ERROR CODE 
          UJN    ITOEXT      EXIT 
  
 ITOER2   LDC    E42         CHANNEL EMPTY WHEN ADAPTER INPUT EXPECTED
          LJM    ITOEXT      EXIT 
  
 LPW      TITLE  LOCATE PARAMETER WORD
**        LPW - LOCATE PARAMETER WORD 
* 
*         THIS SUBROUTINE WILL LOOK THROUGH THE ENTIRE STATUS BUFFER FOR
*         THE DESIRED PARAMETER ID FOUND IN (A) UPON ENTRANCE.  IF FOUND
*         THE (A) WILL BE ZERO UPON EXIT;  OTHERWISE IT WILL BE 77B.
* 
*         ENTRY - (A) = DESIRED PARAMETER ID
* 
*         EXIT - SB+PMW,TEMP1 = ADDRESS OF DESIRED PARAMETER ID WORD
*                (A) = 0 ... PARAMETER ID WAS FOUND 
*                (A) = 77B...PARAMETER ID WAS NOT FOUND 
* 
*         USES - SREG1, SREG2, TEMP1, TEMP2, TRPWDS 
* 
 LPW      SUBR               ENTRY/EXIT 
          STDL   SREG1       STORE DESIRED PARAMETER ID 
          LDN    ZERO 
          STDL   TEMP1       CLEAR PARAMETER RUNNING TOTAL WORD COUNT 
          LDML   SB          BYTE LENGTH OF RESPONSE PACKET 
          ADN    THREE
          SHN    MINUS1      SHIFT RIGHT 1 (DIVIDE BY 2)
          STML   TRPWDS      STORE RESPONSE PACKET WORD LENGTH
          SBN    FIVE        SUBTRACT 5 FOR COMMAND INFO & MAJOR STATUS 
          STDL   SREG2       STORE TOTAL NUMBER OF WORDS FOR PARAMETERS 
 PMLOOP   LDML   SB+PMW,TEMP1  CURRENT PARAMETER ID WORD
          ZJN    PNOTFND     IF CURRENT PARAMETER ID WORD 0 
          STDL   TEMP2       SAVE ID WORD 
          LPC    LBMSK       MASK JUST PARAMETER ID 
          LMDL   SREG1
          ZJN    LPWEXIT     IF CURRENT ID AND DESIRED ID EQUAL 
          LDDL   TEMP1       CURRENT RUNNING TOTAL
          SBDL   SREG2       SUBTOTAL PARAMETER WORDS FROM RUN TOTAL
          PJN    PNOTFND     IF NO MORE PARAMETERS
          LDDL   TEMP2       CURRENT ID WORD
          SHN    MINUS8      SHIFT RIGHT 8 BITS 
          LPC    LBMSK       ISOLATE PARAMETER BYTE COUNT 
          ADN    TWO
          SHN    MINUS1      SHIFT RIGHT 1 BIT (DIVIDE BY 2)
          RADL   TEMP1       REPLACE/ADD TO RUNNING TOTAL 
          UJN    PMLOOP      LOOP BACK TO PROCESS NEW CURRENT PARAM ID
  
 LPWEXIT  LJM    LPWX        RETURN 
  
 PNOTFND  LDN    ONES        NOT FOUND INDICATION 
          UJN    LPWEXIT     EXIT 
  
*         IMPORTANT VALUES
  
 TRPWDS   CONL   0           TOTAL RESPONSE PACKET WORDS
  
 MSR      TITLE  MASTER/SELECTIVE RESET 
**        MSR - MASTER/SELECTIVE RESET
* 
*         THIS SUBROUTINE WILL PERFORM A MASTER AND LOGICAL/SLAVE 
*         INTERFACE RESET OF THE CONTROLLER, AND INPUT THE ASYNCHRONOUS 
*         RESPONSE;  THEN CHECKS FOR THE PROPER SLAVE AND DRIVE STATUS. 
* 
*         ENTRY - (VFW)= LOGICAL INTERFACE OR SLAVE RESET FUNCTION WORD 
* 
*         CALLS - SENDFCN, RSPHDL, LPW, ORTCHK, DSL 
* 
*         USES - DCB+PLLE, TEMP1
* 
 MSR      SUBR               ENTRY/EXIT 
          LDN    FIFW        FORCE IDLE STATE FUNCTION WORD 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          IFNE   I0ON,0 
          DELAY  US100       DELAY 100 USEC 
          ELSE
          LDC    US100
          RJM    DELUS       DELAY 100 USEC 
          ENDIF 
          IFNE   IOUOFF,0 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          NJN    MSR2        IF I4 DRIVER ENABLED 
          LDC    CLRLSI      CLEAR IPI ERROR REGISTER FUNCTION
          UJN    MSR3 
  
 MSR2     LDC    CLREI4      CLEAR I4 ERROR STATUS FUNCTION 
          ENDIF 
          IFNE   I0ON,0,1 
          LDC    CLRLSI      CLEAR IPI ERROR REGISTER FUNCTION
          IFNE   I4ON,0,1 
          LDC    CLREI4      CLEAR I4 ERROR STATUS FUNCTION 
 MSR3     RJM    SENDFCN     ISSUE ADAPTER FUNCTION 
          CFM    MSR5,CH     CLEAR CHANNEL ERROR FLAG 
 MSR5     LDC    RSOFW       RAISE SYNC OUT FOR MAINT.MODE FUNCTION 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          IFNE   I0ON,0 
          DELAY  TENUS       DELAY 10 USEC
          ELSE
          LDN    TENUS
          RJM    DELUS       DELAY 10 USEC
          ENDIF 
  
*         SELECTIVE RESET 
  
          LDN    FIFW        FORCE IDLE STATE FUNCTION WORD 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          IFNE   I0ON,0 
          DELAY  TWENUS      DELAY 20 USEC
          ELSE
          LDN    TWENUS 
          RJM    DELUS       DELAY 20 USEC
          ENDIF 
          LDDL   VFW         SPECIFIED A-BUS RESET WORD 
          ADN    RSTFW       ADD RESET FUNCTION WORD
          RJM    SENDFCN     SEND RESET RAISE MASTER OUT
          IFNE   I0ON,0 
          DELAY  TWENUS      DELAY 20 USEC
          ELSE
          LDN    TWENUS 
          RJM    DELUS       DELAY 20 USEC
          ENDIF 
          LDDL   VFW         SPECIFIED A-BUS RESET WORD 
          ADN    RMSOF       ADD RAISE MASTER/SYNC OUT FUNCTION WORD
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          IFNE   I0ON,0 
          DELAY  TENUS       DELAY 10 USEC
          ELSE
          LDN    TENUS
          RJM    DELUS       DELAY 10 USEC
          ENDIF 
          LDDL   VFW         SPECIFIED A-BUS RESET WORD 
          ADN    DSRMF       DROP SYNC OUT/MASTER OUT UP FUNCTION WORD
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          IFNE   I0ON,0 
          DELAY  TWENUS      DELAY 20 USEC
          ELSE
          LDN    TWENUS 
          RJM    DELUS       DELAY 20 USEC
          ENDIF 
          LDDL   VFW         SPECIFIED A-BUS RESET WORD 
          ADN    FIFW        ADD FORCE IDLE FUNCTION DROP MASTER OUT
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    SLR
          NJN    MSR10       IF SLAVE RESET ENABLED 
          LDC    WCLSS1A     2 SEC/CLASS 1 ASYNCRONOUS DELAY COUNT
 MSR9     EQU    *-1
          UJN    MSR20       JUMP AHEAD 
  
 MSR10    LDC    WLCL1A      6 MIN/CLASS 1 ASYNCRONOUS DELAY CONSTANT 
 MSR20    RJM    RSPHDL      WAIT/RECEIVE ASYNCRONOUS RESPONSE PACKET 
          NJN    MSRER       IF ERROR 
          LDN    MEXPID      MACHINE EXCEPTION PARAMETER ID 
          RJM    ORTCHK      IF OPERATIONAL 
          NJN    MSREXT      AND READY TRANSITION NOT FOUND 
          RJM    DSL         DESELECT FROM THE CONTROLLER 
          NJN    MSREXT      IF ERROR 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    SLR
          ZJN    MSREXT      IF SLAVE RESET NOT ENABLED 
          LDC    WLCL1A      6 MIN ASYNCRONOUS DELAY COUNT
          RJM    RSPHDL      WAIT FOR DESIRED DRIVE'S ASYNC RESPONSE
          NJN    MSRER1      IF ERROR 
          LDN    DMEXID      DRIVE MACHINE EXCEPTION PARAMETER ID 
          RJM    ORTCHK      DRIVE OPERATIONAL AND READY TRANSITION 
          NJN    MSREXT      IF ERROR 
          RJM    DSL         DESELECT CONTROLLER
 MSREXT   LJM    MSRX        RETURN 
  
*         ERROR EXITS 
  
 MSRER    STML   MSRER2      SAVE ERROR CODE AWAY 
          LDDL   OPENFL      OPERATION FLAG 
          LPN    RTBR 
          ZJN    MSRER0      IF RTBR NOT SET
          LDML   MSRER2      ERROR CODE 
          UJN    MSREXT      IF RTBR SET
  
 MSRER0   LDML   MSRER2      ERROR CODE 
 MSRER1   STML   DCB+PLLE    CAPTURE/STORE 1ST LOW-LEVEL ERROR
          LDN    E11         NO ASYNCRONOUS INTERRUPT RECEIVED
          UJN    MSREXT      EXIT 
  
 MSRER2   CONL   0           ERROR SAVE AREA
  
 ORTCHK   TITLE  OPERATIONAL AND READY TRANSITION CHECK 
**        ORTCHK - OPERATIONAL AND READY TRANSITION CHECK 
* 
*         THIS SUBROUTINE WILL SEARCH THE SB FOR THE DESIRED PARAMETER
*         ID.  WHEN FOUND, THE OPERATIONAL AND READY TRANSITION BITS ARE
*         CHECKED FOR BEING ON.  IF ONE OR NEITHER ARE UP, THEN AN ERROR
*         IS POSTED.
* 
*         ENTRY - (A) = DESIRED PARAMETER ID TO BE LOOKED FOR 
* 
*         EXIT - (A) = 0, NO ERRORS 
*                (A) NOT 0, ERROR OCCURRED
* 
*         CALLS - LPW 
* 
*         USES - COUNTER, TEMP1 
* 
 ORTCHK   SUBR               ENTRY/EXIT 
          STDL   COUNTER     SAVE PARAMETER ID
          RJM    LPW         LOCATE PARAMETER ID IN SB
          NJN    ORTER1      IF NOT FOUND 
          AODL   TEMP1       INCREMENT THE PARAMETER WORD INDEX 
          LDML   SB+PMW,TEMP1  1ST MACHINE EXCEPTION WORD 
          LPC    RSTCMMK     MASK FOR RESET STATUS
          LMC    OPLRDYT
          NJN    ORTER1      IF OPERATIONAL AND READY ARE NOT UP
 ORTEXT   UJN    ORTCHKX     RETURN 
  
 ORTER1   LDDL   COUNTER     PARAMETER ID 
          SBN    MEXPID 
          NJN    ORTER2      IF NOT CONTROLLER MACHINE EXCEPTION
          LDC    CNOR        CONTROLLER NOT OPERATIONAL AND READY 
          UJN    ORTEXT      EXIT 
  
 ORTER2   LDC    DNOR        DRIVE NOT OPERATIONAL AND READY
          UJN    ORTEXT      EXIT 
  
 RDO      TITLE  READ DATA OPERATION
**        RDO - READ DATA OPERATION 
* 
*         THIS SUBROUTINE WILL SEND THE PREDEFINED COMMAND BUFFER TO THE
*         CONTROLLER IN ORDER TO START A READ DATA OPERATION.  AFTER A
*         SUCCESSFUL TRANSFER, THE RESPONSE PACKET IS INPUTTED AND
*         CHECKED FOR A STANDARD COMMAND COMPLETION RESPONSE. 
* 
*         EXIT - (A) = 0 ... ERROR-FREE OPERATION 
*                (A) NOT 0 . AN ERROR HAS OCCURRED
* 
*         CALLS - SCP, RSPHDL, RDS, CSCHK 
* 
*         USES - TSFOA
* 
 RDO      SUBR               ENTRY/EXIT 
          LDC    CB          COMMAND BUFFER ADDRESS 
          STDL   TSFOA       STORE IN ITO'S TRANSFER OUT ADDRESS
          LDML   DCB+TSK     CURRENT TASK 
          SBN    TSK9CS 
          NJN    RDO10       IF NOT TASK 9
          LDN    RBWL        READ BUFFER COMMAND WORD LENGTH
          UJN    RDO20       JUMP AHEAD 
  
 RDO10    LDN    NCWL        STANDARD COMMAND PACKET WORD LENGTH
 RDO20    RJM    SCP         ISSUE READ COMMAND 
          NJN    RDOEXT      IF ERROR 
          LDC    WCLASS2     CLASS 2 INTERRUPT FLAG 
          RJM    RSPHDL      WAIT/RECEIVE RESPONSE PACKET 
          NJN    RDOEXT      IF ERROR 
          RJM    RDS         READ DATA STREAM 
          NJN    RDOEXT      IF ERROR 
          LDC    WCLASS1     CLASS 1 INTERRUPT FLAG 
          RJM    RSPHDL      WAIT/RECEIVE RESPONSE PACKET 
          NJN    RDOEXT      IF ERROR 
          RJM    CSCHK       COMMAND SUCCESSFUL CHECK 
 RDOEXT   LJM    RDOX        RETURN 
  
 RDS      TITLE  RECEIVE DATA STREAM
**        RDS - RECEIVE DATA STREAM 
* 
*         THIS SUBROUTINE WILL READY THE IPI BUS FOR A DATA STREAMING 
*         TRANSFER INPUT, INPUT THE SPECIFIED BLOCK OF DATA, INPUT THE
*         SLAVE STATUS BYTE, AND THEN DESELECTS THE CONTROLLER. 
* 
*         CALLS - BBBDT 
* 
*         USES - CURMO, TIDA, SECCTR, BURDIR
* 
 RDS      SUBR               ENTRY/EXIT 
          LDN    RWDF        R/W DATA FLAG BIT
          STDL   CURMO       STORE IN CURRENT MAJOR OPERATION 
          LDN    ZERO 
          STDL   BURDIR      SET BURST DIRECTION FOR INPUT
          LDC    DITFW       DATA INPUT TRANSFER FUNCTION WORD
          RJM    BBBDT       DO BURST-BY-BURST DATA TRANSFER
          UJN    RDSX        RETURN 
  
 RIPIER   TITLE  READ IPI ERROR REGISTERS 
**        RIPIER - READ IPI ERROR REGISTERS 
* 
*         THIS SUBROUTINE WILL SEND A FUNCTION TO THE IPI ADAPTER TO
*         READ THE IPI ERROR REGISTER, STORE ITS CONTENTS, THEN ISSUE 
*         THE FUNCTION TO CLEAR THE IPI ERROR REGISTER. 
* 
*         ENTRY - (A) = CHANNEL ERROR CODE TO SAVE
* 
*         CALLS - SENDFCN 
* 
*         USES - DCB+LLE, DCB+LIER, DCB+GS
* 
 RIPIER   SUBR               ENTRY/EXIT 
          STML   DCB+PLLE    STORE THE CHANNEL ERROR
          LDC    RIERFW      READ IPI ERROR REGISTER FUNCTION 
          RJM    SENDFCN     ISSUE THE ADAPTER FUNCTION 
          ACN    CH 
          IAN    CH          INPUT IPI ERROR REGISTER 
          STML   DCB+LIER    STORE IN DCB 
          ZJN    RIPI10      IF NO IPI ADAPTER ERRORS 
          LDC    ADPERR      IPI ADAPTER ERROR CODE 
          STML   DCB+GS      STORE IN DCB GENERAL STATUS
          IFNE   IOUOFF,0 
 RIPI10   LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPC    I4 
          NJN    RIPI20      IF I4 DRIVER ENABLED 
          LDC    CLRLSI      CLEAR IPI ERROR REGISTER FUNCTION
          UJN    RIPI30 
  
 RIPI20   LDC    CLREI4      CLEAR I4 ERROR STATUS FUNCTION 
          ENDIF 
          IFNE   I0ON,0,1 
 RIPI10   LDC    CLRLSI      CLEAR IPI ERROR REGISTER FUNCTION
          IFNE   I4ON,0,1 
 RIPI10   LDC    CLREI4      CLEAR I4 ERROR STATUS FUNCTION 
 RIPI30   RJM    SENDFCN     ISSUE THE ADAPTER FUNCTION 
          LDML   DCB+PLLE    CHANNEL ERROR
          STML   DCB+LLE     STORE AS LATEST ERROR
          LJM    RIPIERX     RETURN 
  
 RQTS     TITLE  REQUEST TRANSFER SETTINGS
**        RQTS - REQUEST TRANSFER SETTINGS
* 
*         THIS SUBROUTINE WILL SEND A REQUEST TRANSFER SETTINGS WORD
*         TO THE CONTROLLER, THEN INPUT THE TRANSFER SETTINGS BYTE FROM 
*         THE CONTROLLER. 
* 
*         ENTRY - (SLAVE)= SHIFTED CONTROLLER ADDRESS 
* 
*         CALLS - SENDFCN, FCLT 
* 
*         USES - CHGXSM, TSW
* 
 RQTS     SUBR               ENTRY/EXIT 
          LDN    ZERO 
          STDL   CHGXSM      CLEAR THE CHANGE TRANSFER MODE REGISTER
          LDDL   SLAVE       SHIFTED CONTROLLER ADDRESS 
          LMC    RTSFW       XOR W/REQUEST TRANSFER SETTINGS FUNC WORD
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          ACN    CH 
          RJM    FCLT        WAIT FOR SLAVE-IN TO COME UP 
          NJN    RQTER1      IF ERROR 
          IAN    CH          INPUT TRANSFER SETTING BYTE
          LPC    LBMSK       MASK LOWER BYTE
          STDL   TSW         STORE IT AWAY
          DCN    CH+UNH      DISCONNECT CHANNEL 
          SFM    RQTER2,CH   IF CHANNEL ERROR FLAG SET
 RQTS1    RJM    DSL         DESELECT BY DROPPING MASTER OUT
 RQTEXT   LJM    RQTSX       RETURN 
  
*         ERROR EXITS 
  
 RQTER1   LDC    E91         SLAVE-IN DID NOT COME UP 
          UJN    RQTEXT      EXIT 
  
 RQTER2   LDC    E92         CH ERR AFT TRANSFER SETTINGS BYTE RECEIVED 
          RJM    RIPIER      LOG ERROR AND READ IPI ERROR REGISTER
          UJN    RQTEXT      EXIT 
  
 RRP      TITLE  RECEIVE RESPONSE PACKET
**        RRP - RECEIVE RESPONSE PACKET 
* 
*         THIS SUBROUTINE WILL SELECT THE CONTROLLER, PERFORM THE BUS 
*         CONTROL SEQUENCE FOR A STATUS INPUT TRANSFER, INPUT THE STATUS
*         WORDS TO THE PP STATUS BUFFER, AND THEN INPUT THE SLAVE STATUS
*         BYTE. 
* 
*         CALLS - SELCT, BSC, ITI, EDS
* 
*         USES - CURMO
* 
 RRP      SUBR               ENTRY/EXIT 
          LDN    RRPF 
          STDL   CURMO       SET CURRENT MAJOR OPERATION BIT
          RJM    SELCT       SELECT CONTROLLER
          NJN    RRPEXT      IF ERROR 
          LDC    RPTFW       RECEIVE PACKET TRANSFER FUNCTION WORD
          RJM    BSC         PERFORM BUS CONTROL SEQUENCE 
          NJN    RRPEXT      IF ERROR 
          LDN    ZERO 
          RJM    ITI         DO INFORMATION TRANSFER IN 
          NJN    RRPEXT      IF ERROR 
          LDC    GMSFW       GOOD MASTER STATUS FUNCTION
          RJM    EDS         DO ENDING STATUS SEQUENCE
 RRPEXT   UJN    RRPX        RETURN 
  
 RSPHDL   TITLE  RESPONSE HANDLER 
**        RSPHDL - RESPONSE HANDLER 
* 
*         THIS SUBROUTINE WILL WAIT FOR THE GIVEN CLASS INTERRUPT,
*         INPUT THE RESPONSE PACKET, AND COMPARE  THE CLASS AND 
*         TYPE OF INTERRUPT RECEIVED WITH THE EXPECTED VALUES 
*         PROVIDED BY THE CALLING ROUTINE UPON ENTRY. 
* 
*         ENTRY - (A)[LOWER 6]= DESIRED CLASS OF INTERRUPT
*                    [UPPER] = NUMBER OF SECONDS TO WAIT FOR INTERRUPT
* 
*         EXIT - (A)=00 ... CORRECT CLASS OF INTERRUPT RECEIVED 
*                (A)=77(8)... INTERRUPT NOT PRESENT YET 
*                (A) NON 00 ... ERROR CODE OF FAILURE 
* 
*         CALLS - SENDFCN, FCLT, RRP, LPW, DSL
* 
*         USES - EXPCLI,TEMP1,TEMP2, RSPLCTR,COUNTER,DCB+LRIS, MAJORST
* 
 RSPHDL   SUBR               ENTRY/EXIT 
          STDL   EXPCLI      STORE THE EXPECTED CLASS INTERRUPT 
          SHN    MINUS6      POSITION THE WAIT CONSTANT (IN SECONDS)
          STDL   RSPLCTR     STORE IN THE SECONDS LOOP COUNTER
 RQIOLP   LDC    RQIINLC     REQUEST INTERRUPT INNER LOOP COUNT (1 SEC) 
          STDL   COUNTER     STORE IN INNER LOOP COUNTER
 RQILOOP  LDC    RQIFW       REQUEST INTERRUPTS FUNCTION
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          IFNE   I0ON,0 
          DELAY  TWENUS      DELAY 20 USEC
          ELSE
          LDN    TWENUS 
          RJM    DELUS       DELAY 20 USEC
          ENDIF 
          ACN    CH+UNH      ACTIVATE CHANNEL 
          RJM    FCLT        WAIT FOR SLAVE INTERRUPT BYTE
          NJP    RSPER1      IF ERROR 
          IAN    CH          INPUT SLAVE INTERRUPT BYTE 
          LPC    LBMSK       MASK LOWER BYTE
          STML   DCB+LRIS    STORE IT AWAY
          DCN    CH+UNH 
          SFM    RSPER2,CH   IF CHANNEL ERROR FLAG SET
          LDN    DMOF        DROP MASTER OUT FUNCTION 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          LDML   DCB+LRIS    INTERRUPT STATUS 
          LPDL   CMMSK
          NJN    RQIGOOD     IF INTERRUPT PRESENT FOR THIS CONTROLLER 
          LDDL   EXPCLI      WAIT CONSTANT/EXPECTED CLASS INTERRUPT 
          SHN    MINUS6      POSITION THE WAIT VALUE (IN SECS)
          ZJP    RSPER3      IF TASK BUSY 
          LDDL   EXPCLI      EXPECTED CLASS INTERRUPT 
          LPN    MASK3       CLEAR UPPER BITS 
          SBN    CLASS2 
          ZJN    RQI10       IF CLASS 2 INTERRUPT 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    RTBR 
          NJP    RSPER3      IF TASK RELEASE BIT IS SET 
 RQI10    SODL   COUNTER     DECREMENT INNER LOOP COUNT 
          ZJN    RQI20       IF 1 SEC 
          LJM    RQILOOP     LOOP BACK TO RE-REQUEST INTERRUPTS 
  
 RQI20    SODL   RSPLCTR     DECREMENT SECONDS LAP COUNTER
          ZJP    RSPER4      IF SECONDS LAP COUNTER ZERO
          LJM    RQIOLP      RESET INNER LOOP COUNTER 
  
 RQIGOOD  RJM    RRP         INPUT RESPONSE PACKET
          NJP    RSPEXT      IF ERROR 
          LDML   SB+MS       MAJOR STATUS 
          STDL   MAJORST     STORE FOR QUICKER REFERENCE
          LPC    UNBMSK      MASK RESPONSE TYPE 
          LMC    TRSNOT 
          NJP    RSP10       IF NOT TRANSFER NOTIFICATION 
  
*         CLASS 2 INTERRUPT RECEIVED
  
          LDDL   EXPCLI      EXPECTED CLASS INTERRUPT 
          LPN    MASK3       MASK ONLY INTERRUPTS 
          SBN    CLASS2 
          ZJP    RSPEXT      IF CLASS 2 INTERRUPT 
          LJM    RSPER5      IF ERROR 
  
 RSP10    LDDL   MAJORST     MAJOR STATUS 
          LPC    UNBMSK      MASK RESPONSE TYPE 
          LMN    SCCR 
          NJN    RSP20       IF NOT STANDARD COMMAND COMPLETE RESPONSE
  
*         CLASS 1 INTERRUPT (COMMAND COMPLETE) RECEIVED 
  
          LDDL   EXPCLI      EXPECTED CLASS INTERRUPT 
          LPN    MASK4       MASK LOWER 4 BITS
          SBN    CLASS1 
          ZJP    RSPEXT      IF CLASS 1 
          LJM    RSPER6      IF ERROR 
  
 RSP20    LDDL   MAJORST     MAJOR STATUS 
          LPC    UNBMSK      MASK RESPONSE TYPE 
          LMC    ARMS 
          NJP    RSPER7      IF NOT ASYNCHRONOUS RESPONSE 
  
*         ASYNCHRONOUS RESPONSE RECEIVED
  
          LDML   SB+SA       RECEIVED CM-3/DRIVE ADDRESS
          LPC    LBMSK       SAVE DRIVE ADDRESS ONLY
          STDL   TEMP2       STORE IT 
          LMML   DCB+DA 
          NJN    RSP30       IF NOT DESIRED DRIVE ADDRESS 
          LDDL   EXPCLI      EXPECTED CLASS INTERRUPT 
          LPN    ASYNEXP
          NJP    RSPGOOD     IF ASYNCRONOUS RESPONSE
          LJM    RSPER8      IF ERROR 
  
 RSP30    LDDL   TEMP2       ACTUAL ASYNCRONOUS DRIVE ADDRESS 
          LMC    LBMSK
          NJN    RSP40       IF NOT FF
          LDDL   EXPCLI      EXPECTED CLASS INTERRUPT 
          LPN    ASYNEXP     ASYNCRONOUS RESPONSE 
          NJN    RSPGOOD     IF ASYNCRONOUS RESPONSE
          LDN    MMEXID      MESSAGE/MICROCODE EXCEPTION PARAMETER ID 
          RJM    LPW
          NJP    RSPER8      IF THE PARAMETER NOT FOUND 
          LDN    DPINDX      DIAGNOSTIC PROGRESS INDEX
          RADL   TEMP1       ADD IT TO PARAMETER INDEX
          LDML   SB+PMW,TEMP1  MESSAGE/MICROCODE EXCEPTION WORD 
          LPC    DGPROG 
          NJN    RSP40       IF DIAGNOSTIC IN PROGRESS MESSAGE SET
          LDML   SB+PMW,TEMP1  MESSAGE/MICROCODE EXCEPTION WORD 
          LPC    DGEND
          ZJP    RSPER8      IF DIAGNOSTIC NOT ENDED
 RSP40    RJM    DSL         DESELECT THE CONTROLLER
          NJN    RSPEXT      IF ERROR 
          LDDL   OPENFL      OPERATION ENABLE FLAGS 
          LPN    RTBR 
          NJN    RSPER3      IF RELEASE TASK BEFORE RESPONSE SET
          LJM    RQI10       CONTROLLER WAITING FOR ANOTHER INTERRUPT 
  
 RSPGOOD  LDN    ZERO        ERROR-FREE INDICATOR 
 RSPEXT   LJM    RSPHDLX     RETURN 
  
*         ERROR EXITS 
  
 RSPER1   LDC    E61         SLAVE INTERRUPT BYTE NOT PRESENT 
          UJN    RSPEXT      EXIT 
  
 RSPER2   LDC    E62         CH ERROR AFTER SLAVE INTERRUPT RECEIVED
          RJM    RIPIER      LOG ERROR AND READ IPI ERROR REGISTER
          UJN    RSPEXT      EXIT 
  
*         TASK BUSY NOT AN ERROR
  
 RSPER3   LDC    TSKBSY      TASK BUSY CODE 
          UJN    RSPEXT      EXIT 
  
 RSPER4   LDC    E63         NO CONTROLLER INTERRUPT IN ALOTTED TIME
          UJN    RSPEXT      EXIT 
  
 RSPER5   LDC    UC2REC      UNEXPECTED CLASS 2 INTERRUPT RECEIVED
          UJN    RSPEXT      EXIT 
  
 RSPER6   LDC    UC1REC      UNEXPECTED CMD COMPLETE RESPONSE RECEIVED
          UJN    RSPEXT      EXIT 
  
 RSPER7   LDC    URTREC      UNKNOWN RESPONSE TYPE RECEIVED 
          UJN    RSPEXT      EXIT 
  
 RSPER8   LDC    UARREC      UNEXPECTED ASYNCRONOUS RESPONSE RECEIVED 
          UJN    RSPEXT      EXIT 
  
          IFNE   BUFRDO+BUFWRO,0
 RWBCS    TITLE  R/W BUFFER COMMAND SET-UP
*         RWBCS - R/W BUFFER COMMAND SET-UP 
* 
*         THIS SUBROUTINE WILL SET-UP THE COMMAND BUFFER FOR THE R/W
*         CONTROLLER BUFFER COMMANDS. 
* 
*         ENTRY - (A) = COMMAND'S OPCODE/MODIFIER 
* 
*         USES - CB+OM, CB+CT1, CB+CT2, CB+DA1, CB+DA2, DCB+STC, CB+SA
* 
 RWBCS    SUBR               ENTRY/EXIT 
          STML   CB+OM       STORE OPCODE/MOD IN COMMAND BUFFER 
          LDML   DCB+CA      CONTROLLER ADDRESS 
          SHN    LEFT8       SHIFT LEFT ONE BYTE
          LMC    LBMSK       OR IN FACILITY ADDRESS 'FF'
          STML   CB+SA       STORE CONTROLLER/DRIVE ADDRESS 
          LDC    TWOK        2K BYTE COUNT
          STML   CB+CT2      STORE IN COMMAND BUFFER
          LDN    ONE
          STML   DCB+STC     FORCE SECTOR COUNT TO 1
          LDN    ZERO 
          STML   CB+CT1      CLEAR DEFAULT UPPER
          STML   CB+DA1      CLEAR BYTE OFFSET WORDS
          STML   CB+DA2 
          UJN    RWBCSX      RETURN 
          ENDIF 
  
 SCP      TITLE  SEND COMMAND PACKET
**        SCP - SEND COMMAND PACKET 
* 
*         THIS SUBROUTINE WILL PREPARE THE IPI BUS INTERFACE FOR A
*         COMMAND OUT TRANSFER, TRANSFER CONTENTS OF SPECIFIED
*         COMMAND PACKET TO THE CONTROLLER, INPUT THE SLAVE STATUS
*         BYTE, AND DESELECTS THE CONTROLLER. 
* 
*         ENTRY - (A)= COMMAND BLOCK LENGTH IN WORDS
* 
*         CALLS - BSC, ITO, EDS, DSL
* 
*         USES - TOWC, CURMO
* 
 SCP      SUBR               ENTRY/EXIT 
          STDL   TOWC        STORE THE TRANSFER OUT WORD COUNT
          LDN    SCPF 
          STDL   CURMO       SET CURRENT OPERATION BIT
          LDC    SCTFW       SEND COMMAND TRANSFER FUNCTION WORD
          RJM    BSC         PERFORM BUS CONTROL SEQUENCE 
          NJN    SCPEXT      IF ERROR 
          LDN    ZERO        INDICATE COMMAND TRANSFER TYPE 
          RJM    ITO         DO INFORMATION TRANSFER OUT
          NJN    SCPEXT      IF ERROR 
          LDC    GMSFW       GOOD MASTER STATUS FUNCTION
          RJM    EDS         DO ENDING STATUS SEQUENCE
          NJN    SCPEXT      IF ERROR 
          RJM    DSL         DESELECT CONTROLLER
 SCPEXT   UJN    SCPX        RETURN 
  
 SDS      TITLE  SEND DATA STREAM 
**        SDS - SEND DATA STREAM
* 
*         THIS  SUBROUTINE WILL READY THE IPI BUS FOR A DATA STREAMING
*         TRANSFER OUTPUT, OUTPUTS THE SPECIFIED DATA BLOCK, INPUTS THE 
*         SLAVE STATUS BYTE, AND THEN DESELECTS THE CONTROLLER. 
* 
*         ENTRY - (DWC)= DATA COUNT IN 16-BIT WORDS 
* 
*         CALLS - BBBDT 
* 
*         USES - CURMO, TSFOA, TOWC, SECCTR, BURDIR 
* 
 SDS      SUBR               ENTRY/EXIT 
          LDN    RWDF        R/W DATA FLAG BIT
          STDL   CURMO       STORE IN CURRENT MAJOR OPERATION 
          LDML   DCB+FWA1    STARTING PP DATA WORD ADDRESS
          STDL   TSFOA       STORE IN TRANSFER OUT ADDRESS
          LDC    ONEK        DATA WORD COUNT FOR SINGLE BURST 
          STDL   TOWC        SAVE IN TRANSFER OUT WORD COUNT CELL 
          LDN    ONES 
          STDL   BURDIR      SET BURST DIRECTION FOR OUTPUT 
          LDC    DOTFW       DATA OUTPUT TRANSFER FUNCTION WORD 
          RJM    BBBDT       DO BURST-BY-BURST DATA TRANSFER
          UJN    SDSX        RETURN 
  
 SEL      TITLE  SELECT CONTROLLER
**        SEL - SELECT CONTROLLER 
* 
*         THIS SUBROUTINE WILL SELECT THE SPECIFIED CONTROLLER. 
* 
*         ENTRY - (SLAVE)= SHIFTED CONTROLLER ADDRESS 
*                 (CMMSK)= CONTROL MODULE (CONTROLLER) ADDRESS MASK 
*                 (SEE RELATED FUNCTION ... 2)
* 
*         CALLS - SENDFCN, FCLT, RQTS 
* 
*         USES - DCB+LSS, CHGXSM, TEMP1 
* 
 SELCT    SUBR               ENTRY/EXIT 
          RJM    RQTS        REQUEST TRANSFER SETTINGS BYTE 
          NJP    SELEXT      IF ERROR 
          LDDL   TSW         TRANSFER SETTINGS WORD 
          LPN    TSBIT       TRANSFER SETTINGS BIT
          NJN    SEL5        IF NOT 0 (STREAMING) 
          LDN    ONES 
          STDL   CHGXSM      SET CHANGE TRANSFER MODE FLAG
 SEL5     LDDL   SLAVE       SHIFTED CONTROLLER ADDRESS 
          LMN    SLF         XOR WITH SELECT FUNCTION 
          STDL   TEMP1       SAVE SELECT WORD 
          LDDL   CHGXSM 
          ZJN    SEL10       IF CHANGE TRANSFER MODE FLAG NOT SET 
          LDC    CGXSFM      CHANGE TRANSFER MODE BIT 
          RADL   TEMP1       OR THE BIT INTO THE SELECT FUNCTION WORD 
          LDN    ZERO 
          STDL   CHGXSM      CLEAR CHANGE TRANSFER MODE FLAG
 SEL10    LDDL   TEMP1       DESIRED SELECT FUNCTION WORD 
          RJM    SENDFCN     SEND FUNCTION TO IPI ADAPTER 
          ACN    CH 
          RJM    FCLT 
          NJN    SELER1      IF SLAVE IN DID NOT COME UP
          IAN    CH          INPUT SELECT STATUS WORD 
          LPC    LBMSK       MASK LOWER BYTE
          STML   DCB+LSS     SAVE STATUS
          DCN    CH+UNH      DISCONNECT CHANNEL 
          SFM    SELER3,CH   IF CHANNEL ERROR FLAG SET
          SBDL   CMMSK
          NJN    SELER2      IF NOT EXPECTED ADDRESS
 SELEXT   LJM    SELCTX      RETURN 
  
*         ERROR EXITS 
  
 SELER1   LDN    E21         SLAVE-IN UP TMO ERROR (NO SEL STATUS)
          UJN    SELEXT      EXIT 
  
 SELER2   LDN    E22         UNKNOWN CM-3 ADDRESS ERROR 
          UJN    SELEXT      EXIT 
  
 SELER3   LDN    E23         CHANNEL ERROR AFTER SELECT STATUS RECEIVED 
          RJM    RIPIER      LOG ERROR AND READ IPI ERROR REGISTER
          UJN    SELEXT      EXIT 
  
 SENDFCN  TITLE  SEND FUNCTION TO IPI ADAPTER 
**        SENDFCN - SEND FUNCTION TO IPI ADAPTER
* 
*         THIS SUBROUTINE WILL SEND THE FUNCTION IN THE A-REGISTER
*         TO THE IPI ADAPTER.  IF THE CHANNEL IS ACTIVE BEFORE OR AFTER 
*         THE FUNCTION HAS BEEN SENT, THEN AN ERROR CODE IS LOADED IN 
*         THE A-REGISTER UPON EXIT. 
* 
*         ENTRY - (A) = FUNCTION CODE FOR IPI ADAPTER 
* 
*         EXIT - (A) = 0, NO ERRORS 
*                (A) NOT 0, ERROR OCCURRED
* 
*         USES - DCB+LFCN 
* 
 SENDFCN  SUBR               ENTRY/EXIT 
          STML   DCB+LFCN    SAVE IPI ADAPTER FUNCTION
          AJM    SFERB,CH    IF CHANNEL ACTIVE
 SMPCH    FAN    CH          SEND FUNCTION TO IPI ADAPTER 
          IFNE   I0ON,0 
          DELAY  ONEUS       DELAY 1 USEC 
          ELSE
          LDN    ONEUS
          RJM    DELUS       DELAY 1 USEC 
          ENDIF 
          AJM    SFERA,CH    IF CHANNEL ACTIVE
          LDN    ZERO        INDICATE NO ERRORS 
 SFEXT    UJN    SENDFCNX    RETURN 
  
*         ERROR EXITS 
  
 SFERB    LDN    FCNERRB     FUNCTION ERROR B (BEFORE)
          UJN    SFER        JUMP AHEAD 
  
 SFERA    LDN    FCNERRA     FUNCTION ERROR A (AFTER) 
 SFER     STML   DCB+LLE     STORE FUNCTION ERROR 
          LJM    IPID130     RECORD FATAL ERROR; EXIT 
  
 WDO      TITLE  WRITE DATA OPERATION 
**        WDO - WRITE DATA OPERATION
* 
*         THIS SUBROUTINE WILL SEND THE PREDEFINED COMMAND BUFFER TO THE
*         CONTROLLER IN ORDER TO START A WRITE DATA OPERATION.  AFTER A 
*         SUCCESSFUL TRANSFER, THE RESPONSE PACKET IS INPUTTED AND
*         CHECKED FOR A STANDARD COMMAND COMPLETION RESPONSE. 
* 
*         EXIT - (A) = 0 ... ERROR-FREE OPERATION 
*                (A) NOT 0 . AN ERROR HAS OCCURRED
* 
*         CALLS - SCP, RSPHDL, SDS, CSCHK 
* 
*         USES - TSFOA
* 
 WDO      SUBR               ENTRY/EXIT 
          LDC    CB          COMMAND BUFFER ADDRESS 
          STDL   TSFOA       STORE IN ITO'S TRANSFER OUT ADDRESS
          LDN    NCWL        STANDARD COMMAND PACKET WORD LENGTH
          RJM    SCP         ISSUE READ COMMAND 
          NJN    WDOEXT      IF ERROR 
          LDC    WCLASS2     CLASS 2 INTERRUPT FLAG 
          RJM    RSPHDL      WAIT/RECEIVE RESPONSE PACKET 
          NJN    WDOEXT      IF ERROR 
          RJM    SDS         WRITE DATA STREAM
          NJN    WDOEXT      IF ERROR 
          LDC    WCLASS1     CLASS 1 INTERRUPT FLAG 
          RJM    RSPHDL      WAIT/RECEIVE RESPONSE PACKET 
          NJN    WDOEXT      IF ERROR 
          RJM    CSCHK       COMMAND SUCCESSFUL CHECK 
 WDOEXT   UJN    WDOX        RETURN 
  
*         RESET CHANNEL MACROS
  
          RSTC
  
*         CHANNEL INSTRUCTION TABLE 
  
 CHTA     CHTB               START OF CHANNEL INSTRUCTION TABLE 
  
*         END OF PROGRAM
  
*IF -DEF,NOS,4
*IF -DEF,MVE
          IF     -DEF,QUAL$,1 
          QUAL   *
*ENDIF
          BASE   *
          ENDX
