.TITLE IASDEV .IDENT /V01.00/ ; .ENABLE LC .NLIST BEX ; .REM % Credits: This program is originally derived from the IASWHO program distributed on the IAS V3.0 objects tapes. The IASWHO as distributed, however, had the major flaw of not inhibiting task switching, and therefore usually bombed out. The user information was split out and incorporated with the LEVELS program originally from The Jackson Labs. This program still does not inhibit task switching, but as the data structures in use here are usually static, few problems are encountered. Current Author- John Hayes Allen-Bradley Company 747 Alpha Drive Cleveland, Ohio 44143 216-449-6700 % .SBTTL BUILDING 'IASDEV' ; ; ; MACRO COMMAND LINE: ; .REM % MAC/LI:IASDEV IASDEV % ; ; TASK BUILD COMMAND FILE: ; .REM % LINK/MULTI/PRIV/NOFLO/OPT IASDEV TASK=$$$DEV UIC=[1,1] LIBR=IASCOM:RO STACK=32 // % .SBTTL SYSTEM CALLS AND LOCAL MACROS ; .MCALL QIOW$,DIR$,EXIT$S,GTIM$S ; ; ; LOCAL MACROS .MACRO PRINT MESSAG MOV R1,-(SP) ; SAVE R1-R4 MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV #OUTLIN,R0 ; ADDRESS OF OUTPUT BUFFER MOV #MESSAG,R1 ; MESSAGE LIN TO EDIT MOV #ARGBLK,R2 ; CONVERSION VARIABLES CALL $EDMSG ; CALL SYSLIB FUNCTION MOV #OUTLIN,TERQIO+Q.IOPL+0 ; LINE TO PRINT MOV R1, TERQIO+Q.IOPL+2 ; R1 CONTAINS SIZE OF LINE DIR$ #TERQIO ; PRINT LINE MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 ; RESTORE R1-R4 .ENDM PRINT ; .MACRO TTNUM ; THIS IS NECESSARY BECAUSE $EDMSG DOESN'T ALLOW BINARY TO OCTAL ; WITH ZERO SUPPRESSION. MOV R0,-(SP) ; SAVE R0 AS IT IS ARGBLK POINTER MOV R1,-(SP) MOV R2,-(SP) MOV #BUFFER+4,R0 ; ADDRESS AFTER TERMINAL NUMBER MOVB #' ,BUFFER+5 ; BLANK OUT UNWANTED CHAR MOVB I.TT(R5),R1 ; TERMINAL NUMBER TO CONV CLR R2 ; SET ZERO SUPPRESSION CALL $CBOMG ; CONVERSION ROUTINE MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .ENDM TTNUM ; .MACRO USRNAM MOV I.DN(R5),BUFFER+2 ; TERMINAL NAME MOV #BUFFER+2,ARGBLK+4 ; ADDRESS OF ASCII TERM NAME TTNUM ; GET TERM NUMBER MOV I.UN(R5),BUFFER+6 ; GET USER NAME MOV I.UN+2(R5),BUFFER+10 ; MOV I.UN+4(R5),BUFFER+12 ; MOV I.UN+6(R5),BUFFER+14 ; MOV I.UN+10(R5),BUFFER+16 ; .ENDM USRNAM ; .SBTTL DATA AREA .PSECT DATA,RW,D ; ; ; QIO TERQIO: QIOW$ IO.WVB,5,1,,IOSBLK,,<,> ; WRITE TO TERMINAL ; ; ; BUFFERS IOSBLK: .BLKW 2 ; ERROR RETURN FOR QIO OUTLIN: .BLKB 80. ; FINAL OUTPUT LINE BUFFER ARGBLK: .BLKB 20. ; CONVERSION BUFFER BUFFER: .WORD 16. ; TEMPORARY STORAGE ; ; ARGLKB USAGE ;--------------------------------------------------------------------------- ; WHEN USED FOR DEVICE LINE ; ------------------------- ; 0 ADDRESS OF DEVICE NAME ; 2 UNIT NUMBER OF ABOVE DEVICE ; 4 ADDRESS OF TERMINAL AND NUMBER ; 6 ADDRESS OF USER NAME ;10 NOT USED ;12 NOT USED ; ; BUFFER USAGE ;--------------------------------------------------------------------------- ; 0 ASCII DEVICE NAME ; 2 TERMINAL NAME ; 4 TERMINAL UNIT NUMBER ; 6 USER NAME ;10 " ;12 " ;14 " ;16 " ; ;---------------------------------------------------------------------------- ; .SBTTL MESSAGES ; MESSAGES HEDMSG: .ASCIZ /%2NDevices currently in use %Y%2S%2Z/ .EVEN ; DLTHED: .ASCIZ /%2NUser Devices Mounted %NDevice%2STerm%5SUser/ .EVEN DEVLIN: .ASCIZ /%N%S%2A%M%4S%4A%4S%10A/ .EVEN ; ; ENDLIN: .ASCIZ /%2N%M%SDevices Mounted out of%S%M/ .EVEN ; ALLHED: .ASCIZ /%2NUser Devices Allocated%NDevice%2STerm%5SUser/ .EVEN ; ; ; .SBTTL MAIN-LINE .PSECT MAIN,RO,I ; ; ; IASDEV:: ; MAKE GLOBAL FOR SHOW USER ENTRY GTIM$S #ARGBLK ; PUT TIME INTO CONVERSION BUF PRINT HEDMSG ; PRINT INTRO AND TIME MOV .DLTBA,R1 ; START ADDRESS OF LOAD TABLE MOV .DLTEND,R2 ; END ADDRESS OF LOAD TABLE TST .DLTNO ; ANY ENTRIES ? BNE 60$ ; BR IS SO JMP 100$ ; ELSE ... 60$: PRINT DLTHED ; PRINT DEVICE HEADING MOV .DLTNO,R4 ; GET NUMBER OF ENTRIES 70$: MOV DV.UJN(R1),R3 ; GET THE USER JOB NODE ADDRESS BNE 80$ ; IF NO UJN SKIP ADD .DLTSZ,R1 ; GET NEXT TABLE ENTRY BR 70$ ; TRY AGAIN 80$: MOV #BUFFER+6,ARGBLK+6 ; ADDRESS OF USERNAME MOV J.TA(R3),R5 ; USER UTN ADDRESS USRNAM ; GET NAME TERMINAL AND UNIT MOV DV.DEV(R1),BUFFER+0 ; ASCII DEVICE NAME MOV #BUFFER+0,ARGBLK ; ADDRESS OF DEVICE NAME MOVB DV.UNI(R1),ARGBLK+2 ; BINARY UNIT NUMBER CLRB ARGBLK+3 ; POSSIBLE GARBAGE CHAR PRINT DEVLIN ; PRINT DEV LOAD TABLE LINE ADD .DLTSZ,R1 ; GET NEXT ENTRY DEC R4 ; REDUCE COUNT BEQ 90$ ; BR IF NO MORE BR 70$ ; CONTINUE 90$: MOV .DLTNO, ARGBLK+0 ; NUMBER OF VOLUMES MOUNTED MOV .DLTMAX,ARGBLK+2 ; NUMBER OF VOLUMES ALLOWED PRINT ENDLIN ; PRINT THE SUMMARY 100$: MOV .DVTRM,R1 ; BEG ADDR OF REMOVABLE VOLUMES MOV .DVTEND,R2 ; END ADDR OF DEVICE TABLE CLR R0 ; CLEAR FLAG TO PRINT HEADING 110$: CMP R1,R2 ; END OF TABLE BEQ EXIT ; ALL DONE EXIT TST D.EX(R1) BEQ 130$ MOV D.PU(R1),R3 ; PUD ADDRESS OF DEVICE BITB #CH.OFF,U.CH(R3) ; IS DEV OFFLINE BEQ 130$ ; IF YES SKIP ELSE REPORT ALLOC MOV U.DN(R3),BUFFER+0 ; DEVICE NAME MOV #BUFFER+0,ARGBLK+0 ; ADDRESS OF DEV NAME MOV U.UN(R3),ARGBLK+2 ; UNIT NUMBER OF ALLOCATED DEVICE CLRB ARGBLK+3 ; CLEAR ANY UNWANTED CHAR MOV D.EX(R1),R5 ; GET UTN ADDRESS FOR USRNAM USRNAM MOV #BUFFER+6,ARGBLK+6 ; SET UP USER NAME FOR PRINTING TSTB R0 ; PRINT HEADER ON FIRST PASS THRU BNE 120$ ; IF ZERO THEN ITS PRINTED PRINT ALLHED ; IF NOT THEN PRINT ALLOCATION INCB R0 ; SET FLAG SO ITS DONE ONLY ONCE 120$: PRINT DEVLIN ; SHOW DEVICES ALLOCATED 130$: ADD .DTESZ,R1 ; GET NEXT TABLE ENTRY BR 110$ ; GO SEE IF THERES MORE EXIT: EXIT$S ; ALL DONE .END IASDEV