.
.         END OF TAPE ROUTINE
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
          PURE      CODE
.
.         LA,U      A0,<I/O FCT>
.         LMJ       X11,EOT
.         <TREAT AS END OF FILE>
.         <KEEP ON GOING--NOW ON NEW REEL>
.
EOT*      TZ        IOMASS,A0           IS IT MASS STORAGE ?
          J         EOTERR              NO.  SHOULDN'T BE HERE
.
.         STEP 1.  SEE WHICH WAY WE'RE GOING
.
          LA        A1,IOFUNC,A0        LOAD FUNCTION FROM PACKET
          te,u      a1,bsf$             backspace file ?
          TNE,U     A1,MB$              MOVE BACKWARD ?
          J         EOTBW               YES.  LOAD POINT
          te,u      A1,RB$              READ BACKWARDS ?
          TNE,U     A1,SCRB$            SCATTER READ BACKWARDS ?
          J         EOTBW               LOAD POINT
.
.         GOING FORWARD - CHECK FOR VALID END OF VOLUME SEQUENCE
.
.         IN ORDER FOR FANG TO EXECUTE THE END OF VOLUME CODE, THE FOLLOWING
.         SEQUENCE MUST BE ENCOUNTERED:
.
.         1.  END OF FILE MARK
.         2.  14 WORD BLOCK WITH T1 OF FIRST WORD EQUAL TO 05416.
.         3.  END OF FILE MARK
.
.         ANY OTHER SEQUENCE WILL CAUSE THE TAPE TO BE REPOSITIONED AND
.         THE ORIGINAL END OF FILE TO BE TAKEN AS AN END OF FILE, AND NOTHING
.         MORE.
.
          SX        X11,R2              SAVE RETURN POINT
          SA        A0,A3               SAVE PACKET ADDRESS
          LXI       A3,IOFUNC,A0        SAVE ORIGINAL FUNCTION
          LA,U      A0,R$               LOAD READ FUNCTION
          SA        A0,IOFUNC,A3        SET READ FUNCTION IN PACKET
          LA        A4,IOACW,A3         SAVE ORIGINAL ACCESS WORD
          BGET      15                  ALLOCATE A READ BUFFER
          LXI,U     A0,15               FORM ACCESS WORD
          SA        A0,IOACW,A3         PUT ACCESS WORD IN PACKET
          IOW$      0,A3                READ IN A BLOCK
          LR,U      R1                  MARK ONE BLOCK EXTENDED
          LA        A1,IOXFER,A3        LOAD WORDS READ FROM TAPE
          TNZ       IOSTATUS,A3         WAS I/O STATUS NORMAL ?
          TE,U      A1,14               YES.  WERE EXACTLY 14 WORDS READ ?
          J         NOTEOV              NO.  IT'S NOT AN END OF VOLUME
          LX        X11,(0541600,0)     LOAD NORMAL END OF REEL SENTINEL
          LA        A1,IOFDT,A3         LOAD ADDRESS OF FDT FOR FILE
          LA        A0,FDPROP,A1        LOAD FILE PROPERTIES
          TOP,U     A0,EPMSA            IS THIS AN MSA TAPE ?
          J         EOVNQW              NO.  CANNOT BE QUARTER WORD
          LA        A0,FDMODES,A1       LOAD FILE MODE BITS
          AND,U     A0,BIT(16,17)       AND OFF MSA FORMAT BITS
          TNZ       A1                  IS MSA IN QUARTER WORD FORMAT ?
          LX        X11,(054016,0)      YES.  LOAD QUARTER WORD SENTINEL
EOVNQW    LA,H2     A1,IOACW,A3         LOAD ADDRESS OF BUFFER READ
          LA        A1,,A1              LOAD FIRST WORD FROM BUFFER
          TE        A1,X11              IS THIS AN END OF REEL SENTINEL ?
          J         NOTEOV              NO.  POSITION TAPE BACK TO EOF
          IOW$      IOPKT,A3            READ NEXT BLOCK FROM TAPE
          LR,U      R1,1                MARK TWO BLOCKS EXTENDED
          LA        A1,IOSTATUS,A3      LOAD I/O STATUS FOR THIS BLOCK
          TE,U      A1,1                WAS IT AN EOF ?
          J         NOTEOV              NO.  THEN LAST BLOCK WAS PHONEY
          TSWAP$    .                   I'M SATISFIED IT WAS AN EOV.  DO IT
          SZ        IOBLKN,A3           SET POSITION TO BLOCK ZERO
EOVOUT    BRELP     IOACW,A3,H2         RELEASE THE I/O BUFFER
          LA        A0,A3               RESTORE I/O FCT ADDRESS TO A0
          SSL       A3,18               RIGHT JUSTIFY I/O FUNCTION
          SA        A3,IOFUNC,A0        REPLACE I/O FUNCTION IN PACKET
          SA        A4,IOACW,A0         RESTORE ORIGINAL ACCESS WORD
          LX        X11,R2              LOAD RETURN POINT
          J         1,X11               RETURN TO CALLER
.
.         IT WASN'T AN END OF VOLUME AFER ALL.  MIND BACK TO WHERE WE WERE.
.
NOTEOV    LA,U      A1,MB$              LOAD MOVE BACKWARD FUNCTION
          sa        a1,iofunc,a3        store function in I/O packet
eovback   iow$      iopkt,a3            back up the tape one block
          JGD       R1,EOVBACK          LOOP FOR BLOCKS EXTENDED
          JGD       R2,EOVOUT           RETURN TO EOF RETURN (ALWAYS JUMPS)
.
.         GIVE MESSAGE FOR ERROR IN END OF VOLUME PROCESSING
.
EOTERR    ZAP       .                   ROADBLOCK THIS COMMAND
          J         IOSEDT              EDIT STATUS, STOP
.
.         END OF TAPE STATUS ENCOUNTERED WHILE MOVING BACKWARD
.
EOTBW     LXI,U     A0,,X11             SAVE RETURN POINT
          SA        A0,A5               ...IN A5
          LA        A4,IOFDT,A0         GET FDT ADDRESS WHILE TIME IS RIPE
          R$DIT     .                   ENTER EDIT MODE
          E$MSG     LPE                 EDIT LOAD POINT TEXT
          LA        A0,A4               RESTORE FDT ADDRESS
          LMJ       X11,FIST            EDIT FILE AND STATEMENT
          LA        A0,A5               RESTORE ADDRESS, RETURN POINT
          LA        A1,A5               GET RETURN ADDRESS
          SSL       A1,18               SHIFT IT INTO MODIFIER
          J         0,A1                RETURN TO STOP IT RETURN
.
.         LA,U      A0,<I/O FCT>
.         LMJ       X11,EOTWRT
.         <TREAT PACKET AS I/O ERROR>
.         <TREAT AS NORMAL COMPLETION - ON NEW REEL>
.
EOTWRT*   TZ        IOMASS,A0           TAPE FILE ?
          J         EOTERR              NO.  SOMEBODY'S CONFUSED
          LR        R2,X11              LOAD RETURN POINT
          LA        A2,IOXFER,A0        LOAD I/O TRANSFER COUNT
          LA        A3,A0               SAVE PACKET ADDRESS IN A3
          LXI       A3,IOFUNC,A0        LOAD ORIGINAL FUNCTION FROM PACKET
          LA,U      A1,WEF$             LOAD WRITE END OF FILE FUNCTION
          SA        A1,IOFUNC,A0        REPLACE FUNCTION IN PACKET
          IOW$      .                   WRITE A FILE MARK AFTER LAST BLOCK
          LA        A1,IOSTATUS,A0      LOAD STATUS FROM OPERATION
          TE,U      A1,2                TAPE LIMIT STATUS ?
          jgd       r2,eoverr           error.  go return error status
          LR        R1,(0541600,0)      LOAD NORMAL END OF REEL SENTINEL
          LX        X11,IOFDT,A0        LOAD FDT FOR TAPE FILE
          LA        A1,FDPROP,X11       LOAD FILE PROPERTIES
          TOP,U     A1,EPMSA            IS THIS AN MSA TAPE ?
          J         ETWNQW              NO.  CANNOT BE QUARTER WORD FORMAT
          LA        A0,FDMODES,X11      LOAD FILE MODES
          AND,U     A0,BIT(16,17)       ISOLATE MSA FORMAT BITS
          TNZ       A1                  IS MSA IN QUARTER WORD FORMAT ?
          LR        R1,(054016,0)       YES.  LOAD BYTE-MODE EOV SENTINEL
ETWNQW    BGET      14                  ALLOCATE BUFFER FOR EOV SENTINEL
          LXI,U     A0,1                GET INCREMENT IN BLOCK POINTER
          SR        R1,,*A0             PUT END OF REEL SENTINEL IN BUFFER
          LA,U      A1,('>FANG<')       LOAD UNIQUE IDENTIFIER FOR REST
          LR,U      R1,13               LOAD COUNT
          BT        A0,,*A1             FILL BUFFER WITH LITTLE FANGS
          ANH       A0,(-13,14)         COMPUTE ACCESS WORD FOR WRITE
          SA        A0,IOACW,A3         PUT ACCESS WORD IN PACKET
          LA,U      A0,W$               LOAD WRITE FUNCTION
          SA        A0,IOFUNC,A3        PUT WRITE FUNCTION IN PACKET
          IOW$      0,A3                WRITE END-OF-VOLUME BLOCK ON THE TAPE
          BRELP     IOACW,A0,H2         RELEASE THE I/O BUFFER
          LA        A1,IOSTATUS,A3      LOAD I/O STATUS
          TE,U      A1,2                TAPE LIMIT STATUS ?
          JGD       R2,EOVERR           NO.  TAKE THE ERROR EXIT
          LA,U      A1,WEF$             LOAD WRITE END OF FILE FUNCTION
          SA        A1,IOFUNC,A3        PUT FUNCTION IN PACKET
          IOW$      0,A3                WRITE A FILE MARK AFTER SENTINEL
          LA        A1,IOSTATUS,A0      LOAD I/O STATUS
          TE,U      A1,2                TAPE LIMIT ?
          JGD       R2,EOVERR           NO.  ERROR
          IOW$      .                   WRITE SECOND AND FINAL MARK ON TAPE
          LA        A1,IOSTATUS,A0      LOAD STATUS FROM SECOND MARK OPERATION
          TE,U      A1,2                SHOULD BE TAPE LIMIT STATUS
          JGD       R2,EOVERR           NO.  TAKE ERROR EXIT
          TSWAP$    .                   SWAP TO NEW OUTPUT REEL
EOVERR    LA        A0,A3               RESTORE PACKET ADDRESS TO A0
          SSL       A3,18               MOVE ORIGINAL FUNCTION TO H2
          SA        A2,IOXFER,A0        RESTORE I/O TRANSFER COUNT TO PACKET
          SA        A3,IOFUNC,A0        RESTORE ORIGINAL FUNCTION TO PACKET
          LX        X11,R2              RELOAD RETURN POINT
          J         1,X11               RETURN TO CALLER
.
          PURE      DATA
LPE       'LOAD POINT ENCOUNTERED ON !'
          END