!**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