*COMDECK,MSSMST 
          EJECT 
 5MT      SEGMENT POVLA 
          ORG    POVLA
          QUAL   MST
*CALL,VERS
          COMMENT MST PRODUCT OVERLAY FOR MALET "VERS"
          TITLE  HIGH LEVEL MST TAPE PRODUCT OVERLAY FOR MALET. 
  
*CALL,CPYCOM
          SPACE  4,20 
*****     5MT -  MSF MST HIGH LEVEL LANGUAGE OVERLAY DRIVER FOR MALET.
* 
*         AUTHOR  E. L. HARMON 5/27/77. 
*                 ENGINEERING SERVICES. 
*                 MAINTENANCE SOFTWARE ENGINEERING. 
* 
*         5MT IS THE OVERLAY CALLED BY THE PP PROGRAM *MLD* TO EXECUTE
*         THE MALET MSF MASS STORAGE TRANSPORT HIGH LEVEL COMMANDS. 
          SPACE  4,10 
***       5MT IS THE OVERLAY CALLED BY THE PP PROGRAM *MLD* TO EXECUTE
*         THE MALET MSF MASS STORAGE TRANSPORT HIGH LEVEL COMMANDS. 
          SPACE  4,10 
**        THE FOLLOWING MALET COMMANDS ARE SUPPORTED BY THE *MST* 
*         PRODUCT OVERLAY.  ALL COMMANDS MAY BE EXECUTED WITH AN ACCESS 
*         LEVEL OF 00.
* 
*          ADVANCE        - RELEASE THE CARTRIDGE IN ISD STATION "C". 
*          BKSP           - MOVE TAPE BACKWARDS TO THE NEXT IBG.
*          EXTEND IBG     - EXTEND THE IBG BY .07 INCHES. 
*          FORSP          - MOVE TAPE FORWARD TO THE NEXT IBG.
*          LOAD           - THE CARTRIDGE IN ISD STATION "C" IS LOADED. 
*          LOOPBK         - LOOP DATA THROUGH THE SPECIFIED AREA. 
*          NOOP           - ISSUE THE NOOP IMMEDIATE TAG TO THE MSA.
*          PREPARE MST    - ISSUE A PREPARE COMMAND TO THE MST. 
*          READ           - INPUT THE NEXT DATA BLOCK TO IB.
*          REL            - DISCONNECT COUPLER AND DROP THE CHANNEL.
*          RES            - RESERVE CHANNEL AND CONNECT COUPLER.
*          REWIND         - POSITION TAPE TO BOS OF THE CURRENT STREAM. 
*          RSET           - PERFORM A SYBSYSTEM RESET.
*          SEEK LOADPOINT - POSITION THE TAPE TO BOS OF STREAM 0. 
*          SEEK RESERVE   - RESERVE THE SELECTED DEVICE TO THIS MSA.
*          SEEK RELEASE   - RELEASE THE DEVICE FROM MSA RESERVATION.
*          SEEK STREAM X  - POSITION THE R/W HEAD TO A SPECIFIC STREAM. 
*          SENSE MST      - REQUEST MSA AND  MST/CSU SENSE INFORMATION. 
*          SET ERP        - SET ERROR RECOVERY PROCEDURE. 
*          SKIP           - SKIP A SPECIFIED NUMBER OF BLOCKS FWD/REV.
*          STATUS         - REQUEST A SPECIFIED COUPLER STATUS WORD.
*          UNLOAD         - UNLOAD THE CARTRIDGE FROM THE ASSIGNED MST. 
*          WRITE          - WRITE ONE DATA BLOCK ON TAPE. 
*          WRITE TM       - WRITE A TAPE MARK DATA BLOCK. 
          SPACE  4,10 
**        DEFINE THE VERSION LEVEL. 
* 
*         MALET AND ALL THE PRODUCT OVERLAYS MUST HAVE MATCHING VERSION 
*         LEVELS.  THIS VERSION LEVEL IS CHECKED BY *MLD* WHEN THE
*         OVERLAY IS LOADED AND THE JOB TERMINATED IF THE VERSION LEVEL 
*         DOES NOT MATCH THE VERSION OF *MLD*.
  
 VER      MICRO  1,,*1*      VERSION LEVEL
          SPACE  4,10 
**        DEFINE THE OVERLAY NAMES. 
  
 WOV      MICRO  1,,*5MW*    WRITE OVERLAY
 ROV      MICRO  1,,*5MR*    READ OVERLAY 
 SOV      MICRO  1,,*5MS*    SENSE OVERLAY
  
          TITLE  ASSEMBLY CONSTANTS.
**        ASSEMBLY CONSTANTS. 
  
 IBL      EQU    216B        LENGTH OF INPUT BUFFER 
 OBL      EQU    220B        LENGTH OF OUTPUT BUFFER
 SBL      EQU    100B        LENGTH OF STATUS BUFFER
 DLU      EQU    12          DATA LENGTH UPPER  IN *IB/OB*
 DLL      EQU    DLU+1       DATA LENGTH LOWER  IN *IB/OB*
 HACRL    EQU    14          LENGTH OF THE HA AND COUNT FIELDS (READ) 
 HACWL    EQU    HACRL+2     LENGTH OF THE HA AND COUNT FIELDS (WRITE)
 NSBY     EQU    40          NUMBER OF 8-BIT SENSE BYTES
 OBDL     EQU    OBL-HACWL   LENGTH OF DATA FIELD IN *OB* 
 ROC      EQU    6           BEGINING OF RO COUNT FIELD IN *IB/OB*
 RODR     EQU    HACRL       BEGINING OF RO DATA FIELD IN *IB* (READ) 
 RODW     EQU    HACWL       BEGINING OF RO DATA FIELD IN *OB* (WRITE)
 SNS      EQU    26B         BEGINING OF SENSE DATA IN *SB* 
 .SNSL    EQU    NSBY+1 
 SNSL     EQU    .SNSL*8/12+1 LENGTH OF SENSE DATA FIELD IN 12-BIT BYTES
 SNSTL    EQU    SNSL+HACRL  TOTAL LENGTH OF SENSE (HA, COUNT, DATA)
  
 HH40     EQU    4000B       FLAG APPENDED TO *CC* WHEN *HH* = 40 HEX 
 DEV      EQU    7           DEFAULT DEVICE ADDRESS 
 MSA      EQU    6           DEFAULT MSA ADDRESS
 CC       EQU    222B        DEFAULT CYLINDER ADDRESS = NOOP
 HH       EQU    100B        DEFAULT HEAD ADDRESS     = NOOP
  
**        MSF SEQUENCE CODES. 
* 
*         THIS CODE IS STORED IN *SEQN* UPON INITIAL ENTRY IN A MSF 
*         SEQUENCE TO DEFINE THE SEQUENCE BEING EXECUTED IN THE EVENT 
*         OF AN ERROR.  IF AN ERROR IS DETECTED, THIS CODE IS ADD ADDED 
*         TO THE ERROR CODE.
*               ERROR CODE (EC) BITS- 
*                            11--6 = SEQUENCE CODE. 
*                            05--0 = ERROR CODE.
  
 SQCIS    EQU    1           CPU INITIATED SELECTION SEQUENCE 
 SQERS    EQU    2           ERROR SEQUENCE 
 SQIPS    EQU    3           IDLE POLL SEQUENCE 
 SQRDS    EQU    4           READ SEQUENCE
 SQSEK    EQU    5           SEEK SEQUENCE
 SQSIS    EQU    6           SUBSYSTEM SELECTION SEQUENCE 
 SQSRS    EQU    7           SYSTEM RESET SEQUENCE
 SQUES    EQU    8           IDLE POLL SEQUENCE 
 SQWTS    EQU    9           WRITE SEQUENCE 
 SQRSN    EQU    10          READ SENSE SEQUENCE
          SPACE  4,12 
**        ERROR CODES - FIRST 7 ARE FOR BASIC DRIVER. 
  
 EC.FLE   EQU    1           ADDRESS OUT OF FIELD LENGTH
 EC.TL    EQU    2           TIME LIMIT ERROR FOR COMMUNICATIONS
 EC.SEE   EQU    3           SUBROUTINE ENTRY/EXIT ERROR
 EC.WC    EQU    4           BUFFER REFERENCE OR WC ERROR 
 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.AAD   EQU    10B         CHANNEL ACTIVE AFTER DEACTIVATE
 EC.AAF   EQU    11B         CHANNEL ACTIVE AFTER A FUNCTION
 EC.ABF   EQU    12B         CHANNEL ACTIVE BEFORE A FUNCTION 
 EC.CNC   EQU    13B         COUPLER NOT CONNECTED
 EC.FBO   EQU    14B         CHANNEL FULL BEFORE OUTPUT 
 EC.FPN   EQU    15B         FUNCTION PARAMETER NOT ACCEPTED
 EC.IAA   EQU    16B         CHANNEL INACTIVE AFTER AN ACTIVATE 
 EC.IAI   EQU    17B         CHANNEL INACTIVE AFTER AN INPUT
 EC.BPX   EQU    20B         BUFFER TO PP XFER ERROR
 EC.PBX   EQU    21B         PP TO BUFFER XFER ERROR
 EC.NFI   EQU    22B         NO FULL ON AN INPUT
 EC.MRE   EQU    23B         MSA RESET DID NOT CLEAR SA1
 EC.COV   EQU    24B         PRS-CONSTANT OVERFLOW (BA)=ADR 
  
 EC.BSY   EQU    30B         MSA BUSY 
 EC.TRE   EQU    31B         TAG RESPONCE ERROR 
 EC.CK2   EQU    32B         CHECK 2 ERROR
 EC.DSE   EQU    33B         DEVICE STATUS ERROR
 EC.NDI   EQU    34B         NO DEVICE INTERRUPT
 EC.BAI   EQU    35B         MSA/DEV BSY AFTER INT
 EC.HIF   EQU    36B         CK2 OR HOT INTERFACE 
 EC.ICH   EQU    37B         INVALID CC OR HH 
 EC.ITO   EQU    40B         INDEX TIME-OUT 
 EC.IXD   EQU    41B         INDEX DID NOT DROP 
 EC.I36   EQU    42B         INVALID 3 OF 6 CODE
 EC.XLE   EQU    43B         XFER LENGTH ERROR
 EC.SA1   EQU    44B         SELECT ALERT 1 
 EC.WTO   EQU    45B         WRITE TIME-OUT 
 EC.WER   EQU    46B         WRITE ERROR
 EC.FSI   EQU    47B         FIRST SYNC IN T/O
 EC.NCL   EQU    50B         NE+CK2+LAST SYNC IN T/O
 EC.STE   EQU    51B         STATUS ERROR 
          SPACE  4,20 
**        DIRECT CELL EQUATES.
  
          IFEQ   NOS,1
 D.SX0  = 60B 
 D.SX1  = D.SX0+1 
 D.SX2  = D.SX0+2 
 D.SX3  = D.SX0+3 
 D.SX4  = D.SX0+4 
 D.SX5  = D.SX0+5 
 D.SX6  = D.SX0+6 
 D.SX7  = D.SX0+7 
          ENDIF 
  
 PA       EQU    D.T0        SUBROUTINE ENTRY PARAMETERS
 SEQN     EQU    D.SX0       CODE DEFINING THE SEQUENCES, *SQX EQU  X * 
 ABTL     EQU    D.SX1       LOWER 12 BITS OF ABT ADDRESS 
 ABTU     EQU    D.SX2       UPPER 6 BITS OF ABT ADDRESS
 S3       EQU    D.SX3       TEMP STORAGE 
 S4       EQU    D.SX4       TEMP STORAGE 
 LTST     EQU    D.SX5       LAST TAG STATUS
 EDI      EQU    D.SX6       EXPECTED DEVICE INTERRUPT FLAG 
 RIF      EQU    D.SX7       RESET INTERRUPT FLAG 
          SPACE  4,20 
****      COUPLER FUNCTION CODES
  
 FCONN    EQU    1           CONNECT
 FDISC    EQU    2           DISCONNECT 
 FCLR     EQU    3           CLEAR
 FCSTS    EQU    4           COUPLER STATUS WORD
 FCTLS    EQU    24B         CTL STATUS WORD
 FPERS    EQU    104B        PARITY ERROR STATUS WORD 
 FIWCS    EQU    44B         INPUT WORD COUNTER STATUS WORD 
 FOWCS    EQU    64B         OUTPUT WORD COUNTER STATUS WORD
 FBWCS    EQU    124B        BUFFER WORD COUNTER STATUS WORD
 FDSH     EQU    6           DROP SELECT HOLD 
 FSBWC    EQU    10B         SET BUFFER WORD COUNTER
 FDAM     EQU    11B         DISABLE CTL R/W AUTO MODE
 FEAM     EQU    12B         ENABLE CTL R/W AUTO MODE 
 FZPTY    EQU    13B         SET ZERO OR INVERTED PARITY MODE 
 FWTBM    EQU    14B         WRITE DATA TO BUFFER MEMORY
 FRDBM    EQU    15B         READ DATA FROM BUFFER MEMORY 
 FSIWC    EQU    16B         SET INPUT WORD COUNTER 
 FSOWC    EQU    17B         SET OUTPUT WORD COUNTER
 FLBK     EQU    600B        LOOP BACK
  
****
          SPACE  4,20 
**        COUPLER STATUS. 
  
 FPE      EQU    4000B       FORCED PARITY ERROR
 DMTO     EQU    2000B       DEAD MAN TIME OUT
 DL0      EQU    1000B       DATA LENGTH EQUAL ZERO 
 BUR      EQU    0400B       BUFFER UNDERRUN
 BOR      EQU    0200B       BUFFER OVERRUN 
 PTYER    EQU    0100B       PARITY ERROR 
 SELH     EQU    0040B       SELECT HOLD
 DINB     EQU    0004B       DATA IN BUFFER 
 RWIP     EQU    0001B       READ/WRITE IN PROGRESS 
  
**        COUPLERS CTL STATUS.
  
 SELA     EQU    4000B       SELECTIVE ACTIVE 
 TM       EQU    2000B       TAPE MARK
 SYNCI    EQU    1000B       SYNC-IN
 HOTIF    EQU    0400B       HOT INTERFACE
 CK2      EQU    0200B       CHECK 2
 SA1      EQU    0100B       SELECT ALERT 1 
 USA2     EQU    0040B       UNLATCHED SELECT ALERT 2 
 LSA2     EQU    0020B       LATCHED SELECT ALERT 2 
 LSIET    EQU    0010B       LAST SYNC-IN TO NORMAL END TIMEOUT 
 FSYIN    EQU    0004B       FIRST SYNC-IN
 TV       EQU    0002B       TAG VALID
 NE       EQU    0001B       NORMAL END NOT 
  
**        MSF TAG RESPONCE STATUS BITS. 
  
 TSNE     EQU    4000B       TAG STATUS NORMAL END
 TSSA1    EQU    2000B       TAG STATUS SELECT ALERT 1
 TSSA2    EQU    1000B       TAG STATUS SELECT ALERT 2
 TSTV     EQU    0400B       TAG STATUS TAG VALID 
  
**        MSF STATUS BITS.
  
 ATTN     EQU    0004B       ATTENTION
 DEVCK    EQU    0040B       DEVICE CHECK 
 DBSY     EQU    0002B       DEVICE BUSY
 DRTI     EQU    0040B       DEVICE RESERVED THIS INTERFACE 
 DROI     EQU    0010B       DEVICE RESERVED OTHER INTERFACE
 LBSY     EQU    0020B       LONG BUSY (PARTIAL CONNECTION) 
 ONLN     EQU    0010B       ON LINE
 PINT     EQU    0200B       PRIMED INTERRUPT 
 PKCHI    EQU    0100B       PACK CHANGE INTERRUPT
 RWVLD    EQU    0010B       READ/WRITE VALID 
 SBSY     EQU    TSSA2       SHORT BUSY (SAME AS *TSSA2*) 
 SKC      EQU    0020B       SEEK COMPLETE
          SPACE  4,20 
**        TAG RESPONCE COMPARE BITS.
* 
*         THESE FLAG BITS ARE APPENDED TO THE TAG WORD. 
*         SUBROUTINE *STG* WILL MASK THE TAG RESPONCE WITH THESE BITS 
*         AND REPORT A *TAG RESPONCE ERROR* IF THE RESULT OF THE MASK 
*         IS NON-ZERO.
  
 CE       EQU    TSNE 
 C1       EQU    TSSA1
 C2       EQU    TSSA2
 CV       EQU    TSTV 
 SH       EQU    100B        SELECT HOLD BIT
          SPACE  4,10 
**        TAG MODIFIER FLAG BITS. 
* 
*         THE FOLLOWING FLAG BITS MAY BE APPENDED TO THE TAG MODIFIER.
*         THESE FLAG BITS WILL BE INTERPRETED BY SUBROUTINE *STG*.
  
 NRC      EQU    4000B       DO NOT CHECK TAG RESPONCE FLAG 
 SBI      EQU    2000B       STORE BUS IN FLAG
 LNK      EQU    1000B       TAG LINKED FLAG
 ND       EQU    0400B       DO NOT DCN THE CHANNEL AFTER ISSUING A TAG 
          SPACE  4,12 
**        MSF IMMEDIATE TAGS AND TAG MODIFIERS. 
*         THE *TXXXX* SYMBOLS DEFINE THE TAGS AND THE *MXXXX* SYMBOLS 
*         DEFINE THE VALID TAG MODIFIERS FOR THE PRECEEDING TAG.  WHEN
*         A MODIFIER REQUIRES A MSA AND/OR DEVICE ADDRESS THE TAG IS
*         FOLLOWED BY A *VFD* INDICATING WHICH BITS THE ADDRESS IS
*         PLUGED INTO.
  
 TERBY    EQU    304B        TAG 04 - ERROR BYTES 
 MCK19    EQU    004B        MSA CHECK 19 
 MDVAD    EQU    020B        DEVICE ADDRESS 
  
 TSWCL    EQU    306B        TAG 06 - STRING SWITCH CONTROL 
*         VFD    4/0,3,TM,2/0,3/DEV    TM =ONE OF THE FOLLOWING *MXXXX* 
                                       DEV=DEVICE ADDRESS 
 MSRDV    EQU    300B        SET   RESERVE DEVICE 
 MCRDV    EQU    100B        CLEAR RESERVE DEVICE 
 MSDEI    EQU    240B        SET   PRIME DEVICE END INTERRUPT 
 MCDEI    EQU    040B        CLEAR PRIME DEVICE END INTERRUPT 
 MSTAT    EQU    000B        REQUEST STRING SWITCH STATUS 
  
 TSTSW    EQU    307B        TAG 07 - STRING SWITCH 
 MRLCN    EQU    120B        RESET LONG CONNECTION, ENB/DISABLE LATCH 
 MSLCN    EQU    120B        SET   LONG CONNECTION, ENB/DISABLE LATCH 
  
 TXTCL    EQU    311B        TAG 09 - TRANSMIT CONTROL
 MMSAR    EQU    200B        MSA RESET
 MRCHK    EQU    100B        RESET CHECK
 MSPLO    EQU    002B        START PLO LOCK IN
 MEPLO    EQU    001B        END   PLO LOCK IN
  
 TODWN    EQU    313B        TAG 0B - OPERATE DOWN
 MNSQL    EQU    040B        NOT SQUELCH
 MHSEL    EQU    020B        HEAD SELECT
 MRSEL    EQU    002B        READ SELECT
  
 TPOLL    EQU    242B        TAG 82 - POLL DEVICE 
*         VFD    4/0,3/MSA,2/0,3/MPOLD MSA = MSA ADDRESS
 MPOLD    EQU    001B        POLL DEVICE
  
 TSELD    EQU    343B        TAG 83 - SELECT DEVICE 
*         VFD    4/0,3/MSA,2/0,3/DEV   MSA = MSA ADDRESS
*                                      DEV = DEVICE ADDRESS 
  
 TDVST    EQU    344B        TAG 84 - REQUEST DEVICE STATUS 
  
 TRQAD    EQU    345B        TAG 85 - REQUEST ADDRESS (CC/HH) 
 MRDHH    EQU    010B        REQUEST HEAD ADDRESS (HH)
 MRDCC    EQU    004B        REQUEST CYLINDER ADDRESS (CC)
  
 TXTCC    EQU    346B        TAG 86 - TRANSMIT CYLINDER ADDRESS (CC)
*         VFD    4/0,8/CC    CC = CYLINDER ADDRESS
  
 TXTHH    EQU    347B        TAG 87 - TRANSMIT HEAD ADDRESS (HH)
*         VFD    4/0,8/HH    HH = HEAD ADDRESS
  
 TXCL1    EQU    351B        TAG 89 - TRANSMIT CONTROL 1
 MSTSK    EQU    020B        START SEEK 
 MRINT    EQU    001B        RESET INTERRUPT
  
 TOPUP    EQU    353B        TAG 8B - OPERATE UP
*         MODIFIERS ARE THE SAME AS FOR *TODWN* TAG 
  
 TDPDR    EQU    356B        TAG 8E - DUAL PATH DEVICE RESERVE
 MRESD    EQU    200B        RESERVE DEVICE 
 MRELD    EQU    100B        RELEASE DEVICE 
          SPACE  4,12 
**        MSF EXTENDED TAGS AND TAG MODIFIERS.
  
 TREAD    EQU    316B        TAG 0E - READ
 MHA      EQU    107B        HOME ADDRESS FIELD 
 MROC     EQU    002B        RO COUNT FIELD 
 MROD     EQU    003B        RO DATA FIELD
  
 TWRIT    EQU    317B        TAG 0F - WRITE 
*         MODIFIERS ARE THE SAME AS FOR *TREAD* TAG 
          SPACE  4,20 
**        STATUS BUFFER (SB) POINTERS.
  
 CSW      EQU    0           COUPLER STATUS WORD
 CTLSW    EQU    1           COUPLERS CTL STATUS WORD 
 PESW     EQU    2           COUPLERS PARITY ERROR STATUS WORD
 IWC      EQU    3           COUPLERS INPUT WORD COUNTER
 OWC      EQU    4           COUPLERS OUTPUT WORD COUNTER 
 BWC      EQU    5           COUPLERS BUFFER WORD COUNTER 
 CON      EQU    6           COUPLERS CONNECT STATUS
  
 WTO      EQU    7           COLLECTION OF VARIOUS FLAGS
*                             2**10=TM STATUS 
*                             2**0 =ODD/EVEN NO. 12-BIT WORDS XFERED
*                                   2**0=ZERO=EVEN
*                                   2**0=ONE =ODD 
 LT       EQU    10B         LAST TAG ISSUED TO THE MSA 
 LTM      EQU    LT+1        LAST TAG MODIFIER
 LTS      EQU    LT+2        LAST TAG STATUS (BUS IN) 
 LDS      EQU    LT+3        LAST DEVICE STATUS 
 LCCXT    EQU    LT+4        LAST CC TRANSMITTED
 LCCBI    EQU    LT+5        LAST CC BUS IN 
 LCCRD    EQU    LT+6        LAST CC READ (85 TAG)
 LHHXT    EQU    LT+7        LAST HH TRANSMITTED
 LHHBI    EQU    LT+10B      LAST HH BUS IN 
 LHHRD    EQU    LT+11B      LAST HH READ (85 TAG)
 CK19     EQU    LT+12B      MSA CHECK 19 
 ERCC     EQU    LT+13B      CC READ IN ERROR SEQUENCE
 ERHH     EQU    LT+14B      HH READ IN ERROR SEQUENCE
  
 SENS     EQU    SNS         BEGINING OF THE SENSE DATA 
          SPACE  4,5
**        DEVICE CODES SUPPORTED. 
  
 DMST     EQU    100B        MASS STORAGE TRANSPORT 
          TITLE  LOCAL MACROS.
**        ERROR MESSAGES - WRITTEN TO CM DURING INITIALIZATION. 
* 
*         MMSG MARCO. 
* 
*         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
          TITLE  MST PRODUCT OVERLAY. 
 START    LJM    *           ENTRY POINT FOR OVERLAY INITIALIZATION 
          LJM    INIT 
  
          VFD    12/IB       FWA OF INPUT BUFFER
          VFD    12/OB       FWA OF OUTPUT BUFFER 
          VFD    12/SB       FWA OF STATUS BUFFER 
          VFD    12/IBL      LENGTH OF INPUT BUFFER 
          VFD    12/OBL      LENGTH OF OUTPUT BUFFER
          VFD    12/SBL      LENGTH OF STATUS BUFFER
          VFD    12/BD.VERS  VERSION NUMBER 
          SPACE  4,20 
**        FIXED ADDRESS TABLE OF SUBROUTINE ENTRY POINTS. 
*         THIS TABLE MUST REMAIN IN THE SAME SEQUENCE AS THE COMMANDS 
*         ARE DEFINED WITHIN THE *MALET* COMPILER.  THE COMPILER
*         COMPILES RETURN JUMPS TO THE COMMAND VIA THIS TABLE.
  
 XREL     LJM    *
          LJM    REL         DROP SELECT HOLD AND THE CHANNEL 
 XRES     LJM    *
          LJM    RES         RESERVE THE CHAN AND CONNECT THE COUPLER 
 XCMDZ    LJM    *
          LJM    CMDZ        EXECUTE COMMAND DEFINED BY CODE IN (PA)
 XLOBK    LJM    *
          LJM    LOBK        LOOP-BACK COMMAND
 XREAD    LJM    *
          LJM    READ        READ A DATA BLOCK FROM THE ASSIGNED MST
 XRESET   LJM    *
          LJM    SRS         EXECUTE SUBSYSTEM RESET SEQUENCE 
 XRWD     LJM    *
          LJM    RWD         REWIND TAPE
 XSEEK    LJM    *
          LJM    SEEK        SEEK STREAM
 XSENSE   LJM    *
          LJM    SENSE       READ SENSE 
 XSKIP    LJM    *
          LJM    SKIP        SKIP *X* BLOCKS FWD/REV
 XSTATUS  LJM    *
          LJM    STATUS      INPUT ALL COUPLER STATUS WORDS 
 XWRITE   LJM    *
          LJM    WRITE       TRANSMIT DATA TO THE MSA AS DEFINED BY 
*                            THE CODE IN PA.
*                             (PA)     OPERATION
*                               0 = WRITE TM. 
*                               1 = SET ERP MODE AND WRITE 7 BYTES OF 
*                                   DATA FROM OB DATA FIELD.
*                               2 = WRITE A DATA BLOCK ON TAPE. 
          SPACE  4,18 
**        REL -  RELEASE THE I/O CHANNEL. 
* 
*         CLEAR  THE  COUPLER AND RELEASE THE I/O CHANNEL TO THE SYSTEM 
*         IF ASSIGNED.  CALL BD.DCH TO FORCE  COMMUNICATIONS  WITH  THE 
*         CPU EXECUTIVE.  THIS COULD CAUSE THE PPU DRIVER TO CHECKPOINT 
*         AND DROP IF THE DROP OR CHECKPOINT  FLAGS  ARE  ON  FROM  THE 
*         EXEC.   IF  ERROR FLAGS ARE SET AT OUR CONTROL POINT, THE PPU 
*         DRIVER IS DROPPED ALSO. 
* 
*         ENTRY  (A) = ABORT ADDRESS. 
* 
*         EXIT   SB+6 = CONNECT STATUS. 
*                CCNF - CLEARED.
* 
*         USES   ABTL, ABTU.
* 
*         CALLS  BD.DCH, DEQ. 
  
 REL      STD    ABTL        SAVE ABT ADDRESS 
          SHN    -12
          STD    ABTU 
          LDM    BD.CHFG
          ZJN    REL1        IF NOT CURRENTLY ASSIGNED
          LDC    REL0        SET ABT ADDRESS FOR SEEK RELEASE 
          STM    RESA        SET ABT ADDRESS FOR SEEK REL ABT 
          RJM    SEK
          CON    0#96+HH40
 REL0     LDN    0
          STM    RESA        CLEAR ABORT RETURN ADDRESS 
          RJM    DEQ
  
 REL1     RJM    BD.DCH      DROP CHANNEL/TALK TO SYSTEM AND EXEC 
          LJM    XREL        EXIT TO CALLER 
          SPACE  4,18 
**        RES - RESERVE THE I/O CHANNEL AND CONNECT COUPLER.
* 
*         ENTRY  (A) = ABORT ADDRESS. 
* 
*         EXIT   I/O CHANNEL ASSIGNED.
*                CCNF - SET, NON-ZERO.
* 
*         USES   ABTL, ABTU.
* 
*         CALLS  CEQ, ICM.
  
 RES      RJM    ICM         INITIALIZE COMMAND 
          RJM    CEQ         CONNECT EQUIPMENT
          LDC    XRES 
          STM    RESA        SET ABT ADDRESS FOR FOR SEEK RES ABORT 
          RJM    SEK
          CON    0#98+HH40
          LJM    XRES        EXIT TO STACK
 RESA     DATA   0
          SPACE  4,20 
**        CMDZ - EXECUTE THE COMMAND DEFINED BY THE CODE IN PA. 
* 
*         ENTRY  (A) = ABORT LOCATION.
*                (PA)= COMMAND CODE AS FOLLOWS, 
*                       0 = ADVANCE 
*                       1 = BACKSPACE 
*                       2 = EXTEND IBG
*                       3 = FORESPACE 
*                       4 = LOAD
*                       5 = NOOP
*                       6 = SEEK LOADPOINT
*                       7 = UNLOAD
*                      10 = DATA SECURITY ERASE 
* 
*         EXIT   NONE.
* 
*         USES   NONE.
* 
*         CALLS  CCN, SEK.
  
 CMDZ     RJM    CCN         SAVE ABORT ADDRESS, CHECK COUPLER
*                            CONNECTED FLAG.
          LDD    PA 
          SBN    TCMDL
          MJN    CMD1       IF WITHIN RANGE 
          LJM    ERRWC
  
 CMD1     LDM    TCMD,PA    GET THE CC/HH CORRESPONDING TO THE COMMAND
          STM    CMD2 
          RJM    SEK        ISSUE THE COMMNAND
 CMD2     CON    ** 
          LJM    XCMDZ      RETURN TO THE STACK 
          SPACE  4,20 
** TCMD - TABLE OF MSF COMMANDS (CC AND HH ADDRESSES).
  
 TCMD     EQU    *
          LOC    0
          CON    0#88+HH40  ADVANCE 
          CON    0#85+HH40  BACKSPACE 
          CON    0#8D+HH40  EXTEND
          CON    0#84+HH40  FORESPACE 
          CON    0#80+HH40  LOAD
          CON    0#92+HH40  NOOP
          CON    0#8C+HH40  SEEK LOADPOINT
          CON    0#81+HH40  UNLOAD
          CON    0#82+HH40  DATA SECURITY ERASE 
          LOC    *O 
 TCMDL    EQU    *-TCMD     LENGTH OF COMMAND TABLE 
          SPACE  4,20 
          SPACE  4,20 
**        LOBK - LOOP BACK COMMAND. 
* 
*         ENTRY  (PA) = CODE DEFINING THE TYPE OF LOOP BACK.
*                            0 = MSA
*                            1 = CTL
*                            2 = DLI
*                 3 OR GREATER = COUPLER
* 
*         EXIT   NONE.
* 
*         USES   D.T0.
* 
*         CALLS  CCN, DCN, FTN, ISW, OFP, SEK, RDS, WTS.
  
 LOBK     RJM    CCN         SAVE ABORT ADDRESS, CHECK COUPLER
*                            CONNECTED FLAG.
          LDD    PA 
          SBN    TLOBKL 
          MJN    LOB1        IF A MSF LOOP-BACK 
          LDC    FLBK 
          RJM    FTN         SET LOOP-BACK MODE 
          LDM    OB 
          RJM    OFP         OUTPUT PARAMETER 
          RJM    ISW         INPUT RESPONCE 
          STM    IB 
          RJM    DCN
          UJN    LOB2        RETURN 
  
 LOB1     LDM    TLOBK,PA 
          STM    LOBCC
          RJM    SEK
 LOBCC    CON    ** 
          LDN    1
          STM    WTSQF       SET LOOPBACK FLAG
          LDC    3R"WOV"
          RJM    EXR         LOAD AND EXECUTE THE WRITE OVERLAY 
          LDC    3R"ROV"
          RJM    EXR         LOAD AND EXECUTE THE READ OVERLAY
 LOB2     LJM    XLOBK       RETURN TO THE STACK
  
 TLOBK    EQU    *
          LOC    0
          CON    0#95+HH40   MSA LOOP BACK
          CON    0#94+HH40   CTL LOOP BACK
          CON    0#89+HH40   DLI LOOP BACK
          LOC    *O 
 TLOBKL   EQU    *-TLOBK     LENGTH OF LOOP BACK COMMAND TABLE
          SPACE  4,20 
**        READ - READ COMMAND.
* 
*         READ ONE DATA BLOCK FROM TAPE INTO *IB*.  IF THE DATA BLOCK 
*         IS GREATER THAN *IBL* (INPUT BUFFER LENGTH), ONLY *IBL* WORDS 
*         ARE TRANSFERED TO THE INPUT BUFFER.  THE NUMBER OF 24-BIT 
*         WORDS TRANSFERED INTO THE COUPLERS MEMORY IS STORED IN THE
*         *WT* REGISTER.  *SB(7)* WILL BE ZERO IF AN EVEN (NON-ZERO IF
*         ODD) NUMBER OF 12-BIT WORDS WERE TRANSFERED TO THE COUPLERS 
*         MEMORY. 
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   NONE.
* 
*         CALLS  CCN, EXR.
  
 READ     RJM    CCN         SAVE ABORT ADDRESS, CHECK COUPLER
*                            CONNECTED FLAG.
          LDC    3R"ROV"
          RJM    EXR         LOAD AND EXECUTE THE READ OVERLAY
          LJM    XREAD       EXIT TO THE STACK
          SPACE  4,20 
**        RWD -  REWIND COMMAND.
* 
*         POSITION THE TAPE TO *BOS* OF THE CURRENT STREAM. 
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   NONE.
* 
*         CALLS  CCN, SEK.
  
 RWD      RJM    CCN         SAVE ABORT ADDRESS, CHECK COUPLER
*                            CONNECTED FLAG.
          RJM    SEK
          CON    0#0         CC ADDRESS 
          CON    0#0         HH ADDRESS 
          LJM    XRWD        RETURN TO THE STACK
          SPACE  4,20 
**        SEEK - SEEK STREAM COMMAND. 
* 
*         POSITION THE HEAD TO THE SPECIFIED STREAM, TAPE WILL BE 
*         POSITIONED AT *BOS* OF THIS STREAM. 
* 
*         ENTRY  (PA) = STREAM NUMBER.
* 
*         EXIT   NONE.
* 
*         USES   NONE.
* 
*         CALLS  CCN, SEK.
  
 SEEK     RJM    CCN         SAVE ABORT ADDRESS, CHECK COUPLER
*                            CONNECTED FLAG.
          LDD    PA          GET STREAM NUMBER
          STM    SEE1 
          RJM    SEK
 SEE1     CON    ** 
          CON    0#10 
          LJM    XSEEK       RETURN TO THE STACK
          SPACE  4,20 
**        SENSE- SENSE COMMAND. 
* 
*         READ THE MSFS SENSE FROM THE ASSIGNED MSA/DEVICE. 
*         THE SENSE DATA WILL BE UNPACKED AND STORED IN THE STATUS
*         BUFFER (SB+SNS),  8-BIT SENSE BYTE PER 12-BIT WORD AS 
*         INDICATED INDICATED BELOW.
* 
*                SB+SNS+0  - BITS 11-0 OF RO COUNT DATA LENGTH (DLL). 
*                      +1  - ID BYTE (19 HEX / 31 OCT). 
*                      +2  - MSA SENSE BYTE 0.
*                      +3  - MSA SENSE BYTE 1.
*                      ..         ..
*                      ..         ..
*                      +19 - MSA SENSE BYTE 17. 
*                      +20 - MSA SENSE BYTE 18. 
*                      +21 - MSA SENSE BYTE 19. 
* 
*                SB+SNS+22 - MST SENSE BYTE 0/20. 
*                      +23 - MST SENSE BYTE 1/21. 
*                      ..         ..
*                      ..         ..
*                      +40 - MST SENSE BYTE 18/38.
*                      +41 - MST SENSE BYTE 19/39.
* 
*         ENTRY  NONE.
* 
*         EXIT   SENSE STORED IN STATUS BUFFER. 
* 
*         USES   NONE.
* 
*         CALLS  CCN, EXR, FTN. 
  
 SENSE    RJM    CCN         SAVE ABORT ADDRESS, CHECK COUPLER
*                            CONNECTED FLAG.
          LDC    3R"SOV"
          RJM    EXR         LOAD AND EXECUTE THE SENSE OVERLAY 
          LDN    FDSH 
          RJM    FTN         DROP SELECT HOLD 
          LJM    XSENSE      RETURN TO THE STACK
          SPACE  4,20 
**        SKIP - SKIP COMMAND.
* 
*         SKIP THE SPECIFIED NUMBER OF BLOCKS FORWARD OR BACKWARDS. 
* 
*         ENTRY  (PA)  = DIRECTION IN BIT 0, 0=FWD/1=REV. 
*                (PA+1)= NUMBER OF BLOCKS TO SKIP.
* 
*         EXIT   NONE.
* 
*         USES   NONE.
* 
*         CALLS  CCN, SEK.
  
 SKIP     RJM    CCN         SAVE ABORT ADDRESS, CHECK COUPLER
*                            CONNECTED FLAG.
          LDD    PA+1 
          STM    SKICC       NUMBER OF BLOCKS TO SKIP 
          LDD    PA 
          LPN    1
          SHN    6-0
          LMC    0#51        CLEAR THE FWD BIT IF REV SKIP
          STM    SKIHH
          RJM    SEK
 SKICC    CON    ** 
 SKIHH    CON    ** 
          LJM    XSKIP       RETURN TO THE STACK
          SPACE  4,20 
**        STATUS - REQUEST COUPLER STATUS.
* 
*         COPY ALL SIX WORDS OF COUPLER STATUS INTO THE STATUS
*         BUFFER (SB) AT SB+CSW--SB+CSW+5 
* 
*         ENTRY  (A)  = ABORT ADDRESS.
* 
*         EXIT   STATUS STORED AS FOLLOWS-
*                SB+CSW+0 = COUPLER.
*                SB+CSW+1 = CTL.
*                SB+CSW+2 = PARITY ERROR. 
*                SB+CSW+3 = INPUT WORD COUNTER. 
*                SB+CSW+4 = OUTPUT WORD COUNTER.
*                SB+CSW+5 = BUFFER WORD COUNTER.
* 
*         USES   NONE.
* 
*         CALLS  CCN, GST.
  
 STATUS   RJM    CCN         INITIALIZE COMMAND 
 STA1     RJM    GST
          LJM    XSTATUS     RETURN TO THE STACK
          SPACE  4,20 
**        GST -  GET ALL COUPLER STATUS WORDS.
* 
*         COPY ALL SIX WORDS OF COUPLER STATUS INTO THE STATUS
*         BUFFER (SB) AT SB+CSW--SB+CSW+5 
* 
*         ENTRY  (A)  = ABORT ADDRESS.
* 
*         EXIT   STATUS STORED AS FOLLOWS-
*                SB+CSW+0 = COUPLER.
*                SB+CSW+1 = CTL.
*                SB+CSW+2 = PARITY ERROR. 
*                SB+CSW+3 = INPUT WORD COUNTER. 
*                SB+CSW+4 = OUTPUT WORD COUNTER.
*                SB+CSW+5 = BUFFER WORD COUNTER.
* 
*         USES   S3.
* 
*         CALLS  FIN. 
  
 GSTX     LJM    *           ENTRY / EXIT.
 GST      EQU    *-1
          LDN    0
          STD    S3 
 GST1     LDM    TSF,S3 
          ZJN    GSTX        IF END OF TABLE
          RJM    FIN         GET THE NEXT STATUS WORD 
          STM    SB+CSW,S3
          AOD    S3 
          UJN    GST1        LOOP FOR ALL STATUS WORDS
          SPACE  4,18 
**        TSF -  TABLE OF VALID COUPLER STATUS FUNCTIONS. 
* 
*         THE FUNCTION CODES MUST REMAIN IN THE ORDER IN WHICH THE
*         STATUS WORDS ARE TO BE STORED.  A ZERO WORD TERMINATES
*         THE FUNCTION TABLE. 
  
 TSF      EQU    *
          LOC    0
          VFD    12/FCSTS    COUPLER STATUS 
          VFD    12/FCTLS    CTL STATUS 
          VFD    12/FPERS    PARITY ERROR STATUS
          VFD    12/FIWCS    INPUT WORD COUNTER 
          VFD    12/FOWCS    OUTPUT WORD COUNTER
          VFD    12/FBWCS    BUFFER WORD COUNTER
          CON    0           TABLE TERMINATOR 
          LOC    *O 
 TSFL     EQU    *-TSF       TABLE LENGTH 
          SPACE  4,20 
**        WRITE - WRITE COMMAND.
* 
*         ENTRY  (PA) = CODE DEFINING THE TYPE OF WRITE.
*                        0 = WRITE TM.
*                        1 = SET ERP MODE AND WRITE.
*                        2 = WRITE DATA.
* 
*         EXIT   NONE.
* 
*         USES   WTSQF. 
* 
*         CALLS  EXR. 
  
 WRITE    RJM    CCN         SAVE ABORT ADDRESS, CHECK COUPLER
*                            CONNECTED FLAG.
          LDD    PA 
          STM    WTSQF       SET TYPE OF WRITE FLAG 
          LMN    1
          NJN    WRT1        IF NOT SET ERP MODE
          RJM    SEK
          CON    0#91+HH40   SER ERP MODE 
 WRT1     LDC    3R"WOV"
          RJM    EXR         LOAD AND EXECUTE THE WRITE SEQUENCE
          LJM    XWRITE      RETURN TO THE STACK
 WTSQF    CON    **          WRITE FLAG 
*                             0 =  WRITE TM 
*                             1 =  SET ERP AND WRITE ERP PARAMETERS 
*                             X =  WRITE DATA, IF X .GT. 1
  
          TITLE  MSF SEQUENCES. 
**        CIS -  CPU INITIATED SELECTION SEQUENCE.
* 
*         PERFORMS THE INITIAL MSA/DEVICE SELECTION.
* 
*         ENTRY  NONE.
* 
*         EXIT   MSA/DEVICE SELECTED. 
* 
*         USES   D.T0, EDI. 
* 
*         CALLS  CTS, IPS, SEL, STG, UES, VTS.
  
 CISX     LJM    *           ENTRY / EXIT 
 CIS      EQU    *-1
 CISE1    LDN    SQCIS
          STD    SEQN        SET THE SEQUENCE CODE
          LDN    14B              600 USEC DELAY
          STD    D.T0        PRESET SHORT BUSY TIME OUT 
 CIS01    RJM    SEL         SELECT THE DEVICE
          SHN    17-9 
          PJN    CIS02       IF NOT SHORT BUSY
 DCCIS    LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    CIS01       IF NOT SHORT BUSY TIME OUT 
 ERRBSY   LDC    ER.BSY      SHORT BUSY TIME-OUT
          LJM    ERP
  
 CIS02    SHN    17-4-17+9   CHECK LONG BUSY
          PJN    CIS04       IF MSA NOT BUSY
          LDD    EDI
          NJN    CIS03       IF EDI SET AND MSA BUSY
          RJM    STG
          CON    TSWCL+CV+C1+C2+CE
 DVCIS1   VFD    4/0,8/MSDEI+DEV       SET PRIME DEVICE INTERRUPT 
 CIS03    AOD    EDI         SET EXPECTED DEVICE INTERRUPT
          RJM    IPS         WAIT FOR THE INTERRUPT 
 CIS03A   UJN    CISE1       TRY AGAIN
  
 CIS04    LDD    LTST 
          LPC    TSTV+TSNE
          ZJN    CIS06       IF TAG VALID AND NORMAL END
          RJM    CTS         GET CTL STATUS 
          SHN    17-7 
          MJN    CIS05       IF CHECK 2 ERROR 
          LJM    ERRTRE      TAG RESPONCE ERROR 
 CIS05    LJM    ERRCK2      CHECK 2 ERROR
  
 CIS06    RJM    VTS         VALIDATE 3 OF 6 CODE $ GET DEVICE STATUS 
          LPN    DBSY 
          NJN    CIS03       IF DEVICE BUSY 
 CIS08    LDD    EDI
          NJN    CIS09       IF EXPECTED DEVICE INTERRUPT 
          LDD    LTST 
          LPN    SKC+DBSY+ONLN+ATTN 
          LMN    ONLN 
          ZJN    CIS10       IF ON LINE ONLY
          LMN    ONLN 
          LPN    ONLN 
          NJN    CIS09       IF DEVICE IS ON-LINE 
          LJM    ERRDSE      DEVICE STATUS ERROR
  
 CIS09    AOD    RIF         SET RESET INTERRUPT FLAG 
          RJM    UES
          UJN    CIS03A      TRY AGAIN
  
 CIS10    RJM    STG
          CON    TSWCL+CV+C1+C2+CE
 DVCIS2   VFD    9/0,3/DEV   DEVICE ADDRESS 
          SHN    17-7 
          MJN    CIS09       IF PRIMED INTERRUPT
          RJM    CTS         GET CTL STATUS 
          SHN    17-7 
          PJN    CIS11       IF NO  CHECK 2 ERROR 
          UJN    CIS05       CHECK 2 ERROR
  
 CIS11    LJM    CISX        RETURN 
          SPACE  4,20 
**        IPS -  IDLE POLL SEQUENCE.
* 
*         WAIT FOR A DEVICE INTERRUPT AND RESELECT THE DEVICE WHEN THE
*         INTERRUPT OCCURS.  IF NO INTERRUPT IS RECEIVED WITHIN 4096*20 
*         LOOPS AN ERROR *EC.NDI* IS ISSUED.
* 
*         ENTRY  NONE.
* 
*         EXIT   DEVICE RESELECTED. 
* 
*         USES   S3.
* 
*         CALLS  STG, SIS.
  
 IPSX     LJM    *           ENTRY / EXIT 
 IPS      EQU    *-1
 IPSE1    LDN    SQIPS
          STD    SEQN        SET THE SEQUENCE CODE
          LDN    FDSH 
          RJM    FTN         DROP SELECT HOLD 
          LDN    0
          STM    IPSTO       CLEAR INTERRUPT TIME-OUT COUNTER 
          LDN    60B                 15 SEC DELAY 
          STD    S3          SET NUMBER OF TIMES TO LOOP
 IPS1     RJM    STG
          CON    TPOLL+CV+C1+C2+CE
 MSIPS    VFD    4/0,3/**,5/MPOLD 
          LPC    **          BIT SIGNIFICANT DEVICE ADDRESS (BSDA)
 DIIPS    EQU    *-1
          NJN    SIS1        IF DEVICE INTERRUPT
          AOM    IPSTO       INCREMENT TIME-OUT COUNTER 
          NJN    IPS2 
 DCIPS    LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    S3 
          MJN    ERRNDI      IF INTERRUPT TIME-OUT
 IPS2     LDM    WTSQF
          LMN    1
          ZJN    IPS1        IF *ERP* OR *LOOPBACK*, CANNOT DROP CHAN 
          RJM    DEQ         DISCONNECT EQUIPMENT 
          RJM    BD.RCH      RESERVE CHANNEL
          RJM    CEQ         CONNECT EQUIPMENT
          UJN    IPS1        TRY AGAIN
  
 ERRNDI   LDC    ER.NDI      NO DEVCE INTERRUPT 
          UJN    ERRBAI1     PROCESS THE ERROR
  
 IPSTO    EQU    4476B       INTERRUPT TIME-OUT COUNTER 
  
  
**        SIS -  SUBSYSTEM INITIATED SELECT SEQUENCE. 
* 
*         RESELECT THE MSA/DEVICE FOLLOWING AN INTERRUPT. 
* 
*         ENTRY  NONE.
* 
*         EXIT   MSA/DEVICE RESELECTED. 
* 
*         USES   RIF. 
* 
*         CALLS  SEL, UES, VTS. 
  
 SIS1     LDN    SQSIS
          STD    SEQN        SET THE SEQUENCE CODE
          RJM    SEL         SELECT THE MSA AND DEVICE
          LPC    SBSY+LBSY
          ZJN    SIS2        IF MSA NOT BUSY
          LJM    IPSE1       MSA BUSY, TRY AGAIN
  
 SIS2     LDD    LTST 
          LPC    TSTV+TSNE
          ZJN    SIS3        IF NOT BUSY AND TAG RESPONCE OK
          LJM    ERRTRE      TAG RESPONCE ERROR 
  
 SIS3     RJM    VTS         VALIDATE 3 OF 6 CODE $ GET DEVICE STATUS 
          SHN    17-10
          PJN    SIS4        IF NOT SELECT ALERT 1
          LJM    ERRSA1 
  
 SIS4     SHN    17-1-17+10 
          PJN    SIS5        IF DEVICE NOT BUSY 
 ERRBAI   LDC    ER.BAI      DEVICE BUSY AFTER AN INTERRUPT 
 ERRBAI1  LJM    ERP         PROCESS THE ERROR
  
 SIS5     AOD    RIF         SET THE RESET INTERRUPT FLAG 
          RJM    UES
          LJM    IPSX        RETURN 
          SPACE  4,20 
**        SEK -  SEEK SEQUENCE. 
* 
*         SELECT THE MSA/DEVICE VIA *CIS* AND ISSUE THE COMMAND (CC/HH) 
*         BY EXECUTING A MSF SEEK SEQUENCE.  *IPS* IS CALLED AFTER
*         ISSUING THE COMMAND TO WAIT FOR THE INTERRUPT.
* 
*         ENTRY  CALL LOC+1=CYL ADDRESS (CC), IF CC HAS 2**11 SET THE 
*                           HEAD ADDRESS IS 40HEX.
*                CALL LOC+2=HEAD ADDRESS (HH), IF 2**11 OF CC IS CLEAR. 
* 
*         EXIT   SB+LCCXT = CYLINDER ADDRESS TRANSMITTED. 
*                SB+LHHXT = HEAD ADDRESS TRANSMITTED. 
*                SB+LCCBI = BUS IN RESPONCE TO XMIT CC. 
*                SB+LHHBI = BUS IN RESPONCE TO XMIT HH. 
*                SB+LCCRD = BUS IN RESPONCE TO READ CC. 
*                SB+LHHRD = BUS IN RESPONCE TO READ HH. 
* 
*         USES   D.T0 
* 
*         CALLS  CIS, STG.
  
 SEKX     LJM    *           ENTRY / EXIT 
 SEK      EQU    *-1
          RJM    CIS         SELECT MSA AND DEVICE
          LDN    SQSEK
          STD    SEQN        SET THE SEQUENCE CODE
          LDM    SEK
          STD    D.T0 
          LDI    D.T0 
          LPC    377B 
          STM    SB+LCCXT 
          ADC    LNK+SBI     ADD THE LINKING AND STORE BI FLAGS 
          STM    SEKCC
          LDI    D.T0 
          SHN    17-11
          PJN    SEK1        IF CALL LOC+2 = HH ADDRESS 
          LDC    0#40+LNK+SBI          ELSE HH = 40 HEX 
          UJN    SEK2 
  
 SEK1     AOD    D.T0 
          AOM    SEK         INCREMENT RETURN ADDRESS 
          LDI    D.T0 
 SEK2     LPC    377B 
          STM    SB+LHHXT 
          ADC    LNK+SBI     ADD THE LINKING AND STORE BI FLAGS 
          STM    SEKHH
          RJM    STG
          CON    TXTCC+CV+C1+C2+CE     TAG - TRANSMIT CYLINDER ADDRESS
 SEKCC    CON    **+SBI+LNK            CYLINDER ADDRESS 
          CON    SB+LCCBI 
          CON    TXTHH+CV+C1+C2+CE     TAG - TRANSMIT HEAD ADDRESS
 SEKHH    CON    **+SBI+LNK            HEAD ADDRESS 
          CON    SB+LHHBI 
          CON    TRQAD+CV+C1+C2+CE     TAG - REQUEST ADDRESS (CC/HH)
          CON    MRDCC+SBI+LNK         MODIFIER - REQUEST CC
          CON    SB+LCCRD 
          CON    TRQAD+CV+C1+C2+CE     TAG - REQUEST ADDRESS (CC/HH)
          CON    MRDHH+SBI             MODIFIER - REQUEST HH
          CON    SB+LHHRD 
          LMM    SB+LHHXT 
          NJN    SEK3        IF HH READ .NE. HH TRANSMITTED 
          LDM    SB+LCCRD 
          LMM    SB+LCCXT 
          ZJN    SEK4        IF CC READ .EQ. CC TRANSMITTED 
 SEK3     RJM    STG
          CON    TXCL1+CV+C1+C2+CE
          CON    MRINT+NRC   RESET INTERRUPT
 ERRICH   LDC    ER.ICH      INVALID CC OR HH 
          UJN    ERRCK21     PROCESS THE ERROR
  
 SEK4     RJM    STG
          CON    TXCL1+CV+C1+C2+CE
          CON    MSTSK       START SEEK 
          LPN    DBSY 
          NJN    SEK5        IF DEVICE BUSY FOLLOWING A START SEEK
 ERRDSE   LDC    ER.DSE      DEVCE STATUS ERROR 
          UJN    ERRCK21     PROCESS THE ERROR
  
 SEK5     STD    EDI         SET EXPECTED DEVICE INTERRUPT FLAG 
          RJM    CTS         GET CTL STATUS 
          SHN    17-7 
          PJN    SEK6        IF NO CHECK 2 ERROR
 ERRCK2   LDC    ER.CK2      CHECK 2 ERROR
 ERRCK21  LJM    ERP         PROCESS THE ERROR
  
 SEK6     RJM    IPS         WAIT FOR THE DEVICE TO INTERRUPT 
          AOM    SEK
          LJM    SEKX        RETURN 
          SPACE  4,20 
**        SRS -  SUBSYSTEM RESET SEQUENCE.
* 
*         EXECUTE MSF SUBSYSTEM RESET ON THE ASSIGNED DEVICE ONLY.
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   D.TO.
* 
*         CALLS  CCN, STG.
  
 SRS      RJM    CCN         INITIALIZE COMMAND 
          LDN    SQSRS
          STD    SEQN        SET THE SEQUENCE CODE
          LDN    34B
          STD    D.T0 
 SRS1     RJM    STG
          CON    TSELD                 TAG - SELECT 
 MDSRS    CON    MSA*16+DEV+NRC        MSA/DEVICE ADDRESS 
*         VFD    4/NRC,3/MSA,2/0,3/DEV
          SHN    17-9 
          PJN    SRS2        IF NOT SHORT BUSY
 DCSRS    LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    SRS1        IF TIME OUT HAS NOT EXPIRED
          LJM    ERRBSY      MSA BUSY 
  
 SRS2     RJM    STG
          CON    TXCL1                 TAG - TRANSMIT CONTROL 1 
          CON    MRINT+LNK                   RESET INTERRUPT
          CON    TXTCL                 TAG - TRANSMIT CONTROL 
          CON    MMSAR+LNK                   MSA RESET
          CON    TSWCL+CV+C1+C2+CE     TAG - STRING SWITCH CONTROL
 DVSRS    VFD    12/MCRDV+MCDEI+DEV+LNK      CLEAR RESERVE DEVICE AND 
*                                            PRIME DEVICE END INTERRUPT 
          CON    TSTSW+CV+C1+C2+CE     TAG - STRING SWITCH
          CON    MRLCN                       RESET LONG CONNECTION
  
          LDN    FDSH 
          RJM    FTN         DROP SELECT HOLD 
          LJM    XRESET      RETURN TO THE STACK
          SPACE  4,20 
**        UES -  UNTIMED ENDING SEQUENCE. 
* 
*         RESET INTERRUPT AND LONG CONNECTION.
*         THE RESET LONG CONNECTION TAG IS ISSUED WITH THE SELECT 
*         HOLD BIT CLEAR WHICH WILL DROP SELECT HOLD. 
* 
*         ENTRY  (RIF) NONZERO IF INTERRUPT IS TO BE RESET. 
* 
*         EXIT   (RIF) AND (EDI) CLEARED. 
* 
*         USES   EDI, RIF.
* 
*         CALLS  STG. 
  
 UESX     LJM    *           ENTRY / EXIT 
 UES      EQU    *-1
          LDN    SQUES
          STD    SEQN        SET THE SEQUENCE CODE
          LDD    RIF
          ZJN    UES2        IF NO INTERRUPTS TO RESET
          RJM    STG
          CON    TSWCL+CV+C1+C2+CE
 DVUES1   VFD    9/0,3/DEV
          LPC    PINT 
          ZJN    UES1        IF NO PRIMED INTERRUPT 
          RJM    STG
          CON    TSWCL+CV+C1+C2+CE     TAG - STRING SWITCH CONTROL
 DVUES2   CON    MCDEI+DEV             RESET PRIMED INTERRUPT 
*         VFD    9/MCDEI,3/DEV
          UJN    UES2 
  
 UES1     RJM    STG
          CON    TXCL1+CV+C1+C2+CE
          CON    MRINT       RESET INTERRUPT AND CHECK FOR CK-2 ERROR 
 UES2     LDN    0
          STD    EDI         CLEAR EXPECTED DEVICE INTERRUPT FLAG 
          STD    RIF         CLEAR RESET INTERRUPT FLAG 
          RJM    STG
          CON    TSTSW-SH+CV+C1+CE     TAG -STRING SWITCH 
          CON    MRLCN                 RESET LONG CONN, ENB/DIS LATCH 
          UJN    UESX        RETURN 
          TITLE  COMMON SUBROUTINES.
**        COMMON SUBROUTINES. 
          SPACE  4,20 
**        ACN -  ACTIVATE THE CHANNEL.
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   NONE.
* 
*         CALLS  NONE.
  
 ACNX     LJM    *           ENTRY / EXIT 
 ACN      EQU    *-1
          AJM    ACNX,**     IF CHANNEL IS ACTIVE 
          ACN    **+40B 
          IJM    ERRIAA,**   IF INACTIVE AFTER AN ACN 
          UJN    ACNX        RETURN 
          SPACE  4,20 
**        CCN - CHECK COUPLER CONNECTED FLAG. 
* 
*         INITIALIZE COMMAND VIA A CALL TO *ICM* AND ENSURE THE COUPLER 
*         IS CONNECTED (IE. A *RES* COMMAND HAS BEEN EXECUTED WITHOUT 
*         AN ERROR).  THE COUPLER CONNECTED FLAG *CCNF* IS NONZERO IF 
*         THE COUPLER HAS BEEN CONNECTED VIA A *RES* COMMAND. IF THE
*         COUPLER IS NOT CNNECTED, EXIT TO *ERRCNC*.
* 
*         ENTRY  (A)    = ABORT ADDRESS.
*                (CCNF) = NONZERO IF COUPLER IS CONNECTED.
* 
*         EXIT   ABTU, ABTL = ABORT ADDRESS.
* 
*         USES   NONE.
* 
*         CALLS  ICM. 
  
 CCNX     LJM    *           ENTRY / EXIT 
 CCN      EQU    *-1
          RJM    ICM         INITIALIZE COMMAND 
          LDM    CCNF 
          NJN    CCNX        IF COUPLER CONNECTED 
 ERRCNC   LDC    ER.CNC 
          LJM    ERP         ISSUE COUPLER NOT CONNECTED ERROR
          SPACE  4,18 
**        CEQ - RESERVE THE I/O CHANNEL AND CONNECT EQUIPMENT.
* 
*         RELEASE DEVICE VIA DEQ AND DROP  THE  I/O  CHANNEL  IF  BEING 
*         REQUESTED  BY  SYSTEM.   COMMUNICATE  WITH  SYSTEM, AND  TEST 
*         DROP/CHECKPOINT/ERROR FLAGS. THE I/O CHANNEL IS THEN REQUEST- 
*         ED,  THE  COUPLER CONNECTED AND THE COUPLER CONNECTED FLAG IS 
*         SET. IF THE COUPLER IS NOT CONNECTED AFTER 10 ATTEMPTS AN 
*         ERROR IS ISSUED.
* 
*         ENTRY  NONE.
* 
*         EXIT   I/O CHANNEL ASSIGNED.
*                CCNF - SET, NON-ZERO.
* 
*         USES   D.Z1.
* 
*         CALLS  BD.RCH, DEQ, FTN.
  
 CEQX     LJM    *           ENTRY/EXIT 
 CEQ      EQU    *-1
          LDM    BD.CHFG
          ZJN    CEQ1        IF NOT CURRENTLY ASSIGNED
          RJM    DEQ         CLEAR AND DISCONNECT EQUIPMENT 
 CEQ1     RJM    BD.RCH      DROP/REQUEST CHANNEL AS REQUESTED
          RJM    DCN         ENSURE CHANNEL INACTIVE
          LDN    0
          STD    D.Z1        INITIALIZE CONNECT TIME-OUT COUNTER
          LCN    0
          STM    SB+CON      SET CONNECT STATUS WORD TO ONES
 CEQ2     LDN    FCONN
          RJM    FIN         CONNECT THE COUPLER
 CEQ3     STM    SB+CON      SAVE CONNECT STATUS
          LPN    1
          NJN    CEQ4        IF CONNECTED 
          AOD    D.Z1 
          SBN    11 
          MJN    CEQ2        IF NOT CONNECT TIME-OUT, TRY AGAIN 
          UJN    ERRCNC      COUPLER NOT CONNECTED WITHIN 10 ATTEMPTS 
  
 CEQ4     STM    CCNF        SET COUPLER CONNECTED FLAG 
          LDN    FCLR 
          RJM    FTN         CLEAR THE COUPLER
          LJM    CEQX        RETURN 
          SPACE  4,20 
**        CTS -  COPY CTL STATUS. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (A) = CTL STATUS WORD. 
*                (SB+CTLSW) = CTL STATUS WORD.
* 
*         USES   SB+CTLSW 
* 
*         CALLS  FIN. 
  
 CTSX     LJM    *           ENTRY / EXIT 
 CTS      EQU    *-1
          LDN    FCTLS
          RJM    FIN
          STM    SB+CTLSW 
          UJN    CTSX        RETURN 
          SPACE  4,20 
**        DCN -  DISCONNECT THE CHANNEL.
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   NONE.
* 
*         CALLS  NONE.
  
 DCNX     LJM    *           ENTRY / EXIT 
 DCN      EQU    *-1
          IJM    DCNX,**     IF CHANNEL IS INACTIVE 
          DCN    **+40B 
          AJM    ERRAAD,**   IF ACTIVE AFTER A DCN
          UJN    DCNX        RETURN 
          SPACE  4,22 
**        DEQ -  DISCONNECT EQUIPMENT.
* 
*         IF THE COUPLER IS NOT CONNECTED, RETURN.  IF CONNECTED, ISSUE 
*         THE CLEAR, DROP SELECT HOLD AND DISCONNECT FUNCTIONS TO CLEAN 
*         UP ANY CONDITIONS SET BY A PREVIOUS COMMAND BEFORE  RELEASING 
*         THE CHANNEL.
* 
*         ENTRY  (CCNF) = NON-ZERO IF COUPLER CONNECTED.
* 
*         EXIT   (CCNF) = CLEARED (ZERO), IF NO ERROR ON THE DISCONNECT 
*                         AND *DEQ* CALLED FROM THE MODULE, IF CALL WAS 
*                         BASIC DRIVER *CCNF* IS ALWAYS CLEARED.
* 
*         USES   NONE.
* 
*         CALLS  FRE, FTN.
  
 DEQX     LJM    *           ENTRY/EXIT 
 DEQ      EQU    *-1
          LDC    **          COUPLER CONNECTED FLAG 
 CCNF     EQU    *-1
          ZJN    DEQX        IF COUPLER NOT CONNECTED 
          LDD    ABTU 
          LMN    77B
          ZJN    DEQ1        IF CALL FROM BASIC DRIVER
          LDN    FDSH        DROP SELECT HOLD 
          RJM    FTN
          LDN    FDISC       DISCONNECT 
          RJM    FTN
          UJN    DEQ2 
  
 DEQ1     LDN    FDSH        DROP SELECT HOLD 
          RJM    FRE
          LDN    FDISC       DISCONNECT 
          RJM    FRE
 DEQ2     LDN    0
          STM    CCNF        CLEAR COUPLER CONNECTED FLAG 
          UJN    DEQX        RETURN 
          SPACE  4,20 
**        FIN -  FUNCTION AND INPUT ONE WORD. 
* 
*         ENTRY  (A)=FUNCTION 
* 
*         EXIT   (A)=FUNCTION STATUS
* 
*         USES   NONE.
* 
*         CALLS  ACN, DCN, FTN, ISW.
  
 FINX     LJM    *           ENTRY / EXIT 
 FIN      EQU    *-1
          RJM    FTN         ISSUE THE FUNCTION 
          RJM    ACN         ACTIVATE THE CHANNEL 
          RJM    ISW         INPUT STATUS WORD
          RJM    DCN         DISCONNECT THE CHANNEL 
          UJN    FINX        RETURN 
          SPACE  4,20 
**        FTN -  ISSUE A FUNCTION.
* 
*         ENTRY  (A) = FUNCTION IN BITS 8-0.
* 
*         EXIT   (A)  = EQUIPMENT CODE PLUS THE FUNCTION. 
*                (LF) = FUNCTION ISSUES.
* 
*         USES   LF.
* 
*         CALLS  NONE.
  
 FTNX     LJM    *           ENTRY / EXIT 
 FTN      EQU    *-1
          LPC    377B 
          ADC    **          ADD EQUIPMENT CODE 
*         ADC    E000 
 EQFTN    EQU    *-1
          AJM    ERRABF,**   CHANNEL ACTIVE BEFORE A FUNCTION 
          STD    LF 
          FAN    **+40B 
          LDN    4
 FTN1     IJM    FTNX,**
 DLFTN    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    FTN1        WAIT INACTIVE
          LJM    ERRAAF      CHANNEL ACTIVE AFTER A FUNCTION
          SPACE  4,20 
**        FRE -  ISSUE A FUNCTION, RETURN ON ERRORS.
* 
*         ENTRY  (A) = FUNCTION IN BITS 8-0.
* 
*         EXIT   (A) = EQUIPMENT CODE PLUS THE FUNCTION.
* 
*         USES   NONE.
* 
*         CALLS  NONE.
  
 FRE2     IJM    FREX,**     ENSURE CHANNEL IS INACTIVE 
          DCN    **+40B 
  
 FREX     LJM    *           ENTRY / EXIT 
 FRE      EQU    *-1
          ADC    **          ADD EQUIPMENT CODE 
*         ADC    E000 
 EQFRE    EQU    *-1
          IJM    FRE1,**     ENSURE CHANNEL IS INACTIVE 
          DCN    **+40B 
 FRE1     FAN    **+40B 
          UJN    FRE2 
  
          SPACE  4,20 
**        ICM -  INITIALIZE COMMAND.
* 
* 
*         SAVE THE ABORT LOCATION, CLEAR(ZERO) EA, EC AND EM REGISTERS
*         AND STORE ONES IN THE SB EXCEPT THE CONNECT STATUS
*         WORD (SB+CON).
*         ENTRY  (A) = ABORT ADDRESS. 
* 
*         EXIT   (A) = 0. 
* 
*         USES   ABTL, ABTU, EA, EC, EM.
* 
*         CALLS  NONE.
  
 ICMX     LJM    *           ENTRY / EXIT 
 ICM      EQU    *-1
          STD    ABTL        SAVE ABT ADDRESS 
          SHN    -12
          STD    ABTU 
          LDN    0
          STD    EC          CLEAR ERROR REGISTERS
          STD    EA 
          STD    EM 
          STD    SEQN        CLEAR SEQUENCE CODE
          STM    RESA 
 ICM1     LCN    0
          STM    SB,EC       SET STATUS BUFFER TO ALL ONES
 ICM2     AOD    EC 
          SBN    CON
          ZJN    ICM2        IF CONNECT STATUS WORD 
          LMN    SBL-CON
          NJN    ICM1 
          STD    EC          CLEAR ERROR CODE 
          UJN    ICMX        RETURN 
          SPACE  4,20 
**        ISW -  INPUT STATUS WORD. 
* 
*         ENTRY  CHANNEL AND EQUIPMENT CONDITIONED FOR INPUT. 
* 
*         EXIT   CHANNEL ACTIVE.
*                (A)   =STATUS. 
* 
*         USES   NONE.
* 
*         CALLS  WAF. 
  
 ISWX     LJM    *           ENTRY / EXIT 
 ISW      EQU    *-1
          RJM    WAF         WAIT FOR FULL
          IAN    **+40B 
          IJM    ERRIAI,**   CHANNEL INACTIVE AFTER INPUT 
          UJN    ISWX        RETURN 
          SPACE  4,20 
**        OFP -  OUTPUT FUNCTION PARAMETER. 
* 
*         ENTRY  (A)=FUNCTION PARAMETER.
* 
*         EXIT   CHANNEL ACTIVE AND EMPTY.
* 
*         USES   NONE.
* 
*         CALLS  NONE.
  
 OFPX     LJM    *           ENTRY / EXIT 
 OFP      EQU    *-1
          RJM    ACN         ACTIVATE THE CHANNEL 
          FJM    ERRFBO,**   CHANNEL FULL BEFORE OUTPUT 
          OAN    **+40B 
          LDN    4
 OFP1     EJM    OFPX,**     RETURN 
 DLOFP    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    OFP1 
 ERRFPN   LDC    ER.FPN      FUNCTION PARAMETER NOT ACCEPTED
          UJN    ERRHIF1     PROCESS THE ERROR
          SPACE  4,20 
**        SEL -  SELECT THE MSA AND DEVICE. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (A)=SELECT TAG RESPONCE. 
* 
*         USES   NONE.
* 
*         CALLS  CTS, STG.
  
 SELX     LJM    *           ENTRY / EXIT 
 SEL      EQU    *-1
          RJM    CTS         GET CTL STATUS 
          LPC    SELA+HOTIF+USA2
          ZJN    SEL1        IF NOT SELECT ACTIVE, HOT I/F OR SA-2
          SHN    17-11
          MJN    SEL1        IF SELECT ACTIVE 
 ERRHIF   LDC    ER.HIF      HOT INTERFACE OR SELECT ALERT2 
 ERRHIF1  LJM    ERP         PROCESS THE ERROR
  
 SEL1     RJM    STG         ISSUE SELECT DEVICE TAG
          CON    TSELD
 MDSEL    CON    MSA*16+DEV+NRC        MSA/DEVICE ADDRESS 
*         VFD    4/NRC,3/MSA,2/0,3/DEV
          UJN    SELX        RETURN 
          SPACE  4,20 
**        STG -  SEND TAG.
* 
*         SEND A TAG AND TAG MODIFIER TO THE MSA.  WHEN THE *LNK* FLAG
*         BIT OF THE MODIFIER WORD IS SET, THIS TAG IS FOLLOWED BY
*         ANOTHER TAG. BUS IN RESPONCE IS STORED IN THE ADDRESS 
*         SPECIFIED BY THE CALL LOC+3 WHEN *SBI* FLAG IS SET IN THE 
*         MODIFIER WORD.
* 
*         ENTRY  CALL LOC+1=TAG 
*                CALL LOC+2=TAG MODIFIER (BITS 7-0), FLAGS (BIT 11-9).
*                 FLAG BITS.
*                  11(NRC)= DO NOT CHECK TAG RESPONCE 
*                  10(SBI)= STORE TAG RESPONCE IN THE ADDRESS 
*                           SPECIFIED IN CALL LOC+3.
*                   9(LNK)= TAGS ARE LINKED, ISSUE THE NEXT TAG 
*                           BEFORE RETURNING. 
*                   8(ND) = DO NOT DEACTIVATE THE CHANNEL AFTER READING 
*                           THE TAG STATUS (USED FOR EXTENDED TAGS).
*                        -NOTE- 
*                           BIT 9(LNK) SHOULD NOT BE SET WHEN BIT 8(DC) 
*                           IS SET, AS THIS WILL CAUSE AN *ER.ABF*
*                           ERROR WHEN THE NEXT TAG IS ISSUED.
* 
*                CALL LOC+3=ADDRESS TO STORE THE TAG RESPONCE (BI) IF 
*                           BIT 10 IS SET.
* 
*         EXIT   EXIT CONDITIONS APPLY TO THE LAST TAG ISSUED.
*                (A)    =TAG STATUS.
*                LTST   =TAG STATUS.
*                SB(LT) =TAG. 
*                SB(LTM)=TAG MODIFIER.
*                SB(LTS)=TAG STATUS (BUS IN). 
* 
*         USES   S4, D.Z1, D.Z2, LTST, SB(LT), SB(LTM), SB(LTS).
* 
*         CALLS  CTS, FTN, ISW, OFP.
  
 STG      CON    **          ENTRY
          LDM    STG
          STD    S4 
 STG1     LDI    S4          GET THE TAG
          LPC    7400B       SAVE TAG RESPONCE BITS TO CHECK
          STM    STG4 
          LDI    S4 
          LPC    377B        SAVE THE TAG ONLY
          RJM    FTN         ISSUE THE TAG
          STM    SB+LT
          AOD    S4 
          LDI    S4          GET THE TAG MODIFIER 
          STD    D.Z1        SAVE FLAG BITS (MODIFIER WORD) 
          LPC    377B        MASK TAG MODIFIER
          STM    SB+LTM 
          RJM    OFP         OUTPUT THE TAG MODIFIER
          RJM    ISW         GET THE TAG STATUS 
          STD    LTST 
          STM    SB+LTS 
          LDD    D.Z1 
          SHN    17-8 
          MJN    STG2        IF NO DISCONNECT 
          RJM    DCN         DISCONNECT THE CHANNEL 
 STG2     LDD    D.Z1 
          SHN    17-10
          PJN    STG3        IF NO STORE TAG RESPONCE (BI)
          AOD    S4 
          LDI    S4          GET THE ADDRESS TO STORE BUS IN
          STD    D.Z2 
          LDD    LTST 
          STI    D.Z2        STORE BUS IN 
 STG3     LDD    LTST 
          LPC    **          TSTV+TSSA1+TSSA2+TSNE
 STG4     EQU    *-1
          ZJN    STG5        IF VALID TAG RESPONCE
          LJM    ERRTRE      TAG RESPONCE ERROR 
  
 STG5     LDD    D.Z1 
          SHN    17-11
          MJN    STG6        IF DO NOT CHECK TAG RESPONCE 
          RJM    CTS
          SHN    17-7 
          PJN    STG6        IF NO CHECK 2 ERROR
          LJM    ERRCK2 
  
 STG6     LDD    D.Z1 
          SHN    17-9 
          PJN    STG7        IF TAGS NOT LINKED 
          AOD    S4          INCREMENT TAG POINTER
          LJM    STG1        LOOP TO ISSUE THE NEXT TAG 
  
 STG7     LDD    LTST        GET LAST TAG STATUS
          LJM    1,S4        RETURN 
          SPACE  4,20 
**        VTS -  VALIDATE 3 OF 6 CODE AND INPUT DEVICE STATUS.
* 
*         ENTRY  (LTST)   = SELET DEVICE TAG STATUS.
* 
*         EXIT   (A)      = DEVICE STATUS.
*                (SB+LDS) = DEVICE STATUS.
* 
*         USES   NONE.
* 
*         CALLS  STG. 
  
 VTSX     LJM    *           ENTRY / EXIT 
 VTS      EQU    *-1
          LDD    LTST 
          LPC    377B 
          LMC    ** 
 M36VTS   EQU    *-1         MSA 3 OF 6 CODE
          ZJN    VTS1        IF CORRECT 3 OF 6 CODE 
 ERRI36   LDC    ER.I36      INVALID 3 OF 6 CODE
          UJN    ERRNFI1
  
 VTS1     RJM    STG         GET DEVICE STATUS
          CON    TDVST+CV+C2+CE 
          CON    0+SBI+NRC
          CON    SB+LDS      SAVE DEVICE STATUS 
          UJN    VTSX        RETURN 
          SPACE  4,20 
**        WAF -  WAIT FOR THE CHANNEL TO GO FULL. 
* 
*         THE CHANNEL IS TESTED FOR A *FULL* STATE, IF THE
*         CHANNEL GOES FULL WITHIN 10 USEC, RETURN, ELSE EXIT 
*         TO *ERRNFI*.
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   NONE.
* 
*         CALLS  ERRNFI.
  
 WAFX     LJM    *           ENTRY / EXIT 
 WAF      EQU    *-1
  
          LDN    12 
 WAF1     FJM    WAFX,**     IF THE CHANNEL IS FULL 
 DLWAF    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    WAF1 
 ERRNFI   LDC    ER.NFI      NO FULL ON AN INPUT
 ERRNFI1  UJN    ERR
          SPACE  4,18 
**        ERRXX - ERROR JUMP TABLE. 
* 
*         TO REPORT MOST ERRORS THIS TABLE IS ENTERED AT THE RESPECTIVE 
*         LOCATION FOR THE ERROR, THE A REGISTER IS SET TO THE MESSAGE
*         ORDINAL, *MA*, OF THE MESSAGE  WITHIN THE CM MESSAGE BUFFER 
*         ASSOCIATED WITH THE ERROR CODE, THE ERROR CODE, *EC*, AND THE 
*         FATAL ERROR FLAG, *FEF*, IN THE FOLLOWING FORMAT. 
*                VFD 6/EFE,6/MA,6/EC
* 
*         THE ERROR PROCESSING ROUTINE, *ERP*, WILL BE EXECUTED TO
*         REPORT THE ERROR. 
  
 ERRWC    LDC    ER.WC       BUFFER REFERENCE OR WC ERROR 
          UJN    ERR
  
 ERRAAD   LDC    ER.AAD      CHANNEL ACTIVE AFTER DEACTIVATE
          UJN    ERR
  
 ERRAAF   LDC    ER.AAF      CHANNEL ACTIVE AFTER A FUNCTION
 ERR      UJN    ERR1 
  
 ERRABF   LDC    ER.ABF      CHANNEL ACTIVE BEFORE A FUNCTION 
          UJN    ERR1 
  
 ERRFBO   LDC    ER.FBO      CHANNEL FULL BEFORE OUTPUT 
          UJN    ERR1 
  
 ERRIAA   LDC    ER.IAA      CHANNEL INACTIVE AFTER ACTIVATE
          UJN    ERR1 
  
 ERRIAI   LDC    ER.IAI      CHANNEL INACTIVE AFTER AN INPUT
          UJN    ERR1 
  
 ERRITO   LDC    ER.ITO      INDEX TIME-OUT 
          UJN    ERR1 
  
 ERRTRE   LDC    ER.TRE      TAG RESPONCE ERROR 
 ERR1     UJN    ERR3 
  
 ERRIXD   LDC    ER.IXD      INDEX DID NOT DROP 
          UJN    ERR3 
  
 ERRXLE   LDC    ER.XLE      XFER LENGTH ERROR
          UJN    ERR3 
  
 ERRSA1   LDC    ER.SA1      SELECT ALERT 1 
          UJN    ERR3 
  
 ERRWTO   LDC    ER.WTO      WRITE TIME-OUT 
          UJN    ERR3 
  
 ERRWER   LDC    ER.WER      WRITE ERROR
          UJN    ERR3 
  
 ERRFSI   LDC    ER.FSI      FIRST SYNC IN T/O
 ERR3     UJN    ERR4 
  
 ERRNCL   LDC    ER.NCL      NE+CK2+LAST SYNC IN T/O
          UJN    ERR4 
  
 ERRPBX   LDC    ER.PBX      PP TO BUFFER XFER ERROR
  
 ERR4     EQU    *
          SPACE  4,10 
**        ERP -  ERROR PROCESSOR ROUTINE. 
* 
*         PROCESS THE ERROR BASED ON THE FATAL ERROR FLAG  AND  WHETHER 
*         OR  NOT  THE COMMAND HAD AN ABORT ADDRESS. IF THE FATAL ERROR 
*         FLAG IS SET, EXIT IS TO *BD.ABT*, IF  AN  ABORT  ADDRESS  WAS 
*         SPECIFIED  ON  THE COMMAND AND ITS NOT A FATAL ERROR, EXIT TO 
*         *BD.RNI*, ELSE EXIT TO *BD.ERR*.
* 
*         ENTRY  (A) = FATAL ERROR FLAG, MSG ORDINAL AND ERROR CODE.
*                      VFD   6/FEF,6/MESSAGE ORDINAL,6/ERROR CODE.
*                             FEF = NON-ZERO IF FATAL ERROR.
*                 (ABTL), (ABTU) = COMMAND ABORT ADDRESS IF NON-ZERO. 
* 
*         EXIT   (EA) = LINE NUMBER OF THE COMMAND BEING EXECUTED.
*                (EC) = ERROR CODE. 
*                (EM) = MESSAGE ORDINAL.
* 
*         USES   D.Z1, D.Z2, EA, EC, EM.
* 
*         CALLS  BD.ABT, BD.ERR, BD.RNI.
  
 ERP      STD    D.Z1        SAVE MESSAGE ORDINAL AND ERROR CODE
          SHN    -12
          STD    D.Z2        SAVE FATAL ERROR FLAG
          LDM    BD.CHFG
          ZJN    ERP2        IF CHANNEL NOT ASSIGNED
          LDD    BD.AL
          SBN    BD.AL21
          ZJN    ERP2        NO CLEAN-UP IF ACCESS LEVEL 21 
 ERP1     IJM    ERP2,**     CLEAN UP CHANNEL 
          DCN    **+40B 
 ERP2     AOM    ERPF        SET ERROR PROCESSING FLAG
          SCN    1
          ZJN    ERP3 
          LJM    ERP5        IF AN ERROR WHILE PROCESSING AN ERROR
 ERP3     LDD    D.Z1 
          LPN    77B
          STD    EC          SAVE THE ERROR CODE
          LDD    SEQN 
          SHN    11-5 
          RAD    EC          ADD THE MSF SEQ. CODE TO THE ERROR CODE
          LDD    D.Z1 
          SHN    -6 
          ADC    100B        FLAG MESSAGE AS AN OVERLAY MESSAGE 
          STD    EM          STORE MESSAGE ORDINAL
          LDD    P
          STD    EA          STORE LINE NUMBER WHERE ERROR OCCURRED 
          LDD    D.Z2 
          NJN    ERP7        IF FATAL ERROR FLAG SET
  
**        IF THE ERROR WAS DETECTED IN THE READ SEQUENCE AND NOT A
*         BUFFER TO PP TRANSFER (ER.BPX) ERROR, *RBM* IS CALLED TO
*         READ THE BUFFER MEMORY.  THE ERROR PROCESSING FLAG *ERPF* 
*         IS CLEARED PRIOR TO CALLING *RBM* TO ALLOW REPORTING THE
*         ERROR WHILE EXECUTING *RBM* IF ANY.  UPON SUCCESSFUL
*         COMPLETION OF *RBM*, *ERPF* IS SET PRIOR TO EXECUTING THE 
*         SENSE OVERLAY.
  
          LDM    BD.CHFG
          ZJN    ERP6        IF CHANNEL NOT ASSIGNED
          LDD    EC 
          LMC    SQRDS*100B+EC.BPX
          ZJN    ERP4        IF BUFFER TO PP ERROR IN READ SEQUENCE 
          SHN    -6 
          NJN    ERP4        IF NOT READ SEQUENCE 
          SOM    ERPF        REPORT *ER.BPX* ERROR IF ERROR IN *RBM*
          RJM    RBM         READ BUFFER MEMORY TO IB 
          AOM    ERPF        SET ERROR PROCESSING FLAG
  
 ERP4     LDC    3R"SOV"
          RJM    EXR         EXECUTE MSF ERROR SEQ. AND GET SENSE 
 ERP5     RJM    SBR         STATUS BUFFER RESTORE
 ERP6     LDN    0
          STM    ERPF        CLEAR THE ERROR PROCESSING FLAG
          LDM    RESA 
          ZJN    ERP8        IF NO RETURN ADDRESS 
          STD    D.Z1 
          LJM    0,D.Z1      RETURN SEEK REL OR SEEK RES ABORT
  
 ERP7     LJM    BD.ABT      TERMINATE MODULE 
  
 ERP8     LDD    ABTU 
          SHN    12 
          LMD    ABTL 
          LJM    BD.RNI      RNI AT THE ABORT ADDRESS 
  
 ERPF     CON    0           ERROR PROCESSING FLAG (NONZERO IF PROCES-
*                            AN ERROR)
 SBMF     CON    0           STATUS BUFFER MOVE FLAG (0=SB NOT MOVED) 
          SPACE  4,20 
** PRS -  PRESET PROGRAM. 
* 
*         STORES THE CHANNEL INTO THE LOCATIONS CONTAINED IN THE
*         CHANNEL TABLE AND ADJUSTS THE DELAY CONSTANTS IF 2X PP. 
*         THE TABLE OF CONSTANTS MUST FOLLOW THE CHANNEL TABLES 
*         ZERO WORD.
* 
*                  .. (A) = FWA OF TABLE
*                  .. 
*               CHANNEL TABLE 
*                  .. 
*                  .. 
*               ZERO WORD, TERMINATES CHANNEL TABLE 
*                  .. 
*                  .. 
*               CONSTANTS TABLE 
*                  .. 
*                  .. 
*               ZERO WORD, TERMINATES CONSTANTS TABLE 
* 
*         ENTRY  (A) = CHANNEL TABLE ADDRESS. 
*                (BD.CHAN) = CHANNEL. 
* 
*         EXIT   NONE.
* 
*         USES   D.T0, D.T1.
* 
*         CALLS  NONE.
  
 PRSX     LJM    *           ENTRY / EXIT 
 PRS      EQU    *-1
          STD    D.T0        SET FWA OF CHANNEL TABLE 
 PRS1     LDI    D.T0 
          ZJN    PRS2        IF END OF TABLE
          STD    D.T1 
          LDI    D.T1 
          SCN    37B         CLEAR CHANNEL FIELD
          LMM    BD.CHAN     OR IN THE CHANNEL
          STI    D.T1 
          AOD    D.T0 
          UJN    PRS1        COMPLETE ALL WORDS 
  
 PRS2     EQU    *
 PRS3     AOD    D.T0 
          LDI    D.T0 
          ZJN    PRSX        IF END OF DELAY CONSTANT TABLE 
          STD    D.T1 
          LDI    D.T1 
          SCN    77B
          ADM    BD.SPEED 
          STI    D.T1 
          UJN    PRS3        LOOP 
  
 PRS4     LDD    D.T1 
          STD    BA 
          LDC    ER.COV      PRS-CONSTANT OVERFLOW (BA)=ADR 
          LJM    ERP
          SPACE  4,20 
**        PSW - PRESET WRITE SEQUENCE OVERLAY.
* 
*         PSW PRESETS THE CHANNEL, ADJUSTS THE DELAY CONSTANTS, CLEARS
*         WORDS TRANSMITTED AND SELECTS THE MSA/DEVICE VIA *CIS*.  THE
*         WORD COUNT REGISTER (WC) IS CHECKED TO ENSURE THERE ARE SOME
*         WORDS TO WRITE, IF (WC) IS ZERO AN ERROR IS REPORTED.  KEY
*         LOCATIONS USED IN *WTS* ARE PRESET AS INDICATED BELOW.
* 
*         ENTRY  NONE.
* 
*         EXIT   D.Z1, D.Z3, WT, SB+WTO = ZERO. 
*                D.Z7 = NUMBER OF 24-BIT WORDS TO TRANSFER PRIOR TO 
*                       ISSUING THE WRITE TAGS. 
* 
*         USES   D.Z1, D.Z3, D.Z7.
* 
*         CALLS  CIS, PRS.
  
 PSWX     LJM    *           ENTRY / EXIT 
 PSW      EQU    *-1
          LDN    0
          STD    WT          ZERO WORDS TRANSMITTED 
          STM    SB+WTO 
          LDC    TCHWT
          RJM    PRS         PRESET CHANNEL AND DELAY CONSTANTS 
          RJM    CIS         SELECT THE MSA AND DEVICE
          LDN    SQWTS
          STD    SEQN        SET THE WRITE SEQUENCE CODE
          LDN    0           ZERO KEY LOCATIONS 
          STD    D.Z1 
          STD    D.Z3 
          LDC    OBL/2       PRESET WORDS TO XFER 
          STD    D.Z7 
          UJN    PSWX        RETURN 
 NOSBE    IFEQ   NOSBE,1
          SPACE  4,20 
**        EXR  - EXECUTE OVERLAY. 
* 
*         THE OVERLAY NAME CONTAINED IN THE *A* REGISTER IS LOADED
*         AND EXECUTED. 
* 
*         ENTRY  (A) = OVERLAY NAME.
* 
*         EXIT   NONE.
* 
*         USES   D.T6, D.T7.
* 
*         CALLS  R.OVL, OVERLAY JUST LOADED.
  
 EXRX     LJM    *           ENTRY /EXIT
 EXR      EQU    *-1
          SHN    12 
          STD    D.T6        STORE OVERLAY NAME IN D.T6, D.T7 LEFT
          SHN    12          JUSTIFIED
          SCN    77B
          STD    D.T7 
          LDC    XOVLHD 
          RJM    R.OVL       LOAD OVERLAY 
          RJM    XOVLEN      EXECUTE OVERLAY
          UJN    EXRX        RETURN 
 NOSBE    ENDIF 
          SPACE  4,20 
**        SVSB - SAVE STATUS BUFFER.
* 
*         WHILE PROCESSING AN ERROR, THE STATUS BUFFER IS COPIED TO 
*         THIS BUFFER PRIOR TO REQUESTING SENSE TO MAINTAIN THE 
*         ORIGINAL ERROR CONDITION.  THE STATUS BUFFER IS RESTORED
*         AFTER OBTAINING SENSE, SEE *SBR*. 
* 
  
 SVLF     EQU    *           SAVE LAST FUNCTION 
 SVSB     EQU    SVLF+1      SAVE STATUS BUFFER 
 SVSBE    EQU    SVSB+SNS    LWA OF SAVE BUFFER 
          ERRNG  IB-SVSBE    ERROR IF *SVSB* OVERFLOWS INTO *IB*
  
          SPACE  4,10 
****      BUFFERS.
  
 IB       EQU    6532B       INPUT BUFFER FWA 
 IBD      EQU    IB+HACRL    FWA OF THE DATA FIELD WITHIN *IB*
 OB       EQU    IB+IBL      OUTPUT BUFFER FWA
 OBD      EQU    OB+HACWL    FWA OF THE DATA FIELD WITHIN *OB*
 SB       EQU    OB+OBL      STATUS BUFFER FWA
 BLWA     EQU    SB+SBL      LWA+1 OF BUFFERS 
  
****
          ERRPL  *-IB        ERROR IF PRODUCT OVERLAY OVERFLOW
  
          EJECT 
  
**        THE INITIALIZATION CODE THAT FOLLOWS IS OVERLAYED BY THE
*         PRODUCT OVERLAY BUFFERS ABOVE.
  
*         STORE EQUIPMENT AND CONNECT CODES 
  
 INIT     LDM    BD.EQ
          STD    D.T6        SAVE 
          LPC    7000B
          STM    EQFTN       SAVE COUPLER EQUIPMENT CODE
          STM    EQFRE       SAVE COUPLER EQUIPMENT CODE
  
*         SET THE MSA AND DEVICE ADDRESS. 
  
          LDM    BD.EQ1 
          LPN    7           SAVE THE DEVICE ADDRESS
          STD    D.T2 
          LMN    7           COMPLIMENT DEVICE ADDRESS
          RAM    INIT01      ADD IN SHIFT COUNT 
          LDN    1
 INIT01   SHN    **          POSITION FOR *BSDA* (INTERRUPT BIT)
          STM    DIIPS       (2**7=DEV 0, 2**0=DEV 7) 
          LDC    TDVAD
          RJM    SMD         SET THE DEVICE ADDRESS 
          LDC    7407B
          STM    SMD2        MASK FOR MSA ADDRESS 
          LDD    D.T6 
          LPN    70B
          SHN    -3 
          STD    D.T7        SAVE FOR 3 OF 6 CODE 
          SHN    7-2         POSITION TO MSA ADDRESS BITS 
          STD    D.T2 
          LDC    TMSAAD 
          RJM    SMD         SET THE MSA ADDRESS
          LDD    D.T7 
          LMN    7           COMPLIMENT MSA ADDRESS 
          RAM    M36VTS      FORM THE MSA 3 OF 6 CODE 
  
*         SET DELAY TIME BASED ON SPEED OF PPU
  
          LDC    TSPEDL 
          STD    D.T0 
 INIT1    LDI    D.T0 
          ZJN    INIT2       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    INIT1       COMPLETE ALL WORDS 
  
  
*         STORE I/O CHANNEL INTO COMMANDS 
  
 INIT2    LDC    TCHAN
          RJM    PRS         PRESET CHANNEL AND DELAY CONSTANTS 
  
*         WRITE PP MESSAGES TO CM 
  
 INIT4    LDM    BD.MSGA     GET PP MESSAGE AREA ADDRESS
          STD    ABTL        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 
 INIT10   LDM    PPMSGS,D.Z1 GET PP MESSAGE WORD
          ZJN    INIT12      IF END OF MESSAGE
 INIT11   STM    D.T0,D.Z2   STORE IN D.T0+ 
          AOD    D.Z1        BUMP PP MESSAGE POINTER
          UJN    INIT13 
 INIT12   LDC    2R          MESSAGE END, STORE BLANKS
          STM    D.T0,D.Z2
 INIT13   AOD    D.Z2        BUMP D.T0+ POINTER 
          SBN    5
          NJN    INIT10      IF NOT 5 PP WORDS
          STD    D.Z2        CLEAR POINTER
          LDD    D.RA        PUT RA IN A REG
          SHN    6
          ADD    ABTL        ADD MESSAGE ADDRESS
          CWD    D.T0        WRITE ONE WORD FROM D.T0 
          AOD    ABTL        UPDATED ADDRESS
          AOD    D.Z3        BUMP CM WORD COUNTER 
          SBN    BD.MSGML 
          NJN    INIT10      IF NOT BD.MSGML CM WORDS 
          STD    D.Z3        CLEAR CM WORD COUNTER
          LDM    PPMSGS,D.Z1
          ZJN    INIT14      IF MESSAGE ENDED IN ZERO BYTE
          AOD    D.Z1        SKIP ZERO BYTE TERMINATOR
 INIT14   AOD    D.Z1        BUMP PP MESSAGE ADDRESS TO NEXT MESSAGE
          LDM    PPMSGS,D.Z1
          NJN    INIT11      IF NOT LAST MESSAGE
  
*         CLEAR THE STATUS BUFFER 
  
          STD    D.Z1 
 INIT15   LDN    0           CLEAR THE STATUS BUFFER (SB) 
          STM    SB,D.Z1
          AOD    D.Z1 
          ADC    -SBL 
          MJN    INIT15      IF NOT LAST LOCATION 
  
*         SET DIRECT CELLS
  
          LDC    7767B       SET DEFAULT WORD COUNT 
          STD    WC 
          LDN    0
          STD    ABTL        CLEAR ABT ADDRESS
          STD    ABTU 
          STD    WT          CLEAR WORDS TRANSMITTED REGISTER 
          STD    RIF         CLEAR RESET INTERRUPT FLAG 
          STD    EDI         CLEAR EXPECTED DEVICE INTERRUPT FLAG 
          STD    SEQN        CLEAR MSF SEQUENCE CODE WORD 
  
*         ENSURE ASSIGNED DEVICE CODE IS SUPPORTED
  
          LDD    DC 
          LMC    DMST 
          ZJN    INIT16      IF CORRECT DEVICE CODE ASSIGNED
          LDC    INITA
 INIT16   LJM    START       RETURN TO BASIC DRIVER 
  
 INITA    DIS    ,* DC NOT SUPPORTED.*
          SPACE  4,20 
**        SMD -  SET MSA AND DEVICE ADDRESS.
* 
*         THE WORD(S) DEFINED BY THE TABLE ADDRESS ARE MASKED WITH
*         THE CONSTANT *SMD2*, THE RESULT OR-ED WITH (D.T2) AND STORED
*         BACK INTO THE SAME LOCATION.  A ZERO TABLE ENTRY TERMINATES.
* 
*         ENTRY  (A)    = TABLE ADDRESS 
*                (SMD2) = MASK
*                (D.T2) = BITS TO BE OR-ED AFTER THE MASK 
* 
*         EXIT   NONE.
* 
*         USES   D.T0, D.T1.
* 
*         CALLS  NONE.
  
 SMDX     LJM    *           ENTRY / EXIT 
 SMD      EQU    *-1
          STD    D.T0        TABLE POINTER
 SMD1     LDI    D.T0 
          ZJN    SMDX        IF END OF TABLE
          STD    D.T1 
          LDI    D.T1 
          LPC    7770B       PRESET FOR DEVICE ADDRESS MASK 
 SMD2     EQU    *-1
          LMD    D.T2 
          STI    D.T1        RESTORE
          AOD    D.T0 
          UJN    SMD1        LOOP 
          TITLE  ERROR MESSAGES FOR MST.
 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.AAD,EC.AAD,(CH ACTIVE AFTER DCN)
          MMSG   ER.AAF,EC.AAF,(CH ACTIVE AFTER FTN)
          MMSG   ER.ABF,EC.ABF,(CH ACTIVE BEFORE FTN) 
          MMSG   ER.BAI,EC.BAI,(MSA/DEV BUSY AFTER INT) 
          MMSG   ER.BPX,EC.BPX,(BUFFER TO PP XFER ERR),1
          MMSG   ER.BSY,EC.BSY,(MSA BUSY) 
          MMSG   ER.CK2,EC.CK2,(CHECK 2 ERROR)
          MMSG   ER.CNC,EC.CNC,(COUPLER NOT CONNECTED)
          MMSG   ER.COV,EC.COV,(PRS-DLY C. OVERFLOW (BA)=ADR),1 
          MMSG   ER.DSE,EC.DSE,(DEVICE STATUS ERROR)
          MMSG   ER.FBO,EC.FBO,(CH FULL BEFORE OUTPUT)
          MMSG   ER.FPN,EC.FPN,(FTN PARAM NOT ACCEPTED) 
          MMSG   ER.FSI,EC.FSI,(FIRST SYNC IN T/O)
          MMSG   ER.HIF,EC.HIF,(CK-2 OR HOT INTERFACE)
          MMSG   ER.ICH,EC.ICH,(INVALID CC OR HH) 
          MMSG   ER.ITO,EC.ITO,(INDEX TIME-OUT) 
          MMSG   ER.IXD,EC.IXD,(INDEX DID NOT DROP) 
          MMSG   ER.I36,EC.I36,(INVALID 3 OF 6 CODE)
          MMSG   ER.IAA,EC.IAA,(CH INACTIVE AFTER ACN)
          MMSG   ER.IAI,EC.IAI,(CH INACTIVE AFTER IAN)
          MMSG   ER.MRE,EC.MRE,(MSA RESET DID NOT CLEAR SA1)
          MMSG   ER.NCL,EC.NCL,(NE+CK2+LAST SYNC IN T/O)
          MMSG   ER.NDI,EC.NDI,(NO DEVICE INTERRUPT)
          MMSG   ER.NFI,EC.NFI,(NO FULL ON AN INPUT)
          MMSG   ER.PBX,EC.PBX,(PP TO BUFFER XFER ERR),1
          MMSG   ER.SA1,EC.SA1,(SELECT ALERT 1) 
          MMSG   ER.TRE,EC.TRE,(TAG RESPONCE ERROR) 
          MMSG   ER.WTO,EC.WTO,(WRITE TIME-OUT) 
          MMSG   ER.WER,EC.WER,(WRITE ERROR)
          MMSG   ER.XLE,EC.XLE,(XFER LENGTH ERR),1
 MMSGL.   EQU    MMSGL
          DATA   0
****
**        TCHAN - TABLE OF CHANNEL INSTRUCTIONS.
  
 TCHAN    EQU    *           CREATE CHANNEL TABLE 
          LIST   D
          HERE
          LIST   *
          CON    0           END OF CHANNEL TABLE 
  
**        TDLYC - INSTRUCTIONS SET FOR PPU SPEED
* 
*         THIS TABLE MUST FOLLOW THE CHANNEL TABLE TERMINATOR AND 
*         REQUIRES AT LEAST A ZERO TERMINATOR ENTRY.
  
 TDLYC    EQU    *
          VFD    12/DCCIS 
          VFD    12/DCIPS 
          VFD    12/DCSRS 
          CON    0           END OF DELAY CONSTANTS TABLE 
          SPACE  4,20 
**        TSPEDL - TABLE OF PP SPEED SWITCHES.
* 
*         THE FOLLOWING TABLE CONTAINS THE ADDRESS OF INSTRUCTIONS
*         *ADN 2 / SBN 2* THAT ARE CHANGED TO *ADN 1 / SBN 1* WHEN
*         EXECUTING ON A 2X PP. 
  
 TSPEDL   VFD    12/DLOFP 
          VFD    12/DLWAF 
          VFD    12/DLFTN 
          CON    0           END OF SPEED SWITCHES TABLE
          SPACE  4,20 
**        TDVAD  - LOCATIONS THAT REQUIRE A DEVICE ADDRESS. 
  
 TDVAD    VFD    12/DVCIS1
          VFD    12/DVCIS2
          VFD    12/DVSRS 
          VFD    12/DVUES1
          VFD    12/DVUES2
          VFD    12/DVSRS 
          VFD    12/MDSEL 
          VFD    12/MDSRS 
          CON    0           TABLE TERMINATOR 
          SPACE  4,20 
**        TMSAAD - LOCATIONS THAT REQUIRE A MSA ADDRESS.
  
 TMSAAD   VFD    12/MSIPS 
          VFD    12/MDSEL 
          VFD    12/MDSRS 
          VFD    12/M36VTS
          CON    0           TABLE TERMINATOR 
          SPACE  4,20 
**        CHECK FOR ASSEMBLY OVERFLOW.
  
          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 MST OVERLAY OVERFLOW
  
  
 XOVL     EQU    7777B-500B  FWA OF OVERLAY.
 XOVLEN   EQU    XOVL+1      OVERLAY ENTRY ADDRESS. 
 XOVLHD   EQU    XOVL-5      FWA OF OVERLAY LOAD (6PPM TABLE).
  
          TITLE  MSF WRITE SEQUENCE OVERLAY "WOV".
 "WOV"    SEGMENT XOVL
*CALL,VERS
          COMMENT OVERLAY FOR MST PRODUCT OVERLAY "VERS"
          ORG     XOVL
          SPACE  4,20 
**        WTS -  WRITE SEQUENCE.
* 
*         TRANSFERS DATA TO THE MSA VIA THE COUPLERS MEMORY. *WTS* IS 
*         CALLED BY ALL COMMANDS THAT TRANSFER DATA TO THE MSA. THE 
*         ONLY DIFFERENCE IN THE VARIOUS COMMANDS IS HOW THE NUMBER OF
*         ACTUAL DATA BYTES IS SPECIFIED, SEE BELOW UNDER THE VARIOUS 
*         COMMANDS.  REGISTER *WC* CONTAINS A 24-BIT WORD COUNT WHICH 
*         INCLUDES THE HA, COUNT AND DATA FIELDS. THE WT REGISTER WILL
*         BE SET TO THE NUMBER OF 24-BIT WORDS TRANSFERED TO THE
*         COUPLERS MEMORY, SB(WTO) BIT 2**0 WILL BE SET IF AN ODD 
*         (CLEAR IF EVEN) NUMBER OF 12-BIT WORDS WERE TRANSFERED. THE 
*         TYPE OF COMMAND IS DETERMINED BY THE CODE IN (WTSQF), SEE 
*         ENTRY BELOW.
* 
*         COMMANDS_ 
* 
*         WRITE - WC 24-BIT WORDS ARE TRANSMITTED, THE DATA LENGTH
*                 IS CALCULATED BY SUBTRACTING THE LENGTH OF THE HA 
*                 AND COUNT FIELDS FROM (WC) AND MULTIPLYING THE
*                 RESULT BY 3.
* 
*         WRITE TM - IGNORES THE (WC) AND WRITES A ZERO DATA LENGTH 
*                    DATA BLOCK, 11B 24-BIT WORDS ARE TRANSFERED. 
* 
*         ERP      - (WC) MUST BE 13B, 10B FOR THE HA AND COUNT FIELDS
*         LOOPBACK   AND 3 24-BIT WORDS TO CONTAIN THE 7 BYTES OF DATA. 
*                    A DATA LENGTH OF 7 IS ALWAYS WRITTEN.
* 
* 
*         ENTRY  (WC)    = NUMBER OF 24-BIT WORDS TO WRITE. 
*                (WTSQF) = WRITE TAPE MARK FLAG.
*                           0 = WRITE TM. 
*                           1 = LOOPBACK OR ERP.
*                           X = WRITE DATA, IF X .GT. 1.
* 
*         EXIT   (WT)     = NUMBER OF 24-BIT WORDS TRANSFERED TO THE
*                           COUPLERS MEMORY.
*                (SB+WTO) = BIT 2**0 SET IF AN ODD (CLEAR IF EVEN)
*                           NUMBER OF 12-BIT WORDS WERE TRANSFERED. 
* 
*         USES   S3,D.Z1,D.Z3,D.Z4,D.Z7,D.T0,D.T6,D.T7. 
* 
*         CALLS  FBM, FTN, ISW, GST, PSW, STG, WTC. 
  
 WTSX     LJM    *           ENTRY / EXIT 
 WTS      EQU    *-1
          RJM    PSW         PRESET WRITE SEQUENCE
          LDN    FCLR 
          RJM    FTN         CLEAR THE COUPLER
          LDM    WTSQF
          NJN    WTS10       IF NOT *WRITE TM*
          STM    OB+RODW     ZERO 1ST AND 2ND WORDS OF DATA FIELD 
          STM    OB+RODW+1
          STM    OB+ROC+5    ZERO *REC* BYTE IN RO COUNT FIELD
          LDN    22B/2
          STD    D.Z7        NUMBER OF 24-BIT WORDS TO OUTPUT 
          STD    D.Z4 
          AOM    WTSTMF      EXPECT *DL=0* STATUS TO BE SET 
          LDC    NE+CK2 
          STM    WTC8        ONLY CHECK *NORMAL END* AND *CHECK 2*
          LDN    0           DATA LENGTH = 0
          UJN    WTS20
  
 WTS10    SBN    1
          NJN    WTS30       IF NOT ERP OR LOOPBACK 
  
**        FOR *ERP / LOOPBACK* (WC) MUST BE 13B, LENGTH OF HA, RO COUNT 
*         AND DATA FIELDS.  A BYTE COUNT (DATA LENGTH) OF 7 IS ALWAYS 
*         USED. 
* 
  
          LDD    WC 
          STD    D.Z4        PRESET 
          SBN    13B         LENGTH OF HA,COUNT AND DATA FIELDS 
          NJN    WTS40       IF INCORRECT WORD COUNT
          LDN    7           BYTE COUNT (DATA LENGTH) 
 WTS20    UJN    WTS70
  
**        FOR A *WRITE* WC CONTAINS THE NUMBER OF 24-BIT WORDS, 
*         INCLUDING THE HA, COUNT AND DATA FIELDS.
*         THE NUMBER OF 8-BIT BYTES IS CALCULATED AS FOLLOWS- 
*             NBR 8-BIT BYTES = (3 * ((WC) - 8))
  
 WTS30    LDD    WC 
          SBN    8+1
          MJN    WTS40       (WC) MUST BE .GT. HA,COUNT PLUS ONE WORD 
          LDC    4096-8/2    PRESET NUMBER 24-BIT WORDS TO OUTPUT 
          STD    D.Z4        PRIOR TO ISSUING THE WRITE TAGS
          LDD    WC 
          ADC    -4096-8+1
          MJN    WTS50       IF (WC) .LE. MAXIMUM 
 WTS40    LJM    ERRWC
  
 WTS50    LDD    WC 
          SBD    D.Z4 
          PJN    WTS60       IF WORDS TO XFER WHILE WRITE IN PROGRESS 
          ADD    D.Z4 
          STD    D.Z4 
          LDN    0
 WTS60    STD    D.Z3        REMAINING WORDS
          LDD    WC          CALCULATE NUMBER OF 8-BIT BYTES
          SBN    8
          STD    D.T0        SAVE LENGTH OF DATA FIELD IN 24-BIT WORDS
          SHN    1           ((WC) * 2) + (WC) = NBR OF 8-BIT BYTES 
          ADD    D.T0        DATA LENGTH = ((WC-8) * 2) + (WC-8)
 WTS70    STM    OB+DLL      STORE DATA LENGTH
          SHN    -12
          STM    OB+DLU 
          LDM    OB+RODW     FIRST DATA WORD
          LPN    17B
          ADC    0#19S4      ADD ID BYTE
          STM    OB+RODW
          SCN    17B
 WTS80    STM    OB,D.Z1       HA FIELD 
          STM    OB+ROC,D.Z1   RO COUNT FIELD 
          AOD    D.Z1 
          SBN    3
          ZJN    WTS90       IF DONE
          LDN    0
          UJN    WTS80       LOOP 
  
 WTS90    RJM    FBM         TRANSFER DATA TO BUFFER MEMORY 
          RJM    STG         ISSUE THE WRITE TAGS 
          CON    TXTCC+CV+C1+C2+CE    SEND A CC AND HH ADDRESS OF ZERO
          CON    0+LNK
          CON    TXTHH+CV+C1+C2+CE
          CON    0+LNK
          CON    TXTCL+CV+C1+C2+CE     TAG - TRANSMIT CONTROL 
          CON    MSPLO+LNK                   START PLO LOCK 
          CON    TOPUP+CV+C1+C2+CE     TAG - OPERATE UP 
          CON    MNSQL+MHSEL+MRSEL+LNK       NOT SQUELCH, HEAD SELECT 
*                                            AND READ SELECT
          CON    TXTCL+CV+C1+C2+CE     TAG - TRANSMIT CONTROL 
          CON    MEPLO+LNK                   END PLO LOCK 
          CON    TWRIT                 TAG - WRITE
          CON    MHA+NRC+ND                  HOME ADDRESS FIELD 
          LDN    100/12*4 
          STD    D.T0 
 WTS100   RJM    ISW
          LPN    LSA2 
          NJN    WTS110      IF INDEX (LATCHED SA 2)
 DCWTS1   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    WTS100      IF NOT TIME OUT
          LJM    ERRITO      INDEX TIME-OUT 
  
 WTS110   RJM    ISW
          LPN    USA2 
          ZJN    WTS120      IF INDEX DROPPED (SA 2)
          LJM    ERRIXD      INDEX DID NOT DROP 
  
 WTS120   RJM    WTC         GO VERIFY WRITE TAG
          LMN    4           EXPECTED OWC AFTER *HA* TRANSFER 
          NJN    ERXLE1      IF 3 24-BIT WORDS WERE NOT TRANSFERED
  
          RJM    STG         SEND WRITE RO COUNT FIELD TAG
          CON    TWRIT
          CON    MROC+NRC+ND
          RJM    ISW
          SHN    17-6 
          PJN    WTS130      IF NOT SELECT ALERT 1
          LJM    ERRSA1      SELECT ALERT 1 
  
 WTS130   RJM    WTC
          LMN    4+5         EXPECTED OWC AFTER *RO COUNT* TRANSFER 
          ZJN    WTS140      IF CORRECT NUMBER OF WORDS TRANSFERED
 ERXLE1   LJM    ERRXLE      IF TRANSFER LENGTH ERROR 
  
 WTS140   RJM    STG         SEND WRITE RO DATA FIELD TAG 
          CON    TWRIT
          CON    MROD+NRC+ND
          RJM    WTC
          LDC    20000/69*4 
          STD    D.T0 
 WTS150   RJM    CTS         GET CTL STATUS 
          LPC    CK2+LSA2 
          NJN    WTS160      IF WRITE TERMINATED
 DCWTS2   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    WTS150      IF NOT TIME OUT
          LJM    ERRWTO      WRITE TERMINATE TIME-OUT 
  
 WTS160   SHN    17-7 
          PJN    WTS170      IF NO ERROR (CHECK 2)
          LJM    ERRWER      WRITE ERROR
  
 WTS170   RJM    GST         GET ALL COULPER STATUS WORDS 
          LDM    SB+CSW 
          SHN    -9          *DL=0* STATUS BIT
          LPN    1
 WTSTMF   LMN    0
*         LMN    1           IF WRITE TM
          ZJN    WTS180      IF CORRECT NUMBER OF WORDS TRANSFERED
          LJM    ERRXLE      TRANSFER LENGTH ERROR
  
 WTS180   RJM    STG
          CON    TODWN+CV+C1+C2+CE
          CON    MHSEL       DROP HEAD SELECT 
          RJM    UES         DROP SELECT HOLD 
          LJM    WTSX        RETURN 
          SPACE  4,20 
**        WTC -  WRITE TAG CHECK. 
* 
*         VERIFY THE MSA(S) RESPONCE TO A WRITE TAG.
* 
*         ENTRY  CHANNEL CONDITIONED FOR INPUT OF TAG RESPONCE STATUS,
*                (I.E. ACTIVE AND FULL).
* 
*         EXIT   (A) = OUTPUT WORD COUNTER. 
*                CHANNEL DEACTIVE.
* 
*         USES   D.T0.
* 
*         CALLS  ACN, DCN, FBM, FIN, FTN, ISW.
  
 WTCX     LJM    *           ENTRY / EXIT 
 WTC      EQU    *-1
          RJM    ISW         INPUT TAG RESPONCE (CTL STATUS)
          STM    SB+LTS 
          LPN    TV 
          NJN    WTC1        IF TAG VALID 
          LJM    ERRTRE      TAG RESPONCE ERROR 
  
 WTC1     LDN    24        125 USEC DELAY 
          STD    D.T0 
 WTC2     RJM    ISW         INPUT TAG RESPONCE (CTL STATUS)
          STM    SB+LTS 
          LPN    FSYIN
          NJN    WTC3        IF 1ST SYNC IN 
 DCWTC1   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    WTC2        IF NOT T/O 
          LJM    ERRFSI      FIRST SYNC IN TIME-OUT 
  
 WTC3     LDM    SB+LTM 
          LMN    MROD 
          NJN    WTC5        IF NOT DATA FIELD
          LDD    D.Z3 
          ZJN    WTC4        IF NO MORE WORDS TO OUTPUT 
          STD    D.Z4 
          RJM    FBM         GO FILL BUFFER MEMORY
          LDN    FCTLS
          RJM    FTN
          RJM    ACN
 WTC4     LDC    50000/50*4          50 MSEC
          UJN    WTC6 
  
 WTC5     LDC    3000/50*4
 WTC6     STD    D.T0 
 WTC7     RJM    ISW         INPUT TAG RESPONCE (CTL STATUS)
          STM    SB+LTS 
          LPC    NE+CK2+LSIET 
*         LPC    NE+CK2      IF WRITE TM
 WTC8     EQU    *-1
          ZJN    WTC9        IF NORMAL END, NOT CK2 AND NOT LAST
*                            SYNC IN TO NORMAL END TIME OUT 
          LDN    11 
 WTC8A    SBN    1           ADD 22 CYCLES TO LOOP
          NJN    WTC8A
 DCWTC2   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    WTC7        IF TIME OUT HAS NOT EXPIRED
          LJM    ERRNCL      NE+CK2+LAST SYNC IN TIME-OUT 
  
 WTC9     RJM    DCN
          LDN    FOWCS
          RJM    FIN         GET OUTPUT WORD COUNTER
          LJM    WTCX        RETURN 
          SPACE  4,20 
**        FBM -  FILL BUFFER MEMORY.
* 
*         TRANSFERS (D.Z4) 24-BIT WORDS FROM OB TO THE COUPLERS MEMORY. 
*         (D.Z7) CONTAINS THE NUMBER OF 24-BIT WORDS TO TRANSFER ON 
*         THE INITIAL PASS, THEN (D.Z7) IS CHANGED TO THE DATA FIELD
*         LENGTH AND THE OUTPUT ADDRESS IS SET TO THE FWA OF THE DATA 
*         FIELD WITHIN THE OUTPUT BUFFER.  THE OB(DATA FIELD) IS THAN 
*         WRITTEN UNTIL (D.Z4) 24-BIT WORDS HAVE BEEN TRANSFERED. 
*         UPDON COMPLETION OF THE COMPLETE TRANSFER (NO ERRORS) THE 
*         COUPLERS STATUS WORD IS CHECKED TO ENSURE NONE OF THE 
*         FOLLOWING ARE SET-
*                DEADMAN TIMEOUT
*                BUFFER UNDERRUN
*                BUFFER OVERRUN 
*                PARITY ERROR 
*         AND THAT *DATA IN BUFFER* IS SET. 
*         THE ACTUAL NUMBER OF 24-BIT WORDS TRANSFERED WILL BE STORED 
*         IN *WT* AND SB+WTO 2**0 SET IF AN ODD (CLEAR IF EVEN) NUMBER
*         OF 12-BIT WORDS WERE TRANSFERED.
* 
* 
*         ENTRY  (D.Z4) = NUMBER OF 24-BIT WORDS TO TRANSFER. 
*                (D.Z7) = PRESET TO LENGTH OF TRANSFER IN 24-BIT WORDS. 
* 
*         EXIT   (WT)     = CUMULITIVE NUMBER OF 24-BIT WORDS TRANSFERED
*                (SB+WTO) = BIT 2**0 SET IF AN ODD (CLEAR IF EVEN)
*                           NUMBER OF 12-BIT WORDS WERE TRANSFERED. 
* 
*         USES   WT, SB+WTO, D.Z1, D.Z4, D.Z7.
* 
*         CALLS  ACN, DCN, FIN, FTN, GST. 
  
 FBMX     LJM    *           ENTRY / EXIT 
 FBM      EQU    *-1
  
          RJM    DCN         ENSURE CHANNEL IS DEACTIVE 
          LDN    FWTBM
          RJM    FTN         SET PP TO BUFFER MODE
          RJM    ACN
 FBM10    LDD    D.Z4        TOTAL NO. 24-BIT WORDS TO TRANSFER 
          ZJN    FBM40       IF DONE
          SBD    D.Z7        LENGTH OF TRANSFER 
          PJN    FBM20       IF NO. WORDS .GT. TRANSFER LENGTH
          ADD    D.Z7 
          STD    D.Z7 
          LDN    0
 FBM20    STD    D.Z4 
          LDD    D.Z7 
          SHN    1           (A) = NBR 12-BIT WORDS 
          IJM    ERRPBX,**
          OAM    OB,**
*         OAM    OBD,**      SECOND AND SUCCEEDING PASS 
 FBM30    EQU    *-1
          NJN    FBM50       IF INCOMPLETE TRANSFER 
          LDD    D.Z7 
          RAD    WT          UPDATE 24-BIT WORDS TRANSFERED 
          LDC    OBDL/2      LENGTH OF DATA FIELD IN 24-BIT WORDS 
          STD    D.Z7 
          LDC    OBD
          STM    FBM30       OUTPUT FROM DATA FIELD 
          UJN    FBM10       LOOP 
  
 FBM40    RJM    DCN
          RJM    GST         COPY COUPLER STATUS
          LDM    SB+CSW 
          LPC    DMTO+BUR+BOR+PTYER+DINB
          LMN    DINB        EXPECT *DATA IN BUFFER (DINB)* ONLY
          NJN    FBM60       IF STATUS ERROR
          LJM    FBMX        RETURN 
  
 FBM50    SHN    17-0        WDS/2 AND SAVE 2**0
          STD    D.Z1        SAVE NBR 24-BIT WORDS REMAINING
          SHN    -17         SAVE ODD/EVEN NBR OF 12-BIT WORDS
          STM    SB+WTO 
          LDD    D.Z7 
          SBD    D.Z1 
          RAD    WT 
 FBM60    LJM    ERRPBX      PP TO BUFFER XFER ERROR
          SPACE  4,20 
**        TCHWT - TABLE OF CHANNEL INSTRUCTIONS.
  
 TCHWT    EQU    *
          LIST   D
          HERE
          CON    0           TABLE TERMINATOR 
          LIST   *
  
**        TDCWT - INSTRUCTIONS SET FOR PPU SPEED
*         THIS TABLE MUST FOLLOW THE CHANNEL TABLE TERMINATOR AND 
*         REQUIRES AT LEAST A ZERO TERMINATOR ENTRY.
  
 TDCWT    VFD    12/DCWTC1
          VFD    12/DCWTC2
          VFD    12/DCWTS1
          VFD    12/DCWTS2
          CON    0           END OF DELAY CONSTANTS TABLE 
          SPACE  4,10 
**        CHECK FOR CODE OVERFLOW 
  
          IFEQ   NOS,1
 .1       SET    XOVL 
 .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 "WOV" OVERLAY OVERFLOW
  
          TITLE  MSF READ SEQUENCE OVERLAY "ROV". 
 "ROV"    SEGMENT XOVL
*CALL,VERS
          COMMENT OVERLAY FOR MST PRODUCT OVERLAY "VERS"
          ORG     XOVL
          SPACE  4,20 
**        RDS -  READ SEQUENCE. 
* 
*         SELECTS THE MSA AND DEVICE VIA CPU INITIATED SELECT *CIS* AND 
*         PERFORMS A MSF READ SEQUENCE TO READ ONE TAPE BLOCK INTO
*         THE COUPLERS MEMORY.  THE DATA IS THEN TRANSFERED FROM THE
*         COUPLERS MEMORY TO THE INPUT BUFFER (IB), A MAXIMUM OF *IBL*
*         PP WORDS ARE TRANSFERED TO *IB*.  IF THE MEMORY CONTAINS
*         MORE THAN *IBL* WORDS THE REMAINING WORDS ARE READ BUT
*         DISGARDED.  REGISTER WT WILL BE SET TO THE NUMBER OF 24-BIT 
*         WORDS ACTUALY READ, IF THE READ TERMINATED ABNORMALLY SB+WTO
*         2**0 WILL BE SET IF AN ODD (CLEAR IF EVEN) NUMBER OF 12-BIT 
*         WORDS WERE TRANSFERED.
* 
*         ENTRY  (EQFTN) = COUPLER EQUIPMENT NUMBER (E000). 
* 
*         EXIT   (WT)     = NUMBER OF 24-BIT WORDS TRANSFERED.
*                (SB+WTO) = BIT 2**0 SET IF AN ODD (CLEAR IF EVEN)
*                           NUMBER OF 12-BIT WORDS WERE TRANSFERED. 
* 
*         USES   D.T6, D.T7, SEQN, WT, SB+WTO.
* 
*         CALLS  CIS, FIN, FTN, GST, OFP, PRS, RDC, STG.
  
 RDSX     LJM    *           ENTRY / EXIT 
 RDS      EQU    *-1
          LDN    0           CLEAR WORDS TRANSFERED 
          STD    WT 
          STM    SB+WTO 
          RJM    CIS         SELECT MSA AND DEVICE
          LDN    SQRDS
          STD    SEQN        SET THE SEQUENCE CODE
          LDC    TCHRD
          RJM    PRS         SET THE CHANNEL AND ADJUST DELAY CONSTANTS 
          LDM    EQFTN       SET EQUIPMENT NUMBER 
          ADC    TREAD
          STM    EQRDS
          LDN    FCLR 
          RJM    FTN         CLEAR THE COUPLER
  
**        ZERO *IBL* WORDS IN THE COUPLERS MEMORY AND *IB* PRIOR TO 
*         ISSUING THE READ TAGS.
  
          LDN    0
          STD    D.Z2 
 RDS1     LDN    0
          STM    IB,D.Z2
          AOD    D.Z2 
          ADC    -IBL 
          MJN    RDS1        CLEAR ALL OF IB
          LDN    FWTBM
          RJM    FTN
          RJM    ACN
          LDC    IBL/2*2     EVEN NUMBER OF 12-BIT WORDS
          OAM    IB,**       WRITE IB TO MEMORY 
          ZJN    RDS2        IF COMPLETE TRANSFER 
          SHN    17-0        WDS/2 AND SAVE 2**0
          STD    D.Z1        SAVE REMAINING WORDS 
          SHN    -17         SAVE ODD/EVEN NBR OF 12 BIT WORDS
          STM    SB+WTO 
          LDC    IBL/2
          SBD    D.T1 
          STD    WT 
          LJM    ERRPBX      PP TO BUFFER ERROR 
  
 RDS2     RJM    DCN
          LDN    FCLR 
          RJM    FTN         CLEAR THE COUPLER (COUNTERS) 
          LDN    2
          STD    D.T7        EXPECTED INPUT WORD COUNTER
          RJM    STG
          CON    TXTCL+CV+C1+CE        TAG - TRANSMIT CONTROL 
          CON    MSPLO+LNK                   START PLO LOCK 
          CON    TOPUP+CV+C1+CE        TAG - OPERATE UP 
          CON    MNSQL+MHSEL+MRSEL+LNK       NOT SQUELCH, HEAD SELECT 
*                                            AND READ SELECT
          CON    TXTCL+CV+C1+CE        TAG - TRANSMIT CONTROL 
          CON    MEPLO+LNK                   END PLO LOCK 
          CON    TREAD                 TAG - READ 
          CON    MHA+NRC+ND                  HOME ADDRESS FIELD 
          RJM    RDC
          LDN    FIWCS
          RJM    FIN         GET THE INPUT WORD COUNTER STATUS
          SBD    D.T7 
          ZJN    RDS3        IF 3 24-BIT WORDS TRANSFERED 
          LJM    ERRXLE      TRANSFER LENGTH ERROR
  
 RDS3     RJM    STG
          CON    TREAD                 TAG - READ 
          CON    MROC+NRC+ND                 RO COUNT FIELD 
          AOM    RCFF        SET READ COUNT FIELD FLAG
          RJM    RDC
          RJM    RBM         READ BUFFER MEMORY INTO INPUT BUFFER (IB)
          RJM    STG
          CON    TODWN+CV+C1+CE        TAG - OPERATE DOWN 
          CON    MHSEL                       DROP HEAD SELECT 
          LDD    D.T6 
          NJN    RDS4        IF TAPE MARK 
          LDM    SB+CSW 
          SHN    17-9 
          PJN    RDS4        IF DATA LENGTH OK
          LJM    ERRXLE      TRANSFER LENGTH ERROR
  
 RDS4     RJM    UES         DROP SELECT HOLD 
          LJM    RDSX        RETURN 
          SPACE  4,20 
**        RDC -  READ CHECK.
* 
*         VERIFY THE MSA(S) RESPONCE TO A READ TAG. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (A) = INPUT WORD COUNTER 
* 
*         USES   D.T0, D.T1, D.T6.
* 
*         CALLS  FIN, ISW, DCN. 
  
  
 RDCX     LJM    *           ENTRY / EXIT 
 RDC      EQU    *-1
  
 RDC1     RJM    ISW         INPUT TAG RESPONCE (CTL STATUS)
          STM    SB+LTS 
          LPN    TV 
          NJN    RDC2        IF TAG VALID 
          LJM    ERRTRE      TAG RESPONCE ERROR 
  
 RDC2     LDN    250/27*4 
          STD    D.T0 
 RDC3     RJM    ISW         GET TAG STATUS (CTL STATUS WORD) 
          STM    SB+LTS 
          SHN    17-2 
          MJN    RDC4        IF 1ST SYNC IN 
 DCRDC1   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    RDC3        IF TIME OUT HAS NOT EXPIRED
          LJM    ERRFSI      1ST SYNC IN TIME-OUT 
  
 RDC4     SHN    18+17-6-17+2 
          PJN    RDC5        IF NOT SELECT ALERT 1
          LJM    ERRSA1      SELECT ALERT 1 ERROR 
  
**        80 MSEC DELAY MINIMUM, ACTUAL DELAY = 116.5 MSEC. 
* 
  
 RDC5     LDN    80000/13/4096*4
          STD    D.T1 
          LDN    0
          STD    D.T0 
 RDC6     IAN    **+40B      THIS CTL STATUS WORD IS 10(5) USEC OLD 
          IAN    **+40B      GET UPDATED CTL STATUS 
          LPC    TM+NE+CK2+LSIET
          ZJN    RDC9        IF NORMAL END AND NO ERROR OR TM 
          SOD    D.T0 
          NJN    RDC6        IF TIME-OUT HAS NOT EXPIRED
 DCRDC2   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T1 
          NJN    RDC6        IF TIME-OUT HAS NOT EXPIRED
          RJM    ISW         RE-READ STATUS 
          SHN    17-10
          MJN    RDC7        IF TAPE MARK 
          LJM    ERRNCL 
  
 RDC7     RJM    ISW         RE-READ STATUS AGAIN 
          STM    SB+LTS        AND SAVE IT
          LPC    TM 
          STM    SB+WTO      SAVE TM STATUS FOR MODULE
          STD    D.T6        SAVE TM STATUS BIT 
          DCN    **+40B 
          LJM    RDCX        RETURN 
  
 RDC9     LDN    ** 
*         LDN    1           IF READING COUNT FIELD 
 RCFF     EQU    *-1
          ZJN    RDC7        IF NOT READ COUNT FIELD, RETURN
          DCN    **+40B 
  
**        THE *READ RO DATA* TAG MUST BE ISSUED WITHIN 30 USEC
*         FOLLOWING NOMAL END OF THE *READ RO COUNT* TAG. 
*         ISSUING THIS TAG VIA *STG* WOULD EXCEED THE 30 USEC.
  
          FNC    TREAD,**+40B 
*         FNC    EQ+TREAD,**+40B
 EQRDS    EQU    *-1
          LDN    4
 RDC10    IJM    RDC11,** 
 DLRDC    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    RDC10       WAIT INACTIVE
          LJM    ERRAAF      CHANNEL ACTIVE AFTER A FUNCTION
 RDC11    ACN    **+40B 
          LDN    MROD 
          OAN    **+40B 
          STM    SB+LTM      SAVE TAG MODIFIER
          LDN    4
 RDC12    EJM    RDC13,**    EXIT IF PARAMETERS ACCEPTED
 DLRDC1   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    RDC12       WAIT EMPTY 
          LJM    ERRFPN      ERROR IF FTN PARAMS NOT ACCEPTED 
 RDC13    SOM    RCFF        CLEAR READ COUNT FIELD FLAG
          LJM    RDC1        RE-ENTER *RDC* 
          SPACE  4,20 
**        RBM -  READ BUFFER MEMORY.
* 
*         READ THE NUMBER OF WORDS SPECIFIED BY THE COUPLERS WORD 
*         COUNTER INTO THE INPUT BUFFER (IB).  IF THE WORD COUNTER
*         INDICATES MORE WORDS THAN THE LENGTH OF IB, ONLY *IBL*
*         WORDS ARE ACTUALLY TRANSFERED INTO IB, THE REMAINING WORDS
*         ARE READ BUT DISGARDED. THE *WT* REGISTER WILL BE SET TO THE
*         ACTUAL NUMBER OF 24-BIT WORDS READ. IF THE TRANSFER 
*         TERMINATED ABNORMALLY, *WT* WILL CONTAIN THE NUMBER OF 24-BIT 
*         WORDS TRANSFERED AND *SB+WTO* 2**0 WILL BE A SET IF AN ODD
*         NUMBER OF 12-BIT WORDS WERE TRANSFERED. THE TOTAL NUMBER OF 
*         12-BIT WORDS TRANSFERED=((WT)*2)+(SB+WTO BIT 2**0). 
* 
* 
*         ENTRY  NONE.
* 
*         EXIT   (WT)     = NUMBER OF 24-BIT WORDS TRANSFERED.
*                (SB+WTO) = BIT 2**0 SET IF AN ODD (CLEAR IF EVEN)
*                           NUMBER OF 12-BIT WORDS WERE TRANSFERED. 
* 
*         USES   D.Z1, D.Z4, WT.
* 
*         CALLS  DCN, FIN, FTN, GST, OFP, WAF.
  
 RBMX     LJM    *           ENTRY/EXIT 
 RBM      EQU    *-1
          LDC    IB 
          STM    RBM3        PRESET INPUT ADDRESS 
          LDC    IBL/2       LENGTH OF TRANSFER IN 24-BIT WORDS 
          STD    D.Z7 
  
          RJM    GST         COPY COUPLERS STATUS 
          LDM    SB+BWC      NUMBER OF 24-BIT WORDS IN MEMORY 
          ZJN    RBMX        IF MEMORY EMPTY
          STD    D.Z4        TOTAL NUMBER OF 24-BIT WORDS TO READ 
 RBM1     SBD    D.Z7 
          PJN    RBM2        IF NUMBER OF WORDS .GT. TRANSFER LENGTH
          ADD    D.Z7 
          STD    D.Z7 
          LDN    0
 RBM2     STD    D.Z4        SAVE REMAINING WORDS 
          LDN    FRDBM
          RJM    FTN         SET BUFFER TO PP MODE
          LDD    D.Z7 
          SHN    1
          RJM    OFP         NUMBER OF 12-BIT WORDS TO TRANSFER 
          RJM    WAF         WAIT FULL
          LDD    D.Z7 
          SHN    1
          IJM    ERRBPX,**   BUFFER TO PP XFER ERROR
          IAM    IB,**       IF INITIAL PASS
*         IAM    IBDUM,**     2ND AND SUCCEEDING PASS 
 RBM3     EQU    *-1
          NJN    RBM4        IF INCOMPLETE TRANSFER 
          LDD    D.Z7 
          RAD    WT          UPDATE NUMBER OF 24-BIT WORDS
          LDN    10B/2
          STD    D.Z7        READ REMAINING WORDS IN 10 WORD BLOCKS 
          LDC    IBDUM
          STM    RBM3          INTO A DUMMY BUFFER
          LDD    D.Z4 
          ZJN    RBM5        IF DONE
          LJM    RBM1        LOOP 
  
 RBM4     SHN    17-0        WDS/2 AND SAVE 2**0
          STD    D.Z1        SAVE NBR 24-BIT WORDS REMAINING
          SHN    17          SAVE ODD/EVEN NO. OF 12-BIT WORDS
          LMM    SB+WTO 
          LDD    D.Z7 
          SBD    D.Z1 
          RAD    WT 
 ERRBPX   LDC    ER.BPX 
          LJM    ERP         PP TO BUFFER XFER ERROR
  
 RBM5     RJM    DCN
          RJM    GST         COPY COUPLER STATUS
          LDD    D.T6        OR TAPE MARK BIT INTO CURRENT CTL STATUS 
          RAM    SB+CTLSW 
          LDM    SB+CSW 
          LPC    DMTO+BUR+BOR+PTYER 
          NJN    ERRBPX      IF STATUS ERROR
          LJM    RBMX        RETURN 
          SPACE  4,20 
**        IBDUM - DUMMY INPUT BUFFER. 
*         SUBROUTINE *RBM* READS THE EXCESS DATA INTO THIS BUFFER WHEN
*         THE COUPLERS MEMORY CONTAINS MORE WORDS THAN *IBL*. 
  
 IBDUM    EQU    *
          SPACE  4,20 
**        TCHRD - TABLE OF CHANNEL INSTRUCTIONS.
  
 TCHRD    EQU    *
          LIST   D
          HERE
          CON    0           TABLE TERMINATOR 
          LIST   *
  
**        TDCRD - INSTRUCTIONS SET FOR PPU SPEED
*         THIS TABLE MUST FOLLOW THE CHANNEL TABLE TERMINATOR AND 
*         REQUIRES AT LEAST A ZERO TERMINATOR ENTRY.
  
 TDCRD    VFD    12/DCRDC1
          VFD    12/DCRDC2
          VFD    12/DLRDC 
          VFD    12/DLRDC1
          CON    0           END OF DELAY CONSTANTS TABLE 
          SPACE  4,10 
**        CHECK FOR CODE OVERFLOW 
  
          IFEQ   NOS,1
 .1       SET    XOVL 
 .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 "ROV" OVERLAY OVERFLOW
          TITLE  MSF SENSE OVERLAY "SOV". 
 "SOV"    SEGMENT XOVL
*CALL,VERS
          COMMENT OVERLAY FOR MST PRODUCT OVERLAY "VERS"
          ORG     XOVL
          SPACE  4,20 
**        RSN -  READ SENSE SEQUENCE. 
* 
*         RSN  EXECUTES THE MSF READ SEQUENCE TO READ THE MSF/MST SENSE 
*         INTO THE COUPLERS MEMORY.  THE ENTIRE SENSE DATA (HA,  COUNT, 
*         AND  DATA  FIELDS) IS THEN READ FROM THE COUPLERS MEMORY INTO 
*         THE A TEMP BUFFER (SBB).  THE  DATA  LENGTH  (BITS  11-0)  IS 
*         STORED  AT  SB+SNS AND THE SENSE DATA FIELD, INCLUDING THE ID 
*         BYTE IS UNPACKED (8-BIT BYTE PER 12-BIT WORD) INTO THE  SENSE 
*         BUFFER  BEGINING  AT  SB+SNS+1.  TO PREVENT OVER WRITTING THE 
*         CURRENT STATUS AND TAGS CONTAINED IN  SB THRU SB+SNS-1,  THIS 
*         PORTION  OF  SB  IS COPIED TO A SAVE AREA PRIOR TO REQUESTING 
*         SENSE AND THEN RESTORED.  THE SENSE AREA OF SB (SB+SNS THRU 
*         SB+SNS+41D) IS SET TO ALL ONES PRIOR TO REQUESTING SENSE, IN
*         THE EVENT SENSE CAN NOT BE READ THIS AREA WILL NOT BE CHANGED.
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   D.T0.
* 
*         CALLS  FIN, FTN, OFP, PRS, STG, RSC.
  
 RSNX     LJM    *           ENTRY / EXIT 
 RSN      EQU    *-1
          LDC    TCHRS
          RJM    PRS         SET CHANNEL AND ADJUST DELAY CONSTANTS 
          LDN    0
          STD    D.T0 
 RSN01    LCN    0
          STM    SBB,D.T0 
          STM    SB+SNS,D.T0
          AOD    D.T0 
          SBN    SNSTL
          MJN    RSN01
          LDD    LF 
          STM    SVLF        SAVE LAST FUNCTION 
          RJM    GST         COPY ALL COUPLER STATUS
 RSN12    LDD    EC 
          ZJN    RSN03       IF SENSE COMMAND AND NOT AN ERROR
          LDN    0
          STD    D.T0 
 RSN02    LDM    SB,D.T0     SAVE THE STATUS BUFFER 
          STM    SVSB,D.T0
          AOD    D.T0 
          SBN    SNS
          MJN    RSN02       IF NOT DONE
          AOM    SBMF        SET STATUS BUFFER MOVED FLAG 
          RJM    ERS
 RSN03    RJM    SEK
          CON    0#90+HH40   ISSUE SENSE COMMAND
          RJM    CIS         RESELECT MSA AND DEVICE
          LDN    SQRSN
          STD    SEQN        SET THE SEQUENCE CODE
          LDN    FCLR 
          RJM    FTN         CLEAR THE COUPLER PRIOR TO READING SENSE 
          RJM    STG
          CON    TXTCL+CV+C1+CE        TAG - TRANSMIT CONTROL 
          CON    MSPLO+LNK                   START PLO LOCK 
          CON    TOPUP+CV+C1+CE        TAG - OPERATE UP 
          CON    MNSQL+MHSEL+MRSEL+LNK       NOT SQUELCH, HEAD SELECT 
*                                            AND READ SELECT
          CON    TXTCL+CV+C1+CE        TAG - TRANSMIT CONTROL 
          CON    MEPLO+LNK                   END PLO LOCK 
          CON    TREAD                 TAG - READ 
          CON    MHA+NRC+ND                  SEND READ HA FIELD TAG 
          RJM    RSC
  
          RJM    STG
          CON    TREAD
          CON    MROC+NRC+ND SEND READ RO COUNT FIELD TAG 
          RJM    RSC
  
          RJM    STG
          CON    TREAD
          CON    MROD+NRC+ND SEND READ RO DATA FIELD TAG
          RJM    RSC
          RJM    STG
          CON    TODWN+CV+C1+CE        TAG - OPERATE DOWN 
          CON    MHSEL                       DROP HEAD SELECT 
          SPACE  4,20 
**        RSB -  READ SENSE FROM BUFFER MEMORY. 
* 
*         READ THE SENSE DATA FROM THE COUPLERS MEMORY AND UNPACK THE 
*         SENSE IN THE STATUS BUFFER (SB+SNS), 8-BIT BYTE PER 12-BIT
*         WORD AS INDICATED BELOW.
* 
*                SB+SNS+0  - BITS 11-0 OF RO COUNT DATA LENGTH (DLL). 
*                      +1  - ID BYTE (19 HEX / 31 OCT). 
*                      +2  - MSA SENSE BYTE 0.
*                      +3  - MSA SENSE BYTE 1.
*                      ..         ..
*                      ..         ..
*                      +19 - MSA SENSE BYTE 17. 
*                      +20 - MSA SENSE BYTE 18. 
*                      +21 - MSA SENSE BYTE 19. 
* 
*                SB+SNS+22 - MST SENSE BYTE 0/20. 
*                      +23 - MST SENSE BYTE 1/21. 
*                      ..         ..
*                      ..         ..
*                      +40 - MST SENSE BYTE 18/38.
*                      +41 - MST SENSE BYTE 19/39.
* 
* 
*         ENTRY  NONE.
* 
*         EXIT   SENSE STORED IN *SB+SNS--SB+SNS+SNSDL*.
* 
*         USES   D.T0, D.T1, D.T2, D.T7.
* 
*         CALLS  FIN, FTN, OFP, WAF.
  
          RJM    GST         GET COUPLER STATUS WORDS 
          LDM    SB+BWC      BUFFER WORD COUNTER
          ZJN    RSB1        IF BUFFER IS EMPTY 
          LDN    0
          STD    D.T7        CLEAR ERROR FLAG 
          LDN    FRDBM
          RJM    FTN         ISSUE BUFFER TO PP TRANSFER FUNCTION 
          LDN    SNSTL
          RJM    OFP         OUTPUT THE NUMBER OF WORDS 
          RJM    WAF         WAIT FOR FULL
          LDN    SNSTL
          IAM    SBB,** 
          ZJN    RSB2        IF COMPLETE TRANSFER 
 RSB1     LDC    ER.BPX      INCOMPLETE DATA TRANSFER, BUFFER TO PP 
          STD    D.T7        SET ERROR FLAG 
 RSB2     RJM    DCN
          LDC    SBB+HACRL-1 LWA OF RO COUNT DATA LENGTH WORD IN *SBB*
          STD    D.T0 
          LDC    SB+SNS      FWA TO STORE SENSE (1ST WORD = DLL)
          STD    D.T1 
          ADN    NSBY+2      NO. 8-BIT BYTES TO UNPACK
          STD    D.T2        LWA+1 OF SENSE DATA IN *SB*
          LDI    D.T0 
          STI    D.T1        STORE THE DATA LENGTH WORD (BITS 11-0) 
          AOD    D.T1 
          AOD    D.T0 
 RSB3     LDI    D.T0 
          SHN    -4 
          STI    D.T1 
          AOD    D.T1 
          LDI    D.T0        UPPER 4-BITS OF NEXT SENSE WORD
          LPN    17B
          SHN    4
          STI    D.T1 
          AOD    D.T0 
          LDI    D.T0        LOWER 4-BITS OF NEXT SENSE WORD
          SHN    -8 
          RAI    D.T1 
          AOD    D.T1 
          SBD    D.T2 
          PJN    RSB4        IF DONE
          LDI    D.T0 
          LPC    377B 
          STI    D.T1 
          AOD    D.T0 
          AOD    D.T1 
          UJN    RSB3        LOOP FOR ALL SENSE WORDS 
 RSB4     LDN    FDSH 
          RJM    FTN         DROP SELECT HOLD 
          LDD    D.T7 
          ZJN    RSB5        IF NO ERROR
          LJM    ERP
  
 RSB5     LJM    RSNX        RETURN 
          SPACE  4,20 
**        SBR -  STATUS BUFFER RESTORE. 
* 
*         RESTORE  THE  STATUS BUFFER TO ITS ORIGINAL VALUE AT THE TIME 
*         OF THE ERROR.  THE SAVE BUFFER *SVSB*  IS  SWAPPED  WITH  THE 
*         CURRENT CONTENCE OF THE STATUS BUFFER *SB*. 
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   D.T0, D.T1.
* 
*         CALLS  NONE.
  
 SBRX     LJM    *           ENTRY / EXIT 
 SBR      EQU    *-1
          LDM    SVLF 
          STD    LF          RESTORE LAST FUNCTION
          LDM    SBMF 
          ZJN    SBRX        IF STATUS BUFFER NOT MOVED, RETURN 
          LDN    0           SAVE STATUS BUFFER 
          STD    D.T0 
 SBR1     LDM    SVSB,D.T0
          STD    D.T1        SAVE IT
          LDM    SB,D.T0
          STM    SVSB,D.T0
          LDD    D.T1 
          STM    SB,D.T0
          AOD    D.T0 
          SBN    SNS
          MJN    SBR1        IF NOT DONE
          UJN    SBRX        RETURN 
          SPACE  4,20 
**        RSC -  READ SENSE TAG CHECK.
* 
*         ENTRY  NONE.
* 
*         EXIT   (A) = INPUT WORD COUNTER 
* 
*         USES   D.T0.
* 
*         CALLS  FIN, ISW, DCN. 
  
 RSCX     LJM    *
 RSC      EQU    *-1
          RJM    ISW         GET TAG STATUS (CTL STATUS)
          STM    SB+LTS 
          LPN    TV 
          NJN    RSC1        IF TAG VALID 
          LJM    ERRTRE      TAG RESPONCE ERROR 
  
 RSC1     LDC    150/2*4
          STD    D.T0 
 RSC2     RJM    ISW         GET TAG STATUS (CTL STATUS)
          STM    SB+LTS 
          SHN    17-2 
          MJN    RSC3        IF 1ST SYNC IN 
 DCRSC1   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    RSC2        IF TIME OUT HAS NOT EXPIRED
          LJM    ERRFSI      1ST SYNC IN TIME-OUT 
  
 RSC3     SHN    17-6-17+2
          PJN    RSC4        IF NOT SELECT ALERT 1
          LJM    ERRSA1      SELECT ALERT 1 ERROR 
  
 RSC4     LDC    3000/22*4
          STD    D.T0 
 RSC5     RJM    ISW         GET TAG STATUS (CTL STATUS)
          STM    SB+LTS 
          LPC    NE+CK2+LSIET 
          ZJN    RSC6        IF NORMAL END, NO CK2 AND NOT LAST 
*                            SYNC IN TO NORMAL END TIME OUT 
 DCRSC2   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T0 
          NJN    RSC5        IF TIME OUT HAS NOT EXPIRED
          LJM    ERRNCL      NE+CK2+LAST SYNC IN TIME-OUT 
  
 RSC6     RJM    DCN
          LJM    RSCX        RETURN 
          SPACE  4,20 
**        ERS -  ERROR SEQUENCE.
* 
*         EXECUTE THE MSF ERROR SEQUENCE. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (SVSB+CK19) = MSA CHECK 19 BYTE. 
*                (SVSB+ERCC) = CYL ADDRESS READ.
*                (SVSB+ERHH) = HEAD ADDRESS READ. 
* 
*         USES   D.T7, SVSB+CK19, SVSB+ERCC, SVSB+ERHH. 
* 
*         CALLS  CTS, STG.
  
 ERSX     LJM    *           ENTRY / EXIT 
 ERS      EQU    *-1
          LDN    SQERS
          STD    SEQN        SET THE SEQUENCE CODE
          LDM    SVSB+LT     GET LAST TAG 
          LPC    377B 
          LMC    TREAD
          ZJN    ERS01       IF LAST TAG WAS A READ 
          LMN    TWRIT-TREAD
          NJN    ERS03       IF LAST TAG NOT A WRITE
 ERS01    LDC    3104B
          STD    D.T7 
 ERS02    RJM    CTS         GET CTL STATUS 
          LPC    SA1+LSA2 
          NJN    ERS03       IF SELECT ALERT 1 OR 2 WAS RECEIVED
 DCERS1   LCN    4           *** LCN 4 IF 1X SPEED PPU ***
*         LCN    2           *** LCN 2 IF 2X SPEED PPU ***
*         LCN    1           *** LCN 1 IF 4X SPEED PPU ***
          RAD    D.T7 
          NJN    ERS02       IF NOT TIME-OUT
 ERS03    LDM    SVSB+CTLSW  CTL STATUS 
          SHN    17-7 
          PJN    ERS1        IF NOT A CHECK 2 ERROR 
          RJM    STG
          CON    TXCL1                 TAG - TRANSMIT CONTROL 1 
          CON    MRINT+NRC                   RESET INTERRUPT
 ERS1     RJM    STG
          CON    TERBY                 TAG - ERROR BYTE 
          CON    MCK19+NRC+LNK+SBI           INPUT MSA CHECK 19 BYTE
          CON    SVSB+CK19                   SAVE MSA CHECK 19 BYTE 
          CON    TXTCL                 TAG - TRANSMIT CONTROL 
          CON    MMSAR+NRC+LNK               MSA RESET
          CON    TRQAD+CV+CE           TAG - REQUEST ADDRESS (CC/HH)
          CON    MRDCC+LNK+SBI               READ CYLINDER ADDRESS
          CON    SVSB+ERCC                   SAVE CC
          CON    TRQAD+CV+CE           TAG - REQUEST ADDRESS (CC/HH)
          CON    MRDHH+SBI                   READ HEAD ADDRESS
          CON    SVSB+ERHH                   SAVE HH
          LJM    ERSX        RETURN 
          SPACE  4,10 
**        SBB    SENSE BUFFER.
*         SENSE IS READ FROM THE COUPLER INTO *SBB* AND THEN UNPACKED 
*         FROM *SBB* TO *SB+SNS* 8-BITS PER 12-BIT WORD.
  
 SBB      EQU    *
 SBBE     EQU    SBB+SNSTL
          ERRNG  7777B-SBBE  ERROR IF BUFFER OVERFLOWS PP 
          SPACE  4,20 
**        TCHRS - TABLE OF CHANNEL INSTRUCTIONS.
  
 TCHRS    EQU    *
          LIST   D
          HERE
          CON    0           TABLE TERMINATOR 
          LIST   *
          SPACE  4,20 
**        TDCRS - INSTRUCTIONS SET FOR PPU SPEED
*         THIS TABLE MUST FOLLOW THE
*         CHANNEL  TABLE TERMINATOR AND REQUIRES AT LEAST A ZERO
*         TERMINATOR ENTRY. 
  
 TDCRS    VFD    12/DCERS1
          VFD    12/DCRSC1
          VFD    12/DCRSC2
          CON    0           END OF DELAY CONSTANTS TABLE 
          SPACE  4,10 
**        CHECK FOR CODE OVERFLOW 
  
          IFEQ   NOS,1
 .1       SET    XOVL 
 .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 "SOV" OVERLAY OVERFLOW
  
          QUAL   *
