*COMDECK,ISD1 
          TITLE  HIGH LEVEL ISD FULL TRACK PRODUCT OVERLAY FOR MALET. 
 5SF      SEGMENT POVLA 
          ORG    POVLA
          QUAL   ISD1 
*CALL,VERS
          COMMENT ISD PRODUCT OVERLAY FOR MALET "VERS"
          EJECT 
**        THE FOLLOWING COMMANDS ARE DESIGNED FOR THE ISD AND 895 DISK
*         SUBSYSTEMS RUNNING IN FULL-TRACK MODE.  5SF  IS  THE PRODUCT
*         OVERLAY THAT EXECUTES THESE COMMANDS  AND  IS  DRIVEN BY THE
*         INSTRUCTION STACK OF THE MALET PP DRIVER.  REQUESTS ARE MADE
*         BY THE DRIVER BY STORING PARAMETERS INTO PP DIRECT CELLS AND
*         PERFORMING A  RETURN-JUMP TO AN OVERLAY SUBROUTINE. ONCE THE
*         REQUEST HAS BEEN COMPLETED, CONTROL IS RETURNED TO THE STACK
*         TO  EXECUTE  THE  NEXT  COMMAND.  THE  DEVICE TYPE FOR THESE
*         COMMANDS IS ISD1.  THE LANGUAGE NAME IS FSD2. 
* 
*         THE ISD1 FULL-TRACK PRODUCT OVERLAY SUPPORTS  A PROGRAMMABLE
*         INPUT BUFFER (IB) OF 505B PP WORDS, AN OUTPUT BUFFER (OB) OF
*         OF 505B PP WORDS AND A STATUS BUFFER (SB) OF  64B PP WORDS. 
*         DATA IS WRITTEN TO  THE  DISK FROM THE  OUTPUT BUFFER AND IS
*         READ FROM THE DISK TO THE INPUT BUFFER. THE STATUS BUFFER IS
*         USED TO HOLD GENERAL  AND  DETAIL STATUS  FROM THE SUBSYSTEM
*         AND OTHER WORDS DEFINED LATER. SUPPORTED CAPABILITIES ARE AS
*         FOLLOWS.
* 
*            READ   - SEEK AND READ ONE SECTOR FROM DISK. 
*            READCB - READ 502B 16 BIT WORDS FROM ADAPTER BUFFER TO IB. 
*                     UNPACK 241B 16 BIT WORDS TO 502B 8 BIT WORDS. 
*            REL    - RELEASE DRIVE, ADAPTER, CONTROL MODULE AND I/O
*                     CHANNEL.
*            RES    - RESERVE I/O CHANNEL, ADAPTER, CONTROL MODULE AND
*                     DRIVE.
*            WRITE  - SEEK AND WRITE ONE SECTOR TO DISK.
*            WRITECB- PACK 502B 8 BIT WORDS FROM OB TO 241B 16BIT WORDS 
*                     TO IB. THEN WRITE 502B 16 BIT WORDS FROM IB TO THE
*                     ADAPTER BUFFER. 
*            STATUS - INPUT GENERAL, PROCESSOR OR DETAIL STATUS TO SB.
* 
*         THIS PRODUCT OVERLAY DOES NOT USE THE WC OR BA  REGISTERS TO
*         CONTROL I/O OPERATIONS.  THESE REGISTERS ARE FREE FOR USE BY
*         THE MODULE PROGRAMMER.  ALL NORMAL READS AND WRITES TRANSFER
*         502B WORDS STARTING AT THE FIRST WORD OF THE BUFFER.
* 
          EJECT 
**        THE FOLLOWING CHART DEFINES THE LAY-OUT OF THE STATUS BUFFER. 
* 
*                   --------------------   ---
*               0   /   GENERAL STATUS /      / 
*                   /------------------/      / 
*               1   /                  /      / 
*               .   /                  /      / 
*               .   /   DETAIL STATUS  /      / THIS IS THE NORMAL-LAST 
*               .   /                  /      / TAKEN STATUS FROM THE 
*               .   /                  /      / SUBSYSTEM 
*               .   /                  /      / 
*               .   /                  /      / 
*               .   /                  /      / 
*              24B  /                  /   ---
*                   /------------------/   ---
*              25B  /   GENERAL STATUS /      / 
*                   /------------------/      / 
*              26B  /                  /      / 
*               .   /                  /      / THIS IS THE FIRST TAKEN 
*               .   /   DETAIL STATUS  /      / STATUS WITHIN SEQUENCES 
*               .   /                  /      / THAT REQUIRED RECOVERY
*               .   /                  /      / TO BE PERFORMED.
*               .   /                  /      / (CONTINUE FUNCTIONS 
*               .   /                  /      / ISSUED) 
*               .   /                  /      / 
*              51B  /                  /   ---
*                   /------------------/   ---
*              52B  /  RETRY COUNT     /      / ERROR CORRECTION DATA 
*                   /------------------/   ---
*              56B  / 1ST BYTE         /      / DISK PACK SERIAL NUMBER 
*              57B  / 2ND BYTE         /      / (FROM ASSIGN DIRECTIVE) 
*                   /------------------/   ---
*              60B  / SEEK TIME        /      / MILLISECONDS TO DO LAST 
*                   /------------------/      / SEEK
*              61B  / CHANNEL          /   ---
*              62B  / EQUIPMENT        /      / 
*              63B  / UNIT             /      / EQUIPMENT UNDER TEST
*                   --------------------   ---
* 
*         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 CURRENT  P  REGISTER
*         CONTENTS (LINE NUMBER) INTO THE  EA  REGISTER.   I-O CHANNEL
*         CLEAN-UP 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 S R W R W 
*                                     E E T E R E R 
*                                     L S A A I A I 
*                                     . . T D T D T 
*                                     . . U . E C E 
*                                     . . S . . B C 
*                                     . . . . . . B 
*                                     - - - - - - - 
* 7010 CH NOT ASSIGNED                . . X X X X X 
*      ------------------------------ - - - - - - - 
* 7011 CH ACTIVE ON ENTRY             . X . . . . . 
*      ------------------------------ - - - - - - - 
* 7012 NO INACTIVE TO LAST FUNC       X X X X X X X 
*      ------------------------------ - - - - - - - 
* 7013 NO INACTIVE TO GENERAL STATUS  . X X X X . . 
*      ------------------------------ - - - - - - - 
* 7014 NO INACTIVE TO DETAIL STATUS   . X X X X . . 
*      ------------------------------ - - - - - - - 
* 7015 GENERAL STATUS NOT RETURNED    . X X X X . . 
*      ------------------------------ - - - - - - - 
* 7016 INCOMPLETE STATUS RETURNED     . X X X X . . 
*      ------------------------------ - - - - - - - 
* 7017 FUNC PARAMETERS NOT ACCEPTED   . X . X X . . 
*      ------------------------------ - - - - - - - 
* 7020 ALL DATA NOT ACCEPTED FROM PP  . . . . X . X 
*      ------------------------------ - - - - - - - 
* 7021 INCOMPLETE DATA RETURNED TO PP . . . X . X . 
*      ------------------------------ - - - - - - - 
* 7022 CONTROLLER/DRIVE NOT CONNECTED . . X X X . . 
*      ------------------------------ - - - - - - - 
* 7023 ACCESS LEVEL TOO LOW FOR REQ   . . . X X . . 
*      ------------------------------ - - - - - - - 
* 7024 RESERVE TIMEOUT                . X . . . . . 
*      ------------------------------ - - - - - - - 
* 7025 ABNORMAL GENERAL STATUS        . X . X X . . 
*      ------------------------------ - - - - - - - 
* 7026 CHANNEL FAILED TO GO EMPTY     . . . X X . . 
*      ------------------------------ - - - - - - - 
* 7027 UNIT HUNG BUSY                 . . . X X . . 
*      ------------------------------ - - - - - - - 
* 7030 SUCCESSFUL RETRY               . . . X X . . 
*      ------------------------------ - - - - - - - 
* 7031 ACCESS TO CYLINDER NOT ALLOWED . . . X X . . 
*      ------------------------------ - - - - - - - 
* 7032 DEVICE CODE/ STATUS MISMATCH   . X . . . . . 
*      ------------------------------ - - - - - - - 
* 7033 NO INACTIVE AFTER DATA XFER    . . X X X X X 
*      ------------------------------ - - - - - - - 
* 7034 CHANNEL PARITY ERROR ON INPUT  . . X X X X . 
*      ------------------------------ - - - - - - - 
* 7035 IOU INSTRUCTION ERROR          . . . . . 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 STATUS RETURNED 
 EC.FPNA  EQU    17B         FUNC PARAMETERS NOT ACCEPTED 
 EC.DNA   EQU    20B         ALL DATA NOT ACCEPTED FROM PP
 EC.IDR   EQU    21B         INCOMPLETE DATA RETURNED TO PP 
 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.DCSM  EQU    32B         DEVICE CODE/STATUS MISMATCH
 EC.NIDT  EQU    33B         NO INACTIVE AFTER DATA TRANSFER
 EC.CPE   EQU    34B         CHANNEL PARITY ERROR ON INPUT
 EC.INER  EQU    35B         IOU INSTRUCTION ERR
  
*         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
 RCB      EQU    43B         READ BUFFER
 WCB      EQU    44B         WRITE BUFFER 
 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
  
*         DEVICE CODES SUPPORTED
  
 ISD1     EQU    110B        ISD1 DEVICE CODE 
 ISD2     EQU    111B        ISD2 DEVICE CODE 
 D895     EQU    115B        895 DEVICE CODE
          SPACE   4,20
*         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
 MAXCDD1  EQU    1460B       MAXIMUM CYLINDER ON ISD1 
 MAXCDD2  EQU    1274B       MAXIMUM CYLINDER ON ISD2 
 MAXCDD8  EQU    1565B       MAXIMUM CYLINDER ON 895
 PRECYL   EQU    2           NUMBER OF PREALLOCATED CYLINDERS 
  
 WRRD     EQU    502B        I/O WORD COUNT 
  
*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    - 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    REL         RELEASE EQUIPMENT
          CON    RES         RESERVE ADAPTER, CONTRL MOD, AND DRIVE 
          CON    RDWR        READ, WRITE SECTOR OF DISK 
          CON    STATUS      GET GENERAL, PROCESSOR OR DETAIL STATUS
          CON    DIAG        WRITE/READ TO/FROM INPUT/OUTPUT BUFFER 
          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. DISCONNECT EQUIPMENT WITH AN OPERATION COMPLETE 
*         FUNCTION IF EITHER IS CONNECTED.
* 
*      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 DRIVE, ABT Z 
*                  RES ADAPT, ABT Z 
* 
*         ENTRY  - (PA) = 0 IF RES ADAPT, 1 IF RES DRIVE
* 
*         EXIT   - I/O CHANNEL ASSIGNED AND CHANNEL ASSIGNED FLAGS
*                  SET IN ALL THE OTHER SUBROUTINES.
* 
*                  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 
  
**     1. DISCONNECT CONTROL MOD WITH AN OPERATION COMPLETE 
*         FUNCTION IF CONNECTED.
* 
  
**     2. CLEAR ERROR EXIT REGISTERS. 
* 
 RESX     LJM    ** 
 RES      LDN    0
          STD    EC          CLEAR ERROR REGISTERS
          STD    EA 
          STD    EM 
          LDD    PA 
          NJN    RES1        IF RES DRIVE 
          LJM    RES19       ELSE IF RES ADAPT
  
**     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
          PJN    RES4        IF NOT TIMED OUT 
          LDC    ER.NRES     ELSE ERROR EXIT
          LJM    ERR
  
 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 
          PJN    RES5        IF NOT TIMED OUT 
          LJM    RES2        ELSE START ANOTHER ITERATION 
  
  
*      6. IF ISD DEVICE CODE VERIFY GEN STATUS IS 0000 OR 0002 AND THAT 
*         DETAIL STATUS INDICATES THAT THE UNIT ASSIGNED MATCHES THE
*         DEVICE CODE ASSIGNED. 
*         IF 895 DEVICE CODE VERIFY GEN STATUS IS 0000 AND THAT DETAIL
*         STATUS INDICATES THAT THE UNIT ASSIGNED MATCHES THE DEVICE
*         CODE ASSIGNED. IF GEN STATUS IS 0002 THEN ENTER BACK INTO 
*         STEP 5 TO TEST TIME FRAME.
  
 RES8     SHN    4
          ZJN    RES9        IF GENERAL STATUS IS ZERO
          SCN    2
          NJN    RES8A       IF ERROR STATUS
          LDD    DC          GET DEVICE CODE
          ADC    -D895
          NJN    RES9        IF NOT 895 
          UJN    RES7        CHECK TIME OUT 
 RES8A    LJM    ERRAGS      GET DETAILED STATUS AND EXIT 
 RES9     RJM    DST         GET DETAILED STATUS
* 
*         SEE IF ASSIGNED DEVICE IS 895 OR ISD SUBSYSTEM
* 
          LDD    DC          GET DEVICE CODE
          ADC    -D895
          NJN    RES10       IF NOT 895 
          RJM    CK895
          UJN    RES15
 RES10    RJM    CKISD
  
*       7. SET CONTROL MOD/DRIVE CONNECTED. 
  
 RES15    LDN    0
          STM    DRCON       SET DRIVE CONNECTED FLAG 
          LDN    2
          STM    OPC1 
          LDM    RESX+1 
          ZJN    RES18       EXIT NOT CALLED FROM SUBROUTINE
          LJM    RESX        RETURN TO SUBROUTINE 
  
 RES18    LJM    XENT        EXIT TO STACK
  
 RES19    RJM    BD.RCH      DROP/REQUEST CHANNEL AS REQUESTED
          RJM    IJM         WAIT CHANNEL INACTIVE
          NJN    RES18       EXIT TO STACK AFTER INACTIVE 
 RES20    LDC    ER.CAS      ERROR CHANNEL ACTIVE FROM SYSTEM 
          UJN    ERXIT       ERROR EXIT 
* 
*         SUBROUTINES TO IDENTIFY ISD AND 895 SUBSYSTEMS
* 
*         CK895 - IDENTIFY 895 SUBSYSTEM
* 
 CK895X   LJM    **          ENTRY/EXIT 
 CK895    EQU    *-1
          LDM    SB+20D      DS WORD WITH DEVICE CAPACITY 
          SHN    0-10D
          NJN    ERDCSM      ERROR IF NOT 33800 DRIVE 
          RJM    FN770       ISSUE 770 FUNCTION 
          ZJN    ERDCSM      IF NO INACTIVE, NOT CCC
          ACN    CH          ACTIVATE CHANNEL 
          IAN    CH          INPUT ONE WORD TO A
          LMC    6314B       CHECK CCC ID WORD (CCC(HEX)) 
          NJN    ERDCSM      IF NOT CCC, ERROR
          RJM    IJM         WAIT CHANNEL INACTIVE
          NJN    CK895X      IF INACTIVE EXIT 
          LJM    ERRNIDT     ELSE ERROR EXIT
* 
 ERDCSM   LDC    ER.DCSM     ERROR DEVICE CODE/STATUS MISMATCH
 ERXIT    LJM    ERR
* 
*         CKISD - IDENTIFY ISD SUBSYSTEM
* 
 CKISDX   LJM    **          ENTRY/EXIT 
 CKISD    EQU    *-1
          LDM    SB+4        DS WORD WITH CTRWARE NO - UNIT NO
          SHN    17-10
          PJN    ERDCSM      IF NOT ISD SUBSYSTEM 
* 
*         SEE IF CM MODEL ASSIGNED MATCHES EXPECTED VALUE 
* 
          LDD    DC          GET DEVICE CODE
          ADC    -ISD2       DC IS ISD1 OR ISD2 
          ZJN    CKI1        IF DC IS ISD2
          LDN    3           CM MODEL - ISD1
          UJN    CKI2 
 CKI1     LDN    4           CM MODEL - ISD2
 CKI2     STD    D.T3 
          LDM    SB+17D 
          SHN    0-8D        SHIFT IN CM MODEL NO.
          SBD    D.T3        CHECK AGAINST EXPECTED VALUE 
          ZJN    CKI3        IF CM MODEL NO. OK 
          UJN    ERDCSM      IF NOT EXPECTED CM MODEL 
          RJM    FN770       ISSUE 770 FUNCTION 
          NJN    ERDCSM      IF RESPONSE, NOT ISD SYSTEM
          DCN    CH          DEACTIVATE CHANNEL 
 CKI3     UJN    CKISDX      AND EXIT 
* 
*         FN770 - ISSUE 770 FUNCTION AND WAIT INACTIVE
*                 770 FUNCTION WILL BE ACCEPTED BY CCC, NOT ISD 
* 
*         EXIT  - (A) = NON-ZERO IF FUNCTION ACCEPTED 
*                 (A) = ZERO IF FUNCTION NOT ACCEPTED 
* 
 FN770X   LJM    **          ENTRY/EXIT 
 FN770    EQU    *-1
          LDC    770B 
          STD    LF          STORE LAST FUNCTION
          FAN    CH          ISSUE 770 FUNCTION 
          RJM    IJM
          UJN    FN770X      RETURN 
          EJECT 
 DIAG     TITLE  DIAG - WRITE READ ADAPTER BUFFER.
**        DIAG   - READ ADAPTER BUFFER TO INPUT BUFFER. 
*                  WRITE INPUT BUFFER TO ADAPTER BUFFER.
* 
*                  READCB, ABT Z
*                  WRITECB, ABT Z 
* 
*         ENTRY  - (PA) = FUNCTION CODE FOR READCB OR WRITECB.
* 
*         EXIT   - ERR - IF INCOMPLETE DATA RETURNED TO PP (VIA RDW36A) 
*                        IF ALL DATA NOT ACCEPTED FROM PP  (VIA RDW37)
* 
*         USES   - WT, RDWRF, IB(0-501), OB(0-501), D.T1, D.Z1, D.Z2
* 
*         CALLS  - TCA, FNC, IJM, BHI 
  
**     1. VERIFY THAT THE ADAPTER IS CONNECTED. 
* 
 DIAG     RJM    TCA         TEST ADAPTER CONNECTED 
          STD    WT          CLEAR THE WORDS TRANSFERRED REGISTER 
          RJM    BHI         CONVERT TO 16 BIT INSTRUCTIONS 
  
 DIAG1    LDD    PA          GET THE FUNCTION PARAMETER 
          SBN    RCB
          STD    RDWRF       SET THE READ WRITE FLAG
          ZJN    DIAG4       IF READ DO NOT PACK DATA 
          LDN    0           SET BUFFER INDEX TO ZERO 
          STD    D.Z1 
          STD    D.Z2 
 DIAG2    LDM    OB,D.Z1
          LPC    377B        SET UPPER 8 BITS FOR 16 BIT TRANSFER 
          STM    DIAG13      SCRATCH CELL TO HOLD DATA
          STM    OB,D.Z1     REPLACE THE 8 BITS IN OB FOR COMPARE 
          AOD    D.Z1 
          LDM    OB,D.Z1
          LPC    377B        MASK OFF UPPER 4 BITS
          STM    OB,D.Z1     REPLACE THE 8 BITS IN OB FOR COMPARE 
          SHN    17-7 
          ADM    DIAG13      ADD IN UPPER BITS
          SHN    8
 DIAG3    STM    IB,D.Z2     SAVE 16 BITS AWAY
          AOD    D.Z2 
          AOD    D.Z1 
          ADC    -502B
          ZJN    DIAG4       IF DONE PACKING
          UJN    DIAG2       ELSE PACK NEXT 2 WORDS 
  
**     2. FUNCTION  READCB(43) OR WRITECB(44).
* 
 DIAG4    LDD    PA          GET THE FUNCTION 
          RJM    FNC         TO PERFORM THE FUNCTION
  
**     3. INPUT 322D WORDS FROM THE SUBSYSTEM MEMORY TO THE INPUT 
*         BUFFER IF A READCB. 
* 
          ACN    CH+40B      ACTIVATE THE CHANNEL 
          LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    DIAG7       IF IT IS A WRITE 
          LDD    WC 
          IAM    IB,CH       READ TO INPUT BUFFER 
          STD    D.T1        STORE REMAINING WORDS
          SFM    ERCPE1,CH   CHECK FOR CHANNEL PARITY ERROR 
          LDC    501B        SET BUFFER INDEX FOR MAX 
          STD    D.Z1 
          SHN    -1 
          STD    D.Z2 
 DIAG5    LDM    IB,D.Z2     GET 16 BIT DATA
          LPC    377B        MASK OFF ALL BUT LOWER 8 
          STM    IB,D.Z1     SAVE LOWER 8 BITS FOR COMPARE
          SOD    D.Z1 
 DIAG6    LDM    IB,D.Z2     GET DATA FOR SECOND WORD 
          SHN    -8          GET ONLY THE UPPER 8 BITS
          STM    IB,D.Z1     STORE UPPER 8 BITS IN DESCENDING ORDER 
          SOD    D.Z2 
          SOD    D.Z1 
          MJN    DIAG9       IF BUFFER FULL 
          UJN    DIAG5
  
**     4. OUTPUT 322D WORDS FROM THE OUTPUT BUFFER TO THE SUBSYSTEM 
*         IF A WRITECB. 
* 
 DIAG7    LDM    WC          LOAD WORD COUNT
          OAM    IB,CH       WRITE FROM THE OUTPUT BUFFER 
  
**     5. VERIFY THAT 322B WORDS WERE ACTUALLY INPUT. 
* 
 DIAG8    STD    D.T1        SAVE COUNT OF WORDS NOT WRITTEN
 DIAG9    LDD    WC          LOAD THE EXPECTED WORD COUNT 
          SBD    D.T1 
          STD    WT          STORE THE WORDS ACTUALLY TRANSFERRED 
          RJM    IJM         INSURE CHANNEL IS INACTIVE 
          NJN    DIAG10      JUMP IF CHANNEL INACTIVE 
          DCN    CH+40B      DEACTIVATE THE CHANNEL 
 DIAG10   LDD    D.T1 
          ZJN    DIAG12      IF ALL WORDS TRANSFERRED, EXIT TO STACK
          LDD    RDWRF
          ZJN    DIAG11      IF READ ERROR
          LJM    RDW37       IF WRITE ERROR 
 DIAG11   LJM    RDW36A      ERROR - ALL WORDS NOT TRANSFERRED
 DIAG12   LJM    XENT        EXIT TO STACK
  
 DIAG13   DATA   0           TEMPORARY REG FOR DATA 
          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
*                  WRITE SECTOR AT CYL W TRK X SEC Y, ABT Z 
* 
*         ENTRY  - (A)      = ABT ADDRESS 
*                  (PA)     = BITS 0-2 = FUNCTION CODE
*                             BIT 5    = READ/WRITE FLAG
* 
*                  (PA+65B) = W 
*                  (PA+66B) = X 
*                  (PA+67B) = Y 
* 
*         EXIT   - W, X, Y = LAST CYL, TRK, SEC.
* 
*                  ERRCPE  - IF CHANNEL PARITY ERROR ON INPUT 
*                  ERRDNA  - IF ALL DATA NOT ACCEPTED FROM PP 
*                  ERRIAL  - IF ACCESS LEVEL TOO LOW FOR REQUEST
*                  ERRIDR  - IF INCOMPLETE DATA RETURNED TO PP
*                  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, D.T4, SB(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 
          SHN    18D-5D      SHIFT READ/WRITE FLAG TO BIT 0 
          STD    RDWRF       SET/CLEAR READ/WRITE FLAG
          SCN    1           CLEAR THE BIT
          SHN    0-13D       SHIFT IN THE 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
  
          LDD    DC          GET DEVICE CODE
          ADC    -D895
          NJN    RDW5        IF NOT 895 
          LDC    MAXCDD8     MAX CYLINDER - 895 
          SBI    CC          CURRENT CYLINDER 
          ZJN    RDW7        IF USING MAX CYLINDER, OK
          LDC    ER.CANA     ELSE ERROR EXIT
          UJN    RDW6A
  
 RDW5     LDD    BD.AL
          SBD    D.T1        TO TEST ACCESS LEVEL 
          PJN    RDW7        IF ACC.LEV. NOT PREALLOCATED AREA. 
          ADN    1           TO VERIFY ANY OPERATION OK 
          MJN    RDW6        IF PREALLOCATED OPERATION IS NOT OK
 FMAP1    LDC    MAXCDD1     MAXIMUM CYLINDER ADDRESS - ISD1
*         LDC    MAXCDD2     *MODIFIED IF ISD2
          SBN    PRECYL      SUBTRACT PREALLOCATED CYLINDERS
          SBI    CC          CURRENT CYLINDER 
          MJN    RDW7        IF CYL DESIRED IS IN PREALLOCATED AREA 
 RDW6     LDC    ER.IAL      ELSE ERROR EXIT
 RDW6A    LJM    ERR
  
 RDW7     RJM    SEEK1       TO SEEK TO DESIRED CYLINDER
* 
*         GO TO STEP 4
* 
          UJN    RDW20       TO READ, WRITE SECTOR
  
          EJECT 
  
**     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    WC          GET WORD COUNT 
          SBD    WT          SUBTRACT WORDS TRANMITTED
          ZJN    RDW17       IF ALL WORDS TRANSMITTED 
          LJM    RDW36       IF ALL DATA NOT TRANMITTED 
  
 RDW17    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    RDW24,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
  
**     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
  
**     6. REQUEST  AND  INPUT  GENERAL  STATUS TO DETERMINE IF THE
*         OPERATION COMPLETED SUCCESSFULY. IF  GENERAL  STATUS  IS
*         ZERO (NO ERROR), GO TO STEP 3.  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
          LDD    RDWRF       CHECK IF WRITE OR READ 
          ZJN    RDW35A      IF A READ
          LJM    RDW25A      IF A WRITE 
 RDW35A   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      ELSE ERROR EXIT
          UJN    RDW38
  
 RDW37    LDC    ER.DNA      ERROR EXIT 
 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       TO INPUT AFTER A CONTINUE
  
*         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 CM RESERVED BY ANOTHER ADAPTER
          SHN    2
          PJN    SEEK3       IF ADAPTER/CM/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 UNIT IS STILL BUSY AND 200 MSEC HAS NOT 
*         ELAPSED (ABORT WHEN TIME ELAPSES).
* 
          SHN    17D-CMRES
          MJN    SEEK7A 
          SHN    2
          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 
          LJM    SEEK5
  
 SEEK10   LDC    ER.UHB      AND ERROR EXIT 
 ERRDST   STD    D.T2 
          RJM    DST         GET DETAIL STATUS
          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
          EJECT 
 STATUS   TITLE  STATUS - GET GENERAL, DETAIL OR PROCESSOR STATUS.
**        STATUS - GET GENERAL, DETAIL OR PROCESSOR STATUS. 
* 
*                  STATUS GENERAL, ABT Z
*                  STATUS DETAIL, ABT Z 
*                  STATUS PROCESSOR, ABT Z
* 
*          GENERAL - INPUT 1 WORD OF GENERAL STATUS TO  SB(0).
*          DETAIL  - INPUT 20D WORDS OF DETAIL STATUS TO SB(1)-SB(20D)
*          PROCESSOR - INPUT 83D WORDS OF PROC STAT TO IB(0)-IB(82D)
* 
*         ENTRY  - (PA) = CODE)         0 = GENERAL 
*                                       1 = DETAIL
*                                       2 = PROCESSOR 
* 
*         EXIT   - (A)  = STATUS (IF GENERAL STATUS IS SELECTED)
*                  (SB), OR (SB 0-24) = STATUS OR DETAIL. 
* 
*                  ERRISR - ERROR EXIT IF INCOMPLETE STATUS RETURNED
* 
*         USES   - LF, P, D.T1, SB, WT
* 
*         CALLS  - ERA, TCC, STS, DST, FNC, FJM, IJM
* 
  
**     1. STORE 7777B INTO THE STATUS BUFFER FOR WORDS ABOUT TO BE RE 
* 
**     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, OR 24B).
* 
          LDD    PA          LOAD CODE
          NJN    STATUS3     IF DETAIL 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         SAVE LAST FUNCTION 
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          RJM    DST         GET DETAIL STATUS
 STATUS4  LJM    XENT        EXIT TO STACK
  
*         5.  STORE 7777B INTO ALL WORDS AND ISSUE PROCESSOR STATUS FUNC
  
 STATUS5  LDD    DC          GET DEVICE CODE
          ADC    -D895       DC FOR 895 
          NJN    STAT5A      IF NOT 895 
          UJN    STATUS4     IF 895, NOOP 
 STAT5A   LDC    123B 
          STD    D.T1 
 STATUS6  LCN    0
          STM    IB,D.T1
          SOD    D.T1 
          NJN    STATUS6     DO ALL WORDS 
          LDN    IPS         PROCESSOR STATUS FUNCTION
          RJM    FNC         SEND FUNCTION TO PROCESSOR 
          ACN    CH+40B 
          LDC    83D
          IAM    IB,CH       INPUT PROCESSOR STATUS 
          NJN    STATUS9
          RJM    IJM         WAIT FOR INACTIVE
          ZJN    ERRNIDT     IF CHANNEL ACTIVE
          SFM    ERCPE3,CH   CHECK FOR CH PARITY ERROR
          UJN    STATUS4     IF OK EXIT TO STACK
 ERRNIDT  LDC    ER.NIDT     ERROR NO INACTIVE AFTER DATA XFER
          UJN    ALCHK1 
  
 STATUS9  LJM    ERRISR      ERROR INCOMPLETE STATUS RETURNED TO PP 
          EJECT 
 ALCHK    TITLE  UTILITIES USED BY ISD PRODUCT OVERLAY. 
**        ALCHK - CHECKS ACCESS LEVEL 
* 
*         ENTRY - (D.T3) = ACCESS LEVEL NEEDED
* 
*         EXIT - ER.IAL - IF ACCESS LEVEL NOT VALID 
*                CALLING ROUTINE IF NO ERROR
* 
 ALCHKX   LJM    ** 
 ALCHK    EQU    *-1
          LDD    AL          GET ACCESS LEVEL FROM ASSIGN 
          SBD    D.T3 
          PJN    ALCHKX      ACCESS LEVEL HIGH ENOUGH EXIT
 ERRIAL   LDC    ER.IAL      ERROR AL NOT VALID 
 ALCHK1   UJN    BHI4        ERROR
          EJECT 
**        BHI - BUILD HEXIDECIMAL INSTRUCTIONS
* 
*         BUILD A SINGLE 16-BIT INSTRUCTION WHICH CONVERTS 12-BIT 
*         INSTRUCTIONS TO 16-BIT INSTRUCTIONS. THEN CONVERTS 12-BIT 
*         INSTRUCTIONS LISTED IN AN ADDRESS TABLE TO THEIR 16-BIT 
*         EQUIVALENT AND VERIFIES THAT ONE OF THE MODIFIED
*         INSTRUCTIONS HAS BIT 2**15 SET. 
* 
*         ENTRY- (A) = ADDRESS OF 16-BIT INSTRUCTION ADDRESS TABLE
* 
*         EXIT - BIT 2**15 OF EACH LISTED INSTRUCTION IS SET
*                ABORT IF INSTRUCTION NOT MODIFIED. 
* 
*         USES - D.Z1, D.Z2 
* 
*         CALLS- NONE 
* 
 BHI3     LDI    D.Z1        LOAD LAST MODIFIED 16-BIT INSTRUCTION
          SHN    -15
          NJN    BHIX        IF CORRECTLY MODIFIED
          LDC    ER.INER     IF INSTRUCTION MODIFICATION NOT PERFORMED
 BHI4     LJM    DST3 
  
 BHIX     LJM    ** 
 BHI      EQU    *-1         ENTRY/EXIT 
          LDM    BHI2        12-BIT STORE INDIRECT INSTRUCTION
          ADC    100000B     FORM EQUIVALENT 16-BIT INSTRUCTION 
          ACN    CH+40B 
          OAN    CH 
          LDN    1
          IAM    BHI2,CH     INPUT 16-BIT INSTRUCTION TO HEX ROUTINE
          DCN    CH+40B 
          LDC    HEXINST
          STD    D.Z2 
 BHI1     LDI    D.Z2 
          ZJN    BHI3        IF END OF TABLE
          STD    D.Z1 
          LDI    D.Z1        INSTRUCTION TO BE MODIFIED 
          LMC    100000B     SET BIT 2**15
 BHI2     STI    D.Z1        STORE MODIFIED INSTRUCTION 
          AOD    D.Z2 
          UJN    BHI1        READ NEXT TABLE ENTRY
          SPACE  4,10 
  
 HEXINST  CON    BHI3        TABLE FOR MODIFIED INSTRUCTIONS
          CON    DIAG6
          CON    DIAG5
          CON    DIAG3
          DATA   0
          EJECT 
**        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    DST6        IF NO INACTIVE RECEIVED
          SFM    ERCPE3,CH   CHECK FOR CH PARITY ERROR
          UJN    DST0        IF OK EXIT 
 DST6     LJM    ERRNIDT     ERROR NO INACTIVE AFTER DATA TRANSFER
  
 ERRISR   LDC    ER.ISR      ERROR INCOMPLETE STATUS RETURNED 
 DST7     UJN    EJM2 
          SPACE  4,22 
**        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 
          SPACE  4,21 
**        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
          SPACE  4,21 
**        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
          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 
          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 
          SPACE  4,29 
**        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 
          SPACE  4,22 
**        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 
          SPACE  4,49 
**        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 
          UJN    OPCX        AND EXIT 
  
 OPC5     LDD    D.T5 
          RJM    FNC         TO FUNCTION OPERATION COMPLETE 
          UJN    OPCX        EXIT 
          SPACE  4,39 
**        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    STS2        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  EQU    *
 STS2     LDC    ER.GSNR     ERROR IF NO FULL OR NO INACTIVE
  
 STS3     UJN    TCA1        JUMP TO ERR
  
          SPACE  4,18 
**        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     LJM    ERR
          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
          UJN    ERR         ERROR EXIT 
* 
* 
 ERCPE1   RJM    STS         TAKE GENERAL STATUS
 ERCPE2   RJM    DST         TAKE DETAILED STATUS 
 ERCPE3   LDC    ER.CPE      CHANNEL PARITY ERROR 
          EJECT 
**        ERR    - ERROR EXIT SUBROUTINE
* 
*         ENTRY  - (A) = MESSAGE ADDRESS INDEX
* 
*         EXIT   - (A) = ABORT ADDRESS FOR AN ABORT 
*                  (A) = LINE NUMBER FOR MODULE TERMINATE 
* 
*         USES   - D.Z1, D.Z2, EC, EM, EA 
* 
*         CALLS  - NONE 
* 
 ERR      STD    D.Z1        SAVE MESSAGE INDEX AND ERROR NUMBER
          SHN    -12
          STD    D.Z2        SAVE ABORT FLAG
          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    40B
 ERR2     LDD    D.Z1 
          LPN    77B         MASK ERROR CODE
          ADC    7000B       ADD IN BIAS FOR FSD2 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    6500B       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
 SERNUM1  EQU    SB+56B      FIRST HALF OF PACK SERIAL NUMBER 
 SERNUM2  EQU    SB+57B      SECND HALF OF PACK SERIAL NUMBER 
 SEEKTIM  EQU    SB+60B      LAST SEEK TIME 
 RESA     EQU    SB+64B      ITERATION COUNT FOR RES COMMAND
 LSB      EQU    64B         LENGTH OF STATUS BUFFER
  
          ERRPL  *-IB-1      ERROR IF ISD 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
 INIT0    LDN    0
          STM    SB,D.Z1     CLEAR STATUS BUFFER
          AOD    D.Z1 
          SBN    LSB
          NJN    INIT0       IF STATUS BUFFER NOT CLEARED 
          LDM    BD.SN
          STM    SERNUM1     SAVE USER SUPPLIED SERIAL NUMBER IN SB 
          LDM    BD.SN+1
          STM    SERNUM2
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS DEFINED
*         AT UPDATE TIME. THIS DEFINITION MEANS THAT THE ASSEMBLY WILL B
*         FOR THE NOSVE ENVIRONMENT.
* 
*         *IF DEF,MVE 
*IF DEF,MVE 
          LDM    BD.EQ
          LPN    77B
          STM    SB+63B      UNIT TO STATUS BUFFER
          LDD    DC 
          ADC    -D895
          NJN    INIT1       IF ISD DISK
          LDM    BD.EQ
          LPN    40B
          ZJN    INIT0.2     IF UN IS LESS THAN 40B 
 INIT0.1  LDC    INITB
          UJN    INIT0.3
 INIT0.2  LDM    BD.EQ
          SHN    -9 
          SBN    2
          MJN    INIT0.4     IF EQ IS LESS THAN 2 
          LDC    INITC
 INIT0.3  LJM    INIT11.1    EQ OR UN RANGE ERROR 
 INIT0.4  LDM    BD.EQ
          SHN    -4 
          LPN    40B         MASK FOR STORAGE DIRECTOR BIT
          RAM    SB+63B      ADD STORAGE DIRECTOR BIT TO ADDRESS
          UJN    INIT1.1
 INIT1    LDM    BD.EQ
          LPN    70B
          NJN    INIT0.1     IF INVALID UNIT NUMBER 
          LDM    BD.EQ
          SHN    -6 
          LPN    70B         MASK FOR CONTROL MODULE NUMBER 
          RAM    SB+63B 
 INIT1.1  STM    UN          SET UNIT NUMBER
*ENDIF
*         *ENDIF
**
  
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL MVE IS NOT DEFINED
*         AT UPDATE TIME.  THIS MEANS THAT THE ASSEMBLY WILL BE FOR THE NOS 
*         OR THE NOSBE ENVIRONMENT. 
* 
*         *IF -DEF,MVE
*IF -DEF,MVE
          LDM    BD.EQ
          LPN    77B
          STM    SB+63B      UNIT TO STATUS BUFFER
          STM    UN 
*ENDIF
*         *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
          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         MASK FOR CIO CHANNEL 
          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 
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS DEFINED
*         AT UPDATE TIME. THIS DEFINITION MEANS THAT THE ASSEMBLY WILL BE 
*         FOR THE NOSVE ENVIRONMENT.
* 
*         *IF DEF,MVE 
*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
*         *ENDIF
**
  
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL MVE IS NOT DEFINED
*         AT UPDATE TIME.  THIS MEANS THAT THE ASSEMBLY WILL BE FOR THE NOS 
*         OR THE NOSBE ENVIRONMENT. 
* 
*         *IF -DEF,MVE
*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
*         *ENDIF
**
  
*         SET DIRECT CELLS
  
          STD    WT          CLEAR WORDS TRANSMITTED REGISTER 
          STD    BA          CLEAR BEGINNING ADDRESS REGISTER 
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS NOT DEFINED
*         AT UPDATE TIME. THIS MEANS THAT THE ASSEMBLY WILL BE FOR THE NOS
*         OR NOSBE ENVIRONMENT. 
* 
*         *IF -DEF,MVE
*IF -DEF,MVE
          LDC    100D        100 MSEC DELAY IN BD.RCH 
          STM    DLYDCH      MODIFY DELAY USED ON CHANNEL DROP
*ENDIF
*         *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    -ISD1       TEST IF DEVICE CODE FOR ISD1 (110B)
          ZJN    INIT12 
          SBN    ISD2-ISD1
          ZJN    INIT13      IF ISD2 DEVICE CODE (111B) 
          SBN    D895-ISD2
          ZJN    INIT12      IF 895 DEVICE CODE (115B)
          LDC    INITA       (A) = POINTER TO ERROR MSG IF NO SUPPORT 
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS DEFINED
*         AT UPDATE TIME. THIS DEFINITION MEANS THAT THE ASSEMBLY WILL
*         BE FOR THE NOSVE ENVIRONMENT. 
* 
*         *IF DEF,MVE 
*IF DEF,MVE 
 INIT11.1 STM    INIT6.1
          STM    INIT9.1
          LJM    INIT5.3     PROCESS ERROR MESSAGE
*ENDIF
*         *ENDIF
**
 INIT12   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
 INIT13   LDC    MAXCDD2
          STM    FMAP1+1     MODIFY MAX CYLINDER IF ISD2
          LDN    0           RESET A REGISTER 
          UJN    INIT12      EXIT 
  
 INITA    DIS    ,*DEVICE CODE NOT SUPPORTED* 
*IF DEF,MVE 
 INITB    DIS    ,*UNIT NUMBER INVALID* 
 INITC    DIS    ,*EQUIPMENT NUMBER INVALID*
*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 STATUS RETURNED) 
          MMSG   ER.FPNA,EC.FPNA,(FUNC PARAMETERS NOT ACCEPTED) 
          MMSG   ER.DNA,EC.DNA,(ALL DATA NOT ACCEPTED FROM PP)
          MMSG   ER.IDR,EC.IDR,(INCOMPLETE DATA RETURNED TO PP) 
          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.DCSM,EC.DCSM,(DEVICE CODE/STATUS MISMATCH)
          MMSG   ER.NIDT,EC.NIDT,(NO INACTIVE AFTER DATA XFER)
          MMSG   ER.CPE,EC.CPE,(CHANNEL PARITY ERROR ON INPUT)
          MMSG   ER.INER,EC.INER,(IOU INSTRUCTION ERROR)
 MMSGL.   EQU    MMSGL
          DATA   0
****
 TCHAN    EQU    *           CREATE CHANNEL TABLE 
          LIST   D
          HERE
          LIST   *
          DATA   0           END OF CHANNEL TABLE 
  
          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 
  
          IFEQ   NOSBE,1,1
          ERRPL  *-7773B     ERROR IF ISD OVERLAY OVERFLOW
          QUAL   *
