.TITLE ABORTED FILE SAVE ROUTINE .IDENT /V01.1A/ ;THIS PROGRAM ENAMBLES USERS TO RECOVER DATA LOST IN FILES WHICH WERE ;OPEN WHEN A TASK ABORTS. ;THE FILE MAY BE SAVED BY: ; 1) UNLOCK THE FILE WITH THE PIP UNLOCK SWITCH ; 2) RUN THIS PROGRAM ; 3) COPY THE FILE WITH PIP USING THE /ME SWITCH ;NOTE---AN ERROR CONDITION ["ILLEGAL RECORD SIZE" OR "END OF FILE DETECTED"] ; MAY RESULT, BUT ALL THE DATA WILL BE SAVED AND THE END OF FILE ; WILL BE PROPERLY PLACED. ;FOR FILES USING FIXED LENGTH RECORDS OR ABNORMAL LENGTH RECORDS THE ;RECORD SIZE BAY BE REINITIALIZED WITH THE /RL:RECORD SIZE SWITCH ; ;TASK BUILD FILE ;SAVFIL/-FP/MU/-TA,LP:/SH=SAVFIL ;/ ;LIBR=SYSRES:RO ;UNITS=4 ;ASG=SY:1 ;ASG=TI:2:3 ;ASG=MO:4 ;ACTFIL=1 ;// .MCALL FSRSZ$,FINIT$,FDBDF$,FDOP$A,FDRC$A,FDBK$A .MCALL OPEN$U,CLOSE$,EXIT$S,QIOW$S,MOUT$S .MCALL GCMLB$,CSI$,CSI$SW,CSI$ND,CSI$SV .MCALL GCML$,CCML$,CSI$1,CSI$2 .MACRO ERRM S .NCHR T$MP, .WORD T$MP,.+2 .ASCII /S/ .EVEN .ENDM ERRM BAD: ERRM .SBTTL DIRECT ASSIGNMENTS BLKFLG=20. BLKSIZ=512. GCLUN=2 LUN1=1 MAXD=1 RLMASK=1 TIFLG=21. TILUN=3 .SBTTL CONTROL BLOCKS FSRSZ$ 1 FIXFDB: FDBDF$ FDOP$A LUN1,CSIBLK+C.DSDS FDRC$A FD.RWM FDBK$A BLKBUF,BLKSIZ,BLKFLG GCLBLK: GCMLB$ MAXD,,,GCLUN CSI$ CSIBLK: .BLKB C.SIZE .EVEN SWITBL: CSI$SW RL,RLMASK,,,,VALTBL CSI$ND VALTBL: CSI$SV NUMERIC,RECSIZ,2 CSI$ND BLKBUF: .BLKB BLKSIZ RECSIZ: .BLKB 2 STATUS: .BLKW 5 PROMPT: .BYTE 12,15 .ASCII /ENTER FILE SPECIFICATION>/ PRMTSZ=.-PROMPT .EVEN XQIO: .WORD XQLN,XQIOSM XQIOSM: .ASCII /SY0:[1,2]QIOSYM.MSG/ XQLN=.-XQIOSM .EVEN .MOLUN::.BLKW 1 .PAGE .SBTTL PROGRAM CODE START: FINIT$ BEGIN: GCML$ #GCLBLK,#PROMPT,#PRMTSZ ;GET COMMAND LINE BCC 4$ ;BR IF OK CMPB GCLBLK+G.ERR,#GE.EOF ;EOF? BEQ 3$ ;BR IF YES MOVB GCLBLK+G.ERR,R5 ;GET ERROR CODE JSR PC,ERROR ;PRINT IT 1$: MOUT$S #BAD 2$: CCML$ #GCLBLK ;CLOSE COMMAND LINE BR BEGIN ;RTYM AGAIN 3$: CCML$ #GCLBLK ;CLOSE COMMAND LINE EXIT$S ;EXIT 4$: CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD BCC 6$ 5$: QIOW$S #IO.WVB,#TILUN,#TIFLG,,,, BR 1$ 6$: CSI$2 #CSIBLK,OUTPUT,#SWITBL BCS 1$ BIT #RLMASK,CSIBLK+C.MKW1 ;/RL SWITCH? BEQ 10$ ;BR IF NO SWITCH MOV RECSIZ,FIXFDB+F.RSIZ ;SET RECORD ISZE 10$: MOV #STATUS,FIXFDB+F.STBK ;GET STATISTICS BLOCK ADDRESS OPEN$U #FIXFDB ;OPEN FILE FOR UPDATE BCC 15$ ;BR IF OK MOVB FIXFDB+F.ERR,R5 JSR PC,ERROR ;PRINT ERROR JMP 2$ ;TRY AGAIN 15$: MOV #STATUS,R1 ;GET STATUS BLOCK ADDRESS MOV 4(R1),FIXFDB+F.HIBK ;START OF SECRET CODE MOV 4(R1),FIXFDB+F.EFBK ;MORE SECRET CODE MOV 6(R1),FIXFDB+F.HIBK+2 ;TOP SECRET CODE MOV 6(R1),FIXFDB+F.EFBK+2 ;MORE TOP SECRET CODE MOV #1000,FIXFDB+F.FFBY ;SUPER TOP SECRET CODE CLOSE$ #FIXFDB ;CLOSE FILE JMP BEGIN ;MORE TO DO? ERROR: NEG R5 MOUT$S #XQIO,,R5 RTS PC .END START