.TITLE REW .IDENT /V1.01/ ;**************************************************************** ; ; REW.TSK ; ; THIS ROUTINE IMPLEMENTS THE "REW" COMMAND VIA THE TASK ...REW. ; THE FUNCTION OF THIS TASK IS TO REWIND AND OPTIONALLY TURN ; OFFLINE A MAGNETIC TAPE DRIVE. ; COMMAND FORMAT IS: ; ; REW DDNN:[/OF] ; ; S.M. THOMPSON ; SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA ; NY 14853 ; ; MAY 14, 1981 ; ;***************************************************************** .MCALL GMCR$,QIOW$,EXST$S,DIR$,ALUN$ LUN1 = 1 ; LUN FOR MAGTAPE I/O LUN2 = 2 ; LUN FOR TERMINAL I/O EFN1 = 1 ; EVENT FLAG FOR MAGTAPE I/O EFN2 = 2 ; EVENT FLAG FOR TI: I/O .MACRO PRINT ERR,ERRSZ MOV #ERR,TIDPB+Q.IOPL .IF B ERRSZ MOV #ERR'SZ,TIDPB+Q.IOPL+2 .IFF MOV ERRSZ,TIDPB+Q.IOPL+2 .ENDC DIR$ #TIDPB .ENDM ; ; ERROR MESSAGES ; .NLIST BEX .ENABL LC ERR1: .ASCII /REW -- Command input error/ ERR1SZ=.-ERR1 ERR2: .ASCII /REW -- Command syntax error/ ERR2SZ=.-ERR2 ERR3: .ASCII /REW -- Illegal device or unit/ ERR3SZ=.-ERR3 ERR4: .ASCII /REW -- Drive is offline/ ERR4SZ=.-ERR4 ERR5: .ASCII /REW -- Magtape attach failure/ ERR5SZ=.-ERR5 ERR6: .ASCII /REW -- Failed to rewind magtape - status = / ERR6A: .BLKB 10. ERR7: .ASCII /REW -- Device not allocated to this terminal/ ERR7SZ=.-ERR7 .EVEN GMCR: GMCR$ ; GET COMMAND LINE DPB BUF = GMCR+2 ; COMMAND BUFFER ALUN: ALUN$ LUN1,MM,0 ; ASSIGN LUN DPB, SET UP FOR MM0: TAPSEL: QIOW$ IO.SEC,LUN1,EFN1,,IOSB TAPATT: QIOW$ IO.ATT,LUN1,EFN1 TAPREW: QIOW$ IO.RWD,LUN1,EFN1 TIDPB: QIOW$ IO.WVB,LUN2,EFN2,,,,<0,0,40> IOSB: .BLKW 2 ; I/O STATUS BLOCK $REWEP: ; XFR ADDRESS DIR$ #GMCR ; GET COMMAND LINE BCC 10$ ; IF CC WE MADE IT PRINT ERR1 ; PRINT COMMAND INPUT ERROR MESSAGE 5$: JMP EXSEV ; EXIT WITH SEVERE ERROR 10$: MOV #BUF,R0 ; GET ADDRESS OF COMMAND LINE BUFFER 20$: CALL $GNBLK ; GET NEXT NON-BLANK CHARACTER BCC 30$ ; IF CC GOOD 25$: PRINT ERR2 ; ELSE COMMAND SYNTAX ERROR BR 5$ ; AND EXIT WITH SEVERE ERROR 30$: TST R1 ; ANY BLANKS SEEN? BEQ 20$ ; IF EQ NO, KEEP LOOKING DEC R0 ; YES, BACKUP POINTER TO FIRST CHARACTER OF ; COMMAND STRING CMPB (R0)+,#'M ; IS IT AN "M"? BEQ 40$ ; IF EQ YES, GOOD 35$: PRINT ERR3 ; SEND ILLEGAL DEVICE MESSAGE BR 5$ ; EXIT WITH SEVERE ERROR 40$: CMPB (R0),#'M ; IS IT AN MM: DEVICE? BEQ 50$ ; IF EQ YES CMPB (R0),#'T ; NO, IS IT AN MT: DEVICE? BNE 35$ ; IF NE NO, SEND ILLEGAL DEVICE MESSAGE AND EXIT MOV #"MT,ALUN+A.LUNA ; SET "MT" DEVICE NAME IN DPB 50$: INC R0 ; STEP PAST LAST LETTER OF NAME CALL $GTNUM ; GET DEVICE NUMBER BCS 25$ ; IF CS, SYNTAX ERROR CMPB R2,#': ; DID IT END WITH A COLON? BNE 25$ ; IF NE NO, SYNTAX ERROR MOV R1,ALUN+A.LUNU ; SAVE DEVICE NUMBER DIR$ #ALUN ; ASSIGN THE LUN TO THE DEVICE BCS 35$ ; IF CS, ILLEGAL DEVICE OR UNIT MOV $HEADR,R1 ; GET OUR HEADER ADDRESS MOV H.LUN+<4*>(R1),R1 ; GET DEVICE UCB ADDRESS MOV $TKTCB,R2 ; GET OUR TCB ADDRESS CMP U.OWN(R1),T.UCB(R2) ; DEVICE ALLOCATED TO THIS TERMINAL? BEQ 55$ ; IF EQ YES PRINT ERR7 ; ELSE SEND ERROR MESSAGE BR EXSEV ; 55$: CMPB (R0),#15 ; END OF LINE (CARRIAGE RETURN)? BEQ 60$ ; IF EQ YES, JUST REWIND CMPB (R0),#33 ; END OF LINE (ESCAPE)? BEQ 60$ ; IF EQ YES, JUST REWIND CMPB (R0)+,#'/ ; NO, SWITCH COMING? BNE 25$ ; IF NE, SYNTAX ERROR, ONLY / IN THIS POSITION CMPB (R0)+,#'O ; FIRST CHARACTER OF SWITCH A "O"? BNE 25$ ; IF NE NO, SYNTAX ERROR CMPB (R0)+,#'F ; IS THE SWITCH "OF"? BNE 25$ ; IF NE NO, SYNTAX ERROR MOV #IO.RWU,TAPREW+Q.IOFN ; /OF, SET FOR REWIND OFFLINE 60$: DIR$ #TAPSEL ; DO A SENSE CHARACTERISTICS BCC 65$ ; IF CC GOOD 62$: PRINT ERR4 ; IF CS ASSUME DRIVE OFFLINE BR EXSEV ; 65$: BIT #700,IOSB+2 ; SELECT ERROR ON DRIVE? BNE 62$ ; IF NE YES DIR$ #TAPATT ; ATTACH THE TAPE DEVICE BCC 70$ ; IF CC OK PRINT ERR5 ; PRINT ATTACH FAILURE MESSAGE BR EXSEV ; AND EXIT WITH SEVERE ERROR STATUS 70$: DIR$ #TAPREW ; REWIND THE TAPE! CMPB #IS.SUC,IOSB ; SUCCESS? BEQ 80$ ; IF EQ YES MOVB IOSB,R1 ; NO, GET I/O STATUS MOV #ERR6A,R0 ; AND PLACE TO STUFF IT CLR R2 ; NO LEADING ZEROES CALL $CBDSG ; CONVERT TO SIGNED DECIMAL MOVB #'.,(R0)+ ; AND INSERT A DECIMAL POINT SUB #ERR6,R0 ; COMPUTE MESSAGE LENGTH PRINT ERR6,R0 ; PRINT REWIND FAILURE MESSAGE BR EXSEV ; AND EXIT WITH SEVERE ERROR 80$: EXST$S #EX$SUC ; THAT'S IT, EXIT EXSEV: EXST$S #EX$SEV ; ERROR EXIT POINT .END $REWEP