. . 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