.TITLE USETBL - USERS TABLE ROUTINES .IDENT /1.1/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided or ; otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: USETBL.MAC ; Author: Robin Miller ; Date: July 28, 1982 ; ; Description: ; ; This module contains the routines for formatting and writing the ; output table. This table contains an entry for each terminal logged on. ; ; ; Modification History: ; ;- .ENABL AMA .NLIST BEX ; Local equates: SPACE = 40 ; ASCII FOR SPACE COMMA = 54 ; ASCII FOR COMMA ; Input table offsets: TTYOFF = 0 ; ENTRY TO TERMINAL NUMBER FNDOFF = 1 ; TABLE ENTRY FOUND -1 = TRUE UICOFF = 2 ; OFFSET TO THE UIC MEMOFF = 2 ; OFFSET TO THE MEMBER # GRPOFF = 3 ; OFFSET TO THE GROUP # ; Output table offset. USROFF = 15. ; OFFSET TO COPY USERNAME TO .SBTTL MAKUIC - FILL TABLE WITH TERMINAL AND UIC ;+ ; ; MAKUIC - Fill table with the terminal name and the UIC. ; ; This routine is called to fill the initial part of the output buffer ; table with the terminal name and UIC. This is done incase no entry ; is found in the accounting file for the login UIC. ; ; Inputs: ; LOGBUF = table of logged on users with the format: ; ; .WORD terminal_number ; .WORD logon_uic ; . ; . ; .WORD -1 ; End of table. ; ; Outputs: ; BUFF = filled with the terminal and UIC. ; ; All registers are preserved. ; ;- MAKUIC::CALL $SAVAL ; SAVE ALL REGISTERS MOV #LOGBUF,R4 ; ADDRESS OF INPUT TABLE MOV #BUFF,R5 ; ADDRESS OF OUTPUT TABLE 10$: MOV TTYOFF(R4),R1 ; COPY THE TERMINAL UNIT # BMI 100$ ; IF MI, END OF TABLE MOV R5,R0 ; SET THE OUTPUT ADDRESS ; Fill out the terminal name and unit number. MOV #"TT,(R0)+ ; MOVE IN THE FIRST PART CLR R2 ; SUPPRESS LEADING ZEROS CALL $CBTMG ; CONVERT TO ASCII OCTAL MOVB #':,(R0)+ ; TERMINATE TERMINAL NAME ; Presume two digits maximum for terminal number. CMPB TTYOFF(R4),#7 ; TWO DIGIT UNIT NUMBER ? BGT 20$ ; IF GT, YES MOVB #SPACE,(R0)+ ; ADD AN EXTRA SPACE ; Fill out the UIC. 20$: MOVB #SPACE,(R0)+ ; SPACE BEFORE THE UIC MOVB #'[,(R0)+ ; NOW THE LEFT BRACKET MOVB GRPOFF(R4),R1 ; COPY THE GROUP NUMBER CALL 80$ ; CONVERT TO OCTAL ASCII MOVB #COMMA,(R0)+ ; PUT IN THE SEPARATOR MOVB MEMOFF(R4),R1 ; COPY THE MEMBER NUMBER CALL 80$ ; CONVERT TO OCTAL ASCII MOVB #'],(R0)+ ; LAST PART OF THE UIC CLRB (R0) ; AND THE TERMINATOR ; Adjust table addresses and do the next entry. ADD #INSIZ,R4 ; SIZE OF INPUT ENTRY ADD #OUTSIZ,R5 ; SIZE OF OUTPUT ENTRY BR 10$ ; DO THE NEXT ENTRY ; Subroutine to convert group or member number. 80$: BIC #^C377,R1 ; CLEAR THE HIGH BYTE MOV (SP),R2 ; ALLOW LEADING ZEROES CALL $CBTMG ; CONVERT THE GROUP NUMBER RETURN 100$: RETURN .SBTTL CHKTBL - CHECK THE TABLE/ACCOUNT ENTRY ;+ ; ; CHKTBL - Check the table entry with the account entry. ; ; Inputs: ; R3 = the current account entry. ; TOTAL = the total number of input entrys. ; ; Outputs: ; C bit clear/set = more table entrys/table finished. ; ; All registers are preserved. ; ;- CHKTBL::CALL $SAVAL ; SAVE ALL REGISTERS MOV #LOGBUF,R4 ; ADDRESS OF INPUT ENTRYS MOV #BUFF,R5 ; ADDRESS FOR OUTPUT ENTRYS MOV TOTAL,R2 ; TOTAL NUMBER OF ENTRYS 10$: TSTB FNDOFF(R4) ; THIS ENTRY FOUND ALREADY ? BMI 20$ ; IF MI, YES (DO NEXT ENTRY) MOV UICOFF(R4),R0 ; COPY THE LOGIN UIC CALL CHKUIC ; CHECK WITH ACCOUNT ENTRY BCS 20$ ; IF CS, NO MATCH CALL CHKUSE ; CHECK FOR PARTICULAR USER BCS 20$ ; IF CS, WRONG USER MOV R5,R0 ; COPY THE OUTPUT ADDRESS ADD #USROFF,R0 ; OFFSET TO START USER NAME CALL FORMAT ; FORMAT THIS ENTRY ; Mark the entry as found, and check for entrys finished. MOVB #-1,FNDOFF(R4) ; SHOW THIS ENTRY WAS FOUND DEC FTOTAL ; DECREMENT THE FOUND TOTAL BGT 20$ ; IF GT, MORE TO FIND SEC ; SHOW ALL ENTRYS FOUND RETURN ; Adjust tables to point at next table entrys and loop. 20$: ADD #INSIZ,R4 ; POINT TO NEXT INPUT ENTRY ADD #OUTSIZ,R5 ; POINT TO NEXT OUTPUT ENTRY SOB R2,10$ ; LOOP UNTIL DONE 100$: CLC ; SHOW MORE TABLE ENTRYS RETURN .SBTTL WRTTBL - WRITE THE OUTPUT TABLE ENTRYS ;+ ; ; WRTTBL - Write the output table entrys. ; ; This routine is used to write the contents of the output table. ; The output table buffer is already formatted with each entry. ; If a particular user was selected (B.USER), then only those ; entrys marked as found will be output. ; ; Inputs: ; TOTAL = the total number of entrys (logged on terminals). ; ; Outputs: ; All registers are preserved. ; ;- WRTTBL::CALL $SAVAL ; SAVE ALL REGISTERS MOV TOTAL,R1 ; COPY THE ENTRY COUNT MOV #BUFF,R0 ; ADDRESS OF OUTPUT TABLE MOV #LOGBUF,R4 ; ADDRESS OF INPUT TABLE 10$: BIT #B.USER,STATUS ; SPECIFIC USER SELECTED ? BEQ 20$ ; IF EQ, NO (WRITE ENTRY) TSTB FNDOFF(R4) ; WAS THIS ENTRY FOUND ? BPL 30$ ; IF PL, NO (SKIP IT) 20$: CALL WRITE ; WRITE THE FIRST ENTRY BCS 40$ ; IF CS, FINISHED 30$: ADD #OUTSIZ,R0 ; POINT TO NEXT OUTPUT ENTRY ADD #INSIZ,R4 ; POINT TO NEXT INPUT ENTRY SOB R1,10$ ; LOOP UNTIL DONE 40$: RETURN .END