NBLK=30. .MCALL QIOW$S,QIOW$,GTSK$C,DIR$,ALUN$C,FHDOF$ .MCALL EXIT$S,QIOW$C FHDOF$ DEF$L ; ; PROGRAM TO RECOVER ALL FILE IN THE TASKS UIC FROM CD1 AND ; WRITE THEM ONTO SY0: IN THE CURRENT UIC ; ; TO USE THIS PROGRAM, YOU SET /UIC AND ASN TO AN EXISTING UIC ; ON A MOUNTED SCRATCH DISK. THE CORRESPONDING UIC ON THE ; CORRUPTED DISK WILL BE COPIED INTO THE UIC THAT YOU ARE ; SET TO ON YOUR SY DISK. ; ; NOTE THAT THIS PROGRAM ASSUMES THAT BLOCKS 0-222 ON THE ; DISK ARE CORRUPTED. ; UICREC:: GTSK$C TBUF ;GET THE TASK PARAMETRS (TO GET THE UIC) ALUN$C 1,DP,1 ALUN$C 2,SY,0 HDLUP: DIR$ #RDBLK ;READ A BUNCH OF BLOCKS TSTB IOSTAT ;TEST FOR ERROR IN ANY OF THEM BMI SMALL ;GO DO THEM ONE AT A TIME IF ERROR MOV #HEADER,R5 ;R5 POINTS TO THE NEXT HEADER IN CORE MOV BBHI,HDRHI MOV BBLO,NXTHDR ALLH: CALL REST ;CALL THE REST OF THE PROGRAM FOR EACH HEADER ADD #512.,R5 ;SKIP TO THE NEXT HEADER ADD #1,NXTHDR ADC HDRHI CMP R5,#ENDH ;TEST FOR DONE BLT ALLH ;GO DO THE NEXT ONE NEXTB: ADD #NBLK,BBLO ;INCRIMENT TO THE NEXT BLOCK OF HEADERS ADC BBHI BR HDLUP ;GO RECOVER ALL OF THEM ;CONTROL BRANCHES HERE IF THERE IS AN ERROR IN THE ;BIG READ ABOVE. SMALL: MOV #NBLK,R4 ;LOOP FOR ALL BLOCKS REQUESTED MOV BBHI,HDRHI ;INITALIZE TO THE START OF THE BIG READ MOV BBLO,NXTHDR MOV #HEADER,R5 SLUP: MOV R4,-(SP) ;SAVE LOOP COUNTER DIR$ #RDHDR ;READ ONE BLOCK TSTB IOSTAT ;IS THIS THE BAD BLOCK? BGT NOPE CMPB IOSTAT,#IE.BLK ;ARE THERE NO MORE BLOCKS? BNE ESLUP QIOW$C IO.WVB,5,5,,,, EXIT$S NOPE: CALL REST ;NO, RECOVER THIS FILE ESLUP: ADD #1,NXTHDR ADC HDRHI MOV (SP)+,R4 ;RECOVER THE LUP COUNT SOB R4,SLUP ;LUP FOR ALL BLOCKS BR NEXTB REST: CMP #27027,(R5) ;IS THIS A HEADER BLOCK BNE NEXT ;NO, SKIP TO NEXT BLOCK TST 2(R5) ;IS THIS HEADER BLOCK ALLOCATED? BEQ NEXT ;NO, SKIP TO NEXT ;CALCULATE THE CHECKSUM OF THE HEADER BLOCK AS A ;FINAL CHECK TO MAKE SURE IT REALLY IS A HEADER MOV R5,R0 ;START AT TOP OF HEADER MOV #377,R1 ;LOOP FOR ALL BUT THE LAST WORD CLR R2 ;R2 CONTAINS THE SUM CHECK: ADD (R0)+,R2 ;THE HEADER CHECKSUM IS JUST A "DUMB SHIT SOB R1,CHECK ;RUNNING SUM" TO QUOTE JIM LIVINGSTON CMP R2,(R0) ;IS THE CHECKSUM CORRECT? BNE NEXT ;NO, THEN FORGET THIS BLOCK CMP H.PROG(R5),UIC ;IS THIS FILE IN THE UIC I WANT?? BNE NEXT ;NO, THROW IT OUT THIS TIME MOV #STRING,R0 ;START SETTING UP FOR EDITMSG MOV #EDIT,R1 MOV R5,R2 ;CALCULATE THE ADDRESS OF THE FILE ADD #56,R2 ;INFORMATION SECTION OF THE HEADER CALL $EDMSG ;CONVERT TO ASCII MOV R1,NAM ;SAVE LENGTH MOV #STRING,NAM+2 ;AND ADDRESS IN DSDB FOR OUTPUT FILE QIOW$S #IO.WVB,#6,#6,,,,<#STRING,R1,#'$> MOV #BSTRING,R0 MOVB #11,(R0)+ MOV HDRHI,R1 MOV #30010,R2 CALL $CBTA MOVB #54,(R0)+ MOV NXTHDR,R1 MOV #30010,R2 CALL $CBTA MOVB #11,(R0)+ MOV R0,R1 SUB #BSTRING,R1 QIOW$S #IO.WVB,#6,#6,,,,<#BSTRING,R1,#0> ;THIS IS A HEADER THAT WE WANT, RECOVER IT. JSR PC,BLOCKS NEXT: RTS PC RDBLK: QIOW$ IO.RLB,1,1,,IOSTAT,, BBHI=RDBLK+Q.IOPL+6 BBLO=RDBLK+Q.IOPL+10 HEADER: .BLKB 512.*NBLK ENDH: RDHDR: QIOW$ IO.RLB,1,1,,IOSTAT,, HDRHI=RDHDR+Q.IOPL+6 NXTHDR=RDHDR+Q.IOPL+10 TBUF: .BLKW 16. UIC=TBUF+16 EDIT: .ASCII /%X/ .WORD 0 STRING: .BLKB 32. BSTRING: .BLKB 32. YN: .BLKB 10. DONE: .ASCII /I'M DONE/<7><7><7><7> DL=.-DONE ; .END UICREC