	.TITLE	DEVLST - GET LIST OF DEVICES AND OWNERS

	.LIBRARY	"SYS$LIBRARY:LIB.MLB"

	$DDBDEF
	$UCBDEF

; ARG BLOCK OFFSETS FOR DEVLST

	DL.DEV=	4			;DEVICE NAME
	DL.UNT=	8			;UNIT NUMBER
	DL.PID=	12			;OWNER PID
	DL.UIC=	16			;OWNER UIC
	DL.EOF=	20			;EOF FLAG

DDBPTR:	.BLKL	1			;POINTER TO NEXT DDB
UCBPTR:	.BLKL	1			;POINTER TO NEXT UCB
CURDDB:	.BLKL	1			;CURRENT DDB ACCRESS
CURUCB:	.BLKL	1			;CURRENT UCB ADDRESS
UNIT:	.BLKL	1			;UNIT NUMBER
CHAR:	.BLKL	1			;DEVICE CHARACTERISTICS
DEVPID:	.BLKL	1			;OWNER PID
OWNUIC:	.BLKL	1			;OWNER UIC
NAMLEN:	.BLKL	1			;DEVICE NAME STRING LENGTH
NAMSTR:	.BLKL	4			;DEVICE NAME STRING STORAGE

	.SBTTL	DEVINI - INITIALIZE NEEDED STUFF

;
; CALL:	CALL DEVINI
;

	.ENTRY	DEVINI,0

; HERE TO SET INITIAL CONDITIONS

	$CMKRNL_S	10$		;I NEED TO BE IN KERNAL MODE
	CLRL	UCBPTR			;RESET POINTER
	RET				;RETURN
10$:	.WORD	^M<R4>
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOLOCKR		;LOCK DATA BASE FOR READ
	MOVAL	@#IOC$GL_DEVLIST-DDB$L_LINK,DDBPTR	;GET BASE OFFSET
	JSB	SCH$IOUNLOCK		;RELEASE DATA BASE
	SETIPL	#0			;RESTORE IPL
	RET				; AND RETURN FOR NOW
	.PAGE
	.SBTTL	DEVLST - GET DEVICE NAME, UCB, DDB, AND PID

;
; CALL:	CALL DEVLST(DEVNAM,UNIT,PID,UIC,EOFLAG)
;
; WHERE:
;
;	DEVNAM	- DEVICE NAME DESCRIPTOR
;	UNIT	- UNIT NUMBER
;	PID	- OWNER'S PID
;	UIC	- OWNER'S UIC
;	EOFLAG	- 0=MORE TO COME
;		  1=NO MORE
;

	.ENTRY	DEVLST,^M<R2,R3,R4,R5>

; HERE TO GET A DDB AND ALL UNITS ATTACHED

	$CMKRNL_S	10$		;GET ME INTO KERNAL MODE
	ADDL3	#4,NAMLEN,R2		;GET STR LEN + COUNT LEN
	MOVC3	R2,NAMLEN,@DL.DEV(AP)	;SAVE NAME & LENGTH
	MOVL	UNIT,@DL.UNT(AP)	;SAVE UNIT NUMBER
	MOVL	DEVPID,@DL.PID(AP)	;SAVE PID
	MOVL	OWNUIC,@DL.UIC(AP)	;SAVE OWNER'S UIC
	CLRL	@DL.EOF(AP)		;SAY MORE
	TSTL	DDBPTR			;WAS I RIGHT?
	BNEQ	5$			;YES, XFER
	MOVL	#1,@DL.EOF(AP)		;NO, SET NO MORE
5$:	RET				;RETURN
10$:	.WORD	^M<R2,R3,R4,R5,R6>
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOLOCKR		;LOCK DATA BASE
LOOP1:	MOVL	DDBPTR,R2		;GET ADDR OF DDB
	MOVL	DDB$L_LINK(R2),R2	;GET VALID DDB
	BEQLU	DONE			;XFER IF DONE
	MOVL	R2,CURDDB		;SAVE CURRENT DDB ADDRESS
	TSTL	UCBPTR			;STARTING?
	BNEQ	LOOP2			;NO, SKIP NEXT
	MOVAL	DDB$L_UCB-UCB$L_LINK(R2),UCBPTR	;SAVE UCB POINTER
LOOP2:	MOVL	UCBPTR,R3		;GET ADDR OF UCB
	MOVL	UCB$L_LINK(R3),R3	;GET VALID UCB
	BEQLU	NXTDDB			;SET TO NEXT DDB
	MOVL	R3,CURUCB		;SAVE CURREBT UCB ADDRESS
	MOVZBL	DDB$T_NAME(R2),R4	;GET STRING LENGTH
	MOVL	R4,NAMLEN		;SAVE FOR LATER
	MOVZWL	UCB$W_UNIT(R3),UNIT	;SAVE UNIT
	MOVL	UCB$L_PID(R3),DEVPID	;SAVE PID FOR LATER
	MOVZWL	DEVPID,R5		;GET INDEX
	MOVL	@#SCH$GL_PCBVEC,R6	;GET PCB TABLE ADDRESS
	MOVL	(R6)[R5],R6		;GET ADDR OG OWNER PCB
	MOVL	PCB$L_UIC(R6),OWNUIC	;SAVE OWNER UIC
	MOVL	R3,UCBPTR		;SET FOR NEXT
	MOVC3	R4,DDB$T_NAME+1(R2),NAMSTR	;GET DEVICE NAME
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOUNLOCK		;UNLOCK DATA BASE
	SETIPL	#0			;RESET IPL
	RET				;RETURN
NXTDDB:	MOVL	R2,DDBPTR		;SAVE NEW POINTER
	CLRL	UCBPTR			;RESET POINTER
	BRW	LOOP1			;GO GET NEXT
DONE:	CLRL	DDBPTR			;MARK END
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOUNLOCK		;UNLOCK DATA BASE
	SETIPL	#0			;RESET IPL
	RET				;RETURN
	.PAGE
	.SBTTL	OFFLIN - SET A DEVICE OFFLINE

;
; CALL:	CALL OFFLIN
;
	.ENTRY	OFFLIN,0

; HERE I GO...

	$CMKRNL_S	10$		;ENTER KERNAL MODE
	RET				;RETURN
10$:	.WORD	^M<R3,R4>
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOLOCKW		;LOCK DATA BASE
	MOVL	CURUCB,R3		;GET POINTER TO CURRENT
	BICW2	#UCB$M_ONLINE,UCB$W_STS(R3)	;SET OFFLINE
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOUNLOCK		;UNLOCK DATA BASE
	MOVL	#SS$_NORMAL,R0		;SET RETURN CODE
	RET				; AND RETURN
	.PAGE
	.SBTTL	ONLINE - SET A DEVICE ONLINE

;
; CALL:	CALL ONLINE
;

	.ENTRY	ONLINE,0

; HERE I GO!

	$CMKRNL_S	10$		;ENTER KERNAL MODE
	RET				;RETURN
10$:	.WORD	^M<R3,R4>
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOLOCKW		;LOCK DATA BASE
	MOVL	CURUCB,R3		;GET POINTER TO CURRENT
	BISW2	#UCB$M_ONLINE,UCB$W_STS(R3)	;SET ONLINE
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOUNLOCK		;UNLOCK DATA BASE
	MOVL	#SS$_NORMAL,R0		;SET RETURN CODE
	RET				; AND RETURN
	.PAGE
	.SBTTL	SETDEP - SET CHARACTERISTICS OF A DEVICE

;
; CALL:	CALL SETDEP(CHAR)
;
; WHERE:
;
;	CHAR	- 32 BIT CHARACTERISTICS WORD
;

	.ENTRY	SETDEP,0

; GO TO IT...

	MOVL	@4(AP),CHAR		;GET CHARACTERISTICS
	$CMKRNL_S	10$		;GO DO USEFUL STUFF
	RET				;RETURN WHEN DONE
10$:	.WORD	^M<R3,R4>
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOLOCKW		;LOCK DATA BASE
	MOVL	CURUCB,R3		;GET ADDR OF CURRENT UCB
	MOVL	CHAR,UCB$L_DEVDEPEND(R3)	;SET NEW CHARACTERISTICS
	MOVL	@#SCH$GL_CURPCB,R4	;GET ADDR OF CURRENT PCB
	JSB	SCH$IOUNLOCK		;UNLOCK DATA BASE
	RET				;RETURN

	.END
