.MCALL QIOW$S,QIOW$,GTSK$C,DIR$,ALUN$C,FHDOF$ .MCALL EXIT$S,QIOW$C FHDOF$ DEF$L ; ; PROGRAM TO RECOVER A FILE GIVEN A LIST OF FILE HEADER BLOCKS ; UICREC:: ALUN$C 1,DP,0 ALUN$C 2,MT,0 MOV #LIST,R4 MOV (R4)+,HDRHI MOV (R4)+,NXTHDR DIR$ #RDHDR DIR$ #WRTAPE MOV #BUF,WRTAPE+Q.IOPL HDLUP: MOV #HEADER,R5 ;R5 POINTS TO THE NEXT HEADER IN CORE .MCALL SUPER SUPER 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 DIR$ #WRTAPE ;WRITE INTO THE NEW FILE IFB IOSTAT LE #0 THEN GOTO ERREND ADD #1,BBLO ADC BBHI 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 QIOW$C IO.EOF,2,2 QIOW$C IO.RWU,2,2 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 WRTAPE: QIOW$ IO.WLB,2,2,,IOSTAT,, 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 ; .END UICREC