
* 
*      THE MAIN PART OF THE ALGORITHM CONSISTS OF 
* TWO SECTIONS.  IN THE FIRST SECTION, WE READ
* AS MUCH AS POSSIBLE INTO THE BUFFER AREA. 
* IN THE SECOND SECTION, WE WRITE OUT AS MUCH 
* AS POSSIBLE.  THE ENTIRE PROCEDURE IS THEN
* REPEATED UNTIL WE ARE FINISHED.  THE FOLLOWING
* MEANINGS ARE ASSOCIATED WITH THESE VARIABLES: 
* 
*     SUPK1 => DIREC ENTRY FOR TRACK BEING READ 
*     SUPL1 => DIREC ENTRY FOR TRACK BEING WRITTEN
*     SUPK2 = NUMBER OF WORDS READ SO FAR FROM K1 
*     SUPL2 = NUMBER OF WORDS WRITTEN SO FAR ON L1
*     SUP   = NUMBER OF WORDS IN CORE 
*     SUPP  => NEGATIVE NUMBER OF WORDS TO BE WRITTEN ON L1 
* 
SUP31 EQU * 
      CLA           INITIALIZE
      STA SUPK2       THE LENGTH
      STA SUPL2         WORDS 
      LDA SDIR0     INITIALIZE
      STA SUPK1       THE DIREC 
      STA SUPL1         POINTERS
* 
SUP7  EQU * 
      LDA SUPL2     IS THE NUMBER OF WORDS WRITTEN
      CMA,INA         SO FAR ON L1 = THE NUMBER 
      CPA SUPP,I        OF WORDS TO BE WRITTEN? 
      JMP SUP10     YES, GO ADVANCE L19 
* 
SUP8  EQU * 
      LDA SUP       IS THE SWAP AREA FULL?
      ADA STLE
      SSA,RSS 
      JMP SUP11     YES, GO TO THE WRITE SECTION
      STA MWORD     NO, SAVE -# OF CORE WORDS AVAIL.
      LDB SUPK1     HAVE WE READ ALL OF THE TRACKS? 
      CPB SDIRU 
      JMP SUP11     YES, GO TO THE WRITE SECTION
      LDA SUPK1,I   A=-# OF WORDS ON THIS TRACK 
      ADA SUPK2     A=-# NOT READ YET 
      SZA           ENTIRE TRACK READ?
      JMP SUP9      NO
      ADB SD7       YES, MOVE K1 TO NEXT TRACK
      STB SUPK1 
      STA SUPK2     SET # OF WORDS READ TO ZERO 
      JMP SUP8      TEST THIS TRACK 
* 
SUP9  EQU * 
      LDB A         B=-# OF WORDS NOT YET READ ON K1
      CMB,INB       MAKE POSITIVE 
      ADB MWORD     IS THE # OF WORDS ON TRACK
      SSB            WORDS WE HAVE ROOM FOR?
      JMP *+4       NO, READ IN ENTIRE TRACK
      LDA MWORD     GET -# WE HAVE ROOM FOR 
      ADA SB377     REDUCE TO THE NEXT SMALLER
      AND SM256     BLOCK SIZE
      SZA,RSS       IF WE CAN'T READ IN ANY, GO 
      JMP SUP11       TO THE WRITE SECTION
* 
      STA MWORD     SET WORD = -# OF WORDS TO READ
      LDA SUPK2     GET # OF WORDS READ SO FAR
      CLB           DIVIDE BY 256 TO GET
      ASR 8           A BLOCK DISPLACEMENT
      STA STMP8     SAVE TEMPORARILY
      LDA SUPK1     GET THE 
      ADA SD5         DIRECTORY 
      DLD A,I           TRACK ADDRESS 
      CLE                 AND 
      ADB STMP8             ADD 
      SEZ                     IN
      INA                       THE 
      DST STMP8                   DISPLACEMENT
      LDA STP8A 
      LDB LIBDI     COMPUTE CORE LOCATION 
      ADB SUP         TO READ INTO
      JSB DISCS,I 
* 
      LDB MWORD 
      CMB,INB         WORDS IN CORE 
      ADB SUP 
      STB SUP 
      LDB MWORD 
      CMB,INB         READ FROM K1
      ADB SUPK2 
      STB SUPK2 
* 
      LDA SUPTG     HAVE WE INSERTED THE NEW
      SZA             ENTRY YET 
      JMP SUP8      YES, GO TRY TO READ MORE
      LDA SUPL2     COUNT ALREADY WRITTEN 
      CLB             ONTO THE CURRENT TRACK
      DIV SD12
      LDA B         = EXTRA WORDS 
      CMB,INB 
      STB SUPEX 
      ADA SUP       GET THE COUNT 
      CLB             OF WORDS IN CORE
      DIV SD12      CONVERT TO ENTRY COUNT
      MPY SD12        AND BACK TO WORD COUNT
      ADA LIBD          SO THAT WE LOOK AT
      ADA SUPEX           AN EVEN BOUNDARY
      SZB,RSS 
      ADA SM12
      STA SUPEX 
      LDB A 
      LDA ADS0      => ID/NAME OF NEW ENTRY 
      JSB DIRCS,I   GO COMPARE
      JMP SUP8      DOESN'T GO ON THIS TRACK
      NOP 
SUP32 EQU * 
      LDA SUPEX     GOES ON THIS
      STA SUPES       TRACK, SO 
      ADA SM12          SEARCH BACKWARDS
      STA SUPEX           TO FIND 
      ADA MLIBD 
      SSA           NO SKIP IF DONE 
      JMP SUP33 
      LDA SUPEX 
      LDB ADS0              OUT WHERE 
      JSB DIRCS,I   COMPARE THIS ENTRY
      JMP SUP32     NOT THIS ONE
      NOP 
* 
SUP33 EQU * 
      ISZ SUPTG     SET TOGGLE TO SAY WE'VE INSERTED
      LDA LIBD      COMPUTE DESTINATION 
      ADA SUP         OF WORDS TO BE
      LDB A             MOVED 
      ADA SD11
      STA MBVED 
      ADA SM12      COMPUTE THE SOURCE
      STA MBVES 
      CMB,INB 
      ADB SUPES 
      JSB MBVE      CALL THE REVERSE MOVER. 
* 
      LDA SUPES     => HOLE 
      STA MOVDS,I   SET DESTINATION 
      LDA ADS0      SET SOURCE AT ENTRY 
      STA MOVSS,I 
      LDB SM12      MOVE IN THE DIRECTORY 
      JSB MOVWS,I     ENTRY 
* 
      LDA SUP       UPDATE THE COUNT OF WORDS 
      ADA SD12        IN CORE BY TWELVE 
      STA SUP 
      JMP SUP8
* 
*      COME HERE WHEN THE CURRENT OUTPUT TRACK
* HAS BEEN FILLED 
* 
SUP10 EQU * 
      LDA SUPL1     TEST FOR LAST TRACK 
      CPA SDIRL 
      JMP SUP16     ALL DONE, GO CLEAN UP DIREC 
      ADA SD7       ADVANCE TO NEXT TRACK 
      STA SUPL1 
      CLA           SET THE NUMBER OF WORDS WRITTEN 
      STA SUPL2       SO FAR TO ZERO
      ISZ SUPP      ADVANCE POINTER TO WORDS TO 
      JMP SUP7      BE WRITTEN
      SKP 
* 
*      THE NEXT SECTION IS THE OUTPUT SECTION.
* WE ONLY COME TO THIS SECTION WHEN WE HAVE DETERMINED
* THAT NO MORE CAN BE READ.  IN THIS PART, WE WRITE 
* OUT AS MUCH AS POSSIBLE UNTIL WE HAVE EXHAUSTED 
* ALL THAT WE HAVE IN CORE OR WE REACH THE POINT
* WHEN FURTHER OUTPUT WOULD DESTROY INFORMATION 
* NOT YET READ.  IN THIS SECTION, THE VARIABLE
* SUPS EQUALS THE NUMBER OF WORDS THAT HAVE BEEN
* WRITTEN FROM THE CURRENT CORE LOAD. 
* 
SUP11 CLA 
SUP15 EQU * 
      STA SUPS      SET # OF WORDS OUTPUT SO FAR
      LDA SUPL2     SET WORD = - # OF WORDS LEFT
      ADA SUPP,I      TO BE WRITTEN ON L1 
      LDB SUPL1     TEST FOR WRITING ON A TRACK 
      CPB SUPK1       THAT IS NOT COMPLETELY READ 
      JMP SUP12     WE ARE
SUP13 EQU * 
      LDB SUPS      SET B TO THE NUMBER 
      CMB,INB         OF WORDS LEFT IN CORE 
      ADB SUP 
      STB SUPB      SAVE IN B 
      ADB A         COMPARE WITH THE NUMBER THAT
      SSB,RSS         THAT WE WANT TO WRITE 
      JMP SUP14 
      LDA SUPB      ONLY WRITE WHAT WE HAVE 
      AND SM256     USE ONLY FULL BLOCKS WORTH
      CMA,INA       MAKE NEGATIVE 
      JMP SUP14 
SUP12 EQU * 
      LDB SUPL2     IF WRITING ON UNREAD TRACK, MAKE
      CMB,INB         SURE THAT WE DON'T GO INTO UNREAD 
      ADB SUPK2         AREA
      ADB A 
      CMB,SSB,INB,RSS 
      ADA B         CHANGE A TO AVOID OVERLAY 
      JMP SUP13 
* 
*      A NOW CONTAINS THE NEGATIVE NUMBER OF
* WORDS THAT WE ARE GOING TO WRITE
* 
SUP14 EQU * 
      STA MWORD     IF NO WORDS ARE TO BE 
      SZA,RSS         WRITTEN , GO TO SLIDE CORE FOR
      JMP SUP17         NEW INPUT 
      CMA,INA 
      STA SUPB
      LDA SUPL2     TEST FOR THE FIRST WRITE
      SZA             ON THIS TRACK 
      JMP SUP18 
* 
      LDA SUPL1     IF FIRST WRITE, 
      INA 
      STA MOVDS,I     THEN ADJUST DIREC TO TELL 
      LDA LIBD          THE NEW FIRST ENTRY 
      ADA SUPS            ON THAT TRACK 
      STA MOVSS,I 
      LDB SM4 
      JSB MOVWS,I 
      CLA 
* 
SUP18 EQU * 
      CLB           CONVERT WORDS TO
      ASR 8           BLOCK ADDRESS 
      STA STMP8     SAVE TEMPORARILY
      LDA SUPL1     GET THE 
      ADA SD5         DIRECTORY 
      DLD A,I           TRACK ADDRESS 
      CLE                 AND 
      ADB STMP8             ADD 
      SEZ                     ON
      INA                       THE 
      DST STMP8                   DISPLACEMNT 
      LDA STP8A 
      LDB LIBD      COMPUTE THE CORE
      ADB SUPS        ADDRESS 
      JSB DISCS,I 
      LDA SUPB      ADJUST THE NUMBER OF WORDS
      ADA SUPL2       OUTPUT TO THE TRACK 
      STA SUPL2 
      LDA SUPB      ADJUST THE NUMBER OF CORE WORDS 
      ADA SUPS        WRITTEN OUT SO FAR
      JMP SUP15     LOOP FOR ANY MORE WRITING 
* 
*      COME HERE WHEN WE CAN'T WRITE ANYMORE. 
* 
SUP17 EQU * 
      CPA SUPS      IF NOTHING WRITTEN AT ALL,
      JMP SUP7      GO TRY TO READ AGAIN
      LDB SUPS      ADJUST THE NUMBER OF WORDS IN CORE
      CMB,INB 
      ADB SUP 
      STB SUP 
      CMB,INB       MAKE NEGATIVE FOR CORE MOVE 
      LDA LIBD      SET DESTINATION 
      STA MOVDS,I 
      ADA SUPS        AND 
      STA MOVSS,I       SOURCE
      JSB MOVWS,I 
      JMP SUP7
* 
*      ALL OF THE TRACKS HAVE BEEN WRITTEN BACK.
* NOW UPDATE THE WORD COUNTS IN THE DIREC TABLE 
* 
SUP16 EQU * 
      LDA SM80      SET COUNT 
      STA SUP         OF DIRECTORY TRAX 
      LDA DEFNN 
      STA SUPP
      LDB SDIR0     => FIRST DIREC ENTRY
SUPLL EQU * 
      LDA SUPP,I    COPY THE NEW LENGTH WORDS INTO
      STA B,I         THE DIREC TABLE ENTRIES 
      ISZ SUPP
      ADB SD7       ADVANCE THE DIREC POINTER 
      ISZ SUP 
      JMP SUPLL 
* 
      CLA 
      STA CUDRS,I   NO DIR TRACK IN BUFFER
      ISZ ENSU      NORMAL RETURN IS
      JMP ENSU,I      SKIP RETURN 
* 
SUPER EQU * 
      ISZ JDECS,I   UN-COUNT THIS ENTRY 
      NOP 
      LDA SD22
      LDB SUPMS 
      JSB ASRS,I    PRINT DIR FULL MESSAGE
      JMP ENSU,I      AND GIVE FULL RETURN
SUPR2 LDA SUPTG     AREA WE BALANCING 
      SZA             DIRECTORY TRACKS ONLY?
      JMP ENSU,I    YES- NO NEED BALANCE - IT'S FULL
      SZB           NO. IS IT EXACTLY 682 ENTRIES?
      JMP SUPER     NO - JUST MISSED - DIR FULL 
      LDA SM682     YES - JUST MADE. RESTORE A-REG
      JMP SUP3        AND CONTINUE
      SKP 
* 
*      ROUTINE TO FIND IF AN ID IS IN THE WHATSIT 
* TABLE.
*     ENTER WITH ID IN A
*     SKIP RETURN IF FIND.
* 
EFID  NOP 
      LDB ENTBP     LOAD BEGIN POINTER
EFIDB EQU * 
      CPB ENTEP     CHECK FOR END OF TABLE
      JMP EFID,I
      CPA B,I       CHECK FOR FIND
      JMP EFIDE     FOUND, GIVE SKIP RETURN 
      INB           ADVANCE B TO NEXT ENTRY 
      JMP EFIDB 
* 
EFIDE EQU * 
      ISZ EFID      ADVANCE RETURN ADDRESS
      JMP EFID,I
* 
*     MOVE BACKWARDS -B WORDS FROM MBVES TO MBVED 
* 
MBVE  NOP 
      SSB,INB,RSS 
      JMP MBVE,I    RETURN
      LDA MBVES,I   GET SOURCE WORD 
      STA MBVED,I     AND MOVE IT 
      CCA 
      ADA MBVED     MOVE BACK THE POINTERS
      STA MBVED 
      CCA 
      ADA MBVES 
      STA MBVES 
      JMP MBVE+1
MBVES BSS 1 
MBVED BSS 1 
      HED CONSTANTS, TEMPORARIES, ETC.
M8184 DEC -8184 
SM683 DEC -683
SM682 DEC -682
SM256 DEC -256
SM133 OCT -133
SM80  DEC -80 
SM72B OCT -72 
SM12  DEC -12 
SM7   DEC -7
SM8   DEC -8
SM6   DEC -6
SM4   DEC -4
SM3   DEC -3
SM2   DEC -2
SM1   DEC -1
SD2   DEC 2 
SD5   DEC 5 
SD7   DEC 7 
SD8   DEC 8 
SD10  DEC 10
SD11  DEC 11
SD12  DEC 12
SD14  DEC 14
SD15  DEC 15
SD16  DEC 16
SD22  DEC 22
SD24  DEC 24
SB32  OCT 32
SB40  OCT 40        BLANK 
SB44  OCT 44        "$" 
SB52  OCT 52        "*" 
SD54  DEC 54
SB140 OCT 140 
SB377 OCT 377 
S8184 DEC 8184
BIS15 OCT 100000
SMSK  OCT 177400
* 
ADS0  DEF ADTBL 
ADS1  DEF ADTBL+1 
ADS2  DEF ADTBL+2 
ADS3  DEF ADTBL+3 
ADS10 DEF ADTBL+10
ASRS  DEF TTY35     => TELETYPE DRIVER
CDTWS DEF CDTW      => DIR TRACK REWRITE
CKFCS DEF CKFC                                   [B]
COFLS DEF COFLG     => CONFIGURATION OPTIONS FLAG 
CUADS DEF CUADT     => CURRENT DISC ADT 
CUDRS DEF CUDIR     => DIRGE TRACK IN CORE INDICATOR
CUDRT DEF CUDIR,I 
DIRCS DEF DIRCM 
DIRCT DEF DIREU     => END OF DIREC TABLE 
DIRES DEF DIREC     => DIREC TABLE
DIRGS DEF DIRGE     => DIR TRACK GETTER 
DIRPS DEF DIRP
DRLKS DEF DIRLK     => DIR SEARCH ROUTINE 
DISCS DEF DISCZ 
ENCRP DEF ILIN      => CONVENIENT LINE-FEED      [B]
ENPDS DEF ENPID     => "NO SUCH ID" 
ENQES DEF ENQEP     => "ENTRY ALREADY PRESENT"
ENQNS DEF ENQNE     => "NO SUCH ENTRY"
ENTBP DEF ADTBL+1036
ENTMA DEF ENTNA 
GETCS DEF GETCR 
GMTSS DEF GMTS      => GET MAG TAPE SELECT CODE 
IDECS DEF IDEC      => IDEC TABLE 
IDECT DEF IDEC+8    => LAST ENTRY OF IDEC TABLE 
STP8A DEF STMP8 
STMP8 BSS 2 
IDTBS DEF IDTBL 
IDTBT DEF IDTBL,I 
ILINS DEF ILIN      => " ILLEGAL INPUT" 
JDECS DEF JDECN     => FILE COUNTER 
LULEN DEF IDTBL+8192
LIBD  DEF IDTBL-2048
LIBDI DEF IDTBL-2048,I
MDSES DEF MDSE
MLIBD ABS 2048-IDTBL
MOVDS DEF MOVED     => MOVE DESTINATION WORD
MOVSS DEF MOVES     => MOVE SOURCE
MOVWS DEF MOVEW     => FORWARD MOVE ROUTINE 
MTDIS DEF MTDIN     => MAG TAPE CONFIURATOR 
MTKDS DEF MTKD
MTRRS DEF MTRRF     => "EOF IN" FLAG
MTS   DEF MTD 
RLMSS DEF RLMS      => "LOAD OR DUMP COMMANDS?" 
SAS   ASC 1,
SASCM OCT 54        "," 
SASD  OCT 104       "D" 
SASE  OCT 105       "E" 
SASL  OCT 114       "L" 
SASN  OCT 116       "N" 
SDFLS DEF SDFLG     => SELECTIVE DUMP FLAG
SDIR0 EQU DIRES 
SDIRL DEF DIREU-7 
SDIRU EQU DIRCT 
SPRBA DEF SPRBE                                  [B]
SPSFS DEF SPSFM                                  [B]
SRFLS DEF SRFLG     => SELECTIVE RELOAD FLAG
STLE  ABS -10220
SUPMS DEF SUPM      => NO ROOM IN DIRECTORY 
TLSLS DEF TLRT+TLSL+1    => SYSTEM'S FEATURE CODE[B]
TPLRS DEF TPLR                                   [B]
X2056 DEF IDTBL+8 
* 
DEFNN DEF *+1 
      BSS 80
ENTEP BSS 1 
NOMES BSS 1         = 0 FOR UNSUPPRESS
*                                   = 1 FOR SUPPRESS DELETE MESSAGE 
STMP0 BSS 1 
STMP1 BSS 1 
STMP2 BSS 1 
STMP3 BSS 1 
SUP   BSS 1 
SUPB  BSS 1 
SUPEX BSS 1 
SUPES BSS 1 
SUPK1 BSS 1 
SUPK2 BSS 1 
SUPL1 BSS 1 
SUPL2 BSS 1 
SUPP  BSS 1 
      BSS 1 
SUPS  BSS 1 
SUPTG BSS 1 
LDFLG BSS 1         0 SEZ DUMP
*                                   NON ZERO SEZ LOAD 
      SPC 3 
* 
*  CHECK FOR PAGE OVERFLOW
* 
      LDA 22000B                                 [B]
      HED 7970 MAGNETIC TAPE UNIT DRIVER
      ORG 24000B
***                                       *** 
**                                         ** 
*  7970 MAGNETIC TAPE DRIVER (DMA VERSION)  * 
**                                         ** 
***                                       *** 
* 
* 
*  ALL CALLS RETURN WITH THE HARDWARE STATUS IN (B) FOR ALL RETURN
*  POINTS.  ALL CALLS SET EOTF<>0 IF THE TAPE IS AT OR BEYOND THE 
*  END-OF-TAPE MARKER, OTHERWISE EOTF=0 UPON RETURN.  THE DRIVER
*  USES DMA BUT ASSUMES THAT THE INTERRUPT SYSTEM IS OFF.  THE
*  DRIVER WAITS FOR THE COMPLETION (NORMAL OR OTHERWISE) OF ALL 
*  COMMANDS EXCEPT REWIND AND REWIND/STANDBY BEFORE RETURNING.
*  IF A REQUEST IS MADE WHILE THE UNIT IS REWINDING, THE DRIVER 
*  WAITS UNTIL IT CAN BE HONORED. 
* 
* 
* 
*  READ/WRITE CALLING SEQUENCE
* 
*     LDA <BUFFER LENGTH>     (A)>0 FOR CHARACTERS, (A)<0 FOR WORDS 
*     LDB <BUFFER ADDRESS>
*     JSB MTD 
*     OCT <COMMAND CODE>      CODE=0 FOR READ, 1 FOR WRITE
*    <EOF RETURN> 
*    <ERROR RETURN> 
*    <NORMAL RETURN>          (A)=RECORD LENGTH 
* 
*     READ OR WRITE REQUESTS OF 0 LENGTH RETURN TO <NORMAL RETURN>
*     WITHOUT ANY TAPE MOVEMENT.  THE DRIVER PREFIXES EACH RECORD 
*     WRITTEN WITH THE REQUEST LENGTH AS SUPPLIED IN (A) UPON 
*     ENTRY.  THE DRIVER STRIPS THIS WORD WHEN A RECORD IS READ 
*     AND RETURNS IT IN (A), IN THE SAME FORM AS THE REQUESTED
*     LENGTH, IF IT IS LESS THAN THEN REQUESTED LENGTH.  THIS IS
*     TRANSPARENT TO THE CALLER AND DOES NOT ALTER ANY WORDS OUT- 
*     SIDE OF THE BUFFER AREA SPECIFIED IN THE REQUEST.  RETURN IS
*     TO <EOF RETURN> IF AN EOF MARK IS READ OR A 3RD WRITE RETRY 
*     BEGINS AFTER THE END-OF-TAPE MARK IS SENSED (IN THIS LATTER 
*     CASE THE RECORD WILL NOT HAVE BEEN WRITTEN).  THE EOT MARK
*     IS IGNORED ON A READ OR SUCCESSFUL WRITE (EXCEPT FOR SETTING
*     EOTF<>0).  RETURN IS TO <ERROR RETURN> ON READ FAILURE PER- 
*     SISTING AFTER THREE REREAD ATTEMPTS OR ON INABILITY TO ERASE
*     AN ERRONEOUSLY WRITTEN RECORD BEFORE RETRYING THE WRITE.
* 
      SKP 
* 
*  WRITE END-OF-FILE / GAP CALLING SEQUENCE 
* 
*     JSB MTD 
*     OCT <COMMAND CODE>      CODE=2 FOR WRITE EOF, 6 FOR GAP 
*    <EOT RETURN> 
*    <ERROR RETURN> 
*    <NORMAL RETURN>
* 
*     A GAP REQUEST ERASES THE NEXT THREE INCHES OF TAPE.  RETURN 
*     IS TO <EOT RETURN> IF A GAP OPERATION COMPLETES ON OR PAST
*     THE END-OF-TAPE MARK.  RETURN IS TO <ERROR RETURN> IF THE 
*     TAPE IS NOT PROPERLY ERASED.  WRITE EOF IS RETRIED UNTIL
*     SUCCESSFUL. 
* 
* 
* 
*  TAPE POSITIONING CALLING SEQUENCE
* 
*     LDA <FILE COUNT>        (A)>0 => FORWARD, (A)<0 => BACKFILE 
*     LDB <RECORD COUNT>      (B)>0 => FORWARD, (B)<0 => BACKSPACE
*     JSB MTD 
*     OCT 4 
*    <BOT/EOT RETURN> 
*    <ERROR RETURN> 
*    <NORMAL RETURN>
* 
*     A BACKFILE REQUEST OF MAGNITUDE N BACKSPACES TO BUT NOT OVER
*     THE N-TH FILE MARK PRECEDING THE CURRENT TAPE POSITION, 
*     TREATING THE BEGINNING-OF-TAPE (BOT) MARK AS A FILE MARK.  A
*     FORWARD FILE REQUEST OF N SPACES OVER THE N-TH FILE MARK
*     FOLLOWING THE CURRENT TAPE POSITION.  RECORD SPACING IS PER-
*     FORMED AFTER ANY FILE SPACING AND SPACES OVER ABS(N) RECORDS, 
*     COUNTING A FILE MARK AS ONE RECORD.  A BACKWARD MOTION
*     REQUEST ATTEMPTING TO CROSS THE BOT MARK RETURNS TO THE 
*     <BOT/EOT RETURN>.  A FORWARD FILE OR FORWARD RECORD OPERATION 
*     MAY CROSS THE END-OF-TAPE (EOT) MARK IF IT FINISHES THE 
*     FORWARD MOTION REQUIREMENT FOR A REQUEST.  A REQUIREMENT TO 
*     CONTINUE FORWARD MOTION OR A REQUEST TO INITIATE FORWARD
*     SPACING WHEN THE TAPE IS PAST THE EOT MARK (I.E., FOLLOWING 
*     A READ, WRITE, WRITE END-OF-FILE MARK, GAP, OR POSITIONING
*     REQUEST WHICH CROSSED THE EOT MARK) WILL RETURN TO THE
*     <BOT/EOT RETURN>.  A REQUEST TO PERFORM ONE FORWARD FILE
*     OPERATION WHEN THE TAPE IS PAST THE EOT MARK WILL BE
*     HONORED BY BACKSPACING UNTIL THE EOT MARK IS CLEARED AND
*     THEN PERFORMING THE FILE SPACE FORWARD.  A REQUEST TO 
*     PERFORM MORE THAN ONE FORWARD FILE OPERATION WHEN PAST
*     THE EOT MARK WILL RETURN TO THE <BOT/EOT RETURN>.  NOTE 
*     THAT A BACKWARD MOTION REQUEST CROSSING THE EOT MARK
*     CLEARS THE ABOVE CONDITION SO THAT, FOR EXAMPLE, A
*     BACKFILE/FORWARD SPACE COMBINATION IN ONE REQUEST IS
*     LEGAL IF IT TERMINATES NO FURTHER FORWARD THAN THE
*     RECORD WHICH CROSSES THE EOT MARK.
* 
      SKP 
* 
*  REWIND / REWIND/STANDBY / STATUS CALLING SEQUENCE
* 
*     JSB MTD 
*     OCT <COMMAND CODE>    CODE=3 FOR REWIND, 5 FOR REWIND/STANDBY,
*    <RETURN>                 OR 7 FOR STATUS 
* 
*     THE HARDWARE STATUS BITS FOR THE 7970 ARE 
* 
*        BIT     MEANING
* 
*         0   TAPE UNIT NOT ON-LINE 
*         1   PARITY AND/OR TIMING ERROR
*         2   FILE PROTECTED (NO WRITE ENABLE RING) 
*         3   COMMAND REJECTED (DOES NOT OCCUR WITH THIS DRIVER)
*         4   TIMING ERROR (WILL ALSO SET BIT 1)
*         5   END OF TAPE (ON OR PAST EOT MARK) 
*         6   BEGINNING OF TAPE (TAPE AT BOT MARK)
*         7   END OF FILE (EOF MARK READ, WRITTEN, OR SPACED OVER)
*         8   CONTROLLER BUSY (DOES NOT OCCUR WITH THIS DRIVER) 
*         9   TAPE UNIT NOT READY (OFFLINE, REWINDING, NOT PRESENT) 
*        10   TAPE UNIT REWINDING 
*        11   ODD NUMBER OF BYTES READ
* 
      SKP 
