.TITLE rstore program to read backup tapes .IDENT /X03.01/ ; PROGRAM SPECIFICATION ; ; ALL FILES/FILES MATCHING SPEC/FILES MATCHING AND QUERIED WITH YES ; .MCALL GCML$,GCMLB$,CSI$,CSI$1,CSI$2,CSI$ND,CSI$SW,CSI$SV .MCALL FSRSZ$,fdbf$a,FDBDF$,FDOP$A,FDAT$A,FDRC$A,CLOSE$,NMBLK$ .MCALL QIOW$,ALUN$S,DIR$,MRKT$S,WTSE$S .MCALL OPEN$R .MCALL OPEN$W,FHDOF$,QIOW$S,FINIT$ .MCALL OPEN$,WRITE$,WAIT$,PUT$,QIOW$C,ALUN$C,EXIT$S FHDOF$ DEF$L FSRSZ$ 1 ;FOR OPTIONAL LISTING FILE ;UNITS ARE ; 1 TI: ; 2 INPUT FILE ; 3 SY: ; 4 SY:LISTING FILE .EVEN GCLBLK: GCMLB$ 1,RST,,1 CSI$ CSIBLK: .BLKB C.SIZE ALLBIT=2 DIRBIT=4 RDCBIT=40 SELBIT=1000 LSTBIT=2000 ;LISTING FILE PRESENT SWTBL: CSI$SW AL,ALLBIT,FLGS1,SET,NEG ;ALL FILES CORRESPONDING(NO?) CSI$SW DI,DIRBIT,FLGS1,SET,,DIRTBL ;DIRECTORIES ON TAPE CSI$SW LI,RDCBIT,FLGS1,SET,NEG ;READ CHECK ONLY CSI$SW SE,SELBIT,FLGS1,SET,,SELTBL ;SELECT FILES CSI$ND DIRTBL: CSI$SV OCTAL,UIC,2 CSI$SV OCTAL,MEM,2 CSI$ND SELTBL: CSI$SV ASCII,SELBUF,20 CSI$ND SELBUF: .BLKB 20 MEM: .WORD 0 UIC: .WORD 0 FLGS1: .WORD 0 LSTFDB: FDBDF$ ;FOR LISTING FILE FDAT$A R.VAR,FD.CR FDRC$A ,LSTBUF,132. FDOP$A 4,CSIBLK+C.DSDS,LSDFNB,FO.WRT LSDFNB: NMBLK$ DSCTAPE,LST,0,SY,0 LSTBUF: .BLKB 132. OUTFDB: FDBDF$ ;FDB FOR WRITING OUT FILES FDAT$A R.VAR FDRC$A FD.RWM FDOP$A 3,,OUTFNB,FO.WRT OUTFNB: NMBLK$ ,,,SY,0 MMFDB: FDBDF$ ;FOR .ASLUN / .PRSDV fdat$a r.var fdbf$a ,2064. FDRC$A FD.rwm FDOP$A 2,CSIBLK+c.dsds,,FO.RD TMPBF: .BLKB 80. FSIZ: .WORD 0 WRTBLK: .WORD 0,0 BLK7: .BLKW 7 ;FOR FILE CLOSE INFO BUFFER: BLKSIZ: .WORD 0 ;FIRST WORD OF HEADER - HOW MUCH DATA BLKTYP: .WORD 0 ;RECOGNISE 1,2,4 BLKNUM: .WORD 0 ;BLOCK NO OF FIRST BLOCK IN THIS UNIT .WORD 0 BLKFID: .WORD 0 ;FILE ID BLKFSQ: .WORD 0 ;FILE SEQ NO .BLKW 2 ;SPARE DATBUF: .BLKW 1024. ;DATA BUFFER IOSTAT: .BLKW 2 ;STATUS OF MM TRANSFERS SYNERR: .ASCIZ /RESTORE -- SYNTAX ERROR/ OPFERR: .ASCII /RESTORE -- OPEN FAILURE : FILE:/ OPFILE: .ASCIZ /ABCDEFGHI.JKL; / .EVEN errbf: .blkb 20 ;SUBROUTINES FOR WRITING THE FILES OUT CLS: MOV #BLK7,R1 ;GET ADDRESS OF WORDS FOR FDB MOV #OUTFDB,R2 ;AND ADDR FDB MOV #7,R0 1$: MOV (R1)+,(R2)+ SOB R0,1$ ;COPY ALL 7 CLOSE$ #OUTFDB RTS PC ; TO OPEN FILE OPN: MOV FSIZ,OUTFDB+F.CNTG ;SET SIZE FROM R0 MOV #FO.WRT,R5 MOV #BLK7,R1 MOV #DATBUF+16,R0 MOV #OUTFDB,R2 MOV #7,R3 2$: MOV (R0),(R2)+ MOV (R0)+,(R1)+ SOB R3,2$ MOV 10+DATBUF,R1 ;GET UIC MOV #DATBUF+46.,R2 MOV #OUTFNB+N.FNAM,R1 MOV #5,R3 4$: MOV (R2)+,(R1)+ SOB R3,4$ OPEN$ #OUTFDB,R5 BCS 5$ RTS PC ;GOOD RETURN CARRY CLEAR 5$: MOV #OPFILE,R0 MOV #DATBUF+46.,R3 MOV #3,R4 6$: MOV (R3)+,R1 CALL $C5TA SOB R4,6$ MOVB #'.,(R0)+ MOV (R3)+,R1 CALL $C5TA MOVB #';,(R0)+ MOV (R3)+,R1 MOV R3,R2 CALL $CBOMG CLRB (R0)+ MOV #OPFERR,R0 CALL TYPEIT SEC RTS PC ; WRITE TO FILE WRT: MOV BLKSIZ,R1 BEQ 1$ MOV BLKNUM,WRTBLK+2 MOV BLKNUM+2,WRTBLK WRITE$ #OUTFDB,#DATBUF,R1,#WRTBLK 1$: RTS PC TYPEIT: MOV r1,-(sp) MOV R0,R1 1$: TSTB (R1)+ BNE 1$ DEC R1 SUB R0,R1 QIOW$S #IO.WLB,#1,#1,,,, MOV (SP)+,R1 RTS PC START: FINIT$ ALUN$C 1,TI,0 RSTART: CLR FLGS1 CLR NTBLKS CLR MEM CLR UIC CLR SELBUF GCML$ #GCLBLK TSTB G.ERR+GCLBLK BGE 1$ EXIT$S 1$: CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD ;REMOVE SPACES AND JUNK BCC 2$ 3$: MOV #SYNERR,R0 CALL TYPEIT BR RSTART 2$: ;HERE TO START PICKING UP BITS TST CSIBLK+C.CMLD BLE RSTART BITB #CS.EQU,C.STAT+CSIBLK BEQ 3$ CSI$2 #CSIBLK,INPUT,#SWTBL BCS 3$ OPEN$R #MMFDB BCS 3$ CSI$2 #CSIBLK,OUTPUT BCS 3$ BITB #CS.DIF!CS.NMF!CS.DVF,C.STAT+CSIBLK BEQ 5$ ;NO FILE BIS #LSTBIT,FLGS1 OPEN$W #LSTFDB BCS 3$ 5$: CLR BLKTYP CALL UNDUMP CLOSE$ #MMFDB BIT #LSTBIT,FLGS1 BEQ 100$ CLOSE$ #LSTFDB 100$: br RSTART UNDUMP: ;CALL TO UNDUMP A FILE OF FILES CMP BLKTYP,#2 BEQ 1$ ;A VAILD STARTER CALL RBLK BCC UNDUMP RTS PC 1$: MOV #TMPBF,R0 MOV #4,R2 MOV #DATBUF+12,R1 2$: MOVB (R1)+,(R0)+ SOB R2,2$ MOV #9.,R2 3$: MOVB #40,(R0)+ SOB R2,3$ 4$: CMPB (R1)+,#'] BNE 4$ ; POINTING NOW AT FILENAME ; 5$: TSTB (R1) BEQ 6$ MOVB (R1)+,(R0)+ BR 5$ 6$: MOVB #'(,(R0)+ ; NOW SET UP FSIZ AND CONVERT IT TO DEC FOR HEADER. ; MOV DATBUF+90.,R1 MOV R1,FSIZ CLR R2 CALL $CBDMG MOVB #'),(R0)+ CLRB (R0) MOV R0,-(SP) CALL RBLK BCC 7$ RTS PC 7$: MOV DATBUF+10,R3 MOV #1,R4 MOV #TMPBF+4,R2 CALL .PPASC MOV (SP)+,R0 9$: MOVB #40,(R0)+ CMP R0,#TMPBF+45. BLO 9$ MOVB #'?,(R0)+ BIT #LSTBIT,FLGS1 BEQ 10$ PUT$ #LSTFDB,#TMPBF,#44. 10$: BIT #RDCBIT,FLGS1 BNE 90$ ; ATTEMPT TO MATCH FILE ; TRY FILENAME MATCH BIT #SELBIT,FLGS1 BEQ 60$ MOV #TMPBF+13.,R0 MOV #SELBUF,R1 MOV #13.,R2 50$: TSTB (R1) BEQ 60$ ;SUCCESS FOR ENTIRE KEY CMPB (R0)+,(R1)+ BEQ 50$ 51$: CMPB #'?,-1(R1) BEQ 50$ ;WILD SUCEEDS CMPB #'.,-1(R1) BNE 90$ ;NOT . SO FAILED 52$: CMPB (R0)+,#'. BNE 52$ BR 50$ ;TRY DIR MATCH 60$: BIT #DIRBIT,FLGS1 BEQ 70$ TSTB UIC BEQ 61$ CMPB UIC,DATBUF+11 BNE UNDUMP 61$: TSTB MEM BEQ 70$ CMPB MEM,DATBUF+10 BNE UNDUMP ; WRITE OOUT FILE IF MATCHES 70$: ;TRY DO WE WANT IT BIT #ALLBIT,FLGS1 BNE 80$ CLR ERRBF QIOW$S #IO.RPR,#1,#1,,#IOSTAT,,<#ERRBF,#20,,#TMPBF,#46.,#44> CMPB IOSTAT,#1 BEQ 71$ RTS PC ;USER SAID GIVE UP 71$: CMPB ERRBF,#'Y BEQ 80$ CMPB ERRBF,#'Y+40 BNE 90$ 80$: CALL OPN BCS 90$ 81$: CALL RBLK BCC 85$ CALL CLS RTS PC 85$: CMP BLKTYP,#1 BNE 84$ CALL WRT BR 81$ 84$: CALL CLS 90$: JMP UNDUMP RBLK: INC NTBLKS QIOW$S #IO.RVB,#2,#1,,#iostat,,<#BUFFER,#2064.,,#0,NTBLKS> CMP IOSTAT,#1 BEQ 1$ SEC MOV IOSTAT,R1 MOV IOSTAT+2,R2 MOV NTBLKS,R3 IOT RTS PC 1$: CLC RTS PC NTBLKS: .word 0 .END START