.TITLE ROLLIN .IDENT /MRH004/ .SBTTL INTRO PAGE ; ; ;THIS PROGRAM IS DESIGNED TO DO A ROLLIN FROM/TO ;RK DISK AND 9-TRACK MAGTAPE WHILE RSX IS RUNNING ; ; ;THE DISKS AND MAGTAPES INVOLVED SHOULD BE MOUNTED AS ;FOREIGN VOLUMNS, ALTHOUGH MOUNTED FILES-11 DISKS (INCLUDING ;DK0: CAN BE COPIED/WRITTEN. THE MAGTAPE ;MUST ALLOW DEVICE CONTROL FUNCTIONS ; ; ;CALLING PROCEEDURE IS ; ;MCR>ROL ; ;TYPICAL COMMAND LINE WOULD BE: ; ; MT0:XXXXXX=DK2: (WHERE XXXXXXX IS LABEL FOR FILE NAME ON MAG-TAPE) ;CURRENTLY MAG-TAPE FILE NAMES MUST BE 6 LETTER NAMES ; ;TASK BUILD COMMAND FILE ; ;DK2:ROL/-FP,ROL/-SP=DK2:ROL,DK0:[1,1]EXEC.STB ; ;AUTHOR: ; D.I. CHRISTENSEN 23-JULY-82 ;/ ;TASK=...ROL ;LIBR=FCSRES:RO ;PRI=100 ;STACK=64 ;ASG=TI:3 ;PAR=GEN ; ; ; ; ; ; SYSTEM MACRO DEFINITIONS ; ; ; .MCALL EXIT$S,GTIM$C,GMCR$,FSRSZ$,QIOW$S,FINIT$ ; ; ; DATA ; ; ; .NLIST BEX ERM1: .ASCII /ILLEGAL INPUT LINE, INPUT AND OUTPUT SAME DEVICE/ ERM1S =<.-ERM1> .EVEN ERM2: .ASCII /ILLEGAL OUTPUT DEVICE/ ERM2S =<.-ERM2> .EVEN ERM3: .ASCII /ILLEGAL INPUT DEVICE/ ERM3S =<.-ERM3> .EVEN ERM4: .ASCII /ATTACH FAILURE ON OUTPUT DEVICE/ ERM4S =<.-ERM4> .EVEN ERM5: .ASCII /ATTACH FAILURE ON INPUT DEVICE/ ERM5S =<.-ERM5> .EVEN ERM6: .ASCII /DISK READ ERROR/ ERM6S =<.-ERM6> .EVEN ERM7: .ASCII /MAGNETIC TAPE WRITE ERROR/ ERM7S =<.-ERM7> .EVEN ERM8: .ASCII /END-OF-FILE WRITE ERROR/ ERM8S =<.-ERM8> .EVEN ERM9: .ASCII /MAGNETIC TAPE READ ERROR/ ERM9S =<.-ERM9> .EVEN ERM10: .ASCII /DISK WRITE ERROR/ ERM10S =<.-ERM10> .EVEN ERM11: .ASCII /DETACH ERROR ON OUTPUT DEVICE/ ERM11S =<.-ERM11> .EVEN ERM12: .ASCII /DETACH ERROR ON INPUT DEVICE/ ERM12S =<.-ERM12> .EVEN ERM13: .ASCII /COMMAND LINE ERROR/ ERM13S =<.-ERM13> .EVEN .LIST BEX .PSECT FSRSZ$ 1 .PAGE .SBTTL COMMAND LINE ROLLIN:: ;PROGRAM ENTRY FINIT$ ;RUNTIME FSR INITIALIZATION RSTART:: ;PROGRAM RESTART ENTRY GTIM$C DATE ;GET DATE AND TIME CLR SWOPT ;RESET OPTIONS ; ; ; GET COMMAND LINE ; ; ; CALL ROLGCM ;GET COMMAND LINE BCC GTLUN ;BRANCH IF NO ERROR CMPB #GE.EOF,CMLBLK+G.ERR;WAS IT EOF BEQ GOEXIT ;EXIT IF YES GOERR: JMP ROLERR ;ERROR GOEXIT: JMP ENDRUN ;EXIT ; ; ; GET LOGIICAL UNIT NUMBER ; ; ; GTLUN: MOV #OUTFDB+F.FNB,R4;OUTPUT DEVICE NAME MOV #INPFDB+F.FNB,R5;INPUT DEVICE NAME CMP N.DVNM(R4),N.DVNM(R5);CHECK FOR SAME DEVICE BNE NOTSAM ;NO CMP N.UNIT(R4),N.UNIT(R5);CHECK FOR SAME UNIT BNE NOTSAM ;NO QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM1,#ERM1S,#60> JMP RSTART ;GO GET COMMAND LINE NOTSAM: ;NO DEV NAME CONFLICTS, CHECK FOR LEGAL DEVICES MOV N.DVNM(R4),R0 ;SET UP TO CHECK OUTPUT DEVICE JSR PC,CKDEV ;CHECK IT BCC INPDOK ;DEVICE IS LEGAL QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM2,#ERM2S,#60> JMP RSTART ;GO GET COMMAND LINE INPDOK: MOV N.DVNM(R5),R0 ;SET TO CHECK INPUT DEV JSR PC,CKDEV ;CHECK IT BCC ATTACH ;DEVICE IS LEGAL JMP RSTART ;GET COMMAND LINE .PAGE .SBTTL ATTACH DEVICES IN QUESTION ; ATTACH: ;NOW TRY TO ATTACH DEVICES MOV #OUTFDB,R0 ;OUTPUT FDB TO R0 MOV F.BKST(R0),R1 ;IOSTATUS TO R1 QIOW$S #IO.ATT,#OUTLUN,#OUTLUN,,R1;ATTACH OUTPUT CMPB #IS.SUC,(R1) ;CHECK IO STATUS CODE BEQ OUTATC ;ATTACH WENT OK CMPB #IE.DAA,(R1) BEQ OUTATC QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM4,#ERM4S,#60> JMP RSTART OUTATC: MOV #INPFDB,R2 ;INPUT FDB TO R2 MOV F.BKST(R2),R3 ;I/O STATUS TO R3 QIOW$S #IO.ATT,#INPLUN,#INPLUN,,R3;ATTACH INPUT CMPB #IS.SUC,(R3) ;CHECK STATUS BEQ CHKSW ;WELL, WE FINALLY CAN START CRUNCHING CMPB #IE.DAA,(R3) BEQ CHKSW QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM5,#ERM5S,#60> JMP RSTART ; ; ; ; ; HERE WE FINALLY CAN START REAL CODE ; ; ; ; B ; CHKSW: BIT #DI.SW,SWOPT BEQ 1$ MOV #INPFDB,R0 CALL REWIND CALL DIRECT CALL REWIND JMP RSTART 1$: BIT #DA.SW,SWOPT BEQ MTSWIT CALL NWDATE MTSWIT: CMP N.DVNM(R4),N.DVNM(R5);SAME DEVICE FOR INPUT AND OUTPUT BEQ COPY ;SET UP TO COPY MOV #OUTFDB,MTFDB ;SET UP MAG TAPE FDB CMP N.DVNM(R4),#"MT ;IS OUTPUT ON MAGTAPE BEQ 1$ ;YES MT MOV #INPFDB,MTFDB ;SET MAG TAPE INPUT FDB 1$: MOV MTFDB,R0 ;SET UP TO GET LUN NUMBER BIT #,SWOPT ;TEST REWIND SWITCH BEQ SKPSW ;NO REWIND NECESSARY CALL REWIND ;GO REWIND SKPSW: BIT #SK.SW,SWOPT ;TEST SKIP FILES SWITCH BEQ SWCOM ;NO SKIP FILES NECESSARY CALL SKIPFL ;SKIP FILES SWCOM: CMPB F.LUN(R0),#INPLUN;SEE IF MAG TAPE INPUT BNE 5$ ;NO, MAG TAPE IS OUTPUT CALL FINDFL ;GO FIND FILE JMP MTREAD ;MAG TAPE READY TO READ 5$: BIT #FI.SW,SWOPT ;TEST FOR FIND SWITCH BEQ GOWRT ;NO SWITCH NOT SET CALL FINDFL GOWRT: JMP MTWRT ;MAG TAPE READY TO WRITE COPY: CALL COPYFL ;DEVICES ARE THE SAME CALL VERIFY JMP RSTART ;GET COMMAND LINE .PAGE .SBTTL WRITE LABEL OR SEARCH FOR FILE ON MT ; SET UP TO WRITE A REEL LABLE (ROLLIN FORMAT) ; ; ; MTWRT: MOV #OUTFDB,R0 ;MOVE OUTPUT FDB TO R0 MOVB F.LUN(R0),R4 ;OUTPUT LUN TO R4 MOV F.BKST(R0),R2 MOV #INPFDB,R1 ;INPUT FDB TO R1 MOVB F.LUN(R1),R5 ;INPUT LUN TO R5 MOV F.BKST(R1),R3 ;I/O STATUS POINTER CLR BLKHGH CLR BLKINP QIOW$S #IO.SEC,R4,R4,,R2;SET TAPE CHARACTERISTICS BIT #20000,2(R2) ;TEST FOR BOT BNE FRSTFL ;AT BOT WRITE ALL FILES JMP SECFIL FRSTFL: CALL FLABEL CALL BOOTUP CALL RLABEL JMP DKRD SECFIL: CALL FLABEL CALL RLABEL DKRD: QIOW$S #IO.RLB,R5,R5,,R3,,<#INPBUF,#INPSIZ,,BLKHGH,BLKINP> CMPB #IS.SUC,(R3) ;WAS READ A SUCCESS BEQ MTRD ;YES GET READY TO WRITE CMPB #IE.BLK,(R3) BEQ WRTEOF QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM6,#ERM6S,#60> JMP RSTART DKRDOK: ADD #16.,BLKINP ;INCREMENT BLOCK COUNT BR DKRD ;CONTINUE MTRD: QIOW$S #IO.WLB,R4,R4,,R2,,<#INPBUF,#INPSIZ> CMPB #IS.SUC,(R2) ;WAS WRITE A SUCCESS BEQ DKRDOK ;YES GO READ SOME MORE QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM7,#ERM7S,#60> JMP RSTART WRTEOF: CLR ENDOVF ;CLEAR EOF COUNTER LOOPEF: QIOW$S #IO.EOF,R4,R4,,R2 ;WRITE EOF CMPB #IS.SUC,(R2) ;WAS IT A SUCCESS BEQ ENDFOK ;YES, GO CHECK FOR ANOTHER QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM8,#ERM8S,#60> JMP RSTART ENDFOK: INC ENDOVF ;INCREMENT COUNTER CMP ENDOVF,#3. ;ARE THERE 3 EOF'S BLT LOOPEF ;NO GO WRITE ANOTHER MOV #-2,SKIP ;GO BACK PAST THE EOF MARKS CALL SKIPFL ;GO DO SKIP FILES JMP CKATCH MTREAD::MOV #OUTFDB,R0 ;OUTPUT FDB TO R0 MOVB F.LUN(R0),R4 ;OUTPUT LUN TO R4 MOV F.BKST(R0),R2 ;I/O STATUS TO R2 MOV #INPFDB,R1 ;INPUT FDB TO R1 MOVB F.LUN(R1),R5 ;INPUT LUN TO R5 MOV F.BKST(R1),R3 ;INPUT I/O STATUS POINTER CLR BLKOUT CLR BLKHGH RDMT: QIOW$S #IO.RLB,R5,R5,,R3,,<#INPBUF,#BIMSIZ> CMPB #IS.SUC,(R3) ;WAS READ SUCCESSFUL BEQ BYTCHK ;YES SEE IF DATA BLOCK BR MTRERR ;YES ERROR BYTCHK: CMP #8192.,2(R3) ;WAS IT DATA BNE RDMT ;NO, GO READ SOME MORE BR DKWT ;GO WRITE DATA TO DISK MTRRDY: QIOW$S #IO.RLB,R5,R5,,R3,,<#INPBUF,#INPSIZ> CMPB #IS.SUC,(R3) ;WAS READ A SUCCESS BEQ DKWT ;YES GO WRITE TO DISK CMPB #IE.EOF,(R3) ;CHECK FOR END OF FILE BEQ EXIT ;YES ,FINISHED READING MTRERR: QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM9,#ERM9S,#60> JMP RSTART DKWT: QIOW$S #IO.WLB,R4,R4,,R2,,<#INPBUF,#INPSIZ,,BLKHGH,BLKOUT> CMPB #IS.SUC,(R2) ;WAS WRITE A SUCCESS BEQ DKWTOK ;YES, GO READ SOME MORE ERROR: QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM10,#ERM10S,#60> JMP RSTART DKWTOK: ADD #16.,BLKOUT ;INCREMENT BLOCK COUNT JMP MTRRDY ;GO READ SOME MORE EXIT: BR CKATCH ;FINAL CLEAN UP--DETACH WHERE NEEDED ; CKATCH::QIOW$S #IO.DET,R4,R4,,R2 ;DETACH OUTPUT DEVICE CMPB #IS.SUC,(R2) ;SUCCESS ? BEQ OUTNAT ;YES TYR OUTPUT QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM11,#ERM11S,#60> OUTNAT: QIOW$S #IO.DET,R5,R5,,R3 ;DETACH INPUT DEVICE CMPB #IS.SUC,(R3) ;DID IT GO ? BEQ INPNAT ;YES QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM12,#ERM12S,#60> INPNAT: ;ALL UNDONE, TRY ANOTHER COMMAND JMP RSTART ROLERR::QIOW$S #IO.WVB,#TTYLUN,,,,,<#ERM13,#ERM13S,#60> ; ; ENDRUN::;CONTROL-Z SEEN ON INPUT OR MCR ONE LINER EXIT$S ;AND EXIT ; ;C-BIT IS SET ON RETURN TO INDICATE ERROR, OTHERWISE CLEARED ; CKDEV:: MOV #LEGDEV,R2 ;R2 POINTS TO START OF LEGAL DEV TABLE 1$: CMP R0,(R2)+ ; BEQ 2$ ; TST (R2) BNE 1$ SEC ; RTS PC ; 2$: CLC ; RTS PC ; LEGDEV: .ASCII /DK/ .EVEN .ASCII /MT/ .EVEN .ASCII /TT/ .EVEN .WORD 0 ; ; ; ; ; ;NOW SOME VARIABLES ; ; BLKINP: .WORD 0 ;STARTING BLOCK FOR DK READ BLKOUT: .WORD 0 ;STARTING BLOCK FOR DK WRITE BLKHGH: .WORD 0 ;HIGH BLOCK NUMBER FOR DP READ/WRITE ENDOVF: .WORD 0 ;END OF VOLUME FLAG FOR MT MTFDB:: .WORD 0 GETMCR: GMCR$ .END ROLLIN ;