.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 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 ; 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 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 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 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 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