Google
 

Trailing-Edge - PDP-10 Archives - dec-10-omona-u-mc9 - redall.mac
There are 8 other files named redall.mac in the archive. Click here to see a list.
TITLE REDALL - READ ALL BLOCKS OF ALL DSK UNITS IN SYSTEM
SUBTTL T. HASTINGS  06 OCT 71  V006
	VRDALL==6
	VWHO==0
	VMINOR==0
	VEDIT==1
	LOC 137
.JBVER:	BYTE	(3)VWHO(9)VRDALL(6)VMINOR(18)VEDIT


IFNDEF FTRAN,<FTRAN==0>	;ASSUME SEQUENTIAL RATHER THAN RANDOM

IFN FTRAN,<EXTERN RAN,IFIX>	;USE FORTAN LIB RANDOM NOS.

IFNDEF NBLKS,<NBLKS==^D40>	;NO. OF BLOCKS PER GULP

IFNDEF FTSINGLE,<FTSINGLE==0>	;ASSUME NOT SINGLE BLOCK MODE

IFN FTSINGLE,<NBLKS==^D1>	;SINGLE BLOCK AT A TIME FOR USE
				; RUNNING SCRIPT WITH ONE JOB PER UNIT

REPEAT 0,<

INSTRUCTIONS:

TYPE:
LOGIN
1,2

RUN DEV:REDALL

REDALL WILL READ ALL DISK UNITS IN SYSTEM(FHA,DPA,DPB,DPC, ETC)
WHETHER THEY ARE IN A FILE STRUCTURE OR NOT USING SUPER USETI
EXCEPT DOWN AND OFF-LINE ONES.
THE 503 MONITOR IS NEEDED INORDER FOR THE BAT BLOCKS TO BE UPDATED.
REDALL RINGS A BELL EACH TIME IT FINDS AN ERROR.
THEN IT PRINTS CYLINDER,SURFACE AND SECTOR IN DECIMAL
FOLLOWED BY CONI BITS 12 THRU 29, THEN THE UNIT NAME.
IF REDALL GET AN UNEXPECTED ERROR RETURN FROM ANY UUO, IT
PRINTS "ABNORMAL ERROR RETURN" AND EXITS TO MONITOR.
IF REDALL READS ALL UNITS (WITH OR WITHOUT ERRORS) IT PRINTS
"ALL DISK UNITS READ" AND EXITS TO THE MONITOR.
REDALL TAKES ABOUT 2 MINUTES FOR EACH RP02 UNIT.
REDALL CAM BE RUN DURING TIME SHARING WITHOUT SLOWING DOWN SYSTEM
APPRECIABLY.

READ ALGORITHM:

  A. SEQUENTIAL (FTRAN=0)
	READ 40 (DEC.) BLOCK GULPS AT A TIME IN DUMP MODE
	IF ERROR, READS EACH BLOCK IN BULP ONE BLOCK AT A TIME
	UNTIL IT FINDS THE ERROR OR EXHAUSTS GULP.  IT PRINTS
	EACH BLOCK IT FINDS BAD ON RE-READ.  IF IT DOES NOT FIND
	ANY BLOCKS BAD IN GULP ON RE-READ, IT PRINTS FIRST BLOCK
	OF GULP AND FLAGS IT WITH AN *.  UPON FINDING FIRST
	GOOD BLOCK AFTER ONE OR MORE BAD BLOCKS IT RETURNS
	TO MAIN LOOP AND READS A 40 BLOCK GULP STARTING WITH THE
	BLOCK FOLLOWING THE FIRST GOOD BLOCK.
	ALL BLOCKS OF A UNIT BEFORE STEPPING ONTO THE NEXT ONE.

  B. RANDOM (FTRAN=1)
	RANDOM IS JUST LIE SEQUENTIAL, EXCEPT THAT ONLY ONE GULP
	IS READ AT RANDOM ON A UNIT BEFORE STEPPING ONTO NEXT UNIT.
>

MLON	;MULTI LINE LITERALS

;ACS
T=1	;TEMP
T1=T+1
D=3	;DISK UNIT NAME
B=4	;BLOCK NO. ON UNIT
F=5	;FLAGS
  MISBLK==100000	;MISSED FINDING EXACT BLOCK WITH ERROR IN GULP
  OUTLIN==40000	;DEVICE SHOULD BE OUTPUT A LINE AT A TIME(TTY,LPT)
  FIRMIS==20000	;0 FOR FIRST MISSED RE-READ, 1 AFTERWARDS.
		; USED TO EXPLAIN THE * FLAG.
P=6	;PD LIST
  PDLEN==20	;PD LENGTH
CH=7	;CHAR AC
E=10	;ERROR COUNT WITHIN GULP
NN=11	;CONTAINS JOB NO. IF RUNNING UNDER SCRIPT, ELSO 0

C==1	;IO CHANNEL FOR SUPER USETI
TC==2	;OUTPUT CHANNEL FOR ERROR MESSAGES ON DEVICE "TTY"

;DSKSHR PARAMETERS
.STNAM==4	;CONTAINS FILE STRUCTURE NAME
.UNCHR==5	;BLOCKS PER CYL, TRACK
.UNBPU==6	;CONTAINS NO. OF BLOCKS PER UNIT
.DSLEN==10	;LENGTH OF DSKCHR ARGS

;PARAMTERS
BLKSIZ==^D128	;NO. WORDS PER BLOCK

;DEFINE SOME SYMBLOS WITH VALUES SUGGESTED BY NAME
; NEEDED SO CAN ASSEMBLE SOURCE UNDER SCRIPT OR NOT

IFN FTSINGLE,<
N00==0
N01==1
N02==2
N03==3
N04==4
N05==5
N06==6
N07==7
N10==10
N11==11
N12==12
N13==13
N14==14
N15==15		;SCRIPT ONLY HAS 14. DECIMAL JOBS
>

OPDEF PJRST [JRST]		;EQUIVALENT TO PUSHJ P, FOLLOWED BY POPJ P,
BEG:	RESET
	MOVE	P,[IOWD PDLEN-1,PDLIST]	;SETUP PD POINTER
	SETZB	F,ERRUNI	;CLEAR UNIT NAME OF LAST ERROR
	INIT	TC,0		;INIT OUTPUT DEVICE FOR ERROR MESSAGES
	SIXBIT	/TTY/		;
	XWD	OBUF,0
	  JSP	T1,ERRRET	;ERROR
	MOVSI	T,(SIXBIT /TTY/)	;DEVICE NAME
	DEVCHR	T,		;DEVICE CHARACTERISTICS
	TLNN	T,40010		;TTY OR LPT?
	TLZA	F,OUTLIN	;NO, CLEAR OUTPUT LINE AT A TIME FLAG
	TLO	F,OUTLIN	;YES, SET LINE OUTPUT AT A TIME FLAG
	ENTER	TC,FILNAM	;ENTER FILE NAME IN CASE ASSIGN TTY
	  JSP	T1,ERRRET	;ERROR
IFN FTSINGLE,<
	MOVEI	NN,N#		;SCRIPT JB NUMBER OR VARIABLE
	CAILE	NN,100		;IS IT A VARIABLE?
	MOVEI	NN,0		;YES, NOT ASSEM. THRU SCRIPT
	JUMPN	NN,BEG1		;ONLY FIRST SCRIPT JOB PRINTS HEADING
>
	MOVEI	T,[ASCIZ /
?CYL.	SURF.	SECT.	CONI	UNIT
?(DEC.)	(DEC.)	(DEC.)	(12-29)
/]
	PUSHJ	P,MSG		;PRINT HEADING
	PUSHJ	P,PCRLF		;PRINT CRLF AND OUTPUT
BEG1:	MOVEI	D,0		;START AT BEGINNING OF DISKS
LOOP0:
IFN FTSINGLE,<
	MOVEI	NN,N#		;SCRIPT JOB NUMBER OR VARIABLE
	CAILE	NN,100		;IS IT A VARIABLE?
	MOVEI	NN,0		;YES, SET SO STEP THRU ALL UNITS
LOOP0A:
>
	SYSPHY	D,		;GET NEXT PHYSICAL UNIT IN SYSTEM
	  JSP	T1,ERRRET		;ERROR, UUO NO IMPLEMENTED
	JUMPE	D,FINISH	;0 MEANS DON ALL UNITS
IFN FTSINGLE,<
	SOJGE	NN,LOOP0A	;IS THIS THE UNIT FOR THIS JOB?
>
	MOVEM	D,DSKTAB	;STORE NAME FOR DSKCHR
	MOVEM	D,DSKNM		;STORE NAME FOR INIT
	MOVE	T,[XWD .DSLEN,DSKTAB]	;GET UNIT CHAR.
	DSKCHR	T,
	  JSP	T1,ERRRET		;ERROR
	TLNN	T,200000	;IS UNIT OFF-LINE?
	TLNE	T,3000		;OR DOWN, NO PACK MOUNTED, OR BEING MOUNTED?
	JRST	LOOP0		;YES, GO TRY NEXT UNIT
IFE FTRAN,<
	MOVEI	B,0		;START AT BLOCK 0 OF UNIT
	MOVEI	T,[ASCIZ /
?BEGIN READING ALL OF UNIT /]
	PUSHJ	P,MSG		;TELL WHICH UNIT READING NOW
	PUSHJ	P,PNTPHY	;UNIT NAME
	PUSHJ	P,PCRLF		;CRLF
>
IFN FTRAN,<
	JSA	16,RAN		;GET RANDOM NO. IN AC 0
	JUMP	0
	MOVE	T,DSKTAB+.UNBPU	;NO. OF BLOCKS PER UNIT
	SUBI	T,NBLKS		;REDUCE SO AS NOT TO RUN OFF END
	FSC	T,233		;CONVERT TO FLOATING POINT
	FMP	T		;GET FLOATING INTEGER 0 THRU BPU-NBLKS
	JSA	16,IFIX		;CONVERT TO INTEGER
	JUMP	0
	MOVE	B,0		;SETUP RANDOM BLOCK NO.
>
LOOPE:	OPEN	C,OPENDT	;INIT IN DUMP MODE
	  JSP	T1,ERRRET		;ERROR
LOOP1:	MOVEI	T,NBLKS		;NO. OF BLOCKS TO READ IN ONE GULP
	PUSHJ	P,READ		;READ ONE GULP
	  JRST	LOOP0		;READ PAST END OF UNIT, GO TO NEXT ONE
	  JRST	ERROR		;ERROR, GO FIND EXTEND OF BADNESS
IFE FTRAN,<
	JRST	LOOP1		;OK, KEEP READING SEQUENCIALLY
>
IFN FTRAN,<
	JRST	LOOP0		;KO, GO TO NEXT UNIT
>

;HERE ON AN ERROR READING AN ENTIRE GULP
ERROR:	MOVEI	T,C		;DISK CHANNEL NO.
	DEVSTS	T,		;GET GULP ERROR STATUS IN CASE RE-READ
	  JSP	T1,ERRRET	;ERROR
	MOVEM	T,GULPER	;DOES NOT FIND ERROR
	RELEAS	C,		;RELEASE SO MONITOR WILL UPDATE BAT BLOCK
				; IF IT AS A 5.03 MONITOR
	OPEN	C,OPENDT	;SELECT SAME UNIT AGAIN
	  JSP	T1,ERRRET	;ERROR
	SUBI	B,NBLKS		;BACKUP TO FIRST BLOCK OF GULP WITH ERROR
	MOVEI	E,NBLKS		;NO. OF TIMES TO READ IN GULP
				; IN CASE CANNOT FIND BAD BLOCK
ERROR0:	MOVEI	T,1		;READ IN GULPS OF ONLY ONE BLOCK
	PUSHJ	P,READZ		;READ ONE BLOCK, CLEAR ERROR FLAGS
	  JRST	LOOP0		;READ PAST END OF UNIT, GO TO NEXT ONE
	  JRST ERROR1		;FOUND FIRST ERROR IN BIG GULP
	SOJG	E,ERROR0	;OK, KEEP LOOKING FOR FIRST ERROR IN BIG GULP
	TLO	F,MISBLK	;FLAG THAT ERROR BLOCK WAS NOT FOUND
	SUBI	B,NBLKS-1	;PNTERR WILL SUBTRACT 1 BEFORE PRINTING
				; BUT LEAVE B ONE PAST FIRST BLOCK IN
				; THIS GULP, SO NOT KEEP TRYING THIS ONE.
	PUSHJ	P,PNTERR	;PRINT ERROR FOR FIRST BLOCK IN GULP
	JRST	LOOP1		;READ ANOTHER GULP 1 BLOCK FURTHER
				; THAN THIS GULP STARTED, SO OVERLAP
				; ALL BUT FIRST BLOCK OF GULP.

;HERE ON ONE BLOCK ERROR RE-READING GULP ONE BLOCK AT A TIME
ERROR1:	PUSHJ	P,PNTERR	;PRINT ERROR FOR THIS BLOCK
	SOJL	E,ERROR2	;LOOKED AT ALL BLOCKS IN GULP YET?
	RELEAS	C,		;NO, RELEASE SO MONITOR WILL UPDATE BAT BLOCK
				; IF IT AS A 5.03 MONITOR
	OPEN	C,OPENDT	;SELECT SAME UNIT AGAIN
	  JSP	T1,ERRRET	;ERROR
	MOVEI	T,1		;KEEP READING BAD REGION ONE BLOCK AT A TIME
	PUSHJ	P,READZ		;READ ONE BLOCK,CLEAR ERROR FLAGS
	  JRST 	ERROR2		;READ PAST END OF UNIT, RELEASE
	  JRST	ERROR1		;ANOTHER BAD BLOCK IN THIS BAD REGION
ERROR2:	RELEAS	C,		;END OF BAD REGION, RELEASE SO
				; MONITOR WILL UPDATE BAT BLOCKS(503 MONITOR)
IFE FTRAN,<
	JRST	LOOPE		;GO READ SOME MORE ON THIS UNIT
>
IFN FTRAN,<
	JRST	LOOP0		;GO TO NEXT UNIT
>
;HERE IF UUO ERROR RETURN
ERRRET:	TTCALL	3,[ASCIZ /?ABNORMAL ERROR RETURN/]
	EXIT

;HERE WHEN READ ALL UNITS
FINISH:
IFE FTRAN,<
	TTCALL	3,[ASCIZ /ALL DISK UNITS READ/]
	EXIT
>
IFN FTRAN,<
	JRST	BEG1		;START ON FIRST UNIT AGAIN
>
;SUBOUTINE TO READ T BLOCKS STARTING AT B
;CHECK FOR ERRORS AND FOR RUNNING OFF END
;INCREMENT B BY T AFTERWARDS
;CALL:	MOVE	B,FIRST BLOCK TO READ
;	MOVEI	T,NO.OF BLOCKS TO READ IN ONE GULP
;	PUSHJ	P,READ
;	  B WAS ALREADY PAST END OF UNIT
;	  ERROR READING GULP
;	OK READING GULP

READZ:	SETSTS	C,17		;CLEAR ERROR FLAGS
READ:	CAML	B,DSKTAB+.UNBPU	;ALREADY PAST END OF UNIT?
	POPJ	P,		;YES, GIVE FIRST ERROR RETURN
	AOS	(P)		;NO, SET FOR NEXT TWO RETURNS
	USETI	C,B		;POSITION TO BLOCK B
	STATZ	C,760000	;ANY ERRORS?
	  JSP	T1,ERRRET	;YES, PRINT MESSAGE AND EXIT
	MOVE	T1,DSKTAB+.UNBPU	;BLOCKS PER UNIT
	SUB	T1,B		;DISTANCE TO END OF UNIT
	ADD	B,T		;INCREMENT B BY NO. OF BLOCK TO READ
	CAMLE	B,DSKTAB+.UNBPU	;READ PAST END OF UNIT?
	MOVE	T,T1		;YES, JUST READ UP TO END
	IMULI	T,BLKSIZ	;NUM OF WORDS
	MOVNS	T		;MINUS
	HRLM	T,IOLIST	;SET - NO. OF WORDS TO READ IN IOLIST
	IN	C,IOLIST	;READ GULP
CPOPJ1:	  AOS	(P)		;OK RETURN
CPOPJ:	POPJ	P,		;ERROR RETURN
;SUBROUTINE TO PRINT ERROR BLOCK INFORMATION
;CALL:	MOVE	B,BLOCK+1 WITH ERROR IN IT
;	PUSHJ	P,PNTERR

PNTERR:	MOVEI	CH,7		;PRINT BELL TO DISTINGUISH FROM OTHER MESS.
				; IN CASE PERSON  IS NOT NEARBY
	PUSHJ	P,PNT
	TLNN	F,MISBLK	;WAS ACTUAL ERROR BLOCK NOT FOUND?
	JRST	PNT1		;NO, IT WAS FOUND
	TLOE	F,FIRMIS	;IS THIS THE FIRST MISS?
	JRST	PNT1		;NO, ALREADY EXPLAINED *
	MOVEI	T,[ASCIZ /?BLOCKS MARKED WITH * FAILED IN A /]	;YES
	PUSHJ	P,MSG		;PRINT
	MOVEI	T,NBLKS		;NO. OF BLOCKS IN GULP
	PUSHJ	P,PNTDEC	;PRINT DECIMAL
	MOVEI	T,[ASCIZ / BLOCK READ
?BUT NOT ON BLOCK BY BLOCK RE-READ
/]
	PUSHJ	P,MSG
PNT1:	MOVEI	CH,"?"		;PRINT LEADING ? IN CASE RUNNING UNDER SCRIPT
	PUSHJ	P,PNT
	MOVE	T,B		;ERROR BLOCK+1
	SUBI	T,1		;ERROR BLOCK
	HRRZ	T1,DSKTAB+.UNCHR	;NO. OF BLOCKS PER CYLINDER
	IDIVI	T,(T1)		;T=CYLINDER, T1=REMAINDER
	PUSHJ	P,PNTDEC
	PUSHJ	P,PNTTAB	;PRINT TAB
	MOVE	T,T1		;REMAINDER
	LDB	T1,[POINT 9,DSKTAB+.UNCHR,17]	;BLOCKS PER TRACK
	IDIVI	T,(T1)		;T=SURFACE NO., T1=SECTOR
	PUSHJ	P,PNTDEC	;PRINT SURFACE
	PUSHJ	P,PNTTAB	;PRINT TAB
	MOVE	T,T1		;SECTOR
	PUSHJ	P,PNTDEC
	PUSHJ	P,PNTTAB	;PRINT TAB
	MOVEI	T,C		;CHANNEL NO. FOR DISK UNIT
	DEVSTS	T,		;GET LAST CONI STATUS
	  JSP	T1,ERRRET	;ERROR
	TLNE	F,MISBLK	;DID RE-READ FAIL TO FIND ERROR?
	MOVE	T,GULPER	;YES, USE ORIGINAL GULP ERROR CONI
	LSH	T,-6		;PRINT BITS 12 THRU 29
	PUSHJ	P,PNTOCT	;PRINT IT IN OCTAL
	MOVEI	CH,"*"		;GET SET TO FLAG MISSED RE-READ
	TLZE	F,MISBLK	;IS TIS A MISSED ERROR ON RE-READ OF GULP?
	PUSHJ	P,PNT		;YES, APPEND * AFTER CONI WORD.
IFN FTRAN,<
	MOVE	T,DSKNM		;DISK UNIT NAME
	CAMN	T,ERRUNI	;SAME AS LAST ERROR?
	JRST	NOTUNI		;YES, DO NOT PRINT UNIT AGAIN
>
IFN FTSINGLE+FTRAN,<
	PUSHJ	P,PNTTAB	;PRINT TAB
	PUSHJ	P,PNTPHY	;PRINT UNIT NAME
>
IFN FTRAN,<
NOTUNI:	MOVE	T,DSKNM		;REMENBER THIS UNIT NAME
	MOVEM	T,ERRUNI	;FOR NEXT TIME
>
	PJRST	PCRLF		;PRINT CRLF AND RETURN
;OCTAL PRINT
;CALL:	MOVE	T,#
;	PUSHJ	P,PNTOCT

PNTOCT:	MOVE	T1,[POINT 3,T,17]
OCT1:	ILDB	CH,T1
	ADDI	CH,"0"		;CONVERT TO ASCIZ
	PUSHJ	P,PNT		;PRINT
	CAME	T1,[POINT 3,T,35]	;FINISHED OCTAL
	JRST	OCT1		;NO, KEEP PRINTING
	POPJ	P,

;DECIMAL PRINT
;CALL:	MOVE	T,#
;	PUSHJ	P,PNTDEC
;	T1 RESPECTED

PNTDEC:	PUSH	P,T1
	PUSHJ	P,DIGPNT
	POP	P,T1
	POPJ	P,

DIGPNT:	IDIVI	T,^D10
	HRLM	T1,(P)
	JUMPE	T,.+2
	PUSHJ	P,DIGPNT
	HLRZ	CH,(P)
	ADDI	CH,"0"
PNT:	SOSG	OBUF+2
	OUTPUT	TC,
	IDPB	CH,OBUF+1
	POPJ	P,
;ROUTINE TO PRINT A STRING
;CALL:	MOVEI	T,ADR OF STRING
;	PUSHJ	P,MSG

MSG:	HRLI	T,440700		;SETUP BYTE POINTER
MSG1:	ILDB	CH,T		;GET NEXT CHAR
	JUMPE	CH,CPOPJ	;RETURN ON NULL
	PUSHJ	P,PNT		;PRINT CHAR
	JRST MSG1		;LOOP BACK FOR MORE

;SUBROUTINE TO PRINT PHYSICAL UNIT NAME

PNTPHY:	MOVE	T,[POINT 6,DSKNM]	;BYTE POINTER
PNTUNI:	ILDB	CH,T		;GET NEXT CHAR
	JUMPE	CH,CPOPJ	;FINISHED WHEN GET NULL
	ADDI	CH,40		;CONVERT SIXBIT TO ASCIZ
	PUSHJ	P,PNT		;PRINT
	JRST	PNTUNI		;LOOP

;ROUTINE TO PRINT TAB

PNTTAB:	MOVEI	CH,11		;ASCIZ TAB
	JRST	PNT

;ROUTIN TO PRINT CRLF

PCRLF:	MOVEI	CH,15		;CR
	PUSHJ	P,PNT
	MOVEI	CH,12		;LF
	PUSHJ	P,PNT		;PRINT CHAR
	TLNE	F,OUTLIN	;TTY OR LPT LINE AT A TIME OUTPUT?
	OUTPUT	TC,		;YES
	POPJ	P,
;DATA AREA

ERRUNI:	0		;UNIT NAME OF LAST ERROR
FILNAM:	SIXBIT	/REDALL/	;FILE NAME FOR DEVICE TTY
	SIXBIT	/LST/		;EXTENSION
	0
	0
;OPEN UUO ARGS:
OPENDT:	XWD	0,17		;DUMP MODE
DSKNM:	0			;DEVICE NAME
	0			;BUFFER HEADERS
OBUF:	BLOCK	3		;OUTPUT BUFFER
GULPER:	0			;CONI ON GULP ERROR
				; USED IN CASE RE-READ FINDS NO ERRORS
PDLIST:	BLOCK	PDLEN		;PD LIST
IOLIST:	IOWD	NBLKS*BLKSIZ,BUFFER	;IO LIST FOR IN UUO
	0			;END OF LIST
DSKTAB:	BLOCK	.DSLEN		;DSKCHR ARGS AND VALUES
BUFFER:	BLOCK	NBLKS*BLKSIZ	;READ IN HERE

	END	BEG