NBLKS=24. ; ; MACRO PROGRAM TO CHECK THE READABILITY OF AN RP03 ; DISK PACK WHILE COPYING IT TO ANOTHER PACK. UN-READABLE ; BLOCKS ON THE INPUT PACK ARE NOT TRANSFERED TO ; THE OUTPUT PACK. THIS ALLOWS YOU TO RECOVER MOST OF ; THE DATA OFF OF A PACK WITH A CORRUPTED BIT MAP FILE. ; (DEC SOFTWARE WILL REFUSE TO READ THE PACK AT ALL, EVEN ; IF THE PROBLEM WAS CAUSED BY ONE BIT IN ONE BLOCK OF THE ; BIT MAP FILE). ; ; DP0: IS COPIED TO DP1 IN THIS PROGRAM ; ; ERROR MESSAGES ARE PRINTED IN THE FORMAT: ; ERROR H LLLLLL EEE ; WHERE: ; EEE = ERROR STATUS RETURN ; H = HIGH WORD OF BLOCK NUMBER ; LLLLLL = LOW WORD OF BLOCK NUMBER ; .MCALL ALUN$C,UCBDF$,QIOW$S,QIOW$C,EXIT$S UCBDF$ CHECK: ALUN$C 1,DP,0 ;1 IS THE DP DISK ALUN$C 2,TI,0 ;2 IS THE ERROR OUTPUT DEVICE ALUN$C 3,DP,1 ;3 IS THE OUTPUT DP DISK QIOW$C IO.ATT,1 ;ATTACH THE DISK BCS QUIT QIOW$C IO.ATT,3 ;ATTACH THE OUTPUT DISK BCS QUIT ;CAN"T ATTACH IT ; ; LOOP FOR EVERY BLOCK ON THE DISK ; LUP: QIOW$S #IO.RLB,#1,#1,,#ERR,,<#BUF,#512.*NBLKS,,HI,LO> TSTB ERR BMI ERROR ;EVERYTHING HUNKY-DORY? QIOW$S #IO.WLB,#3,#1,,#ERR,,<#BUF,#512.*NBLKS,,HI,LO> TSTB ERR BMI ERROR ;PRINT IT ; ; INCRIMENT TO NEXT BLOCK ; NEXT: ADD #NBLKS,LO ;INCRIMENT LOW ORDER WORD ADC HI ;IT'S A DP ADD BR LUP ;GO BACK FOR MORE QUIT: EXIT$S ;I QUIT WHEN THEY ARE NO LONGER EQUAL. ; ; AN ERROR HAS OCCURED IN ONE OF THE 20 BLOCKS, ; READ EACH OF THEM INDIVIDUALLY, AND ; FIND WHICH ONE HAD THE ERROR ; ERROR: MOV #NBLKS,R4 SLOW: QIOW$S #IO.RLB,#1,#1,,#ERR,,<#BUF,#512.,,HI,LO> MOVB ERR,R0 ;GET ERROR CODE CMP R0,#-20. ;CHECK FOR DOENE BEQ QUIT ;ILLEGAL CYLENDER ADDRESS MEANS DONE TST R0 BMI PRINT ;PRINT IT IF NEGATIVE QIOW$S #IO.WLB,#3,#1,,#ERR,,<#BUF,#512.,,HI,LO> MOVB ERR,R0 ;GET WRITE ERROR BMI PRINT ;PRINT IT JUST LIKE AN INPUT ERROR INCR: ADD #1,LO ;I MUST UUSE ADD TO GET A CARRY BIT ADC HI ;NOW ADD YOUR CARRY SOB R4,SLOW ;GO DO THE NNEXT BLOCK JMP LUP ;GO DO THE NNEXT 20 BLOCKS PRINT: BIC #177400,R0 ;CLOBBER AUTO-SIGN-EXTENSION MOV #EROUT,R1 ;LOAD ADDRESS OF OUTPUT MOV #3,R2 ;SET FOR 3 CHARACTERS JSR PC,OCTAL ;CONVERT TO OCTAL NUMERAL STRING MOV LO,R0 ;GET LOW WORD OF BLOCK MOV #6,R2 ;PRINT ALL 6 DIGITS JSR PC,OCTAL ;CONVERT MOV HI,R0 ;GET HIGH ORDER WORD MOV #1,R2 ;SET TO PRINT 1 DIGIT JSR PC,OCTAL ;CONVERT QIOW$C IO.WLB,2,1,,,, ;PRINT ON TI: BR INCR ;GO TO NNEXT BLOCK IN ERROR AREA ; ; SUBROUTINE TO CONVERT BINARY NUMBER TO AN OCTAL ; NUMERAL STRING. ; R0=NUMBER TO BE CONVERTED ; R1=ADDRESS OF LAST CHARACTER OF OUTPUT +1 ; R2=NUMBER OF DIGITS TO PROCESS ; ; R0 IS ZEROED ; R1 IS DECRIMENTED TO POINT TO A SPACE BEFORE THE MSD ; R2 IS ZEROED ; R3 IS USED AS A SCRATCH. RETURNS ASCII OF MSD ; OCTAL: MOV R0,R3 ;COPY VALUE TO SCRATCH BIC #177770,R3 ;CHOP OUT LOWER OCTAL VALUE BIS #60,R3 ;CONVERT TO ASCII MOVB R3,-(R1) ;STORE IN OUTPUT ASH #-3,R0 ;SHIFT NEXT DIGIT DOWN BIC #160000,R0 ;PREVENT SIGN EXTENSION SOB R2,OCTAL ;KEEP GOING UNTIL YOU ARE DONE MOVB #40,-(R1) ;STORE A SPACE BEFORE THE STRING RTS PC ;AND RETURN ; ; DATA ; MESS: .ASCII /ERROR 0 000000 000/ EROUT: .EVEN HI: .WORD 0 LO: .WORD 0 ERR: .BLKW 2 BUF: .BLKW 512.*NBLKS .END CHECK