Trailing-Edge
-
PDP-10 Archives
-
BB-FP64A-SB_1986
-
10,7/who/whoprt.mac
There are 4 other files named whoprt.mac in the archive. Click here to see a list.
TITLE WHOPRT -- PRINT ROUTINES FOR WHO
SEARCH WHOMAC
$SETUP (WHOPRT)
Comment |
This module contains some of the small mode specific routines for
summary and performance, and the general formatted output routines
that use the database build by the users /FORMAT switch, or defaulted
by one of the switches /VFAST, /FAST, /NORMAL, /SLOW.
|
; TABLE OF CONTENTS FOR WHOPRT
;
;
; SECTION PAGE
; 1. Printing routines
; 1.1 PRTMOD - Print a formated line.................... 3
; 2. Print routines
; 2.1 INFACT - Print the account string................. 4
; 2.2 INFIPC - Print IPCF information................... 4
; 2.3 INFBAT - Print batch/galaxy information........... 4
; 2.4 INFDEF - Print defaults information............... 4
; 2.5 INFTIM - Print Login/Reset time information....... 4
; 2.6 INFCOR - Print core limits........................ 4
; 2.7 INFSPL - Print spool information.................. 5
; 2.8 INFCAP - Print the capabilities................... 6
; 2.9 INFPRV - Print the privileges..................... 6
; 2.10 PRTPRV - Print the privileges..................... 7
; 2.11 INFWSC - Print the wait state code................ 8
; 2.12 INFTTY - Print TTY parameters..................... 10
; 3. TABLES.................................................... 11
; 4. Printing routines
; 4.1 Character handling and justification.............. 14
; 5. Performance routines
; 5.1 JOBPRF - Print JOB mode performance statistics.... 15
; 5.2 LINPRF - Print LINE mode performance statistics... 16
; 5.3 NODPRF - Print NODE mode performance statistics... 17
; 5.4 USRPRF - Print USER mode performance statistics... 18
; 5.5 TNN - Type a fractional number.................... 19
; 6. END....................................................... 20
SUBTTL Printing routines -- PRTMOD - Print a formated line
PRTMOD::PUSHJ P,DOACTION## ;PROCESS ACTIONS
TLNE F,(FL.LOGIN!FL.WHOSRV) ;WE LOGGED IN OR A SERVER?
JRST PRTM.1 ;YES
MOVNI T1,1 ;-1 FOR OUR TERMINAL
PUSHJ P,UTRMNO## ;GET OUR LINE NUMBER
SETZM S.PRINT## ;NO TYPEOUT IF DETACHED
PRTM.1: SKIPN S.PRINT## ;SEE IF /PRINT:NO
POPJ P, ;YES--RETURN
AOSN TTLFLG ;NEED A TITLE?
PUSHJ P,PRTTTL ;YES
MOVE T1,.FZPFM##(I) ;POINT TO STANDARD FORMAT ARGS
PUSHJ P,PRTFMT ;PRINT THE FORMATED INFO
SKIPLE .FZPRF##(I) ;SEE IF WANTED PERFORMANCE INFO
PUSHJ P,@PRFXXX##(M) ;DISPATCH FOR /PERFORMANCE
PUSHJ P,.SAVE2## ;SAVE P2
SKIPE P1,.FZINF##(I) ;GET /INFORMATION
SKIPL P2,INFXXX(M) ;SEE IF /INFORMATION ROUTINES
POPJ P, ;NO
PRTM.2: TDNE P1,(P2) ;THIS KEYWORD GIVEN?
PUSHJ P,@1(P2) ;YES--DISPATCH
AOBJN P2,.+1 ;ADVANCE
AOBJN P2,PRTM.2 ;LOOP FOR ALL
PJRST .TCRLF## ;CRLF AND RETURN
DEFINE INFJOB,<
X NAM,NAME
X ACT,ACCOUNT
X TMP,TMPCOR
X PRV,PRIVILEGE
X CAP,CAPABILITY
X SPL,SPOOL
X WCH,WATCH
X IPC,IPCF
X BAT,BATCH
X DEF,DEFAULT
X ORG,ORIGIN
X PTH,PATH
X JSL,JSL
X LNM,LOGICAL
X TIM,TIME
X COR,CORE
X WSC,<WSCODE,STATE>
X CHN,CHANNEL
X DDB,<DDB,SIZE,MTA>
>
DEFINE INFLIN,<
X TTY,TTY
>
DEFINE INFNOD,<
>
DEFINE INFSTR,<
>
DEFINE INFUNI,<
>
;Generate dispatch macro
DEFINE X(DSP,KEY),<
GLOB INF'DSP
KEYS==0
IRP KEY,<
KEYS==KEYS!IFM'KEY##
>;END IRP KEY
EXP KEYS,INF'DSP
>;END DEFINE X
;Generate tables for each mode
DEFINE XX(MOD,ABR,MAP,TXT,ERR),<
T'ABR'I: INF'ABR
L'ABR'I==.-T'ABR'I
>;END DEFINE XX
MODES
;Generate pointers to each table
DEFINE XX(MOD,ABR,MAP,TXT,ERR),<XWD -L'ABR'I,T'ABR'I>
INFXXX: MODES
SUBTTL Printing routines -- PRTTTL - Print a title
PRTTTL: SKPYES S.TITLES## ;WANT TITLES?
POPJ P, ;NO
MOVE T1,TTLTAB##(M) ;GET TABLE ADDRESS FOR THIS MODE
SKIPG T2,.FZFMT##(I) ;GET FORMAT TYPE (FAST, SLOW, ETC.)
MOVEI T2,%NORMAL## ;DEFAULT TO NORMAL
TLNE T2,777777 ;WORD COUNT PRESENT?
POPJ P, ;YES--THEN /FORMAT SPECIFIED
ADDI T1,-1(T2) ;INDEX INTO MODE SPECIFIC TABLE
MOVE T1,@0(T1) ;GET ADDRESS OF TITLE TEXT
PUSHJ P,.TSTRG## ;TYPE IT
PJRST .TCRLF## ;END LINE AND RETURN
SUBTTL Print routines -- INFACT - Print the account string
INFACT: MOVE T1,[LACTNORMAL##,,FACTNORMAL##]
PJRST PRTFMT ;NO
SUBTTL Print routines -- INFIPC - Print IPCF information
INFIPC: MOVE T1,[LIPCFNORMAL##,,FIPCFNORMAL##];GET ADDRESS OF FORMAT
PJRST PRTFMT
SUBTTL Print routines -- INFBAT - Print batch/galaxy information
INFBAT: MOVE T1,[LBATNORMAL##,,FBATNORMAL##];GET ADDRESS OF FORMAT
PJRST PRTFMT
SUBTTL Print routines -- INFDEF - Print defaults information
INFDEF: MOVE T1,[LDEFNORMAL##,,FDEFNORMAL##]
PJRST PRTFMT
SUBTTL Print routines -- INFTIM - Print Login/Reset time information
INFTIM: MOVE T1,[LTIMNORMAL##,,FTIMNORMAL##]
PJRST PRTFMT
SUBTTL Print routines -- INFCOR - Print core limits
INFCOR: MOVE T1,[LCORNORMAL##,,FCORNORMAL##]
PJRST PRTFMT
SUBTTL Print routines -- INFSPL - Print spool information
INFSPL: PUSHJ P,.SAVE2## ;SAVE P2
PUSHJ P,JB$SPL## ;GET SPOOL WORD
MOVE P1,T1 ;SAVE
MOVEI T1,5 ;SPACE OVER
PUSHJ P,.TSPAN## ;..
TXNE P1,JS.DFR ;DEFERED?
SKIPA T1,[[ASCIZ/Defered spooling: /]];YES
MOVEI T1,[ASCIZ/Spooling: /] ;NO
PUSHJ P,.TSTRG## ;TYPE
TXNN P1,JS.PAL ;ANY DEVICES?
JRST PRTS.4 ;NO
MOVSI P2,-SPLLEN ;LENGTH OF TABLE
TRZ F,FR.COMMA ;CLEAR FLAG
PRTS.1: TDNN P1,SPLBIT(P2) ;SPOOLED?
JRST PRTS.2 ;NO
MOVEI T1,[ASCIZ/, /] ;DELIMITER
TROE F,FR.COMMA ;FLAG/TEST COMMA NEEDED
PUSHJ P,.TSTRG## ;YES
MOVE T1,SPLDEV(P2) ;YES--GET DEVICE
PUSHJ P,.TDEVN## ;TYPE
MOVE T1,SPLDEV(P2) ;GET DEVICE
CAME T1,[SIXBIT/CDR/] ;CDR?
JRST PRTS.2 ;NO
HLLZ T1,P1 ;YES--GET NAME
PUSHJ P,.TSIXN## ;TYPE CDR NAME
PRTS.2: AOBJN P2,PRTS.1 ;LOOP FOR ALL
JRST PRTS.3 ;AND CHECK UNSPOOLING
PRTS.4: $TYPE <none> ;NOTHING SPOOLED
PRTS.3: PUSHJ P,JB$PRV## ;GET PRIVS
TXNN T1,JP.NSP ;UNSPOOLING?
PJRST .TCRLF## ;NO
$TYPEL < (unspooling allowed)>
POPJ P, ;AND RETURN
DEFINE SPOOLS,<
XLIST
X CDR,JS.PCR
X CDP,JS.PCP
X PTP,JS.PPT
X PLT,JS.PPL
X LPT,JS.PLP
LIST
>;END DEFINE SPOOLS
ALLSPL==0
DEFINE X(DEV,BIT),<
ALLSPL==ALLSPL!BIT
EXP BIT
>;END DEFINE X
SPLBIT: SPOOLS
SPLLEN==.-SPLBIT
IFN JS.PAL-ALLSPL,<PRINTX ? SPOOL table missing some device definitions>
DEFINE X(DEV,BIT),<EXP SIXBIT/DEV/>
SPLDEV: SPOOLS
SUBTTL Print routines -- INFGOP - Print GALAXY operator information
INFGOP: PUSHJ P,JB$GOP## ;GET OPERATOR CODE
PUSH P,T1 ;SAVE CODE
MOVEI T1,5 ;SPACE OVER
PUSHJ P,.TSPAN## ;..
$TYPE <GALAXY operator:>
POP P,T1 ;RESTORE CODE
PUSHJ P,TGOP## ;TYPE GALAXY OPERATOR TEXT
PJRST .TCRLF## ;TYPE A CRLF AND RETURN
SUBTTL Print routines -- INFWCH - Print watch information
INFWCH: PUSHJ P,.SAVE2## ;SAVE P2
PUSHJ P,JB$WCH## ;GET WATCH BITS
MOVE P1,T1 ;SAVE
MOVEI T1,5 ;SPACE OVER
PUSHJ P,.TSPAN## ;..
$TYPE <Watch:>
TXNN P1,JW.WAL ;ANY WATCH BITS
JRST PRTW.4 ;NO
MOVSI P2,-WCHLEN ;LENGTH OF TABLE
PRTW.1: TDNN P1,WCHBIT(P2) ;WATCH?
JRST PRTW.2 ;NO
PUSHJ P,.TSPAC## ;SPACE
MOVE T1,WCHTXT(P2) ;GET TEXT
PUSHJ P,.TSTRG## ;TYPE WATCH NAME
PRTW.2: AOBJN P2,PRTW.1 ;LOOP FOR ALL
JRST PRTW.3 ;AND PRINT MESSAGE SETTING
PRTW.4: $TYPE < none> ;NOTHING WatchED
PRTW.3: $TYPE < Message:>
TXNN P1,JW.WMS ;ANY MESSAGE BITS?
JRST PRTW.7 ;NO
MOVSI P2,-MSGLEN ;LENGTH OF TABLE
PRTW.5: TDNN P1,MSGBIT(P2) ;MESSAGE?
JRST PRTW.6 ;NO
PUSHJ P,.TSPAC## ;SPACE
MOVE T1,MSGTXT(P2) ;GET TEXT
PUSHJ P,.TSTRG## ;TYPE MESSAGE NAME
PRTW.6: AOBJN P2,PRTW.5 ;LOOP FOR ALL
PJRST .TCRLF## ;CRLF AND RETURN
PRTW.7: $TYPEL < default>
POPJ P,
DEFINE WATCHS,<
XLIST
X CONTEXTS,JW.WCX
X DAY,JW.WDY
X RUN,JW.WRN
X WAIT,JW.WWT
X READS,JW.WDR
X WRITES,JW.WDW
X VERSION,JW.WVR
X MTA,JW.WMT
X FILE,JW.WFI
LIST
>;END DEFINE WATCHS
ALLWCH==0
DEFINE X(TXT,BIT),<
ALLWCH==ALLWCH!BIT
EXP BIT
>;END DEFINE X
WCHBIT: WATCHS
WCHLEN==.-WCHBIT
IFN JW.WAL-ALLWCH,<PRINTX ? WATCH table missing some bit definitions>
DEFINE X(TXT,BIT),<EXP [ASCIZ/TXT/]>
WCHTXT: WATCHS
DEFINE MESSAGES,<
X PREFIX,JW.WPR
X FIRST,JW.WFL
X CONTINUATION,JW.WCN
>
DEFINE X(TXT,BIT),<EXP BIT>
MSGBIT: MESSAGES
MSGLEN==.-MSGBIT
DEFINE X(TXT,BIT),<EXP [ASCIZ/TXT/]>
MSGTXT: MESSAGES
SUBTTL Print routines -- INFCAP - Print the capabilities
INFCAP: PUSHJ P,JB$CAP## ;GET CAPABILITIES
MOVEI T2,[ASCIZ/ Capabilities:/] ;LOAD HEADER TEXT
PJRST PRTPRV ;AND PRINT THEM
SUBTTL Print routines -- INFPRV - Print the privileges
INFPRV: PUSHJ P,JB$PRV## ;GET PRIV WORD
MOVEI T2,[ASCIZ/ Privileges:/] ;LOAD HEADER TEXT
PJRST PRTPRV ;PRINT THEM
SUBTTL Print routines -- PRTPRV - Print the privileges
;Call:
; T1/ privs
; T2/ addr of header text
PRTPRV::PUSHJ P,.SAVE1## ;SAVE P1
MOVE P1,T1 ;SAVE PRIV
MOVEI T1,(T2) ;COPY TEXT
PUSHJ P,.TSTRG## ;TYPE IT
PUSHJ P,.TSPAC##
MOVE T1,P1
PUSHJ P,.TXWDW##
PUSHJ P,.TCRLF## ;CRLF
MOVEI T1,[ASCIZ/ DEC: /] ;HEADER
MOVE T2,P1 ;BITS
MOVE T3,[-DECLEN,,DECTAB] ;POINTER
PUSHJ P,PRTBIT ;PRINT THE BITS
IFN FTIPC!FTTUFTS,<
MOVEI T1,[ASCIZ/ Local: /];HEADER
MOVE T2,P1 ;BITS
MOVE T3,[-LOCLEN,,LOCTAB] ;POINTER
PUSHJ P,PRTBIT ;PRINT THE BITS
>;END IFN FTIPC!FTTUFTS
POPJ P, ;AND RETURN
;Subroutine PRTBIT - Print strings for bit names
;Call:
; T1/ addr of header text
; T2/ priv bits
; T3/ AOBJN pointer to table of descriptions
PRTBIT: PUSHJ P,.TSTRG## ;TYPE HEADER
PUSHJ P,.SAVE2##
DMOVE P1,T2 ;SAVE WORD, TABLE POINTER
PRTB.L: TDNN P1,(P2) ;THIS PRIV ON?
JRST PRTB.E ;NO
HRRZ T1,1(P2) ;YES--GET TEXT
PUSHJ P,.TSTRG## ;TYPE
HLRZ T1,1(P2) ;SEE IF DISPATCH NEEDED
CAIE T1,0 ;IS IT?
PUSHJ P,(T1) ;YES--DISPATCH
PUSHJ P,.TSPAC## ;SPACE OVER
PRTB.E: ADD P2,[1,,1] ;ADVANCE TO NEXT SET
AOBJN P2,PRTB.L ;LOOP FOR ALL
PJRST .TCRLF## ;CRLF AND RETURN
PV$HPQ: PUSHJ P,.TCOLN## ;TYPE :
LOAD T1,P1,JP.HPQ ;GET HPQ VALUE
PJRST .TDECW## ;TYPE AND RETURN
PV$DPR: PUSHJ P,.TCOLN## ;TYPE :
LOAD T1,P1,JP.DPR ;GET DSKPRI VALUE
PJRST .TDECW## ;TYPE AND RETURN
SUBTTL Print routines -- INFWSC - Print the wait state code
INFWSC: MOVEI T1,5 ;SAVE OVER
PUSHJ P,.TSPAN## ;...
MOVEI T1,[ASCIZ/State: /]
PUSHJ P,.TSTRG##
PUSHJ P,JB$WSC## ;GET THE CODE
PUSHJ P,.SAVE1## ;SAVE
MOVE P1,T1 ;SAVE CODE
MOVEI T1,[ASCIZ/Actively /]
LDB T2,[POINT 6,P1,17] ;GET ACTIVELY RUNNING
CAIN T2,'*' ;IS IT?
PUSHJ P,.TSTRG## ;YES!
LDB T1,[POINT 12,P1,11] ;GET RUN CODE
PUSHJ P,STAIDX## ;GET INDEX INTO STATES TABLE
SKIPA T1,[ [ASCIZ/Unknown!!/] ];NOT FOUND
MOVE T1,STATXT##(T1) ;GET TEXT
PUSHJ P,.TSTRG## ;TYPE
LDB T1,[POINT 12,P1,29] ;GET SWAPPED CODE
JUMPE T1,INFW.1 ;RETURN IF NONE
PUSHJ P,STAIDX## ;GET INDEX
JRST INFW.1 ;NOT KNOWN!
PUSH P,T1 ;SAVE T1
MOVEI T1,[ASCIZ/, /] ;ADDITIONAL TEXT
PUSHJ P,.TSTRG## ;TYPE
MOVEI T1,[ASCIZ/Being /]
LDB T2,[POINT 6,P1,35] ;GET Being SWAPPING
CAIN T2,'*' ;IS IT?
PUSHJ P,.TSTRG## ;YES!
POP P,T1 ;RESTORE T1
MOVE T1,STATXT##(T1) ;GET TEXT
PUSHJ P,.TSTRG## ;TYPE
INFW.1: PJRST .TCRLF## ;CRLF AND RETURN
;X(BIT,TXT,TYP) is
;
; BIT value of bit
; TXT ASCII text to type if BIT is on
; TYP + if dispatch to PV$'TXT to type extra stuff
DEFINE DECS,<
XLIST
X JP.IPC, IPCF
X JP.DPR, DPR ,+
X JP.MET, METER
X JP.POK, POKE
X JP.CCC, CPU
X JP.HPQ, HPQ ,+
X JP.NSP, USPL
X JP.ENQ, ENQ
X JP.RTT, RTTRP
X JP.LCK, LOCK
X JP.TRP, TRPSET
X JP.SPA, SPY
X JP.SPM, MSPY
LIST
>
DEFINE X(BIT,TXT,TYP),<
EXP BIT
IFNB <TYP>,<XWD PV$'TXT,[ASCIZ/TXT/]>
IFB <TYP>,<EXP [ASCIZ/TXT/]>
>;END DEFINE X
DECTAB: DECS
DECLEN==.-DECTAB
IFN FTIPC,<
DEFINE LOCS,<
XLIST
X JP.NEX, NETEXAM
X JP.CPN, CHGPPN
IFN FTMDC,<
X JP.MPV, SETP
X JP.SPG, PRGRUN
>
LIST
>
>;END IFN FTIPC
IFN FTTUFTS,<
DEFINE LOCS,<
XLIST
X JP.NAM, NAME
X JP.CPP, PPASS
X JP.CSP, SPASS
X JP.MAI, MAIL
X JP.SFD, SFD
X JP.COM, COMBO
X JP.MAG, MAGTPE
LIST
>
>;END IFN FTTUFTS
IFN FTIPC!FTTUFTS,<
LOCTAB: LOCS
LOCLEN==.-LOCTAB
>;END IFN FTIPC!FTTUFTS
SUBTTL Print routines -- INFNAM - Print name requirements
INFNAM: CAIE M,M%JOB## ;JOB MODE?
POPJ P, ;NO
$TYPE < User name: > ;DISPLAY TEXT
PUSHJ P,JB$NAM## ;GET USER NAME
PUSH P,1(T1) ;SAVE WORD 2
MOVE T1,0(T1) ;GET FIRST WORD
PUSHJ P,.TSIXS## ;TYPE WITH SPACES
POP P,T1 ;GET WORD 2
PUSHJ P,.TSIXS## ;DITTO
PJRST .TCRLF## ;FINISH WITH A CRLF
SUBTTL Print routines -- INFTTY - Print TTY parameters
INFTTY: PUSHJ P,.SAVE4## ;SAVE SOME AC'S
MOVEI T1,CHRDIR ;CHAR STICKER
PUSHJ P,.TYOCH## ;TELL SCAN
PUSH P,T1 ;SAVE OLD
MOVSI P1,-LN$TRM ;GET LENGTH OF TABLE
MOVEI P2,1 ;CLEAR COLUMN COUNTER
MOVEI T1,^D5
PUSHJ P,.TSPAN##
LINP.1: MOVEI L,0 ;CLEAR COUTNER
PUSHJ P,@TRMLOD(P1) ;LOAD THE FIELD
PUSHJ P,@TRMPRT(P1) ;PRINT THE FIELD
MOVEI T1,^D16 ;TAB STOP
SUB T1,L ;MINUS WHAT WE DID
PUSHJ P,.TSPAN## ;SPACE OVER
CAIN P2,^D4 ;TIME FOR CRLF?
PUSHJ P,[MOVEI P2,0 ;YES--CLEAR COUNTER
PUSHJ P,.TCRLF## ;CRLF
MOVEI T1,^D5
PJRST .TSPAN##]
ADDI P2,1 ;ADVANCE COUNTER
AOBJN P1,LINP.1 ;LOOP FOR ALL FIELDS
CAIE P2,0 ;JUST DO CRLF?
PUSHJ P,.TCRLF## ;NO--TYPE ONE NOW
PUSHJ P,.TCRLF## ;START A NEW LINE
POP P,.TOUTZ## ;RESTORE TYPER
POPJ P, ;AND RETURN
SUBTTL TABLES
DEFINE TRMS,<
X 274,<2741> ,TYES
X ALT,<Altmode> ,TNO
X APL,<APL> ,TYES
X ACR,<AutoCRLF> ,TACRLF
X BLK,<Blanks> ,TNO
X HPS,<Column:> ,TDECW
X NFC,<CRLF> ,TNO
X DBK,<Debreak> ,TYES
X DIS,<Display> ,TYES
X LCP,<Echo> ,TECHO
X FLC,<Fill:> ,TDECW
X FRM,<Form> ,TYES
X SND,<Gag> ,TNO
X HLF,<HDX> ,TYES
X LCT,<LC> ,TNO
X PCT,<Lines:> ,TDECW
X PAG,<Page> ,TPAGE
X RSP,<RCVspeed:> ,TSPEED
X RMT,<Remote> ,TYES
X RTC,<RTcomp> ,TYES ;;**;
X SLV,<Slave> ,TYES
X TAB,<Tabs> ,TYES
X TAP,<Tape> ,TYES
X TDY,<Tidy> ,TYES
X TRM,<Type:> ,TSIXN
X WID,<Width:> ,TDECW
X TSP,<XMTspeed:> ,TSPEED
>
DEFINE X(TRM,TXT,PRT),<EXP LT$'TRM##>
TRMLOD: TRMS
LN$TRM==.-TRMLOD
DEFINE X(TRM,TXT,PRT),<EXP PRT>
TRMPRT: TRMS
DEFINE X(TRM,TXT,PRT),<EXP [ASCIZ/TXT/]>
TRMTXT:TRMS
TYES: JUMPE T1,NO.1
JRST YES.1
TNO: JUMPN T1,NO.1
YES.1: HRRZ T1,TRMTXT(P1)
PJRST .TSTRG##
NO.1: $TYPE <No>
HRRZ T1,TRMTXT(P1)
PJRST .TSTRG##
TDECW: PUSH P,T1
HRRZ T1,TRMTXT(P1)
PUSHJ P,.TSTRG##
POP P,T1
PJRST .TDECW##
TSIXN: PUSH P,T1
HRRZ T1,TRMTXT(P1)
PUSHJ P,.TSTRG##
POP P,T1
PJRST .TSIXN##
TECHO: JUMPN T1,TNO
HRRZ T1,TRMTXT(P1)
PUSHJ P,.TSTRG##
PUSHJ P,LT$DEM##
JUMPE T1,.POPJ##
$TYPE <:DEFER>
POPJ P,
TSPEED: PUSH P,T1
HRRZ T1,TRMTXT(P1)
PUSHJ P,.TSTRG##
POP P,T1
HRRZ T1,SPETAB##(T1)
PJRST .TDECW##
TPAGE: JUMPE T1,TYES
PUSHJ P,LT$PSZ##
JUMPE T1,TNO
HRRZ T1,TRMTXT(P1)
PUSHJ P,.TSTRG##
PUSHJ P,.TCOLN##
PUSHJ P,LT$PSZ##
PJRST .TDECW##
TACRLF: JUMPE T1,TYES
PUSH P,T1
HRRZ T1,TRMTXT(P1)
PUSHJ P,.TSTRG##
PUSHJ P,.TCOLN##
POP P,T1
PJRST .TDECW##
PRTFMT::PUSHJ P,.SAVE4## ;SAVE P1-P4
MOVEI P2,(T1) ;SAVE ADDRESS
HLRZ P3,T1 ;SAVE LENGTH
DOARG: MOVEI L,0 ;AND CLEAR COUNTER THIS FIELD
TRZ F,FR.ABORT ;CLEAR ABORTED FLAG
MOVE T1,[POINT 7,FMTBUF] ;POINT TO FORMAT BLOCK
MOVEM T1,FMTPTR ;STORE
MOVEI T1,BUFCHR ;GET CHAR STICKER
MOVE T2,.FMFMT(P2) ;GET FORMAT BITS
TXNE T2,FM.STR ;A STRING?
MOVEI T1,BUFCNT ;YES--COUNT ALL CHARS
PUSHJ P,.TYOCH## ;TELL SCAN
PUSH P,T1 ;SAVE THE OLD
XCT .FMLOD(P2) ;GET VALUE TO TYPEOUT
LOAD T2,.FMFMT(P2),FM.PRT ;GET ROUTINE TO PRINT
PUSHJ P,(T2) ;CALL IT
MOVE P1,S.DFORMAT## ;GET FORMAT TYPE
MOVE T1,.FMFMT(P2) ;GET FORMAT BITS
TXNN T1,FM.USR ;USER SPECIFY?
CAIN P1,FORDEFAULT## ;OR DEFAULT USED?
LOAD P1,.FMFMT(P2),FM.FMT ;YES--LOAD DEFAULT
LOAD T1,.FMFMT(P2),FM.WID ;GET WIDTH
SUBI T1,(L) ;MINUS WHAT WE DID
JUMPLE T1,DOAR.1 ;NO FILL IF NO ROOM
CAIN P1,FORFLOAT## ;IF FLOATING
JRST DOAR.1 ; NO FILL
CAIN P1,FORBLANK## ;IF BLANK
JUMPE L,DOAR.1 ; AND NO CHARS YET->NO FILL
MOVEI T2,CHRDIR ;COUNT AND OUTPUT
MOVEM T2,.TOUTZ## ;TELL SCAN
LOAD T2,.FMFMT(P2),FM.JUS ;GET JUSTIFY
PUSHJ P,@[.POPJ## ;LEFT
JCENTER ;CENTER
.TSPAN##](T2) ;RIGHT
DOAR.1: MOVEI T1,0 ;GET A NULL
PUSHJ P,FMTCHR ;END THE STRING
POP P,.TOUTZ## ;RESTORE TYPER
MOVEI T1,FMTBUF ;POINT TO FORMAT BUFFER
PUSHJ P,.TSTRG## ;TYPE STRING
CAIE P1,FORFLOAT## ;IF FLOATING
CAIN P1,FORBLANK## ;OR IF BLANK
JUMPE L,DOAR.5 ; AND NO CHARS YET->NO FILL
CAIN P3,1 ;SEE IF LAST ARG
JRST DOAR.5 ;YES--NO FILL
LOAD T1,.FMFMT(P2),FM.WID ;GET WIDTH AGAIN
SUBI T1,(L) ;MINUS WHAT WE DID
CAIN P1,FORFLOAT## ;IF FLOATING
LOAD T1,.FMFMT(P2),FM.SPC ; GET SPACES TO SEPARATE
PUSHJ P,.TSPAN## ;SPACE OVER
DOAR.5: ADDI P2,.FMLEN ;ADVANCE TO NEXT SPEC
TRNN F,FR.ABORT ;UNLESS ABORTED
SOJG P3,DOARG ;ADVANCE TO TO ARG
PJRST .TCRLF## ;CRLF AND RETURN
SUBTTL Printing routines -- Character handling and justification
JCENTER:LSH T1,-1 ;DIVIDE BY 2
PJRST .TSPAN## ;ABD SPACE OVER THAT MANY
BUFCNT: AOJA L,FMTCHR ;COUNT AND STORE CHAR
BUFCHR: CAIN T1," " ;A SPACE?
JUMPE L,.POPJ## ;YES--RETURN IF NOT SIGNIFICANT
ADDI L,1 ;COUNT CHARS
;AND FALL INTO FMTCHR
FMTCHR: IDPB T1,FMTPTR ;STORE THE CHAR
POPJ P, ;AND RETURN
CHRDIR::AOJA L,CHRLST## ;COUNT AND OUTPUT CHAR
SUBTTL Performance routines -- JOBPRF - Print JOB mode statistics
JOBPRF::SKPYES .FZPRF##(I) ;WANT PERFORMANCE STUFF?
POPJ P, ;NO--RETURN
PUSHJ P,.SAVE3## ;SAVE P1-P3
PUSHJ P,JB$TIM## ;GET RUNTIME
MOVE P1,T1 ;INTO P1
PUSHJ P,JB$IJL## ;GET LOGGED IN TIME
MOVE P2,T1 ;INTO P2
MUL P2,[^D24*^D60*^D60*^D1000];MAKE MILLSECONDS
ASHC P2,^D17 ;POSITION
$TYPE < DSK/E:>
PUSHJ P,JB$DBR## ;GET DISK READS
PUSH P,T1 ;SAVE
PUSHJ P,JB$DBW## ;GET DISK WRITES
POP P,T2 ;RESTORE READS
ADD T1,T2 ;GET TOTAL
IMULI T1,^D1000 ;CONVERT TO DISK-BLOCKS/MILLISECOND
PUSH P,T1 ;SAVE A MOMENT
MOVE T2,P2 ;GET ELAPSED TIME
PUSHJ P,TNN ;TYPE
$TYPE < DSK/C:>
POP P,T1 ;GET TOTAL READS+WRITES
MOVE T2,P1 ;GET CPU TIME
PUSHJ P,TNN ;TYPE
$TYPE < UUOS/E:>
PUSHJ P,JB$UUC## ;GET UUOS
IMULI T1,^D1000 ;CONVERT TO UUOS/MILLISECOND
MOVE T2,P2 ;GET ELAPSED TIME
PUSHJ P,TNN ;TYPE
$TYPE < UUOS/C:>
PUSHJ P,JB$UUC## ;GET UUOS
IMULI T1,^D1000 ;CONVERT TO UUOS/MILLISECOND
MOVE T2,P1 ;GET CPU TIME
PUSHJ P,TNN ;TYPE
$TYPE < CPU/E:>
MOVE T1,P1 ;GET CPU TIME
IMULI T1,^D100 ;HUNDREDS FOR PERCENT
MOVE T2,P2 ;GET ELAPSED TIME
PUSHJ P,TNN
$TYPEL <%>
POPJ P,
SUBTTL Performance routines -- LINPRF - Print LINE mode statistics
LINPRF::SKPYES .FZPRF##(I) ;SEE IF /PERF
POPJ P, ;NO
PUSHJ P,.SAVE3## ;SAVE P1-P3
PUSHJ P,XB$UPT## ;GET UPTIME
MOVE P1,T1 ;POSITION
IDIVI P1,^D1000 ;MAKE SECONDS
MOVE P2,P1 ;GET SECONDS
IDIVI P2,^D60 ;MAKE MINUTES
$TYPE < O/I:> ;GET TEXT
PUSHJ P,LB$ICT## ;GET INPUT CHAR COUNT
PUSH P,T1 ;SAVE
PUSHJ P,LB$OCT## ;GET OUTPUT CHAR COUNT
POP P,T2 ;RESTORE SCALED INPUT COUNT
PUSHJ P,TNN ;TYPE
$TYPE < OCC/E:> ;GET TEXT
PUSHJ P,LB$OCT##
MOVE T2,P1
PUSHJ P,TNN
$TYPE < ICC/E:>
PUSHJ P,LB$ICT##
MOVE T2,P1
PUSHJ P,TNN
$TYPE < CMD/EM:>
PUSHJ P,LB$CMD##
MOVE T2,P2
PUSHJ P,TNN
$TYPE < BRK/EM:>
PUSHJ P,LB$BCC##
MOVE T2,P2
PUSHJ P,TNN
PJRST .TCRLF##
SUBTTL Performance routines -- NODPRF - Print NODE mode statistics
NODPRF::POPJ P, ;NONE FOR NOW
SUBTTL Performance routines -- STRPRF - Print STRUCTURE mode statistics
STRPRF::POPJ P, ;NONE FOR NOW
SUBTTL Performance routines -- UNIPRF - Print UNIT mode statistics
UNIPRF::PUSHJ P,.SAVE2 ;SAVE SOME ACS
$TYPE < Cached:>
PUSHJ P,UB$CBK## ;GET BLOCKS CACHED
MOVE P1,T1 ;SAVE
LSH T1,7 ;CONVERT TO WORDS
PUSHJ P,.TBLOK## ;TYPE AS NNNB
JUMPE P1,.TCRLF## ;DONE IF NO BLOCKS CACHED
UNIPR1: PUSHJ P,UB$CRH## ;GET CACHED READ HITS
MOVE P1,T1 ;SAVE
PUSHJ P,UB$CRC## ;GET CACHED READ CALLS
SKIPN P2,T1 ;SAVE
JRST UNIPR2 ;THERE ARE NONE
$TYPE < Rd H/C:>
MOVE T1,P1 ;GET READ HITS
PUSHJ P,.TDECW## ;TYPE NUMBER
MOVEI T1,"/" ;TYPE
PUSHJ P,.TCHAR## ; SEPARATOR
MOVE T1,P2 ;GET READ CALLS
PUSHJ P,.TDECW## ;TYPE NUMBER
MOVEI T1,"=" ;TYPE
PUSHJ P,.TCHAR## ; SEPARATOR
DMOVE T1,P1 ;GET ARGS
IMULI T1,^D100 ;SCALE
PUSHJ P,TNN ;TYPE FRACTION
MOVEI T1,"%" ;GET TERMINATOR
PUSHJ P,.TCHAR## ;TYPE IT
UNIPR2: PUSHJ P,UB$CWH## ;GET CACHED WRITE HITS
MOVE P1,T1 ;SAVE
PUSHJ P,UB$CWC## ;GET CACHED WRITE CALLS
SKIPN P2,T1 ;SAVE
PJRST .TCRLF## ;THERE ARE NONE
$TYPE < Wt H/C:>
MOVE T1,P1 ;GET WRITE HITS
PUSHJ P,.TDECW## ;TYPE NUMBER
MOVEI T1,"/" ;TYPE
PUSHJ P,.TCHAR## ; SEPARATOR
MOVE T1,P2 ;GET WRITE CALLS
PUSHJ P,.TDECW## ;TYPE NUMBER
MOVEI T1,"=" ;TYPE
PUSHJ P,.TCHAR## ; SEPARATOR
DMOVE T1,P1 ;GET ARGS
IMULI T1,^D100 ;SCALE
PUSHJ P,TNN ;TYPE FRACTION
MOVEI T1,"%" ;GET FINAL TERMINATOR
PUSHJ P,.TCHAR## ;TYPE IT
PJRST .TCRLF## ;RETURN
SUBTTL Performance routines -- TNN - Type a fractional number
;CALL:
; T1=NUMERATOR
; T2=DENOMETER
; PUSHJ P,TNN
;types NNN, NN.N or N.NN based on size of number
TNN:: PUSHJ P,.SAVE3## ;SAVE P3
MOVE P3,T2 ;SAVE DIVISOR
IDIV T1,T2 ;DIVIDE
DMOVE P1,T1 ;SAVE INTEGER PART, REMAINDER
PUSHJ P,.TDECW## ;TYPE INTEGER PART
CAILE P1,^D99 ;NNN form?
POPJ P, ;YES--RETURN
PUSHJ P,.TDOT## ;NO--TYPE DECIMAL
CAILE P1,^D9 ;N.NN form?
JRST TNN.N ;NO--NN.N
MOVE T1,P2 ;YES--GET REMAINDER BACK
IMULI T1,^D100 ;SHIFT TO GET HUNDREDTHS DECIMAL
IDIV T1,P3 ;DIVIDE BY ORIGINAL DIVISOR
MOVEI T2,"0" ;ZERO FILL
PJRST .TDEC2## ;TYPE NN AND RETURN
TNN.N: MOVE T1,P2 ;GET REMAINDER BACK
IMULI T1,^D10 ;SHIFT TO GET TENTHS DECIMAL
IDIV T1,P3 ;DIVIDE BY ORIGINAL DIVISORT
PJRST .TDECW## ;TYPE N AND RETURN
SUBTTL END
$LOW
TTLFLG::BLOCK 1
FMTPTR: BLOCK 1
FMTBUF: BLOCK ^D132/5+1
END