*COMDECK,P895D
          TITLE  HIGH LEVEL DMA/895 FULL TRACK PRODUCT OVERLAY FOR MALET. 
 5C9      SEGMENT POVLA 
          ORG    POVLA
          QUAL   P895D
*CALL,VERS
          COMMENT DMA/895 PRODUCT OVERLAY FOR MALET "VERS"
          EJECT 
  
**      THE FOLLOWING COMMANDS ARE DESIGNED FOR THE 895 DISK SUBSYSTEM
*       WITH  A  DIRECT MEMORY ACESS AND RUNNING IN A FULL-TRACK (1 T0
*       1 INTERLACE) MODE.  5C9 IS THE PRODUCT OVERLAY  THAT  EXECUTES
*       THESE  COMMANDS  AND IS DRIVEN BY THE INSTRUCTION STACK OF THE
*       MALET PP DRIVER.  FOR  THESE  DISK  SUBSYSTEMS  THE  MALET  PP
*       DRIVER EXECUTES OUT OF A 12 BIT 2X SPEED PP UTILIZING A 12 BIT
*       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 P895D.
* 
*       THIS PRODUCT OVERLAY SUPPORTS A PROGRAMMABLE INPUT BUFFER (IB)
*       OF  505B  PP  WORDS, AN OUTPUT BUFFER (OB) OF 505B PP WORDS, A
*       SUBSYSTEM STATUS BUFFER (SB) OF 66B PP WORDS AND A  CM  BUFFER
*       OF  64D WORDS.  DATA IS WRITTEN TO THE DISK FROM THE CM BUFFER
*       AND IS READ FROM THE DISK TO THE PP INPUT  BUFFER  OR  THE  CM
*       BUFFER.   ALL  READS  AND  WRITES  TRANSFER  502B 12 BIT WORDS
*       ACROSS A 12 BIT CHANNEL.  THE STATUS BUFFER IS  USED  TO  HOLD
*       GENERAL,   DETAIL,  ERROR  AND  OPERATIONAL  STATUS  FROM  THE
*       SUBSYSTEM AND OR THE 170 DMA CHANNEL.  SUPPORTED  CAPABILITIES
*       ARE AS FOLLOWS@D
* 
*       READ           -  SEEK AND READ 1 SECTOR FROM DISK TO PP IB.
*       READ TO CM     -  SEEK AND READ 1 SECTOR FROM DISK TO CM. 
*       REL            -  RELEASE DRIVE, SUBSYSTEM, AND I/O CHANNEL.
*       RES            -  RESERVE I/O CHANNEL AND SUBSYSTEM.
*       STATUS         -  INPUT GENERAL, DETAILED (895), ERROR OR 
*                         OPERATIONAL (DMA) STATUS TO SB. 
*       WRITE FROM CM  -  SEEK AND WRITE 1 SECTOR TO DISK FROM CM.
  
          EJECT 
  
**                  FORMAT OF STATUS BUFFER 
* 
* 
*                     --------------------   ---
*                 0   /  GENERAL STATUS  /      / 
*           /----     /------------------/      / 
*           /     1   /                  /      / 
*           /     .   /                  /      / 
*           / CH  .   / DETAILED STATUS  /      / THIS IS THE NORMAL/ 
*           /STATUS   /                  /      / LAST TAKEN STATUS 
*           /32 DEC   /                  /      / FROM THE SUBSYSTEM. 
*           /WORDS.   /                  /      / 
*           /     .   /                  /      / 
*           /     .   /                  /      / 
*           /         /                  /      / 
*           /    24B  /                  /   ---
*           /         /------------------/   ---
*           /    25B  /   GENERAL STATUS /      / 
*           /         /------------------/      / 
*           /    26B  /                  /      / 
*           /     .   /                  /      / THIS IS THE FIRST 
*           /     .   / DETAILED STATUS  /      / TAKEN STATUS WITHIN 
*           /     .   /                  /      / SEQUENCES THAT
*           / ---40B  /                  /      / REQUIRED RECOVERY TO
*                     /                  /      / BE PERFORMED IF 
*                     /                  /      / NECESSARY.
*                 .   /                  /      / (CONTINUE FUNCTIONS 
*                 .   /                  /      / ISSUED.)
*                 .   /                  /      / 
*                51B  /                  /   ---
*                     /------------------/   ---
*                52B  /  RETRY COUNT     /      / ERROR CORRECTION DATA.
*                     /------------------/   ---
*                53B  /  T REG COUNT     /      / CM 8 BIT TRANSFERS. 
*                     /------------------/   ---
*                56B  / ERROR STATUS     /      / ERR STATUS BITS 12-15.
*                57B  / ERROR STATUS     /      / ERR STATUS BITS 0-11. 
*                     /------------------/   ---
*                60B  / SEEK TIME        /        MILLISECONDS TO DO LAST 
*                     /------------------/        SEEK. 
*                61B  / CHANNEL          /   ---
*                62B  / EQUIPMENT        /      / 
*                63B  / UNIT             /      / EQUIPMENT UNDER TEST. 
*                     --------------------   ---
*                64B  / OPERATION STATUS /      / OPER STATUS BITS 12-15. 
*                65B  / OPERATION STATUS /      / OPER STATUS BITS 0-11.
*                     --------------------   ---
* 
*       ALL SUBROUTINES IN THIS PRODUCT OVERLAY  USE  A  COMMON  ERROR
*       EXIT SEQUENCE WHEN AN ERROR IS DETECTED.  THIS SEQUENCE STORES
*       AN INTERNAL ERROR CODE INTO THE EC REGISTER, AN ERROR  MESSAGE
*       INDEX  INTO  THE  EM  REGISTER,  AND  THE  CURRENT  P REGISTER
*       CONTENTS (LINE NUMBER) INTO  THE  EA  REGISTER.   I/O  CHANNEL
*       CLEANUP  OCCURS  AND  A  JUMP  IS MADE TO THE STATEMENT NUMBER
*       SPECIFIED BY THE ABT ADDRESS IN THE COMMAND.
  
          EJECT 
**        THE FOLLOWING TABLE DEFINES THE ERROR CODES AND MESSAGES THAT 
*         MAY BE GENERATED FOR EACH COMMAND.
* 
*                                        R R 8 R R W D
*                                        E E 9 E E R M
*                                        L S 5 A A I A
*                                        . . . D D T .
*                                        . . S . . E S
*                                        . . T . C . T
*                                        . . A . M C A
*                                        . . T . . M T
*                                        . . U . . . U
*                                        . . S . . . S
*                                        - - - - - - -
* 7210 CH NOT ASSIGNED                   . . X X X X .
*      --------------------------------- - - - - - - -
* 7211 CH ACTIVE ON ENTRY                . X . . . . .
*      --------------------------------- - - - - - - -
* 7212 NO INACTIVE TO LAST FUNC          X X X X X X .
*      --------------------------------- - - - - - - -
* 7213 NO INACTIVE TO GENERAL STATUS     . X X X X X .
*      --------------------------------- - - - - - - -
* 7214 NO INACTIVE TO DETAIL STATUS      . X X X X X .
*      --------------------------------- - - - - - - -
* 7215 GENERAL STATUS NOT RETURNED       . X X X X X .
*      --------------------------------- - - - - - - -
* 7216 INCOMPLETE 895 STATUS RETURNED    . X X X X X .
*      --------------------------------- - - - - - - -
* 7217 FUNC PARAMETERS NOT ACCEPTED      . X . X X X .
*      --------------------------------- - - - - - - -
* 7220 ALL DATA NOT ACCEPTED FROM PP/CM  . . . . . X .
*      --------------------------------- - - - - - - -
* 7221 INCOMPLETE DATA RETURNED PP/CM    . . . X X . .
*      --------------------------------- - - - - - - -
* 7222 CONTROLLER/DRIVE NOT CONNECTED    . . X X X X .
*      --------------------------------- - - - - - - -
* 7223 ACCESS LEVEL TOO LOW FOR REQ      . . . X X X .
*      --------------------------------- - - - - - - -
* 7224 RESERVE TIMEOUT                   . X . . . . .
*      --------------------------------- - - - - - - -
* 7225 ABNORMAL GENERAL STATUS           . X . X X X .
*      --------------------------------- - - - - - - -
* 7226 CHANNEL FAILED TO GO EMPTY        . . . X . . .
*      --------------------------------- - - - - - - -
* 7227 UNIT HUNG BUSY                    . . . X X X .
*      --------------------------------- - - - - - - -
* 7230 SUCCESSFUL RETRY                  . . . X X X .
*      --------------------------------- - - - - - - -
* 7231 ACCESS TO CYLINDER NOT ALLOWED    . . . X X X .
*      --------------------------------- - - - - - - -
* 7233 NO INACTIVE AFTER DATA XFER       . . X X X X X
*      --------------------------------- - - - - - - -
* 7234 CH PE ON 895 INPUT                . . X X . . .
*      --------------------------------- - - - - - - -
          EJECT 
  
*                                        R R 8 R R W D
*                                        E E 9 E E R M
*                                        L S 5 A A I A
*                                        . . . D D T .
*                                        . . S . . E S
*                                        . . T . C . T
*                                        . . A . M C A
*                                        . . T . . M T
*                                        . . U . . . U
*                                        . . S . . . S
*      --------------------------------- - - - - - - -
* 7235 NO INACTIVE TO DMA STATUS         . . . . X X X
*      --------------------------------- - - - - - - -
* 7236 INCOMPLETE DMA STATUS RETURNED    . . . . X X X
*      --------------------------------- - - - - - - -
* 7237 CH PE ON DMA OPERATION            . . . . X X X
*      --------------------------------- - - - - - - -
* 7240 DMA ERROR STATUS SET              . . . . 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.CAS   EQU    11B         CH ACTIVE ON ENTRY 
 EC.NIF   EQU    12B         NO INACTIVE TO LAST FUNC 
 EC.NIGS  EQU    13B         NO INACTIVE TO GENERAL STATUS
 EC.NIDS  EQU    14B         NO INACTIVE TO DETAIL  STATUS
 EC.GSNR  EQU    15B         GENERAL STATUS NOT RETURNED
 EC.ISR   EQU    16B         INCOMPLETE 895 STATUS RETURNED 
 EC.FPNA  EQU    17B         FUNC PARAMETERS NOT ACCEPTED 
 EC.DNA   EQU    20B         ALL DATA NOT ACCEPTED FROM PP/CM 
 EC.IDR   EQU    21B         INCOMPLETE DATA RETURNED TO PP OR CM 
 EC.CNC   EQU    22B         CONTROLLER/DRIVE NOT CONNECTED 
 EC.IAL   EQU    23B         ACCESS LEVEL TOO LOW FOR REQ 
 EC.NRES  EQU    24B         RESERVE TIMEOUT
 EC.AGS   EQU    25B         ABNORMAL GENERAL STATUS
 EC.CFE   EQU    26B         CHANNEL FAILED TO GO EMPTY 
 EC.UHB   EQU    27B         UNIT HUNG BUSY 
 EC.STRY  EQU    30B         SUCCESSFUL RETRY 
 EC.CANA  EQU    31B         ACCESS TO CYLINDER NOT ALLOWED 
 EC.NIDT  EQU    33B         NO INACTIVE AFTER DATA TRANSFER
 EC.CPE   EQU    34B         CHANNEL PARITY ERROR ON 895 INPUT
 EC.NISD  EQU    35B         NO INACTIVE TO DMA STATUS
 EC.ISRD  EQU    36B         INCOMPLETE DMA STATUS RETURNED 
 EC.DCPE  EQU    37B         CHANNEL PARITY ERROR ON DMA OPERATION
 EC.ESS   EQU    40B         DMA ERROR STATUS SET 
  
  
  
*         DIRECT CELL EQUATES 
  
 RDWRF    EQU    60B         READ/WRITE FLAG
 FUN      EQU    62B         FUNCTION FOR READ/WRITE
 CL       EQU    63B         ADDRESS OF CURRENT (SECTOR) LENGTH  - V
 WC       EQU    64B         WORD COUNT FOR I/O 
 CC       EQU    65B         ADDRESS OF CURRENT CYLINDER         - W
 CT       EQU    66B         ADDRESS OF CURRENT TRACK            - X
 CS       EQU    67B         ADDRESS OF CURRENT SECTOR           - Y
  
 SEEKA    EQU    D.Z3        SEEK ADDRESS USES D.Z3 THRU D.Z7 
 PA       EQU    D.T0        PARAMETER ADDRESS
  
          EJECT 
*         EQUATES FOR EQUIPMENT FUNCTIONS.
  
 CONN     EQU    0           CONNECT
 SEK11    EQU    1           SEEK 1 TO 1 INTERLACE
 RD       EQU    4           READ FROM DISK 
 WR       EQU    5           WRITE TO DISK
 OC       EQU    10B         OPERATION COMPLETE 
 GS       EQU    12B         GENERAL STATUS 
 CONT     EQU    14B         CONTINUE 
 EDS      EQU    23B         DETAIL STATUS
 IPS      EQU    60B         INPUT PROCESSOR STAT FUNCTION
  
*         GENERAL STATUS BIT EQUATES. 
  
 BUSY     EQU    1           UNIT BUSY
 CMRES    EQU    3           CONTROL MODULE RESERVED
 RIP      EQU    8D          RECOVERY IN PROGRESS 
 UNR      EQU    9D          UNRECOVERABLE ERROR
  
*         EQUATES FOR DMA FUNCTIONS.
  
 MC       EQU    100B        MASTER CLEAR 
 CLTR     EQU    101B        CLEAR T REGISTER 
 DMAI     EQU    102B        START DMA OUTPUT 
 DMAO     EQU    103B        START DMA INPUT
 CLDMA    EQU    104B        CLEAR DMA MODE 
 CLTM     EQU    106B        CLEAR TEST MODE
 SETM     EQU    107B        SET TEST MODE
 RCR      EQU    110B        READ CONTROL REGISTER
 WCR      EQU    111B        WRITE CONTROL REGISTER 
 RER      EQU    112B        READ ERROR REGISTER
 ROSR     EQU    114B        READ OPERATION STATUS REGISTER 
 RTR      EQU    116B        READ T REGISTER
 WTR      EQU    117B        WRITE T REGISTER 
  
*         DEVICE CODES SUPPORTED
  
 D895     EQU    115B        DMA/895 DEVICE CODE
  
*         MISCELLANEOUS EQUATES.
  
 TIMBZ    EQU    72D         ITERATION TIME TO LOOP FOR 30 SEC
 TIMFJM   EQU    50000D/2     ITERATION TIME TO WAIT FOR FULL 50 MSEC 
 TIMREL   EQU    400000D/100D INTERVAL FOR CHANNEL RELEASE- 
 MAXITT   EQU    12D         ITERATION COUNT FOR ABOUT A 5 SEC.DELAY
 MAXCDD8  EQU    1565B       MAXIMUM CYLINDER ON 895
 PRECYL   EQU    2           NUMBER OF PREALLOCATED CYLINDERS 
  
 WRRD     EQU    502B        I/O WORD COUNT 
 CM60     EQU    1004B       T REGISTER BYTE COUNT FOR CM 60 BIT FORMAT 
 CM64     EQU    744B        T REGISTER BYTE COUNT FOR CM 64 BIT FORMAT 
*IF -DEF,MVE,3
 SYSWRCM  EQU    6B          SYS WRITE CM FUNCTION
 SYSRDCM  EQU    7B          SYS READ CM FUNCTION 
 SYSRWCM  EQU    10B         SYS REWIND CM FUNCTION 
*IF DEF,MVE,3 
 SYSWRCM  EQU    14B         SYS WRITE CM FUNCTION
 SYSRDCM  EQU    12B         SYS READ CM FUNCTION 
 SYSRWCM  EQU    13B         SYS REWIND CM FUNCTION 
  
  
*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 
 CH       EQU    37B         DEFAULT CHANNEL VALUE FOR I/O COMMANDS 
  
          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      TITLE  RFM - RELEASE FROM MLD/EQ. 
**        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   - DMA INTERFACE CLEARED AND RELEASE COMMAND 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    REL         RELEASE EQUIPMENT
          CON    RES         RESERVE ADAPTER, CONTRL MOD, AND DRIVE 
          CON    RDWR        READ, WRITE SECTOR OF DISK 
          CON    STATUS      GET GENERAL, DETAIL OR DMA STATUS
  
 REL      TITLE  REL - RELEASE EQUIPMENT. 
  
**        REL    - RELEASE EQUIPMENT IF CONNECTED.
* 
*                  REL, ABT Z 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - DEVICE CONNECT HAS BEEN RELEASED IF ASSIGNED, THE
*                  CHANNEL IS RELEASED TO THE SYSTEM AND THE DMA
*                  INTERFACE IS CLEAR.
* 
*         USES   - NONE.
* 
*         CALLS  - OPC- RELEASE EQUIPMENT IF CONNECTED. 
*                - BD.DCH- DROP CH/TALK TO SYSTEM AND EXEC. 
*                - CLRDMA- CLEAR DMA INTERFACE. 
  
**     1. DISCONNECT EQUIPMENT WITH AN OPERATION COMPLETE 
*         FUNCTION IF EITHER IS CONNECTED.
* 
**     2. CLEAR THE DMA INTERFACE.
* 
**     3. DROP THE I/O CHANNEL TO THE OPERATING SYSTEM IF ASSIGNED. 
* 
REL       RJM    OPC         RELEASE THE EQUIPMENT IF CONNECTED 
          RJM    CLRDMA+1    CLEAR DMA INTERFACE
          RJM    BD.DCH      DROP CHANNEL/TALK TO SYSTEM AND EXEC 
          LJM    XENT        EXIT TO STACK
  
 RES      TITLE  RES - RESERVE CONTROL MOD/DRIVE. 
  
**        RES    - RESERVE CONTROL MOD/DRIVE. 
* 
*                  RES DRIVE, ABT Z 
* 
*         ENTRY  - (PA) = 0 IF RES DRIVE
* 
*         EXIT   - I/O CHANNEL ASSIGNED, CHANNEL ASSIGNED FLAGS 
*                  SET IN ALL THE OTHER SUBROUTINES AND DMA 
*                  INTERFACE CLEARED. 
* 
*                  ERRCAS  - IF CHANNEL ACTIVE FROM SYSTEM
*                  ERRNRES - IF NOT RESERVED IN 5 MINUTES 
* 
*         USES   - EC, EA, EM, D.T3, D.T4, RESA, DRCON
* 
*         CALLS  - RES1, OPC, STC, DST, FNA, BD.RCH, CLRDMA 
  
**     1. CLEAR THE DMA INTERFACE.
* 
**     2. DISCONNECT CONTROL MOD WITH AN OPERATION COMPLETE 
*         FUNCTION IF CONNECTED.
* 
  
**     2. CLEAR ERROR EXIT REGISTERS. 
* 
 RES      LDN    0
          STD    EC          CLEAR ERROR REGISTERS
          STD    EA 
          STD    EM 
  
**     3. DROP/REQUEST I/O CHANNEL FROM THE SYSTEM. 
* 
 RES1     LDN    MAXITT      ITERATION COUNT FOR STATUS 
          STM    RESA        AND PAUSE LOOP 
 RES2     RJM    OPC         TO RELEASE THE CONTROL MOD IF SELECTED 
          LDN    0
          STM    OPC1        SET CONTROL MOD  NOT RESERVED
 RES3     SOM    RESA        DECREMENT THE ITERATION COUNT
          MJN    RES8A       IF TIMED OUT 
 RES4     RJM    BD.RCH      DROP/REQUEST CHANNEL AS REQUESTED
          RJM    IJM         WAIT CHANNEL ACTIVE
          AJM    RES20,CH    ERROR IF CHANNEL ACTIVE FROM SYSTEM
  
*      4. ISSUE CONNECT FUNCTION AND GET STATUS.
  
          LDC    TIMREL 
          STD    D.T3 
 RES5     LDC    **          UNIT NUMBER
 UN       EQU    *-1
          STD    D.T4        SAVE FOR FNO 
          LDN    CONN        LOAD CONNECT FUNCTION
          RJM    FNO         PERFORM FUNCT AND OUTPUT CONTROL WORD
          RJM    STS
  
*       5. IF BIT 2**3 IS SET, REPEAT STEP 4 UNTIL 500 MSEC HAS 
*          ELAPSED.  IF A RESERVE IS NOT SUCCESSFUL WITHIN THIS 
*          TIME-FRAME, EXECUTE THE  *REL * SEQUENCE TO COMMUNICATE
*          WITH THE SYSTEM.  REPEAT THIS STEP UNTIL A RESERVE IS
*          SUCCESSFUL OR 5 MINUTES HAVE ELAPSED.  ABORT IF NO 
*          RESERVE IN 5 MINUTES.
  
          SHN    14D
          PJN    RES8        IF CONTROL MOD CONNECTED 
 RES7     SOD    D.T3        DECREMENT LOOP COUNT 
          MJN    RES2        ELSE START ANOTHER ITERATION 
          UJN    RES5        IF NOT TIMED OUT 
  
  
*      6. VERIFY GEN STATUS IS 0000.
* 
  
 RES8     SHN    4
          ZJN    RES9        GENERAL STATUS EQUAL ZERO
          SCN    2
          ZJN    RES7        IF NO ERROR STATUS 
          LJM    ERRAGS      GET DETAILED STATUS AND EXIT 
  
 RES8A    LDC    ER.NRES     ELSE ERROR EXIT
 RES8B    LJM    ERR
  
 RES20    LDC    ER.CAS      ERROR CHANNEL ACTIVE FROM SYSTEM 
          UJN    RES8B
  
 RES9     RJM    DST         GET DETAILED STATUS
  
*       7. SET CONTROL MOD/DRIVE CONNECTED. 
  
 RES15    LDN    0
          STM    DRCON       SET DRIVE CONNECTED FLAG 
          LDN    2
          STM    OPC1 
          RJM    CLRDMA+1    CLEAR DMA INTERFACE
  
**        GET REAL MEMORY ADDRESS FOR SYSCM COMMANDS IN P. O. 
* 
*IF DEF,MVE 
          LDM    BD.DMAL     LOWER 16 BITS OF DMA WORD ADDRESS
          SHN    3
          STM    ADDL        DMA BYTE ADDRESS LOWER 12
          LDML   BD.DMAL
          SHN    -9 
          STM    ADDU 
          LDML   BD.DMAU     UPPER 16 BITS OF DMA WORD ADDRESS
          LPN    37B
          SHN    7
          RAM    ADDU        DMA BYTE ADDRESS MIDDLE 12 
          LDML   BD.DMAU
          SHN    -5 
          STM    ADDUU       DMA BYTE ADDRESS UPPER 12
          LDN    10B
          RAM    ADDL        BIAS PAST WORD 1 OF DMA BUFFER 
          SHN    -12
          ZJN    RES17       IF NO CARRY TO MIDDLE WORD 
          AOM    ADDU 
          SHN    -12
          ZJN    RES17       IF NO CARRY TO UPPER WORD
          AOM    ADDUU
 RES17    EQU    *
*ENDIF
*IF -DEF,MVE
          SRD    D.T6        GET R REGISTER CONTENTS
          LDD    D.RA 
          LPC    3777B       MASK R REG BIT 
          ADD    D.T7        ADD R REG
          STM    ADDL        SAVE TEMPORARILY 
          SHN    -12
          RAD    D.T6        SAVE OVERFLOW BIT
          LDM    ADDL        RESET THE A REG
          SHN    -6          MASK OFF LOWER 
          SHN    3           ADD 3 BITS OF ZEROS FOR BYTE ADDRESS 
          STM    ADDU        SAVE TEMPORARILY 
          LDM    ADDL 
          LPN    77B         RESET A
          SHN    6           MULTIPLY TIMES 100 
          ADM    BD.CMB      ADD IN CM BUFFER ADDRESS 
          SHN    3           ADD 3 BITS OF ZEROS FOR BYTE ADDRESS 
          STM    ADDL        STORE LOWER 12 BITS OF ADDRESS 
          SHN    -12
          RAM    ADDU        ADD OVERFLOW TO UPPER ADDRESS
          LDD    D.T6 
          SHN    -6          MASK OFF LOWER 
          SHN    3
          STM    ADDUU       SAVE TEMPORARILY 
          LDD    D.T6 
          LPN    77B         MASK OFF LOWER 
          SHN    9
          ADM    ADDU        ADD TO UPPER 12 BITS OF ADDRESS
          STM    ADDU        STORE NEXT 12 BITS OF ADDRESS
          SHN    -12
          RAM    ADDUU       SAVE LAST 12 BITS
*ENDIF
  
 RES18    LJM    XENT        EXIT TO STACK
  
  
          EJECT 
 RDWR     TITLE  RDWR - SEEK AND I/O THE REQUESTED SECTOR.
**        RDWR   - SEEK AND I/O THE REQUESTED SECTOR. 
* 
*                  READ SECTOR AT CYL W TRK X SEC Y, ABT Z
*                  READ SECTOR TO CM AT CYL W TRK X SEC Y, ABT Z
*                  RDSEC TO CM AT CYL W TRK X SEC Y, ABT Z
*                  WRITE SECTOR FROM CM AT CYL W TRK X SEC Y, ABT Z 
*                  WSEC FROM CM AT CYL W TRK X SEC Y, ABT Z 
* 
*         ENTRY  - (A)      = ABT ADDRESS 
*                  (PA)     = BIT 0    = READ/WRITE FLAG
*                             BITS 1-3 = FUNCTION CODE
* 
*                  (PA+65B) = W 
*                  (PA+66B) = X 
*                  (PA+67B) = Y 
* 
*         EXIT   - W, X, Y = LAST CYL, TRK, SEC.
* 
*                  ERRCPE  - IF CHANNEL PARITY ERROR ON 895 INPUT 
*                  ERRDNA  - IF ALL DATA NOT ACCEPTED FROM CM 
*                  ERRIAL  - IF ACCESS LEVEL TOO LOW FOR REQUEST
*                  ERRIDR  - IF INCOMPLETE DATA RETURNED TO PP OR CM
*                  ERRGSNR - IF GENERAL STATUS NOT RETURNED 
*                  ERRNIDT - IF NO INACTIVE AFTER DATA TRANSFER 
*                  ERRNIF  - IF NO INACTIVE TO LAST FUNCTION
*                  ERRNIGS - IF NO INACTIVE TO GENERAL STATUS 
*                  ERRSTRY - IF A SUCCESSFUL RETRY HAS OCCURRED 
*                  ERRCANA - IF CYLINDER ACCESS NOT ALLOWED 
* 
*         USES   - RDWRF,  COD,  FUN,  D.T1, D.T2, DB(0-51),(CL), 
*                  (CT), (CS), SBIE(SB(25-51)), D.Z0, D.Z1,  D.Z2,  WT, 
*                  IR(0-501,  OR(1-3)  RDW16,  RDW23+1,  RDW18,  RDW22, 
*                  RDW25, RDW47, RDW46
* 
* 
*         CALLS  - SEEK1, RDW, STS, DST 
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 RDWR     RJM    TDR         CALLER ENTRY POINT 
  
**     2. VALIDATE  ACCESS  TO  THE  CYLINDER  SPECIFIED  BY W AND
*         EXECUTE THE SEEK SEQUENCE TO MOVE THE DISK POSITIONER.
* 
          LDD    PA 
          LPN    1           SAVE READ/WRITE BIT
          STD    RDWRF       SET/CLEAR READ/WRITE FLAG
          NJN    RDW0A       WRITE FUNCTION 
          LDN    4           READ FUNCTION
          UJN    RDW0        STORE
  
 RDW0A    LDN    35B         WRITE FUNCTION 
 RDW0     STD    FUN         SAVE THE FUNCTION
          LDC    0303B
          STM    RDW16       INDICATE NO RETRY
          LDM    RDWAL,RDWRF LOAD THE ACCESS LEVEL REQUIRED 
          STD    D.T1 
          LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          ZJN    RDW2        IF IT IS A READ
 RDW1     LDC    0302B       FOR WRITE TYPE OPERATION FLAG
 RDW2     STM    RDW25       AND MODIFY REQUIRED LOCATIONS
  
 RDW3     LDN    RETRY-SB 
          STD    D.T2        NUMBER OF WORDS IN SB TO CLEAR 
 RDW4     LDN    0
          STM    SB,D.T2     CLEAR THE STATUS BUFFER
          SOD    D.T2 
          PJN    RDW4        IF NOT DONE
  
          LDC    MAXCDD8     MAX CYLINDER - 895 
          SBI    CC          CURRENT CYLINDER 
          ZJN    RDW6        IF USING MAX CYLINDER, OK
          LDC    ER.CANA     ELSE ERROR EXIT
 RDW5     LJM    ERR
  
 RDW6     LDD    BD.AL       LOAD AL FROM MLD 
          SBD    D.T1        MINUS OVERLAY AL (4) 
          PJN    RDW7        AL OK
          ADN    1
          PJN    RDW7        MINIMUM AL (3) 
          LDC    ER.IAL      ELSE ERROR EXIT
          UJN    RDW5 
  
 RDW7     RJM    SEEK1       TO SEEK TO DESIRED CYLINDER
          UJN    RDW20       ISSUE READ OR WRITE FUNCTION 
  
**     3. CHECK GENERAL STATUS.  IF ZERO, EXECUTE PROPER EXIT.
* 
 RDW14    LDM    SB 
          ZJN    RDW16       IF NO STATUS ERROR 
  
*         AN ERROR HAS OCCURRED 
  
 RDW15    LJM    RDW39       PROCESS ERROR
  
 RDW16    UJN    *+3         *** JUMP *+3 IF NO RETRY 
*         DATA   0           *** DATA 0 IF RETRY DONE 
          LJM    ERRSTRY     EXIT ON SUCCESSFUL RETRY 
  
          LDD    PA          CHECK IF DMA FUNCTION
          LPN    10B
          ZJN    RDW17       IF NOT DMA 
          LDM    TREG 
          SBM    STREG       CHECK IF ALL WORDS TRANFERRED
          UJN    RDW18       CHECK COUNT
 RDW17    LDD    WC          GET WORD COUNT 
          SBD    WT          SUBTRACT WORDS TRANSMITTED 
 RDW18    ZJN    RDW19       IF ALL WORDS TRANSMITTED 
          LJM    RDW36       IF ALL WORDS NOT TRANSMITTED 
  
 STREG    DATA   0           SAVE TREG COUNT
 RDW19    LJM    XENT        EXIT TO STACK
  
  
**     4. ISSUE A FUNCTION TO READ OR WRITE THE SECTOR
* 
 RDW20    LDD    FUN         LOAD THE FUNCTION
 RDW21    FAN    CH          SEND THE FUNCTION
          STD    LF          SAVE THE FUNCTION
  
 RDW23    IJM    DMAOP,CH    IF CHANNEL DEACTIVATED 
          ADN    1
          STD    WT          *INCREASE THE TIME LIMIT 
          STD    WT          *INCREASE THE TIME LIMIT 
          NJN    RDW23
          LJM    ERRNIF      ELSE ERROR EXIT
  
*    4A.  CHECK IF DMA OPERATION
*         PA = 14B (CM RD) OR 15B (CM WRITE)
* 
  
 DMAOP    LDD    PA 
          LPN    10B
          ZJN    RDW24       895/PP OPERATION 
          STM    BD.CHAIN    SET CHAINING FLAG FOR SYS/DMA OPERATIONS 
          LDD    RDWRF       LOAD READ/WRITE FLAG 
          LJM    DRW         FUNCTION DMA FOR INPUT OR OUTPUT 
  
**     5. INPUT OR OUTPUT THE NUMBER OF WORDS SPECIFIED BY WC TO/FROM 
*         THE PP INPUT/OUTPUT BUFFER. IF THE A REGISTER IS NON ZERO 
*         AFTER COMPLETION, GO TO STEP 7. 
* 
 RDW24    ACN    CH          ACTIVATE THE CHANNEL 
          LDD    WC          GET THE WORD COUNT 
          STD    WT          PRESET WT ASSUME GOOD READ OR WRITE
 RDW25    UJN    *+2         *** UJN *+2 FOR A WRITE TYPE FUNCTION
*         DATA   0           *** DATA  0 FOR A READ TYPE FUNCTION 
          UJN    RDW26       IF READ FUNCTION 
  
          OAM    OB,CH       OUTPUT THE DATA
          NJN    RDW27       IF WRITE ABORT 
 RDW25A   DCN    CH+40B      DISCONNECT THE CHANNEL 
          UJN    RDW30       TO STATUS
  
 RDW26    IAM    IB,CH       INPUT THE DATA 
          ZJN    RDW28       IF READ SUCCESSFUL 
 RDW27    LJM    RDW35       TO PROCESS THE ERROR 
 RDW28    IJM    RDW29,CH    IF CHANNEL DEACTIVATED PROPERLY
          ADN    1
          PJN    RDW28       IF NOT TIMED OUT 
          LJM    ERRNIDT     ELSE ERROR EXIT
 RDW29    SFM    ERCPE1,CH   CHECK FOR CH PARITY ERROR
          EJECT 
  
*      6. REQUEST  AND  INPUT  GENERAL  STATUS TO DETERMINE IF THE
*         OPERATION COMPLETED SUCCESSFULY.
*         GO TO STEP 3 AND  EXECUTE THE  ERROR  EXIT
*         SEQUENCE  IF  THE  RETRY  COUNT  IN THE STATUS BUFFER IS
*         NON-ZERO (THE READ OF THIS  SECTOR  HAS  BEEN  COMPLETED
*         SUCCESSFULLY  BUT  A  RETRY WAS REQUIRED, SO CONTROL  IS
*         RETURNED TO THE USER FOR  POSSIBLE  MESSAGE  REPORTING).
* 
 RDW30    FNC    GS,CH       FUNCTION FOR GENERAL STATUS
  
          RJM    IJM         WAIT CHANNEL INACTIVE
          NJN    RDW33
          LJM    ERRNIGS     ELSE ERROR EXIT
  
 RDW33    ACN    CH          ACTIVATE THE CHANNEL 
          LCN    0
          IAN    CH          AND INPUT TO A 
          STM    SB          SAVE STATUS
          IJM    RDW34E,CH   IF CHANNEL DEACTIVATED 
          LMC    7777B
          ZJN    RDW34       IF NO GENERAL STATUS RECEIVED
 RDW33A   IJM    RDW34E,CH   IF CHANNEL DEACTIVATED 
          ADN    1
          PJN    RDW33A      IF NOT TIMED OUT 
 RDW34    LJM    ERRGSNR     THE CHANNEL DIDNT DEACTIVATE 
  
 RDW34E   SFM    ERCPE2,CH   CHECK FOR CH PARITY ERROR
          LJM    RDW14
*                                                                   * 
*                                                                   * 
**     7. PROCESS FOR READ, WRITE ABORT BECAUSE THE A REGISTER IS NOT 
*         ZERO.  SAVE THE COUNT OF ACTUAL WORDS READ IN  LOCATION  WT 
*         AND EXIT. 
* 
 RDW35    STD    D.T1        SAVE THE REMAINING WORD COUNT
          LDD    WC          LOAD THE WORD COUNT
          SBD    D.T1        SUBTRACT THE REMAINDER 
          STD    WT          SAVE IT
 RDW35A   LDD    RDWRF       GET READ WRITE FLAG
          ZJN    RDW35B      IF A READ CHECK INACTIVE 
          LJM    RDW25A      IF A WRITE DCN CHANNEL 
  
 RDW35B   LJM    RDW28       IF A READ
 RDW36    LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    RDW37       IF IT IS A WRITE 
 RDW36A   LDC    ER.IDR      ERROR MSG
          UJN    RDW38
  
 RDW37    LDC    ER.DNA      ERROR MSG
 RDW38    LJM    ERRDST      GO GET DETAIL STATUS AND ERROR EXIT
  
**     8. REQUEST AND INPUT DETAIL STATUS.  EXECUTE THE ERROR EXIT
*         SEQUENCE IF BIT 2**9 IS SET IN GENERAL STATUS.
*         (NONRECOVERABLE ERROR). 
* 
 RDW39    RJM    DST         TO GET DETAILED STATUS 
          LDM    SB          GENERAL STATUS 
          SHN    17D-UNR
          PJN    RDW40       IF NOT A UNRECOVERED ERROR 
          UJN    RDW41       ELSE ERROR EXIT
  
**     9. IF BIT 2**8 IS CLEAR (NO RECOVERY IN PROGRESS) ENTER THE
*         ERROR EXIT SEQUENCE. (GENERAL STATUS AT  THIS  POINT  IS
*         STRANGE  SINCE  IT  IS NOT ZERO, BUT DOES NOT INDICATE A
*         RECOVERABLE OR NONRECOVERABLE ERROR). 
* 
 RDW40    SHN    17D-RIP-17D+UNR   TEST REC. IN PROGRESS
          MJN    RDW50       IF RECOVERY IN PROGRESS
 RDW41    LDC    ER.AGS 
          UJN    RDW44       JUMP TO ERR EXIT 
  
 ERRSTRY  EQU    *
 RDW43    LDC    ER.STRY     INDICATE SUCCESSFUL RETRY ERROR
 RDW44    LJM    ERR         ERROR EXIT 
  
**    10. IF BIT 2**8  IS SET (RECOVERY IN PROGRESS), DETERMINE IF
*         THE RETRY COUNT IN THE STATUS BUFFER IS ZERO (FIRST TIME
*         FAILURE).  IF SO, REQUEST AND INPUT  DETAIL  STATUS  AND
*         STORE  IT  AND GENERAL STATUS INTO WORDS 25B THRU 51B OF
*         THE STATUS BUFFER TO CAPTURE THE  ORIGINAL  STATUS  THAT
*         CAUSED  RECOVERY  TO  BE  PERFORMED.   ISSUE  A CONTINUE
*         FUNCTION  (0014), BUMP  THE  RETRY  COUNTER  IN  THE  PP
*         STATUS BUFFER AND GO TO STEP 4 TO PERFORM A RETRY OF THE
*         READ. 
* 
 RDW50    LDM    RETRY
          NJN    RDW52       IF NOT THE FIRST ERROR RETRY 
          STM    RDW16       INDICATE A RETRY TO CRITICAL TIMING LOOP 
          LDN    25B         ELSE MOVE THE INITIAL ERROR TO SBIE
          STD    D.T1 
 RDW51    LDM    SB,D.T1     LOAD A WORD
          STM    SBIE,D.T1   STORE A WORD 
          SOD    D.T1        DECREMENT THE COUNT
          PJN    RDW51       IF NOT DONE MOVING WORDS 
 RDW52    AOM    RETRY       INCREMENT THE RETRY COUNT
          SBN    28D
          PJN    RDW43       IF GT 27D RETRIES
          LDN    CONT        FOR THE CONTINUE FUNCTION
          LJM    RDW21       INPUT AFTER CONTINUE FUNCTION
  
*         THE FOLLOWING FUNCTION TABLE MUST BE KEPT IN ORDER. 
  
 RDWAL    CON    ARD      ACCESS LEVEL FOR READ ANYWHERE
          CON    ARW      ACCESS LEVEL FOR WRITE ANYWHERE 
          EJECT 
 SEEK     TITLE  SEEK - SEEK TO THE ADDRESS SPECIFIED.
**        SEEK   - SEEK TO THE ADDRESS SPECIFIED. 
* 
*                  SEEK CYL W TRK X SEC Y, ABT Z
* 
*         ENTRY  - (A)      = ABT ADDRESS 
*                  (PA+65B) = W 
*                  (PA+66B) = X 
*                  (PA+67B) = Y 
* 
*         EXIT   - SEEK COMPLETED TO NEW ADDRESS
* 
*                  ERRAGS  - IF ABNORMAL GENERAL STATUS 
*                  ERRCNC  - IF CONTROLLER/DRIVE NOT CONNECTED
*                  ERRCPE  - IF CHANNEL PARITY ERROR ON INPUT 
*                  ERRFPNA - IF FUNCTION PARAMETERS NOT ACCEPTED
*                  ERRUHB  - IF THE UNIT IS BUSY FOR OVER 200 MSEC
* 
*         USES   - P, SEEKA(0-4), SBIE, D.T1, D.T2
* 
*         CALLS  - TDR, STS, FNC, DST 
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 SEEK1X   LJM    **          ENTRY/EXIT 
 SEEK1    EQU    *-1
          LDN    0           PROVIDES SEEK TIME BIASED BY MINUS ONE 
          STD    SEEKA       PRESET CURRENT SEEK TIME 
          RJM    STS         TO GET STATUS
          SHN    17D-CMRES
          MJN    SEEK2       IF CONTROL UNIT BUSY 
          SHN    2
          PJN    SEEK3       IF DRIVE NOT BUSY
 SEEK2    LJM    ERRCNC      ELSE IT IS AN ERROR
  
**     2. PRESET SEEK FUNCTION DATA 
* 
 SEEK3    LDM    UN          UNIT NUMBER
          STD    SEEKA+1
          LDI    CC          CURRENT CYLINDER 
          STD    SEEKA+2
          LDI    CT          CURRENT TRACK
          STD    SEEKA+3
          LDI    CS          CURRENT SECTOR 
          STD    SEEKA+4
  
**     3. ISSUE A 1/1 SEEK FUNCTION (0001). 
* 
          IANN   14B         INPUT THE REAL TIME CLOCK
          STD    D.T1 
 SEEK5    LDN    SEK11
          RJM    FNC         TO SEND A FUNCTION 
  
**     4. OUTPUT 4 SEEK PARAMETER WORDS AND STORE THE NUMBER OF WORDS 
*         ACTUALLY OUTPUT INTO THE WT REGISTER. VERIFY THAT 4 WORDS 
*         WERE ACTUALLY TRANSMITTED.
* 
          LDN    4           WORD COUNT 
          ACN    CH          ACTIVATE THE CHANNEL 
          OAM    SEEKA+1,CH  OUTPUT THE SEEK DATA 
          ZJN    SEEK6       IF OUTPUT COMPLETE 
          LJM    ERRFPNA     ELSE ERROR EXIT
 SEEK6    RJM    EJM         WAIT FOR CHANNEL TO GO EMPTY 
          DCN    CH+40B      DEACTIVATE THE CHANNEL 
  
**     5. REQUEST AND INPUT GENERAL STATUS. 
* 
 SEEK7    RJM    STS         TO OBTAIN STATUS 
  
**     6. GO TO STEP 3 IF CONTROL UNIT OR DRIVE IS STILL BUSY AND 200 MSEC HAS
*         NOT ELAPSED (ABORT WHEN TIME ELAPSES).
* 
          SHN    17D-CMRES   TEST FOR CONTROL UNIT BUSY 
          MJN    SEEK7A      IF BUSY JUMP WAIT AND TRY AGAIN
          SHN    CMRES-BUSY  TEST FOR DRIVE BUSY
          PJN    SEEK11      IF NOT BUSY JUMP 
 SEEK7A   LDC    1000D       WAIT AND TRY AGAIN 
          RAD    D.T1 
 SEEK8    IANN   14B         CHECK CLOCK AGAIN
          STD    D.T2 
          LDD    D.T1 
          SBD    D.T2 
          ZJN    SEEK9       IF TIMING LOOP IS COMPLETE 
          SHN    17D-11D     TO ELIMINATE CLK WRAPE AROUND
          PJN    SEEK8       IF NOT TIMED OUT 
 SEEK9    AOD    SEEKA       INCREMENT ITERATION COUNT IF TIMED OUT 
          LMC    200000D/1000D COUNT LIMIT FOR BUSY 
          ZJN    SEEK10      IF BUSY TIMED OUT
          LJM    SEEK5       IF BUSY NOT TIMED OUT
  
 SEEK10   LDC    ER.UHB      AND ERROR EXIT 
 ERRDST   STD    D.T2 
          LDD    PA          LOAD OP CODE 
          LPN    10B
          ZJN    NOTDMA      NOT DMA MODE 
          RJM    STS         GET GENERAL STATUS 
          ZJN    NOSTAT      DO NOT GET DETAIL STATUS 
 NOTDMA   RJM    DST         GET DETAIL STATUS
 NOSTAT   LDD    D.T2 
          LJM    ERR
  
**     7. STORE THE NUMBER OF MILLISECONDS REQUIRED TO COMPLETE THE 
*         SEEK INTO SB(60). 
* 
 SEEK11   LDD    SEEKA       MOVE THE SEEK TIME 
          ZJN    SEEK12      IF READY WITHOUT ANY MOVE
          SBN    1           ADJUST THE SEEK TIME 
 SEEK12   STM    SEEKTIM     THIS IS MILLISEC. COUNT REQUIRED FOR SEEK
          SHN    -1 
          RAD    RT          INCREMENT I/O LIMIT
  
**     8. IF GENERAL STATUS IS ZERO, EXIT.  OTHERWISE, REQUEST AND
*         INPUT DETAIL STATUS AND EXECUTE THE ERROR EXIT SEQUENCE.
* 
          LDM    SB 
          ZJN    SEEK14      IF ZERO AFTER NOT BUSY 
 ERRAGS   LDC    ER.AGS      AND ERROR EXIT 
 SEEK13   UJN    ERRDST 
 SEEK14   LJM    SEEK1X      TO EXIT
  
 DRW      TITLE  DRW - FUNCTION DMA FOR READ OR WRITE.
**        DRW   - FUNCTION DMA FOR READ OR WRITE. 
* 
* 
*         ENTRY  - (A) = CODE FOR DMA SEQUENCE
*                  (0) = READ TO CM  (DMA INPUT)
*                  (1) = WRITE FROM CM  (DMA OUTPUT)
* 
*         EXIT   - DATA READ TO CM AND TRANSFERED TO IB, OR DATA
*                  TRANSFERED FROM OB TO CM AND WRITTEN FROM CM.
* 
*         USES     D.T1, D.T2, D.T6, D.T7 
* 
*         CALLS -  FNC, DMAP, FNO, ESTS, CLRDMA,
*                  BD.XSYS
  
**     1. SET UP FOR DMA IO.
* 
 DRW      ZJN    DRW0        DMA READ 
          LDN    SYSRWCM     SYS REWIND CM FUNCTION 
          RJM    BD.XSYS     REWIND 
*IF DEF,MVE,1 
          RJM    SYSM+1      SET 60 BIT SYS OPERATION 
          LDN    SYSWRCM     SYS WRITE CM FUNCTION
          RJM    BD.XSYS     WRITE OB TO CM 
*IF DEF,MVE,1 
          RJM    SYSM+1      SET 64 BIT SYS OPERATION 
  
 DRW0     LDC    WCR         WRITE CONTROL REGISTER FUNCTION
          RJM    FNC         FUNCTION DMA 
  
          LDM    P4          LOAD P4 PARAM
          ZJN    DRW1        60 BIT CM FORMAT 
          LDC    100400B     64 BIT CM+INV CACHE+DISABLE 170 ERR FLAG 
          UJN    DRW2A
 DRW1     LDC    120400B     60 BIT CM+INV CACHE+DISABLE 170 ERR FLAG 
  
**        OUTPUT CONTROL REG WORD 
* 
 DRW2A    ACN    CH+40B      ACTIVATE CHANNEL 
          RJM    DMAP+1      OUTPUT CONTROL REG WORD
          DCN    CH+40B      DEACTIVATE CHANNEL 
  
  
**        OUTPUT BYTE COUNT AND CM ADDRESS TO DMA ADAPTER 
* 
          LDC    WTR         WRITE T REGISTERS FUNCTION 
          RJM    FNC         FUNCTION DMA 
  
          LDM    P4          LOAD CM WORD FORMAT
          NJN    DRW3        64 BIT CM FORMAT 
          LDC    CM60        LOAD T REG BYTE COUNT
          UJN    DRW4 
 DRW3     LDC    CM64        LOAD T REG BYTE COUNT
 DRW4     STM    TREG        PRESET AND ASSUME GOOD DMA TRANSFER
          STM    STREG       SAVE FOR TRANSFER CHECK UPON RECOVERY
  
          ACN    CH+40B      ACTIVATE CHANNEL 
          RJM    DMAP+1      OUTPUT BYTE COUNT TO DMA 
  
          LDM    ADDU        LOAD CM ADDRESS BITS 12-23 
          LPC    7760B       MASK OFF BITS 12-15
          SHN    6
          ADM    ADDUU       ADD UPPER CM BITS
          SHN    8           SHIFT TO CM ADDRESS BITS 24-29 
          RJM    DMAP+1      OUTPUT UPPER CM ADDRESS BITS 16-29 
  
          LDM    ADDU        LOAD CM ADDRESS BITS 12-23 
          LPN    17B         MASK OFF BITS 12-23
          SHN    12 
          ADM    ADDL        ADD CM BITS 0-11 
          RJM    DMAP+1      OUTPUT LOWER CM ADDRESS BITS 0-15
  
          DCN    CH+40B      DEACTIVATE CHANNEL 
          LDD    WC          GET WORD COUNT 
          STD    WT          SET WT 
          LDN    0
          STD    D.T1        CLEAR COUNTER FOR T REG CHECK
          LDD    RDWRF       LOAD READ/WRITE FUNCTION 
          ZJN    DRW5A       DMA INPUT
  
**        DMA OUTPUT
* 
 DRW5     LDC    DMAO        LOAD DMA OUTPUT FUNCTION 
          UJN    DRW5B
  
**        DMA INPUT 
* 
 DRW5A    LDC    DMAI        LOAD DMA INPUT FUNCTION
 DRW5B    RJM    FNC         FUNCTION DMA 
  
 DRW5C    LDC    RTR         LOAD DMA READ T REG FUNCTION 
          RJM    FNC         FUNCTION DMA 
  
**        READ T REG (BYTE COUNT) 
* 
          ACN    CH+40B      ACTIVATE CH
          LDN    1           SET A
          IAN    CH          INPUT T REG (BYTE COUNT) 
          STD    D.T2        SAVE 
          DCN    CH+40B      DEACTIVATE CHANNEL 
          ZJN    DRW6        DATA TRANSFERED OK 
          LDD    D.T1        LOAD OLD T REG COUNT 
          SBD    D.T2        MINUS NEW T REG COUNT
          ZJN    DRW5D       T REG NOT DECREMENTING 
          LDD    D.T2        LOAD PRESENT T REG COUNT 
          STD    D.T1        STORE TO OLD T REG COUNT 
          UJN    DRW5C       CONTINUE 
  
**        T REG ERROR 
* 
 DRW5D    LDM    TREG        LOAD EXPECTED BYTE COUNT 
          SBD    D.T2        MINUS LAST T REG COUNT 
          STM    TREG        ACTUAL BYTE COUNT
          RJM    CLRDMA+1    CLEAR DMA INTERFACE
          LJM    RDW35A      DATA TRANFER ERRORS CHECK STATUS 
  
 DRW6     LDC    ROSR        READ OPERATIONAL STATUS REGISTER 
          RJM    DSTS+1 
          LDM    OPERSTL
          LPN    1
          ZJN    DRW6C       IF TRANSFER NOT IN PROGRESS
 DRW8     RJM    CLRINT+1    CLEAR THE DMA INTERFACE AND NO STATUS
  
          LDC    ER.ESS      DMA STATUS ERROR 
 DRW9     LJM    ERRDST      GO GET DETAIL STATUS AND ERROR EXIT
  
 DRW6C    LDC    CLDMA       TERMINATE DMA MODE 
          RJM    FNC         TERMINATE DMA SEQ
          SFM    DRW2,CH     CHANNEL FLAG SET 
          LDD    RDWRF       LOAD READ WRITE FUNCTION 
          ZJN    DRW8B       WRITE CM TO IB (DMA INPUT) 
 DRW7     RJM    ESTS+1      READ DMA ERROR/OPERATION STATUS
          LDM    ERRSTU      LOAD UPPER ERROR STATUS
          NJN    DRW8        STATUS SET 
          LDM    ERRSTL      LOAD LOWER ERROR STATUS
          NJN    DRW8        STATUS SET 
          RJM    CLRDMA+1    CLEAR DMA INTERFACE
          LJM    RDW30       FINISH READ/WRITE ROUTINE
  
 DRW2     RJM    CLRDMA+1    CLEAR DMA INTERFACE
 DRW2B    LDC    ER.DCPE     DMA CHANNEL PARITY ERROR MSG 
          UJN    DRW9        GET DETAIL STATUS AND ERROR EXIT 
 DRW8B    LDN    SYSRWCM     SYS REWIND CM FUNCTION 
          RJM    BD.XSYS     REWIND 
          LDN    D.T7        LOAD ADDRESS OF D.T7 
          STD    PA          USED BY SYS RD ROUTINE 
*IF DEF,MVE,1 
          RJM    SYSM+1      SET 60 BIT SYS OPERATION 
          LDN    SYSRDCM     SYS READ CM FUNCTION 
          RJM    BD.XSYS     WRITE CM TO IB 
*IF DEF,MVE,1 
          RJM    SYSM+1      SET 64 BIT SYS OPERATION 
          UJN    DRW7 
  
  
 ADDUU    BSS    1
 ADDU     BSS    1
 ADDL     BSS    1
*IF DEF,MVE 
  
 SYSMODE  TITLE  SYSM - TOGGLE BETWEEN 60/64 BIT SYS OPERATIONS 
  
**        SYSM   -  TOGGLES CM INSTRUCTIONS FROM 60 TO 64 BIT OR
*                   FROM 64 TO 60 BIT DEPENDING ON CURRENT STATE
*                   OF THE INSTRUCTION WHEN THIS ROUTINE IS EXECUTED
* 
*         ENTRY  - (A) = N/A
* 
*         EXIT   - BD.SYSWR MODIFIED
*                  BD.SYSRD MODIFIED
* 
*         USES   - BD.SYSRD, BD.SYSWR 
* 
*         CALLS  - NODE 
* 
* 
 SYSM     LJM    *           ENTRY/EXIT 
          LDML   BD.SYSRD 
          ADC    100000B     TOGGLE LONG BIT IN INSTRUCTION 
          STML   BD.SYSRD 
          LDML   BD.SYSWR 
          ADC    100000B     TOGGLE LONG BIT IN INSTRUCTION 
          STML   BD.SYSWR 
          LDM    BD.DIV 
          LMN    1           TOGGLE BIT 0 
          STM    BD.DIV 
          UJN    SYSM        EXIT 
*ENDIF
  
 DMAP     TITLE  DMAP - ISUE PARAMETER WORDS FOR WRITE T FUNCTION.
  
**        DMAP   - ISSUE PARAMETER WORDS FOR SELECTED FUNCTION. 
* 
*         ENTRY  - (A) = DATA WORD TO OUTPUT
* 
*         EXIT   - ERRCFE - IF CHANNEL DOES NOT GO EMPTY
*                  ERRDCE - IF DMA CHANNEL ERROR
* 
*         USES   - NONE 
* 
*         CALLS  - ESTS, DRW2 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 40 MICROSEC.
* 
 DMAP     LJM    *           ENTRY/EXIT 
          OAN    CH 
          LDN    0
 DMAP1    EJM    DMAP2,CH 
          ADN    1
          PJN    DMAP1       LOOP ON CHANNEL EMPTY TEST 
          RJM    ESTS+1      GET DMA ERROR AND OPERATION STATUS 
          LJM    ERRCFE      ERROR EXIT IF CH DIDNT GO EMPTY
  
 DMAP2    SFM    DRW2,CH     ERROR FLAG SET 
          UJN    DMAP        EXIT 
  
 ESTS     TITLE  ESTS - READ DMA ERROR/OPER STATUS REG. 
  
**        ESTS   - READ DMA ERROR/OPER STATUS REG.
* 
*         ENTRY  - NONE.
* 
*         EXIT   - DMA ERROR AND OPERATION REGISTER IN SB.
* 
*         USES   - NA 
* 
*         CALLS  - DSTS 
* 
* 
 ESTS     LJM    *           ENTRY/EXIT 
          LCN    0
          STM    ERRSTU      NEG ZERO TO SB 
          STM    ERRSTL      NEG ZERO TO SB 
          STM    OPERSTU     NEG ZERO TO SB 
          STM    OPERSTL     NEG ZERO TO SB 
          LDC    RER         READ ERROR STATUS FUNCTION 
          RJM    DSTS+1      GET ERROR STATUS 
          LDC    ROSR        READ OPERATION STATUS FUNCTION 
          RJM    DSTS+1      GET OPERATIONAL STATUS 
          UJN    ESTS        EXIT 
  
 STATUS   TITLE  STATUS - GET GENERAL, DETAIL OR DMA STATUS.
**        STATUS - GET GENERAL, DETAIL OR DMA STATUS. 
* 
*                  STATUS GENERAL, ABT Z
*                  STATUS DETAIL, ABT Z 
*                  STATUS ERROR, ABT Z
*                  STATUS OPERATION, ABT Z
* 
*          GENERAL   - INPUT 1 WORD OF GENERAL STATUS TO  SB(0).
*          DETAIL    - INPUT 20D WORDS OF DETAIL STATUS TO SB(1-24B). 
*          ERROR     - INPUT 2 WORDS OF ERROR STATUS TO SB(56B,57B).
*          OPERATION - INPUT 2 WORDS OF OPERATION STATUS TO SB(64B,65B).
  
* 
*         ENTRY  - (PA) = CODE)         0 = GENERAL 
*                                       1 = DETAIL
*                                       2 = ERROR 
*                                       3 = OPERATION 
* 
*         EXIT   - (A)  = GENERAL STATUS (IF GENERAL IS SELECTED) 
*                - (A)  = ERROR STATUS (IF ERROR STATUS IS SELECTED)
*                - (A)  = OPERATION STATUS (IF OPERATION STATUS IS SELECTED)
*                - (SB), OR (SB 0-24) = GENERAL OR DETAIL.
*                - (SB 56,57) = DMA ERROR STATUS IF SELECTED. 
*                - (SB 64,65) = DMA OPERATION STATUS IF SELECTED. 
* 
*                  ERRISR - ERROR EXIT IF INCOMPLETE STATUS RETURNED
* 
*         USES   - LF, P, D.T1, SB, WT
* 
*         CALLS  - ERA, TCC, STS, DST, FNC, FJM, IJM, ESTS, OSTS
* 
  
**     1. STORE 7777B INTO THE STATUS BUFFER FOR WORDS ABOUT TO BE
*         RETURNED. 
* 
**     2. VERIFY THAT THE CONTROL MODULE IS CONNECTED.
* 
 STATUS   RJM    TCC         TEST CONTROL MODULE CONNECTED
          STD    WT          CLEAR WT REGISTER
  
**     3. ISSUE THE SELECTED STATUS FUNCTION SPECIFIED BY THE KEYWORD 
*         GENERAL (0012), DETAIL (0023).
* 
*      4. INPUT THE REQUIRED NUMBER OF WORDS TO THE STATUS BUFFER 
*         (1, 2 OR 24B).
* 
          LDD    PA          LOAD CODE
          NJN    STATUS3     IF OTHER STATUS REQUEST
          LDN    GS 
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          RJM    STS         GET GENERAL STATUS 
          UJN    STATUS4
  
 STATUS3  SBN    1
          NJN    STATUS5     IF NOT STATUS DETAIL 
          LDN    EDS
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          RJM    DST         GET DETAIL STATUS
 STATUS4  LJM    XENT        EXIT TO STACK
  
*         5.  INPUT ERROR OR OPERATION STATUS.
  
 STATUS5  SBN    1
          NJN    STATUS6     IF NOT DMA ERROR STATUS
 STATUS5A LCN    0
          STM    ERRSTU      NEG ZERO TO SB 
          STM    ERRSTL      NEG ZERO TO SB 
          LDC    RER         READ ERROR STATUS FUNCTION 
 STATUS5B RJM    DSTS+1      GET ERROR STATUS 
          UJN    STATUS4     EXIT 
  
 STATUS6  LCN    0
          STM    OPERSTU     NEG ZERO TO SB 
          STM    OPERSTL     NEG ZERO TO SB 
          LDC    ROSR        READ OPERATION STATUS FUNCTION 
          UJN    STATUS5B    GET OPERATION STATUS 
  
 ERRNIDT  LDC    ER.NIDT     ERROR NO INACTIVE AFTER DATA XFER
          UJN    DST3 
  
  
 DST      TITLE  DST - OBTAIN DETAIL STATUS.
  
**        DST    - OBTAIN DETAIL STATUS.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - STATUS BUFFER CONTAINS THE CURRENT DETAIL STATUS.
*                  TO BE USED FOR ERROR CHECKING. 
* 
*                - (A) = (SB+13D) 
* 
*                  ERRCPE  - IF CHANNEL PARITY ERROR ON INPUT 
*                  ERRISR  - IF INCOMPLETE STATUS RETURNED
*                  ERRNIDS - IF NO INACTIVE TO DETAIL STATUS
* 
*         USES   - D.T1, SB(1-24) 
* 
*         CALLS  - FNA, FJM, IJM
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 247+ MICROSEC.
* 
 DST0     LJM    **          ENTRY/EXIT 
 DST      EQU    *-1
  
**        1.  STORE 7777B INTO ALL WORDS
* 
          LDN    24B
          STD    D.T1 
 DST1     LCN    0
          STM    SB,D.T1
          SOD    D.T1 
          NJN    DST1        DO ALL WORDS 
  
**        2. ISSUE DETAIL EXTENDED STATUS FUNCTION. 
* 
          LDN    EDS
          RJM    FNA         ISSUE STATUS FUNCTION
          NJN    DST5        IF FUNCTION ACCEPTED 
          LDC    ER.NIDS     ERROR IF NO INACTIVE TO DETAIL STATUS
 DST3     UJN    DST7 
  
**        3. INPUT STATUS AND RETURN. 
* 
 DST5     ACN    CH+40B 
          LDN    24B
          IAM    SB+1,CH
          NJN    ERRISR      IF ALL WORDS NOT INPUT 
          RJM    IJM         VERIFY INACTIVE IS RECEIVED
          ZJN    ERRNIDT     IF NO INACTIVE RECEIVED
          SFM    ERCPE3,CH   CHECK FOR CH PARITY ERROR
          UJN    DST0        IF OK EXIT 
  
 ERRISR   LDC    ER.ISR      ERROR INCOMPLETE STATUS RETURNED 
 DST7     UJN    EJM2 
  
 EJM      TITLE  EJM - WAIT FOR CHANNEL TO GO EMPTY.
  
**        EJM     - WAIT FOR CHANNEL TO GO EMPTY
* 
*          ENTRY   - NONE.
* 
* 
*          EXIT    - ER.CFE - IF CHANNEL FAILED TO GO EMPTY.
* 
*          USES    - NONE.
* 
*          CALLS   - NONE.
  
  
 EJMX     LJM    **          SUBROUTINE ENTRY/EXIT
 EJM      EQU    *-1
 EJM1     EJM    EJMX,CH     JUMP IF CHANNEL EMPTY
          ADN    1           UPDATE LOOP COUNT
          PJN    EJM1        LOOP ON CHANNEL EMPTY TEST 
 ERRCFE   LDC    ER.CFE      ERROR CHANNEL FAILED TO GO EMPTY 
 EJM2     UJN    FNC1        ERROR EXIT 
  
 FJM      TITLE  FJM - WAIT FOR CHANNEL TO GO FULL. 
**        FJM    - WAIT FOR CHANNEL TO GO FULL. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) NONZERO IF NOT TIMED OUT WAITING FULL
*                  (A) ZERO IF TIMED OUT
* 
*         USES   - D.T1 
* 
*         CALLS  - NONE 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 6 MICROSEC. 
* 
 FJMX     LJM    **          ENTRY/EXIT 
 FJM      EQU    *-1
          LDC    TIMFJM*2    ITERATION TIME 
 FJM1     FJM    FJMX,CH     IF FULL EXIT 
 FJM2     SBN    4           *** SBN 4 IF 1X SPEED PPU ***
*         SBN    2           *** SBN 2 IF 2X SPEED PPU ***
*         SBN    1           *** SBN 1 IF 4X SPEED PPU ***
          NJN    FJM1        IF TIME NOT COUNTED DOWN 
          UJN    FJMX        ELSE EXIT WITH A EQ. ZERO
  
 FNC      TITLE  FNC - ISSUE A FUNCTION ON A CHANNEL AND WAIT INAC. 
  
**        FNC    - ISSUE A FUNCTION ON A CHANNEL AND WAIT INACTIVE. 
* 
*         ENTRY  - (A) = FUNCTION TO ISSUE
* 
*         EXIT   - (A) = NONZERO IF FUNCTION ACCEPTED.
* 
*                  ERRNIF  - IF NO INACTIVE TO FUNCTION 
* 
*         USES   - LF 
* 
*         CALLS  - FNA
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 22 MICROSEC.
* 
 FNCX     LJM    **          ENTRY/EXIT 
 FNC      EQU    *-1
          STD    LF          TO SAVE LAST MAJOR FUNCTION
          SHN    11 
          MJN    FNC2        DMA FUNCTION 
          LDD    LF          LOAD FUNCTION
 FNC0     RJM    FNA         TO FUNCTION AND WAIT INACTIVE
          NJN    FNCX        IF INACTIVE EXIT 
 ERRNIF   LDC    ER.NIF      ERROR NO INACTIVE TO FUNCTION
 FNC1     LJM    ERR         ERROR EXIT 
 FNC2     LDD    LF          LOAD FUNCTION
          SHN    9           SHIFT FOR DMA USE
          UJN    FNC0 
          SPACE  4,17 
**        FNA    - ISSUE A FUNCTION AND WAIT INACTIVE.
* 
*         ENTRY  - (A) = FUNCTION TO ISSUE
* 
*         EXIT   - (A) = NONZERO IF FUNCTION ACCEPTED 
* 
*         USES   - NONE 
* 
*         CALLS  - IJM
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 14 MICROSEC.
* 
 FNAX     LJM    **          ENTRY/EXIT 
 FNA      EQU    *-1
          FAN    CH+40B      FUNCTION FROM A
          RJM    IJM         WAIT FOR INACTIVE
          UJN    FNAX        EXIT 
  
 CLRDMA   TITLE  CLRDMA - CLEAR THE DMA INTERFACE.
  
**        CLRDMA - CLR THE DMA INTERFACE. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - DMA INTERFACE CLEARED. 
* 
*         CALLS  - FNC, ESTS
* 
* 
 CLRDMA   LJM    *           ENTRY/EXIT 
  
          LDN    0
          STM    BD.CHAIN    CLEAR THE CHAINING FLAG
          LDM    BD.CHFG
          ZJN    CLRDMA      IF THE CHANNEL NOT ASSIGNED EXIT 
          RJM    ESTS+1      GET DMA ERROR AND OPER STATUS
          LDC    CLDMA       LOAD CLEAR DMA FUNCTION
          RJM    FNC         CLEAR DMA INTERFACE
  
          LDC    CLTR        LOAD CLEAR T REGISTER FUNCTION 
          RJM    FNC         CLEAR T REGISTER 
  
          LDC    WCR         WRITE CONTROL REGISTER FUNCTION
          RJM    FNC         FUNCTION DMA 
  
          LDN    0           CLEAR CONTROL REGISTER 
  
**        OUTPUT CONTROL REG WORD 
* 
          ACN    CH+40B      ACTIVATE CHANNEL 
          RJM    DMAP+1      OUTPUT CONTROL REG WORD
          DCN    CH+40B      DEACTIVATE CHANNEL 
          UJN    CLRDMA      EXIT 
  
 FNO      TITLE  FNO - ISUE FUNCTION AND OUTPUT ONE WORD OF DATA. 
  
**        FNO    - ISSUE FUNCTION AND OUTPUT ONE WORD OF DATA.
* 
*         ENTRY  - (A)  = FUNCTION DESIRED
*                  D.T4 = DATA WORD TO OUTPUT 
* 
*         EXIT   - ERRFPNA - IF FUNCTION PARAMETER NOT ACCEPTED 
* 
*         USES   - NONE 
* 
*         CALLS  - FNC
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 40 MICROSEC.
* 
 FNOX     LJM    **          ENTRY/EXIT 
 FNO      EQU    *-1
          RJM    FNC         TO SEND FUNCTION 
          ACN    CH+40B      ACTIVATE THE CHANNEL 
          LDN    1
          OAM    D.T4,CH
          ZJN    FNO2        IF PARAMETER WAS ACCEPTED
 ERRFPNA  LDC    ER.FPNA     ELSE ERROR EXIT
          LJM    ERR
  
 FNO2     EJM    FNO3,CH
          ADN    1
          PJN    FNO2        LOOP ON CHANNEL EMPTY TEST 
          LJM    ERRCFE      ERROR  EXIT IT CH DIDNT GO EMPTY 
  
 FNO3     DCN    CH+40B 
          UJN    FNOX        EXIT 
  
 IJM      TITLE  IJM - WAIT INACTIVE AND TIME OUT.
  
**        IJM    - WAIT INACTIVE AND TIME OUT.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = NONZERO IF FUNCTION ACCEPTED 
*                        ZERO IF FUNCTION NOT ACCEPTED
* 
*         USES   - NONE 
* 
*         CALLS  - NONE 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 6 MICROSEC. 
* 
 IJMX     LJM    **          ENTRY/EXIT 
 IJM      EQU    *-1
          LCN    3
 IJM1     IJM    IJMX,CH     IF INACTIVE EXIT 
 IJM2     SBN    4           *** SBN 4 IF 1X SPEED PPU ***
*         SBN    2           *** SBN 2 IF 2X SPEED PPU ***
*         SBN    1           *** SBN 1 IF 4X SPEED PPU ***
          NJN    IJM1        IF NOT COUNTED DOWN
          UJN    IJMX        ELSE EXIT W/(A) = ZERO 
  
 OPC      TITLE  OPC - RELEASE EQUIP WITH OP COMPLETE.
  
**        OPC    - RELEASE THE EQUIPMENT WITH AN OPERATION COMPLETE.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = ZERO IF ADAPTER NOT CONNECTED
*                      = NONZERO IF OPERATION COMPLETE ACCEPTED 
* 
*         USES   - NONE 
* 
*         CALLS  - FNC
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 44 MICROSEC.
* 
 OPCX     LJM    **          ENTRY/EXIT 
 OPC      EQU    *-1
          LDM    BD.CHFG
          ZJN    OPCX        EXIT IF CHANNEL NOT RESERVED 
          LDM    CMCON
          NJN    OPCX        EXIT IF ADAPTER NOT RESERVED 
          AOM    CMCON       CLEAR CONTROL MOD CONN FLAG
          AOM    DRCON       CLEAR DRIVE CONNECT FLAG 
          LDC    ** 
 OPC1     EQU    *-1         CONTROL MOD/DRIVE RES BITS STORED
          SBN    2
          NJN    OPCX        IF CONTROL MOD/DRIVE NOT RESERVED
  
*         THE RELEASE REQUEST CAME FROM THE BASIC DRIVER, SO PROCESS
*         IT WITHOUT CHANGING ANY DATA OR CREATING AN ERROR EXIT. 
  
 OPC3     LDN    OC 
 OPC4     STD    D.T5 
          LDM    ERR3        UPPER BITS OF ABT ADDRESS
          SBN    77B
          NJN    OPC5        IF REQUEST IS FROM THE USER
          LDD    D.T5 
          RJM    FNA         EXECUTE OPERATION COMPLETE FUNCTION
          NJN    OPCX        EXIT IF NOT FUNCTION TIMEOUT 
          DCN    CH+40B      ELSE DO A DISCONNECT 
 OPC4A    UJN    OPCX        AND EXIT 
  
 OPC5     LDD    D.T5 
          RJM    FNC         TO FUNCTION OPERATION COMPLETE 
          UJN    OPC4A       EXIT 
  
 STS      TITLE  STS - REQ AND INP GENERAL STATUS.
  
**        STS    - REQUEST AND INPUT GENERAL STATUS.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = STATUS 
* 
*                  ERRCPE  - IF CHANNEL PARITY ERROR ON INPUT 
*                  ERRGSNR - IF GENERAL STATUS NOT RETURNED 
*                  ERRNIGS - IF NO INACTIVE TO GENERAL STATUS 
* 
*         USES   - SB 
* 
*         CALLS  - FNA, FJM, IJM
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 60 MICROSEC.
* 
 STSXX    LDM    SB          LOAD STATUS AND EXIT 
          LJM    **          ENTRY/EXIT 
 STS      EQU    *-1
          LCN    0
          STM    SB          NEGATIVE ZERO TO SB
          LDN    GS 
          RJM    FNA         ISSUE GENERAL STATUS FUNCTION
          NJN    STS1        IF FUNCTION ACCEPTED 
 ERRNIGS  LDC    ER.NIGS     ERROR IF NO INACTIVE TO GS FUNCTION
 STS0     UJN    STS3        ERROR EXIT 
  
 STS1     LDN    0
          STM    CMCON       SET CONTROL MODULE CONNECTED 
          ACN    CH+40B 
          LDN    1
          IAM    SB,CH       INPUT GENERAL STATUS 
          NJN    ERRGSNR     IF NO STATUS PROVIDED
          RJM    IJM         WAIT FOR INACTIVE
          ZJN    STS1A       IF INACTIVE NOT RECEIVED 
          SFM    ERCPE2,CH   CHECK FOR CH PARITY ERROR
          UJN    STSXX       IF OK EXIT 
  
 STS1A    LJM    ERRNIDT     ERROR NO INACTIVE AFTER DATA XFER
  
 ERRGSNR  LDC    ER.GSNR     ERROR IF NO FULL OR NO INACTIVE
  
 STS3     UJN    DSTS0       JUMP TO ERR
  
 DSTS     TITLE  DSTS - REQ AND INP DMA STATUS. 
  
**        DSTS    - REQUEST AND INPUT DMA STATUS. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - DMA ERROR OR OPER STATUS IN SB.
* 
*                  ERRDCE  - IF DMA CHANNEL ERROR 
*                  ERRISRD - IF DMA STATUS NOT RETURNED 
*                  ERRNISD - IF NO INACTIVE TO DMA STATUS FUNCTION
* 
*         USES   - SB56, SB57, SB64, SB65, D.T6, D.T7 
* 
*         CALLS  - FNA, FJM, IJM
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 60 MICROSEC.
* 
 DSTS     LJM    *           ENTRY/EXIT 
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          SHN    9
          RJM    FNA         ISSUE STATUS FUNCTION
          NJN    DSTS1       IF FUNCTION ACCEPTED 
          LDC    ER.NISD     ERROR IF NO INACTIVE TO FUNCTION 
 DSTS0    LJM    ERR         ERROR EXIT 
  
 DSTS1    ACN    CH+40B 
          LDC    7777B       SET A REG
          IAN    CH          INPUT DMA STATUS 
          DCN    CH+40B      DEACTIVATE CHANNEL 
          STD    D.T7        SAVE LOWER  12 
          SHN    -12
          STD    D.T6        SAVE UPPER 4 
          SHN    12 
          ADD    D.T7        ADD LOWER 12 
          ADC    -7777B      TEST IF STATUS RECEIVED
          ZJN    DSTS2       IF NO STATUS PROVIDED
  
          LDD    LF          LOAD FUNCTION
          ADC    -114B
          ZJN    DSTSA       OPR STATUS 
  
          LDD    D.T7        LOAD LOWER 12 ERROR STATUS 
          STM    ERRSTL      STORE LOWER 12 
          LDD    D.T6        LOAD UPPER 4 ERROR STATUS
          STM    ERRSTU      STORE UPPER 4
          UJN    DSTSB
  
 DSTSA    LDD    D.T7        LOAD LOWER 12 OPER STATUS
          STM    OPERSTL     STORE LOWER 12 
          LDD    D.T6        LOAD UPPER 4 OPER STATUS 
          STM    OPERSTU     STORE UPPER 4
  
 DSTSB    SFM    DSTS4,CH    DMA CHANNEL ERROR
          LJM    DSTS        IF OK EXIT 
  
 DSTS2    LDC    ER.ISRD     INCOMPLETE STATUS FRON DMA 
          UJN    TCA1        JUMP TO ERR
  
 DSTS4    RJM    CLRINT+1    CLEAR DMA INTERFACE AND NO STATUS
          LJM    DRW2B       POST DMA CHANNEL PE MESSAGE
  
 CLRINT   TITLE CLRINT - CLEAR DMA INTERFACE AND NO STATUS. 
  
**        CLRINT - CLEAR DMA INTERFACE. 
* 
*         ENTRY  - NA.
  
*         EXIT   - DMA INTERFACE CLEARED
* 
*         CALLS  - NONE.
* 
*         USES   - NONE 
* 
 CLRINT   LJM    **          ENTRY/EXIT 
          LDC    CLTR        LOAD CLEAR T REGISTER FUNCTION 
          RJM    FNC         CLEAR T REGISTER 
  
          LDC    WCR         WRITE CONTROL REGISTER FUNCTION
          RJM    FNC         FUNCTION DMA 
  
          LDN    0           ENABLE CLEAR 170 MODE ERROR FLAG 
  
**        OUTPUT CONTROL REG WORD 
* 
          ACN    CH+40B      ACTIVATE CHANNEL 
          RJM    DMAP+1      OUTPUT CONTROL REG WORD
          DCN    CH+40B      DEACTIVATE CHANNEL 
          UJN    CLRINT      EXIT 
  
 TCA      TITLE TCA - TEST CH, CON MOD, DRIVE FOR ASSIGN/COM/RES. 
  
**        TCA    - TEST CHANNEL ASSIGNMENT. 
* 
*         ENTRY  - BD.CHFG =  1 IF CH NOT ASSIGNED
*                             0 IF CH ASSIGNED
  
*         EXIT   - ABT ADDRESS STORED IN ERR3 AND ERR4
* 
*                  ERRCNA  - IF CHANNEL NOT ASSIGNED
* 
*         CALLS  - NONE.
* 
*         USES   - NONE 
* 
 TCAX     LJM    **          ENTRY/EXIT 
 TCA      EQU    *-1
          LDM    BD.CHFG
          NJN    TCAX        EXIT IF CHANNEL ASSIGNED 
          LDC    ER.CNA      ERROR IF CHANNEL NOT RESERVED
 TCA1     UJN    ERRCNC1
          SPACE  4,18 
**        TCC    - TEST CONTROL MODULE CONNECTED. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - ABT ADDRESS STORED IN ERR3 AND ERR4
*                  WC SET TO WRRD 
* 
*         USES   - NONE.
* 
*         CALLS  - TCA
* 
 TCCX     LJM    **          ENTRY/EXIT 
 TCC      EQU    *-1
          RJM    TCA         TEST ADAPTER CONNECTED 
          LDC    ** 
 CMCON    EQU    *-1         *** CONTROL MODULE CONN FLAG STORED HERE 
          ZJN    TCCX        IF CONNECTED 
          UJN    ERRCNC      ELSE ERROR EXIT
          SPACE  4,17 
**        TDR    - TEST DRIVE RESERVED. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - NONE 
* 
*         USES   - NONE 
* 
*         CALLS  - TCC
* 
 TDRX     LJM    **          ENTRY/EXIT 
 TDR      EQU    *-1
          RJM    TCC         CHECK CONTROL MODULE CONNECTED 
          LDC    ** 
 DRCON    EQU    *-1         *** DRIVE CONNECTED FLAG STORED HERE.
          ZJN    TDRX        IF CONNECTED EXIT
 ERRCNC   LDC    ER.CNC      ELSE ERROR EXIT
 ERRCNC1  UJN    ERR         ERROR EXIT 
* 
* 
 ERCPE1   RJM    STS         TAKE GENERAL STATUS
 ERCPE2   RJM    DST         TAKE DETAILED STATUS 
 ERCPE3   LDC    ER.CPE      CHANNEL PARITY ERROR 
  
 ERR      TITLE  ERR - ERROR EXIT.
  
**        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  - NA 
* 
 ERR      STD    D.Z1        SAVE MESSAGE INDEX AND ERROR NUMBER
          SHN    -12
          STD    D.Z2        SAVE ABORT FLAG
          LDM    BD.CHFG
          ZJN    ERR2        IF CHANNEL IS NOT ASSIGNED 
          LDD    BD.AL
          SBN    AL21 
          ZJN    ERR2        IF ACCESS LEVEL INDICATES NO CHAN CLEANUP
          IJM    ERR2,0      CLEAN UP CHANNEL 
          DCN    CH+40B 
 ERR2     LDD    D.Z1 
          LPN    77B         MASK ERROR CODE
          ADC    7200B       ADD IN BIAS FOR P895D 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 
  
 IB       EQU    6476B       INPUT BUFFER 
 LIB      EQU    505B        LENGTH OF INPUT AND OUTPUT BUFFERS 
 OB       EQU    IB+LIB      OUTPUT BUFFER
 SB       EQU    OB+LIB      STATUS BUFFER
 SBIE     EQU    SB+25B      STATUS THAT DETECTED THE ERROR 
 RETRY    EQU    SB+52B      RETRY COUNT
 TREG     EQU    SB+53B      8 BIT BYTE COUNT 
 ERRSTU   EQU    SB+56B      DMA ERROR STATUS BITS 12-15
 ERRSTL   EQU    SB+57B      DMA ERROR STATUS BITS 0-11 
 SEEKTIM  EQU    SB+60B      LAST SEEK TIME 
 OPERSTU  EQU    SB+64B      DMA OPERATION STATUS BITS 12-15
 OPERSTL  EQU    SB+65B      DMA OPERATION STATUS BITS 0-11 
 RESA     EQU    SB+66B      ITERATION COUNT FOR RES COMMAND
 LSB      EQU    66B         LENGTH OF STATUS BUFFER
  
          ERRPL  *-IB-1      ERROR IF P895D PRODUCT OVERLAY OVERFLOW
          EJECT 
 INIT     TITLE  INIT - INITIALIZATION. 
**        THE INITIALIZATION CODE THAT FOLLOWS IS OVERLAYED BY THE
*         PRODUCT OVERLAY BUFFERS ABOVE.
* 
*         TEST EQUIPMENT AND UNIT NUMBER
* 
 INIT     LDN    0
          STD    D.Z1        CLEAR COUNTER
*IF DEF,MVE 
          LDM    BD.IOU 
          LPN    40B         MASK CIO FLAG * A=40B IF CIO * 
          ZJN    INIT.1      IF NIO 
          LDM    BD.DMA 
          NJN    INIT.1      IF DMA BUFFER ESTABLISHED
          LDC    INITE
          LJM    INIT11.1    NO DMA BUFFER HAS BEEN ESTABLISHED 
 INIT.1   LDM    BD.IOU 
          NJN    INIT0       IF NOT I0
          LDC    INITB       (A)=ERROR ADDRESS FOR INVALID IOU
          LJM    INIT11.1    PROCESS ERROR MESSAGE
*ENDIF
 INIT0    LDN    0
          STM    SB,D.Z1     CLEAR STATUS BUFFER
          AOD    D.Z1 
          SBN    LSB
          NJN    INIT0       IF STATUS BUFFER NOT CLEARED 
*IF DEF,MVE 
          LDM    BD.EQ
          LPN    40B
          ZJN    INIT0.1     IF UN IS LESS THAN 40B 
          LDC    INITC
          UJN    INIT0.2
 INIT0.1  LDM    BD.EQ
          SHN    -9 
          SBN    2
          MJN    INIT0.3     IF EQ IS LESS THAN 2 
          LDC    INITD
 INIT0.2  LJM    INIT11.1    EQ OR UN RANGE ERROR 
 INIT0.3  LDM    BD.EQ
          LPN    77B
          STM    SB+63B      UNIT TO STATUS BUFFER
          LDM    BD.EQ
          SHN    -4 
          LPN    40B         MASK FOR STORAGE DIRECTOR BIT
          RAM    SB+63B      ADD STORAGE DIRECTOR BIT TO ADDRESS
          STM    UN 
*ENDIF
*IF -DEF,MVE
          LDM    BD.EQ
          LPN    77B
          STM    SB+63B      UNIT TO STATUS BUFFER
          STM    UN 
*ENDIF
          LDN    0
          STM    SB+62B      EQUIPMENT NUMBER TO STATUS BUFFER
  
*         SET DELAY TIME BASED ON SPEED OF PPU
  
          LDC    TSPEED 
          STD    D.T0 
 INIT2    LDI    D.T0 
          ZJN    INIT3       IF END OF TABLE
          STD    D.T1 
          LDI    D.T1 
          SCN    77B
          ADM    BD.SPEED 
          STI    D.T1        SET ADN/SBN/VALUE
          AOD    D.T0 
          UJN    INIT2       COMPLETE ALL WORDS 
  
*         STORE I/O CHANNEL INTO COMMANDS 
  
 INIT3    LDM    BD.CHAN
          LPN    77B         REMOVE CHANNEL BIAS
          STM    SB+61B      I/O CHANNEL TO STATUS BUFFER 
*IF DEF,MVE 
          LDM    BD.IOU 
          LPN    40B         MASK CIO FLAG * A=40B IF CIO * 
          RAM    SB+61B      ADD CIO/NIO FLAG 
*ENDIF
          LPN    37B         REMOVE CIO BIAS
          STD    D.T2 
          LDC    TCHAN
          STD    D.T0        SET FWA OF TABLE CONTAINING ADDRESSES
 INIT4    LDI    D.T0 
          ZJN    INIT5       IF END OF TABLE
          STD    D.T1 
          LDI    D.T1 
          LPC    7740B
          ADD    D.T2 
          STI    D.T1 
          AOD    D.T0 
          UJN    INIT4       COMPLETE ALL WORDS 
*IF DEF,MVE 
 INIT5    STD    D.T1        CLEAR CELL 
          LDC    MMSGL. 
          STD    D.T0        LENGTH OF PO MSG AREA IN 60 BIT WORDS
 INIT5.1  SBN    3           NUMBER OF 60 BIT WORDS/MESSAGE 
          MJN    INIT5.2     IF NO MESSAGES 
          STD    D.T0        UPDATED LENGTH 
          AOD    D.T1        INCREMENT MESSAGE COUNT
          LDD    D.T0 
          NJN    INIT5.1     IF MORE MESSAGES 
 INIT5.2  LDD    D.T1 
          STM    BD.MSGS     MESSAGE COUNT
**
*         WRITE PP MESSAGES TO CM 
* 
 INIT5.3  LDN    0
          STD    D.Z1 
          STD    D.Z2 
          STD    D.Z3 
          STD    D.Z4 
 INIT6    LDM    PPMSGS,D.Z1 GET PP MESSAGE WORD
 INIT6.1  EQU    *-1         MODIFIED TO FWA OF INITIALIZATION ERROR
          ZJN    INIT8       IF END OF MESSAGE
 INIT7    STM    D.T4,D.Z2   STORE IN D.T4+ 
          AOD    D.Z1        BUMP PP MESSAGE POINTER
          UJN    INIT9
 INIT8    LDC    2R          MESSAGE END, STORE BLANKS
          STM    D.T4,D.Z2
 INIT9    AOD    D.Z2        BUMP D.T4+ POINTER 
          SBN    4
          NJN    INIT6       IF NOT 4 PP WORDS
          STD    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
          STM    BD.IDEX
          LDN    BD.CMB      POINTER TO FWA OF CM COMM BUFFER 
          RJM    BD.SETR
          CWDL   D.T4        WRITE MSG WORD TO CM 
          AOD    D.Z4        INCREMENT BIAS INTO PO MSG AREA
          AOD    D.Z3        BUMP CM WORD COUNTER 
          SBN    BD.MSGML+1  EACH MESSAGE OCCUPIES A 4 WORD CM BLOCK
          NJN    INIT6       IF NOT BD.MSGML CM WORDS 
          STD    D.Z3        CLEAR CM WORD COUNTER
          LDC    0
 INIT9.1  EQU    *-1         MODIFIED TO FWA OF INITIALIZATION ERROR
          ZJN    INIT9.2     IF NOT PO INITIALIZATION ERROR 
          LCN    0
          LJM    INIT12      PO INITIALIZATION ERROR (A) = NEG ZERO 
 INIT9.2  LDM    PPMSGS,D.Z1
          ZJN    INIT10      IF MESSAGE ENDED IN ZERO BYTE
          AOD    D.Z1        SKIP ZERO BYTE TERMINATOR
 INIT10   AOD    D.Z1        BUMP PP MESSAGE ADDRESS TO NEXT MESSAGE
          LDM    PPMSGS,D.Z1
          ZJN    INIT10.1    IF LAST MESSAGE
          LJM    INIT7       GET NEXT MESSAGE 
 INIT10.1 EQU    *
  
*ENDIF
  
*IF -DEF,MVE
*         WRITE PP MESSAGES TO CM 
  
 INIT5    LDM    BD.MSGA     GET PP 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 
 INIT6    LDM    PPMSGS,D.Z1 GET PP MESSAGE WORD
          ZJN    INIT8       IF END OF MESSAGE
 INIT7    STM    D.T0,D.Z2   STORE IN D.T0+ 
          AOD    D.Z1        BUMP PP MESSAGE POINTER
          UJN    INIT9
  
 INIT8    LDC    2R          MESSAGE END, STORE BLANKS
          STM    D.T0,D.Z2
 INIT9    AOD    D.Z2        BUMP D.T0+ POINTER 
          SBN    5
          NJN    INIT6       IF NOT 5 PP WORDS
          STD    D.Z2        CLEAR POINTER
          LDD    D.RA        PUT RA IN A REG
          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    INIT6       IF NOT BD.MSGML CM WORDS 
          STD    D.Z3        CLEAR CM WORD COUNTER
          LDM    PPMSGS,D.Z1
          ZJN    INIT10      IF MESSAGE ENDED IN ZERO BYTE
          AOD    D.Z1        SKIP ZERO BYTE TERMINATOR
 INIT10   AOD    D.Z1        BUMP PP MESSAGE ADDRESS TO NEXT MESSAGE
          LDM    PPMSGS,D.Z1
          NJN    INIT7       IF NOT LAST MESSAGE
*ENDIF
  
*         SET DIRECT CELLS
  
          STD    WT          CLEAR WORDS TRANSMITTED REGISTER 
          STD    BA          CLEAR BEGINNING ADDRESS REGISTER 
*IF -DEF,MVE
          LDC    100D        100 MSEC DELAY IN BD.RCH 
          STM    DLYDCH      MODIFY DELAY USED ON REL AND RES CHANNEL 
*ENDIF
 INIT11   LDC    WRRD 
          STD    WC          SET DEFAULT VALUE IN WORD COUNT REGISTER 
  
  
*         VERIFY THAT THE ASSIGNED DEVICE CODE IS SUPPORTED 
  
          LDD    DC          DEVICE CODE CURRENTLY ASSIGNED 
          ADC    -D895       TEST IF DEVICE CODE FOR DMA/895
          ZJN    INIT12 
          LDC    INITA       (A) = POINTER TO ERROR MSG IF NO SUPPORT 
*IF DEF,MVE 
 INIT11.1 STM    INIT6.1
          STM    INIT9.1
          LJM    INIT5.3     PROCESS ERROR MESSAGE
*ENDIF
 INIT12   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
  
 INITA    DIS    ,*DC NOT SUPPORTED*
*IF DEF,MVE 
 INITB    DIS    ,*BAD IOU TYPE*
 INITC    DIS    ,*UN INVALID*
 INITD    DIS    ,*EQ INVALID*
 INITE    DIS    ,*DMA BUFF NOT ASSIGNED* 
*ENDIF
*         TABLE OF PPU SPEED SWITCHES 
  
 TSPEED   CON    FJM2 
          CON    IJM2 
          DATA   0           END OF SPEED SWITCHES TABLE
  
          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.CAS,EC.CAS,(CH ACTIVE ON ENTRY) 
          MMSG   ER.NIF,EC.NIF,(NO INACTIVE TO LAST FUNC) 
          MMSG   ER.NIGS,EC.NIGS,(NO INACTIVE TO GENERAL STATUS)
          MMSG   ER.NIDS,EC.NIDS,(NO INACTIVE TO DETAIL STATUS) 
          MMSG   ER.GSNR,EC.GSNR,(GENERAL STATUS NOT RETURNED)
          MMSG   ER.ISR,EC.ISR,(INCOMPLETE 895 STATUS RETURNED) 
          MMSG   ER.FPNA,EC.FPNA,(FUNC PARAMETERS NOT ACCEPTED) 
          MMSG   ER.DNA,EC.DNA,(ALL DATA NOT TAKEN FROM PP/CM)
          MMSG   ER.IDR,EC.IDR,(INCOMPLETE DATA TO PP OR CM)
          MMSG   ER.CNC,EC.CNC,(CONTROLLER/DRIVE NOT CONNECTED) 
          MMSG   ER.IAL,EC.IAL,(ACCESS LEVEL TOO LOW FOR REQ) 
          MMSG   ER.NRES,EC.NRES,(RESERVE TIMEOUT)
          MMSG   ER.AGS,EC.AGS,(ABNORMAL GENERAL STATUS)
          MMSG   ER.CFE,EC.CFE,(CH FAILED TO GO EMPTY)
          MMSG   ER.UHB,EC.UHB,(UNIT HUNG BUSY) 
          MMSG   ER.STRY,EC.STRY,(SUCCESSFUL RETRY) 
          MMSG   ER.CANA,EC.CANA,(ACCESS TO CYLINDER NOT ALLOWED) 
          MMSG   ER.NIDT,EC.NIDT,(NO INACTIVE AFTER DATA XFER)
          MMSG   ER.CPE,EC.CPE,(CHANNEL PE ON 895 INPUT)
          MMSG   ER.NISD,EC.NISD,(NO INACTIVE TO DMA STATUS)
          MMSG   ER.ISRD,EC.ISRD,(INCOMPLETE STATUS FROM DMA) 
          MMSG   ER.DCPE,EC.DCPE,(CHANNEL PE ON DMA OPERATION)
          MMSG   ER.ESS,EC.ESS,(DMA ERROR STATUS SET) 
 MMSGL.   EQU    MMSGL
          DATA   0
****
 TCHAN    EQU    *           CREATE CHANNEL TABLE 
          LIST   D
          HERE
          LIST   *
          DATA   0           END OF CHANNEL TABLE 
*IF -DEF,MVE
          IFEQ   NOS,1
 .1       SET    POVLA
 .2       SET    10000B 
 .3       SET    *-.1+5+4+500B
 .4       SET    .2-.1+5-1
          ERRNG  .2-.1+5-.3/500B*500B-1  BYTES LEFT AFTER LAST SECTOR 
          ERRNG  .3/500B*500B-5-*+.1-5   BYTES LEFT IN LAST SECTOR
          ERRNG  .4/500B*500B-5-*+.1-5   BYTES CAN BE ADDED TO OVERLAY
          ENDIF 
*ENDIF
  
*IF DEF,MVE 
          ERRPL  *-SB-1      ERROR IF P895D VERLAY OVERFLOW 
*ENDIF
*IF -DEF,MVE
          IFEQ   NOSBE,1,1
          ERRPL  *-7773B     ERROR IF P895D OVERLAY OVERFLOW
*ENDIF
          QUAL   *
