!**FILE LAST CHANGED ON 26/02/76 AT 12.08.05
!ALTERED 26.2.76 TO REQUEST NO OF PAGES TO BE WRITTEN
!***********************************************************************
!* *
!* MAGNETIC TAPE TEST PROGRAM WRITTEN BY R. MCLEOD 16.1.75 *
!* THE PROGRAM WRITES A TAPE IN EMAS BACKUP FORMAT FROM AFTER THE *
!* LABEL AS FAR AS ET (END OF TAPE). THE FORMAT IS 10 BLOCKS OF *
!* 4096 BYTES FOLLOWED BY A TAPE MARK (THIS IS ONE CHAPTER). THERE *
!* ARE AS MANY CHAPTERS AS CAN BE WRITTEN - THE LAST ONE MAY BE *
!* SHORT. *
!* WHEN READING THE PROGRAM CHECKS THAT BLOCKS ARE OF THE CORRECT *
!* LENGTH AND THAT THEY CONTAIN CORRECT CHAPTER AND PAGE NUMBERS. *
!* ALSO THAT TAPE MARKS APPEAR WHERE EXPECTED. ALL OTHER CHECKING *
!* IS LEFT TO STANDARD TAPE HANDLING ROUTINES. *
!* THE PROGRAM CALLS ROUTINES IN FILE UTILITY.MTSUPPY - ALSO *
!* WRITTEN BY R. MCLEOD. *
!* *
!***********************************************************************
EXTERNALROUTINE MAGTAPE(STRING (63) S)
EXTERNALROUTINESPEC SKIPTMMT(C
INTEGER N)
CONSTSTRING (3) DEVICEMT = "000"
EXTERNALROUTINESPEC WRITEMT(INTEGER A, L, INTEGERNAME F)
EXTERNALROUTINESPEC READMT(INTEGER A, INTEGERNAME L, F)
EXTERNALROUTINESPEC WRITETMMT(INTEGERNAME F)
EXTERNALROUTINESPEC UNLOADMT
EXTERNALROUTINESPEC OPENMT(STRING (7) VOL)
EXTERNALSTRINGFNSPEC DATE
EXTERNALSTRINGFNSPEC TIME
EXTERNALROUTINESPEC PROMPT(STRING (15) S)
OWNINTEGER CHAP, FLAG, BLENGTH
STRING (20) VOL, OPTION
INTEGER AHOLD, I, PAGE, CHAPREQ
RECORDFORMAT HOLDF(INTEGER CHAP, PAGE, C
STRING (8) DATE, TIME, STRING (3) DEV, C
BYTEINTEGERARRAY PAT(1 : 4066))
RECORD HOLD(HOLDF)
AHOLD=ADDR(HOLD_CHAP)
ROUTINE READLINE(STRINGNAME S); !READ NEXT LINE INTO S
SKIPSYMBOL WHILE NEXTSYMBOL = NL; !IGNORE BLANK LINES
S = ''
UNTIL NEXTSYMBOL = NL THEN S = S.C
TOSTRING(NEXTSYMBOL) AND SKIPSYMBOL
SKIPSYMBOL
END
PRINTSTRING ("MAG TAPE TEST PROGRAM 26.2.76")
NEWLINES(2)
PROMPT('TAPE:')
GETVOL:
READLINE(VOL)
-> GET VOL UNLESS LENGTH(VOL) = 6; !ERCC LABELS ALWAYS 6 CHAS
PROMPT('READ/WRITE:')
GETOPT:
READLINE(OPTION)
-> READTAPE IF OPTION = 'READ'
-> WRITETAPE IF OPTION = 'WRITE'
-> GETOPT; !REPLY INVALID
!***********************************************************************
!* *
!* WRITE TAPE *
!* FIRST SET UP BLOCK IN RECORD HOLD. CONTENTS AS PER FORMAT. CHAP *
!* COUNTS FROM 1. PAGE COUNTS 1-10 WITHIN EACH CHAPTER. PAGE=-1 *
!* MEANS LAST BLOCK ON TAPE. *
!* *
!***********************************************************************
WRITETAPE:
OPENMT(VOL."*"); !MOUNT WITH RING
SKIPTMMT(1); !PAST LABEL
PROMPT('PAGES:')
READ(CHAPREQ)
CHAPREQ=(CHAPREQ+9)//10; !10 BLOCKS TO A CHAPTER
IF CHAPREQ<=0 THEN CHAPREQ=100000; !PLENTY TO FILL TAPE
!SET UP BLOCK
HOLD_DATE = DATE
HOLD_TIME = TIME
HOLD_DEV = DEVICEMT; !DEVICE NO OF DECK
CYCLE I = 1,1,4066
HOLD_PAT(I) = X'F0'; !A WORST CASE PATTERN-COULD
REPEAT ; !TRY SOMETHING ELSE E.G.X'AA'
PRINTSTRING('WRITING TO TAPE '.VOL.' ON DECK '.DEVICEMT.C
' AT '.HOLD_TIME.' ON '.HOLD_DATE)
NEWLINES(2)
CYCLE CHAP = 1,1,CHAPREQ
HOLD_CHAP = CHAP
CYCLE PAGE = 1,1,10; !FOR EACH CHAPTER
HOLD_PAGE = PAGE
WRITEMT(AHOLD,4096,FLAG)
-> ENDWRITE IF FLAG = 4; !END OF TAPE
-> WRITEFAIL IF FLAG # 0
REPEAT
EXITIF CHAP=CHAPREQ; !TO AVOID EXTRA TAPE MARK
WRITETMMT(FLAG)
-> ENDWRITE IF FLAG=4 ; !END OF TAPE
-> WRITEFAIL IF FLAG # 0
REPEAT
ENDWRITE:
IF PAGE = 10 THEN WRITETMMT(FLAG)
HOLD_PAGE = -1
WRITEMT(AHOLD,4096,FLAG); !LAST BLOCK
WRITETMMT(FLAG)
WRITETMMT(FLAG)
NEWLINES(2)
PRINTSTRING ("****** TAPE CONTAINS ")
WRITE(HOLD_CHAP,1)
PRINTSTRING (" CHAPTERS EACH OF 10 PAGES")
NEWLINES(2)
PRINTSTRING ("RUN ENDS")
NEWLINE
UNLOADMT
RETURN
!***********************************************************************
!* *
!* READ TAPE *
!* EXTRACTS TIME, DATE + DEVICE NO OF TAPE WRITING FOR CHECKING *
!* PURPOSES AND OUTPUTS TO TT. CHECKS LENGTHS OF BLOCKS, POSITION *
!* OF TAPE MARKS, AND CHAPTER AND PAGE NO OF EACH BLOCK. *
!* *
!***********************************************************************
READTAPE:
OPENMT(VOL."*"); !WITHOUT RING
SKIPTMMT(1); !PAST LABEL
PRINTSTRING('TAPE NOW MOUNTED ON DECK '.DEVICEMT)
NEWLINE
CYCLE CHAP = 1,1,100000
CYCLE PAGE = 1,1,10
BLENGTH=4096
READMT(AHOLD,BLENGTH,FLAG)
IF FLAG # 0 OR BLENGTH # 4096 THEN -> READFAIL
IF HOLD_PAGE = -1 THEN -> ENDREAD
IF HOLD_PAGE # PAGE OR HOLD_CHAP # CHAP C
THEN -> READFAIL
IF PAGE = CHAP = 1 START ; !PRINT HEADING
PRINTSTRING('TEST READ OF TAPE '.VOL.' WRITTEN ON '. C
HOLD_DATE.' AT '.HOLD_TIME.' ON DECK '.HOLD_DEV)
NEWLINES(2)
FINISH
REPEAT
BLENGTH=4096
READMT(AHOLD,BLENGTH,FLAG)
-> TMFAIL UNLESS FLAG = 1; !TAPE MARK EXPECTED
REPEAT
ENDREAD:
NEWLINES(2)
PRINTSTRING ("*****TAPE READ OK")
NEWLINES(2)
PRINTSTRING ("RUN ENDS")
NEWLINES(2)
UNLOADMT
RETURN
TMFAIL:
NEWLINES(2)
PRINTSTRING ("****EXPECTED TAPE MARK NOT FOUND")
-> FAIL
READFAIL:
NEWLINES(2)
PRINTSTRING ("**** READ FAILURE")
-> FAIL
WRITEFAIL:
NEWLINES(2)
PRINTSTRING ("**** WRITE FAILURE")
-> FAIL
FAIL:
NEWLINES(2)
PRINTSTRING ("CHAPTER PAGE LENGTH FLAG")
NEWLINE
WRITE(CHAP,5)
WRITE(PAGE,5)
WRITE(BLENGTH,5)
WRITE(FLAG,5)
NEWLINES(2)
UNLOADMT
END
ENDOFFILE