.TITLE DVC - DEVICE CHECK AND ALLOCATE WHEN AVAILABLE .MCALL DIR$,GMCR$,QIOW$C,WTSE$C,MRKT$C,SPWN$ .MCALL EXIT$S,GLUN$C,QIOW$S,QIO$C,ASTX$S .NLIST BEX .NLIST ME ; ; DEVICE CHECK AND ALLOCATE WHEN AVAILABLE ; ; THIS TASK WILL ALLOW YOU TO CHECK THE STATUS OF ANY ALLOCATEABLE ; DEVICE AND PRINT THAT STATUS, OR WAIT AND ALLOCATE THE DEVICE AS ; SOON AS IT IS AVAILABLE. THE CALL IS AS FOLLOWS: ; ; DVC [//...] ; ; AUTHOR - STEPHEN RAINIER DATE - 19MAR82 ; .MACRO DSWERR BCC .+10 MOV $DSW,R0 EMT 50 .ENDM .PAGE ; ; STORAGE DEFINITIONS ; ALL: .ASCII /ALL / ;ALLOCATE COMMAND DEV: .ASCII /DK/ ;DEVICE NAME UNIT: .ASCII /0:/ ;UNIT NUMBER .ASCII / / ALLL = .-ALL ;LENGTH OF COMMAND .EVEN CLR: .ASCII /CLR/ ;CLEAR THE SCREEN CLRL = .-CLR ;LENGTH .EVEN ATT: .ASCII /ATT / ;DEVICE IS ATTACHED BSY: .ASCII /BSY / ;UNIT IS BUSY MOU: .ASCII /MOU / ;DEVICE IS MOUNTED MOM: .ASCII /MDM / ;DEVICE MARKED FOR DISMOUNT WCK: .ASCII /WCK / ;DEVICE WRITE CHECK ENABLED SPU: .ASCII /SPU / ;DEVICE IS SPINNING UP PUB: .ASCII /PUB / ;DEVICE IS PUBLIC OFL: .ASCII /OFL / ;DEVICE IS OFF-LINE PSE: .ASCII /PSE / ;PSEUDO DEVICE BRO: .ASCII /BRO / ;BROADCAST COMMAND .ASCII /TT/ TTY: .ASCII /XX: DEVICE / DV: .ASCII /DK/ UNT: .ASCII /0: / .ASCII /IS AVAILABLE AND ALLOCATED TO YOU!/ BROL = .-BRO .EVEN SYN: .ASCII /DVC>SYNTAX ERROR/ ;SYNTAX ERROR MESSAGE SYNL = .-SYN .EVEN DERR: .ASCII /DVC>NON-EXISTENT DEVICE ERROR/ ;DEVICE DOES NOT EXIST DERRL = .-DERR .EVEN PRM: .ASCII /#/ PRML = .-PRM .EVEN CMDLIN: GMCR$ ;MCR COMMAND LINE ALSPWN: SPWN$ MCR...,,,,,3,,,ALL,ALLL,0,TT ;ALLOCATE COMMAND BRSPWN: SPWN$ MCR...,,,,,3,,,BRO,BROL,0,TT ;BROADCAST COMMAND CLSPWN: SPWN$ MCR...,,,,,3,,,CLR,CLRL,0,TT ;CLEAR COMMAND TNMB: .BLKW 10. ;GET TTY NUMBER LEGDEV: .WORD "DM,"DK,"MT,"LP,"DL ;LEGAL DEVICES DEVL = 5 ;# OF LEGAL DEVICES STSLIN: .BLKW 160. ;DEVICE STATUS LINE STSL: .WORD 160. ;LENGTH AFLG: .WORD 0 ;ALLOCATE FLAG LFLG: .WORD 0 ;LOOP FLAG WFLG: .WORD 0 ;WILDCARD FLAG TMP: .WORD 0 ;TEMPORARY EXT: .BLKW 5 ;EXIT STATUS BLOCK .PAGE ; ; START OF MAIN CODE ; START: DIR$ #CMDLIN ;GET COMMAND LINE BCC GOTCMD ;DID WE GET THE COMMAND LINE? JMP SERR ;OTHERWISE, SYNTAX ERROR GOTCMD: MOV $DSW,R5 ;GET COMMAND LENGTH MOV #CMDLIN+G.MCRB,R0 ;POINT TO COMMAND LINE CMP #5,R5 ;DID WE GET THE MINIMUM BMI 1$ ;OKAY JMP SERR ;NO, SYNTAX ERROR 1$: MOV #40,R4 ;FIND THE 1ST SPACE CALL FIND ;GO GET IT CMPB #'*,(R0) ;IS IT A WILDCARD DEVICE? BNE 2$ ;NO MOV #-1,WFLG ;FLAG IT AS WILD BR KEY ;SKIP NAME STORING SINCE WE HAVE NONE 2$: MOVB (R0),DV ;SAVE DEVICE NAME MOVB (R0)+,DEV ; MOVB (R0),DV+1 ; MOVB (R0)+,DEV+1 ; KEY: MOV #57,R4 ;SEARCH FOR "/" CALL FIND ;GO FIND ONE CMPB #'A,(R0) ;ALLOCATE BEQ 1$ ;YES CMPB #'L,(R0) ;LOOP PRINTING STATUS BEQ 2$ ;YES JMP SERR ;UNIDENTIFIED 1$: MOV #-1,AFLG ;FLAG TST WFLG ;NO ALLOCATE ALLOWED WITH WILDCARD BNE SERR ;IF ALLOCATE & WILD, SYNTAX ERROR BR KEY ;LOOK FOR MORE 2$: MOV #-1,LFLG ;FLAG BR KEY ;LOOK FOR MORE FIND: CMPB R4,(R0)+ ;LOOK FOR PARTICULAR CHR BEQ 1$ ;GOT ONE SOB R5,FIND ;LOOP UNITL DONE JMP CONT ;CONTINUE AFTER PROCESSING ALL 1$: DEC R5 ;COUNT IT RETURN ;AND RETURN SERR: QIOW$C IO.WVB,5,1,,,, ;SIGNAL SYNTAX ERROR EXIT$S DEVR: QIOW$C IO.WVB,5,1,,,, ;SIGNAL ILLEGAL DEVICE EXIT$S .PAGE ; ; HAVE COMPLETED PROCESSING COMMAND LINE ; CONT: GLUN$C 5,TNMB ;GET TTY NUMBER OF US DSWERR MOVB TNMB+G.LUNU,R1 ;GET OUR TTY NUMBER BIC #177760,R1 ;AND THAT ONLY MOV R1,ALSPWN+S.PWVT ;SAVE IN COMMANDS MOV R1,BRSPWN+S.PWVT ; MOV R1,CLSPWN+S.PWVT ; MOV R1,R0 ;CALC ASCII EQUIVALENT ASH #-3,R0 ;GET OCTAL TEN'S DIGIT BIC #177770,R1 ;GET ONE'S DIGIT ADD #60,R0 ;MAKE THEM ASCII ADD #60,R1 ; MOVB R0,TTY ;SAVE IN BROADCAST COMMAND MOVB R1,TTY+1 ; TST WFLG ;WILDCARD DEVICE? BNE 2$ ;IF WILDCARD, NO DEVICE CHECK MOV #LEGDEV,R0 ;POINT TO LEGAL DEVICES MOV #DEVL,R1 ;GET # OF DEVICES 1$: CMP DEV,(R0)+ ;IS THIS A LEGAL DEVICE? BEQ 2$ ;GOT A MATCH SOB R1,1$ ;OTHERWISE, KEEP CHECKING JMP DEVR ;NEVER GOT A MATCH 2$: TST LFLG ;PRINT CONTINUOUS STATUS BEQ 3$ ;NO JMP LOOP ;GO PROCESS 3$: TST AFLG ;GOT AN ALLOCATE COMMAND BEQ 4$ ;NO JMP ALLOC ;GO PROCESS 4$: JSR R5,ONCE ;OTHERWISE PRINT ONCE EXIT$S ;AND EXIT .PAGE ; ; LOOP AND CONTINUE PRINTING STATUS ; LOOP: JSR R5,ONCE ;GO GET STATUS MOV TMP,R3 ;GET BACK UNIT # TST AFLG ;WANTED AN ALLOCATE, TOO? BEQ LP2 ;NO, JUST PRINT STATUS TST R2 ;IF ALLOCATE, DID WE GET ONE? BEQ LP2 ;NO, JUST PRINT STATUS JMP ALL2 ;GOT ONE, GO GET IT LP2: QIO$C IO.ATA,5,,,,, ;SET UP FOR INPUT DSWERR MRKT$C 7,2,2 ;WAIT 2 SECONDS DSWERR WTSE$C 7 ;WAIT TIL COMPLETE DSWERR QIO$C IO.DET,5,,,,, ;DETACH FROM TERMINAL DSWERR DIR$ #CLSPWN ;CLEAR THE SCREEN DSWERR WTSE$C 3 ;WAIT FOR IT DSWERR JMP LOOP ;LOOP FOREVER EXTR: EXIT$S ;GET OUT INPAST: TST (SP)+ ;COME HERE IF INPUT EXIT$S ;EXIT ON ANY INPUT ASTX$S ;AND RETURN FROM AST .PAGE ; ; PRINT STATUS ONCE ; ONCE: TST WFLG ;WILDCARD DEVICE? BEQ ONC2 ;NO, GO GET THE RIGHT ONE MOV #LEGDEV,R0 ;POINT TO TABLE OF DEVICES MOV #DEVL,R1 ;AND THE # OF DEVICES WILD: MOV (R0)+,DEV ;GET A DEVICE NAME TO PROCESS MOV R0,-(SP) ;SAVE ON STACK MOV R1,-(SP) ; ONC2: MOV #STSLIN,R4 ;POINT TO BUFFER CALL CHKDEV ;GET THE STATUS MOV R3,TMP ;SAVE IT FOR POSSIBLE ALLOCATE MOV R4,R3 ;CALC LENGTH SUB #STSLIN,R3 ; MOV R3,STSL ;SAVE LENGTH QIOW$S #IO.WVB,#5,#1,,,,<#STSLIN,STSL,40> ;PRINT THE STATUS DSWERR TST WFLG ;ARE WE WORKING A WILDCARD? BEQ 3$ ;NO MOV (SP)+,R1 ;IF YES, POP THE STACK MOV (SP)+,R0 ; SOB R1,WILD ;LOOP FOR ALL DEVICES 3$: RTS R5 ;AND RETURN .PAGE ; ; ALLOCATE ANY AVAILABLE DEVICE ; ALLOC: MOV #STSLIN,R4 ;POINT TO A BUFFER CALL CHKDEV ;CHECK THE DEVICE UNITS TST R2 ;IS ONE AVAILABLE BEQ WAIT ;NO, SO WAIT A MINUTE ; OPTIONAL ENTRY POINT FROM "LOOP" ALL2: ADD #60,R3 ;GET ASCII OF UNIT NUMBER MOVB R3,UNIT ;STORE IN ALL COMMAND MOVB R3,UNT ;STORE IN BRO COMMAND DIR$ #ALSPWN ;DO THE ALLOCATE DSWERR WTSE$C 3 ;WAIT FOR IT TO COMPLETE DSWERR DIR$ #BRSPWN ;TELL THE USER HE GOT ONE DSWERR WTSE$C 3 ;WAIT FOR IT TO COMPLETE DSWERR EXIT$S ;AND EXIT WAIT: MRKT$C 7,1,3 ;WAIT A MINUTE DSWERR WTSE$C 7 ;WAIT FOR THE COMPLETE DSWERR BR ALLOC ;LOOP FOREVER .PAGE ; ; CHECK THE DEVICE STATUS FOR ALL UNITS ; CHKDEV: MOV $DEVHD,R0 ;POINT TO DCB TABLE CLR R3 ;START WITH UNIT 0 CHK2: CMP DEV,D.NAM(R0) ;IS THIS THE DEVICE WE WANT BEQ 1$ ;YES, SO CHECK DEVICE JMP NXTDV ;NO, SO GET NEXT DEVICE 1$: BISB D.UNIT(R0),R3 ;OR WHATEVER IS FIRST MOV D.UCB(R0),R1 ;GET THE 1ST UCB CHKLP: MOV #" ,(R4)+ ;SPACE OVER MOV DEV,(R4)+ ;GET DEVICE NAME MOV R3,R2 ;GET UNIT # ADD #60,R2 ;MAKE IT ASCII MOVB R2,(R4)+ ;STORE IT MOVB #':,(R4)+ ;EVEN IT UP MOV #" ,(R4)+ ;SPACE SOME MORE MOV #-1,R2 ;ASSUME ITS AVAILABLE TST U.OWN(R1) ;ATTACHED TO SOMEBODY? BEQ 3$ ;NO MOV #"TT,(R4)+ ;SEND TTY OF OWNER MOV R5,-(SP) ;SAVE R5 MOV U.OWN(R1),R5 ;GET TTY UCB CALL TTYCLC ;GO CALC UNIT NUMBER MOV R5,R2 ;COPY TTY NUMBER BIC #177770,R5 ;GET ONE'S DIGIT ASH #-3,R2 ;GET TEN'S DIGIT ADD #60,R5 ;MAKE THEM ASCII ADD #60,R2 ; MOVB R2,(R4)+ ;STORE THE TTY NUMBER MOVB R5,(R4)+ ; MOV (SP)+,R5 ;POP THE STACK MOV #": ,(R4)+ ;FINISH IT UP MOV ATT,(R4)+ ;SAY ITS ATTACHED MOV ATT+2,(R4)+ ; CLR R2 ;NOT AVAILABLE IF ATTACHED 3$: BITB #US.BSY,U.STS(R1) ;IS IT BUSY? BEQ 1$ ;NO CLR R2 ;NOT AVAILABLE IF BUSY MOV BSY,(R4)+ ;BUSY STATUS MOV BSY+2,(R4)+ ; 1$: BITB #US.MNT,U.STS(R1) ;IS IT UNMOUNTED? BNE 2$ ;YES CLR R2 ;NOT AVAILABLE IF MOUNTED MOV MOU,(R4)+ ;MOUNTED STATUS MOV MOU+2,(R4)+ ; .PAGE 2$: BITB #US.MDM,U.STS(R1) ;IS IT WAITING FOR DISMOUNT? BEQ 4$ ; CLR R2 ;NOT AVAILABLE UNTIL DISMOUNTED MOV MOM,(R4)+ ;WAITING DISMOUNT STATUS MOV MOM+2,(R4)+ ; 4$: BITB #US.WCK,U.STS(R1) ;WRITE CHECK ENABLED BEQ 5$ ;NO MOV WCK,(R4)+ ;WRITE CHECK ENABLED STATUS MOV WCK+2,(R4)+ ; 5$: BITB #US.SPU,U.STS(R1) ;SPINNING UP? BEQ 6$ ;NO MOV SPU,(R4)+ ;SPIN UP STATUS MOV SPU+2,(R4)+ ; 6$: BITB #US.PUB,U.ST2(R1) ;IS IT A PUBLIC DEVICE BEQ 7$ ;NO CLR R2 ;NOT AVAILABLE IF PUBLIC MOV PUB,(R4)+ ;PUBLIC DEVICE STATUS MOV PUB+2,(R4)+ ; 7$: BITB #US.OFL,U.ST2(R1) ;IS IT OFF-LINE? BEQ 10$ ;NO CLR R2 ;NOT AVAILABLE IF OFF-LINE MOV OFL,(R4)+ ;OFF-LINE STATUS MOV OFL+2,(R4)+ ; 10$: BIT #DV.PSE,U.CW1(R1) ;IS IT A PSEUDO DEVICE? BEQ 11$ ;NO CLR R2 ;NOT AVAILABLE IF PSEUDO MOV PSE,(R4)+ ;PSUEDO DEVICE STATUS MOV PSE+2,(R4)+ ; 11$: MOVB #15,(R4)+ ;CARRIAGE RETURN MOVB #12,(R4)+ ;LINE FEED TST AFLG ;ARE WE ALLOCATING? BEQ 12$ ;NO, SO CONTINUE TST R2 ;IF ALLOCATING, IS IT AVAILABLE BEQ 12$ ;NO, SO CONTINUE RETURN ;IF ALL, THEN RETURN UNIT # IN R3 12$: INC R3 ;CHECK NEXT UNIT NUMBER ADD D.UCBL(R0),R1 ;GET THAT UCB CMPB D.UNIT+1(R0),R3 ;AT THE END BMI NXTDV ;IF PAST END, GET NEXT DEVICE JMP CHKLP ;OTHERWISE, KEEP LOOPING NXTDV: MOV D.LNK(R0),R0 ;POSSIBLY MORE UNITS UNDER OTHER DCB BEQ 1$ ;LOOP THRU ALL DCB'S JMP CHK2 ; 1$: RETURN ;RETURN WHEN DONE