ASMB,R,L,C
      HED ***  HP7970 NINE TRACK MT UNIT DRIVER - 790202 ***
      NAM DVR23 92202-16001 REV.1913 - 790202 
* 
* 
      ENT I.23,C.23 
* 
* 
*************************************************** 
* 
*         RELOC. TAPE:   92202-16001
*         ERS:         A-92202-16001-1
*         LISTING:     A-92202-16001-2
*         SOURCE TAPE:   92202-18001
* 
*************************************************** 
* 
* 
*         M. SCHOENDORF   JULY 12,1974    REV. A
* 
*     MODIFICATION: 
*      DATE: 790202 
*      BY: ED COPE
*      REASON: TO ELIMINATE VIRGIN TAPE READ RUN AWAYS
* 
* 
*     EQUIPMENT TABLE USAGE 
* 
*     WORD          CONTENTS
* 
*      5       STATUS 
* 
*               BIT   CONTENTS
* 
*                7   END OF FILE
*                6   START OF TAPE
*                5   END OF TAPE
*                4   TIMING ERROR 
*                3   I/O REJECT 
*                2   NO WRITE RING (0=IN, 1=OUT)
*                1   SOME ERROR (PARITY/TIMING) 
*                0   LOCAL BIT - OFFLINE/BUSY 
* 
*      9       INTERRUPT RETURN ADDRESS 
*     10       ERROR RETRY (SET TO -10 ON ENTRY)
*              = OCT 500 IF REWIND/LOCAL
*     11       DMA CHANNEL (BITS 0 - 2) 
*     12       EOT FLAGS
* 
*              BIT         CONTENTS 
* 
*               9         EOT UNIT 0
*              10         EOT UNIT 1
*              11         EOT UNIT 2
*              12         EOT UNIT 3
* 
* 
      SKP 
*     INITIATION SECTION. 
      SPC 1 
I.23  NOP           ENTRY POINT.
      LDB CHAN      LOAD THE "DMA" CHANNEL NUMBER.
      STB EQT11,I   STORE THE "EOT" FLAG WORD.
      LDB M20K      DEC -20000
      STB EQT13,I   WRITE P.E. & CMD. REJ. CT.
      JSB SETIO     SET I/O INSTRUCTIONS FOR MT.
      ERB           LOCAL BIT TO E REGISTER 
      STA C.23      SET THE INITIATOR FLAG. 
      LDA M10       LOAD: A = -10.
      STA EQT10,I   SET THE ERROR RETRY COUNTER.
      LDA EQT6,I    LOAD THE REQUEST CONTROL WORD.
      AND .3        ISOLATE THE REQUEST CODE. 
      CPA .3        IS REQUEST A CONTROL REQUEST? 
      JMP CNTRL     YES, GO EXAMINE FUNCTION CODE.
B31   SLA,ARS       NO; IS THE REQUEST TO READ? 
      JMP READ      YES, CONTINUE.
      RBR,SLB       NO; IS A WRITE ENABLE RING IN?
      JMP I.A.3     NO, GO REJECT THE REQUEST.
..2   JSB CEOT      GO CHECK FOR END-OF-TAPE (EOT). 
..3   JSB NBUFL     GO GET THE NEGATIVE WORD COUNT. 
      CLE,SZB,RSS   IS THE BUFFER LENGTH = 0? 
      JMP I.A.4     YES, GIVE IMMEDIATE COMPLETION. 
      LDA EQT7,I    NO, LOAD USER BUFFER ADDRESS. 
      JSB IODMA     GO PERFORM THE OPERATION. 
      LDB B31       LOAD: WRITE COMMAND CODE. 
      LDA .1AD      LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..3       REJECT, INTERRUPT ADDRESS RETURN. 
* 
.1AD  DEF ..1 
M10   DEC -10 
M20K  DEC -20000
* 
      SPC 2 
..1   JSB CHECK     DID AN ERROR OCCUR ON WRITE?
      LDB B1100     DEC 576 
      ADB EQT13,I   ADD TO NEG. REJ. CT.
      SSB,RSS       IS COUNT > 1 ?
      JMP PERR      YES, ALLOWS APPROX 34 TRIES 
      STB EQT13,I 
..4   LDB B41       YES, LOAD: BACKSPACE COMMAND. 
      LDA .5        LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..4       REJECT, INTERRUPT ADDRESS RETURN. 
      SPC 2 
..5   LDA .20AD     LOAD THE INTERRUPT RETURN.
      LDB B15       LOAD: GAP COMMAND CODE. 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
.5    DEF ..5       REJECT, INTERRUPT ADDRESS RETURN. 
* 
.20AD DEF ..20
B15   OCT 15
* 
      SPC 2 
..20  LDA EQT5,I    LOAD THE MT UNIT STATUS.
      ERA,SLA       WERE THERE ANY ERRORS?
      JMP W.ERR     YES, GO ABORT THE REQUEST.
      JMP ..2       NO, GO CHECK FOR END-OF-TAPE. 
      SKP 
READ  CPA EQT8,I    IS THE BUFFER LENGTH = ZERO(0)? 
      JMP SKIP.     YES, GO CHECK THE MODE. 
      JSB EOTF      NO, GO CHECK FOR "EOT" CONDITION. 
..6   JSB NBUFL     GO GET THE NEGATIVE WORD COUNT. 
      SPC 2 
* 
* SET UP TIME OUT FOR VIRGIN TAPES
* 
      SPC 2 
      LDA EQT4,I    SET DRIVER WILL PROCESS 
      IOR SET12      TIME OUT INDICATOR BIT 
      STA EQT4,I
      LDA DELAY     SET DELAY INTO EQT
      STA EQT15,I 
      SPC 2 
      LDA EQT7,I    LOAD THE USER BUFFER ADDRESS. 
      JSB IODMA     GO PERFORM THE OPERATION. 
      LDB B23       LOAD: READ COMMAND CODE.
      LDA .7AD      LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
.6    DEF ..6       REJECT, INTERRUPT ADDRESS RETURN. 
* 
.7AD  DEF ..7 
B23   OCT 23
* 
      SPC 2 
* 
* CHECK FOR TIME-OUT...THIS INDICATES A READ ON A VIRGIN TAPE 
* 
..7   LDA EQT4,I    CHECK EQT WORD 4 , BIT 12 
      AND BIT11      FOR TIME-OUT INDICATION
      SZA,RSS       SKIP IF NO TIME-OUT 
      JMP ..71      CONTINUE INTERRUPT PROCESSING 
      LDA EQT4,I    CLEAR DRIVER WILL PROCESS TIME-OUT
      AND CLR12      AND TIME HAS OCCURRED FLAGS. 
      STA EQT4,I
      LDB B110      ISSUE CLEAR CONTROLLER COMMAND
OTB3C OTB CMND
STC3C STC CMND,C
      LDA .75AD    SET CONTINUATION ADDRESS 
      STA EQT9,I
      ISZ C.23     PERFORM CONTINUATION RETURN
      JMP C.23,I
.75AD DEF ..75
BIT11 OCT 4000
SET12 OCT 10000 
DELAY DEC -200
CLR12 OCT 163777
..75  CLA         HANDLE CLEAR CONTROLLER INTERRUPT 
      CLB         BY PERFORMING NORMAL COMPLETION RETURN
      JMP C.23,I  WITH ZERO XMISSION LOG. 
      SPC 2 
* 
* CONTINUE NORMAL INTERRUPT PROCESSING
* 
      SPC 2 
..71  LDA EQT4,I    RESET TIME INDICATORS 
      AND CLR12 
      STA EQT4,I
      CLA 
      STA EQT15,I 
      JSB CHECK     DID AN ERROR OCCUR ON READ? 
      ISZ EQT10,I   YES; IS THIS THE LAST RETRY?
      RSS           NO, SKIP. 
      JMP TLOG      YES, UPDATE THE TRANSMISSION LOG. 
..8   LDB B41       LOAD: BACKSPACE COMMAND CODE. 
      LDA .6        LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..8       REJECT, INTERRUPT ADDRESS RETURN. 
* 
B41   OCT 41
* 
      SPC 2 
SKIP. LDA EQT6,I    LOAD THE FUNCTION REQUEST CODE. 
      AND B100      ISOLATE THE MODE BIT. 
      SZA           IS THE MODE BINARY? 
      JMP FSR       YES, GO SKIP FORWARD 1 RECORD.
I.A.4 LDA .4        LOAD: A=4.
      JMP I.23,I    RETURN TO THE USER. 
* 
.4    DEC 4 
B200  OCT 200 
* 
      SKP 
CNTRL LDA EQT6,I    GET THE REQUEST CONTROL WORD. 
      AND B1770     ISOLATE THE FUNCTION CODE.
      CPA B600      IS IT A DYNAMIC STATUS REQUEST? 
      JMP I.A.4     YES, GIVE AN IMMEDIATE RETURN.
      CPA B200      NO; IS IT A BACKSPACE REQUEST?
      JMP BSR       YES, CONTINUE.
      CPA B300      NO; IS IT FORWARD SPACE REQUEST?
      JMP FSR       YES, CONTINUE.
      CPA B400      NO; IS IT A REWIND REQUEST? 
      JMP REW       YES, CONTINUE.
      CPA B100      NO; WRITE END-OF-FILE REQUEST?
      JMP EOF       YES, CONTINUE.
      CPA B1200     NO; IS IT A GAP REQUEST?
      JMP GAP       YES, CONTINUE.
      CPA B1300     NO; IS IT FORWARD SPACE FILE? 
      JMP FSF       YES, CONTINUE.
      CPA B1400     NO; IS IT BACKSPACE FILE? 
      JMP BSF       YES, CONTINUE.
      STA EQT10,I   NO, STORE THE REWIND/STANDBY FLAG.
      CPA B500      IS IT A REWIND/STANDBY REQUEST? 
      JMP RWS       YES, CONTINUE.
I.A.2 LDA .2        LOAD: A  2. 
STC1M STC CMND,C
      JMP I.23,I    RETURN TO USER
* 
.2    DEC 2 
B100  OCT 100 
B300  OCT 300 
B600  OCT 600 
B1200 OCT 1200
B1300 OCT 1300
B1400 OCT 1400
B1770 OCT 17700 
* 
      SKP 
BSR   JSB CSOT      GO CHECK FOR "SOT" CONDITION. 
..9   LDB B41       LOAD: BACKSPACE COMMAND CODE. 
      LDA .10AD     LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..9       REJECT, INTERRUPT ADDRESS RETURN. 
      SPC 2 
FSR   JSB CEOT      GO CHECK FOR "EOT" CONDITION. 
..11  LDA .TLOG     LOAD THE INTERRUPT RETURN.
      LDB .3        LOAD: FORWARD SPACE COMMAND CODE. 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..11      REJECT, INTERRUPT ADDRESS RETURN. 
* 
.3    DEC 3 
* 
      SPC 2 
REW   JSB CSOT      GO CHECK FOR "SOT" CONDITION. 
..12  LDB B101      LOAD: REWIND COMMAND CODE.
      LDA .10AD     LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..12      REJECT, INTERRUPT ADDRESS RETURN. 
* 
.10AD DEF ..10
B101  OCT 101 
* 
      SPC 2 
RWS   SEZ           IF IN LOCAL 
      JMP I.A.2     GO REJECT THE REQUEST 
REWSB LDB B105      LOAD: REWIND/OFF-LINE COMMAND.
      LDA .10AD     LOAD THE INTERRUPT RETURN 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF REWSB     REJECT, INTERRUPT ADDRESS RETURN. 
* 
.TLOG DEF TLOG0 
B105  OCT 105 
* 
      SPC 2 
FSF   JSB CEOT      GO CHECK FOR "EOT" CONDITION. 
..14  LDA .TLOG     LOAD THE INTERRUPT RETURN.
      LDB B203      LOAD: FORWARD SPACE FILE COMMAND. 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..14      REJECT, INTERRUPT ADDRESS RETURN. 
* 
B203  OCT 203 
* 
      SPC 2 
BSF   JSB CSOT      GO CHECK FOR "SOT" CONDITION. 
..15  LDA .10AD     LOAD THE INTERRUPT RETURN.
      LDB B241      LOAD: BACKSPACE FILE COMMAND. 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..15      REJECT, INTERRUPT ADDRESS RETURN. 
* 
B241  OCT 241 
* 
      SPC 2 
GAP   RBR,SLB       IS A WRITE ENABLE RING PROVIDED?
      JMP I.A.3     NO, GO REJECT THE REQUEST.
      JSB CEOT      YES, GO CHECK FOR END-OF-TAPE.
..23  LDA .22AD     LOAD THE INTERRUPT RETURN.
      LDB B15       LOAD: GAP COMMAND CODE. 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..23      REJECT, INTERRUPT ADDRESS RETURN. 
* 
.22AD DEF ..22
* 
      SPC 2 
..22  LDA EQT5,I    LOAD THE MT UNIT STATUS.
      RAR,SLA       WERE THERE ANY ERRORS?
      JMP W.ERR     YES, GO ABORT THE REQUEST.
      JMP TLOG0     NO, GO UPDATE TRANSMISSION LOG. 
      SPC 2 
EOF   RBR,SLB       IS A WRITE ENABLE RING PROVIDED?
      JMP I.A.3     NO, GO REJECT THE REQUEST.
CLF1C CLF DATA      YES, CLEAR THE DATA CHANNEL FLAG. 
..13  JSB EOTF      GO CHECK FOR END-OF-TAPE. 
..17  LDB B215      LOAD: WRITE EOF COMMAND CODE. 
      LDA .18AD     LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..17      REJECT, INTERRUPT ADDRESS RETURN. 
* 
.18AD DEF ..18
B215  OCT 215 
* 
      SPC 2 
..18  LDA EQT5,I    LOAD THE MT UNIT STATUS.
      RAR           SHIFT PARITY/TIMING BIT TO A0.
      SLA,RSS       WERE THERE ANY ERRORS?
      JMP TLOG.     NO, GO UPDATE TRANSMISSION LOG. 
..19  LDB B41       YES, LOAD: BACKSPACE COMMAND. 
      LDA .13AD     LOAD THE INTERRUPT RETURN 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..19      REJECT, INTERRUPT ADDRESS RETURN. 
* 
.13AD DEF ..13
* 
      SPC 2 
STAT. NOP           ENTRY POINT.
LIA1C LIA CMND      LOAD THE MT UNIT STATUS.
      JMP STAT.,I   RETURN. 
      SPC 2 
CEOT  NOP           ENTRY POINT.
      SEZ,CLE       IF IN LOCAL 
      JMP LOCAL     MAKE NOT READY RETURN 
      LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND B40       ISOLATE THE "EOT" STATUS BIT. 
      SZA,RSS       IS MT UNIT AT END-OF-TAPE ? 
      JMP CEOT,I    NO, RETURN. 
      LDA EQT12,I   YES, LOAD THE "EOT" FLAG WORD.
      AND EOTM      MASK OFF IF EOT WAS ALREADY REACHED 
      SZA 
      JMP LOCAL     YES, GO REJECT THE REQUEST
      LDA EQT12,I   LOAD "EOT" FLAG WORD
      IOR EOTM      ADD "EOT" BIT 
      STA EQT12,I   STORE "EOT" FLAG WORD 
      JMP CEOT,I    NO, RETURN
LOCAL LDB C.23      LOAD THE INTERRUPT FLAG 
      LDA .2        LOAD: A=2.
      SSB,RSS       INTERRUPT RETURN? 
      JMP C.23,I    YES, GIVE A COMPLETION RETURN.
      SPC 1 
I.A.3 LDA .3        LOAD: A=3.
      JMP I.23,I    RETURN TO USER
* 
B40   OCT 40
* 
      SPC 2 
NBUFL NOP           ENTRY POINT.
      LDB EQT8,I    LOAD THE BUFFER LENGTH REQUEST. 
      CCE,SSB,RSS   IS THE LENGTH IN WORDS? 
      CMB,INB,RSS   YES, CONVERT TO NEGATIVE; SKIP. 
      BRS           NO, CONVERT TO WORDS. 
      STB CEOT      STORE THE NEGATIVE WORD COUNT.
      JMP NBUFL,I   RETURN. 
      SPC 2 
CHECK NOP           ENTRY POINT.
      LDA EQT5,I    LOAD THE MT UNIT STATUS.
      RAR,SLA,RAL   WERE THERE PARITY/TIMING ERRORS?
      JMP CHECK,I   YES, RETURN.
TLOG  ALF,ALF       SHIFT THE "EOF" BIT TO 15.
      SSA           WAS AN END-OF-FILE (EOF) READ?
      JMP TLOG0     YES; RETURN 0 TLOG. 
W.CNT LIA DMA-4     LOAD THE WORD COUNT REGISTER. 
      SZA           DID "DMA" GO TO COMPLETION? 
      IOR DMASK     NO, RESTORE THE LOST BITS.
      LDB EQT6,I    LOAD THE REQUEST CONTROL WORD.
      RBR,ERB       SHIFT THE WRITE BIT TO "E". 
      CMA,SEZ,INA,SZA DID THE WRITE COMPLETE? 
      JMP W.ERR     NO, GO ABORT THE REQUEST. 
      JSB NBUFL     YES, GO GET NEGATIVE WORD COUNT.
      ADB A         LET "B" = -(WORDS TRANSMITTED). 
      CMB,INB       MAKE THE WORD COUNT POSITIVE. 
      LDA EQT8,I    LOAD THE USER BUFFER LENGTH.
      SSA           WAS THE REQUEST FOR CHARACTERS? 
      BLR           YES, CONVERT TO CHARACTERS. 
      LDA EQT5,I    ANY ERRORS? 
      RAR,SLA       IF NONE SKIP
      JMP PERR      ELSE PARITY ERROR EXIT
      JMP END       GO RETURN TO THE SYSTEM.
* 
DMASK OCT 140000
* 
      SPC 2 
EOTF  NOP           ENTRY POINT.
      SEZ           IF IN LOCAL 
      JMP I.A.3     MAKE NOT READY RETURN 
      LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND B40       ISOLATE THE "EOT" STATUS BIT. 
      CCE,SZA,RSS   IS MT UNIT AT END-OF-TAPE (EOT)?
      JMP EOTF,I    NO, RETURN. 
      LDA EQT12,I   YES, LOAD THE "EOT" FLAG WORD.
      AND EOTM      MASK OFF IF EOT WAS ALREADY REACHED.
      SZA 
      JMP I.A.3     YES, GO REJECT THE REQUEST. 
      LDA EQT12,I   LOAD "EOT" FLAG WORD
      IOR EOTM      ADD "EOT" BIT 
      STA EQT12,I   STORE "EOT" FLAG WORD 
      JMP EOTF,I    NO, RETURN. 
* 
EOTM  NOP 
* 
      SPC 2 
CSOT  NOP           ENTRY POINT.
      LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND B100      ISOLATE THE "SOT" STATUS BIT. 
      SEZ,SZA,RSS   IS THE MT UNIT AT "SOT" ? 
      JMP CSOT,I    NO, RETURN. 
      SEZ           IF IN LOCAL 
      JMP I.A.3     MAKE NOT READY RETURN 
..10  CLA 
      STA EQT11,I 
      LDA EQT12,I   LOAD THE "EOT" FLAG WORD
      IOR EOTM      CLEAR 
      XOR EOTM      "EOT" BIT 
      STA EQT12,I   STORE "EOT" FLAG WORD 
TLOG0 CLB,RSS       ENTER: B=0; SKIP. 
TLOG. CLB,INB       ENTER: B=1. 
      LDA C.23      LOAD THE INTERRUPT FLAG.
      SSA           IS CONTROL FROM INTERRUPT?
      JMP I.A.4     NO, GIVE IMMEDIATE COMPLETION.
END   CLA,RSS       ENTR: A=0 
PERR  LDA .3        PARITY ERROR EXIT.
      JMP C.23,I    GIVE A COMPLETION RETURN. 
      SPC 2 
IODMA NOP           ENTRY POINT.
      ISZ S.DMA     CLEAR THE "DMA" SKIP FLAG; SKIP.
S.DMA OCT -1        "DMA" SKIP FLAG.
CLC2F CLC DMA-4     PREPARE THE ADDRESS REGISTER. 
      RAL,ERA       SET THE READ/WRITE BIT. 
OTA3E OTA DMA-4     OUTPUT THE BUFFER ADDRESS.
      LDA CHECK     LOAD MT DATA CHANNEL NUMBER.
      IOR B2K4      INCLUDE THE FINAL "CLC" OPTION. 
OTA1C OTA DMA       ASSIGN THE DMA CHANNEL. 
      CCA           ENTER: A=-1.
STC2F STC DMA-4     PREPARE THE WORD COUNT REGISTER.
OTA5E OTA DMA-4     OUTPUT THE MASK CONSTANT. 
LMASK LIA DMA-4     LOAD THE MASK COMPLEMENT. 
      CMA           COMPLEMENT TO FORM "DMA" MASK.
      STA DMASK     STORE THE "DMA" MASK CONSTANT.
      LDA CEOT      LOAD THE NEGATIVE WORD COUNT. 
OTA4E OTA DMA-4     OUTPUT THE WORD COUNT.
      JMP IODMA,I   RETURN. 
* 
B110  OCT 110 
B1100 OCT 1100
B2K4  OCT 20000 
* 
      SPC 2 
REJCT CCA 
      STA S.DMA     SET THE "DMA" SKIP FLAG.
      LDA FUNCT,I   LOAD REJECT INTERRUPT ADDRESS.
      LDB B110      LOAD THE CLEAR COMMAND CODE.
      RSS           SKIP. 
      SPC 2 
FUNCT NOP           ENTRY POINT.
      STA EQT9,I    STORE THE RETURN ADDRESS. 
OTB1C OTB CMND      OUTPUT THE COMMAND CODE.
      JSB STAT.     GET THE MT UNIT STATUS. 
      RAR,RAR       SHIFT I/O REJECT BIT TO 0.
      RAR,SLA       WAS THE COMMAND REJECTED? 
      JMP REJCT     YES, GO ISSUE A CLEAR REQUEST.
      SPC 2 
      CLA,CCE       NO, ENTER: A=0; E=1.
      CPA S.DMA     IS THE REQUEST A READ OR WRITE? 
      JMP STC1D     YES, GO INITIALIZE THE TRANSFER.
      SPC 2 
STC1C STC CMND,C    NO, INITIALIZE MT UNIT CONTROL. 
      JMP C.RTN     GO RETURN TO THE SYSTEM.
      SPC 1 
STC1D STC DATA,C    INITIALIZE THE MT DATA CONTROL. 
RWCON STC CMND,C    INITIALIZE THE MT UNIT CONTROL. 
STC1E STC DMA,C     INITIATE THE "DMA" CHANNEL. 
IO13  CLC DMA       YES, RESET "DMA" CONTROL. 
C.RTN LDA C.23      LOAD THE INTERRUPT CONTROL FLAG 
      INA,SZA,RSS   IS CONTROL THROUGH INTERRUPT? 
      JMP I.23,I    NO, RETURN TO THE USER. 
      JMP A,I       YES, SYSTEM INTERRUPT RETURN. 
      SPC 2 
MALF  LDA .3        GET MALFUNCTION CODE
      LDB C.23,I      LOAD INTERRUPT CONTROL FLAG 
      INB,SZB,RSS     WAS IT AN INTERRUPT ? 
      JMP I.23,I      NO, RETURN THRU INITIATOR 
      JMP W.ERR     RETURN THRU COMPLETION
      SKP 
SETIO NOP           ENTRY POINT 
      STA CHECK     STORE MT DATA CHANNEL NUMBER. 
      ADA CLC       FORM A CLC DATA.
      STA CLC1D     SET IT. 
CLC1D CLC DATA      CLEAR MT DATA CONTROL.
      XOR B5600     FORM A "CLF DATA".
      STA CLF1C     STORE THE INSTRUCTION.
      XOR B600      FORM A "STC DATA,C".
      STA STC1D     STORE THE INSTRUCTION.
      INA           FORM A "STC CMND,C".
      STA STC1C     STORE THE INSTRUCTION.
      STA STC3C     STORE THE INSTRUCTION.
      STA RWCON     STORE THE INSTRUCTION.
      STA STC1M     STORE THE INSTRUCTION 
      XOR B5000     FORM A "CLC CMND".
      STA CLC.G     STORE THE INSTRUCTION.
CLC.G CLC CMND      CLEAR MT COMMAND CONTROL. 
      XOR B4200     FORM A "LIA CMND".
      STA LIA1C     STORE THE INSTRUCTION.
      XOR B4300     FORM A "OTB CMND".
      STA OTB2C     STORE TLE INSTRUCTION.
      STA OTB1C     STORE THE INSTRUCTION.
      STA OTB3C     STORE THE INSTRUCTION.
      LDA CHAN      LOAD THE "DMA" CHANNEL NUMBER.
      ADA CLC       FORM A "CLC DMA". 
      STA IO13      STORE THE INSTRUCTION.
      XOR B5000     FORM A "STC DMA,C". 
      STA STC1E     SET THE INSTRUCTION.
      XOR B1100     FORM A "OTA DMA". 
      STA OTA1C     SET THE INSTRUCTION.
      ADA M4        "SUBTRACT": "DMA" - 4.
      STA OTA3E     STORE THE INSTR]CTION.
      STA OTA4E     STORE THE INSTRUCTION.
      STA OTA5E     STORE THE INSTRUCTION.
      XOR B100      FORM A "STC DMA-4". 
      STA STC2F     STORE THE INSTPUCTION.
      XOR B200      FORM A "LIA FMA-4". 
      STA W.CNT     STORE THE INSTRUCTION.
      STA LMASK     STORE THE INSTRUCTION.
      XOR B4200     FORM A "CLC DMA-4". 
      STA CLC2F     STORE THE INSTRUCTION.
      LDA EQT4,I    LOAD THE UNIT NUMBER WORD.
      AND B300      ISOLATE THE UNIT NUMBER.
      ALF,ALF       ROTATE UNIT TO
      RAL,RAL       TO LOW A
      CMA           SET AS COUNTER
      LDB B400      PRE SET B 
B5000 BLS           SET B TO UNIT 
      INA,SZA       THIS UNIT?
      JMP *-2       NO; TRY NEXT
      STB EOTM
      ADB B400      YES; COMPLETE THE WORD. 
OTB2C OTB CMND      OUTPUT THE MT UNIT SELECT CODE. 
      JSB STAT.     GET MT STATUS IN "A". 
      AND B377      ISOLATE BITS 7-0. 
      LDB A         SAVE THE STATUS IN "B". 
      LDA EQT5,I    LOAD THE STATUS WORD. 
      AND M1774     REMOVE THE OLD STATUS.
      IOR B         INCLUDE THE NEW STATUS. 
      STA EQT5,I    UPDATE THE STATUS WORD. 
      CCA           ENTER: A=-1.
      STA S.DMA     SET THE "DMA" SKIP FLAG.
      JMP SETIO,I   RETURN. 
* 
CLC   CLC 0 
B377  OCT 377 
B400  OCT 400 
B500  OCT 500 
B4200 OCT 4200
B4300 OCT 4300
B5600 OCT 5600
M1    DEC -1
M4    DEC -4
M1774 OCT 177400
* 
      SPC 2 
      SKP 
*     COMPLETION SECTION. 
      SPC 1 
C.23  NOP           ENTRY POINT.
      LDB .A.       SAVE INTERRUPTING SELECT CODE 
      LDA EQT4,I    CHECK FOR TIME OUT ENTRY
      AND BIT11      SINCE INTERRUPTING SELECT CODE WILL BE 
      SZA            THAT OF DATA CHANNEL INSTEAD OF COMMAND
      INB            CHANNEL. IF SO INCREMENT SELECT CODE.
      LDA .B.       RESTORE INTERRUPTING SELECT CODE
      LDB EQT11,I   LOAD THE "DMA" CHANNEL NUMBER.
      SZB,RSS       LOCAL TO AUTO MODE INTERRUPT? 
      JMP EXTRA     YES, IGNORE THE INTERRUPT.
      STB CHAN      NO, UPDATE THE "CHAN" WORD ENTRY. 
      LDB EQT1,I    LOAD THE DEVICE LIST POINTER. 
      SZB,RSS       DID A SPURIOUS INTERRUPT OCCUR? 
      JMP EXTRA     YES, IGNORE THE INTERRUPT.
      ADA M1        NO, LET "A" = MT DATA CHANNEL #.
      JSB SETIO     SET I/O INSTRUCTIONS FOR MT.
      LDA EQT9,I    LOAD THE CONTINUATION ADDRESS.
      ERB           SHIFT THE "LOCAL" BIT TO "E". 
      LDB EQT10,I   LOAD THE REWIND/STANDBY FLAG. 
      SEZ,CLE       IS THE MT UNIT NOT IN "LOCAL"?
      CPB B500      NO; IS THE INTERRUPT FROM "RWS"?
      JMP A,I       YES, GO CONTINUE PROCESSING.
W.ERR CLA,INA       ENTER: A=1. 
      CLB           ENTER: B=0. 
      JMP C.23,I    COMPLETION RETURN.
      SPC 2 
EXTRA ADA CLC       CONFIGURE A CLC.
      STA CLC.0     STORE THE INSTRUCTION.
CLC.0 CLC 00B       CLEAR CONTROL.
      JMP C.RTN     GO GIVE A CONTINUATION RETURN.
.A.   EQU 0 
.B.   EQU 1 
      SKP 
*     SYSTEM BASE PAGE COMMUNICATION AREA:
      SPC 1 
A     EQU 0 
B     EQU 1 
.     EQU 01650B    ORIGIN OF AREA. 
      SPC 1 
      SPC 1 
EQT1  EQU .+8 
EQT4  EQU .+11
EQT5  EQU .+12
EQT6  EQU .+13
EQT7  EQU .+14
EQT8  EQU .+15
EQT9  EQU .+16
EQT10 EQU .+17
EQT11 EQU .+18
      SPC 1 
CHAN  EQU .+19      CURRENT "DMA" CHANNEL NUMBER. 
EQT12 EQU .+81
EQT13 EQU .+82
EQT14 EQU .+83
EQT15 EQU .+84
      SPC 1 
DMA   EQU 06B       "DMA" CHANNEL NUMBER 1. 
      SPC 1 
DATA  EQU 26B       DATA CHANNEL NUMBER.
CMND  EQU DATA+01B  COMMAND CHANNEL NUMBER. 
      SPC 1 
      END 
                                                                                                                                                                                                                                          