  	.TITLE	USR$SHARE
  	.IDENT	/1.0/
;
;	FUNCTION USR$SHARE (%STDESC DEVNAM : STRING ;
;		             %IMMED  SHARE : INTEGER;
;			     %IMMED PIDNEW : INTEGER): INTEGER ; EXTERN ;
;
;	DESCRIPTION:
;		Make the named device shareable or non sharable.
;
;	PARAMETERS:
;	  DEVNAM : The string descriptor of the device name. It must be
;		   in the format XXXN: where XXX is the controller name.
;	  SHARE  : If 0 then make non shared, if 1 then make shared. 
;	  PIDNEW : The owner pid to set (0 allows shared operation)
;
  	$DDBDEF			;DEVICE DATA BLOCK EQUATES
  	$UCBDEF			;UNIT CONTROL BLOCK DEFINITIONS
  	$DIBDEF
        $DEVDEF

  	.PSECT	USR$SHARE_DATA	PIC,NOSHR,NOEXE,LONG
UNITNUM:.LONG	0
SETMSK:	.LONG	0
DEVNAM:	.QUAD	0
PIDNEW: .LONG	0

  	.PSECT	USR$SHARE_CODE	PIC,SHR,EXE,NOWRT,LONG

  	.ENTRY	USR$SHARE	^M<R2,R3,R4,R5,R6,R7,R8>

  	CLRQ	DEVNAM			;CLEAR THE NAME 
  	MOVL	4(AP),R2		;GET THE STRING ADDRESS 
  	MOVL	4(R2),R2		;GET THE ADDRESS OF THE CHARACTERS
  	MOVB	#3,DEVNAM		;MAKE <03>XXX
  	MOVB	0(R2),DEVNAM+1		
  	MOVB	1(R2),DEVNAM+2
  	MOVB	2(R2),DEVNAM+3
  	SUBB3	#48,3(R2),R3		;GET THE UNIT NUMBER
  	BLSS	10$			;IF NEGATIVE THEN ERROR IN NAME 
  	MOVZBL	R3,UNITNUM		;INTO UNIT NUMBER
        CMPW    UNITNUM,#9		;COMPARE TO MAX ALLOWED
 	BGEQ    10$			;IF TO BIG THEN SKIP 
  	MOVL	8(AP),SETMSK		;GET THE SET/RESET MASK
  	MOVL	12(AP),PIDNEW		;GET THE NEW PID VALUE

  	$CMKRNL_S ROUTIN=SHAREIT	;GO DO SHARE IN KERNAL MODE 
  	RET

10$:	MOVL	#SS$_NOSUCHDEV,R0	;ERROR NO SUCH DEVICE 
  	RET

SHAREIT:.WORD	^M<R2,R3,R4,R5,R6,R7,R8>
  	MOVL	IOC$GL_DEVLIST,R5		;GET ADDRESS OF FIRST DDB 
10$:	
	CMPC3	#8,DEVNAM,DDB$T_NAME(R5)	;COMPARE TO CONTROLLER NAME
  	BEQL	20$				;IF EQUAL THEN FOUND
  	MOVL	DDB$L_LINK(R5),R5		;GET THE NEXT DDB 
  	BNEQ	10$				;LOOP AGAIN 
15$:	MOVL	#SS$_NOSUCHDEV,R0		;SET NOT FOUND ERROR
  	RET

20$:	
	MOVL	DDB$L_UCB(R5),R5		;GET THE FIRST UCB IN LIST 
  	BEQL	15$				;IF NONE THEN ERROR 
22$:	CMPW	UNITNUM,UCB$W_UNIT(R5)		;COMPARE TO NUMBER IN UCB 
   	BEQL	25$				;IF EQUAL THEN FOUND
  	MOVL	UCB$L_LINK(R5),R5		;GET THE NEXT IN THE LIST 
  	BEQL	15$				;IF ZERO THEN NOT FOUND
  	BRB	22$				;ELSE KEEP LOOKING

25$:	BLBS	SETMSK,30$			;IF SET THEN SET SHARE 
  	BBCC	#DEV$V_SHR,UCB$L_DEVCHAR(R5),35$	;ELSE SET NOT SHARED
  	BRB	35$
30$:	BBSS	#DEV$V_SHR,UCB$L_DEVCHAR(R5),35$
35$:	MOVL	#SS$_NORMAL,R0			;SET DONE OK 
  	MOVL	PIDNEW,UCB$L_PID(R5)		;SET THE NEW PID
  	RET

;
;	FUNCTION USR$EXIT (%IMMED PROCEDURE EXITPROC ;
;			   VAR    EXTBLK : EXITBLK   ): INTEGER ; EXTERN ;
;
;	DESCRIPTION:
;	 	Define an exit handler procedure entry .
;
;	PARAMETERS:
;	  EXITPROC  	: (IN) The procedure address of the exit handler.
;	  EXTBLK	: (IN/OUT) The exit block associated with the 
;			  exit condition. It must be of the following type.
;			  EXITBLK = RECORD 
;			    FLINK : INTEGER ;
;			    EXTADR: INTEGER ;
;			    APREG : INTEGER ;
;			    RSNADR: ^INTEGER
;			    END;
;
  	.PSECT USR$SHARE_CODE	PIC,SHR,EXE,NOWRT,LONG

  	.ENTRY	USR$EXIT	^M<R2,R3,R4,R5,R6,R7,R8>

  	MOVL	8(AP),R2		;GET THE EXTBLK ADDRESS
  	MOVL	4(AP),4(R2)		;PUT THE ADDRESS INTO THE EXTBLK
  	CLRL	(R2)			;CLEAR THE REST OF THE EXTBLK
  	MOVL	#1,8(R2)		;ONE ARGUMENT FOR EXIT PROCEDURE 
  	TSTL	12(R2)			;TEST THE REASON ADDRESS FOR POINTER
  	BNEQ	10$			;IF NON ZERO THEN OK
  	MOVL	#SS$_ACCVIO,R0		;ELSE GIVE EARLT ACCESS VIOLATION
  	RET

10$:	$DCLEXH_S DESBLK=@8(AP)		;PUSH THE ADDRESS OF THE DESBLK
  	RET
  	.END
