.TITLE $FDUCB - FIND UCB .IDENT /02.1/ ; ; COPYRIGHT (C) 1976, 1977 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION: 02 ; BY: H. LEV ; DATE: 11/15/73 ; MODIFIED: 12/23/74 ADD LOGICAL DEVICE CONTROL BLOCKS SEARCH ; 3/10/75 SWITCH TO SYSTEM STATE FOR DEVICE LIST SEARCH ; EB051 5/24/77 ADD $FDLGG TO ALLOW SPECIFICATION OF ; DEVICE UNIT NUMBER IN BINARY (SEE $FILBN) ; PL015 1-DEC-77 ADD SUPPORT FOR 3 DIGIT UNIT NUMBERS ; ; ;+ ; *** - $FDUCB - FIND UCB FOR PHYSICAL DEVICE ; *** - $FDLOG - FIND UCB ADDRESS OR LOGICAL DEVICE ; *** - $FDLGG - FIND UCB ADDRESS OR LOGICAL DEVICE ; EB051 ; ; THIS SUBROUTINE PARSES THE DEVICE SPECIFIER FROM THE ; COMMAND STRING AND SEARCHES FOR THE DEVICE IN THE DEVICE TABLES ; $FDLOG STARTS SEARCHING THE LOGICAL DEVICE CONTROL BLOCKS ; AND IF IT DOESN'T FIND THE DEVICE IT THE GOES TO THE ; UNIT CONTROL BLOCKS. $FDUCB SEARCHS THE UNIT CONTROL BLOCKS ONLY./ ; ; INPUT (AT $FDLOG AND $FDUCB): ; EB051 ; R0 - BUFFER ADDRESS ;**-1 ; R3 - PARAMETER AREA ADDRESS - 2 WORDS ; INPUT (AT $FDLGG): ; EB051 ; R1 - BINARY DEVICE UNIT NUMBER ; EB051 ; R2 - ASCII COLON (:) ; EB051 ; R3 - ADDRESS OF PARAMETER AREA (TWO WORDS) ; EB051 ; (R3) - ASCII DEVICE MNEMONIC (TWO CHARACTERS) ; EB051 ; ; OUTPUT: ; CARRY SET - UCB NOT FOUND OR SYNTAX ERROR ; R3 = 0 - SYNTAX ERROR ; R3 <>0 - COULDN'T FIND LCB OR UCB ; CARRY CLEAR - UCB FOUND ; R0 - UPDATED ; R1 - ADDRESS OF UCB ; R2 - ADDRESS OF DCB ; R3 - PARM AREA ADDRESS ; (R3) - DEVICE MNEMONIC IN ASCII ; 2(R3) - UNIT NUMBER IN BINARY ; ;- .PAGE ; MACRO CALLS ; .MCALL DCBDF$,LCBDF$,TCBDF$,UCBDF$ DCBDF$ ;DEFINE DCB OFFSETS LCBDF$ ;DEFINE LCB OFFSETS TCBDF$ ;DEFINE TCB OFFSETS UCBDF$ ;DEFINE UCB OFFSETS .PAGE .ENABL LSB ; EB051 $FDLGG:: MOV #4$,-(SP) ; SET ADDRESS FOR LOGICAL CONTROL BLOCK SCAN ; EB051 BR 240$ ; ; EB051 $FDLOG:: MOV #4$,-(SP) ; SET ADDRESS FOR LOGICAL CONTROL BLOCK SCAN BR 2$ ; $FDUCB:: MOV #9$,-(SP) ; SET ADDRESS FOR PHYSICAL DEVICE SCAN 2$: MOVB (R0)+,(R3) ; GET UNIT MOVB (R0)+,1(R3) ; MNEMONIC CALL $COTB ; GET UNIT NUMBER 240$: ; ; EB051 CMP R1,#256. ; IS IT VALID? BHIS 3$ ; NO, ERROR MOV R1,2(R3) ; AND STORE IT CMPB R2,#': ; COLON MUST FOLLOW IT BNE 3$ ; ERROR, IT DOESN'T JMP @(SP)+ ; START SCAN AT RIGHT SPOT 3$: TST (SP)+ ; POP OFF ROUTINE ADDRESS CLR R3 ; SET SYNTAX ERROR INDICATOR BR 55$ ; ERROR ; ; SCAN LCBS FOR DEVICE ; 4$: CALL $SWSTK,60$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R4 ; GET TASK TCB ADDRESS MOV $LOGHD,R2 ; GET ADDRESS OF START OF LOGICAL UNITS 6$: BEQ 10$ ; END OF LOGICAL UNITS CMP (R3),L.NAM(R2) ; NAMES THE SAME? BNE 7$ ; NO CMPB 2(R3),L.UNIT(R2) ; YES, UNITS THE SAME BNE 7$ ; NO TSTB L.TYPE(R2) ; GLOBAL DEFINITION? BEQ 8$ ; YES CMP T.UCB(R4),L.UCB(R2) ; NO, SAME TI? BEQ 8$ ; YES 7$: MOV L.LNK(R2),R2 ; GET ADDRESS OF NEXT LCB BR 6$ ; LOOP 8$: MOV L.ASG(R2),R1 ; GET UCB ADDRESS MOV U.DCB(R1),R2 ; GET DCB ADDRESS BR 45$ ; ; SCAN UCBS FOR DEVICE ; 9$: CALL $SWSTK,60$ ; SWITCH TO SYSTEM STATE 10$: MOV $DEVHD,R2 ; GET ADDRESS OF DEVICE TABLE 12$: CMP (R3),D.NAM(R2) ; IS THIS THE DEVICE ? BEQ 20$ ; YES 15$: MOV D.LNK(R2),R2 ; NO, POINT TO NEXT DCB BNE 12$ ; GOT ONE BEQ 50$ ; END OF DEVICES, ERROR 20$: MOV 2(R3),R5 ; GET UNIT NUMBER CMPB R5,D.UNIT(R2) ; IS UNIT ON THIS DCB? BLO 15$ ; NO CMPB R5,D.UNIT+1(R2) ; MAYBE BHI 15$ ; NO! CLR R4 ; GET FIRST UNIT NUMBER ; PL015 BISB D.UNIT(R2),R4 ; ; PL015 MOV D.UCB(R2),R1 ; GET FIRST UCB ADDRESS ;**-1 SUB R4,R5 ; COMPUTE RELATIVE UNIT NUMBER BEQ 45$ ; FOUND IT 30$: ADD D.UCBL(R2),R1 ; NO, POINT TO NEXT UCB DEC R5 ; FOUND IT YET? BNE 30$ ; NO, LOOP 45$: MOV R1,4(SP) ; SET USER R1 MOV R2,6(SP) ; SET USER R2 RETURN ; RETURN TO USER STATE 50$: MOV @$HEADR,R3 ; GET USER SP INCB 6(R3) ; SET CARRY BIT IN USER PS ; WORKS BECAUSE CMPB R2,#': CLEARS C ; EB051 55$: SEC ; SET CARRY 60$: RETURN ; .DSABL LSB .END