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