!** MTSUPP09S MODIFIED TO ALLOW TAPE CLAIMING ONLY AT ACR 9 OR LESS !MODIFIED 16.11.79 TO ACCEPT TAPE CLAIMS WITH ? AS THE !LAST CHARACTER OF VOL. MEANS LOAD WITH OPTIONAL RING !ALSO DIFFERENT HANDLING OF FAILURES. I FLAG IS 2 THEN !CATASTROPHIC FAILURE - DECK HAS POWERED OFF OR SIMILAR !IF 1 THEN HARDWARE FAULT - ALLOW 10 ON A CHANNEL THEN ABANDON !MAG TAPE SUPPORT ROUTINES FOR UTILITY PROGRAMS !R.MCLEOD APRIL 1978 !* !* !* EXTERNAL SPECS !* !* CONSTINTEGER MAXFAULTCOUNT = 10; !ABANDON AFTER 10 HARDWARE FAULTS CONSTINTEGER MINCHAN = 1 CONSTINTEGER MAXCHAN = 8 EXTERNALINTEGERFNSPEC UINFI(INTEGER N) EXTERNALINTEGERFNSPEC DMAGCLAIM(STRING (6) TSN, C INTEGERNAME SNO, INTEGER REQ, MODE) EXTERNALINTEGERFNSPEC DMAGIO( C INTEGERNAME REPLY, CONTROL, LEN, INTEGER TYPE, SNO, ADR) OWNINTEGER CONTROL; !USED FOR DMAGIO CALLS - NO EFFECT PROTEM OWNINTEGERARRAY SNO(1 : 8) = -1(8);!SERVICE NOS OWNINTEGERARRAY FAULTCOUNT(1 : 8); !COUNT OF HARDWARE FAULTS OWNSTRING (6) ARRAY VOL(1 : 8) OWNINTEGERARRAY MODE(1 : 8) ROUTINESPEC SKIPTMMAG(INTEGER CHAN, N) ROUTINE FAIL(STRING (255) S) SELECTOUTPUT(0) NEWLINES(2) PRINTSTRING(S) MONITOR STOP END ; !OF FAIL ROUTINE RECORDFAULT(INTEGER CHAN, INTEGERNAME FLAG) IF FLAG = 2 THEN FAIL("CATASTROPHIC TAPE FAILURE") IF FAULTCOUNT(CHAN) >= MAXFAULTCOUNT C THEN FAIL("MORE THAN 10 TAPE FAILURES") FAULTCOUNT(CHAN) = FAULTCOUNT(CHAN)+1 FLAG = 2; !FOR RETURN TO USER END ; !OF RECORDFAULT EXTERNALROUTINE OPENMAG(INTEGER CHAN, STRING (7) S) INTEGER FLAG,LNB,ACR UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") *STLN_LNB; !TO FIND ACR LEVEL ACR = (INTEGER(LNB+4)>>20)&X'F'; !PRIV IF 5 OR LESS IF ACR > 9 AND UINFI(2)&1 = 1 START ; !UN-PRIV ATTEMT TO USE TAPE !FROM INTERACTIVE TERMINAL FAIL("No tape access allowed from interactive terminal") FINISH IF SNO(CHAN) # -1 THEN FAIL("TAPE ALREADY CLAIMED") IF S -> VOL(CHAN).("?") THEN MODE(CHAN) = 3 ELSE START !OPTIONAL RING IF S -> VOL(CHAN).("*") THEN MODE(CHAN) = 2 C ELSE VOL(CHAN) = S AND MODE(CHAN) = 1 !WRITE OR READ FINISH WHILE LENGTH(VOL(CHAN)) < 6 THEN VOL(CHAN) = VOL(CHAN)." " FLAG = DMAGCLAIM(VOL(CHAN),SNO(CHAN),0,MODE(CHAN)) IF FLAG # 0 THEN FAIL("FAILURE TO CLAIM TAPE") IF MODE(CHAN) = 3 THEN MODE(CHAN) = 2; !IF RING OPTIONAL !THEN TREAT AS IF THERE IS ONE. IT'S UP TO THE USER TO TAKE CARE FAULTCOUNT(CHAN) = 0; !RESET COUNT OF FAULTS END ; !OF OPENMAG EXTERNALROUTINE UNLOADMAG(INTEGER CHAN) INTEGER FLAG UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") RETURN IF SNO(CHAN) < 0 FLAG = DMAGCLAIM(VOL(CHAN),SNO(CHAN),1,MODE(CHAN)) !GIVE BACK TAPE VOL(CHAN) = "" SNO(CHAN) = -1 END ; !OF UNLOADMAG EXTERNALROUTINE READMAG(INTEGER CHAN, AD, C INTEGERNAME LEN, FLAG) INTEGER DFLAG UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") IF SNO(CHAN) < 0 THEN FAIL("TAPE NOT CLAIMED") IF LEN <= 0 THEN FAIL("INVALID READ LENGTH") CONTROL = 4; !IGNORE SHORT BLOCK INDICATION DFLAG = DMAGIO(FLAG,CONTROL,LEN,1,SNO(CHAN),AD) IF DFLAG > 7 THEN FAIL("DMAGIO FAILS IN READMAG") IF FLAG # 0 START IF FLAG = 4 START ; !TAPE MARK HIT SKIPTMMAG(CHAN,1); !SKIP OVER THE TAPE MARK FLAG = 1 FINISH ELSE RECORDFAULT(CHAN,FLAG) FINISH END ; !OF READMAG EXTERNALROUTINE WRITEMAG(INTEGER CHAN, AD, LEN, C INTEGERNAME FLAG) INTEGER DFLAG UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") IF SNO(CHAN) < 0 THEN FAIL("TAPE NOT CLAIMED") IF MODE(CHAN) = 1 THEN FAIL("WRITING NOT ALLOWED") CONTROL = 0 DFLAG = DMAGIO(FLAG,CONTROL,LEN,2,SNO(CHAN),AD) IF DFLAG > 7 THEN FAIL("DMAGIO FAILS IN WRITEMAG") IF FLAG # 0 THEN RECORDFAULT(CHAN,FLAG) END ; !OF WRITEMAG EXTERNALROUTINE WRITETMMAG(INTEGER CHAN, INTEGERNAME FLAG) INTEGER DFLAG UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") IF SNO(CHAN) < 0 THEN FAIL("TAPE NOT CLAIMED") IF MODE(CHAN) = 1 THEN FAIL("WRITING NOT ALLOWED") CONTROL = 0 DFLAG = DMAGIO(FLAG,CONTROL,CONTROL,10,SNO(CHAN),0) IF DFLAG > 7 THEN FAIL("DMAGIO FAILS IN WRITETMMAG") IF FLAG # 0 THEN RECORDFAULT(CHAN,FLAG) END ; !OF WRITETMMAG EXTERNALROUTINE REWINDMAG(INTEGER CHAN) INTEGER DFLAG, FLAG UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") IF SNO(CHAN) < 0 THEN FAIL("TAPE NOT CLAIMED") CONTROL = 0 DFLAG = DMAGIO(FLAG,CONTROL,CONTROL,6,SNO(CHAN),CONTROL) IF DFLAG > 7 THEN FAIL("DMAGIO FAILS IN REWINDMAG") END ; !OF REWINDMAG EXTERNALROUTINE SKIPMAG(INTEGER CHAN, N) !SKIP N BLOCKS(A TAPE MARK COUNTING AS A BLOCK) BACKWARDS OR FORWARDS INTEGER FLAG, DIRECTION, I, DFLAG, LEN UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") IF SNO(CHAN) < 0 THEN FAIL("TAPE NOT CLAIMED") RETURN IF N = 0; !NULL CALL IF N > 0 THEN DIRECTION = 1 ELSE N = -N AND DIRECTION = -1 CYCLE I = 1,1,N CONTROL = 0 LEN = DIRECTION DFLAG = DMAGIO(FLAG,CONTROL,LEN,8,SNO(CHAN),0) !TRY AND SKIP 1 BLOCK IF DFLAG > 7 THEN FAIL("DMAGIO FAILS IN SKIPMAG") IF 1 <= FLAG <= 2 THEN FAIL("FAILURE IN SKIP") !SKIP SHOULD NEVER FAIL IF FLAG = 4 START ; !TAPE MARK FOUND CONTROL = 1 LEN = DIRECTION DFLAG = DMAGIO(FLAG,CONTROL,LEN,9,SNO(CHAN),0) !TRY AND SKIP THE TM IF DFLAG > 7 THEN FAIL("DMAGIO FAILS IN SKIPMAG") IF 1 <= FLAG <= 2 THEN FAIL("FAILURE IN SKIP") FINISH REPEAT END ; !OF SKIPMAG EXTERNALROUTINE SKIPTMMAG(INTEGER CHAN, N) INTEGER FLAG, DFLAG, LEN, DIRECTION, I UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") IF SNO(CHAN) < 0 THEN FAIL("TAPE NOT CLAIMED") IF N = 0 THEN RETURN IF N > 0 THEN DIRECTION = 1 ELSE DIRECTION = -1 AND N = -N CYCLE I = 1,1,N CONTROL = 1 LEN = DIRECTION DFLAG = DMAGIO(FLAG,CONTROL,LEN,9,SNO(CHAN),0) IF DFLAG > 7 THEN FAIL("DMAGIO FAILS IN SKIPTMMAG") IF 1 <= FLAG <= 2 THEN FAIL("FAILURE IN SKIP") REPEAT END ; !OF SKIPTMMAG EXTERNALROUTINE FSKIPTMMAG(INTEGER CHAN, N, INTEGERNAME FLAG) INTEGER DFLAG, LEN, I UNLESS MINCHAN <= CHAN <= MAXCHAN C THEN FAIL("INVALID CHAN") IF SNO(CHAN) < 0 THEN FAIL("TAPE NOT CLAIMED") IF N = 0 THEN RETURN CONTROL = 1 LEN = N; !NO OF TAPEMARKS FORE OR AFT DFLAG = DMAGIO(FLAG,CONTROL,LEN,9,SNO(CHAN),0) IF DFLAG > 7 THEN FAIL("DMAGIO FAILS IN SKIPTMMAG") IF 1 <= FLAG <= 2 THEN FAIL("FAILURE IN SKIP") IF FLAG = 4 THEN FLAG = 1; !GOT TO DOUBLE TM BEFORE SKIPPING ENOUGH END ; !OF FSKIPTMMAG !THE FOLLOWING ROUTINES ARE PROVIDED FOR BACK COMPATIBILITY EXTERNALROUTINE OPENMT(STRING (7) VOL) OPENMAG(1,VOL) END ; !OF OPENMT EXTERNALROUTINE UNLOADMT UNLOADMAG(1) END ; !OF UNLOADMT EXTERNALROUTINE REWINDMT REWINDMAG(1) END ; !REWINDMT EXTERNALROUTINE READMT(INTEGER AD, INTEGERNAME LEN, FLAG) READMAG(1,AD,LEN,FLAG) END ; !OF READMT EXTERNALROUTINE WRITEMT(INTEGER AD, LEN, INTEGERNAME FLAG) WRITEMAG(1,AD,LEN,FLAG) END ; !OF WRITEMT EXTERNALROUTINE WRITETMMT(INTEGERNAME FLAG) WRITETMMAG(1,FLAG) END ; !OF WRITETMMT EXTERNALROUTINE SKIPMT(INTEGER N) SKIPMAG(1,N) END ; !OF SKIPMT EXTERNALROUTINE SKIPTMMT(INTEGER N) SKIPTMMAG(1,N) END ; !OF SKIPTMMT ENDOFFILE