*COMDECK,DDAS 
          TITLE  HIGH LEVEL DAS PRODUCT OVERLAY FOR MALET/VE. 
 5DA      SEGMENT POVLA 
          ORG    POVLA
          QUAL   DDAS 
*CALL,VERS
          COMMENT DDAS PRODUCT OVERLAY FOR MALET "VERS" 
          EJECT 
*         THE  FOLLOWING  COMMANDS  ARE  DESIGNED  FOR  THE  DISK  ARRAY
*         SUBSYSTEM   OPERATING  ON  AN IPI CHANNEL. 5DA  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 DDAS. 
* 
*         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)
*                   DCB+BIDS - BUFFER SECTOR SIZE (2048 OR 4096)
* 
*         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 158(10) PP WORDS.  DATA  IS  MOVED
*         BETWEEN THE PP AND THE DISK, EITHER DIRECTLY TO AND  FROM  THE
*         PP OR  VIA CENTRAL  MEMORY.  ALL READS AND WRITES TRANSFER ONE
*         SECTOR OF  INFORMATION  ACROSS A 16 BIT IPI CHANNEL. THE EXACT
*         AMOUNT  OF INFORMATION IS DEPENDENT ON THE SECTOR SIZE FOR THE
*         DEVICE  BEING  ACCESSED.  EXECUTION OF A WRITE WILL TRANSFER A
*         2000(8)  WORD  BLOCK (2048(10) BYTES)  FROM THE OUTPUT BUFFER.
*         THIS  SAME  BLOCK  WILL  BE  SENT  2 TIMES FOR A 4096(10) BYTE
*         SECTOR  SIZE  OR 4  TIMES  FOR  A 8192(10)  BYTE  SECTOR SIZE.
*         EXECUTION  OF A READ WILL LEAVE A 2000(8) WORD BLOCK (2048(10)
*         BYTE)  IN  THE INPUT BUFFER. THIS DATA WILL BE EITHER THE LAST
*         HALF OF A 4K SECTOR OR THE LAST ONE QUARTER OF A 8K SECTOR. 
          EJECT 
*         SUPPORTED CAPABILITIES ARE AS FOLLOWS.
* 
*             EXECUTE -  INITIATE EXECUTION OF CM OR DRIVE DIAGNOSTICS. 
*             READLOG -  READ INFORMATION FROM THE SUBSYSTEM PERFORMANCE LOGS.
*                        LOG. 
*             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. 
*             RES     -  RESERVE I/O CHANNEL AND SUBSYSTEM. 
*             REFORM  -  INITIAL FORMAT OF DRIVE. 
*             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 = 6460(8) 
*                          /     INPUT        / 
*                          /     BUFFER       / 
*                          /                  / 
*                          /------------------/   --- OBFWA = 10470(8)
*                          /     OUTPUT       / 
*                          /     BUFFER       / 
*                          /                  / 
*                          /------------------/   --- SBFWA = 12500(8)
*                          /  STATUS BUFFER   / 
*                          /------------------/   --- IPIDFWA = 12750(8)
*                          /                  / 
*                          /                  / 
*                          /       IPI        / 
*                          /      DRIVER      / 
*                          /                  / 
*                          /                  / 
*                          /                  / 
*                          /------------------/   --- IPIDLWA = 17XXX(8)
*                          /------------------/   --- 
*                          /                  /    .
*                          /                  /    .
*                          /    NOT USED      /    .--- IF 16K PPU
*                          /                  /    .
*                          /                  /    .
*                          --------------------   --- 
* 
          EJECT 
* 
* 
*                        FORMAT OF STATUS BUFFER
* 
*                          -------------------- 
*                      0   /                  /  0
*                      .   /  DRIVER STATUS   /  .
*                      .   /    13D WORDS     /  .
*                      .   /                  /  .
*                      .   /                  /  .
*                     12D  /------------------/  14(8)
*                     13D  /                  /  15(8)
*                      .   /  PACKET STATUS   /  .
*                      .   /    48D WORDS     /  .
*                      .   /                  /  .
*                      .   /                  /  .
*                 +---60D  /------------------/  71(8)
*                 /   61D  /  PAMAMETER E1    /  72(8)
*                 /    .   /(REPORT ADDRESSEE / 
*                 /    .   / STATUS COMMAND)  / 
*                 /   67D  /------------------/ 103(8)
*                 /   68D  /  PARAMETER E2    / 104(8)
*                 /    .   /(REPORT ADDRESSEE / 
*                 /    .   / STATUS COMMAND)  / 
*                 /   70D  /------------------/ 106(8)
*                 /   71D  /  PARAMETER 50    / 107(8)
* RETURNED BY ----/    .   /  (ATTRIBUTES     / 
* 'RES DRIVE'     /    .   /   COMMAND)       / 
*   COMMAND       /  139D  /------------------/ 213(8)
*                 /  140D  /  PARAMETER 51    / 214(8)
*                 /    .   /  (ATTRIBUTES     / 
*                 /    .   /   COMMAND)       / 
*                 /  142D  /------------------/ 216(8)
*                 /  143D  /  PARAMETER 68    / 217(8)
*                 /    .   /  (ATTRIBUTES     / 
*                 /    .   /   COMMAND)       / 
*                 +--150D  /------------------/ 
*                    151D  /     RESERVED     / 
*                    152D  /------------------/ 230(8)
*                    153D  /  RESERVE COUNT   / 231(8)
*                          /------------------/ 
*                    154D  / CHANNEL SUPPORTS / 232(8)
*                          /    DMA FLAG      / 
*                          /------------------/ 
*                    155D  / CHANNEL          / 233(8)
*                    156D  / EQUIPMENT        / 234(8)
*                    157D  / UNIT             / 235(8)
*                          /------------------/ 
  
          EJECT 
**        THE FOLLOWING TABLE DEFINES THE ERROR CODES AND MESSAGES THAT 
*         MAY BE GENERATED FOR EACH COMMAND.
* 
*                                             E R R R R R W 
*                                             X D E E E E R 
*                                             E L A F L S I 
*                                             C O D O . . T 
*                                             U G . R . . E 
*                                             T . . M . . . 
*                                             E . . . . . . 
*      -------------------------------------- - - - - - - - 
* 7310 CH NOT ASSIGNED                        X 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 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 
*      -------------------------------------- - - - - - - - 
* 7322 ACCESS TO TRACK NOT ALLOWED            . . X . . . X 
*      -------------------------------------- - - -   - - - 
* 7323 ACCESS TO SECTOR NOT ALLOWED           . . X . . . X 
*      -------------------------------------- - - - - - - - 
* 7324 DEVICE CODE/MODEL MISMATCH             . . . . . X . 
*      -------------------------------------- - - - - - - - 
* 7325 DEVICE CODE/SECTOR MISMATCH            . . . . . X . 
*      -------------------------------------- - - - - - - - 
* 7326 UNSUPPORTED SECTOR SIZE                . . . X . X . 
*      -------------------------------------- - - - - - - - 
* 7327 DRIVE NOT OPERATIONAL                  . . . . . X . 
*      -------------------------------------- - - - - - - - 
* 7330 INVALID DRIVE ADDRESS                  . . . . . X . 
*      -------------------------------------- - - - - - - - 
* 7331 DRIVE NOT CLUSTERED                    . . . . . X . 
*      -------------------------------------- - - - - - - - 
* 7332 DRIVE NOT FORMATTED                    . . . . . X . 
*      -------------------------------------- - - - - - - - 
* 7333 EXEC ON LOGICAL PARALL DEV NOT ALLOWED 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 
 EC.TANA  EQU    22B         ACCESS TO TRACK NOT ALLOWED
 EC.SANA  EQU    23B         ACCESS TO SECTOR NOT ALLOWED 
 EC.DCM   EQU    24B         DEVICE CODE/MODEL MISMATCH 
 EC.DCS   EQU    25B         DEVICE CODE/SECTOR MISMATCH
 EC.USS   EQU    26B         UNSUPPORTED SECTOR SIZE
 EC.DNO   EQU    27B         DRIVE NOT OPERATIONAL
 EC.IDA   EQU    30B         INVALID DRIVE ADDRESS
 EC.NCLS  EQU    31B         DRIVE NOT CLUSTERED
 EC.NFMT  EQU    32B         DRIVE NOT FORMATTED
 EC.CEPD  EQU    33B         EXECUTE ON PARALLEL DEVICE NOT ALLOWED 
  
*         DIRECT CELL EQUATES 
 WRIT     EQU    62B         DMA WRITE ITERATION COUNT
 WDCNT    EQU    63B         CM WORD COUNT
 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 
  
*         DEVICE CODES SUPPORTED
 ELTMIN   EQU    142B        ELITE 2 MINIMUM DC 
 ELTMAX   EQU    146B        ELITE 2 MAXIMUM DC 
 DCMIN    EQU    130B        DAS DISK UNIT  MINIMUM DEVICE CODE 
*IF DEF,MVE,1 
 DCMAX    EQU    136B        DAS DISK UNIT  MAXIMUM DEVICE CODE 
*IF -DEF,MVE,1
 DCMAX    EQU    137B        DAS DISK UNIT  MAXIMUM DEVICE CODE 
 DCMINSAB EQU    132B        MINIMUM DC FOR SABRE DRIVE 
 DC8K     EQU    135B        DAS MINIMUM DC FOR 8K SECTORS
 DCSSD1   EQU    130B        DC FOR SSD 1 DRIVE 
 DCSSD2   EQU    131B        DC FOR SSD 2 DRIVE 
          SPACE  4,20 
*         MISCELANOUS EQUATES.
 SSD1CYL  EQU    843D        DC 130 MAINT CYLINDER
*IF DEF,MVE,1 
 SSD2CYL  EQU    834D        DC 131 MAINT CYLINDER
*IF -DEF,MVE,1
 SSD2CYL  EQU    843D        DC 131 MAINT CYLINDER
 SABRECYL EQU    1628D       DC 132-136 MAINT CYLINDER
 ELITECYL EQU    2619D       DC 142-146 MAINT CYLINDER
*IF DEF,MVE,1 
 SSD1LS   EQU    8D          DC 130 LOW SECTOR ON MAINT CYL.
*IF -DEF,MVE,1
 SSD1LS   EQU    2D          DC 130 LOW SECTOR ON MAINT CYL.
 SSD1HS   EQU    11D         DC 130 HIGH SECTOR ON MAINT CYL. 
*IF DEF,MVE,1 
 SSD2LS   EQU    20D         DC 131 LOW SECTOR ON MAINT CYL.
*IF -DEF,MVE,1
 SSD2LS   EQU    5D          DC 131 LOW SECTOR ON MAINT CYL.
 SSD2HS   EQU    23D         DC 131 HIGH SECTOR ON MAINT CYL. 
 SSDTRK   EQU    3D          DC 130-131 TRACK ON MAINT CYL. 
 FOURK    EQU    2048D       PP WC FOR 4K BYTE DAS SECTOR SIZE
 EIGHTK   EQU    4096D       PP WC FOR 8K BYTE DAS SECTOR SIZE
 INTVRQD  EQU    0#4         INTERVENTION REQUIRED STATUS ID
 CEXCEP   EQU    0#3         COMMAND EXCEPTION STATUS ID
 MSCXCEP  EQU    0#8000      MAJOR STATUS - COMMAND EXCEPTION 
 P50SZ    EQU    0#41        PARAMETER 50 LENGTH IF 1 DRIVE 
          CODE   N
 SABMD1   EQU    2RS5        SABRE MODEL NUMBER 
 SABMD2   EQU    2RL2        SABRE MODEL NUMBER 
 ELTMD1   EQU    2RE2        ELITE MODEL NUMBER 
 ELTMD2   EQU    2RL1        ELITE MODEL NUMBER 
 SSD1MD1  EQU    2R0A        SSD MODEL NUMBER 
 SSD1MD2  EQU    2R17        SSD MODEL NUMBER 
 SSD2MD1  EQU    2R0A        SSD MODEL NUMBER 
 SSD2MD2  EQU    2R16        SSD MODEL NUMBER 
          CODE   *
 MDINDX   EQU    31B         INDEX INTO ATTR PACKET FOR MODEL 
 TIMREL   EQU    400000D/100D INTERVAL FOR CHANNEL RELEASE- 
 MAXITT   EQU    12D         ITERATION COUNT FOR ABOUT A 5 SEC.DELAY
 CMWC     EQU    256D        CM WORD COUNT TO WRITE PP BUFFER TO CM 
*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 
 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
  
          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    RDLOG       READ PERFORMANCE LOG 
          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 LOGICAL, ABT Z
*                 EXECUTE DRIVE PHYSICAL X, ABT Z 
* 
*          ENTRY - PA = 0 IF CM.
*                  PA = 1 IF DRIVE LOGICAL. 
*                  PA = 2 IF DRIVE PHYSICAL.
*                  PA+1 = CM DIAGNOSTIC TEST NUMBER OR
*                  PA+1 = DRIVE NUMBER. 
* 
*          EXIT  - SELECTED IN-LINES HAVE BEEN EXECUTED, STATUS 
*                  IN SB
* 
*                  ER.IDA - IF INVALID DRIVE ADDRESS
* 
*          USES  - BD.AL, EXECFLG, DPHDA
* 
*          CALLS - DRCALL, TDR, TCR, CMTEST 
* 
*         1.  TEST FOR CONTROL MODULE OR DRIVE DIAGNOSTICS. 
* 
 EXECUTE  LDML   IOEF 
          STML   DOEF        INITIALIZE OEF REGISTER
          LDDL   PA 
          ZJN    EXEC30      IF DRIVE NOT SPECIFIED 
 EXEC01   RJM    TDR         TEST DRIVE RESERVED
          LDDL   PA 
          SBN    1
          STML   EXECFLG
          NJN    EXEC15      IF PHYSICAL DRIVE SPECIFIED
* 
**        INSURE THAT LOGICAL DRIVE IS NOT A PARALLEL DRIVE 
* 
          LDML   MULTIDR
          ZJN    EXEC15      IF ONLY 1 DRIVE IN CONFIGURATION 
          LDC    ER.CEPD     EXEC ON LOGICAL PARALLEL DEVICE NOT ALLOWED
          LJM    ERR         ERROR EXIT 
 EXEC15   LDC    ** 
 EXECFLG  EQU    *-1         PHYSICAL/LOGICAL ENABLE BIT
          SHN    13D
          RAML   DOEF        STORE IN DCB 
          LDML   EXECFLG
          ZJN    EXEC20 
          LDIL   PA+1 
          STML   DPHDA
 EXEC20   LDN    TDRDG       LOAD DRIVE DIAG FUNCTION 
          UJN    EXEC35 
* 
*         2.  LOAD TASK NUMBER TO DCB 
* 
 EXEC30   RJM    TCR         TEST CM RESERVED 
          RJM    CMTEST      VERIFY TEST NO. AND LOAD DCB 
          LDN    TCMDG       LOAD CM DIAG FUNCTION
 EXEC35   RJM    DRCALL      CALL DRIVER
          LDML   SB          GET GENERAL STATUS 
          ZJN    EXEC70      IF GOOD STATUS 
 EXEC50   LJM    DRERR
 EXEC70   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 CH, 1 IF RES DRIVE, 2 IF RES SLAVE 
* 
*         EXIT   - I/O CHANNEL ASSIGNED AND CHANNEL ASSIGNED FLAGS
*                  SET IN ALL THE OTHER SUBROUTINES. CONTROLLER IS
*                  IS SELECTED, IF 'RES DRIVE', DRIVE IS RESERVED AND 
*                  IF 'RES SLAVE, A SLAVE RESET IS ISSUED TO CONTROLLER.
* 
*                  ER.NRES - IF NOT RESERVED BEFORE TIMERS EXPIRE.
*                  ER.IDA  - IF INVALID DRIVE ADDRESS.
*                  ER.DNO  - IF DRIVE NOT OPERATIONAL.
* 
*         USES   - EC, EA, EM, D.T3, RESA, DRRES, CMRES, DOEF 
*                  RESSF, RESSF1, PASAVE
* 
*         CALLS  - OPC, BD.RCH, DRCALL, RESET, SELECT, TDT, RQTC
  
**     1. CLEAR ERROR EXIT REGISTERS. 
* 
 RES      LDN    0
          STDL   EC          CLEAR ERROR REGISTERS
          STDL   EA 
          STDL   EM 
          LDML   IOEF        DEFAULT OEF REGISTER 
          STML   DOEF        STORE IN DCB 
          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 'TIMREL' 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 'MAXITT' HAS BENN REACHED. ABORT IF NO
*          RESERVE BEFORE THE COUNTERS HAVE EXPIRED.
  
          LDML   SB          GET GENERAL STATUS 
          SHN    2           SHIFT IN FATAL ERROR BIT 
          MJN    RES6        FATAL ERROR
  
          SHN    15D-BUSY    CHECK DRIVE BUSY 
          PJN    RES8        IF DRIVE NOT BUSY
          SODL   D.T3        DECREMENT LOOP COUNT 
          PJN    RES5        IF NOT TIMED OUT 
          UJN    RES2        ELSE START ANOTHER ITERATION 
 RES6     LJM    DRERR       INTERPRET STATUS 
  
*       5. SET CONTROL MOD/DRIVE CONNECTED. 
  
 RES8     LDML   SB          LOAD STATUS ERROR BIT
          SHN    3           SHIFT IN STATUS ERROR BIT
          PJN    RES9        IF NO STATUS ERROR 
          LDML   SB+18D      LOAD PARAMETER ID WORD 
          LPN    17B
          LMN    INTVRQD
          ZJN    RES8.1      IF ID=X4 - INTERVENTION REQUIRED 
          LMN    CEXCEP      IF ID=X7 - COMMAND EXCEPTION 
          NJN    RES6        IF NOT COMMAND EXECEPTION
          LDML   SB+19D 
          LPC    10000B      MASK INVALID ADDRESS BIT 
          ZJN    RES6        IF UNEXPECTED ERROR STATUS 
 ERIDA    LDC    ER.IDA      INVALID DRIVE ADDRESS
          LJM    ERR         ERROR EXIT 
  
 RES8.1   LDML   SB+19D 
          LPC    140000B     MASK NOT OPERATIONAL/NOT READY BITS
          ZJN    RES6        IF UNEXPECTED ERROR STATUS 
          LDC    ER.DNO 
 RES8.2   LJM    ERR
 RES9     LDN    0
          STML   DRRES       SET DRIVE RESERVED FLAG
 RES12    RJM    TDT         VALIDATE DRIVE TYPE WITH DEVICE CODE 
*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    RDWR0       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
          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
          STD    PASAVE      SET RES CH COMMAND 
          UJN    RES21       EXIT TO LOGICAL RESET/SELECT 
  
 RESSF    DATA   0           SLAVE RESET FLAG 
  
          EJECT 
**       RDLOG   - READ DAS PERFORMANCE LOG.
* 
*                 READLOG CONTROLLER, ABT Z 
* 
*          ENTRY - CONTROLLER IS SELECTED.
* 
*          EXIT  - (IB) AND (OB) = PERFORMANCE LOG DATA 
* 
*          USES  - DOEF, DFWA1
* 
*          CALLS - TCR, DRCALL
* 
* 
 RDLOG    RJM    TCR         TEST CM RESERVED 
          LDML   IOEF        DEFAULT OEF REGISTER 
          STML   DOEF        STORE IN DCB 
          LDML   IBFWA       FWA OF DATA OF INPUT BUFFER
          STML   DFWA1       SET DCB  FWA1
          LDN    TRDPFL      LOAD READ PERFORMANCE LOG FUNCTION 
          RJM    DRCALL      CALL DRIVER
          LJM    XENT        EXIT TO STACK
  
          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.
* 
*                  ER.IAL  - IF ACCESS LEVEL TOO LOW
*                  ER.CANA - IF ILLEGAL CYLINDER
*                  ER.CDMA - IF DMA I/O ILLEGAL 
*                  ER.TANA - IF ILLEGAL TRACK 
*                  ER.SANA - IF ILLEGAL SECTOR
* 
* 
*         USES   - D.T2, D.T4, DOEF, BD.CHAIN, DCYL, DHD, DSEC, 
*                  DFWA1, DFWA2, DFWA3, BD.DMA, BD.AL, BD.CHAIN,
*                  PASAVE, SB, D.T0 
* 
*         CALLS  - DRCALL, XSYS, TDR, RESET 
* 
  
**     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
          MJN    RDWR.1      AL = 3 
          LJM    RDWR4       AL = 4 OR GREATER
 RDWR.1   ADN    1
          PJN    RDWR3       AL = 3 
 RDWR0    LDC    ER.IAL      AL ERROR 
          UJN    RDWRERR
  
**         TEST FOR PRE-ALLOCATED DATA AREA IF AL=3 
* 
  
 RDWR3    LDDL   DC          GET DEVICE CODE
          ADC    -DCMINSAB   MINIMUM DC FOR SABRE DRIVE 
          MJN    RDWR3.1     IF SSD DRIVE 
  
*         DC=132-136
  
          LDI    CC          GET CYLINDER 
          ADC    -SABRECYL   MINUS PRE-ALLOCATED CYL FOR DC 
 CTCYL1   EQU    *-1         MODIFIED IF ELITE DC 
          NJN    CYLERR 
          LJM    RDWR5       SELECTED CYLINDER OK 
 CYLERR   LDC    ER.CANA     CYLINDER NOT ALLOWED ERROR 
 RDWRERR  LJM    RDWR7.2     ERROR
  
*         DC=130-131
  
 RDWR3.1  LDDL   DC 
          ADC    -DCSSD1
          NJN    RDWR3.2     IF DC=131
          LDI    CC 
          ADC    -SSD1CYL 
          UJN    RDWR3.3
 RDWR3.2  LDI    CC 
          ADC    -SSD2CYL 
 RDWR3.3  ZJN    RDWR3.4     SELECTED CYL OK
          UJN    CYLERR 
 RDWR3.4  LDI    CT 
          ADC    -SSDTRK
          ZJN    RDWR3.5     IF SELECTED TRACK OK 
          LDC    ER.TANA     TRACK NOT ALLOWED ERROR
 RDWRER1  UJN    RDWRERR     ERROR EXIT 
 RDWR3.5  LDDL   DC 
          ADC    -DCSSD1
          NJN    RDWR3.6     IF DC=131
          LDI    CS 
          SBN    SSD1LS      LOWEST VALID SECTOR ON MAINT CYL 
          MJN    SECERR      IF INVALID SECTOR SELECTED 
          LDI    CS 
          SBN    SSD1HS+1    HIGHEST VALID SECTOR+1 ON MAINT CYL
          PJN    SECERR      SECTOR NOT ALLOWED ERROR 
          LJM    RDWR5       SELECTED SECTOR OK 
 RDWR3.6  LDI    CS 
          SBN    SSD2LS      LOWEST VALID SECTOR ON MAINT CYL 
          MJN    SECERR      IF INVALID SECTOR SELECTED 
          LDI    CS 
          SBN    SSD2HS+1    HIGHEST VALID SECTOR+1 ON MAINT CYL
          PJN    SECERR      IF ERROR 
          LJM    RDWR5       SELECTED SECTOR OK 
 SECERR   LDC    ER.SANA     SECTOR NOT ALLOWED ERROR 
          UJN    RDWRER1     ERROR EXIT 
* 
**        TEST IF GREATER THEN MAX CYLINDER FOR AL=4 OR GREATER 
* 
  
 RDWR4    LDDL   DC          GET DEVICE CODE
          ADC    -DCMINSAB   MINIMUM DC FOR SABRE DRIVE 
          MJN    RDWR4.1     IF SSD DRIVE 
  
*         DC=132-136
  
          LDI    CC          GET CYLINDER 
          ADC    -SABRECYL-1 MAX CYL+1
 CTCYL2   EQU    *-1         MODIFIED IF ELITE DC 
          MJN    RDWR5       IF CYL IN RANGE
          LJM    CYLERR      CYLINDER GREATER THEN MAX
 RDWR4.1  LDDL   DC 
          ADC    -DCSSD1
          NJN    RDWR4.2     IF DC=131
          LDI    CC 
          ADC    -SSD1CYL-1  MAX CYL+1
          UJN    RDWR4.3
 RDWR4.2  LDI    CC 
          ADC    -SSD2CYL-1  MAX CYL+1
 RDWR4.3  MJN    RDWR5       SELECTED CYL OK
          LJM    CYLERR 
  
*         INSERT CYL, TRK AND SEC INTO DCB
  
 RDWR5    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    RDWR7       IF DMA READ
          SBN    2
          ZJN    RDWR7       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    RDWR6       IF NON-DMA READ
          LDC    OB          FWA FOR WRITE
          STML   DFWA1       SET DCB FWA1 
          LDN    TSSWRD      SEL/SEEK-WRITE/DESEL 
          UJN    RDWR6.1
  
 RDWR6    LDC    IB          FWA OF DATA XFER BUFFER
          STML   DFWA1       SET DCB  FWA1
          LDN    TSSRDD      SEL/SEEK-READ/DESEL
 RDWR6.1  RJM    DRCALL      CALL DRIVER
          LJM    RDWR10      SELECT THE CM3 
  
*         TEST FOR DMA PRESENT. 
  
*IF DEF,MVE,1 
 RDWR7    LDML   BD.DMA      GET DMA FLAG 
*IF -DEF,MVE,1
 RDWR7    LDML   SBDMA       GET DMA FLAG 
          NJN    RDWR7.6     DMA HARDWARE AVAILABLE 
          LDC    ER.DMA      DMA I/O ERROR
 RDWR7.2  STDL   D.T4        SAVE 
          LDC    LSB-1
          STDL   D.T2        INITIALIZE INDEX 
 RDWR7.4  LCN    0
          STML   SB,D.T2     CLEAR SB 
          SODL   D.T2 
          PJN    RDWR7.4     CONTINUE 
          LJM    DRE1.2      CALL ERROR ROUTINE 
  
*         SET UP FOR DMA OPERATION. 
*         THE ADDRESS FOR DMA TRANSFERS HAS BEEN OBTAINED VIA MLDVE.
  
 RDWR7.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    RDWR7.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 
 RDWR7.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 
* 
 RDWR7.9  RJM    WRDMA       COPY OB TO CM BUFFER 
          LDN    TSSWRD      SEL/SEEK-WRITE/DESEL 
          RJM    DRCALL      COMMON DRIVER
          UJN    RDWR7.8
  
          EJECT 
**        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 AND TEST FOR SECTOR SIZE TO FORMAT.
  
 REFORM   LDD    BD.AL       CHECK ACCESS LEVEL 
          SBN    20B
          PJN    REFORM0     IF 20 OR GREATER 
          LJM    RDWR0       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 
          LDIL   PA+1 
          LPC    177760B     CHECK FOR ILLEGAL VALUE
          NJN    REFORM3     IF NON ZERO ERROR EXIT 
          LDIL   PA+1 
          LPN    17B
          ZJN    REFORM3     IF ZERO EXIT 
          SBN    1
          ZJN    REFORM5     IF 2K BYTE SECTOR SIZE 
          SBN    1
          ZJN    REFORM5     IF 4K BYTE SECTOR SIZE 
          SBN    2
          ZJN    REFORM5     IF 8K BYTE SECTOR SIZE 
          SBN    4
          ZJN    REFORM5     IF 16K BYTE SECTOR SIZE
 REFORM3  LJM    TDTUSS      UNSUPPORTED SECTOR SIZE
  
 REFORM5  LDIL   PA+1 
          SHN    10D
          STML   DBIDS       SET SECTOR SIZE
          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 
          TITLE  UTILITIES USED BY DDAS PRODUCT OVERLAY.
  
**        CMTEST - VERIFIES CM TEST NUMBER AND LOADS DCB
* 
*         ENTRY  - ((PA+1)) = CM DIAG TEST NUMBER 
* 
*         EXIT   - APPROPRIATE ENTRIES PLACED IN DCB
* 
*                  ER.ITS - IF SECTION NUMBER INVALID 
* 
*         USES   - DCDG1, DCDG2, DCDG3, DCDG4, D.T4 
* 
*         CALLS  - SETBIT 
* 
 CMTESTX  LJM    **          ENTRY/EXIT 
 CMTEST   EQU    *-1
          LDIL   PA+1        DIAG TEST NUMBER 
          ZJN    ERITS       ILLEGAL TEST ROUTINE 
 CMT0     SBN    57D
          PJN    ERITS       IF SELECTION GT 56D
  
          LDN    0
          STML   DCDG1       ZERO FIRST DIAG PARAMETER
          STML   DCDG2       ZERO SECOND DIAG PARAMETER 
          STML   DCDG3       ZERO THIRD DIAG PARAMETER
          STML   DCDG4       ZERO FOURTH DIAG PARAMETER 
  
          LDIL   PA+1        DIAG TEST NUMBER 
          STDL   D.T4        SAVE 
          SBN    17D
          MJN    CMT1        IF SELECTION IS 1-16D
          STDL   D.T4 
          SBN    16D
          MJN    CMT2        IF SELECTION IS 17-32D 
          STDL   D.T4 
          SBN    16D
          MJN    CMT3        IF SELECTION IS 33-48D 
          STDL   D.T4 
* 
*         SELECTION IS 49-56D 
* 
          RJM    SETBIT      TO SET APPROPRIATE DIAG BIT
          STML   DCDG4       STORE AS SECOND DIAG PARAMETER 
 CMTEX    UJN    CMTESTX     EXIT 
  
 ERITS    LDC    ER.ITS      ILLEGAL TEST SELECTION 
          LJM    RDWR7.2     ERROR ROUTINE
* 
*         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
          UJN    CMTEX       EXIT 
* 
*         SELECTION IS 17-32D 
* 
 CMT2     RJM    SETBIT      TO SET APPROPRIATE DIAG BIT
          STML   DCDG2       STORE AS FIRST DIAG PARAMETER
          UJN    CMTEX       EXIT 
* 
*         SELECTION IS 33-48D 
* 
 CMT3     RJM    SETBIT      TO SET APPROPRIATE DIAG BIT
          STML   DCDG3       STORE AS FIRST DIAG PARAMETER
          UJN    CMTEX       EXIT 
  
          EJECT 
**        DRCALL - CALLS IPI COMMON DRIVER, COPIES IPI STATUS TO
*                  P.O. STATUS BUFFER, AND TESTS GENERAL STATUS.
* 
*         ENTRY  - (A)   = IPI COMMON DRIVER TASK NUMBER. 
*                  (DCB) = APPROPRIATE SETUP FOR TASK.
* 
*         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 OR TASK WAS NOT PERFORM
*                  PHYSICAL DRIVE DIAGNOSTICS.
* 
*         USES   - D.T6, D.T2, DTSK, SB 
* 
*         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    60D         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
  
          LDDL   D.T6        GET TASK NUMBER
          SBN    TDRDG
          NJN    DRERR       IF NOT DRIVE DIAGNOSTICS 
          LDML   DOEF 
          LPC    FPDE        MASK FOR PHYSICAL DRIVE ENABLE BIT 
          NJN    DRCALL3     EXIT 
  
          EJECT 
**        DRERR  - INTERPRET GENERAL STATUS AND CALL ERROR ROUTINE. 
* 
*         ENTRY  - (A) = NON ZERO GENERAL STATUS. 
* 
*                   ER.ADS - IF ABNORMAL DRIVER STAUTS. 
*                   ER.FTE - IF FATAL ERROR - NO CONTROLLER RESPONSE. 
* 
*         EXIT   - TO ERROR PROCESSING ROUTINE. 
* 
*         USES   - D.T2, D.T4, DTSK, DRRES, CMRES, SB 
* 
*         CALLS  - TRESET, TREDR, IPID
* 
*         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
          PJN    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 5D - 60D. 
*         RELEASE THE DRIVE AND CM. 
  
 DRE0.2   LDN    55D         NO. OF WORDS TO CLEAR
          STDL   D.T2 
 DRE1     LCN    0           STORE 177777 IN SB WORD
          STML   STDET,D.T2  START AT SB+60D
          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 CONTROLLER OR CONTROLLER.
* 
*         ENTRY  - NONE.
* 
*         EXIT   - DRIVE AND CONTROLLER OR CONTROLLER 
*                  RELEASED.
*         USES   - CMRES, DRRES 
* 
*         CALLS  - RESET, DRCALL, TRSET, TREDR
* 
* 
 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.
* 
*         USES   - NONE.
* 
*         CALLS  - DRCALL 
* 
 RESETX   LJM    **          ENTRY/EXIT 
 RESET    EQU    *-1
          LDN    TRSET       LOAD TASK NUMBER 
          RJM    DRCALL      PERFORM SELECTIVE RESET
          UJN    RESETX      RETURN TO CALLING ROUTINE
  
          EJECT 
**        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
* 
*         USES   - NONE.
* 
*         CALLS  - DRCALL 
* 
 SELECTX  LJM    **          ENTRY/EXIT 
 SELECT   EQU    *-1
          LDN    TSEL        LOAD TASK NUMBER 
          RJM    DRCALL      CALL COMMON DRIVER 
          UJN    SELECTX     RETURN TO CALLING ROUTINE
  
          EJECT 
**        SETBIT - SETS APPROPRIATE CM DIAGNOSTIC BIT.
* 
*         ENTRY  - D.T1 CONTAINS SHIFT COUNT  (0-15D).
* 
*         EXIT   - (A) = WORD WITH APPROPRIATE DIAG BIT SET.
* 
*         USES   - SETB1
* 
*         CALLS  - DRCALL 
* 
 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   - ER.CNA  - 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 
 TCAERR   UJN    TDRERR      ERROR EXIT 
  
          EJECT 
**        TCR    - TEST CONTROLLER RESERVED.
  
*         ENTRY  - NONE.
* 
*         EXIT   - ER.CNR  - IF CONTROLLER NOT RESERVED.
* 
*         USES   - NONE 
* 
*         CALLS  - TCA
* 
 TCRX     LJM    **          ENTRY/EXIT 
 TCR      EQU    *-1
          RJM    TCA         TEST CHANNEL ASSIGNED
          LDC    1
 CMRES    EQU    *-1         ** CONTROLLER RESERVED FLAG STORED HERE
          ZJN    TCRX        IF CONTROLLER RESERVED 
          LDC    ER.CNR 
 TCRERR   UJN    TDRERR      ERROR EXIT 
  
          EJECT 
**        TDR    - TEST DRIVE RESERVED
* 
*         ENTRY  - NONE 
* 
*         EXIT   - ER.DNR  - IF DRIVE NOT RESERVED. 
* 
*         USES   - NONE 
* 
*         CALLS  - TCA
* 
 TDRX     LJM    **          ENTRY/EXIT 
 TDR      EQU    *-1
          RJM    TCA         TEST CHANNEL ASSIGNED
          LDC    1
 DRRES    EQU    *-1         ** DRIVE RESERVED FLAG STORED HERE 
          ZJN    TDRX        IF DRIVE RESERVED
 ERRDNR   LDC    ER.DNR 
 TDRERR   LJM    ERR         ERROR EXIT 
  
          EJECT 
**        TDT    - MOVE PARAMETERS E1,E2,50, AND 51 TO SB AND TEST
*                  DRIVE TYPE.
* 
*         ENTRY  - EXECUTING 'RES DRIVE' COMMAND. 
* 
*         EXIT   - (SB) = PARAMETERS E1,E2,50,51. 
* 
*                  ER.DCM - IF DEVICE CODE MODEL MISMATCH.
*                  ER.USS - IF UNSUPPORTED SECTOR SIZE. 
*                  ER.DCS - IF DEVICE CODE / SECTOR SIZE MISMATCH.
* 
*         USES   - DFWA1, MULTIDR 
* 
*         CALLS  - DRCALL 
* 
 TDTX     LJM    **          ENTRY/EXIT 
 TDT      EQU    *-1
          LDC    PARME1      FWA FOR E1/E2 PARAMETERS 
          STML   DFWA1       INPUT ADDRESS FOR DRIVE TYPE DATA
          LDN    TRPADS      REPORT ADDRESSEE STATUS
          RJM    DRCALL      CALL DASIPI DRIVER 
          LDC    PARM50      FWA FOR 50/51 PARAMETERS 
          STML   DFWA1       INPUT ADDRESS FOR DRIVE TYPE DATA
          LDN    TRQDT       REPORT ADDRESSEE STATUS
          RJM    DRCALL      CALL DASIPI DRIVER 
          LDML   PARME1+4    GET CLUSTER/FORMAT DATA
          SHN    2           CHECK CLUSTER
          MJN    TDT01       IF CLUSTERED 
          LDC    ER.NCLS     IF NOT CLUSTERED 
          UJN    TDRERR      ERROR EXIT 
 TDT01    SHN    1           CHECK FORMAT 
          MJN    TDT03       IF CLUSTERED AND FORMATTED 
          LDC    ER.NFMT     IF NOT FORMATTED 
 TDT02    UJN    TDRERR      ERROR EXIT 
  
 TDT03    LDML   PARM50      GET PARAMETER LENGTH 
          SHN    -8 
          ADC    -P50SZ      PARAMETER 50 LENGTH FOR 1 DRIVE
          ZJN    TDT05       IF ONLY 1 DRIVE IN LOGICAL UNIT
          LDN    1
 TDT05    STML   MULTIDR     NON-ZERO IF MUTIPLE DRIVES 
          LDD    DC 
          ADC    -DCSSD2     SSD_2X DEVICE CODE 
          MJN    TDT20       IF SSD_1X
          NJN    TDT30
* 
** PROCESS SSD_2X DRIVE TYPE
* 
 TDT10    LDML   PARM50+MDINDX
          ADC    -SSD2MD1 
 TDT12    NJN    TDTDCM      IF MISMATCH
          LDML   PARM50+MDINDX+1
          ADC    -SSD2MD2 
          NJN    TDTDCM      IF MODEL MISMATCH
*IF DEF,MVE,1 
 TDT15    LJM    TDTX        EXIT 
*IF -DEF,MVE,1
 TDT15    UJN    TDT31       GET SECTOR SIZE
* 
** PROCESS SSD_1X DRIVE TYPE
* 
 TDT20    LDML   PARM50+MDINDX
          ADC    -SSD1MD1 
          NJN    TDTDCM      IF MISMATCH
          LDML   PARM50+MDINDX+1
          ADC    -SSD1MD2 
          ZJN    TDT15       IF MODEL OK
 TDTDCM   LDC    ER.DCM      DC/MODEL MISMATCH
          UJN    TDTERR      ERROR EXIT 
  
 TDTUSS   LDC    ER.USS      UNSUPPORTED SECTOR SIZE
 TDTERR   LJM    ERR         ERROR EXIT 
* 
** PROCESS SABRE DRIVE TYPE 
* 
 TDT30    LDML   PARM50+MDINDX   LOCATION OF MODEL WORD 1 
 TDTMD1   ADC    -SABMD1
          NJN    TDTDCM      IF MISMATCH
          LDML   PARM50+MDINDX+1 LAST 2 CHARS OF MODEL
 TDTMD2   ADC    -SABMD2
          NJN    TDTDCM      IF MISMATCH
* 
** INSURE SECTOR SIZE CORRECT FOR DEVICE CODE 
* 
 TDT31    LDML   PARM50      LENGTH OF 50 PARAMETER 
          SHN    -9D         FORM WORD OFFSET TO 51 PARAMETER 
          ADN    3           BIAS TO DATA BLOCK SIZE WORD 
          STDL   D.T3 
          LDML   PARM50,D.T3     DATA BLOCK SIZE
*IF DEF,MVE 
          ADC    -10000B
          ZJN    TDT34       IF 4K SECTORS
          ADC    -10000B
          ZJN    TDT38       IF 8K SECTORS
*ENDIF
*IF -DEF,MVE
          SHN    -1          SHIFT TO WORD COUNT
          STML   DBIDS       SAVE WORD COUNT IN DCB 
          SHN    -10         SET MULTIPLE OF 2K OCTAL WORDS 
          ZJN    TDTUSS      IF ZERO SET UNSUPPORTED SECTOR SIZE
          SBN    8           CHECK FOR MAX OF 16K BYTES 
          ZJN    TDT33       IF 16K OK
          PJN    TDTUSS      IF MORE THAN 16K UNSUPPORTED SECTOR SIZE 
 TDT33    ADN    8           RESET VALUE
          STD    WRIT        SAVE LOOP COUNT FOR DMA
 TDT35    LJM    TDTX        EXIT 
  
*ENDIF
*IF DEF,MVE 
          UJN    TDTUSS      UNSUPPORTED SECTOR SIZE
* 
** DATA BLOCK SIZE IS 4K BYTES
* 
 TDT34    LDD    DC 
          ADC    -DC8K
          PJN    TDTDCS      DEVICE CODE/SECTOR MISMATCH
 TDT35    LJM    TDTX        EXIT - DC OK FOR SECTOR SIZE 
* 
** DATA BLOCK SIZE IS 8K BYTES
* 
 TDT38    LDD    DC 
          ADC    -DC8K       MINIMUM DC FOR 8K SECTORS
          PJN    TDT35       DC OK FOR SECTOR SIZE
 TDTDCS   LDC    ER.DCS      DEVICE CODE/SECTOR SIZE MISMATCH 
 TDT41    LJM    TDTERR 
*ENDIF
  
*         MULTIPLE DRIVES FLAG
 MULTIDR  DATA   0
  
          EJECT 
**        TREDR  - PERFORMS RELEASE DRIVE FUNCTION. 
* 
*         ENTRY  - NONE.
* 
*         EXIT   - DRIVE RELEASED AND NO IPI STATUS IN SB.
* 
*         USES   - DTSK 
* 
*         CALLS  - IPID 
* 
 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
  
          EJECT 
**        TRESET  - PERFORMS A SELECTIVE RESET FUNCTION.
* 
*         ENTRY   - NONE. 
* 
*         EXIT    - CONTROLLER SELECTIVLY RESET AND NO IPI STATUS IN SB.
* 
*         USES   - DTSK 
* 
*         CALLS  - IPID 
* 
 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 
**        WRDMA  - WRITE PPU BUFFER TO DMA BUFFER IN CM.
* 
*         ENTRY  - NONE.
* 
*         EXIT   - CONTENTS OF OB HAS BEEN COPIED TO CM 
*                  DMA BUFFER ADDRESS.
* 
*         USES   - D.T3, WDCNT, WRDMA20, INDEX
* 
*         CALLS  - SETR 
* 
 WRDMAX   LJM    **          ENTRY/EXIT 
 WRDMA    EQU    *-1
*IF DEF,MVE 
          LDDL   WRIT 
          STDL   D.T3 
          LDC    CMWC        CM WORD COUNT
          STDL   WDCNT
          LDML   OBFWA
          STML   WRDMA20     FWA TO WRITE TO CENTRAL FROM 
          LDN    I.DMAB+1 
          STM    INDEX
 WRDMA10  LDC    DMAUP
          RJM    SETR        SETUP R AND A REGISTERS FOR CM REFERENCE 
          CWML   **,WDCNT    WRITE PP BUFFER TO CM DMA BUFFER 
 WRDMA20  EQU    *-1
          SODL   D.T3        DECREMENT WRITE ITERATION COUNT
          ZJN    WRDMAX      WRITE COMPLETE - EXIT
          LDML   INDEX
          ADC    CMWC 
          STML   INDEX       INCREMENT INDEX FOR NEXT BLOCK 
          UJN    WRDMA10     LOOP BACK FOR NEXT WRITE 
*ENDIF
*IF -DEF,MVE
          LDML   BD.IPIBU 
          STML   BUSAV       SAVE CMBUF ADDRESS 
          LDDL   WRIT 
          ZJN    WRDMA3      IF ZERO SET MAX COUNT
          SBN    8
          ZJN    WRDMA3      IF 8 SET 8 
          MJN    WRDMA3      IF LESS THAN 8 RESET 
          LDN    0
 WRDMA3   ADN    8           ADD 8 TO THE VALUE 
          STML   REPCNT 
          LDC    CMWC        CM WORD COUNT
          STDL   WDCNT
          LDN    13B
          RJM    BD.XSYS     REWIND IPI DMA FILE
 WRDMA10  LDN    14B
          RJM    BD.XSYS     SYSWRITE DMA 
          SOML   REPCNT      DECREMENT WRITE ITERATION COUNT
          ZJN    WRDMA20     WRITE COMPLETE - EXIT
          LDML   BD.IPIBU 
          ADC    CMWC 
          STML   BD.IPIBU     INCREMENT INDEX FOR NEXT BLOCK
          UJN    WRDMA10     LOOP BACK FOR NEXT WRITE 
  
 WRDMA20  LDML   BUSAV
          STML   BD.IPIBU     RESTORE CMBUF ADDRESS 
          LJM    WRDMAX 
  
 BUSAV    DATA   0            SAVE CM ADDRESS 
 REPCNT   DATA   0            NUMBER OF PASSES TO FILL IPI DMA BUFFER 
*ENDIF
  
          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.Z2, EC, EM, EA, BD.CHAIN 
* 
*         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 
          STM    RESSF       CLEAR RBTR 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 
  
  
 IB       EQU    6460B       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+5        DETAIL STATUS BEGINS AT SB(5)
 PARME1   EQU    SB+61D      PARAMETER E1 - RPT ADDE STATUS COMMAND 
 PARME2   EQU    SB+68D      PARAMETER E2   RPT ADDE STATUS COMMAND 
 PARM50   EQU    SB+71D      PARAMETER 50 - ATTRIBUTES COMMAND
 PARM51   EQU    SB+140D     PARAMETER 51 - ATTRIBUTES COMMAND
 PARM68   EQU    SB+143D     PARAMETER 68 - ATTRIBUTES COMMAND
 RESVD    EQU    SB+151D     RESERVED WORDS 
 RESA     EQU    SB+153D     RESERVE COUNT
 SBDMA    EQU    SB+154D     CHANNEL SUPPORTS DMA FLAG
 SBCH     EQU    SB+155D     CHANNEL NUMBER IN SB 
 SBEQ     EQU    SB+156D     CONTROLLER NUMBER IN SB
 SBUN     EQU    SB+157D     DRIVE NUMBER IN SB 
 LSB      EQU    236B        LENGTH OF STATUS BUFFER
  
          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    -ELTMIN     MINIMUM DC FOR ELITE DRIVE 
          PJN    INIEL0.1    POSSIBLY ELITE DRIVE TYPE
          LJM    INIT0.0     IF NOT ELITE DRIVE TYPE
 INIEL0.1 LDDL   DC 
          ADC    -ELTMAX-1   MAXIMUM DC FOR ELITE DRIVE 
          MJN    INIEL0.2    IF ELITE DEVICE CODE 
          LJM    INIT0       ILLEGAL DEVICE CODE
 INIEL0.2 LDC    -ELITECYL
          STML   CTCYL1      ADJUST MAX CYL FOR ELITE 
          STML   CTCYL2      ADJUST MAX CYL FOR ELITE 
          LDML   INIEL1 
          STML   TDTMD1      SET MODEL NUMBER TO ELITE
          LDML   INIEL2 
          STML   TDTMD1+1    SET MODEL NUMBER TO ELITE
          LDML   INIEL3 
          STML   TDTMD2      SET MODEL NUMBER TO ELITE
          LDML   INIEL4 
          STML   TDTMD2+1    SET MODEL NUMBER TO ELITE
          UJN    INIEL0.3 
* THE FOLLOWING CELLS ARE TEMPLATES FOR ELITE MODEL NUMBER
 INIEL1   ADC    -ELTMD1
 INIEL2   EQU    *-1
 INIEL3   ADC    -ELTMD2
 INIEL4   EQU    *-1
* 
 INIEL0.3 LDDL   DC 
          SBN    8
          STDL   DC          MAP DC TO SABRE DC 
 INIT0.0  LDDL   DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -DCMIN      TEST IF MINIMUM DEVICE CODE FOR DAS DRIVE
          MJN    INIT0       BELOW MINIUM DEVICE CODE 
          LDDL   DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -DCMAX      TEST IF MAXIMUM DEVICE CODE FOR DAS 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
  
* 
*         INITIALIZE DCB AND STATUS BUFFER
* 
 INIT1    LDN    0
          STML   DIBSC       CLEAR BURST SECTOR COUNT 
          LDN    1
          STML   DSTC        DCB SECTOR TRANSFER COUNT
          LDDL   DC 
          ADC    -DC8K       MINIMUM DC FOR 8K SECTORS
          MJN    INIT1.2     IF 4K SECTOR SIZE
          LDN    4
          STD    WRIT        WRITE ITERATION COUNT FOR DMA XFERS
          LDC    EIGHTK      PP WC FOR 8K BYTE SECTOR SIZE
          STML   DBIDS
          UJN    INIT1.21 
 INIT1.2  LDN    2
          STD    WRIT        WRITE ITERATION COUNT FOR DMA XFERS
          LDC    FOURK       PP WC FOR 4K BYTE SECTOR SIZE
          STML   DBIDS
 INIT1.21 LDN    0
          STD    D.Z1        CLEAR COUNTER
 INIT1.3  LDN    0
          STML   SB,D.Z1     CLEAR SB 
          AODL   D.Z1        INCREMENT COUNTER
          ADC    -LSB        MINUS SB LENGTH
          MJN    INIT1.3     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
          LDML   BD.EQ
          LPN    77B
          STM    DDA         STORE UN IN DCB
          STM    SBUN        STORE IN SB
          LDM    BD.EQ
          SHN    -9 
          LPN    7
          STML   DCA        STORE CM NUMBER IN DCB
          STML   SBEQ        STORE IN SB
* 
*         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
          LJM    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 
  
*         STORE I/O CHANNEL INTO COMMANDS 
  
          LDM    BD.CHAN
          LPN    37B         REMOVE CHANNEL BIAS
          STD    D.T2 
          LDC    TCHAN
          STD    D.T0        SET FWA OF TABLE CONTAINING ADDRESSES
 INIT15   LDI    D.T0 
          ZJN    INIT16      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 
  
  
 INIT16   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
  
 INITA    DIS    ,*DEVICE CODE NOT SUPPORTED* 
  
*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    40B
          ZJN    INIT9       IF UN ON ASSIGN DIRECTIVE WAS LESS THAN 40B
          LDC    INITB
          LJM    INIT31      GO SEND ERROR MESSAGE
  
 INIT9    LDML   BD.EQ
          LPN    77B
          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 
  
          LDDL   DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -ELTMIN     MINIMUM DC FOR ELITE DRIVE 
          PJN    INIEL0.1    POSSIBLY ELITE DRIVE TYPE
          LJM    INIT0.0     IF NOT ELITE DRIVE TYPE
 INIEL0.1 LDDL   DC 
          ADC    -ELTMAX-1   MAXIMUM DC FOR ELITE DRIVE 
          MJN    INIEL0.2    IF ELITE DEVICE CODE 
          LJM    INIT29      ILLEGAL DEVICE CODE
 INIEL0.2 LDC    -ELITECYL
          STML   CTCYL1      ADJUST MAX CYL FOR ELITE 
          STML   CTCYL2      ADJUST MAX CYL FOR ELITE 
          LDML   INIEL1 
          STML   TDTMD1      SET MODEL NUMBER TO ELITE
          LDML   INIEL2 
          STML   TDTMD1+1    SET MODEL NUMBER TO ELITE
          LDML   INIEL3 
          STML   TDTMD2      SET MODEL NUMBER TO ELITE
          LDML   INIEL4 
          STML   TDTMD2+1    SET MODEL NUMBER TO ELITE
          UJN    INIEL0.3 
* THE FOLLOWING CELLS ARE TEMPLATES FOR ELITE MODEL NUMBER
 INIEL1   ADC    -ELTMD1
 INIEL2   EQU    *-1
 INIEL3   ADC    -ELTMD2
 INIEL4   EQU    *-1
* 
 INIEL0.3 LDDL   DC 
          SBN    8
          STDL   DC          MAP DC TO SABRE DC 
 INIT0.0  LDDL   DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -DCMIN      TEST IF DEVICE CODE FOR DAS DISK 
          MJN    INIT29 
          LDD    DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -DCMAX      TEST IF DEVICE CODE FOR DAS DISK 
          ZJN    INIT31 
          PJN    INIT29      IF GREATER THAN ALLOWED
          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) 
          MMSG   ER.TANA,EC.TANA,(ACCESS TO TRACK NOT ALLOWED)
          MMSG   ER.SANA,EC.SANA,(ACCESS TO SECTOR NOT ALLOWED) 
          MMSG   ER.DCM,EC.DCM,(DEVICE CODE/MODEL MISMATCH) 
          MMSG   ER.DCS,EC.DCS,(DEVICE CODE/SECTOR MISMATCH)
          MMSG   ER.USS,EC.USS,(UNSUPPORTED SECTOR SIZE)
          MMSG   ER.DNO,EC.DNO,(DRIVE NOT OPERATIONAL)
          MMSG   ER.IDA,EC.IDA,(INVALID DRIVE ADDRESS)
          MMSG   ER.NCLS,EC.NCLS,(DRIVE NOT CLUSTERED)
          MMSG   ER.NFMT,EC.NFMT,(DRIVE NOT FORMATTED)
          MMSG   ER.CEPD,EC.CEPD,(EXEC ON LOG PARA DEV NOT ALLOW) 
  
 MMSGL.   EQU    MMSGL
          DATA   0
****
 TCHAN    EQU    *           CREATE CHANNEL TABLE 
          LIST   D
          HERE
          LIST   *
          DATA   0           END OF CHANNEL TABLE 
  
          QUAL   DASIPI 
* 
*         EQUATES FOR IPI DRIVER
  
 ECMDG    EQU    1           ENABLE CONTROLLER IN-LINES 
 EDRDG    EQU    1           ENABLE DRIVE IN-LINES
 ERADST   EQU    1           ENABLE REPORT ADDRESSEE STATUS 
 ERDPFL   EQU    1           ENABLE READ PERFORMANCE LOG
 ERQTC    EQU    1           ENABLE RELEASE TASK BEFORE RESPONSE
 EIFMT    EQU    1           ENABLE INITIAL FORMAT
          ORG    12750B 
  
**
*         START OF IPI DRIVER CODE
* 
*         THE NEXT CARD IS A *CALL,COMPIPA
          LIST   X
*CALL,COMPIPA 
  
          QUAL   *
  
*         EQUATES INTO IPI COMMON DRIVER CONTROL BLOCK (DCB)
  
 DTSK     EQU    /DASIPI/DCB+/DASIPI/TSK      DCB TASK NUMBER 
 DCHN     EQU    /DASIPI/DCB+/DASIPI/CHN      DCB IPI CHANNEL NO. 
 DCA      EQU    /DASIPI/DCB+/DASIPI/CA       DCB CM-3 ADDRESS
 DDA      EQU    /DASIPI/DCB+/DASIPI/DA       DCB DRIVE ADDRESS 
 DCYL     EQU    /DASIPI/DCB+/DASIPI/CYL      DCB CYLINDER ADDRESS
 DHD      EQU    /DASIPI/DCB+/DASIPI/HD       DCB HEAD ADDRESS
 DSEC     EQU    /DASIPI/DCB+/DASIPI/SEC      DCB SECTOR ADDRESS
 DOEF     EQU    /DASIPI/DCB+/DASIPI/OEF      DCB OPERATION ENABLE FLAGS
 DPHDA    EQU    /DASIPI/DCB+/DASIPI/PHDA     DCB PHYSICAL DRIVE ADDRESS
 DCDG1    EQU    /DASIPI/DCB+/DASIPI/CDG1     DCB CONTROLLER DIAG PARAM 
 DCDG2    EQU    /DASIPI/DCB+/DASIPI/CDG2     DCB CONTROLLER DIAG PARAM 
 DCDG3    EQU    /DASIPI/DCB+/DASIPI/CDG3     DCB CONTROLLER DIAG PARAM 
 DCDG4    EQU    /DASIPI/DCB+/DASIPI/CDG4     DCB CONTROLLER DIAG PARAM 
 DFWA1    EQU    /DASIPI/DCB+/DASIPI/FWA1     DCB FWA/R UPPER (CM)
 DFWA2    EQU    /DASIPI/DCB+/DASIPI/FWA2     DCB R LOWER (CM)
 DFWA3    EQU    /DASIPI/DCB+/DASIPI/FWA3     DCB A REG (CM)
 DSTC     EQU    /DASIPI/DCB+/DASIPI/STC      DCB SECTOR TRANSFER COUNT 
 DBIDS    EQU    /DASIPI/DCB+/DASIPI/BIDS     DCB BURST/INT/DATA SIZE 
 DGS      EQU    /DASIPI/DCB+/DASIPI/GS       DCB GENERAL STATUS
 DFTSK    EQU    /DASIPI/DCB+/DASIPI/FTSK     DCB FAILING TASK
 DLLE     EQU    /DASIPI/DCB+/DASIPI/LLE      DCB LOW LEVEL ERROR CODE
 DSB      EQU    /DASIPI/SB                   IPI DRIVER STATUS BUFFER
 DMS      EQU    /DASIPI/SB+/DASIPI/MS        DRIVER MAJOR STATUS WORD
 DIBSC    EQU    /DASIPI/DCB+/DASIPI/IBSC     INTERVAL BURST SECTOR COUN
 IPID     EQU    /DASIPI/IPID                 FWA OF IPI DRIVER 
  
*         EQUATES TO IPI DRIVER TASKS 
  
 TRSET    EQU    /DASIPI/RSET              MASTER/SELECTIVE RESET 
 TSEL     EQU    /DASIPI/SEL               SELECT CONTROLLER
 TDESEL   EQU    /DASIPI/DESEL             DESELECT CONTROLLER
 TRESDR   EQU    /DASIPI/RESDR             RESERVE DRIVE
 TRELDR   EQU    /DASIPI/RELDR             RELEASE DRIVE
 TSEEK    EQU    /DASIPI/SEEK              SEEK 
 TSEKRD   EQU    /DASIPI/SEKRD             SEEK-READ DATA 
 TSEKWR   EQU    /DASIPI/SEKWR             SEEK-WRITE DATA
 TBUFRD   EQU    /DASIPI/BUFRD             READ FROM CM BUFFER
 TBUFWR   EQU    /DASIPI/BUFWR             WRITE TO CM BUFFER 
 TSSRDD   EQU    /DASIPI/SSRDD             SELECT/SEEK-READ/DESEL 
 TSSWRD   EQU    /DASIPI/SSWRD             SELECT/SEEK-WRITE/DESEL
 TCMDG    EQU    /DASIPI/CMDG              PERFORM CM DIAGS 
 TDRDG    EQU    /DASIPI/DRDG              PERFORM DRIVE DIAGS
 TRQDT    EQU    /DASIPI/RQDT              REQUEST DRIVE TYPE 
 TRQTC    EQU    /DASIPI/RQTC              REQUEST TASK COMPLETE
 TIFMT    EQU    /DASIPI/IFMT              INITIAL FORMAT 
 TLCIML   EQU    /DASIPI/LCIML             LOAD CONTROLLER IML
 TRDPFL   EQU    /DASIPI/RDPFL             READ PERFORMANCE LOG 
 TRPADS   EQU    /DASIPI/RPADS             REPORT ADDRESSEE STATUS
* 
*         OPERATION ENABLE FLAG EQUATES 
* 
 FAR      EQU    /DASIPI/AR                AUTO RETRY 
 FCMT     EQU    /DASIPI/CMT               CENTRAL MEMORY TRANSFER
 FCSD     EQU    /DASIPI/CSD               CONDITIONAL SUCCESS DISABLE
 FDRL     EQU    /DASIPI/DRL               DRIVE RELEASE ENABLE 
 FDRS     EQU    /DASIPI/DRS               DRIVE RESERVE ENABLE 
 FPRE     EQU    /DASIPI/PRE               PRIORITY RESERVE ENABLE
 FRTBR    EQU    /DASIPI/RTBR              RELEASE TASK BEFORE REPLY ENA
 FSLR     EQU    /DASIPI/SLR               SLAVE RESET ENABLE 
 FBRE     EQU    /DASIPI/BRE               BURST RELEASE ENABLE 
 FI4      EQU    /DASIPI/I4                SELECT I4 IPI
 FI4PB    EQU    /DASIPI/I4PB              I4 PORT BIT
 FPDE     EQU    /DASIPI/PDE               PHYSICAL DRIVE ENABLE
          ERRPL  *-17770B     ERROR IF IPI DRIVER OVERFLOW
  
          QUAL   *
  
