.TITLE RSUROT .IDENT /V7.06/ ;************************************************************************* ; ; RSUROT ; ; THIS ROUTINE IS THE ROOT SEGMENT OF THE REPORT PREPARATION AND ; SYSTEM LOAD ANALYSIS PROGRAM RSU.TSK AND IMPLEMENTS THE "RSU" ; COMMAND IN VERSION 7 OF THE ACCOUNTING PACKAGE. ; THE FORMAT OF THE COMMAND LINE IS: ; ; RSU OUTPUTFILE=INPUTFILE[/SWITCHES] ; ; THE SWITCHES GUIDE THE FUNCTION OF RSU. THE FOLLOWING ARE ; ALLOWED: ; ; (1) NO SWITCHES. [BUT SEE /SP,/DA,/BE AND /AF BELOW] ; ---------------- ; ; RSU WILL PRODUCE A SHORT REPORT OF SYSTEM USAGE ON USER BY USER ; BASIS. DEFAULTS FOR INPUT AND OUTPUT FILES ARE: ; "INPUTFILE" DEFAULTS TO LB:[0,0]ACCOUNTS.DAT. ; "OUTPUTFILE" DEFAULTS TO TI:[UIC]DDMMMYY.RPT, WHERE "DDMMMYY" IS ; DERIVED FROM THE CURRENT DATE AND TIME. ; ; (2) /FU:GRP:MEM SWITCH. ; ----------------------- ; ; AS (1), BUT RSU ALSO PRODUCES A FULL REPORT OF EACH USERS ACTIVITY ; INPUTFILE DEFAULTS TO THE SAME AS IN (1), ; AS DOES OUTPUTFILE, EXCEPT WITH A FILETYPE OF "RPF". IF EITHER A ; GROUP CODE ("GRP") OR MEMBER CODE ("MEM") IS GIVEN, THE REPORT WILL ; BE RESTRICTED TO THESE GROUPS. A VALUE OF ZERO IN THESE FIELDS ; OR AN OMITTED FIELD IMPLIES A WILD CARD. ; ; CASES (1) AND (2) MAY BE SUPPLEMENTED BY THE /NA SWITCH, WHICH HAS ; THE FORM: ; ; /NA:NAME ; ; WHERE "NAME" IS A STRING OF UP TO 14 CHARACTERS AND OPERATES THE ; SAME AS THE /FU SWITCH, BUT SELECTS BY LAST NAME RATHER THAN BY ; UIC. IF FULL REPORTS ARE DESIRED, /FU MUST STILL BE SPECIFIED. ; ; (3) /MA SWITCH ; -------------- ; ; USE OF THIS SWITCH WHEN COMPILING A REPORT OF SYSTEM USE CAUSES ; CHAINED ACCOUNTS NOT TO BE LISTED, AND THE RESOURCES USED BY ; THESE ACCOUNTS TO BE LISTED UNDER THE MASTER ACCOUNT. THE DEFAULT ; IS /-MA. ; ; (4) /SA SWITCH ; -------------- ; ; THIS SWITCH IS USED DURING REPORT PREPARATION TO SPECIFY WHICH ; ACCOUNTS ARE TO BE FLAGGED AS "SYSTEM" ACCOUNTS, RATHER THAN AS ; "USER" ACCOUNTS, IN ORDER TO PROVIDE SEPARATE TOTALS OF SYSTEM ; USAGE. THE SWITCH CAN SPECIFY UP TO SIX OCTAL ACCOUNT NUMBERS ; (ONLY MASTER ACCOUNTS NEED BE SPECIFIED): ; ; /SA:AC1:AC2:AC3:AC4:AC5:AC6 ; ; (5) /GR SWITCH ; -------------- ; ; THIS SWITCH APPENDS TO THE REPORT A SUMMARY OF SYSTEM USAGE ON ; A GROUP-BY-GROUP BASIS. IT CAN BE USED WITH OR WITHOUT /FU, /MA ; OR /SA. ; ; (6) /LO SWITCH. ; --------------- ; ; RSU WILL PRODUCE PLOTS SUITABLE FOR LISTING ON A LINEPRINTER OR ; HARDCOPY TERMINAL, OF SYSTEM LOAD AS A FUNCTION OF TIME OF DAY. ; THIS FEATURE REQUIRES SUPPORT FOR THE "USE" COMMAND. ; "INPUTFILE" DEFAULTS TO LB:[0,0]STATISTIC.DAT. ; "OUTPUTFILE" DEFAULTS TO TI:[UIC]DDMMMYY.LOA. ; ; OTHER SWITCHES THAT MAY BE USED WITH ALL COMMANDS ARE: ; ; /SP SPOOL THE OUTPUT FILE TO THE PRINTER. THIS SWITCH IS ; IGNORED IF THE OUTPUT FILE IS A TERMINAL. ; ; /BE:DD-MMM-YY RESTRICT THE REPORT TO TRANSCATIONS RECORDED ; BEFORE OR ON THE SPECIFIED DATE. IF /BE IS OMITTED, THE ; DATE DEFAULTS TO THE LATEST TRANSACTION IN THE FILE. ; ; /AF:DD-MMM-YY RESTRICT THE REPORT TO TRANSACTIONS RECORDED ; AFTER OR ON THE SPECIFIED DATE. IF /AF IS OMITTED, THE ; DATE DEFAULTS TO THE EARLIEST TRANSACTION IN THE FILE. ; ; /DA:DD-MMM-YY RESTRICT THE REPORT TO TRANSACTIONS RECORDED ON THE ; SPECIFIED DAY. IF /DA AND EITHER OR BOTH OF /AF AND ; /BE ARE SPECIFIED, THE LATTER ARE CHECK FOR SYNTAX ; BUT ARE OTHERWISE IGNORED. IF THE DATE IS OMITTED, ; THE CURRENT DATE IS USED. ; ; VERSION: V7 OCTOBER 1981 (RSUREP OVERLAY, MAY 1981) ; ; STEVE THOMPSON ; SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA ; NY 14853 ; ; REVISION HISTORY ; ---------------- ; ; SMT777 27-OCT-81 THIS MODULE CREATED IN ADDING NEW FUNCTIONALITY ; TO THE RSU COMMAND. ; ; SMT782 6-NOV-81 ADDED THE /NA SWITCH ; ; SMT786 10-NOV-81 ADDED THE /PL SWITCH ; ; SMT791 16-NOV-81 ADDED THE /LI SWITCH ; ; SMT812 5-APR-82 CHANGED COMMAND NAME FROM RPT TO RSU ; ; SMT816 15-APR-82 ADDED THE /MA SWITCH AND ALLOWED FOR "RSUREP" ; TO PRINT THE COMMAND LINE. ; ; SMT821 23-APR-82 CHANGED ENTRY POINT NAMES OF ACCOUNTING ; SUPPORT ROUTINES (SEE MODIFY.TXT) ; ; SMT832 30-AUG-82 ADDED THE /SA SWITCH. ; ; SMT833 30-AUG-82 REMOVED UNNECESSARY CSI$-RELATED ; DEFINITIONS. ; ; SMT835 31-AUG-82 ADDED THE /GR SWITCH ; ;************************************************************************ .MCALL FINIT$ .MCALL FDBDF$,FDAT$A,FDOP$A,FDRC$A,NMBLK$,PUT$ .MCALL EXIT$S,QIOW$ .MCALL GMCR$ ; ; CONSTANTS ; EFN1 == 1 ; EVENT FLAG FOR TI: I/O LUN1 == 1 ; TI: LUN ; LUN2 (GLOBALLY DEFINED IN ACTFIL.MAC) IS FOR ; ACCOUNT FILE I/O ; LUN3 IS USED FOR ACCOUNTING DATA FILE, OR ; STATISTICS FILE. LUN4 == 4 ; LUN FOR OUTPUT FILE SPA == 40 ; SPACE COLON == ': ; COLON DPT == '. ; DECIMAL POINT CR == 15 ; CARRIAGE RETURN LF == 12 ; LINEFEED HT == 11 ; HORIZONTAL TAB FF == 14 ; FORM FEED ; ; SWITCH MASKS ; FUMSK == 1 ; SWITCH MASK FOR /FU SWITCH LOMSK == 2 ; SWITCH MASK FOR /LO SWITCH BEMSK == 4 ; SWITCH MASK FOR /BE SWITCH AFMSK == 10 ; SWITCH MASK FOR /AF SWITCH DAMSK == 20 ; SWITCH MASK FOR /DA SWITCH SPMSK == 40 ; SWITCH MASK FOR /SP SWITCH NAMSK == 100 ; SWITCH MASK FOR /NA SWITCH PLMSK == 200 ; SWITCH MASK FOR /PL SWITCH LIMSK == 400 ; SWITCH MASK FOR /LI SWITCH MAMSK == 1000 ; SWITCH MASK FOR /MA SWITCH SAMSK == 2000 ; SWITCH MASK FOR /SA SWITCH GRMSK == 4000 ; SWITCH MASK FOR /GR SWITCH LOCOMB == LOMSK ! BEMSK ! AFMSK ! DAMSK ! SPMSK ! PLMSK ; ALLOWED FOR /LO RPCOMB == FUMSK ! BEMSK ! AFMSK ! DAMSK ! SPMSK ! NAMSK ! LIMSK RPCOMB == RPCOMB ! MAMSK ! SAMSK ! GRMSK ; ; GLOBAL STORAGE ; REPFLG::.BYTE 0 ; MODE FLAG, 0=REPORT, 1=LOAD TTYFLG::.BYTE 0 ; OUTPUT DEVICE IS TERMINAL, 0=NO, 1=YES FREEHD::.WORD 0 ; FREE DYNAMIC MEMORY LISTHEAD .WORD 0 INISIZ::.WORD 0 ; INITIAL SIZE OF DYNAMIC MEMORY TIMBUF::.BLKW 8. ; TIME PARAMETERS BUFFER MASKW:: .WORD 0 ; SWITCH MASK NRECT:: .WORD 0 ; TOTAL DATA RECORDS COUNTER NRECC:: .WORD 0 ; USEABLE DATA RECORDS COUNTER BEDAY:: .WORD 0 ; /BE DAY BEMON:: .WORD 0 ; /BE MONTH BEYR:: .WORD 0 ; /BE YEAR AFDAY:: .WORD 0 ; /AF DAY AFMON:: .WORD 0 ; /AF MONTH AFYR:: .WORD 0 ; /AF YEAR DADAY:: .WORD 0 ; /DA DAY DAMON:: .WORD 0 ; /DA MONTH DAYR:: .WORD 0 ; /DA YEAR FUGRP:: .WORD 0 ; /FU GROUP CODE FUMEM:: .WORD 0 ; /FU MEMBER CODE NAME:: .BLKB 15. ; /NA NAME ; ; *NOTE* THE NEXT SIX WORDS MUST STAY TOGETHER ; .EVEN SANUM1::.WORD 0 ; /SA SWITCH VALUE #1 SANUM2::.WORD 0 ; /SA SWITCH VALUE #2 SANUM3::.WORD 0 ; /SA SWITCH VALUE #3 SANUM4::.WORD 0 ; /SA SWITCH VALUE #4 SANUM5::.WORD 0 ; /SA SWITCH VALUE #5 SANUM6::.WORD 0 ; /SA SWITCH VALUE #6 .EVEN TTLADR::.WORD 0 ; ADDRESS OF PAGE TITLE FIELD TTLSIZ::.WORD 0 ; ADDRESS OF PAGE SIZE FIELD TTLLIN::.WORD 0 ; NUMBER OF LINES IN TITLE PAGNUM::.WORD 0 ; OUTPUT PAGE COUNTER LINES:: .WORD $LINPP ; LINES PER PAGE COUNTER FILADR::.BLKW 1 ; ADDRESS OF OUTPUT LINE FILSIZ::.BLKW 1 ; SIZE OF OUTPUT LINE GMCR:: GMCR$ ; GET COMMAND LINE DPB CMDBUF == GMCR+2 ; COMMAND LINE BUFFER CMDLEN::.BLKW 1 ; LENGTH OF COMMAND LINE RECEIVED OUTBUF::.BLKB 132. ; OUTPUT BUFFER OUTFDB::FDBDF$ ; OUTPUT FDB FDAT$A R.VAR,FD.CR ; FDRC$A ,OUTBUF,132. ; FDOP$A LUN4,,DEFOUT ; DEFOUT::NMBLK$ DDMMMYY,RPT,,TI,0 ; OUTPUT DEFAULT FILENAME BLOCK TIDPB:: QIOW$ IO.WVB,LUN1,EFN1,,,,<0,0,40> TIATT:: QIOW$ IO.ATT,LUN4,EFN1 ; ATTACH OUTPUT TT: DPB TIDET:: QIOW$ IO.DET,LUN4,EFN1 ; DETACH OUTPUT TT: DPB .ENABL LC NEWPAG: .ASCII /Page / NEWPN: .BLKB 6. .EVEN .PAGE $RSUEP: FINIT$ ; INITIALISE FSR CALL $CMDEP ; CALL COMMAND ANALYSER TSTB REPFLG ; REPORT WANTED? BNE 10$ ; IF NE NO, LOAD PLOT WANTED CALL $REPEP ; CALL REPORTING OVERLAY EXIT$S ; EXIT 10$: CALL $LOAEP ; CALL LOAD PLOTTING OVERLAY EXIT$S ; EXIT ;+ ; *** CORE ; ; THIS ROUTINE IS CALLED TO ALLOCATE A PACKET OF DYNAMIC MEMORY. ; IF THE ALLOCATION IS SUCCESSFUL, THE CONTENTS ARE ZEROED. ; ; INPUTS: ; R1 DESIRED BLOCK SIZE IN BYTES ; ; OUTPUTS: ; CS ALLOCATION FAILURE. ; CC ALLOCATION SUCCESSFUL: ; R0 PACKET ADDRESS ; R1 USED ; ;- CORE:: MOV #FREEHD,R0 ; GET FREE MEMORY LISTHEAD CALL $RQCB ; REQUEST A CORE BLOCK BCS 20$ ; IF CS, ALLOCATION ERROR MOV R0,-(SP) ; SAVE ADDRESS OF PACKET ASR R1 ; CONVERT SIZE TO WORDS 10$: CLR (R0)+ ; ZERO A WORD DEC R1 ; DONE YET? BGT 10$ ; IF GT NO, LOOP MOV (SP)+,R0 ; RESTORE BLOCK ADDRESS 20$: RETURN ; RETURN TO CALLER ;+ ; *** FILOUT ; ; THIS ROUTINE IS CALLED TO WRITE A LINE OF OUTPUT TO THE OUTPUT ; FILE. IF A FORM FEED IS ENCOUNTERED, A PAGE EJECT IS PERFORMED ; AND THE PAGE NUMBER IS INCREMENTED. IF A LINEFEED IS ENCOUNTERED, ; THE LINE COUNTER IS INCREMENTED AND A FORM FEED IS PERFORMED AT ; THE END OF THE PAGE. WE ASSUME THAT IF THERE IS A FORM FEED IN ; THE BUFFER, IT IS THE FIRST CHARACTER AND THAT A SINGLE BUFFER ; NEVER CONTAINS ENOUGH LINEFEEDS TO CAUSE A PAGE THROW AFTER ; A FORMFEED. ; ; INPUTS: ; FILADR ADDRESS OF OUTPUT BUFFER ; FILSIZ LENGTH OF OUTPUT BUFFER ; ;- FILOUT::JSR R5,$SAVRG ; SET UP TO SAVE R3-R5 CMPB @FILADR,#FF ; BUFFER STARTS WITH A FORMFEED? BNE 5$ ; IF NE NO CALL EJECT ; YES, EJECT A NEW PAGE INC FILADR ; SKIP FORM FEED DEC FILSIZ ; AND DON'T COUNT IT 5$: DEC LINES ; UPDATE LINE COUNTER BGT 10$ ; IF GT, STILL ROOM ON PAGE CALL EJECT ; ELSE START A NEW PAGE 10$: MOV FILADR,R2 ; GET ADDRESS OF OUTPUT BUFFER CLR R1 ; INITIALISE BYTE COUNT 20$: CMPB (R2)+,#LF ; LINEFEED? BNE 30$ ; IF NE NO DEC LINES ; UPDATE LINE COUNTER BGT 30$ ; IF GT, STILL ROOM ON PAGE CALL EJECT ; ELSE START A NEW PAGE 30$: INC R1 ; UPDATE BYTE COUNT CMP FILSIZ,R1 ; ANY MORE BYTES TO SCAN? BGT 20$ ; IF GT YES, LOOP PUT$ #OUTFDB,FILADR,FILSIZ ; NO, WRITE LINE TO OUTPUT RETURN ; AND RETURN ;+ ; SUBROUTINE TO START A NEW PAGE ;- EJECT:: JSR R2,$SAVVR ; SAVE R0-R2 INC PAGNUM ; SET NEW PAGE NUMBER MOV #NEWPN,R0 ; GET BUFFER ADDRESS FOR NEW PAGE NUMBER MOV PAGNUM,R1 ; GET NEW PAGE NUMBER CALL DE.CML ; CONVERT TO DECIMAL MOVB #LF,(R0)+ ; FOLLOW WITH A LINEFEED SUB #NEWPAG,R0 ; CALCULATE MESSAGE LENGTH MOV R0,R1 ; TRANSFER TO R1 PUT$ #OUTFDB,#NEWPAG,R1 ; WRITE NEW PAGE HEADING MOV #<$LINPP-2>,LINES ; RESET LINE COUNTER TST TTLSIZ ; TITLE AVAILABLE? BEQ 10$ ; IF EQ NO PUT$ #OUTFDB,TTLADR,TTLSIZ ; YES, WRITE IT OUT SUB TTLLIN,LINES ; AND UPDATE LINE COUNTER 10$: RETURN ; RETURN TO CALLER ;+ ; *** FRESIZ ; ; THIS ROUTINE IS CALLED TO CALCULATE THE SIZE OF FREE DYNAMIC MEMORY. ; ; OUTPUTS: ; R1 DYNAMIC MEMORY SIZE (BYTES) ; ALL OTHER REGISTERS PRESERVED ;- FRESIZ::MOV R0,-(SP) ; SAVE R0 MOV #FREEHD,R0 ; GET ADDRESS OF LISTHEAD CLR R1 ; ZERO COUNTER 10$: MOV (R0),R0 ; GET ADDRESS OF NEXT PACKET BEQ 20$ ; IF EQ, END OF LIST ADD 2(R0),R1 ; UPDATE TOTAL SIZE BR 10$ ; AND LOOP 20$: MOV (SP)+,R0 ; RESTORE R0 RETURN ; RETURN TO CALLER .END $RSUEP