*COMDECK,IFSD 
          TITLE  HIGH LEVEL CM3 PRODUCT OVERLAY FOR MALET.
 5SI      SEGMENT POVLA 
          ORG    POVLA
          QUAL   IFSD 
*CALL,VERS
*         COMMENT IFSD PRODUCT OVERLAY FOR MALET "VERS" 
          EJECT 
*         THE FOLLOWING COMMANDS ARE  DESIGNED  FOR  THE  CM3/FSD2  DISK
*         SUBSYSTEMS  OPERATING  ON  AN IPI CHANNEL.  5SI IS THE PRODUCT
*         OVERLAY THAT EXECUTES THESE COMMANDS  AND  IS  DRIVEN  BY  THE
*         INSTRUCTION  STACK  OF THE MALET/VE PP DRIVER.  FOR THESE DISK
*         SUBSYSTEMS THE MALET/VE PP DRIVER EXECUTES OUT OF A 16 BIT  4X
*         SPEED PP UTILIZING A 16 BIT IPI CHANNEL.  REQUESTS ARE MADE BY
*         THE DRIVER BY STORING PARAMETERS  INTO  PP  DIRECT  CELLS  AND
*         PERFORMING  A  RETURN-JUMP  TO  THE  OVERLAY  SUBROUTINE.  THE
*         OVERLAY  SUBROUTINE  ALSO  USES  PARAMETERS  WHICH  HAVE  BEEN
*         COMPILED  INTO  THE  INSTRUCTION STACK AREA.  ONCE THE REQUEST
*         HAS BEEN COMPLETED,  CONTROL  IS  RETURNED  TO  THE  STACK  TO
*         EXECUTE  THE  NEXT COMMAND.  THE LANGUAGE FOR PERFORMING THESE
*         COMMANDS IS IFSD. 
* 
*         ALL DISK SUBSYSTEM I/O IS PERFORMED BY THE IPI COMMON  DRIVER.
*         COMMANDS ARE ISSUED TO THE SUBSYSTEM BY LOADING THE IPI DRIVER
*         CONTROL  BLOCK  (DCB)  WITH  THE  NECESSARY   PARAMETERS   FOR
*         PERFORMANCE  OF  THE DESIRED TASK, AND CALLING THE IPI DRIVER.
*         WHEN THE DRIVER COMPLETES  THE  TASK,  THE  DCB  WILL  CONTAIN
*         INFORMATION AS TO THE SUCCESS OR FAILURE OF THE OPERATION.  IN
*         CASE OF AN ERROR, PERTINENT DRIVER INFORMATION WILL  BE  MOVED
*         TO THE OVERLAY'S STATUS BUFFER. 
* 
*         WHEN  THE  PRODUCT  OVERLAY IS INITIALIZED, THOSE CELLS IN THE
*         DRIVER CONTROL BLOCK THAT WILL REMAIN CONSTANT WILL BE FILLED.
*         THESE INCLUDE THE FOLLOWING.
* 
*                   DCB+CHN  - IPI CHANNEL NUMBER 
*                   DCB+CA   - CONTROLLER ADDRESS (0-7) 
*                   DCB+DA   - DRIVE ADDRESS (0-7)
*                   DCB+IBSC - INTERVAL BURST SECTOR COUNTER (0)
*                   DCB+STC  - SECTOR TRANSFER COUNT (1)
* 
* 
*         THIS PRODUCT OVERLAY SUPPORTS A PROGRAMMABLE INPUT BUFFER (IB)
*         OF 2010B PP WORDS, AN OUTPUT BUFFER (OB) OF  2010B  PP  WORDS,
*         AND A STATUS BUFFER (SB) OF 64D PP WORDS.  DATA IS TRANSFERRED
*         BETWEEN THE PP AND THE DISK, EITHER DIRECTLY TO AND  FROM  THE
*         PP OR VIA CENTRAL MEMORY.  ALL READS AND WRITES TRANSFER 2000B
*         16 BIT WORDS ACROSS A 16 BIT  IPI  CHANNEL.   EXECUTION  OF  A
*         WRITE WILL TRANSFER A 2000B WORD BLOCK FROM THE OUTPUT BUFFER.
*         EXECUTION OF A READ WILL LEAVE A 2000B WORD BLOCK IN THE INPUT
*         BUFFER. 
* 
          EJECT 
*         SUPPORTED CAPABILITIES ARE AS FOLLOWS.
* 
*             EXECUTE -  INITIATE EXECUTION OF CM OR DRIVE DIAGNOSTICS. 
*             READ    -  SEEK AND READ 1 SECTOR FROM DISK TO THE IB,
*                        EITHER DIRECTLY TO THE PP OR VIA CENTRAL 
*                        MEMORY.
*             REL     -  RELEASE DRIVE, SUBSYSTEM, AND I/O CHANNEL. 
*             REFORM  -  INITIAL FORMAT OF DRIVE. 
*             RES     -  RESERVE I/O CHANNEL AND SUBSYSTEM. 
*             WRITE   -  SEEK AND WRITE 1 SECTOR TO DISK FROM THE OB, 
*                        EITHER DIRECTLY FROM THE PP OR VIA CENTRAL 
*                        MEMORY.
* 
* 
* 
          EJECT 
*                          FORMAT OF PP MEMORY
* 
*                          --------------------   --- MLDFWA = 0
*                          /                  / 
*                          /                  / 
*                          /                  / 
*                          /                  / 
*                          /       MLD        / 
*                          /                  / 
*                          /                  / 
*                          /------------------/   --- POFWA = 4500(8) 
*                          /                  / 
*                          /     PRODUCT      / 
*                          /     OVERLAY      / 
*                          /                  / 
*                          /                  / 
*                          /------------------/   --- IBFWA = 6660(8) 
*                          /     INPUT        / 
*                          /     BUFFER       / 
*                          /                  / 
*                          /------------------/   --- OBFWA = 10670(8)
*                          /     OUTPUT       / 
*                          /     BUFFER       / 
*                          /                  / 
*                          /------------------/   --- SBFWA = 12700(8)
*                          /  STATUS BUFFER   / 
*                          /------------------/   --- IPIDFWA = 13000(8)
*                          /                  / 
*                          /                  / 
*                          /       IPI        / 
*                          /      DRIVER      / 
*                          /                  / 
*                          /                  / 
*                          /                  / 
*                          /------------------/   --- IPIDLWA = 17677(8)
*                          /------------------/   --- 
*                          /                  /    .
*                          /                  /    .
*                          /    NOT USED      /    .--- IF 16K PPU
*                          /                  /    .
*                          /                  /    .
*                          --------------------   --- 
* 
          EJECT 
* 
* 
*                        FORMAT OF STATUS BUFFER
* 
*                          -------------------- 
*                      0   /                  /  0
*                      .   /  DRIVER STATUS   /  .
*                      .   /    10D WORDS     /  .
*                      .   /                  /  .
*                      .   /                  /  .
*                      9D  /------------------/  11(8)
*                     10D  /                  /  12(8)
*                      .   /  PACKET STATUS   /  .
*                      .   /    48D WORDS     /  .
*                      .   /                  /  .
*                      .   /                  /  .
*                     57D  /------------------/  71(8)
*                     58D  /    RES COUNT     /  72(8)
*                          /------------------/ 
*                     59D  /     NOT USED     /  73(8)
*                          /------------------/ 
*                     60D  / CHANNEL SUPPORTS /  74(8)
*                          /    DMA FLAG      / 
*                          /------------------/ 
*                     61D  / CHANNEL          /  75(8)
*                     62D  / EQUIPMENT        /  76(8)
*                     63D  / UNIT             /  77(8)
*                          -------------------- 
  
          EJECT 
**        THE FOLLOWING TABLE DEFINES THE ERROR CODES AND MESSAGES THAT 
*         MAY BE GENERATED FOR EACH COMMAND.
* 
*                                             E R R R R W 
*                                             X E E E E R 
*                                             E A F L S I 
*                                             C D O . . T 
*                                             U . R . . E 
*                                             T . M . . . 
*                                             E . . . . . 
*      -------------------------------------- - - - - - - 
* 7310 CH NOT ASSIGNED                        X X X . . X 
*      -------------------------------------- - - - - - - 
* 7311 DRIVE NOT RESERVED                     X X X . . X 
*      -------------------------------------- - - - - - - 
* 7312 ACCESS LEVEL TOO LOW FOR REQ.          X X X . . X 
*      -------------------------------------- - - - - - - 
* 7313 RESERVE TIMEOUT                        . . . . X . 
*      -------------------------------------- - - - - - - 
* 7314 CM NOT RESERVED                        X . . . . . 
*      -------------------------------------- - - - - - - 
* 7315 ILLEGAL TEST SELECTION                 X . . . . . 
*      -------------------------------------- - - - - - - 
* 7316 FATAL ERROR - NO CONTROLLER RESPONSE   X X X X X X 
*      -------------------------------------- - - - - - - 
* 7317 ABNORMAL DRIVER STATUS                 X X X X X X 
*      -------------------------------------- - - - - - - 
* 7320 DMA I/O NOT ALLOWED                    . X . . . X 
*      -------------------------------------- - - - - - - 
* 7321 ACCESS TO CYLINDER NOT ALLOWED         . X . . . X 
*      -------------------------------------- - - - - - - 
          EJECT 
*         EQUATES FOR ERROR CODES - FIRST 7 ARE FOR BASIC DRIVER. 
  
 EC.FLE   EQU    1           ADDR OUT OF FL 
 EC.TL    EQU    2           I/O TIMEOUT ON CH RESERVE
 EC.SEE   EQU    3           SUBR ENTRY/EXIT ERROR
 EC.WC    EQU    4           BUFFER INDEX OR WC ERR 
 EC.RES   EQU    5           RESERVED FOR BASIC DRIVER
 EC.RES1  EQU    6           RESERVED FOR BASIC DRIVER
 EC.RES2  EQU    7           RESERVED FOR BASIC DRIVER
  
 EC.CNA   EQU    10B         CH NOT ASSIGNED
 EC.DNR   EQU    11B         DRIVE NOT RESERVED 
 EC.IAL   EQU    12B         ACCESS LEVEL TOO LOW FOR REQ 
 EC.NRES  EQU    13B         RESERVE TIMEOUT
 EC.CNR   EQU    14B         CM NOT RESERVED
 EC.ITS   EQU    15B         ILLEGAL TEST SELECTION 
 EC.FTE   EQU    16B         FATAL ERROR - NO CONT RESPONSE 
 EC.ADS   EQU    17B         ABNORMAL DRIVER STATUS 
 EC.DMA   EQU    20B         DMA I/O NOT ALLOWED
 EC.CANA  EQU    21B         ACCESS TO CYLINDER NOT ALLOWED 
  
  
*         DIRECT CELL EQUATES 
  
 PASAVE   EQU    64B         PARAMETER ADDRESS SAVE LOCATION
 CC       EQU    65B         ADDRESS OF CURRENT CYLINDER         - W
 CT       EQU    66B         ADDRESS OF CURRENT TRACK            - X
 CS       EQU    67B         ADDRESS OF CURRENT SECTOR           - Y
  
 PA       EQU    D.T0        PARAMETER ADDRESS
  
          EJECT 
*         GENERAL STATUS BIT EQUATES. 
  
 BUSY     EQU    6           DRIVE BUSY 
 FAERR    EQU    0#8000      FATAL ERROR BIT
 STERR    EQU    0#4001      STATUS ERROR BITS
 TSKBSY   EQU    0#1000      TASK BUSY STATUS 
 E6ERR    EQU    0#E6        UNEXPECTED ASYNC RESPONSE
  
*         DEVICE CODES SUPPORTED
  
 DCMIN    EQU    120B        CM3/DISK UNIT  MINIMUM DEVICE CODE 
 DCMAX    EQU    122B        CM3/DISK UNIT  MAXIMUM DEVICE CODE 
 DCXMD    EQU    124B        CM3/9853 DISK UNIT DEVICE CODE 
          SPACE  4,20 
*         MISCELANOUS EQUATES.
  
 TIMREL   EQU    400000D/100D INTERVAL FOR CHANNEL RELEASE- 
 MAXITT   EQU    12D         ITERATION COUNT FOR ABOUT A 5 SEC.DELAY
  
*IF -DEF,SECURE,1 
 ARD      EQU    2           READ ANYWHERE
*IF DEF,SECURE,1
 ARD      EQU    4           READ ANYWHERE
 ARW      EQU    4           READ ANYWHERE, WRITE ANYWHERE
 AL21     EQU    21B         ACCESS LEVEL FOR NO CHANNEL CLEANUP OR ERR 
  
          EJECT 
**        ERROR MESSAGES - WRITTEN TO CM DURING INITIALIZATION. 
* 
*         MMSG MACRO. 
* 
*         MMSG  MACRO  NAME,ECODE,MSG,FABT
* 
*         NAME = 6/FABT,6/MESSAGE ORDINAL,6/ECODE.
* 
*         ECODE = ERROR CODE TO BE ASSIGNED (6 BITS). 
* 
*         MSG = ERROR MESSAGE (40 CHARACTERS).
* 
*         FABT = FORCE ABORT (UPPER 6 BITS OF NAME. 
* 
          PURGMAC MMSG
 MMSG     MACRO  NAME,ECODE,MSG,FABT
          IF     -DEF,MMSGORD,1 
 MMSGORD  SET    0                        INITIALIZE ORDINAL
          IFC    EQ,$FABT$$,2             TEST FOR NO FORCE ABORT 
 NAME     EQU    MMSGORD*100B+ECODE 
          ELSE   1
 NAME     EQU    FABT*10000B+MMSGORD*100B+ECODE 
 MMSGBGN  SET    *                        SAVE CURRENT ADDRESS
          IFC    EQ,$MSG$$,2              TEST NULL MESSAGE 
          DATA   1H                       INSURE DATA ITEM
          ELSE   1
          DATA   H$MSG$                   STORE MESSAGE 
          DATA   0                        SET END OF MESSAGE
          IFGT   *-MMSGBGN,BD.MSGML*5+1,1 TEST MESSAGE TOO LONG 
 P        ERR    MESSAGE TOO LONG 
 MMSGORD  SET    MMSGORD+1                BUMP ORDINAL
          IFGT   MMSGORD,BD.MSGMN,1       TEST TOO MANY MESSAGES
 P        ERR    TOO MANY MESSAGES
 MMSGL    SET    MMSGORD*BD.MSGML         SET CM WORD COUNT 
          ENDM
          EJECT 
 START    LJM    **          ENTRY POINT FOR OVERLAY INITIALIZATION 
          LJM    INIT 
  
          CON    IB          FWA OF INPUT BUFFER
          CON    OB          FWA OF OUTPUT BUFFER 
          CON    SB          FWA OF STATUS BUFFER 
          CON    LIB         LENGTH OF INPUT BUFFER 
          CON    LIB         LENGTH OF OUTPUT BUFFER
          CON    LSB         LENGTH OF STATUS BUFFER
  
          CON    BD.VERS     VERSION NUMBER OF THIS OVERLAY 
  
**        RFM    - RELEASE FROM MLD (FIXED LOCATION ENTRY POINT)
*                  RELEASE CALLED FROM MAINTENANCE LANGUAGE DRIVER
*                  RELEASE EQUIPMENT IF CONNECTED 
* 
*                  REL, ABT Z 
* 
*         ENTRY  - (A) = ABORT ADDRESS (777777B)
* 
*         EXIT   - RELEASE COMMAND HAS BEEN EXECUTED
* 
*         USES   - ERR3, ERR4 
* 
*         CALLS  - OPC, BD.DCH
* 
 XRFM     LJM    **          EXIT TO MLD
 RFM      EQU    *-1
          STM    ERR4        SAVE ABORT ADDRESS (777777B) 
          SHN    -12D 
          STM    ERR3 
          RJM    OPC         RELEASE THE EQUIPMENT IF CONNECTED 
          RJM    BD.DCH      DROP CHANNEL/TALK TO SYSTEM AND EXEC 
          UJN    XRFM        EXIT TO MLD
  
**        ENT    - DISTRIBUTE CONTROL TO REQUESTED COMMAND
* 
*         ENTRY  - ((ENT))    BITS 11 - 06 = INDEX TO TBLENT ENTRY
*                                            BIASED BY 20B
*                  ((ENT))    BITS 05 - 00 = LINE NO. UPPER 6 BITS
* 
*                  ((ENT)+1)  BIT  11      = LINE NO. LOWER BIT 
*                  ((ENT)+1)  BITS 10 - 00 = ABORT ADDRESS I
* 
*         EXIT   - COMMAND HAS BEEN EXECUTED
* 
*         USES   - D.Z1, D.Z2, D.Z3, ERR3, ERR4 
* 
*         CALLS  - NONE (LJM TO REQUESTED COMMAND)
* 
 XENT     LJM    **          EXIT TO CALLER OF COMMAND CODE (IN STACK)
 ENT      EQU    *-1
          LDM    ENT         ADDRESS OF COMMAND PARAMETERS IN STACK 
          STD    D.Z2        SAVE FOR INDIRECT LOAD OF PARAMETERS 
          LDI    D.Z2        LOAD COMMAND PARAMETER WORD 1 FROM STACK 
          SHN    12D         OBTAIN INDEX+20B TO CURRENT TBLENT ENTRY 
          STD    D.Z3        SAVE FOR LOAD OF ADDRESS OF COMMAND CODE 
          SHN    -12D        OBTAIN UPPER 6 BITS OF LINE NUMBER 
          STM    ERR3        SAVE IN ERROR PROCESSING AREA
          AOD    D.Z2        INCREMENT TO COMMAND STACK PARAMETER WORD 2
          LDI    D.Z2        LOAD COMMAND PARAMETER WORD 2 FROM STACK 
          STM    ERR4        RIGHT BIT OF LINE NO./ 11 BIT ABORT ADDRESS
          AOD    D.Z2        INCREMENT TO NEXT COMMAND IN STACK 
          STM    ENT         STORE ADDRESS IN EXIT TO STACK LONG JUMP 
          LDM    TBLENT-20B,D.Z3     LOAD FWA OF CODE TO EXECUTE COMMAND
          STD    D.Z1 
          LJM    0,D.Z1      GO EXECUTE COMMAND 
  
**        TABLE OF ENTRY POINTS FOR EXECUTING HIGH LEVEL COMMANDS 
* 
 TBLENT   CON    EXECUTE     INVOKE AND RUN IN-LINE DIAGNOSTICS 
          CON    RDWR        SEEK AND READ/WRITE ONE SECTOR FROM DISK 
          CON    REL         RELEASE EQUIPMENT
          CON    RES         RESERVE ADAPTER, CONTRL MOD, AND DRIVE 
          CON    REFORM      INITIAL FORMAT OF DRIVE
          EJECT 
**       EXECUTE - EXECUTE CONTROL MODULE OR DRIVE DIAGNOSTICS. 
* 
*                 EXECUTE CM X, ABT Z 
*                 EXECUTE DRIVE, ABT Z
* 
*          ENTRY - PA = 0 IF CM, 1 IF DRIVE 
*                  PA+1 = CM DIAGNOSTIC TEST NUMBER 
* 
*          EXIT  -
* 
*          USES  - BD.AL
* 
*          CALLS - DRCALL, TDR, TCR 
* 
*         1.  TEST FOR CONTROL MODULE OR DRIVE DIAGNOSTICS. 
* 
 EXECUTE  LDDL   PA 
          ZJN    EXEC0       IF CM SPECIFIED
  
          LDDL   BD.AL       GET AL 
          SBN    10B
          ZJN    EXEC00      AL = 10
          PJN    EXEC00      AL = 10 OR GREATER 
          LJM    RDWR000     AL ERROR 
  
 EXEC00   RJM    TDR         TEST DRIVE RESERVED
          LDN    TDRDG       LOAD DRIVE DIAG FUNCTION 
          UJN    EXEC1
* 
*         2.  LOAD TASK NUMBER TO DCB 
* 
 EXEC0    RJM    TCR         TEST CM RESERVED 
          RJM    CMTEST      VERIFY TEST NO. AND LOAD DCB 
          LDN    TCMDG       LOAD CM DIAG FUNCTION
 EXEC1    RJM    DRCALL      CALL DRIVER
          LJM    XENT        EXIT TO STACK
          EJECT 
**        REL    - RELEASE EQUIPMENT IF CONNECTED.
* 
*                  REL, ABT Z 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - DEVICE CONNECT HAS BEEN RELEASED IF ASSIGNED AND THE 
*                  CHANNEL IS RELEASED TO THE SYSTEM. 
* 
*         USES   - NONE.
* 
*         CALLS  - OPC- RELEASE EQUIPMENT IF CONNECTED. 
*                - BD.DCH- DROP CH/TALK TO SYSTEM AND EXEC. 
* 
  
**     1. RELEASE EQUIPMENT 
* 
*      2. DROP THE I/O CHANNEL TO THE OPERATING SYSTEM IF ASSIGNED. 
* 
 REL      RJM    OPC         RELEASE THE EQUIPMENT IF CONNECTED 
          RJM    BD.DCH      DROP CHANNEL/TALK TO SYSTEM AND EXEC 
          LJM    XENT        EXIT TO STACK
          EJECT 
**        RES    - RESERVE CONTROL MOD/DRIVE. 
* 
*                  RES CH, ABT Z
*                  RES DRIVE, ABT Z 
*                  RES SLAVE, ABT Z 
* 
*         ENTRY  - (PA) = 0 IF RES CM, 1 IF RES DRIVE, 2 IF RES SLAVE 
* 
*         EXIT   - I/O CHANNEL ASSIGNED AND CHANNEL ASSIGNED FLAGS
*                  SET IN ALL THE OTHER SUBROUTINES.
* 
*                  ERRNRES - IF NOT RESERVED IN 5 MINUTES 
* 
*         USES   - EC, EA, EM, D.T3, D.T4, RESA, DRRES, CMRES, RESSF
*                  RESSF1, PASAVE 
* 
*         CALLS  - OPC, BD.RCH, DRCALL, RQTC
  
**     1. CLEAR ERROR EXIT REGISTERS. 
* 
 RES      LDN    0
          STDL   EC          CLEAR ERROR REGISTERS
          STDL   EA 
          STDL   EM 
          LDDL   PA 
          STD    PASAVE      SAVE FOR RES CH
          SBN    1           CHECK IF RES DRIVE 
          ZJN    RES1        IF RES DRIVE 
          LJM    RES19       ELSE IF RES CH (CM)
  
**     2. DROP/REQUEST I/O CHANNEL FROM THE SYSTEM. 
* 
 RES1     LDN    MAXITT      ITERATION COUNT FOR STATUS 
          STML   RESA        AND PAUSE LOOP 
 RES2     RJM    OPC         TO RELEASE THE DRIVE IF RESERVED 
 RES3     SOM    RESA        DECREMENT THE ITERATION COUNT
          PJN    RES4        IF NOT TIMED OUT 
          LDC    ER.NRES     ELSE ERROR EXIT
          LJM    ERR
  
 RES4     RJM    BD.RCH      DROP/REQUEST CHANNEL AS REQUESTED
  
*      3. CONNECT DRIVE AND GET STATUS. 
  
          RJM    RESET       PERFORM SELECTIVE RESET
          RJM    SELECT      PERFORM SELECT CONTROLLER
          LDC    TIMREL 
          STDL   D.T3 
 RES5     LDN    TRESDR      RES DRIVE TASK NUMBER
          RJM    DRCALL      PERFORM RES DRIVE
  
          EJECT 
*       4. IF FATAL ERROR STATUS BIT ERROR SET, CALL ERROR ROUTINE. 
*          IF THE DRIVE IS NOT BUSY AND THE STATUS ERROR BIT IS SET,
*          CALL THE ERROR ROUTINE.
* 
*          IF BIT 2**6 IS SET, REPEAT STEP 4 UNTIL 500 MSEC HAS 
*          ELASPED.  IF A RESERVE IS NOT SUCESSFUL WITHIN THIS
*          TIME-FRAME, EXECUTE THE  *REL * SEQUENCE TO COMMUNICATE
*          WITH THE SYSTEM.  REPEAT THIS STEP UNTIL A RESERVE IS
*          SUCESSFUL OR 5 MINUTES HAVE ELASPED.  ABORT IF NO
*          RESERVE IN 5 MINUTES.
  
          LDML   SB          GET GENERAL STATUS 
          SHN    2           SHIFT IN FATAL ERROR BIT 
          MJN    RES6        FATAL ERROR
          SHN    1           SHIFT IN STATUS ERROR BIT
          STDL   D.T4        SAVE 
  
          SHN    14D-BUSY    CHECK DRIVE BUSY 
          PJN    RES8        IF DRIVE NOT BUSY
          SODL   D.T3        DECREMENT LOOP COUNT 
          PJN    RES5        IF NOT TIMED OUT 
          LJM    RES2        ELSE START ANOTHER ITERATION 
 RES6     LJM    DRERR       INTERPRET STATUS 
  
*       5. SET CONTROL MOD/DRIVE CONNECTED. 
  
 RES8     LDDL   D.T4        LOAD STATUS ERROR BIT
          MJN    RES6        DRIVE NOT BUSY AND STATUS ERROR
          LDN    0
          STML   DRRES       SET DRIVE RESERVED FLAG
  
*IF DEF,MVE,1 
 RES18    LJM    XENT        EXIT TO STACK
*IF -DEF,MVE
* 
*         SET UP I4 DMA ADDRESSES.
* 
*         I4 ADDRESSING FORMAT USED IN DCB
*         DFWA1 = 0 XXX XXX XXX XXX XXX 
*         DFWA2 = X XXX XXX XXX XXX 000 
*         DFWA3 = 0 000 000 000 000 000 
* 
 RES18    SRD    D.T6        GET R REGISTER CONTENTS
          LDD    D.RA 
          LPC    3777B       MASK R REG BIT 
          ADD    D.T7        ADD R REG
          STM    DMA2        SAVE TEMPORARILY 
          SHN    -12
          RAD    D.T6        SAVE OVERFLOW BIT
          LDM    DMA2        RESET THE A REG
          SHN    6           MULTIPLY BY 100
          STML   DMA2        SAVE WORD TWO
          SHN    -16         MASK OFF LOWER 
          LPN    3           SAVE BIT 16 AND 17 
          STM    DMA3        SAVE TEMPORARILY 
          LDD    D.T6 
          SHN    2           MOVE TO 16 BIT FORM
          RAML   DMA3        SAVE TEMPORARILY 
          LDML   DMA2        GET WORD TWO 
          ADML   BD.IPIBU    ADD IN IPI CM BUFFER ADDRESS 
          STML   DMA2        SAVE WORD TWO
          SHN    -16         MASK OFF LOWER 
          RAML   DMA3        SAVE TEMPORARILY 
          LDML   DMA2        GET WORD TWO 
          SHN    -13         MASK OFF LOWER 
          STML   DMA1        SAVE WORD ONE
          LDML   DMA2        GET WORD TWO 
          LPC    17777B      MASK OFF LOWER 
          SHN    3           ADD 3 BITS OF ZEROS FOR BYTE ADDRESS 
          STML   DMA2        SAVE WORD TWO
          LDML   DMA3        GET D.T6 
          LPC    17777B      MASK OFF LOWER 
          SHN    3           ADD 3 BITS OF ZEROS FOR BYTE ADDRESS 
          RAML   DMA1        SAVE WORD ONE
          LDN    0           CLEAR WORD THREE 
          STML   DMA3        SAVE WORD THREE
          LJM    XENT        EXIT TO STACK
*ENDIF
  
*       6.  DROP/REQUEST I/O CHANNEL FROM THE SYSTEM. 
  
 RES19    RJM    OPC         RELEASE CM/DRIVE IF RESERVED 
          RJM    BD.RCH      DROP/REQUEST CHANNEL AS REQUESTED
          LDD    PASAVE      GET PSEUDO FUNCTION CODE 
          ZJN    RES21       IF RES CH
          LDD    BD.AL       CHECK ACCESS LEVEL 
          SBN    20B
          PJN    RES20       IF 20 OR GREATER 
          LJM    RDWR000     ACCESS LEVEL TOO LOW 
  
*       7.  LOCICAL/SLAVE RESET AND SELECT CM.
  
 RES20    LDML   RESSF       GET SLAVE RESET FLAG 
          NJN    RES26       IF SET CHECK DO TASK COMPLETE
          LDML   RESSF1      GET SLAVE RESET FLAG TIME
          NJN    RES28       IF SET DECREMENT TIMER 
          LDN    20D         SET 20 SECOND TIMER
          STML   RESSF1      SAVE TIME
          LDN    1           SET RELEASE TASK BEFORE RESPONSE 
 RES21    STML   RESSF       SET SLAVE RESET FLAG 
          ADD    PASAVE      GET PSEUDO FUNCTION CODE 
          SHN    4           SET TO CORRECT BIT 
          LMML   IOEF        AND WITH DEFAULT OEF 
          STML   DOEF        SET IN DCB 
          RJM    RESET       PERFORM SELECTIVE RESET
          LDML   RESSF       GET SLAVE RESET FLAG 
          NJN    RES24       EXIT ON FIRST PASS 
          RJM    SELECT      PERFORM SELECT CONTROLLER
          LDN    0
          STML   CMRES       SET CM RESERVED FLAG 
 RES24    LJM    RES18       EXIT TO STACK
  
*       8.  IF SLAVE RESET WAIT FOR TASK TO COMPLETE. 
  
 RES26    RJM    RQTC        REQUEST TASK COMPLETE
          NJN    RES24       IF TASK BUSY EXIT RESERVE
          STML   RESSF       CLEAR SLAVE RESET FLAG 
          UJN    RES24       EXIT TO LOGICAL RESET/SELECT 
  
*       9.  IF SLAVE RESET WAIT 20 SECONDS AFTER TASK COMPLETE TO DO
*           LOGICAL RESET.
  
 RES28    SOML   RESSF1      DECREMENT TIME 
          NJN    RES30       IF NOT TIMED OUT 
          STML   PASAVE      CLEAR SLAVE RESET FLAG 
          UJN    RES21       EXIT TO LOGICAL RESET/SELECT 
  
 RES30    LDC    TSKBSY      LOAD TASK BUSY 
          STML   SB          FAKE TASK BUSY 
          UJN    RES24       EXIT TO STACK
  
 RESSF    DATA   0           SLAVE RESET FLAG 
 RESSF1   DATA   0           SLAVE RESET FLAG DELAY 
  
          EJECT 
**        RDWR   - SEEK AND I/O THE REQUESTED SECTOR. 
* 
*                  READ CYL W TRK X SEC Y, ABT Z
*                  READ DMA CYL W TRK X SEC Y, ABT Z
*                  WRITE CYL W TRK X SEC Y, ABT Z 
*                  WRITE DMA CYL W TRK X SEC Y, ABT Z 
* 
*         ENTRY  - PA  = 0 IF READ
*                      = 1 IF READ DMA
*                      = 2 IF WRITE 
*                      = 3 IF WRITE DMA 
* 
*                  CC  = ADDRESS OF CYLINDER (W)
*                  CT  = ADDRESS OF TRACK    (X)
*                  CS  = ADDRESS OF SECTOR   (Y)
* 
*         EXIT   - W, X, Y = LAST CYL, TRK, SEC.
* 
*                  ERRIAL  - IF ACCESS LEVEL TOO LOW
*                  ERRCANA - IF ILLEGAL CYLINDER
*                  ERRCDMA - IF DMA I/O ILLEGAL 
* 
*         USES   - D.T2, D.T4, CCDC120, PA, IOEF, DOEF, DMA1, DMA2, 
*                  DMA3, DFWA1, DFWA2, DFWA3, BD.DMA, BD.AL, BD.CHAIN 
*                  PASAVE 
* 
*         CALLS  - DRCALL, XSYS 
* 
  
**     1. TEST DRIVE RESERVED AND AL. 
* 
 RDWR     LDML   IOEF        LOAD INITIALIZED OEF REGISTER
          STML   DOEF        RESET OEF REGISTER 
          RJM    TDR         VERIFY DRIVE RESERVED
  
          LDDL   BD.AL
          SBN    4
          PJN    RDWR01      AL = 4 OR GREATER
          ADN    1
          PJN    RDWR00      AL = 3 
 RDWR000  LDC    ER.IAL      AL ERROR 
          UJN    RDWR00.1 
  
*         TEST IF PRE-ALLOCATED CYLINDER FOR DC=3 
  
 RDWR00   LDDL   DC          GET DEVICE CODE
          ADC    -DCMIN      MINUS MINIMUM DC 
          STDL   D.T2        USE AS INDEX 
          LDI    CC          GET CYLINDER 
          SBML   CCDC120,D.T2  MINUS PRE-ALLOCATED CYL FOR DC 
          ZJN    RDWR01.1    SELECTED CYLINDER OK 
  
 CYLERR   LDC    ER.CANA     CYLINDER NOT ALLOWED ERROR 
 RDWR00.1 LJM    RDWR2.2     ERROR
  
*         TEST IF GREATER THEN MAX CYLINDER FOR DC=4 OR GREATER 
  
 RDWR01   LDDL   DC          GET DEVICE CODE
          ADC    -DCMIN      MINUS MINIMUM DC 
          STDL   D.T2        USE AS INDEX 
          LDI    CC          GET CYLINDER 
          SBML   CCDC120,D.T2  MINUS PRE-ALLOCATED CYL FOR DC 
          ZJN    RDWR01.1    SELECTED CYLINDER = MAX
          PJN    CYLERR      CYLINDER GREATER THEN MAX
  
*         INSERT CYL, TRK AND SEC INTO DCB
  
 RDWR01.1 LDI    CC          GET CYLINDER 
          STML   DCYL        STORE IN DCB 
          LDI    CT          GET TRACK
          STML   DHD         STORE IN DCB 
          LDI    CS          GET SECTOR 
          STML   DSEC        STORE IN DCB 
  
*      2. DMA/NON-DMA OPERATION 
  
          LDDL   PA 
          SBN    1
          ZJN    RDWR2       IF DMA READ
          SBN    2
          ZJN    RDWR2       IF DMA WRITE 
  
*         NON/DMA OPERATION 
  
          RJM    RESET       DESELECT THE CM3 
          LDN    0
          STML   DFWA2       CLEAR DCB FWA2 
          STML   DFWA3       CLEAR DCB FWA3 
          LDDL   PA 
          ZJN    RDWR0       IF NON-DMA READ
          LDC    OB          FWA FOR WRITE
          STML   DFWA1       SET DCB FWA1 
          LDN    TSSWRD      SEL/SEEK-WRITE/DESEL 
          UJN    RDWR1
  
 RDWR0    LDC    IB          FWA OF DATA XFER BUFFER
          STML   DFWA1       SET DCB  FWA1
          LDN    TSSRDD      SEL/SEEK-READ/DESEL
 RDWR1    RJM    DRCALL      CALL DRIVER
          LJM    RDWR10      SELECT THE CM3 
  
*         TEST FOR DMA PRESENT. 
  
*IF DEF,MVE,1 
 RDWR2    LDML   BD.DMA      GET DMA FLAG 
*IF -DEF,MVE,1
 RDWR2    LDML   SBDMA       GET DMA FLAG 
          NJN    RDWR2.6     DMA HARDWARE AVAILABLE 
          LDC    ER.DMA      DMA I/O ERROR
 RDWR2.2  STDL   D.T4        SAVE 
          LDN    59D
          STDL   D.T2        INITIALIZE INDEX 
 RDWR2.4  LCN    0
          STML   SB,D.T2     CLEAR SB 
          SODL   D.T2 
          PJN    RDWR2.4     CONTINUE 
          LJM    DRE1.2      CALL ERROR ROUTINE 
  
*         SET UP FOR DMA OPERATION. 
*         THE ADDRESS FOR DMA TRANSFERS HAVE BEEN OBTAINED VIA MLDVE. 
  
 RDWR2.6  LDML   IOEF        LOAD INITIALIZED OEF REGISTER
          ADN    FCMT        ADD DMA BIT (CENTRAL MEMORY TRANSFER)
          STML   BD.CHAIN    SET CHAIN FLAG TO NON-ZERO 
          STML   DOEF        SET DMA FLAG IN OEF
  
          LDML   DMA1        *
          STML   DFWA1       *
          LDML   DMA2        *STORE DMA ADDRESS IN DCB
          STML   DFWA2       *
          LDML   DMA3        *
          STML   DFWA3       *
* 
*         DMA OPERATION 
* 
          LDDL   PA 
          STDL   PASAVE      SAVE PA
          LDC    D.T2        GET D.T2 ADDRESS 
          STDL   D.T0        STORE FOR SYS USAGE
          RJM    RESET       DESELECT THE CM3 
          LDDL   PASAVE      GET PA 
          SBN    3
          ZJN    RDWR2.9     DMA WRITE
* 
*         DMA READ
* 
          LDN    TSSRDD      SEL/SEEK-READ/DESEL
          RJM    DRCALL      COMMON DRIVER
          LDN    13B         SYS REW FUNCTION 
          RJM    XSYS+1      REWIND CM BUFFER 
          LDN    12B         SYS READ FUNCTION
          RJM    XSYS+1      COPY CM BUFFER TO IB 
 RDWR2.8  LDN    0
          STML   BD.CHAIN    CLEAR CHAIN FLAG 
          LDDL   PASAVE 
          STDL   D.T0        RESET PA 
 RDWR10   RJM    SELECT      SELECT THE CM3 
          LJM    XENT        EXIT TO STACK
* 
*         DMA WRITE 
* 
 RDWR2.9  LDN    13B         SYS REW FUNCTION 
          RJM    XSYS+1      REWIND CM BUFFER 
          LDN    14B         SYS WRITE FUNCTION 
          RJM    XSYS+1      COPY OB TO CM BUFFER 
          LDN    TSSWRD      SEL/SEEK-WRITE/DESEL 
          RJM    DRCALL      COMMON DRIVER
          UJN    RDWR2.8
  
          EJECT 
          TITLE  UTILITIES USED BY ISD PRODUCT OVERLAY. 
**        REFORM - INITIAL FORMAT OF DRIVE. 
* 
*                  REFORM INITIAL X, ABT Z
* 
*         ENTRY  - PA = 0 IF INITIAL FORMAT 
*                  PA+1 = SECTOR SIZE TO FORMAT 
* 
*         EXIT   - FORMAT OF DRIVE HAS BEEN EXECUTED, STATUS
*                  IN SB
* 
*                  DRERR - ABNORMAL DRIVER STATUS.
* 
*         USES   - RESSF, BD.CHAIN
* 
*         CALLS  - DRCALL, RQTC 
* 
  
*         1.  CHECK ACCESS LEVEL. 
  
 REFORM   LDD    BD.AL       CHECK ACCESS LEVEL 
          SBN    20B
          PJN    REFORM0     IF 20 OR GREATER 
          LJM    RDWR000     ACCESS LEVEL TOO LOW 
  
 REFORM0  LDML   RESSF       CHECK RTBR FLAG
          ZJN    REFORM1     IF NOT SET START FORMAT
          RJM    BD.RCH      DROP/REQUEST CHANNEL 
          LJM    REFORM7     IF SET CHECK TASK COMPLETE 
  
 REFORM1  LDN    20B         SET RTBR 
          LMML   IOEF 
          STML   DOEF        STORE IN DCB 
          LDN    1
          STML   RESSF       SET RTBR FLAG
  
*         2.  LOAD TASK NUMBER TO DCB 
  
          LDN    TIFMT       LOAD FORMAT FUNCTION 
          RJM    DRCALL      CALL DRIVER
          LDML   SB          GET GENERAL STATUS 
          ZJN    REFORM9     IF GOOD STATUS 
          LMC    TSKBSY      CHECK TASK BUSY
          ZJN    REFORM9     IF BUSY STATUS 
          LJM    DRERR
  
*       3.  WAIT FOR TASK TO COMPLETE.
  
 REFORM7  LDN    1
          STD    RT          RESET RT FOR NO TIMEOUT ON RESERVE 
          RJM    RQTC        REQUEST TASK COMPLETE
 REFORM9  LJM    XENT        EXIT TO SELECT SEQUENCE
  
          EJECT 
**        CMTEST - VERIFIES CM TEST NUMBER AND LOADS DCB
* 
*         ENTRY  - ((PA+1)) = CM DIAG TEST NUMBER 
* 
*         EXIT   - APPROPRIATE ENTRIES PLACED IN DCB
* 
 CMTESTX  LJM    **          ENTRY/EXIT 
 CMTEST   EQU    *-1
          LDIL   PA+1        DIAG TEST NUMBER 
          NJN    CMT0 
 ERITS    LDC    ER.ITS      ILLEGAL TEST SELECTION 
          LJM    RDWR2.2     ERROR ROUTINE
 CMT0     SBN    27D
          PJN    ERITS       IF SELECTION GT 26D
  
          LDN    0
          STML   DCDG1       ZERO FIRST DIAG PARAMETER
          STML   DCDG2       ZERO SECOND DIAG PARAMETER 
  
          LDIL   PA+1        DIAG TEST NUMBER 
          STDL   D.T4        SAVE 
          SBN    17D
          MJN    CMT1        IF SELECTION IS 1-16D
          STDL   D.T4 
* 
*         SELECTION IS 17-26D 
* 
          RJM    SETBIT      TO SET APPROPRIATE DIAG BIT
          STML   DCDG2       STORE AS SECOND DIAG PARAMETER 
          LJM    CMTESTX     EXIT 
  
* 
*         SELECTION IS 1-16D
* 
 CMT1     SODL   D.T4        DECREMENT SELECTION FOR SHIFT COUNT
          RJM    SETBIT      TO SET APPROPRIATE DIAG BIT
          STML   DCDG1       STORE AS FIRST DIAG PARAMETER
          LJM    CMTESTX     EXIT 
          SPACE  4,30 
**        DRCALL - CALLS IPI COMMON DRIVER, COPIES IPI STATUS TO
*                  P.O. STATUS BUFFER, AND TESTS GENERAL STATUS.
* 
*         ENTRY  - (A) = IPI COMMON DRIVER TASK NUMBER
* 
*         EXIT   - (A) = ZERO IF TASK COMPLETED SUCCESSFULLY
*                - IPI STATUS BUFFER IN P.O. STATUS BUFFER
* 
*                - DRERR - IF (A) NON-ZERO, AND TASK WAS
*                  NOT RESERVE DRIVE. 
* 
*         USES   - D.T6, D.T2 
* 
*         CALLS  - IPID 
* 
 DRCALLX  LJM    **          ENTRY/EXIT 
 DRCALL   EQU    *-1
          STDL   D.T6        SAVE TASK NUMBER 
          STML   DTSK        STORE IN DCB 
          RJM    IPID        CALL COMMON DRIVER 
* 
*         MOVE IPI STATUS BUFFER TO PRODUCT OVERLAY STATUS BUFFER 
* 
          LDN    57D         LOAD INDEX 
          STDL   D.T2 
 DRCALL1  LDML   DGS,D.T2    LOAD IPI STATUS WORD 
          STML   SB,D.T2     STORE TO PRODUCT OVERLAY 
          SODL   D.T2        DECREMENT INDEX
          PJN    DRCALL1     CONTINUE 
  
          LDML   SB          LOAD GENERAL STATUS
          ZJN    DRCALLX     IF ZERO, RETURN TO CALLING ROUTINE 
  
 DRCALL2  LDML   RESSF       CHECK IF RELEASE TASK BEFORE RESPONSE FLAG 
          ZJN    DRCALL5     PROCESS ERROR
 DRCALL3  UJN    DRCALLX     EXIT 
  
 DRCALL5  LDDL   D.T6        GET TASK NUMBER
          SBN    TRESDR 
          ZJN    DRCALL3     IF RESERVE DRIVE RETURN
*                            DRIVE MAY BE BUSY DURING CONNECT 
          UJN    DRERR       IF NOT RESERVE DRIVE, ERROR
          EJECT 
**        DRERR   -  INTERPRET GENERAL STATUS AND CALL ERROR ROUTINE
* 
*         ENTRY   -  (A) = NON ZERO GENERAL STATUS
* 
*         EXIT    -  N/A
* 
  
*         INTERPRET DRIVER GENERAL STATUS 
  
 DRERR    LDML   SB          GET DRIVER GENERAL STATUS
          SHN    2           SHIFT IN 16 BIT STATUS WORD
          PJN    DRE0.1      NOT FATAL ERROR
          SHN    1           SHIFT IN STATUS ERROR BIT
          MJN    DRE0.1      CLASS 3 RESPONSE RECEIVED
          UJN    DRE0.2 
  
*         FATAL ERROR STATUS BIT = 0 OR BOTH FATAL ERROR AND STATUS 
*         ERROR BITS ARE SET. 
*         RELEASE THE DRIVE AND CM. 
  
 DRE0.1   LDC    ER.ADS      ABNORMAL DRIVER STATUS 
          UJN    DRE1.1      RELEASE DRIVE, CM AND EXIT 
  
*         FATAL ERROR STATUS BIT = 1 AND STATUS ERROR STATUS BIT = 0. 
*         ALL OF THE IPID STATUS IS NOT CURRENT.
*         CLEAR THE PRODUCT OVERLAY STATUS BUFFER LOCATIONS 4D - 59D. 
*         RELEASE THE DRIVE AND CM. 
  
 DRE0.2   LDN    56D         NO. OF WORDS TO CLEAR
          STDL   D.T2 
 DRE1     LCN    0           STORE 177777 IN SB WORD
          STML   STDET,D.T2  START AT SB+59D
          SODL   D.T2 
          PJN    DRE1 
          LDC    ER.FTE      FATAL ERROR - NO CONT RESPONSE 
 DRE1.1   STDL   D.T4        SAVE ERROR CODE
  
*         RESET, SELECT, RELEASE DRIVE AND RESET. 
*         NO GENERAL STATUS CHECK.
*         CONDITIONAL SUCCESS DISABLE BIT IS SET IN OEF AT
*         INITIALIZATION. 
  
*         PERFORM LOGICAL RESET OF THE CM (DESELECT)
  
          RJM    TRESET      RESET CM 
  
*         PERFORM SELECT OF THE CM
  
          LDN    TSEL        SELECT DRIVE TASK NUMBER 
          STML   DTSK        STORE IN DCB 
          RJM    IPID        CALL COMMON DRIVER 
  
*         RELEASE DRIVE 
  
          RJM    TREDR       RELEASE THE DRIVE
  
*         PERFORM LOGICAL RESET OF THE CM (DESELECT)
  
          RJM    TRESET      RESET CM 
          AOML   DRRES       CLEAR DRIVE RESERVED FLAG
          AOML   CMRES       CLEAR CM RESERVED FLAG 
  
 DRE1.2   LDDL   D.T4        LOAD ERROR CODE
          LJM    ERR         ERROR EXIT 
  
          EJECT 
**        OPC    - RELEASE DRIVE AND CM OR CM 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - DRIVE AND CM OR CM RELEASED
* 
*         USES   - CMRES, DRRES 
* 
*         CALLS  - RESET, DRCALL
* 
* 
 OPCX     LJM    **          ENTRY/EXIT 
 OPC      EQU    *-1
          LDML   BD.CHFG
          ZJN    OPCX        EXIT IF CHANNEL NOT RESERVED 
  
          LDML   ERR3        LOAD ABORT ADDRESS 
          SBN    77B
          ZJN    OPC5        CALL FROM BASIC DRIVER 
  
          LDML   DRRES       DRIVE RES FLAG 
          NJN    OPC0        IF DRIVE NOT RESERVED
          AOML   DRRES       CLEAR DRIVE RESERVED FLAG
  
*         RELEASE THE RESERVED DRIVE AND RESET (DESELECT) THE CM
  
          LDN    TRELDR      RELEASE DRIVE TASK NUMBER
          RJM    DRCALL      PERFORM RELEASE DRIVE
          UJN    OPC1        RESET (DESELECT) CM
  
*         PERFORM LOGICAL RESET OF THE CM (DESELECT)
  
 OPC0     LDML   CMRES       CM RES FLAG
          NJN    OPCX        IF CM  NOT RESERVED
          AOML   CMRES       CLEAR CM RESERVED FLAG 
 OPC1     RJM    RESET       PERFORM SELECTIVE RESET
          AOML   CMRES       CLEAR CM RESERVED FLAG 
 OPC2     UJN    OPCX        EXIT 
  
*         THE DRIVE AND CM OR THE CM WILL BE RELEASED WITHOUT 
*         SENSING FOR ANY ERROR STATUS
  
 OPC5     LDML   DRRES       DRIVE RES FLAG 
          NJN    OPC6        IF DRIVE NOT RESERVED
          AOML   DRRES       CLEAR DRIVE RESERVED FLAG
  
*         RELEASE THE RESERVED DRIVE AND RESET (DESELECT) THE CM
  
          RJM    TREDR       RELEASE THE DRIVE
  
*         PERFORM LOGICAL RESET OF THE CM (DESELECT)
  
 OPC5.0   RJM    TRESET      RESET THE CM 
          UJN    OPC2        EXIT 
  
 OPC6     LDML   CMRES       CM RES FLAG
          NJN    OPC2        IF CM NOT RESERVED 
          AOML   CMRES       CLEAR CM RESERVED FLAG 
          UJN    OPC5.0      RESET CM 
  
          EJECT 
**        RESET  - PERFORMS A SELECTIVE RESET FUNCTION
* 
*         ENTRY   - NONE
* 
*         EXIT    - CONTROLLER SELECTIVLY RESET AND IPI STATUS IN SB
* 
 RESETX   LJM    **          ENTRY/EXIT 
 RESET    EQU    *-1
          LDN    TRSET       LOAD TASK NUMBER 
          RJM    DRCALL      PERFORM SELECTIVE RESET
          UJN    RESETX      RETURN TO CALLING ROUTINE
          SPACE  4,15 
**        RQTC   - REQUEST TASK COMPLETE. 
* 
*         ENTRY  - NONE.
* 
*         EXIT   - REQUEST TASK COMPLETE TASK EXECUTED AND STATUS 
*                  IN SB
* 
*                  DRERR - DRIVER ERROR.
* 
*         USES   - RESSF
* 
*         CALLS  - DRCALL 
* 
 RQTCX    LJM    **          ENTRY/EXIT 
 RQTC     EQU    *-1
          LDN    TRQTC       REQUEST TASK COMPLETE
          RJM    DRCALL      CALL DRIVER
          LDML   SB          GET STATUS 
          ZJN    RQTC5       EXIT DRIVER STATUS ZERO
          LPC    TSKBSY      CHECK TASK BUSY
          NJN    RQTCX       EXIT TASK BUSY 
  
 RQTC3    LDML   SB          GET STATUS 
          LPC    STERR       CHECK IF STATUS ERROR
          ZJN    RQTC7       IF NOT STATUS ERROR
          LDML   DLLE        CHECK LOW LEVEL ERROR CODE 
          LMC    E6ERR       CHECK IF ASYNC RESPONSE
          NJN    RQTC7       IF NOT ASYNC RESPONSE
 RQTC5    STML   RESSF       CLEAR RBTR FLAG
          UJN    RQTCX
  
 RQTC7    LJM    DRERR       DRIVER ERROR EXIT
  
          EJECT 
**        SELECT  - PERFORMS SELECT CONTROLLER FUNCTION 
* 
*         ENTRY   - NONE
* 
*         EXIT    - CONTROLLER SELECTED AND IPI STATUS IN SB
* 
 SELECTX  LJM    **          ENTRY/EXIT 
 SELECT   EQU    *-1
          LDN    TSEL        LOAD TASK NUMBER 
          RJM    DRCALL      CALL COMMON DRIVER 
          UJN    SELECTX     RETURN TO CALLING ROUTINE
          SPACE  4,15 
**        SETBIT - SETS APPROPRIATE CM DIAGNOSTIC BIT 
* 
*         ENTRY  - D.T1 CONTAINS SHIFT COUNT  (0-15D) 
* 
*         EXIT   - (A) = WORD WITH APPROPRIATE DIAG BIT SET 
* 
 SETBITX  LJM    **          ENTRY/EXIT 
 SETBIT   EQU    *-1
          LDDL   D.T4        GET SHIFT COUNT
          LMC    1077B       FORM RIGHT SHIFT INSTRUCTION 
          STML   SETB1       STORE FOR EXECUTION
          LDC    100000B     BEGIN WITH BIT 2**15 SET 
 SETB1    SHN    0           SHIFT INSTRUCTION STORED HERE
          UJN    SETBITX
          EJECT 
**        TCA    - TEST CHANNEL ASSIGNED
* 
*         ENTRY  - NONE 
* 
*         EXIT   - ERRCNA  - IF CHANNEL NOT ASSIGNED
* 
*         USES   - NONE 
* 
*         CALLS  - NONE 
* 
 TCAX     LJM    **          ENTRY/EXIT 
 TCA      EQU    *-1
          LDML   BD.CHFG     GET CHANNEL FLAG 
          NJN    TCAX        EXIT IF CHANNEL ASSIGNED 
 ERRCNA   LDC    ER.CNA 
          LJM    ERR         ELSE ERROR EXIT
          SPACE  4,20 
**        TCR    - TEST CM RESERVED 
  
*         ENTRY  - NONE 
* 
*         EXIT   - ERRCNR  - IF CM NOT RESERVED 
* 
*         USES   - NONE 
* 
*         CALLS  - TCA
* 
 TCRX     LJM    **          ENTRY/EXIT 
 TCR      EQU    *-1
          RJM    TCA         TEST CHANNEL ASSIGNED
          LDC    ** 
 CMRES    EQU    *-1         ** CM RESERVED FLAG STORED HERE
          ZJN    TCRX        IF CM RESERVED 
          LDC    ER.CNR 
          LJM    ERR         ELSE ERROR EXIT
          SPACE  4,20 
**        TDR    - TEST DRIVE RESERVED
* 
*         ENTRY  - NONE 
* 
*         EXIT   - ERRDNR  - IF DRIVE NOT RESERVED
* 
*         USES   - NONE 
* 
*         CALLS  - TCA
* 
 TDRX     LJM    **          ENTRY/EXIT 
 TDR      EQU    *-1
          RJM    TCA         TEST CHANNEL ASSIGNED
          LDC    ** 
 DRRES    EQU    *-1         ** DRIVE RESERVED FLAG STORED HERE 
          ZJN    TDRX        IF DRIVE RESERVED
 ERRDNR   LDC    ER.DNR 
          LJM    ERR         ELSE ERROR EXIT
          EJECT 
**        TREDR  - PERFORMS RELEASE DRIVE FUNCTION
* 
*         ENTRY   - NONE
* 
*         EXIT    - DRIVE RELEASED AND NO IPI STATUS IN SB
* 
 TREDRX   LJM    **          ENTRY/EXIT 
 TREDR    EQU    *-1
          LDN    TRELDR      LOAD TASK NUMBER 
          STML   DTSK 
          RJM    IPID        CALL COMMON DRIVER 
          UJN    TREDRX      RETURN TO CALLING ROUTINE
          SPACE  4,15 
**        TRESET  - PERFORMS A SELECTIVE RESET FUNCTION 
* 
*         ENTRY   - NONE
* 
*         EXIT    - CONTROLLER SELECTIVLY RESET AND NO IPI STATUS IN SB 
* 
 TRESETX  LJM    **          ENTRY/EXIT 
 TRESET   EQU    *-1
          LDN    TRSET       LOAD TASK NUMBER 
          STML   DTSK 
          RJM    IPID        PERFORM SELECTIVE RESET
          UJN    TRESETX     RETURN TO CALLING ROUTINE
          EJECT 
**        ERR    - ERROR EXIT SUBROUTINE
* 
*         ENTRY  - (A) = MESSAGE ADDRESS INDEX
* 
*         EXIT   - (A) = ABORT ADDRESS FOR AN ABORT 
*                  (A) = LINE NUMBER FOR MODULE TERMINATE 
* 
*         USES   - D.Z1, D.Z2, EC, EM, EA 
* 
*         CALLS  - NONE 
* 
 ERR      STD    D.Z1        SAVE MESSAGE INDEX AND ERROR NUMBER
          SHN    -12
          STD    D.Z2        SAVE ABORT FLAG
          LDN    0
          STM    BD.CHAIN    CLEAR CHAIN FLAG 
 ERR2     LDD    D.Z1 
          LPN    77B         MASK ERROR CODE
          ADC    7300B       ADD IN BIAS FOR IFSD PRODUCT OVERLAY 
          STD    EC          STORE ERROR CODE 
          LDD    D.Z1 
          SHN    -6 
          ADC    100B        FLAG MESSAGE INDEX AS OVERLAY MESSAGE
          STD    EM          STORE MESSAGE INDEX
          LDD    P
          STD    EA          STORE LINE NUMBER WHERE ERROR OCCURRED 
          LDD    D.Z2 
          NJN    ERR5        IF ABORT FLAG SET
          LDC    ** 
 ERR3     EQU    *-1         FOR ABORT ADDRESS
          SHN    12 
          LMC    ** 
 ERR4     EQU    *-1         FOR ABORT ADDRESS
          LJM    BD.RNI      RNI AT THE REJECT ADDRESS
  
 ERR5     LJM    BD.ABT      TERMINATE MODULE 
  
          EJECT 
**
*         MEMORY CELL DEFINITIONS 
* 
 DMA1     DATA   0           *
 DMA2     DATA   0           * CELLS HOLD BYTE ADDRESS OF DMA AREA
 DMA3     DATA   0           *
  
 IOEF     DATA   0           INITIALIZED OEF REGISTER 
  
* 
*         DC 121 AND 122 CYLINDERS WILL HAVE TO BE CHANGED WHEN 
*         DRIVE TYPES ARE AVAILABLE 
* 
 CCDC120  DATA   700D        DC 120 PRE-ALLOCATED CYLINDER
 CCDC121  DATA   1409D       DC 121 PRE-ALLOCATED CYLINDER
 CCDC122  DATA   7777B       DC 122 PRE-ALLOCATED CYLINDER
 CCDC123  DATA   7777B       DC 123 PRE-ALLOCATED CYLINDER
 CCDC124  DATA   1409D       DC 124 PRE-ALLOCATED CYLINDER
  
 IB       EQU    6660B       INPUT BUFFER 
 LIB      EQU    2010B       LENGTH OF INPUT AND OUTPUT BUFFERS 
 OB       EQU    IB+LIB      OUTPUT BUFFER
 SB       EQU    OB+LIB      STATUS BUFFER
 STDET    EQU    SB+3        DETAIL STATUS BEGINS AT SB(3)
 SBDMA    EQU    SB+60D      CHANNEL SUPPORTS DMA FLAG
 SBCH     EQU    SB+61D      CHANNEL NUMBER IN SB 
 SBEQ     EQU    SB+62D      CONTROLLER NUMBER IN SB
 SBUN     EQU    SB+63D      DRIVE NUMBER IN SB 
 LSB      EQU    100B        LENGTH OF STATUS BUFFER
 RESA     EQU    SB+72B      ITERATION COUNT FOR RES COMMAND
  
          ERRPL  *-IB-1      ERROR IF PRODUCT OVERLAY OVERFLOW
          EJECT 
 INIT     TITLE  INIT - INITIALIZATION. 
**        THE INITIALIZATION CODE THAT FOLLOWS MAY BE OVERLAYED 
*         BY THE PRODUCT OVERLAY BUFFERS ABOVE. 
* 
*         VERIFY THAT THE ASSIGNED DEVICE CODE IS SUPPORTED 
*IF DEF,MVE 
* 
 INIT     LDDL   DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -DCMIN      TEST IF MINIMUM DEVICE CODE FOR CM3/DRIVE
          MJN    INIT0       BELOW MINIUM DEVICE CODE 
          LDDL   DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -DCMAX      TEST IF MAXIMUM DEVICE CODE FOR CM3/DRIVE
          ZJN    INIT1       MAXIMUM DEVICE CODE
          MJN    INIT1       BELOW MAXIMUM DEVICE CODE
  
 INIT0    LDC    INITA       (A) = POINTER TO ERROR MSG IF NO SUPPORT 
 INIT0.1  STML   INIT10.1 
          STML   INIT13.1 
          LJM    INIT9.3     PROCESS ERROR MESSAGE
  
* 
*         CLEAR BSC IN THE DCB AND THE STATUS BUFFER
* 
 INIT1    LDN    0
          STML   DIBSC       CLEAR BURST SECTOR COUNT IN DCB
          STDL   D.Z1        CLEAR COUNTER
 INIT1.1  LDN    0
          STML   SB,D.Z1     CLEAR SB 
          AODL   D.Z1        INCREMENT COUNTER
          ADC    -LSB        MINUS SB LENGTH
          MJN    INIT1.1     IF SB NOT CLEARED
  
* 
*         INSERT CHANNEL, EQ AND UNIT NUMBERS INTO DCB AND SB 
* 
          LDML   BD.CHAN     LOAD CH NUMBER 
          STML   DCHN        STORE IN DCB 
          STML   SBCH        STORE IN SB
          LDM    BD.EQ
          LPN    70B
          ZJN    INIT1.2     IF UN ON ASSIGN DIRECTIVE WAS LESS THAN 10B
          LDC    INITB
          LJM    INIT0.1     GO SEND ERROR MESSAGE
 INIT1.2  LDML   BD.EQ
          LPN    77B
          STM    DCA
          LDM    BD.EQ
          SHN    -6 
          LPN    70B
          RAM    DCA
          LPN    77B
          SHN    15 
          STM    DCA         STORE CM3 EQ NUMBER IN DCB 
          STM    SBEQ        STORE IN SB
          SHN    -15
          STM    DDA         STORE DRIVE UNIT NUMBER IN DCB 
          STM    SBUN        STORE IN SB
          LDN    1           SECTOR TRANSFER COUNT
          STM    DSTC        STORE IN DCB 
* 
*         CHECK DMA CAPABILITY
* 
          LDML   BD.DMA 
          ZJN    INIT5       NO I0 DMA ADDRESSING 
          STML   SBDMA       SET SUPPORT DMA FLAG 
* 
*         INITIALIZE THE DMA ADDRESS
* 
          LDML   BD.DMAU     DMA UPPER ADDRESS
          STDL   D.Z1        SAVE 
          LDML   BD.DMAL     DMA LOWER ADDRESS
          ADN    1B          INCREMENT ADDRESS TO ALLOW FOR STATUS WORD 
          STDL   D.Z2        SAVE 
          SHN    1
          PJN    INIT2       NO OVERFLOW IN UPPER BITS OF ADDRESS 
          AODL   D.Z1        ADD TO DMA UPPER ADDRESS 
* 
*         IF DMA IS AVAILABLE, THE I0 DMA ADDRESSING WILL BE
*         SET UP BY DEFAULT.
* 
INIT2     LDDL   D.Z1        LOAD DMA UPPER ADDRESS 
          SHN    16 
          STM    DMA1        UPPER 10 BITS OF DMA AREA BYTE ADDRESS 
          SHN    -16
          SHN    16 
          LMDL   D.Z2 
          SHN    12 
          STM    DMA2        NEXT 12 BITS OF DMA AREA BYTE ADDRESS
          SHN    -12
          STM    DMA3        LOWER 6 BITS OF DMA AREA BYTE ADDRESS
  
 INIT5    LDC    FCSD        SET CONDITIONAL SUCCESS DISABLE BIT
          STML   DOEF        SET DCB OEF REGISTER FOR I0
          STML   IOEF        INITIALIZED OEF REGISTER FOR I0
          LDML   BD.IOU 
          LPN    7
          SBN    4
          ZJN    INIT5.5
          LJM    INIT9       NOT I4 IOU 
 INIT5.5  LDC    FI4
          RAML   DOEF        SET I4 BIT IN DCB OEF
          STML   IOEF        INITIALIZE OEF REGISTER FOR I4 
          LDML   BD.PORT
          ZJN    INIT6       IF PORT=A
          LDC    FI4PB
          RAML   DOEF        SET PORT=B 
          STML   IOEF        INITIALIZE OEF REGISTER FOR I4 
 INIT6    LDML   SBDMA
          ZJN    INIT9       NO I4 DMA ADDRESSING 
* 
*         SET UP DCB ADDRESSES FOR I4 DMA IF DMA AVAILABLE, AND I4 IOU. 
* 
*         I4 ADDRESSING FORMAT USED IN DCB
*         DFWA1 = 0 XXX XXX XXX XXX XXX 
*         DFWA2 = X XXX XXX XXX XXX 000 
*         DFWA3 = 0 000 000 000 000 000 
* 
          LDN    0
          STML   DMA3        CLEAR LOWER BITS OF DMA AREA BYTE ADDRESS
          LDDL   D.Z1        LOAD DMA UPPER ADDRESS 
          SHN    3
          STML   DMA1        UPPER 16 BITS OF DMA AREA BYTE ADDRESS 
          LDDL   D.Z2        LOAD LOWER 16 ADDRESS BITS 
          LPC    17777B 
          SHN    3
          STML   DMA2        LOWER 16 BITS OF DMA AREA BYTE ADDRESS 
          LDDL   D.Z2 
          SHN    -13D 
          RAML   DMA1 
* 
*         PROCESS PRODUCT OVERLAY MESSAGES
* 
 INIT9    LDN    0
          STDL   D.T1        CLEAR CELL 
          LDC    MMSGL. 
          STDL   D.T0        LENGTH OF PO MSG AREA IN 60 BIT WORDS
 INIT9.1  SBN    3           NUMBER OF 60 BIT WORDS/MESSAGE 
          MJN    INIT9.2     IF NO MESSAGES 
          STDL   D.T0        UPDATED LENGTH 
          AODL   D.T1        INCREMENT MESSAGE COUNT
          LDDL   D.T0 
          NJN    INIT9.1     IF MORE MESSAGES 
 INIT9.2  LDDL   D.T1 
          STML   BD.MSGS     MESSAGE COUNT
**
*         WRITE PP MESSAGES TO CM 
* 
 INIT9.3  LDN    0
          STDL   D.Z1 
          STDL   D.Z2 
          STDL   D.Z3 
          STDL   D.Z4 
 INIT10   LDML   PPMSGS,D.Z1 GET PP MESSAGE WORD
 INIT10.1 EQU    *-1         MODIFIED TO FWA OF INITIALIZATION ERROR
          ZJN    INIT12      IF END OF MESSAGE
 INIT11   STML   D.T4,D.Z2   STORE IN D.T4+ 
          AODL   D.Z1        BUMP PP MESSAGE POINTER
          UJN    INIT13 
 INIT12   LDC    2R          MESSAGE END, STORE BLANKS
          STML   D.T4,D.Z2
 INIT13   AODL   D.Z2        BUMP D.T4+ POINTER 
          SBN    4
          NJN    INIT10      IF NOT 4 PP WORDS
          STDL   D.Z2        CLEAR POINTER
          LDC    BD.MSGA     INDEX INTO CM COMM BUFFER TO PO MSG AREA 
          ADD    D.Z4        BIAS TO WORD WITHIN PO MSG AREA
          STML   BD.IDEX
          LDN    BD.CMB      POINTER TO FWA OF CM COMM BUFFER 
          RJM    BD.SETR
          CWDL   D.T4        WRITE MSG WORD TO CM 
          AODL   D.Z4        INCREMENT BIAS INTO PO MSG AREA
          AODL   D.Z3        BUMP CM WORD COUNTER 
          SBN    BD.MSGML+1  EACH MESSAGE OCCUPIES A 4 WORD CM BLOCK
          NJN    INIT10      IF NOT BD.MSGML CM WORDS 
          STDL   D.Z3        CLEAR CM WORD COUNTER
          LDC    0
 INIT13.1 EQU    *-1         MODIFIED TO FWA OF INITIALIZATION ERROR
          ZJN    INIT13.2    IF NOT PO INITIALIZATION ERROR 
          LCN    0
          UJN    INIT16      PO INITIALIZATION ERROR (A) = NEG ZERO 
 INIT13.2 LDML   PPMSGS,D.Z1
          ZJN    INIT14      IF MESSAGE ENDED IN ZERO BYTE
          AODL   D.Z1        SKIP ZERO BYTE TERMINATOR
 INIT14   AODL   D.Z1        BUMP PP MESSAGE ADDRESS TO NEXT MESSAGE
          LDML   PPMSGS,D.Z1
          ZJN    INIT14.1    IF LAST MESSAGE
          LJM    INIT11      GET NEXT MESSAGE 
 INIT14.1 EQU    *
* 
*         SET DIRECT CELLS
* 
          LDN    0
          STDL   WC          CLEAR WORD COUNT REGISTER
          STDL   WT          CLEAR WORDS TRANSMITTED REGISTER 
          STDL   BA          CLEAR BEGINNING ADDRESS REGISTER 
  
  
 INIT16   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
  
 INITA    DIS    ,*DEVICE CODE NOT SUPPORTED* 
 INITB    DIS    ,*UNIT NUMBER INVALID* 
  
*ENDIF
*IF -DEF,MVE
* 
*         CLEAR BSC IN THE DCB AND THE STATUS BUFFER
* 
 INIT     LDN    0
          STML   DIBSC       CLEAR BURST SECTOR COUNT 
          LDN    1
          STML   DSTC        DCB SECTOR TRANSFER COUNT
 INIT5    LDN    0
          STD    D.Z1        CLEAR COUNTER
 INIT7    LDN    0
          STML   SB,D.Z1     CLEAR SB 
          AODL   D.Z1        INCREMENT COUNTER
          ADC    -LSB        MINUS SB LENGTH
          MJN    INIT7       IF SB NOT CLEARED
  
*         INSERT CHANNEL, EQ AND UNIT NUMBERS INTO DCB AND SB 
  
          LDM    BD.EQ
          LPN    70B
          ZJN    INIT9       IF UN ON ASSIGN DIRECTIVE WAS LESS THAN 10B
          LDC    INITB
          LJM    INIT31      GO SEND ERROR MESSAGE
  
 INIT9    LDML   BD.EQ
          LPN    7B 
          STM    DDA         STORE DRIVE UNIT NUMBER IN DCB 
          STM    SBUN        STORE IN SB
          LDML   BD.EQ
          SHN    -9 
          LPN    7B 
          STM    DCA         STORE CM3 EQ NUMBER IN DCB 
          STM    SBEQ        STORE IN SB
 INIT11   LDC    FCSD        SET CONDITIONAL SUCCESS DISABLE BIT
          STML   DOEF        SET DCB OEF REGISTER FOR I0
          LDC    FI4
          RAML   DOEF        SET I4 BIT IN DCB OEF
          STML   IOEF        INITIALIZE OEF REGISTER FOR I4 
          LDM    BD.PORT
          LPN    1
          SHN    10D         SHIFT PORT 
          RAML   DOEF        SET PORT=B 
          STML   IOEF        INITIALIZE OEF REGISTER FOR PORT B 
  
*         STORE  I/O  CHANNEL INTO COMMANDS 
  
 INIT13   LDM    BD.CHAN
          LPN    40B         REMOVE CHANNEL NUMBER
          STML   SBDMA       SET SUPPORT DMA FLAG 
          NJN    INIT14      A CIO CHANNEL
          LDC    INITC       (A) = POINTER TO ERROR MSG IF NO SUPPORT 
          LJM    INIT31      EXIT WITH (A) = ERROR/NO ERROR FLAG
  
 INIT14   LDML   BD.CHAN     LOAD CH NUMBER 
          LPN    37B         REMOVE CHANNEL BIAS
          STML   DCHN        STORE IN DCB 
          STML   SBCH        STORE IN SB
          STD    D.T2 
          LDC    TCHAN
          STD    D.T0        SET  FWA  OF TABLE CONTAINING ADDRESSES
 INIT15   LDI    D.T0 
          ZJN    INIT17      IF END OF TABLE
          STD    D.T1 
          LDI    D.T1 
          LPC    7740B
          ADD    D.T2 
          STI    D.T1 
          AOD    D.T0 
          UJN    INIT15      COMPLETE ALL WORDS 
  
*         WRITE PPU MESSAGES TO CM
  
 INIT17   LDM    BD.MSGA     GET  PPU  MESSAGE AREA ADDRESS 
          STD    D.T6        SAVE IT
          ADC    MMSGL.      ADD LENGTH 
          RJM    BD.TFL      SEE IF IN FL 
          LDN    P.ZERO      CLEAR CELLS, D.Z1=PP MESSAGE ADDRESS 
          CRD    D.Z1        D.Z2=D.T0-D.T4 POINTER, D.Z3=CM WD COUNTER 
 INIT19   LDM    PPMSGS,D.Z1  GET PP MESSAGE WORD 
          ZJN    INIT23      IF END OF MESSAGE
 INIT21   STM    D.T0,D.Z2   STORE IN D.T0+ 
          AOD    D.Z1        BUMP PP MESSAGE POINTER
          UJN    INIT25 
  
 INIT23   LDC    2R          MESSAGE END, STORE BLANKS
          STM    D.T0,D.Z2
 INIT25   AOD    D.Z2        BUMP D.T0+ POINTER 
          SBN    5
          NJN    INIT19      IF NOT  5  PPU  WORDS
          STD    D.Z2        CLEAR POINTER
          LDD    D.RA        PUT  RA  IN  A  REGISTER 
          SHN    6
          ADD    D.T6        ADD MESSAGE ADDRESS
          CWD    D.T0        WRITE ONE WORD FROM D.T0 
          AOD    D.T6        UPDATED ADDRESS
          AOD    D.Z3        BUMP CM WORD COUNTER 
          SBN    BD.MSGML 
          NJN    INIT19      IF NOT BD.MSGML CM WORDS 
          STD    D.Z3        CLEAR CM WORD COUNTER
          LDM    PPMSGS,D.Z1
          ZJN    INIT27      IF MESSAGE ENDED IN ZERO BYTE
          AOD    D.Z1        SKIP ZERO BYTE TERMINATOR
 INIT27   AOD    D.Z1        BUMP PP MESSAGE ADDRESS TO NEXT MESSAGE
          LDM    PPMSGS,D.Z1
          NJN    INIT21      IF NOT LAST MESSAGE
  
*         SET DIRECT CELLS
  
          STD    WT          CLEAR WORDS TRANSMITTED REGISTER 
          STD    BA          CLEAR BEGINNING ADDRESS REGISTER 
          LDC    100D        100  MSEC DELAY IN BD.RCH
          STM    DLYDCH      MODIFY DELAY USED ON REL AND RES CHANNEL 
  
*         VERIFY THAT THE ASSIGNED DEVICE CODE IS SUPPORTED 
  
          LDD    DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -DCXMD      TEST IF DEVICE CODE FOR XMD DISK 
          NJN    INIT29 
          LDN    0           SET NO ERROR 
          UJN    INIT31 
  
 INIT29   LDC    INITA       (A) = POINTER TO ERROR MSG IF NO SUPPORT 
 INIT31   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
  
 INITA    DIS    ,*DEVICE CODE NOT SUPPORTED* 
 INITB    DIS    ,*UNIT NUMBER INVALID* 
 INITC    DIS    ,*CHANNEL DOES NOT SUPPORT DMA*
*ENDIF
          EJECT 
          TITLE  ERROR MESSAGES 
 PPMSGS   EQU    *           START OF PP MESSAGES 
****
          MMSG   ER.FLE,EC.FLE,(ADDR OUT OF FL),1 
          MMSG   ER.TL,EC.TL,(I/O TIME OUT ON CH RESERVE),1 
          MMSG   ER.SEE,EC.SEE,(SUBR ENTRY/EXIT ERR),1
          MMSG   ER.WC,EC.WC,(BUFFER INDEX OR WC ERR),1 
          MMSG   ER.RES,EC.RES,(R)
          MMSG   ER.RES1,EC.RES1,(R)
          MMSG   ER.RES2,EC.RES2,(R)
          MMSG   ER.CNA,EC.CNA,(CH NOT ASSIGNED)
          MMSG   ER.DNR,EC.DNR,(DRIVE NOT RESERVED) 
          MMSG   ER.IAL,EC.IAL,(ACCESS LEVEL TOO LOW FOR REQ) 
          MMSG   ER.NRES,EC.NRES,(RESERVE TIMEOUT)
          MMSG   ER.CNR,EC.CNR,(CM NOT RESERVED)
          MMSG   ER.ITS,EC.ITS,(ILLEGAL TEST SELECTION) 
          MMSG   ER.FTE,EC.FTE,(FATAL ERROR - NO CONT RESPONSE) 
          MMSG   ER.ADS,EC.ADS,(ABNORMAL DRIVER STATUS) 
          MMSG   ER.DMA,EC.DMA,(DMA I/O NOT ALLOWED)
          MMSG   ER.CANA,EC.CANA,(ACCESS TO CYLINDER NOT ALLOWED) 
  
 MMSGL.   EQU    MMSGL
          DATA   0
****
 TCHAN    EQU    *           CREATE CHANNEL TABLE 
          LIST   D
          HERE
          LIST   *
          DATA   0           END OF CHANNEL TABLE 
  
          QUAL   JMSIPI 
* 
*         EQUATES FOR IPI DRIVER
  
 ECMDG    EQU    1
 EDRDG    EQU    1
 ELCIML   EQU    1
 ERQTC    EQU    1           ENABLE RELEASE TASK BEFORE RESPONSE
 EIFMT    EQU    1           ENABLE INITIAL FORMAT
  
*IF DEF,LISTDOC,1 
          LIST   X
  
          ORG    13000B 
  
**
*         START OF IPI DRIVER CODE
* 
*         THE NEXT CARD IS A *CALL,COMPIPI
*CALL,COMPIPI 
  
          QUAL   *
  
*         EQUATES INTO IPI COMMON DRIVER CONTROL BLOCK (DCB)
  
 DTSK     EQU    /JMSIPI/DCB+/JMSIPI/TSK      DCB TASK NUMBER 
 DCHN     EQU    /JMSIPI/DCB+/JMSIPI/CHN      DCB IPI CHANNEL NO. 
 DCA      EQU    /JMSIPI/DCB+/JMSIPI/CA       DCB CM-3 ADDRESS
 DDA      EQU    /JMSIPI/DCB+/JMSIPI/DA       DCB DRIVE ADDRESS 
 DCYL     EQU    /JMSIPI/DCB+/JMSIPI/CYL      DCB CYLINDER ADDRESS
 DHD      EQU    /JMSIPI/DCB+/JMSIPI/HD       DCB HEAD ADDRESS
 DSEC     EQU    /JMSIPI/DCB+/JMSIPI/SEC      DCB SECTOR ADDRESS
 DOEF     EQU    /JMSIPI/DCB+/JMSIPI/OEF      DCB OPERATION ENABLE FLAGS
 DCDG1    EQU    /JMSIPI/DCB+/JMSIPI/CDG1     DCB CONTROLLER DIAG PARAM 1 
 DCDG2    EQU    /JMSIPI/DCB+/JMSIPI/CDG2     DCB CONTROLLER DIAG PARAM 2 
 DFWA1    EQU    /JMSIPI/DCB+/JMSIPI/FWA1     DCB FWA/R UPPER (CM)
 DFWA2    EQU    /JMSIPI/DCB+/JMSIPI/FWA2     DCB R LOWER (CM)
 DFWA3    EQU    /JMSIPI/DCB+/JMSIPI/FWA3     DCB A REG (CM)
 DSTC     EQU    /JMSIPI/DCB+/JMSIPI/STC      DCB SECTOR TRANSFER COUNT 
 DGS      EQU    /JMSIPI/DCB+/JMSIPI/GS       DCB GENERAL STATUS
 DFTSK    EQU    /JMSIPI/DCB+/JMSIPI/FTSK     DCB FAILING TASK
 DLLE     EQU    /JMSIPI/DCB+/JMSIPI/LLE      DCB LOW LEVEL ERROR CODE
 DSB      EQU    /JMSIPI/SB                   IPI DRIVER STATUS BUFFER
 DMS      EQU    /JMSIPI/SB+/JMSIPI/MS        DRIVER MAJOR STATUS WORD
 DIBSC    EQU    /JMSIPI/DCB+/JMSIPI/IBSC     INTERVAL BURST SECTOR COUNT 
 IPID     EQU    /JMSIPI/IPID                 FWA OF IPI DRIVER 
  
*         EQUATES TO IPI DRIVER TASKS 
  
 TRSET    EQU    /JMSIPI/RSET              MASTER/SELECTIVE RESET 
 TSEL     EQU    /JMSIPI/SEL               SELECT CONTROLLER
 TDESEL   EQU    /JMSIPI/DESEL             DESELECT CONTROLLER
 TRESDR   EQU    /JMSIPI/RESDR             RESERVE DRIVE
 TRELDR   EQU    /JMSIPI/RELDR             RELEASE DRIVE
 TSEEK    EQU    /JMSIPI/SEEK              SEEK 
 TSEKRD   EQU    /JMSIPI/SEKRD             SEEK-READ DATA 
 TSEKWR   EQU    /JMSIPI/SEKWR             SEEK-WRITE DATA
 TBUFRD   EQU    /JMSIPI/BUFRD             READ FROM CM BUFFER
 TBUFWR   EQU    /JMSIPI/BUFWR             WRITE TO CM BUFFER 
 TSSRDD   EQU    /JMSIPI/SSRDD             SELECT/SEEK-READ/DESEL 
 TSSWRD   EQU    /JMSIPI/SSWRD             SELECT/SEEK-WRITE/DESEL
 TCMDG    EQU    /JMSIPI/CMDG              PERFORM CM DIAGS 
 TDRDG    EQU    /JMSIPI/DRDG              PERFORM DRIVE DIAGS
 TRQDT    EQU    /JMSIPI/RQDT              REQUEST DRIVE TYPE 
 TRQTC    EQU    /JMSIPI/RQTC              REQUEST TASK COMPLETE
 TIFMT    EQU    /JMSIPI/IFMT              INITIAL FORMAT 
 TLCIML   EQU    /JMSIPI/LCIML             LOAD CONTROLLER IML
  
* 
*         OPERATION ENABLE FLAG EQUATES 
* 
 FAR      EQU    /JMSIPI/AR                AUTO RETRY 
 FCMT     EQU    /JMSIPI/CMT               CENTRAL MEMORY TRANSFER
 FCSD     EQU    /JMSIPI/CSD               CONDITIONAL SUCCESS DISABLE
 FDRL     EQU    /JMSIPI/DRL               DRIVE RELEASE ENABLE 
 FDRS     EQU    /JMSIPI/DRS               DRIVE RESERVE ENABLE 
 FPRE     EQU    /JMSIPI/PRE               PRIORITY RESERVE ENABLE
 FRTBR    EQU    /JMSIPI/RTBR              RELEASE TASK BEFORE REPLY ENABLE 
 FSLR     EQU    /JMSIPI/SLR               SLAVE RESET ENABLE 
 FBRE     EQU    /JMSIPI/BRE               BURST RELEASE ENABLE 
 FI4      EQU    /JMSIPI/I4                SELECT I4 IPI
 FI4PB    EQU    /JMSIPI/I4PB              I4 PORT BIT
          ERRPL  *-17677B     ERROR IF IPI DRIVER OVERFLOW
  
          QUAL   *
  
