.MCALL QIOW$,GTSK$C,DIR$,ALUN$C .MCALL EXIT$S,QIOW$C .MCALL SUPER,OPEN$W,FSRSZ$,FDOF$L,FHDOF$,FDOP$R,FDBDF$,NMBLK$ .MCALL CLOSE$,FDAT$R,FDRC$R,FDBF$R FDOF$L FHDOF$ DEF$L SUPER ; ; PROGRAM TO RECOVER A FILE GIVEN A LIST OF FILE HEADER BLOCKS ; MULTI:: ALUN$C 1,DP,1 ;RECOVERS FROM DP1 ALUN$C 2,DP,0 ;ONTO DP0 MOV #LIST,R4 MOV (R4)+,HDRHI MOV (R4)+,NXTHDR DIR$ #RDHDR ;READ THE FIRST HEADER BLOCK MOV #HEADER,R5 ;R5 POINTS TO THE NEXT HEADER IN CORE MOV #STRING,R0 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 ; ; ;ZERO THE FDB BEFORE YOU START LET R1 := #OUTFDB ;ADDRESS OF SAME THRU R0 := #S.FDB/2 ;WORDS IN FD LET (R1)+ := #0 ;CLEAR IT END ;LOAD PARTS OF THE FDB AT RUN TIME LET R0 := #OUTFDB FDOP$R R0,#2,#NAME,#DEFNAM,#FO.WRT FDBF$R R0,#3,#1 FDAT$R R0,#R.VAR!R.FIX,#FD.CR FDRC$R R0,#FD.INS,#RBUF,#512. OPEN$W ;OPEN OUTPUT FILE LET R1 := H.UFAT+F.HIBK+2(R5) ;GET THE TOTAL FILE SIZE LET R2 := #1 ;SET FOR CONTIGUOUS CALL .EXTND ;EXTEND THE FILE TO MAKE ROOM ;HERE I HAD TO RE-INITALIZE THE FIRST 7 ;WORDS CAUSE OPEN$ ZEROED THEM FOR ME LET R0 := R5 + #H.UFAT LET R1 := #OUTFDB THRU R2 := #7 ;COPY THE USER FILE ATTRIBUTES INTO LET (R1)+ := (R0)+ ;THE FIRST 7 WORDS OF THE FDB END LET R0 := #OUTFDB LET F.EOBB(R0) := F.EFBK(R0) ;MAKE THE RUN-TIME EOF MARK EQUAL LET F.EOBB+2(R0) := F.EFBK+2(R0) LET F.NREC(R0) := F.FFBY(R0) ;THE ONE IN THE HEADER LET OUTVB := #1 ;INITALIZE THE OUTPUT BLOCK NUMBER LET R2 :B= H.MPOF(R5) ;THE HEADER. HDLUP: MOV #HEADER,R5 ;R5 POINTS TO THE NEXT HEADER IN CORE ; *** ; NOW GET THE DATA BLOCKS POINTED TO BY THE HEADER ; AND READ THEM INTO THE RECOVERY FILE ON DP0: ; PUSH R4 LET R2 :B= H.MPOF(R5) LET R2 := R2 OFF.BY #177400 L.SHIFT 1 + R5 LET R3 :B= M.USE(R2) ;GET THE NUMBER OF WORDS OF RETREIVAL LET R3 := R3 OFF.BY #177400 ;POINTERS THAT ARE IN USE LET R2 := R2 + #M.RTRV ;R2 POINTS AT FIRST RETR. POINTER REPEAT ;REPEAT FOR ALL RETR. POINTERS LET R4 :B= (R2)+ ;GET THE HIGH ORDER PART LET R4 := R4 OFF.BY #177400 ;OF THE BLOCK NUMBER LET BBHI := R4 LET R4 :B= (R2)+ ;GET THE NUMBER OF CONIG BLOCKS LET R4 := R4 OFF.BY #177400 +1 ;THIS POINTER DEFINES LET BBLO := (R2)+ ;GET THE LOW ORDER BLOCK NUMBER THRU R4 ;LOOP FOR ALL THOSE BLOCKS DIR$ #READ ;READ THE BLOCK FROM DP ; ; WRITE THE DATA BLOCK TO THE NEW FILE DIR$ #WRITE ADD #1,OUTVB ;INC TO NEXT VIRTUAL BLOCK IN ADC OUTVBH ;OUTPUT FILE ADD #1,BBLO ;INC TO NEXT BLOCK POINTED TO BY ADC BBHI ;RETREIVAL POINTER ALSO END LET R3 := R3 - #2 ;COUNT DOWN TWO MORE WORDS UNTIL RESULT IS LE ;LOOP UNTIL NO MORE RETREIVAL POINTERS ERREND: POP R4 MOV (R4)+,HDRHI BGE CONT ; TERMINATE CLOSE$ #OUTFDB QIOW$C IO.WVB,5,5,,,, EXIT$S CONT: MOV (R4)+,NXTHDR DIR$ #RDHDR ;READ A BLOCK BR HDLUP HEADER: .BLKB 512. BUF: .BLKB 512. RDHDR: QIOW$ IO.RLB,1,1,,IOSTAT,, HDRHI=RDHDR+Q.IOPL+6 NXTHDR=RDHDR+Q.IOPL+10 READ: QIOW$ IO.RLB,1,1,,IOSTAT,, BBHI=READ+Q.IOPL+6 BBLO=READ+Q.IOPL+10 DONE: .ASCII /I'M DONE/<7><7><7><7><7><7><7><7><7><7><7><7><7><7> DL=.-DONE IOSTAT:: .WORD 0,0 LIST: .WORD 4,15157 .WORD 4,15160 .WORD 4,15167 .WORD 4,15170 .WORD 4,15221 .WORD 4,15255 .WORD 0,2075 .WORD 0,12332 .WORD 0,10323 .WORD 0,1573 .WORD 0,5613 .WORD 4,131664 .WORD 0,10041 .WORD 0,11322 .WORD 6,135511 .WORD 7,105104 .WORD -1 ; DEFNAM:: NMBLK$ ,,,SY,0 NAME:: DEV: .WORD 0,0 DIR: .WORD 0,0 NAM:: .WORD 0,0 RBUF: .BLKB 512. OUTFDB:: FDBDF$ WRITE:: QIOW$ IO.WVB,2,2,,IOSTAT,, OUTVBH==WRITE+Q.IOPL+6 OUTVB==WRITE+Q.IOPL+10 EDIT: .ASCII /%X/ .WORD 0 STRING: .BLKB 32. ; .END MULTI