;-*-Midas-*- Title :IDLE - List idle users A=1 ;General porpoise B=2 C=3 D=4 E=5 F=6 G=7 T1=10 T2=11 T3=12 I=13 ;Index T=14 ;TTY P=17 Call= Return= TTYo==1 MapBot==5 MapTop=177 MapLen==MapTop-MapBot+1 Pdlen==10 JCLen==10 MaxUsr==50. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Define SYSCAL op,args .Call [Setz ? Sixbit /op/ ? args ((Setz))] Termin Define TYPE &string Movei T1,<.Length string> Move T2,[440700,,[Ascii string]] Syscal SIOT,[%Climm,,TTYo ? T2 ? T1] .Lose %LsSys Termin ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; JCLbuf: Block JCLen -1 Text: Block JCLen Pdlist: -Pdlen,,Pdlist Block Pdlen NCT: 0 ;Number Console Terminals - Max TTY# TTITM: 0 ;TTy Idle TiMe (?) - Idle time UNAME: 0 TTYSTS: 0 ;STS? Has the index of the job which has that TTY Who: Block MaxUsr When: Block MaxUsr Where: Block MaxUsr Time: 30.*60. 30.*60.*60. 30.*60.*60.*24. Alpha: 0 Now: 0 Target: 0 Limit: 30.*60. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Begin: Move P,PDList Syscal OPEN,[%Clbit,,.uao\%TJDIS %Climm,,TTYo [Sixbit /TTY/]] .Lose %LsFil .Break 12,[..rJCL,,JCLbuf] Skipn JCLbuf Jrst SysMap Move A,[440700,,JCLbuf] Clean: Ildb B,A ;Remove leading spaces/tabs Caie B,^I Cain B,40 Jrst Clean Setz E, Move C,[440700,,Text] Skipa Read: Ildb B,A Caie B,^C Cain B,^M Jrst Inter Caie B,177 Cain B,^_ Jrst Inter Cail B,"0 Caile B,"9 Setom Alpha Cail B,"a Trz B,40 Idpb B,C Aoja E,Read Inter: Jumpe E,SysMap Move C,[440700,,Text] Skipe Alpha Jrst Name Numify: Imuli D,10. Ildb B,C Subi B,"0 Add D,B Sojn E,Numify IMuli D,<30.*60.> Movem D,Limit Jrst SysMap Name: Caile E,6 Movei E,6 Move D,[440600,,Target] Sixify: Ildb B,C Subi B,40 Idpb B,D Sojn E,Sixify ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; JCL parsing done. LIMIT contains the time in ticks that ;;; is the bottom cut-of for people listed. If TARGET is non- ;;; zero, then only TARGET is listed, not all users ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SysMap: Move B,[Squoze 0,NCT] .Eval B, .Lose Movem B,NCT Move C,[Squoze 0,UNAME] .Eval C, .Lose Add C,[(I)] ;Indexed by I Movem C,UNAME Move D,[Squoze 0,TTITM] .Eval D, .Lose Add D,[(T)] ;Likewise for T Movem D,TTITM Move E,[Squoze 0,TTYSTS] .Eval E, .Lose Add E,[(T)] Movem E,TTYSTS Syscal CORBLK,[%Climm,,%Cbndr %Climm,,%Jself [-MapLen,,MapBot] %Climm,,%Jsnum] .Lose %LsSys Movei T,1 ;Start at T01 .RdTime T1, Movem T1,Now Seto E, GetEm: Move C,@TTYSTS Hrre I,C Jumple I,Next Tlne C,400000 Jrst Next Move A,Now Sub A,@TTITM Skipge A Setz A, Move D,@UNAME Camn D,Target Jrst Save Camge A,Limit Jrst Next Save: Aoj E, Movem T,Where(E) Movem A,When(E) Movem D,Who(E) Next: Aoj T, Camg T,NCT Jrst GetEm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; All unames and idle times have been read in. Now is the time ;;; to sort and output, or just output for one name.... ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Squeal: .Iot TTYo,[^P] .Iot TTYo,["A] Jumpl E,[TYPE "No users" Jrst Die] Skipn Target Jrst Sort Move T1,E Move T2,Target Find: Camn T2,Who(T1) Jrst Here Sojge T1,Find TYPE "Who? Not idle... not even HERE!" Jrst Die Here: Call OutLin Jrst Die Sort: TYPE "TTY Uname Idle" Loopi: Seto T2, Move T3,E Loop: Caml T2,When(T3) Jrst Too Move T1,T3 Move T2,When(T3) Too: Sojge T3,Loop Skipge T2 Jrst Die Call OutLin Setom When(T1) Jrst Loopi Die: .Logout 1, ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OutLin: .Iot TTYo,[^P] .Iot TTYo,["A] .Iot TTYo,["T] Move A,Where(T1) IDivi A,10 Addi A,60 .Iot TTYo,A Addi B,60 .Iot TTYo,B .Iot TTYo,[" ] Movei C,7 Move A,Who(T1) 6Type: Setz B, Rotc A,6 Addi B,40 .Iot TTYo,B Sojn C,6Type TType: Setz A, ;1st set has no leading '0' Movei D,2 Move B,When(T1) TTloop: Idiv B,Time(D) Skipn A Jumpe B,TTnext Move F,B Idivi F,10. Addi F,"0 Caig F,"0 Skipe A .Iot TTYo,F Addi G,"0 .Iot TTYo,G Skipe D .Iot TTYo,[":] Seto A, TTnext: Move B,C Sojge D,TTloop Return END BEGIN