! THIS VERSION HAS TWO VERSIONS OF CHECKTAPE - PAGE BY PAGE
! AND BULK MOVE, OBTAINED BY 'CHECKTAPE' AND 'FCHECKTAPE'
! RESPECTIVELY. BOTH OF THEM COPE WITH 4/75 TAPES AND 2900 TAPES
! CDM - 20/JUNE/80
!
CONSTSTRING (1) SNL = "
"
CONSTBYTEINTEGERARRAY HEX(0 : 15) = C
'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'
CONSTINTEGER READING = 1
CONSTINTEGER WRITING = 2
CONSTINTEGER IN = 1
CONSTINTEGER OUT = 2
CONSTINTEGER EOT = 4
CONSTINTEGER PAGE SIZE = 4096
!*
EXTERNALROUTINESPEC DEFINE(STRING (63) S)
EXTERNALSTRINGFNSPEC INTERRUPT
SYSTEMROUTINESPEC FILL(INTEGER LENGTH, FROM, PATTERN)
EXTERNALROUTINESPEC PROMPT(STRING (15) S)
EXTERNALROUTINESPEC OPEN TAPE(INTEGER NO, MODE, RLEV, C
STRING (6) TAPE, INTEGERNAME FLAG)
EXTERNALROUTINESPEC CLOSE TAPE(INTEGER NO, INTEGERNAME FLAG)
EXTERNALROUTINESPEC READ PAGE( C
INTEGER NO, CHAP, ADDRESS, INTEGERNAME FLAG)
EXTERNALROUTINESPEC WRITE PAGE( C
INTEGER NO, CHAP, ADDRESS, INTEGERNAME FLAG)
EXTERNALROUTINESPEC WRITE TRAILER(INTEGER NO, INTEGERNAME FLAG)
EXTERNALROUTINESPEC BULK MOVE(INTEGER FROM,TO,PGS,INTEGERNAME FLAG)
!*
!*
RECORDFORMAT FP(STRING (6) USER, BYTEINTEGER PERM)
RECORDFORMAT TFHF(STRING (6) TAPENAME, USERNAME, C
STRING (15) FILENAME, C
STRING (8) DATE, TIME, TYPE, BYTEINTEGER SPARE0, SPARE1, SPARE2, C
INTEGER CHAPTER, E PAGES, FSYS, PERMS, OWNP, EEP, ARCH, C
CODES, SSBYTE, CCT, SPARE3, SPARE4, SPARE5, RECORDS, C
STRING (6) OFFERED TO, RECORDARRAY PERMLIST(1 : 16)(FP))
!*
!*
!*
STRING (15) FN I TO S(INTEGER N)
!**********************************************************************
!* *
!* TURNS AN INTEGER INTO A STRING USES MACHINE CODE *
!* *
!**********************************************************************
STRING (16) S
INTEGER D0, D1, D2, D3
*LSS_N; *CDEC_0
*LD_S; *INCA_1; ! PAST LENGTH BYTE
*CPB_B ; ! SET CC=0
*SUPK_L =15,0,32; ! UNPACK 15 DIGITS SPACE FILL
*STD_D2; ! FINAL DR FOR LENGTH CALCS
*JCC_8,<WASZERO>; ! N=0 CASE
*LSD_TOS ; *ST_D0; ! SIGN DESCRIPTOR STKED BY SUPK
*LD_S; *INCA_1
*MVL_L =15,15,48; ! FORCE IN ISO ZONE CODES
IF N < 0 THEN BYTEINTEGER(D1) = '-' AND D1 = D1-1
BYTEINTEGER(D1) = D3-D1-1
RESULT = STRING(D1)
WASZERO:
RESULT = "0"
END ; !OF STRINGFN I TO S
!*
!*
STRING (8) FN H TO S(INTEGER VALUE, PLACES)
!**********************************************************************
!* *
!* TURNS AN INTEGER INTO A HEXIDECIMAL STRING OF GIVEN LENGTH *
!* USES MACHINE CODE *
!* *
!**********************************************************************
STRING (8) S
INTEGER I
I = 64-4*PLACES
*LD_S; *LSS_PLACES; *ST_(DR )
*INCA_1; *STD_TOS ; *STD_TOS
*LSS_VALUE; *LUH_0; *USH_I
*MPSR_X'24'; ! SET CC=1
*SUPK_L =8
*LD_TOS ; *ANDS_L =8,0,15; ! THROW AWAY ZONE CODES
*LSS_HEX+4; *LUH_X'18000010'
*LD_TOS ; *TTR_L =8
RESULT = S
END ; !OF STRINGFN H TO S
!*
!*
ROUTINE READ LINE(STRINGNAME LINE)
!***********************************************************************
!* *
!* READS A LINE OF TEXT TERMINATED BY A NEWLINE. SKIPPING LEADING *
!* NEWLINES AND SPACES. *
!* *
!***********************************************************************
INTEGER SYM
LINE = ""
SKIP SYMBOL WHILE NEXT SYMBOL = ' ' OR NEXT SYMBOL = NL
READ SYMBOL(SYM)
WHILE SYM # NL CYCLE
LINE = LINE.TO STRING(SYM)
READ SYMBOL(SYM)
REPEAT
END ; !OF ROUTINE READ LINE
!*
!*
!*
!*
EXTERNALROUTINE COPYARCH(STRING (63) S)
!***********************************************************************
!* *
!* EMAS BACKUP/ARCHIVE TAPE COPY PROGRAM. *
!* USED ONLY WHEN A TAPE IS LOST, DESTROYED OR UNREADABLE *
!* THEREFORE USES FULL ERROR RECOVERY PROCEDURES TO COPY THE TAPE. *
!* *
!***********************************************************************
BYTEINTEGERARRAY DATA AREA(0 : PAGE SIZE-1)
RECORDNAME HDR(TFHF)
STRING (6) RTAPE, WTAPE, USER
STRING (15) FILE
INTEGER FLAG, BUFFA, CHAP, PAGE, NOP, RLEV, EFLAG
!ROUTINES
ROUTINE WFAIL
PRINT STRING("WRITE PAGE ".ITOS(PAGE-1))
PRINT STRING(" CHAPTER ".ITOS(CHAP))
PRINT STRING(" FILE:- ".USER.".".FILE." FAILS ".ITOS( C
FLAG).SNL)
EFLAG = 1
END ; !OF ROUTINE WFAIL
!*
!*
ROUTINE RETRY MESS
PRINT STRING("READ PAGE ".ITOS(PAGE-1))
PRINT STRING(" CHAPTER ".ITOS(CHAP))
PRINT STRING(" AFTER ".ITOS(RLEV))
PRINT STRING(" RETRIES!"." FAILS ".ITOS(FLAG).SNL)
END ; !OF ROUTINE RETRY MESS
!*
!*
RLEV = 10; EFLAG = 0; CHAP = 1; BUFFA = ADDR(DATA AREA(0))
HDR == RECORD(BUFFA); !DEFAULTS
RTAPE = ""; WTAPE = ""
UNLESS S -> RTAPE.(",").WTAPE START
PROMPT("READ TAPE:")
READ LINE(RTAPE); !GET INPUT TAPE NAME
FINISH
OPEN TAPE(IN,READING,RLEV,RTAPE,FLAG)
IF FLAG = 0 START
IF WTAPE = "" START
PROMPT("WRITE TAPE:")
READ LINE(WTAPE)
FINISH
OPEN TAPE(OUT,WRITING,RLEV,WTAPE,FLAG)
IF FLAG = 0 START ; !FAILED TO OPEN OUTPUT TAPE
CHAP = 0; FILE = ""; USER = ""
CYCLE ; !CYCLE THROUGH EACH CHAPTER TILLE O T
CHAP = CHAP+1; PAGE = 1; !NEXT CHAPTER FIRST PAGE
READ PAGE(IN,CHAP,BUFFA,FLAG); !READ CHAPTER HEADER
EXIT IF FLAG = EOT; !E O T ?!
IF FLAG # 0 START ; !DID WE SUCCEED
RETRY MESS; !NO THEN TELL THE USER
FILL(PAGE SIZE,BUFFA,X'81'); !SET UP DUMMY CHAPTER
HDR_PERMS = 0
HDR_TAPENAME = WTAPE
HDR_USERNAME = "NONAME"
HDR_FILENAME = "DUMMYEMPTY"
HDR_CHAPTER = CHAP
HDR_FSYS = -1
HDR_E PAGES = 1
WRITE PAGE(OUT,CHAP,BUFFA,FLAG)
!WRITE OUT THE DUMMMY HEADER
WFAIL AND EXIT IF FLAG # 0
FILL(PAGE SIZE,BUFFA,X'81')
PAGE = PAGE+1; !SET UP DUMMY PAGE IN CHAPTER
WRITE PAGE(OUT,CHAP,BUFFA,FLAG)
!WRITE OUT THE DUMMY PAGE
WFAIL AND EXIT IF FLAG # 0
PRINT STRING( C
"DUMMY CHAPTER WRITTEN TO REPLACE CHAPTER ". C
ITOS(CHAP).SNL)
FINISH ELSE START
NOP = HDR_E PAGES; !GET NUMBER OF PAGES
USER = HDR_USERNAME
FILE = HDR_FILENAME; !GET FILE NAME
HDR_TAPENAME = WTAPE; !INSERT NEW TAPE NAME
IF CHAP = HDR_CHAPTER START
WRITE PAGE(OUT,CHAP,BUFFA,FLAG)
!WRITE THE HEADER
WFAIL AND EXIT IF FLAG # 0
CYCLE PAGE = 2,1,NOP+1
!CYCLE THROUGH PAGES IN THE CHAPTER
READ PAGE(IN,CHAP,BUFFA,FLAG)
!READ PAGE IN CHAPTER
IF FLAG # 0 START ; !WAS IT OK?
RETRY MESS; !NO THEN TELL THE USER
PRINT STRING("PAGE ".ITOS(PAGE-1))
PRINT STRING(" IN CHAPTER ".ITOS(CHAP))
PRINT STRING(" FILE:- ".USER.".".FILE)
PRINT STRING( C
" WRITTEN WITH ERRORS!!!!".SNL)
FINISH
WRITE PAGE(OUT,CHAP,BUFFA,FLAG)
!WRITE PAGE IN CHAPTER
WFAIL AND EXIT IF FLAG # 0
REPEAT
FINISH ELSE START
PRINT STRING( C
"CHAPTER IN HEADER NOT AS EXPECTED".SNL)
PRINT STRING("ACTUAL ".I TO S(HDR_CHAPTER). C
" EXPECTED ".I TO S(CHAP).SNL)
CHAP = HDR_CHAPTER
FINISH
FINISH
EXIT IF EFLAG # 0 OR INTERRUPT = "STOP"
!STOP GRACIOUSLY IF USERS ASKS FOR IT
REPEAT
WRITE TRAILER(OUT,FLAG)
PRINT STRING("WRITE TRAILER FAILS ".I TO S(FLAG).SNL) C
IF FLAG # 0
CLOSE TAPE(OUT,FLAG)
FINISH
CLOSE TAPE(IN,FLAG)
FINISH
PRINT STRING(ITOS(CHAP-1)." CHAPTERS COPIED".SNL)
END ; !OF EXTERNALROUTINE COPYARCH
!*
!*
!*
!*
ROUTINE CHECKTAPE1(STRING (63) S,INTEGER BM)
!**********************************************************************
!* *
!* STANDARD EMAS BACKUP OR ARCHIVE TAPE CHECK PROGRAM. *
!* IF S = "TAPE" THE FILES ARE READ AND EACH HEADER IS VALIDATED. *
!* IF S = "TAPE,LIST" A LIST OF ALL THE FILES ON TAPE IS OUTPUT TO *
!* THE FILE "LIST". *
!* *
!**********************************************************************
BYTEINTEGERARRAY DATA AREA(0 : PAGE SIZE-1)
RECORDNAME HDR(TFHF)
STRING (6) TAPE, USER,S1,S2
STRING (15) FILE, LIST
INTEGER FLAG, BUFFA, CHAP, PAGE, NOP
!ROUTINES
ROUTINE READ FAIL
PRINT STRING("READ PAGE ".ITOS(PAGE-1))
PRINT STRING(" CHAPTER ".ITOS(CHAP))
PRINT STRING(" FILE ".USER.".".FILE)
PRINT STRING(" FAILS ".ITOS(FLAG).SNL)
END ; !OF ROUTINE READ FAIL
!*
!*
LIST = ""; !DEFAULTS
TAPE = S UNLESS S -> TAPE.(",").LIST
IF TAPE = "" START
PROMPT("TAPE:")
READ LINE(TAPE)
FINISH
IF LIST # "" START
DEFINE("1,".LIST.",1024")
SELECT OUTPUT(1)
NEWPAGE
SPACES(15)
PRINT STRING("CHECK LIST OF ".TAPE.SNL)
NEWLINES(4)
PRINT STRING( C
"CHAPTER USERNAME FILENAME E PAGES DATE AND TIME WRITTEN". C
" TYPE FSYS OWNP EEP ARCH CODE SSBYTE CCT OFF TO INDIV PERMS". C
SNL.SNL)
SELECT OUTPUT(0)
FINISH
CHAP = 1
OPEN TAPE(IN,READING,0,TAPE,FLAG)
IF FLAG = 0 START ; ! FAILED TO OPEN INPUT TAPE
CHAP = 0; FILE = ""; USER = ""
BUFFA = ADDR(DATA AREA(0))
HDR == RECORD(BUFFA)
IF (TAPE->S1.("EST").S2 OR TAPE->S1.("NRS").S2) AND S1="" START
! SECURE TAPE
CHAP=1; ! TO SKIP SYSTEM DUMP AT CHAP 1
IF LIST#"" START
SELECTOUTPUT(1)
PRINTSTRING("SYSTEM DUMP ASSUMED AT CHAPTER 1")
NEWLINE
SELECTOUTPUT(0)
FINISH
FINISH
CYCLE ; !CYCLE THROUGH EACH CHAPTER TILLE O T
CHAP = CHAP+1; PAGE = 1; !NEXT CHAPTER FIRST PAGE
READ PAGE(IN,CHAP,BUFFA,FLAG); !READ CHAPTER HEADER IF SKIP OK
EXIT IF FLAG = EOT; !E O T ?!
IF FLAG # 0 START ; !DID WE SUCCEED
READ FAIL; !NO THEN TELL THE USER
EXIT
FINISH ELSE START
IF TAPE = HDR_TAPENAME START
IF LENGTH(HDR_USERNAME) = 6 START
IF 1 <= LENGTH(HDR_FILENAME) <= 11 START
IF 1 <= HDR_E PAGES <= 4096 START
IF CHAP = HDR_CHAPTER START
NOP = HDR_E PAGES;!GET NUMBER OF PAGES
FILE = HDR_FILENAME
!GET FILE NAME
USER = HDR_USERNAME
IF LIST # "" START
SELECT OUTPUT(1)
WRITE(CHAP,4)
SPACES(6)
PRINT STRING(USER." ")
PRINT STRING(FILE)
SPACES(12-LENGTH(FILE))
WRITE(NOP,5)
PRINT STRING(" ".HDR_DATE. C
" ".HDR_TIME." ".HDR_TYPE. C
" ".ITOS(HDR_FSYS))
IF HDR_PERMS#0 START
PRINT STRING(" ".H TO S(HDR_OWNP,2 C
)." ".H TO S(HDR_EEP,2). C
" ".H TO S(HDR_ARCH,2). C
" ".H TO S(HDR_CODES,2). C
" ".H TO S(HDR_SSBYTE,2). C
" ".H TO S(HDR_CCT,2))
IF HDR_OFFERED TO = "" THEN C
PRINT STRING(" ") C
ELSE PRINT STRING(" ".HDR_ C
OFFERED TO." ")
IF HDR_RECORDS > 0 START
CYCLE FLAG = 1,1,HDR_RECORDS
SPACES(123) IF FLAG > 1
PRINT STRING(HDR_PERMLIST C
(FLAG)_USER." ".H TO S C
(HDR_PERMLIST(FLAG)_ C
PERM,2))
REPEAT
FINISH
FINISH
NEWLINE
SELECT OUTPUT(0)
FINISH
IF BM=0 START
CYCLE PAGE = 2,1,NOP+1
!CYCLE THROUGH PAGES IN THE CHAPTER
READ PAGE(IN,CHAP,BUFFA,FLAG)
!READ PAGE IN CHAPTER
IF FLAG # 0 START ;!WAS IT OK?
READ FAIL; !NO THEN TELL THE USER
EXIT
FINISH
REPEAT
EXIT IF FLAG # 0
FINISHELSESTART ; ! BULK MOVE#0
BULK MOVE(IN,-1,NOP+1,FLAG)
! PAGES TO SINK. DRIVE INTO TM
UNLESS FLAG=X'01040000'!(NOP+1) START
PRINT STRING("BULK MOVE FAILS X". C
H TO S(FLAG,8)." AT CHAPTER ")
WRITE(CHAP,0)
NEWLINE
FINISH
FINISH
FINISH ELSE START
PRINT STRING( C
"CHAPTER IN HEADER NOT AS EXPECTED" C
.SNL)
PRINT STRING("ACTUAL ".I TO S(HDR_ C
CHAPTER)." EXPECTED ".I TO S( C
CHAP).SNL)
FINISH
FINISH ELSE START
PRINT STRING( C
"PAGES IN HEADER NOT AS EXPECTED". C
SNL)
PRINT STRING("PAGES = ".I TO S(HDR_ C
E PAGES).SNL)
FINISH
FINISH ELSE START
PRINT STRING( C
"FILENAME IN HEADER NOT AS EXPECTED". C
SNL)
PRINT STRING("FILENAME = ".HDR_FILENAME. C
SNL)
FINISH
FINISH ELSE START
PRINTSTRING( C
"USERNAME IN HEADER NOT AS EXPECTED".SNL)
PRINT STRING("USERNAME = ".HDR_USERNAME.SNL)
FINISH
FINISH ELSE START
PRINT STRING( C
"TAPENAME IN HEADER NOT AS EXPECTED".SNL)
PRINT STRING("ACTUAL ".HDR_TAPENAME. C
" EXPECTED ".TAPE.SNL)
FINISH
FINISH
EXIT IF INTERRUPT = "STOP"; !STOP GRACIOUSLY IF USERS ASKS FOR IT
REPEAT
CLOSE TAPE(IN,FLAG)
FINISH
PRINT STRING(ITOS(CHAP-1)." CHAPTERS CHECKED".SNL)
END ; !OF ROUTINE CHECKTAPE1
!*
!*
EXTERNALROUTINE CHECKTAPE(STRING (63) S)
CHECKTAPE1(S,0); ! PAGE BY PAGE
END ; ! EXTERANLROUTINE CHECKTAPE
!*
!*
EXTERNALROUTINE FCHECKTAPE(STRING (63) S)
CHECKTAPE1(S,1); ! BULK MOVE
END ; ! EXTERNALROUTINE FCHECKTAPE
!*
ENDOFFILE