ASMB,R,L,C
      NAM DVR24 
      ENT I.24,C.24 
* 
* 
*     M. SCHOENDORF 8/31/73  REV. B 
*     M. SCHOENDORF  3/28/74  REV. C
*     G. SPRADER  5/ 2/74  REV. D 
*     R. CHIPMAN           REV. 1813
* 
* 
* 
*        SOURCE TAPE  25117-80687 
* 
      HED ** HP 7970 7 TRACK MT RTE DRIVER ** ,[HJF,4/16/72]
*     INITIATION SECTION. 
      SPC 1 
I.24  NOP            ENTRY POINT
      LDB EQT11,I   LOAD THE "EOT" FLAG WORD. 
M5600 ELB          *SHIFT THE FLAG INTO "E".
      LDB CHAN      LOAD THE "DMA" CHANNEL NUMBER.
      ELB,CLE,RBR  *INCLUDE THE "EOT" FLAG BIT. 
      STB EQT11,I  *STORE THE "EOT" FLAG WORD 
      JSB SETIO     SET I/O INSTRUCTIONS FOR MT.
      STA C.24       SET THE INITIATOR FLAG 
      LDA N3        LOAD: A=-3. 
      STA EQT10,I   SET THE ERROR RETRY COUNTER.
      LDA EQT6,I    LOAD REQUEST CONTROL WORD 
      AND DEC64     ISOLATE MODE BIT
      CCE,SZA       BCD?
      CLA,CME       NO! 
      ERA           YES!
      STA BCD,I     BCD FLAG = 100000 FOR BCD 
      LDA EQT6,I    LOAD THE REQUEST CONTROL WORD.
      AND DEC3      ISOLATE THE REQUEST CODE. 
      CPA DEC3     *IS REQUEST A CONTROL REQUEST? 
      JMP R3       *YES, GO EXAMINE FUNCTION CODE.
      SLB,RBR      *IS UNIT IN LOCAL MODE?
      JMP I.A.3     YES, GO DOWN THE UNIT.
      SLA,ARS      *NO; IS THE REQUEST TO READ? 
      JMP READ      YES, CONTINUE.
      RBR,SLB       NO; IS WRITE ENABLE RING IN?
      JMP I.A.3     NO, GO REJECT THE REQUEST.
      JSB CEOT     *GO CHECK FOR END-OF-TAPE (EOT). 
      JSB NBUFL     GO GET THE NEGATIVE WORD COUNT. 
      SZB,RSS       IS THE BUFFER LENGTH = 0? 
      JMP I.A.4     YES, GIVE IMMEDIATE COMPLETION. 
* 
M5000 BLS          *CONVERT TO CHARS(-) 
      LDA BCD,I    *GET THE BCD FLAG. 
      SSA,RSS      *BINARY MODE ? 
      JMP M1100-1  *YES! SKIP LIMIT CHECK . 
      SEZ           ODD # OF CHARACTERS?
      ADB M1       *YES! ADD ONE CHARACTER .
      ADB M4       *B= -[# OF CHARACTERS] + 4 
      ADB P130     *YES!
      SSB          *MORE THAN 134 CHARACTERS? 
      CLB          *YES FORCE 134!
      ADB M134     *NO! 
      LDA B        *A= -[# OF CHARACTERS TO WRITE]
      CMA,SZA      *ONE OR
      CPA M1       *  TWO CHARACTERS ?
      LDA DEC3     *YES! ADJUST FOR FOUR
      CMA,RSS      *    CHARACTERS TO BE WRITTEN. 
      LDA B        *A= -[# OF CHARACTERS TO WRITE]
M1100 ARS          *A= -[# OF WORDS]
      STA EQT13,I  *SAVE THE NEGATIVE WORD COUNT. 
      LDA BCD,I     GET BCD FLAG
REJ   CLE,SSA,RSS  *BCD MODE ?
      JMP BINRY    *NO! GO WRITE BINARY 
* 
*  CONVERT FROM ASCII TO BCD
* 
      LDA EQT7,I   *GET ADDRESS OF USERS BUFFER 
      STA PAKUN    *USE PAKUN AS POINTER
* 
*                  ASSIGN AN INTERNAL (DRIVER) BUFFER 
*                          TO A DMA CHANNEL 
* 
      JSB WBUF     *GET INTERNAL BUFFER ADDRESS 
      STA BPNTR    *SAVE IT.
* 
      INA          *
      STA CLC.0    *SAVE INTERNAL BUF ADDRESS + 1 . 
      LDA DBLNK    *GET DOUBLE BLANK. 
      STA CLC.0,I  *SET INTO 2ND WORD.
* 
LOOP  LDA PAKUN,I   GET UPPER CHAR
      ALF,ALF       MOVE DOWN 
      AND M77       CUT OFF UPPER CHARACTER 
      ADA TBLAD     ADD TABLE ADDRESS 
      LDA A,I       GET EQUIV 
      AND M37.4    *KEEP UPPER SIX BITS.
      INB,SZB       ALL DONE? 
      JMP *+4       NO, GO AND DO NEXT
      XOR O20       YES, PUT BCD BLANK IN LAST CHAR 
      CCB           SET B=-1 TO FORCE EXIT
      JMP SECND     STORE LAST WORD 
      STA STAT.     STORE TEMPORARILY 
      LDA PAKUN,I   GET LOWER CHAR
      AND M77       CUTOFF UPPER CHAN 
      ADA TBLAD     ADD TABLE ADDRESS 
      LDA A,I       GET EQUIV 
      ALF,ALF       MOVE AROUND 
      AND M77       KEEP SIX. 
      IOR STAT.     ADD IN UPPER CHAR 
SECND STA BPNTR,I   PLACE  CHARS IN DVR BUFFER
      ISZ PAKUN     INCREMENT USER BUFFER POINTER 
      ISZ BPNTR     INCREMENT DVR BUFF POINTER
      INB,SZB       DONE? 
      JMP LOOP      NO, GO BACK 
      JSB WBUF     *GET INTERNAL BUFFER ADDRESS 
      CLE,RSS      *RESTORE READ/WRITE FLAG TO WRITE
      SPC 1 
BINRY LDA EQT7,I    LOAD OUTPUT BUFFER ADDRESS
      STA EQT7,I   *SAVE OUTPUT BUFFER ADDRESS[REJ] 
      JSB IODMA     GO PERFORM THE OPERATION. 
      LDB M301       LOAD: WRITE COMMAND CODE 
      ADB BCD,I     ADD BIT 15 IF BCD MODE
      LDA .1       *LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF REJ      *REJECT INTERRUPT RETURN ADDRESS.
* 
DBLNK OCT 010020
N3    DEC -3
N6    DEC -6
M134  DEC -134
M1    OCT 1 
M4    OCT 4 
P130  DEC 130 
M301  OCT 301 
M37.4 OCT 37400 
O20   OCT 20        BCD BLANK 
* 
* 
WBUF  NOP          *ENTRY.
      LDA EQT11,I  *GET THE DMA CHANNEL WORD. 
      AND M7       *ISOLATE THE DMA CHANNEL #.
      ADA N6       *SUBTRACT SIX. 
      ADA BUFRS    *ADD THE INTERNAL BUFFER POINTER.
      LDA A,I      *A=ADDRESS OF DVR INTERNAL BUFFER. 
      JMP WBUF,I   *RETURN. 
* 
* 
BUFRS DEF *+1 
      DEF OBUF1     (USED BY DMA CH 6)
      IFZ 
      DEF OBUF2     (USED BY DMA CH 7)
      XIF 
      DEF OBUF1     (USED BY DMA CH 7)
* 
.1    DEF ..1 
..1   JSB CHECK    *ANY PARITY ERRORS?
..4   LDB DEC5      YES, LOAD: BACKSPACE COMMAND. 
      LDA .5        LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..4      *REJECT INTERRUPT RETURN ADDRESS.
* 
..5   LDA .20       LOAD THE INTERRUPT RETURN.
      LDB M121       LOAD: GAP COMMAND CODE 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
.5    DEF ..5       REJECT, INTERRUPT ADDRESS RETURN. 
* 
* 
* 
.20   DEF ..20
..20  LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND M22       GET PARITY & TIMING BITS
      SZA           WERE THERE ANY ERRORS?
      JMP W.ERR     YES, GO ABORT THE REQUEST.
      JSB CEOT      NO, GO CHECK FOR END-OF-TAPE. 
      JMP BINRY    *TRY TO WRITE AGAIN
      SPC 2 
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. 
      CCE          *SET "E" TO INDICATE DMA INPUT.
      LDA EQT7,I    LOAD THE USER BUFFER ADDRESS. 
      JSB IODMA     GO PERFORM THE OPERATION. 
      LDB M203       LOAD: READ COMMAND CODE
      ADB BCD,I     ADD BIT 15 IF BCD MODE
      LDA .7        LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
.6    DEF ..6       REJECT, INTERRUPT ADDRESS RETURN. 
* 
M203  OCT 203 
* 
.7    DEF ..7 
..7   LDA BCD,I    *GET XMISSION COMPLETE FLG.
      RAR,SLA      *CONVERSION DONE YET?
      RSS 
      JMP TLOG     *NO! 
      JSB CHECK    *CHECK FOR R/W PARITY ERRORS.
..7.5 ISZ EQT10,I  IS THIS THE LAST RETRY?
      JMP *+2      *NO! SKIP. 
      JMP FINI     *UPDATE THE TRANSMISSION LOG.
..8   LDB DEC5      LOAD: BACKSPACE COMMAND 
      LDA .6        LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..8       REJECT, INTERRUPT ADDRESS RETURN. 
* 
DEC5  DEC 5 
* 
SKIP. LDA EQT6,I    LOAD THE FUNCTION REQUEST CODE. 
      AND DEC64     ISOLATE THE MODE BIT. 
      SZA           IS THE MODE BINARY? 
      JMP FSR       YES, GO SKIP FORWARD 1 RECORD.
      CLB 
I.A.4 LDA DEC4      LOAD: A=4. IMMEDIATE COMP.
      JMP I.24,I     RETURN TO THE USER;B=X-LOG 
      SPC 2 
R3    LDA EQT6,I    GET THE REQUEST CONTROL WORD. 
      AND M1700    *ISOLATE THE FUNCTION CODE.
      CPA M600      IS IT A DYNAMIC STATUS REQUEST? 
      JMP I.A.4-1  *YES, GIVE AN IMMEDIATE RETURN.
      SLB,RBR       IS THE UNIT IN LOCAL MODE?
      JMP I.A.3     YES, THEN DOWN UNIT.
      CPA M200     *NO; IS IT A BACKSPACE REQUEST?
      JMP BSR       YES, CONTINUE.
      CPA M300      NO; IS IT FORWARD SPACE REQUEST?
      JMP FSR       YES, CONTINUE.
      CPA M400      NO; IS IT A REWIND REQUEST? 
      JMP REW       YES, CONTINUE.
      CPA DEC64     NO; WRITE END-OF-FILE REQUEST?
      JMP EOF       YES, CONTINUE.
      CPA M1200     NO; IS IT A GAP REQUEST?
      JMP GAP       YES, CONTINUE.
      CPA M1300     NO; IS IT FORWARD SPACE FILE? 
      JMP FSF       YES, CONTINUE.
      CPA M1400     NO; IS IT BACKSPACE FILE? 
      JMP BSF       YES, CONTINUE.
      CPA M500      IS IT A REWIND/STANDBY REQUEST? 
      JMP RWS       YES, CONTINUE.
      JMP I.A.2     NO, GO REJECT THE REQUEST.
* 
M77   OCT 77
DEC64 DEC 64        @100
M200  OCT 200 
M300  OCT 300 
M400  OCT 400 
M600  OCT 600 
M1200 OCT 1200
M1300 OCT 1300
M1400 OCT 1400
M1700 OCT 1700
* 
BSR   JSB CSOT     *GO CHECK FOR "BOT" CONDITION. 
      JSB RWCHK     CHECK IF REWINDING
..9   LDB DEC5      LOAD: BACKSPACE COMMAND 
      LDA .10       LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..9       REJECT, INTERRUPT ADDRESS RETURN. 
.10   DEF ..10
* 
FSR   JSB CEOT      GO CHECK FOR "EOT" CONDITION. 
..11  LDA .TLOG     LOAD THE INTERRUPT RETURN.
      LDB DEC3      LOAD: FORWARD SPACE COMMAND CODE. 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..11      REJECT, INTERRUPT ADDRESS RETURN. 
* 
REW   JSB CSOT     *GO CHECK FOR "BOT" CONDITION. 
      JSB RWCHK    *SEE IF UNIT ALREADY REWINDING.
..12  LDB M11        LOAD: REWIND COMMAND CODE
      LDA .10       LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..12      REJECT, INTERRUPT ADDRESS RETURN. 
* 
M11   OCT 11
* 
* 
RWS   STA EQT10,I  *SET REW/STANDBY FLAG. 
      JSB RWCHK    *SEE IF UNIT ALREADY REWINDING.
      LDA STORE    *GET THE HARDWARE STATUS.
      ALF,ALF      *MOVE "BOT"
      RAL,RAL      *  TO SIGN.
      SSA,RSS      *IS TAPE AT LOAD POINT?
      JMP ..RWS    *NO! 
      LDA .RWS     *SET INTERRUPT RETURN ADDRESS. 
      LDB DEC3     *GET FORWARD SPACE CODE. 
      JSB FUNCT    *INITIATE THE FUNCTION.
      DEF *-3      *REJECT INTERRUPT ADDRESS. 
* 
..RWS LDB M31      *LOAD REWIND/OFF-LINE COMMAND. 
      LDA .10       LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF RWS+2    *REJECT, INTERRUPT ADDRESS RETURN. 
* 
.RWS  DEF ..RWS 
M31   OCT 31
* 
RWCHK NOP          *ENTRY.
      LDA STORE    *GET HARDWARE STATUS.
      ALF,RAL      *MOVE REWIND BIT TO SIGN.
      SSA          *UNIT CURRENTLY REWINDING ?
      JMP I.A.4-1  *YES! RETURN IMMEDIATELY!
      JMP RWCHK,I  *NO. CONTINUE. 
* 
FSF   JSB CEOT      GO CHECK FOR "EOT" CONDITION. 
..14  LDA .TLOG     LOAD THE INTERRUPT RETURN.
      LDB M1.43 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..14      REJECT, INTERRUPT ADDRESS RETURN. 
.TLOG DEF TLOG0 
* 
M1.43 OCT 100043
* 
* 
BSF   JSB CSOT     *GO CHECK FOR "BOT" CONDITION. 
      JSB RWCHK     CHECK IF REWINDING
..15  LDA .10       LOAD THE INTERRUPT RETURN.
      LDB M1.45 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..15      REJECT, INTERRUPT ADDRESS RETURN. 
* 
M1.45 OCT 100045
* 
* 
GAP   RBR,SLB       IS WRITE RING PROVIDED? 
      JMP I.A.3     NO, GO REJECT THE REQUEST.
      JSB CEOT      YES, GO CHECK FOR END-OF-TAPE.
..23  LDA .22       LOAD THE INTERRUPT RETURN.
      LDB M121       LOAD: GAP COMMAND CODE 
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..23      REJECT, INTERRUPT ADDRESS RETURN. 
* 
M22   OCT 22
M121  OCT 121 
* 
* 
.22   DEF ..22
..22  LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND M22       GET PARITY & TIMING BITS
      SZA           WERE THERE ANY ERRORS?
      JMP W.ERR     YES, GO ABORT THE REQUEST.
      JMP TLOG0     NO, GO UPDATE TRANSMISSION LOG. 
* 
EOF   RBR,SLB       IS WRITE RING PROVIDED? 
      JMP I.A.3     NO, GO REJECT THE REQUEST.
..13  JSB EOTF      GO CHECK FOR END-OF-TAPE. 
..17  LDB S1161     LOAD: WRITE EOF COMMAND 
      LDA .18       LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..17      REJECT, INTERRUPT ADDRESS RETURN. 
* 
S1161 OCT 100161
* 
.18   DEF ..18
..18  LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND M22       GET PARITY & TIMING BITS
      SZA,RSS       WERE THERE ANY ERRORS?
      JMP TLOG.     NO, GO UPDATE TRANSMISSION LOG. 
..19  LDB DEC5      YES, LOAD: BACKSPACE COMMAND
      LDA .13       LOAD THE INTERRUPT RETURN.
      JSB FUNCT     GO INITIATE THE FUNCTION. 
      DEF ..19      REJECT, INTERRUPT ADDRESS RETURN. 
.13   DEF ..13
      SPC 2 
STAT. NOP           ENTRY POINT.
LIA1C LIA CMND      GET MIXED UP BITS FROM 13182A 
      STB CONFG     SAVE B
      STA STORE     SAVE MIXED BITS 
      AND M3012     REW,NOT READY,REJ,P/E 
      STA B         PUT A IN B TO BUILD STATUS
      LDA STORE     NEXT BITS 
      AND M160      EOF,BOT,EOT 
      ALS           MOVE ONE LEFT 
      ADB A         ADD TO STATUS 
      LDA STORE     NEXT BITS 
      AND M401      OFF LINE, CONTROLLER BUSY 
      ALF,ALF       SWAP BITS ROUND 
      ADB A         ADD TO STATUS 
      LDA STORE     NEXT BIT
      AND DEC4      TIMING ERROR
      ALS,ALS       MOVE LEFT TWO 
      ADB A         ADD TO STATUS 
      LDA STORE     LAST BIT
      AND M200      PROTECTED 
      ALF,ALF       12 LEFT + 1 RIGHT 
      ALF,ARS              = 5 RIGHT
      ADA B         A = STATUS
      LDB CONFG     RESTORE B 
      JMP STAT.,I  *RETURN
* 
M160  OCT 160 
M401  OCT 401 
M3012 OCT 3012
* 
CEOT  NOP           ENTRY POINT.
      LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND M40       EOT STATUS BIT
      CLE,SZA,RSS   IS MT UNIT AT END-OF-TAPE (EOT)?
      JMP CEOT,I    NO, RETURN. 
I.A.2 LDB C.24       LOAD THE INTERRUPT FLAG
      LDA DEC2      LOAD: A=2;ILLEG CONTL/EOT 
      SSB,RSS       INTERRUPT RETURN? 
      JMP C.24,I     YES, GIVE A COMPLETION RETURN
      JMP I.24,I     NO, RETURN TO USER 
      SPC 1 
I.A.3 LDA DEC3      LOAD: A=3;NOT READY 
      JMP I.24,I     RETURN TO THE USER 
* 
DEC2  DEC 2 
DEC3  DEC 3 
DEC4  EQU M4
M40   OCT 40
* 
NBUFL NOP           ENTRY POINT.
      LDB EQT8,I    LOAD THE BUFFER LENGTH REQUEST. 
      CCE,SSB,RSS   IS THE LENGTH IN WORDS? 
      CMB,CLE,INB,RSS SI!CONVERT TO NEGATIVE; SKIP. 
      ERB           NO, CONVERT TO WORDS. 
      STB EQT13,I  *STORE THE NEGATIVE WORD COUNT.
      JMP NBUFL,I   RETURN:  B=(-)WORD COUNT
*                                            E=0=>WDS OR EV # CHRS
*                                            E=1=>ODD # CHARS 
      SPC 2 
* 
      JSB SETIO    *SET THE MT I/O INSTRUCTIONS.
      SPC 2 
TLOG  LIA CMND     *LOAD THE HARDWARE STATUS. 
      AND DEC64    *ISOLATE THE "EOF" BIT.
      SZA           WAS IT AN END-OF-FILE (EOF) ? 
      JMP TLOG0    *RETURN 0 XMISSION LOG.
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. 
      LDB EQT13,I  *YES! GO GET NEGATIVE WORD COUNT.
      ADB A         LET "B" = -(WORDS TRANSMITTED). 
      STB CTEMP    *SAVE THE ACTUAL COUNT.
      ISZ BCD,I    *BUMP THE XMISSION COMPLETE FLAG.
      LDA EQT6,I   *GET THE REQUEST WORD. 
      CCE,SLA,RSS  *READ REQUEST ?
      JMP STEER    *NO! 
      LDA BCD,I     GET BCD FLAG
      SSA,RSS      *BCD MODE ?
      JMP STEER    *NO! CONTINUE. 
      SPC 1 
* 
*                   START BCD TO ASCII CONVERSION 
* 
      SPC 1 
      LDB CTEMP     YES, LOAD NEG WORD COUNT
      STB MBUFC     STORE COUNT 
      LDA EQT7,I    GET USER BUFFER ADDRESS 
      STA UNPAK     USE UNPAK AS POINTER
      RSS          *
NEWCH ISZ UNPAK    *ADVANCE BUFFER POINTER. 
      LDA UNPAK,I  *GET TWO CHARACTERS. 
      ALF,ALF       USE UPPER BCD CHAR
      AND M77       GET 6 BITS
      ADA TBLAD     ADD TABLE ADDRESS 
      LDA A,I       GET ASCII EQUIV.
      AND M377      USE LOWER 8 BITS. 
      ALF,ALF       MOVE BACK UP
      STA STAT.     STORE TEMPORARILY 
      LDA UNPAK,I   GET OTHER CHAR
      AND M77 
      ADA TBLAD 
      LDA A,I 
      AND M377
      IOR STAT.     ADD IN UPPER CHAR 
      STA UNPAK,I   PUT BACK IN BUFFER
      ISZ MBUFC     DONE? 
      JMP NEWCH     NO, GO BACK 
* 
STEER JSB DMAI     *DMA INTERRUPT ? 
      ISZ BCD,I    *YES! INCREMENT XMISSION FLAG. 
      LDA EQT11,I  *GET THE DMA CHANNEL #.
      JMP SPURI    *RETURN. 
* 
CTEMP NOP           WORD COUNT STORAGE
* 
DMAI  NOP          *ENTRY.
      LDA C.24     *GET COMPLETION ENTRY POINT. 
      SSA          *POST INTERRUPT PHASE? 
      JMP NDMAI    *NO! 
      LIA 4        *GET INTERRUPT SOURCE CODE.
      CPA M6       *INT FROM DMA CH6 ?
      JMP DMAI,I   *YES! RETURN "P+1" . 
      CPA M7       *INT FROM DMA CH7 ?
      JMP DMAI,I   *YES! RETURN "P+1" . 
NDMAI ISZ DMAI     *ADVANCE RETURN ADDRESS. 
      JMP DMAI,I   *RETURN "P+2" .
* 
CHECK NOP          *ENTRY POINT.
      JSB CEOT     *CHECK FOR EOT.
      LDA BCD,I    *GET MODE WORD.
      ELA          *PRESERVE
      CLA,SEZ      *  MODE BIT IN 
      ERA          *    CASE OF 
      STA BCD,I    *      REJECT. 
LIA3C LIA CMND     *LOAD THE MT UNIT STATUS.
      AND DEC2     *GET PARITY BIT. 
      CLE,SZA      *PARITY ERROR? 
      JMP CHECK,I  *YES! RETURN.
* 
FINI  LDB CTEMP    *RESTORE WORD COUNT IN B.
      SSB 
      CMB,INB 
      LDA EQT8,I    LOAD THE USER BUFFER LENGTH.
      SSA           WAS THE REQUEST FOR CHARACTERS? 
      BLR          *YES! CREATE [+] CHARACTERS. 
      LDA EQT10,I  *GET THE RETRY COUNTER.
      SZA          *WERE 3 TRYS NEEDED? 
      JMP END      *NO! <3 ; RETURN TO SYSTEM.
      LDA DEC3     *YES! A=3 ; XMISSION ERROR!
      JMP END+1    *GIVE COMPLETION RETURN. 
* 
M377  OCT 377 
* 
EOTF  NOP           ENTRY POINT.
      LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND M40       EOT STATUS BIT
      CCE,SZA,RSS   IS MT UNIT AT END-OF-TAPE  (EOT)? 
      JMP EOTF,I    NO, RETURN. 
      LDA EQT11,I   YES, LOAD THE "EOT" FLAG WORD.
      ELA,RAR       SHIFT THE "EOT" FLAG TO "E".
      STA EQT11,I   STORE THE "EOT" FLAG. 
      SEZ,CCE       WAS END-OF-TAPE ALREADY REACHED?
      JMP I.A.2     YES, GO REJECT THE REQUEST. 
      JMP EOTF,I    NO, RETURN. 
* 
DMASK OCT 140000    "DMA" WORD COUNT MASK 
* 
CSOT  NOP           ENTRY POINT.
      LDA EQT5,I    LOAD THE MT UNIT STATUS.
      AND DEC64     SOT STATUS BIT
      SZA,RSS      *IS THE MT UNIT AT "BOT" ? 
      JMP CSOT,I    NO, RETURN. 
..10  CLA           ENTER: A=0. 
      STA EQT11,I   CLEAR THE "EOT" FLAG. 
TLOG0 CLB,RSS       ENTER: B=0; SKIP. 
TLOG. CLB,INB       ENTER: B=1. 
      LDA C.24       LOAD THE INTERRUPT FLAG
      SSA           IS CONTROL FROM INTERRUPT?
      JMP I.A.4     NO, GIVE IMMEDIATE COMPLETION.
END   CLA           ENTER: A=0. 
CLC.G CLC CMND     *CLEAR CMND CONTROL. 
      JMP C.24,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 CSOT     *LOAD MT DATA CHANNEL NUMBER.
      IOR M20K     *INCLUDE THE CLC OPTION .
OTA1C OTA DMA       ASSIGN THE DMA CHANNEL. 
      LDA EQT13,I  *LOAD THE NEGATIVE WORD COUNT. 
STC2F STC DMA-4    *PREPARE WORD COUNT REGISTER 
OTA4E OTA DMA-4     OUTPUT THE WORD COUNT.
      JMP IODMA,I   RETURN. 
* 
M20K  OCT 020000
* 
REJCT CCA           ENTER: A=-1.
      STA S.DMA     SET THE "DMA" SKIP FLAG.
      LDA FUNCT,I   LOAD REJECT INTERRUPT ADDRESS.
      LDB M110      LOAD THE CLEAR COMMAND CODE.
      RSS           SKIP. 
* 
FUNCT NOP           ENTRY POINT.
      STA EQT9,I    STORE THE RETURN ADDRESS. 
CLC1D CLC DATA     *CLEAR DATA CONTROL. 
OTB1C OTB CMND      OUTPUT THE COMMAND CODE.
LIA2C LIA CMND     *GET HARDWARE STATUS.
      RAR,RAR       SHIFT I/O REJECT BIT TO 0.
      RAR,SLA       WAS THE COMMAND REJECTED? 
      JMP REJCT     YES, GO ISSUE A CLEAR REQUEST.
      CLA,CCE       NO, ENTER: A=0; E=1.
      CPA S.DMA     IS THE REQUEST A READ OR WRITE? 
      JMP R.W       YES, GO INITIALIZE THE TRANSFER.
      CPB M110     *CLEAR COMMAND?
      JMP C.RTN-1  *YES!
* 
*                  RETURN DMA CHANNEL TO SYSTEM 
* 
      LDA CHAN     A=DMA CHANNEL
      JSB FITAB     GET INTERRUPT TABLE ADDRESS 
      LDA B,I      *GET INT TABLE ENTRY 
      ELA,CLE,ERA  *REMOVE THE SIGN BIT.
      STA B,I      *SET NEW TABLE ENTRY.
STC1C STC CMND,C   *INITIALIZE MT UNIT CONTROL. 
* 
C.RTN LDA C.24       LOAD THE INTERRUPT CONTROL FLAG
      INA,SZA,RSS   IS CONTROL THROUGH INTERRUPT? 
      JMP I.24,I     NO, RETURN TO THE USER 
      JMP A,I       YES, SYSTEM INTERRUPT RETURN. 
* 
R.W   EQU * 
CLF1D CLF DATA     *CLEAR DATA CHANNEL FLAG.
RWCON STC CMND,C   *INITIALIZE MT UNIT CONTROL. 
STC1E STC DMA,C    *INITIALIZE DMA CHANNEL
      JMP C.RTN    *RETURN. 
* 
* 
*     ENTRY:  A=DMA CHANNEL # 
FITAB NOP 
      LDB INTBA     LOAD INT TABLE ADDRESS
      CPA M7        IS "DMA" CH 7 BEING USED? 
      INB           YES! INCR TABLE ADDRESS 
      JMP FITAB,I 
*     EXIT:   B=ADDRESS OF INTERRUPT TABLE ENTRY
* 
SETIO NOP           ENTRY POINT.
      LDA EQT4,I   *GET MT CHANNEL WD.
      AND M77      *ISOLATE THE DATA CHANNEL. 
      STA CSOT     *STORE MT DATA CHANNEL NUMBER. 
      IOR CLC      *FORM A "CLC DATA".
      STA CLC1D    *SET THE INSTRUCTION.
      STA *+1      *PUT CLC DATA IN NEXT LOCATION 
      NOP          * AND EXECUTE
      XOR M5600    *FORM "CLF DATA" . 
      STA CLF1D    *STORE THE INSTRUCTION.
      XOR M600     *FORM "STC DATA,C" . 
      INA          *FORM A "STC CMND,C".
      STA STC1C    *STORE THE INSTRUCTION.
      STA RWCON    *STORE THE INSTRUCTION.
      XOR M5000    *FORM A "CLC CMND".
      STA CLC.G    *STORE THE INSTRUCTION.
      XOR M4200    *FORM A "LIA CMND".
      STA LIA1C    *STORE THE INSTRUCTION.
      STA LIA2C    *STORE THE INSTRUCTION.
      STA LIA3C    *STORE THE INSTRUCTION.
      STA TLOG     *STORE THE INSTRUCTION.
      XOR M4300    *FORM A "OTB CMND".
      STA OTB2C    *STORE THE INSTRUCTION.
      STA OTB1C    *STORE THE INSTRUCTION.
      LDA EQT11,I  *GET THE 
      ELA,CLE,ERA  *  DMA CHANNEL #.
      IOR STCC     *FORM A "STC DMA,C". 
      STA STC1E    *SET THE INSTRUCTION.
      XOR M1100    *FORM A "OTA DMA". 
      STA OTA1C    *SET THE INSTRUCTION.
      ADA N4       *"SUBTRACT": "DMA" - 4 . 
      STA OTA3E    *STORE THE INSTRUCTION.
      STA OTA4E    *STORE THE INSTRUCTION.
      XOR DEC64    *FORM A "STC DMA-4". 
      STA STC2F    *STORE THE INSTRUCTION.
      XOR M200     *FORM A "LIA DMA-4". 
      STA W.CNT    *STORE THE INSTRUCTION.
      XOR M4200    *FORM A "CLC DMA-4". 
      STA CLC2F    *STORE THE INSTRUCTION.
      JSB DMAI     *DMA INTERRUPT ? 
      JMP IOSET    *YES! BYPASS STATUS CHECK. 
      LDA EQT4,I   *LOAD THE UNIT NUMBER. 
      AND M300     *ISOLATE THE UNIT NUMBER.
      ALF,ALF      *ROTATE UNIT TO
      RAL,RAL      *  LOW A-REG.
      CMA          *SET AS COUNTER. 
      LDB M400     *PRE-SET B-REG.
      BLS          *SET B TO UNIT 
      INA,SZA      *THIS UNIT?
      JMP *-2      *NO! TRY NEXT ONE. 
      ADB M400     *YES! COMPLETE THE WORD. 
OTB2C OTB CMND     *OUTPUT THE MT UNIT SELECT CODE. 
      JSB STAT.    *GET MT STATUS IN "A"
      AND M377     *ISOLATE BITS 7-0 .
      LDB A        *SAVE THE STATUS IN "B" .
      LDA EQT5,I   *LOAD THE STATUS WORD FROM EQT.
      AND M1774    *REMOVE THE OLD STATUS.
      IOR B        *INCLUDE THE NEW STATUS. 
      STA EQT5,I   *UPDATE THE STATUS WORD IN EQT . 
IOSET CCA          *SET A= -1  .
      STA S.DMA    *SET THE "DMA" SKIP FLAG.
      JMP SETIO,I  *RETURN: A= -1 , B=STATUS
* 
M1774 OCT 177400
N4    DEC -4
M7    OCT 7 
M6    DEC 6 
M110  OCT 110 
M4200 OCT 4200
M4300 OCT 4300
CONFG NOP 
* 
      SKP 
*     COMPLETION SECTION. 
      SPC 1 
C.24  NOP            ENTRY POINT
      LDB EQT11,I   LOAD THE "DMA" CHANNEL NUMBER.
      RBL,CLE,ERB   REMOVE THE "EOT" FLAG BIT.
      CPA B        *DMA INTERRUPT?
      JMP GO       *YES! START PROCESSING.
      LDB EQT1,I    LOAD THE DEVICE LIST POINTER
      SZB,RSS       DID A SPURIOUS INTERRUPT OCCUR? 
      JMP SPURI     YES! IGNORE THE INTERRUPT.
      JSB SETIO    *SET I/O INSTRUCTIONS FOR MT.
      ERB          *SHIFT LOCAL BIT TO "E". 
      LDB EQT10,I  *LOAD THE REWIND/STANDBY FLAG. 
      LDA EQT9,I   *LOAD THE CONTINUATION ADDRESS.
      SSA,RSS      *INDIRECT ADDRESS ?
      JMP *+3      *NO! CONTINUE .
      LDA A,I      *GET THE 
      JMP *-3      *  EFFECTIVE ADDRESS . 
      SEZ,CLE       IS THE MT UNIT     IN "LOCAL"?
      CPB M500      YES;IS THE INTERRUPT FROM "RWS"?
      JMP A,I       YES, GO CONTINUE PROCESSING.
* 
W.ERR CLA,INA       ENTER: A=1.(NOT READY)
      CLB           ENTER: B=0. 
      JMP C.24,I     COMPLETION RETURN
      SPC 2 
M500  OCT 500 
      SPC 2 
* 
SPURI LDB A         SAVE THE CHANNEL NUMBER.
      IOR CLC      *CONFIGURE "CLC XX"
      STA CLC.0    *SET THE INSTRUCTION.
CLC.0 CLC 00B       CLEAR CONTROL.
      CLA 
      STA EQT15,I  PREVENT TIMEOUT
      LDB BCD,I    *GET THE I/O XMISSION FLAG.
      ERB          *SET THE CONTINUATION/COMPLETION FLG.
      LDA C.24     *GET THE RETURN ADDRESS. 
      SEZ,INA,RSS  *CONTINUATION RETURN ? 
      JMP A,I      *YES!
      JSB CHECK    *ANY R/W PARITY ERRORS?
      JMP ..7.5    *READ PARITY ERROR!
* 
* 
GO    LDB DUMMY    *LOAD SPECIAL INTERRUPT FLAG.
      SZB,RSS      *PRIVILEGED INTERRUPT ACTIVE ? 
      JMP TLOG-1   *NO! CONTINUE. 
      JSB FITAB    *YES! GET INTERRUPT TABLE ADDRESS. 
      STB CONFG    *SAVE TABLE ADDRESS. 
      LDB B,I      *LOAD THE TABLE ENTRY. 
      ELB,CLE,ERB  *REMOVE BIT 15 . 
      STB CONFG,I  *STORE NEW TABLE ENTRY.
      JMP TLOG-1   *START PROCESSING. 
* 
* 
*     BEGIN "LOCAL STORAGE".
      SPC 1 
A     EQU 00000B    "A" REGISTER ADDRESS DEFINITION.
B     EQU 00001B    "B" REGISTER ADDRESS DEFINITION.
BPNTR EQU SETIO 
CLC   CLC 00B 
DMA   EQU 06B       "DMA" CHANNEL NUMBER 1. 
MBUFC EQU NBUFL 
PAKUN EQU CHECK 
STCC  STC 00B,C 
STORE EQU PAKUN 
UNPAK EQU CHECK 
DATA  EQU 00B       DATA CHANNEL NUMBER.
CMND  EQU DATA+01B  COMMAND CHANNEL NUMBER. 
      SKP 
*     SYSTEM BASE PAGE COMMUNICATION AREA:
      SPC 2 
.     EQU 1657B 
EQT1  EQU .+1 
EQT4  EQU .+4 
EQT5  EQU .+5 
EQT6  EQU .+6 
EQT7  EQU .+7 
EQT8  EQU .+8 
EQT9  EQU .+9 
EQT10 EQU .+10
EQT11 EQU .+11
..    EQU 1770B 
EQT12 EQU ..+1
EQT13 EQU ..+2
EQT15 EQU ..+4
      SPC 2 
BCD   EQU EQT12     BCD FLAG WORD, =100000 FOR BCD
CHAN  EQU 1673B     CURRENT "DMA" CHANNEL NUMBER. 
DUMMY EQU 1737B 
INTBA EQU 1654B    *FWA OF INTERRUPT TABLE
      SUP 
      SPC 1 
      SPC 1 
      HED **********  CONVERSION TABLE  *********** 
* 
*         ASCII => BCD / BCD => ASCII 
*            (HIGH)    /    (LOW) 
* 
TBLAD DEF *+1 
*                            @ A B C D E F G
      ASC 08,L 11223344556677 
* 
*                            H I J K L M N O
      ASC 08,8899!0"=#@$:%>&# 
* 
*                            P Q R S T U V W
      ASC 08,' (/)SRTSUTVUWVX 
* 
*                            X Y Z [ \ ] ^
      ASC 08,WYXZY_=,^(-'?\Z" 
* 
*                              ! " # $ % & '
      ASC 08,P-*J_KOL+M/N0O]P 
* 
*                            ( ) * + , - . /
      ASC 08,\Q<R,!0$[* ];;Q% 
* 
*                            0 1 2 3 4 5 6 7
      ASC 08,J+AABBCCDDEEFFGG 
* 
*                            8 9 : ; < = > ?
      ASC 08,HHIIM?..>)K[N<:^ 
      HED <***     OUTPUT BUFFERS     ***>
OBUF1 EQU * 
      OCT 10020,10020   (BCD BLANKS)
      BSS 65
      IFZ 
OBUF2 EQU * 
      OCT 10020,10020   (BCD BLANKS)
      BSS 65
      XIF 
PLEN  EQU *+1       PROGRAM LENGTH (OCTAL)
      END 
                                        