! DISC UTILITY AND TEST PROGRAM !W.S.C. 16TH AUGUST 1976 !LAST UPDATED 31/8/76 10:40 !THE FOLLOWING TEST STATES CAN BE SELECTED ! 1-READ N BLOCKS AND LIST THEM ! 2-WRITE N BLOCKS WITH A GIVEN PATTERN ! 3-COMPARE N BLOCKS WITH A GIVEN PATTERN ! 4-BLOCK PATCHING FACILITY ! 5-FORMAT STATUS ALTERATION !THE PROGRAM REQUESTS THE TEST NUMBER THEN ASKS FOR !DATA AS REQUIRED.AT THE END OF EACH TEST THE USER CAN SELECT !ANOTHER TEST.TEST 0 TERMINATES THE PROGRAM. CONTROL K'101011' PERMROUTINESPEC SVC(INTEGER EP,P1,P2) BEGIN RECORDFORMAT PF(BYTEINTEGER SERVICE,REPLY,INTEGER A1,C INTEGERARRAYNAME A2,INTEGER A3) RECORD (PF) P CONSTBYTEINTEGERNAME ID=K'160030' CONSTBYTEINTEGERARRAY DKID(0:4)=3,3,8,14,28 INTEGER LOOP,TEST,STBLK,NBLKS,REP,I,UNIT,J,PATT,ERRCT,RECERR SWITCH SW(0:5) INTEGERARRAY DBLK1(0:255) INTEGERARRAY DBLK2(0:255); !FOR FORMAT ROUTINE OCTRD(INTEGERNAME Z) INTEGER Y Z=0 WHILE NEXTSYMBOL=' ' THEN SKIPSYMBOL LOOP:READSYMBOL(Y) Y=Y-'0' IF 0>Y OR Y>7 THEN Y=0 Z=(Z<<3)!Y IF NEXTSYMBOL#NL THEN ->LOOP SKIPSYMBOL END ROUTINE DISCGO(INTEGER BLOCK,DISC,INTEGERARRAYNAME ADD,C INTEGER MODE) RECERR=0 IF MODE&1=0 START ; !READS CYCLE J=0,1,255 ADD(J)=0 REPEAT FINISH P_SERVICE=DKID(DISC) P_REPLY=ID P_A3=BLOCK IF DISC=1 THEN P_A3=P_A3!K'020000'; !RK05 UNIT 1 P_A2==ADD P_A1=MODE PONOFF(P) WHILE P_A1#0 CYCLE ; !ERROR IF P_A1>=10 START RECERR=1; !RECOVERABLE ERROR(BAD SECTOR) EXIT FINISH PRINTSTRING('HANDLER ERROR ') WRITE(P_A1,2) NEWLINE;CYCLE ;REPEAT REPEAT END ROUTINE BLK PROMPT('DISC=') READ(UNIT) PROMPT('START BLOCK(OCTAL)=') OCTRD(STBLK) PROMPT('NUMBER OF BLOCKS(OCTAL)=') OCTRD(NBLKS) PROMPT('LOOP?') WHILE NEXTSYMBOL<'A' OR NEXTSYMBOL>'Z' THEN SKIPSYMBOL READSYMBOL(LOOP);SKIPSYMBOL END ROUTINE CHARP(INTEGER X) IF X<K'40' OR X>K'176' THEN PRINTSYMBOL('*') C ELSE PRINTSYMBOL(X) END ROUTINE OCTWRT(INTEGER X) INTEGER Y CYCLE Y=15,-3,0 PRINTSYMBOL((X>>Y)&7+'0') REPEAT END ROUTINE BYTWRT(INTEGER X,B) INTEGER Y,Z,S,F IF B=0 START Z=X&K'377';S=6;F=0 FINISHELSESTART Z=X&K'177400' S=15;F=9 FINISH CYCLE Y=S,-3,F PRINTSYMBOL((Z>>Y)&7+'0') REPEAT END ROUTINE PRBLK(INTEGERARRAYNAME DBLK,INTEGER N) INTEGER K,J SELECT OUTPUT(1) PRINTSYMBOL(12) NEWLINES(2) PRINTSTRING('UNIT ') WRITE(UNIT,1) PRINTSTRING(' BLOCK ') OCTWRT(STBLK+I) NEWLINES(2) CYCLE K=0,1,(N//8)-1 BYTWRT(K*8,0);PRINTSYMBOL('>') CYCLE J=0,1,7 OCTWRT(DBLK((K*8)+J)) SPACE REPEAT SPACE CYCLE J=0,1,7 CHARP(DBLK((K*8)+J)&K'377') CHARP((DBLK((K*8)+J)&K'177400')>>8) REPEAT NEWLINE REPEAT SELECT OUTPUT(0) END !********************************************************* SVC(13,24,0) PRMPT: PROMPT('TEST NUMBER=') READ(TEST) ->SW(TEST) !************************************************************* SW(0): !END OF PROGRAM REQUEST STOP !************************************************************** SW(1): !READ N BLOCKS AND LIST THEM. BLK PROMPT('LIST?') WHILE NEXTSYMBOL<'A' OR NEXTSYMBOL>'Z' THEN SKIPSYMBOL READSYMBOL(REP) SKIPSYMBOL L1:CYCLE I=0,1,NBLKS-1 DISCGO(STBLK+I,UNIT,DBLK1,0) IF RECERR=0 START IF REP='Y' THEN PRBLK(DBLK1,256) FINISH REPEAT IF LOOP='Y' THEN ->L1 OKOUT: NEWLINE PRINTSTRING('TEST COMPLETED') NEWLINE ->PRMPT !************************************************************* SW(2): !WRITE N BLOCKS WITH PATTERN. BLK PROMPT('OCTAL PATTERN=') OCTRD(PATT) CYCLE I=0,1,255 DBLK1(I)=PATT REPEAT L2:CYCLE I=0,1,NBLKS-1 DISCGO(STBLK+I,UNIT,DBLK1,1) REPEAT IF LOOP='Y' THEN ->L2 ->OKOUT !************************************************************ SW(3): !COMPARE N BLOCKS WITH PATTERN. BLK ERRCT=0 PROMPT('OCTAL PATTERN=') OCTRD(PATT) L3:CYCLE I=0,1,NBLKS-1 DISCGO(STBLK+I,UNIT,DBLK1,0) IF RECERR=0 START CYCLE J=0,1,255 IF DBLK1(J)#PATT START ERRCT=ERRCT+1 PRINTSTRING('COMPARE ERROR ') PRINTSTRING('BLK ') OCTWRT(STBLK+I);SPACE OCTWRT(PATT) PRINTSTRING(' IS ') OCTWRT(DBLK1(J)) PRINTSTRING(' AT ') OCTWRT(J) NEWLINE IF ERRCT=3 START ; !INLY 3 ERRORS PER BLOCK REPORTED ERRCT=0 EXIT FINISH FINISH REPEAT FINISH REPEAT IF LOOP='Y' THEN ->L3 ->OKOUT !************************************************************** SW(4): !PATCH DISC BLOCK. BLK DISCGO(STBLK,UNIT,DBLK1,0) IF RECERR#0 START PRINTSTRING('BAD SECTOR-CANNOT PATCH') NEWLINE ->OKOUT FINISH WDOFF:PROMPT('WORD OFFSET=') OCTRD(NBLKS) IF NBLKS>255 THEN ->CHECK OCTWRT(DBLK1(NBLKS)); !PRINT OLD NEWLINE OCTRD(DBLK1(NBLKS)); !GET NEW ->WDOFF CHECK:PROMPT('NEW BLOCK LIST?') WHILE NEXTSYMBOL<'A' OR NEXTSYMBOL>'Z' THEN SKIPSYMBOL READSYMBOL(REP);SKIPSYMBOL IF REP='Y' THEN PRBLK(DBLK1,256) PROMPT('ARE YOU SURE??') WHILE NEXTSYMBOL<'A' OR NEXTSYMBOL>'Z' THEN SKIPSYMBOL READSYMBOL(REP);SKIPSYMBOL IF REP ='Y' START DISCGO(STBLK,UNIT,DBLK1,1) ->OKOUT FINISH PROMPT('MORE CHANGES?') READSYMBOL(REP);SKIPSYMBOL IF REP='Y' THEN ->WDOFF ELSE ->OKOUT !************************************************************** SW(5): !READ AND ALTER FORMAT STATUS OF BLOCK BLK PRINTSTRING('ENSURE FORMAT ENABLE SWITCH IS ON') NEWLINE PRINTSTRING('ENSURE WRITE PROTECT OVERRIDE SWICH IS ON') NEWLINE DISCGO(STBLK,UNIT,DBLK2,2) OCTWRT(DBLK2(0));SPACE; !ADDR/STAT 1 OCTWRT(DBLK2(1));SPACE; !ADDR/STAT 2 NEWLINE ALT: PROMPT('ALTER STATUS?') WHILE NEXTSYMBOL<'A' OR NEXTSYMBOL>'Z' THEN SKIPSYMBOL READSYMBOL(REP);SKIPSYMBOL IF REP='N' THEN ->OKOUT PROMPT('NEW STATUS(OCTAL)=') OCTRD(PATT) IF PATT&K'1777'#DBLK2(0)&K'1777' START PRINTSTRING('STATUS ERROR!') NEWLINE ->ALT FINISH PROMPT('ARE YOU SURE?') WHILE NEXTSYMBOL<'A' OR NEXTSYMBOL>'Z' THEN SKIPSYMBOL READSYMBOL(REP);SKIPSYMBOL IF REP#'Y' THEN ->ALT CYCLE I=0,1,NBLKS-1 DISCGO(STBLK+I,UNIT,DBLK1,0); !SAVE DATA DISCGO(STBLK+I,UNIT,DBLK2,2); !GET FORMAT STATUS DBLK2(0)=(DBLK2(0)&K'1777')!(PATT&K'1777') DISCGO(STBLK,UNIT,DBLK2,3) IF DBLK2(0)&K'40000'=0 THEN DISCGO(STBLK,UNIT,DBLK1,1); !RESTORE DATA REPEAT ->OKOUT ENDOFPROGRAM