.NLIST BEX,SEQ,SYM .TITLE TAPEMOVE - POSITION A MAG TAPE .IDENT /V00A00/ ; ; 22-OCT-82 MDR ; ; ; ABSTRACT ; ; POSITIONS A MAGTAPE FORWARD OR BACKWARD BY FILE MARK OR REWINDS ; AND OPTIONALLY UNLOADS ; ; ; 13-SEP-85 R ULESKI - MODIFIED TO USE MS: FOR TSV05... POSITIONING. ; ; .MCALL QIOW$,DIR$,EXIT$S,FSRSZ$,FINIT$,GCML$,CSI$,CSI$1,CSI$2 .MCALL GCMLB$,CCML$,FHDOF$,ALUN$S,CSI$SW,CSI$SV,CSI$ND ; ; FSRSZ$ 1 ;ONE RECORD-ORIENTED FILE FHDOF$ DEF$L CSI$ ; ; LUN ASSIGNMENTS ; TAPLUN=3 TILUN=5 ; ; ; ; COMMAND LINE FORMAT: MSn:/SW ; ; ALLOWED SWITCHES ARE: ; ; /RW - REWIND ; /UN - UNLOAD (REWIND IMPLIED) ; /FS:nnn - FORWARD SPACE nnn (DECIMAL) FILES ; /BS:nnn - BACK SPACE nnn (DECIMAL) FILES ; /EOF:nnn - WRITE nnn (DECIMAL) END-OF-FILE MARKS ; /LAB:aaaaaa- WRITE A LABEL TO TAPE ; ; ; START: FINIT$ ;INITIALIZE FSR GCML$ #GCLBLK ;GET A COMMAND LINE BCC 1$ JMP EXIT ;SORRY I ASKED 1$: CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD ;CHECK SYNTAX BCS BADSYN CSI$2 #CSIBLK,OUTPUT,#SWTBL ;GET DRIVE NUMBER BCS BADSYN BITB #CS.NMF!CS.DIF!CS.MOR!CS.EQU!CS.WLD,CSIBLK+C.STAT BNE BADSYN ;NO FILES, INPUTS, UICS OR MULTI SPECS BITB #CS.DVF,CSIBLK+C.STAT ;BUT DEVICENAME IS MANDATORY BEQ BADSYN ;INCOMPLETE SYNTAX MOV CSIBLK+C.DEVD,R0 ;DEVICE NAME DECRIPTOR LENGTH IN R0 MOV CSIBLK+C.DEVD+2,R1 ;DEVICE NAME DECRIPTOR ADDRESS IN R1 MOVB (R1)+,R2 ;ASSEMBLE DEVICE NAME HERE SWAB R2 ;CLEAR THE DECKS FOR SECOND CHARACTER BICB #377,R2 BISB (R1)+,R2 ;ADD 2ND CHARACTER SWAB R2 ;PUT BYTES WHERE THEY BELONG CMP #"MS,R2 ;DEVICE MUST BE MS BNE BADDEV ;URP! CLR R4 ;DECODE UNIT NO. SUB #2,R0 ;GET LENGTH OF REMAINING STRING BEQ BADSYN ;THAT'S ALL THEY WROTE CMP #1,R0 ;BETTER NOT BE MORE THAN 1 DIGIT BLO BADDEV ;SIGH, IT IS. MOVB (R1)+,R4 ;GET THE UNIT BIC #177760,R4 ;STRIP IT TO ITS BINARY SHORTS CMP #3,R4 ;NO UNIT HIGHER THAN 3 BLO BADDEV ;GOD DAMN IT! ALUN$S #TAPLUN,#"MS,R4 ;FINALLY, ASSIGN THE LUN CCML$ #GCLBLK ;AND CLOSE THE COMMAND LINE DIR$ #ATTACH ;ATTACH TAPE TSTB TAPSTAT ;SUCCESS? BMI TAPERR ;NO BIT #400,TAPSTAT+2 ;CHECK SELECT ERROR BEQ 2$ ;NO ERROR DIR$ #ONLERR ;ELSE, END OF THE TRAIL JMP EXIT 2$: DIR$ #SENSE ;SENSE TAPE TSTB TAPSTAT ;SUCCESS? BMI TAPERR ;NO MOV SWMASK,R0 ;GET THE SWITCH MASK BEQ BADSYN ;NO SWITCH, NO GO CMP #1,R0 ;REWIND? BNE 3$ ;NO JMP REWIND 3$: CMP #2,R0 ;UNLOAD? BNE 4$ ;NO JMP UNLOAD 4$: CMP #4,R0 ;FORWARD SPACE? BNE 5$ ;NO JMP FSPACE 5$: CMP #10,R0 ;BACK SPACE? BNE 6$ ;NO JMP BSPACE 6$: CMP #20,R0 ;ONLY ONE OTHER POSSIBILITY BNE BADSYN ;TOO MANY FUNCTIONS JMP EOFS ;DO EOF ; ; ; ERROR TRAPS ; BADSYN: DIR$ #SYNERR ;SYNTAX ERROR BR ERXIT ;NO SECOND CHANCES BADDEV: DIR$ #DEVERR ;DEVICE SPECIFICATION ERROR BR ERXIT ;YOU ONLY GO AROUND ONCE ON THIS RIDE ; TAPERR: MOV #TERRNO,R0 ;TARGET ADDRESS IN OUTPUT STRING MOVB TAPERR,R1 ;ERROR CODE CLR R2 ;SUPPRESS LEADING ZEROES CALL $CBDSG ;DO THE CONVERSION DIR$ #TERROR ;PUT PUT ERROR MESSAGE ERXIT: EXIT$S ;FINI ; ; ; FUNCTION SUBROUTINES ; ; ; ; ;WRITE AN EOF OR TWO (OR 3, OR 4, OR ...) ; EOFS: MOV NMARKS,R0 ;GET EOF COUNT BNE 1$ ;GOT A COUNT INC R0 ;ELSE, DEFAULT TO ONE 1$: DIR$ #WEOF ;WRITE ONE TSTB TAPSTAT ;COMPLETE OK? BPL 2$ ;YES JMP TAPERR ;ELSE... 2$: SOB R0,1$ ;RECYCLE JMP EXIT ; WEOF: QIOW$ IO.EOF,TAPLUN,1,,TAPSTAT ;WRITE FILE MARK TO TAPE ; ; ; REWIND THE TAPE ; REWIND: BIT #20000,TAPSTAT+2 ;IS TAPE AT BOT? BEQ 1$ ;NO JMP EXIT ;ELSE, DON'T BOTHER 1$: DIR$ #RWIND ;ISSUE THE REWIND JMP DONCHK ; RWIND: QIOW$ IO.RWD,TAPLUN,1,,TAPSTAT ;REWIND TAPE ; ; ; UNLOAD TAPE ; UNLOAD: DIR$ #OFFLIN ;ELSE, ISSUE THE REWIND JMP DONCHK ; OFFLIN: QIOW$ IO.RWU,TAPLUN,1,,TAPSTAT ;REWIND/OFFLINE TAPE ; ; ; FORWARD SPACE BY FILE MARKS ; FSPACE: BIT #20,TAPSTAT+2 ;IS TAPE AT EOT? BEQ SPACE ;NO JMP EXIT ;ELSE, IGNORE REQUEST ; ; ; BACK SPACE BY FILE MARKS ; BSPACE: BIT #20000,TAPSTAT+2 ;IS TAPE AT BOT? BEQ 1$ ;NO JMP EXIT ;ELSE, SKIP IT 1$: TST NMARKS ;NMARKS 0? BNE 2$ ;NO INC NMARKS ;ELSE, DEFAULT TO 1 2$: NEG NMARKS ;SET COUNT TO NEGATIVE ;AND FALL THROUGH ; ; ; SPACE THE TAPE ; SPACE: MOV NMARKS,SPCFIL+Q.IOPL ;PLUG COUNT INTO PARAMETER LIST BNE 1$ ;COUNT IS NON-ZERO INC SPCFIL+Q.IOPL ;ELSE, DEFAULT TO ONE 1$: DIR$ #SPCFIL ;AND DO IT BR DONCHK ; SPCFIL: QIOW$ IO.SPF,TAPLUN,1,,TAPSTAT,,<1> ;SPACE FILES ; ; ; CHECK FOR FUNCTION COMPLETE ; DONCHK: TSTB TAPSTAT ;WELL...? BPL 1$ ;OKAY SO FAR JMP TAPERR ;ELSE, BYE BYE, BABY 1$: CMPB #IS.PND,TAPSTAT ;PENDING COMPLETEION? BEQ 1$ ;YES, SIT ON IT JMP EXIT EXIT: DIR$ #DONE ;FLASH THE MESSAGE EXIT$S ;AND GO ; ; ; MESSAGE TEXTS ; ; DONE: QIOW$ IO.WLB,TILUN,1,,,, DONMSG: .ASCII /FUNCTION COMPLETE/<7> DNMSGL=.-DONMSG ; SYNERR: QIOW$ IO.WLB,5,5,,,,<1$,23.,40> 1$: .ASCII / *** SYNTAX ERROR ***/<7><12> .EVEN ; DEVERR: QIOW$ IO.WLB,5,5,,,,<1$,44.,40> 1$: .ASCII / *** DEVICE MUST BE MS0: - MS3: ***/<7><12> .EVEN ; TERROR: QIOW$ IO.WLB,TILUN,1,,,, TERMSG: .BYTE 7,7,7,7 .ASCII ?***** I/O ERROR # ? TERRNO: .ASCII / ON MAG TAPE UNIT / TUNIT: .ASCII / ./ .BYTE 7,7,7,7 TEMSGL=.-TERMSG .EVEN ; ; ; SWTBL: CSI$SW RW,1,SWMASK,SET,,,EXACT CSI$SW UN,2,SWMASK,SET,,,EXACT CSI$SW FS,4,SWMASK,SET,,ARG,EXACT CSI$SW BS,10,SWMASK,SET,,ARG,EXACT CSI$SW EOF,20,SWMASK,SET,,ARG,EXACT CSI$ND ARG: CSI$SV DECIMAL,NMARKS,2 CSI$ND ; NMARKS: .WORD 1 ;COUNT OF TAPE MARKS TO SKIP OR WRITE ; TAPSTAT: ;TAPE I/O STATUS BLOCK .BLKW 2 ; SWMASK: .WORD 0 ;SWITCH MASK ; ; GCLBLK: GCMLB$ 1,TMV,,TILUN ;GCML CONTROL BLOCK ; CSIBLK: .BLKB C.SIZE ;CSI CONTROL BLOCK ; ; ; ; ; ; ; ; DIRECTIVES ; ATTACH: QIOW$ IO.ATT,TAPLUN,1 ;ATTACH TAPPUT SENSE: QIOW$ IO.SEC,TAPLUN,1,,TAPSTAT ;SENSE CHARACTERISTICS MOUNT: QIOW$ IO.SMO,TAPLUN,1,,,,<4000> ;SET CHARACTERISTICS AND MOUNT ONLERR: QIOW$ IO.WLB,5,1,,,, ;SELECT ERROR MSG ; ; ; TEXT AND ERROR MESSAGES ; ONLMSG: .ASCII /** TAPE UNIT NOT ONLINE **/<7> OLMSGL=.-ONLMSG .EVEN ; ; ; ; ; .END START