Google
 

Trailing-Edge - PDP-10 Archives - bb-d868a-bm - 3-sources/acctpr.mac
There are 3 other files named acctpr.mac in the archive. Click here to see a list.
;<3-UTILITIES>ACCTPR.MAC.7,  8-Nov-77 10:43:16, EDIT BY KIRSCHEN
;<3-UTILITIES>ACCTPR.MAC.6,  8-Nov-77 10:37:34, EDIT BY KIRSCHEN
;MORE COPYRIGHT UPDATING...
;<3-UTILITIES>ACCTPR.MAC.5, 26-Oct-77 10:56:10, EDIT BY KIRSCHEN
;UPDATE COPYRIGHT FOR RELEASE 3
;<3-UTILITIES>ACCTPR.MAC.4, 29-Sep-77 20:59:25, EDIT BY OSMAN
;USE CLZFF INSTEAD OF RLJFN SO THAT OTHER PROCESS'S JFNS DON'T GET FLUSHED
;<3-UTILITIES>ACCTPR.MAC.3, 25-Aug-77 11:24:01, EDIT BY KIRSCHEN
;FIX VERSION NUMBERS FOR RELEASE 3
;<3-UTILITIES>ACCTPR.MAC.2, 12-Aug-77 15:29:50, Edit by HESS
;TCO 1850 - FIX DISK RECORD CLOBBERAGE FOR ALPHANUMERIC ACCOUNTS
;<2-UTILITIES>ACCTPR.MAC.8,  3-Feb-77 11:52:54, EDIT BY KIRSCHEN
;TCO 1730 - MAKE ACCTPR HANDLE PRE-RELEASE-2 FACT ENTRIES PROPERLY
;<2-UTILITIES>ACCTPR.MAC.7, 27-Dec-76 17:05:03, EDIT BY HURLEY
;<2-UTILITIES>ACCTPR.MAC.6, 23-Sep-76 14:26:45, Edit by HESS
;TCO 1537 - HANDLE NEW DISK TYPE FACT ENTRIES & CHANGE OUTPUT FORMAT
;<2-UTILITIES>ACCTPR.MAC.2, 10-Sep-76 16:01:35, EDIT BY CROSSLAND
;TCO # 1525  PAD ALPANUMERIC ACCOUNTS TO 39 CHARACTER, REMOVE EXTRA PADDING
;FROM DISK STATISTICS
;TCO # 1524 EDUCATED PROGRAM ABOUT NUMERIC ACCOUNT DESIGNATORS.
;<1A-UTILITIES>ACCTPR.MAC.21,  6-MAY-76 10:49:49, EDIT BY HURLEY
;<1A-UTILITIES>ACCTPR.MAC.15,  8-APR-76 11:05:29, EDIT BY HURLEY
;TCO 1244 - ADD .DIRECT .XTABM FOR MACRO 50 ASSEMBLIES
;<V-SOURCES>ACCTPR.MAC.14, 23-DEC-75 12:11:37, EDIT BY LEWINE

TITLE ACCTPR - PROGRAM TO TRANSLATE BINARY ACCOUNTING FILES TO ASCII
SUBTTL		D. KIRSCHEN		11-20-75



;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976, 1977, 1978 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

	SEARCH MONSYM, MACSYM
	.REQUIRE SYS:MACREL
	SALL
	IFNDEF .PSECT,<
	.DIRECT .XTABM>

; ACCUMULATOR DEFINITIONS

	T1=1		;GENERAL PURPOSE
	T2=2		;GENERAL PURPOSE
	T3=3		;GENERAL PURPOSE
	T4=4		;GENERAL PURPOSE
	P1=5		;PRESERVED
	P2=6		;PRESERVED
	P3=7		;PRESERVED
	P4=10		;PRESERVED
	CX=16		;RESERVED FOR SUPPORT CODE
	P=17		;PUSH-DOWN STACK

; VERSION NUMBERS

	VMAJOR==3		;MAJOR VERSION
	VMINOR==0		;MINOR VERSION
	VWHO==0			;WHO LAST EDITED (0= DEC DEVELOPMENT)
	VEDIT==31		;EDIT NUMBER

VACCTP== <VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT

; SYMBOL DEFINITIONS

PDLEN==50		;LENGTH OF PUSH-DOWN STACK
NCHPW==5		;NUMBER OF ASCII CHARACTERS PER WORD
CMDMAX==100		;MAX SIZE OF COMMAND TABLE
NAMSIZ==21		;SIZE OF NAME BUFFER
ENTMSZ==40		;MAX SIZE OF FACT ENTRY BLOCK
BUFSIZ==200		;SIZE OF INPUT TEXT BUFFER
ATMSIZ==BUFSIZ		;SIZE OF ATOM BUFFER FOR COMND JSYS
GJFSIZ==.GJRTY+2	;SIZE OF GTJFN BLOCK USED BY COMND JSYS
NUMFLG==<FLD(^D12,NO%COL)+FLD(^D10,NO%RDX)+NO%LFL+NO%ZRO>
SUBTTL	OUTPUT RECORD FIELD SIZE DEFINITIONS

.FSCOD==3		;ENTRY CODE TYPE
.FSJOB==3		;JOB NUMBER
.FSLIN==4		;LINE NUMBER
.FSNAM==^D81		;NAME
.FSMON==2		;MONTH
.FSDAY==2		;DAY
.FSYR==2		;YEAR
.FSTIM==4		;TIME
.FSRUN==^D12		;RUNTIME
.FSATP==1		;ACCOUNT TYPE (A=ALPHANUMERIC, N=NUMERIC)
.FSACT==^D39		;ACCOUNT
.FSCON==^D12		;CONSOLE TIME
.FSFIL==^D12		;NUMBER OF FILE PAGES
.FSLPT==^D12		;NUMBER OF PRINTER PAGES
.FSCDR==^D12		;NUMBER OF CARDS READ
.FSDEV==6		;SPOOLED DEVICE
SUBTTL	FACT FILE ENTRY DEFINITIONS

; OFFSETS INTO FACT ENTRIES

.EFRUN==3		;RUN TIME
.EFFIL==3		;NUMBER OF FILE PAGES
.EFCON==4		;CONSOLE TIME
.EFDEV==4		;DEVICE DESIGNATOR IN SPOOLER ENTRIES
.EFQUA==5		;QUANTITY OF OUTPUT IN SPOOLER ENTRIES

; FIELD DEFINITIONS FOR STANDARD FIELDS IN THE ENTRIES

MSKSTR (ENTCOD,FCTENT+.EFHDR,EF%COD)	;ENTRY TYPE CODE
MSKSTR (ENTJOB,FCTENT+.EFHDR,EF%JOB)	;JOB NUMBER
MSKSTR (ENTLIN,FCTENT+.EFHDR,EF%LIN)	;LINE NUMBER
MSKSTR (ENTSIZ,FCTENT+.EFHDR,EF%SIZ)	;SIZE OF ENTRY
DEFSTR (ENTUSR,FCTENT+.EFUSR,35,36)	;USER NAME
DEFSTR (ENTTAD,FCTENT+.EFTAD,35,36)	;TIME AND DATE
DEFSTR (ENTRUN,FCTENT+.EFRUN,35,36)	;RUN TIME
DEFSTR (ENTFIL,FCTENT+.EFFIL,35,36)	;NUMBER OF FILE PAGES USED
DEFSTR (ENTCTM,FCTENT+.EFCON,35,36)	;CONSOLE TIME
DEFSTR (ENTDEV,FCTENT+.EFDEV,35,36)	;DEVICE IN SPOOLER ENTRIES
DEFSTR (ENTQUA,FCTENT+.EFQUA,35,36)	;QUANTITY OF OUTPUT IN SPOOLER ENTRIES

; INDEX IN FACT ENTRIES TO ACCOUNT TYPE WORD

.AWLGI==4		;LOGIN
.AWCAC==4		;CHANGE ACCOUNT
.AWDSK==4		;DISK UTILIZATION
.AWLPT==7		;LINE PRINTER
.AWCDR==7		;CARD READER
SUBTTL	MACRO DEFINITIONS

; FUNCTION DESCRIPTOR BLOCK FOR COMND JSYS

DEFINE CMFDB (TYPE,FLAGS,DATA,HELP,DEFLT,LST)
<	..XX== < FLD(TYPE,CM%FNC) + FLAGS + LST >
  IFNB <HELP>,< ..XX== ..XX+CM%HPP >
  IFNB <DEFLT>,< ..XX== ..XX+CM%DPP >
	..XX
  IFNB <DATA>,<DATA>
  IFB <DATA>,<0>
  IFNB <HELP>, <POINT 7,[ASCIZ\HELP\] >
  IFB <HELP>,  <0>
  IFNB <DEFLT>, <POINT 7,DEFLT >
  IFB <DEFLT>, <0>
>

DEFINE TXT(TEXT) <POINT 7,[ASCIZ\TEXT\]>
SUBTTL	MAIN ENTRY POINT AND INITIALIZATION

START:	RESET			;RESET THE UNIVERSE
	MOVE P,[IOWD PDLEN,PDL]	;SET UP THE PUSH-DOWN STACK
	MOVX T1,.FHSLF		;GET OUR FORK HANDLE
	MOVE T2,[LEVTAB,,CHNTAB] ;GET INTERRUPT TABLE ADDRESSES
	SIR			;SET INTERRUPT TABLE ADDRESSES
	MOVX T1,.FHSLF		;GET OUR FORK HANDLE
	MOVX T2,1B<.ICEOF>	;GET END-OF-FILE-CHANNEL BIT
	AIC			;ACTIVATE INTERRUPT CHANNEL FOR EOF
	MOVX T1,.FHSLF		;GET OUR FORK HANDLE
	EIR			;ENABLE INTERUUPTS FOR THIS PROCESS

; SET UP COMMAND STATE BLOCK FOR COMND JSYS

	HRROI T1,PROMPT		;GET POINTER TO PROMPT STRING
	MOVEM T1,CMDBLK+.CMRTY	;PUT RE-TYPE PROMPT POINTER IN STATE BLOCK
	HRROI T1,BUFFER		;GET POINTER TO INPUT TEXT BUFFER
	MOVEM T1,CMDBLK+.CMPTR	;SAVE POINTER TO COMMAND STRING
	MOVEM T1,CMDBLK+.CMBFP	;SAVE POINTER TO START-OF-BUFFER
	MOVE T1,[.PRIIN,,.PRIOU] ;GET PRIMARY INPUT,, OUTPUT JFN'S
	MOVEM T1,CMDBLK+.CMIOJ	;SAVE PRIMARY JFN'S
	MOVEI T1,PARSE1		;GET RE-PARSE ADDRESS
	MOVEM T1,CMDBLK+.CMFLG	;SAVE RE-PARSE ADDRESS
	SETZM CMDBLK+.CMINC	;INITIALIZE # OF CHARACTERS AFTER POINTER
	MOVEI T1,BUFSIZ*NCHPW	;GET # OF CHARACTERS IN BUFFER AREA
	MOVEM T1,CMDBLK+.CMCNT	;SAVE INITIAL # OF FREE CHARACTER POSITIONS
	HRROI T1,ATMBFR		;GET POINTER TO ATOM BUFFER
	MOVEM T1,CMDBLK+.CMABP	;SAVE POINTER TO LAST ATOM INPUT
	MOVEI T1,ATMSIZ*NCHPW	;GET # OF CHARACTERS IN ATOM BUFFER
	MOVEM T1,CMDBLK+.CMABC	;SAVE COUNT OF SPACE LEFT IN ATOM BUFFER
SUBTTL	COMMAND PARSER AND DISPATCH

PARSE:	CALL TSTCOL		;GO OUTPUT CRLF IF NEEDED
	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[CMFDB (.CMINI)] ;GET FUNCTION DESCRIPTOR BLOCK
	COMND			;INITIALIZE COMMAND SCANNER JSYS

PARSE1:	MOVE T1,[CZ%NCL+.FHSLF]	;RELEASE ALL NON-OPEN JFNS IN OURSELF AND BELOW
	CLZFF
	MOVE T1,[GJFBLK,,GJFBLK+1] ;SET UP TO CLEAR GTJFN BLOCK
	SETZM GJFBLK		;CLEAR FIRST WORD OF BLOCK
	BLT T1,GJFBLK+GJFSIZ-1	;CLEAR GTJFN BLOCK

	MOVEI T1,GJFBLK		;GET ADDRESS OF GTJFN BLOCK
	MOVEM T1,CMDBLK+.CMGJB	;STORE POINTER TO GTJFN BLOCK
	MOVEI T1,CMDBLK		;GET POINTER TO COMMAND STATE BLOCK
	MOVEI T2,[CMFDB (.CMKEY,,CMDTAB)] ;GET FUNCTION BLOCK
	COMND			;DO INITIAL PARSE
	TXNN T1,CM%NOP		;VALID COMMAND ENTERED ?
	JRST PARSE5		;YES, GO DISPATCH TO PROCESSING ROUTINE
	CALL TSTCOL		;TEST COLUMN POSITION, NEW LINE IF NEEDED
	TMSG <? ACCTPR: No such ACCTPR command as ">
	MOVE T1,CMDBLK+.CMABP	;GET POINTER TO ATOM BUFFER
	PSOUT			;OUTPUT STRING ENTERED BY USER
	TMSG <"
>				;OUTPUT END-OF-MESSAGE
	JRST PARSE		;GO TRY TO GET A COMMAND AGAIN

PARSE5:	HRRZ T1,(T2)		;GET DISPATCH ADDRESS
	CALL (T1)		;PERFORM REQUESTED FUNCTION
	JRST PARSE		;GO PARSE NEXT COMMAND
SUBTTL	TRANSLATE COMMAND

.TRANS:	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[CMFDB (.CMNOI,,<TXT(FACT FILE)>)] ;GET NOISE PHRASE
	COMND			;PARSE NOISE PHRASE
	MOVE T1,[GJFBLK,,GJFBLK+1] ;SET UP TO CLEAR GTJFN BLOCK
	SETZM GJFBLK		;CLEAR FIRST WORD OF GTJFN BLOCK
	BLT T1,GJFBLK+GJFSIZ-1	;CLEAR GTJFN BLOCK
	HRROI T1,[ASCIZ/FACT/]	;GET DEFAULT NAME FOR INPUT FILE
	MOVEM T1,GJFBLK+.GJNAM	;SAVE DEFAULT FILE NAME FOR GTJFN
	HRROI T1,[ASCIZ/BIN/]	;GET DEFAULT EXTENSION
	MOVEM T1,GJFBLK+.GJEXT	;SAVE DEFAULT EXTENSION
	MOVX T1,GJ%OLD		;GET "OLD FILE ONLY" FLAG
	MOVM T1,GJFBLK+.GJGEN	;SAVE GTJFN FLAGS
	MOVEI T2,[CMFDB (.CMFIL)] ;GET OUTPUT FILE FUNCTION
	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	COMND			;PARSE OUTPUT FILE
	TXNN T1,CM%NOP		;PARSED FILENAME OK ?
	JRST TRAN10		;YES, GO ON AND SAVE JFN
	CALL TSTCOL		;NO, ISSUE CRLF IF NEEDED
	TMSG <? ACCTPR: Invalid file specification,
	>			;OUTPUT INITIAL PART OF MESSAGE
	callret typerr		;go type out error string

; HERE ON A VALID FILE SPEC

TRAN10:	MOVEM T2,INJFN		;SAVE INPUT FILE JFN
	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[CMFDB (.CMNOI,,<TXT(TO)>)] ;GET NOISE PHRASE
	COMND			;PARSE NOISE PHRASE
	MOVE T1,[GJFBLK,,GJFBLK+1] ;SET UP TO CLEAR GTJFN BLOCK
	SETZM GJFBLK		;CLEAR FIRST WORD OF GTJFN BLOCK
	BLT T1,GJFBLK+GJFSIZ-1	;CLEAR GTJFN BLOCK
	HRROI T1,[ASCIZ/FACT/]	;GET DEFAULT NAME FOR INPUT FILE
	MOVEM T1,GJFBLK+.GJNAM	;SAVE DEFAULT FILE NAME FOR GTJFN
	HRROI T1,[ASCIZ/TXT/]	;GET DEFAULT EXTENSION
	MOVEM T1,GJFBLK+.GJEXT	;SAVE DEFAULT EXTENSION
	MOVX T1,GJ%FOU		;GET FOR OUTPUT USE FLAG
	MOVM T1,GJFBLK+.GJGEN	;SAVE GTJFN FLAGS
	MOVEI T2,[CMFDB (.CMFIL)] ;GET OUTPUT FILE FUNCTION
	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	COMND			;PARSE OUTPUT FILE
	TXNN T1,CM%NOP		;PARSED FILENAME OK ?
	JRST TRAN20		;YES, GO GET CONFIRMATION
	CALL TSTCOL		;ISSUE CRLF IF NEEDED
	TMSG <? ACCTPR: Invalid file specification,
	>			;ISSUE INITIAL PART OF MESSAGE
	call typerr		;go type out error string
	MOVE T1,INJFN		;GET INPUT JFN
	RLJFN			;RELEASE INPUT JFN
	 JFCL			;IGNORE ERROR
	RET			;RETURN TO PARSER

; HERE TO GET CONFIRMATION OF COMMAND AND OPEN FILES

TRAN20:	MOVEM T2,OUTJFN		;SAVE OUTPUT FILE JFN
	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[CMFDB (.CMCFM)] ;GET CONFIRMATION
	COMND			;PARSE END-OF-COMMAND
	TXNE T1,CM%NOP		;END-OF-COMMAND PARSED OK ?
	CALLRET COMER1		;NO, GO ISSUE MESSAGE
	MOVE T1,INJFN		;GET INPUT FILE JFN
	MOVX T2,<FLD(^D36,OF%BSZ)+OF%RD> ;READ ACCESS
	OPENF			;OPEN BINARY INPUT FILE
	 JRST TRAN40		;ERROR ON OPEN
	MOVE T1,OUTJFN		;GET OUTPUT JFN
	MOVX T2,<FLD(7,OF%BSZ)+OF%WR> ;GET WRITE ACCESS
	OPENF			;OPEN OUTPUT FILE
	 JRST OUTP50		;ERROR, GO ISSUE MESSAGE
	SETZM HITAD		;INITIALIZE HIGHEST TIME AND DATE

; LOOP TO PROCESS ALL ENTRIES IN FACT FILE

TRAN30:	CALL GETENT		;GO READ AN ENTRY FROM INPUT FACT FILE
	MOVEM T1,P1		;SAVE INDEX INTO DISPATCH TABLE
	LOAD T1,ENTTAD		;GET TIME AND DATE FROM FACT ENTRY
	CAMLE T1,HITAD		;FOUND A NEW HIGHEST TIME AND DATE ?
	MOVEM T1,HITAD		;YES, STORE NEW HIGHEST TIME AND DATE
	CALL DOHDR1		;OUTPUT INITIAL HEADER INFORMATION
	MOVE T2,HITAD		;GET HIGHEST TIME AND DATE SEEN SO FAR
	LOAD T1,ENTSIZ		;GET SIZE OF FACT FILE ENTRY
	CAIGE T1,.EFTAD		;TIME AND DATE PRESENT ?
	STOR T2,ENTTAD		;NO, USE HIGHEST TIME AND DATE THUS FAR
	CALL DOHDR2		;OUTPUT DIRECTORY AND TIME AND DATE
	HRRZ T1,TYPTAB(P1)	;GET ROUTINE TO PROCESS THIS ENTRY
	CALL (T1)		;GO CALL PROCESSING ROUTINE
	JRST TRAN30		;GO DO NEXT ENTRY

; HERE ON ERROR ON INPUT FILE OPEN

TRAN40:	CALL TSTCOL		;ISSUE CRLF IF NEEDED
	TMSG <? ACCTPR: Could not open input file because:
>				;ISSUE ERROR MESSAGE
	call typerr		;go type out error string
	MOVE T1,INJFN		;GET INPUT FILE JFN
	RLJFN			;RELEASE THE JFN
	 JSERR			;UNEXPECTED ERROR
	JRST TRAN60		;GO RELEASE THE OUTPUT FILE JFN

; HERE ON ERROR ON OUTPUT FILE OPEN

OUTP50:	CALL TSTCOL		;ERROR, ISSUE CRLF IF NEEDED
	TMSG <? ACCTPR: Could not open output file because:
>				;ISSUE ERROR MESSAGE
	call typerr		;go type out error string
TRAN60:	MOVE T1,OUTJFN		;GET OUTPUT JFN
	RLJFN			;RELEASE THE JFN
	 JSERR			;UNEXPECTED ERROR
	RET			;RETURN
SUBTTL	HELP AND EXIT COMMANDS

.EXIT:	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND BLOCK
	MOVEI T2,[CMFDB (.CMNOI,,<TXT(TO MONITOR)>)]
	COMND			;PARSE NOISE PHRASE
	MOVEI T2,[CMFDB (.CMCFM)] ;GET FUNCTION BLOCK FOR CONFIM
	COMND			;PARSE CONFIRMATION
	TXNE T1,CM%NOP		;VALID END-OF-COMMAND SEEN ?
	CALLRET COMER1		;NO, ISSUE ERROR MESSAGE AND RETURN
	SETOM T1		;INDICATE ALL FILES SHOULD BE CLOSED
	CLOSF			;CLOSE ALL OPEN FILES
	 JSERR			;UNEXPECTED ERROR
	HALTF			;RETURN TO MONITOR
	JRST START		;IF CONTINUE'D, START OVER


; HELP COMMAND

.HELP:	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[CMFDB (.CMCFM)] ;GET CONFIRM FUNCTION
	COMND			;PARSE END-OF-COMMAND
	TXNE T1,CM%NOP		;END-OF-COMMAND PARSED OK ?
	CALLRET COMER1		;NO, ISSUE ERROR MESSAGE
	HRROI T1,HLPMSG		;GET POINTER TO HELP TEXT
	PSOUT			;OUTPUT HELP TEXT
	RET			;RETURN TO COMMAND PARSER
SUBTTL	END-OF-FILE INTERRUPT HANDLER

EOFINT:	MOVE T1,INJFN		;GET INPUT FILE JFN
	CLOSF			;CLOSE THE INPUT FILE
	 JSERR			;UNEXPECTED ERROR
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	CLOSF			;CLOSE THE OUTPUT FILE
	 JSERR			;UNEXPECTED ERROR
	MOVEI T1,START		;GET RETURN ADDRESS
	MOVEM T1,RETPC1		;STORE RETURN ADDRESS
	DEBRK			;DISMISS INTERRUPT
	0
SUBTTL	PROCESS LOGOUT ENTRIES

TRLGO:	MOVE T1,OUTJFN		;GET OUTPUT JFN
	LOAD T2,ENTRUN		;GET RUNTIME FROM ENTRY
	MOVX T3,NUMFLG		;GET FLAGS FOR NUMERIC FIELDS
	NOUT			;OUTPUT RUNTIME FROM ENTRY
	 JSERR			;UNEXPECTED ERROR
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	MOVNI T3,.FSATP+.FSACT	;GET NUMBER OF SPACES TO USE FOR PADDING
	SOUT			;OUTPUT FILLER
	LOAD T2,ENTCTM		;GET CONSOLE TIME FROM ENTRY
	MOVX T3,NUMFLG		;GET NUMERIC FIELD FLAGS
	NOUT			;OUTPUT CONSOLE TIME
	 JSERR			;UNEXPECTED ERROR
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	MOVNI T3,.FSFIL+.FSLPT+.FSCDR+.FSDEV
	SOUT			;OUTPUT FILLER TO END OF RECORD
	HRROI T2,EOR		;GET POINTER TO END-OF-RECORD
	SETZM T3		;TERMINATE ON NULL
	SOUT			;OUTPUT END-OF-RECORD
	RET			;RETURN
SUBTTL	PROCESS LOGIN ENTRIES

TRLGI:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	MOVNI T3,.FSRUN		;GET # OF COLUMNS TO PAD
	SOUT			;PAD RECORD
	MOVEI T1,.AWLGI		;GET INDEX TO ACCOUNT WORD IN LOGIN ENTRY
	CALL TSTACT		;GO TEST FOR A NUMERIC ACCOUNT
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVEI T2,"A"		;GET "ALPHANUMERIC ACCOUNT" INDICATOR
	SKIPL FCTENT+.AWLGI	;NUMERIC ACCOUNT ?
	MOVEI T2,"N"		;YES, GET "NUMERIC ACCOUNT" INDICATOR
	BOUT			;OUTPUT ACCOUNT TYPE

; OUTPUT ACCOUNT

	SKIPL FCTENT+.AWLGI	;NUMERIC ACCOUNT ?
	JRST TRLGI2		;YES, GO OUTPUT NUMERIC ACCOUNT
	HRROI T2,FCTENT+.AWLGI+1 ;GET POINTER TO ACCOUNT STRING
	MOVE T3,FCTENT+.AWLGI	;GET -<NUMBER OF CHARS> IN ACCOUNT STRING
	SOUT			;OUTPUT ACCOUNT STRING
	MOVN T3,FCTENT+.AWLGI	;GET NUMBER OF CHARACTERS IN ACCOUNT STRING
	SOS T3			;DO NOT COUNT FIRST NULL
	JRST TRLGI4		;GO PAD REMAINDER OF RECORD

; HERE TO OUTPUT NUMERIC ACCOUNT

TRLGI2:	HRROI T2,SPCBUF		;GET POINTER TO SPACE BUFFER
	MOVNI T3,^D27		;GET # OF SPACES TO OUTPUT
	SOUT			;OUTPUT FILLER
	MOVE T2,FCTENT+.AWLGI	;GET ACCOUNT TYPE WORD (NUMERIC ACCOUNT #)
	MOVX T3,<FLD(^D12,NO%COL)+FLD(^D10,NO%RDX)+NO%LFL>
	NOUT			;OUTPUT ACCOUNT NUMBER
	 JSERR			;UNEXPECTED ERROR
	MOVEI T3,.FSACT		;NUMBER OF CHARACTERS IN ACCOUNT STRING

; HERE TO OUTPUT FILLER FOR ACCOUNT STRING, FILLER TO END OF RECORD, AND
; END-OF-RECORD

TRLGI4:	MOVE T1,OUTJFN		;GET OUTPUT JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	SUBI T3,.FSACT+.FSCON+.FSFIL+.FSLPT+.FSCDR+.FSDEV
	SOUT			;OUTPUT PADDING
	HRROI T2,EOR		;GET POINTER TO END OF RECORD
	SETZM T3		;TERMINATE ON NULL
	SOUT			;OUTPUT END-OF-RECORD
	RET			;RETURN
SUBTTL	PROCESS CHKPNT ENTRIES

TRCHK:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	LOAD T2,ENTRUN		;GET RUNTIME FROM ENTRY
	MOVX T3,NUMFLG		;GET NUMERIC FIELD FLAGS
	NOUT			;OUTPUT RUNTIME
	 JSERR			;UNEXPECTED ERROR
	HRROI T2,SPCBUF		;GET POINTER TO SPACES FOR FILLER
	MOVNI T3,.FSATP+.FSACT+.FSCON+.FSFIL+.FSLPT+.FSCDR+.FSDEV
	SOUT			;OUTPUT TRAILING SPACES AS PADDING
	HRROI T2,EOR		;GET POINTER TO END-OF-RECORD
	SETZM T3		;TERMINATE ON NULL
	SOUT			;OUTPUT END-OF-RECORD
	RET			;RETURN
SUBTTL	PROCESS TIME SET ENTRIES

TRTIM:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES FOR FILLER
	MOVNI T3,.FSRUN+.FSATP+.FSACT+.FSCON+.FSFIL+.FSLPT+.FSCDR+.FSDEV
	SOUT			;OUTPUT PADDING
	HRROI T2,EOR		;GET POINTER TO END OF RECORD
	SOUT			;OUTPUT END OF RECORD
	RET			;RETURN
SUBTTL	PROCESS SYSTEM RESTART AND START-OF-DISK-STATISTICS ENTRIES

TRRES:
TRSDU:
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES FOR FILLER
	MOVNI T3,.FSRUN+.FSATP+.FSACT+.FSCON+.FSFIL+.FSLPT+.FSCDR+.FSDEV
	SOUT			;OUTPUT PADDING
	HRROI T2,EOR		;GET POINTER TO END OF RECORD
	SOUT			;OUTPUT END OF RECORD
	RET			;RETURN
SUBTTL	PROCESS ATTACH AND DETACH ENTRIES

TRDET:
TRATT:
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES FOR PADDING
	MOVNI T3,.FSRUN+.FSATP+.FSACT+.FSCON+.FSFIL+.FSLPT+.FSCDR+.FSDEV
	SOUT			;OUTPUT FILLER
	HRROI T2,EOR		;GET END-OF-RECORD TEXT
	SETZM T3		;TERMINATE ON NULL
	SOUT			;OUTPUT END-OF-RECORD
	RET			;RETURN
SUBTTL	PROCESS CHANGE ACCOUNT ENTRIES

TRCAC:	MOVE T1,OUTJFN		;GET OUTPUT JFN
	LOAD T2,ENTRUN		;GET RUNTIME FROM ENTRY
	MOVX T3,NUMFLG		;GET NUMERIC FIELD FLAGS
	NOUT			;OUTPUT RUNTIME
	 JSERR			;UNEXPECTED ERROR
	MOVEI T1,.AWCAC		;GET INDEX TO ACCOUNT WORD IN ENTRY
	CALL TSTACT		;GO TEST ACCOUNT TO SEE IF NUMERIC
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVEI T2,"A"		;GET "ALPHANUMERIC ACCOUNT" INDICATOR
	SKIPL FCTENT+.AWCAC	;NUMERIC ACCOUNT ?
	MOVEI T2,"N"		;YES, GET "NUMERIC ACCOUNT" INDICATOR
	BOUT			;OUTPUT ACCOUNT TYPE

; OUTPUT ACCOUNT

	SKIPL FCTENT+.AWCAC	;NUMERIC ACCOUNT ?
	JRST TRCAC2		;YES, GO OUTPUT NUMERIC ACCOUNT
	HRROI T2,FCTENT+.AWCAC+1 ;GET POINTER TO ACCOUNT STRING
	MOVE T3,FCTENT+.AWCAC	;GET -<NUMBER OF CHARS> IN ACCOUNT STRING
	SOUT			;OUTPUT ACCOUNT STRING
	MOVN T3,FCTENT+.AWLGI	;GET NUMBER OF CHARACTERS IN ACCOUNT STRING
	SOS T3			;DO NOT COUNT FIRST NULL
	JRST TRCAC4		;GO PAD REMAINDER OF RECORD

; HERE TO OUTPUT NUMERIC ACCOUNT

TRCAC2:	HRROI T2,SPCBUF		;GET POINTER TO SPACE BUFFER
	MOVNI T3,^D27		;GET # OF SPACES TO OUTPUT
	SOUT			;OUTPUT FILLER
	MOVE T2,FCTENT+.AWCAC	;GET ACCOUNT TYPE WORD (NUMERIC ACCOUNT #)
	MOVX T3,<FLD(^D12,NO%COL)+FLD(^D10,NO%RDX)+NO%LFL>
	NOUT			;OUTPUT ACCOUNT NUMBER
	 JSERR			;UNEXPECTED ERROR
	MOVEI T3,.FSACT		;NUMBER OF CHARACTERS IN ACCOUNT STRING

; HERE TO OUTPUT FILLER TO END OF RECORD, AND END-OF-RECORD

TRCAC4:	MOVE T1,OUTJFN		;GET OUTPUT JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	SUBI T3,.FSACT+.FSCON+.FSFIL+.FSLPT+.FSCDR+.FSDEV
	SOUT			;OUTPUT PADDING
	HRROI T2,EOR		;GET POINTER TO END OF RECORD
	SETZM T3		;TERMINATE ON NULL
	SOUT			;OUTPUT END-OF-RECORD
	RET			;RETURN
SUBTTL	PROCESS DISK UTILIZATION ENTRIES

TRDSK:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVEI T2,0		;GET A ZERO
	MOVX T3,NUMFLG		;GET NUMERIC FIELD FLAGS
	NOUT			;OUTPUT 0'S FOR RUNTIME
	 JSERR			;UNEXPECTED ERROR
	MOVEI T1,.AWDSK		;GET INDEX TO ACCOUNT WORD IN ENTRY
	CALL TSTACT		;GO TEST ACCOUNT TO SEE IF NUMERIC
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVEI T2,"A"		;GET "ALPHANUMERIC ACCOUNT" INDICATOR
	SKIPL FCTENT+.AWDSK	;NUMERIC ACCOUNT ?
	MOVEI T2,"N"		;YES, GET "NUMERIC ACCOUNT" INDICATOR
	BOUT			;OUTPUT ACCOUNT TYPE

; OUTPUT ACCOUNT

	SKIPL FCTENT+.AWDSK	;NUMERIC ACCOUNT ?
	JRST TRDSK2		;YES, GO OUTPUT NUMERIC ACCOUNT
	HRROI T2,FCTENT+.AWDSK+1 ;GET POINTER TO ACCOUNT STRING
	MOVE T3,FCTENT+.AWDSK	;GET -<NUMBER OF CHARS> IN ACCOUNT STRING
	SOUT			;OUTPUT ACCOUNT STRING
	MOVN T3,FCTENT+.AWLGI	;GET NUMBER OF CHARACTERS IN ACCOUNT STRING
	SOS T3			;DO NOT COUNT FIRST NULL
	JRST TRDSK4		;GO PAD REMAINDER OF RECORD

; HERE TO OUTPUT NUMERIC ACCOUNT

TRDSK2:	HRROI T2,SPCBUF		;GET POINTER TO SPACE BUFFER
	MOVNI T3,^D27		;GET # OF SPACES TO OUTPUT
	SOUT			;OUTPUT FILLER
	MOVE T2,FCTENT+.AWDSK	;GET ACCOUNT TYPE WORD (NUMERIC ACCOUNT #)
	MOVX T3,<FLD(^D12,NO%COL)+FLD(^D10,NO%RDX)+NO%LFL>
	NOUT			;OUTPUT ACCOUNT NUMBER
	 JSERR			;UNEXPECTED ERROR
	MOVEI T3,.FSACT		;NUMBER OF CHARACTERS IN ACCOUNT STRING

; HERE TO OUTPUT FILLER TO # OF FILE PAGES, # OF FILE PAGES, AND REST OF RECORD

TRDSK4:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	SUBI T3,.FSACT+.FSCON
	SOUT			;OUTPUT FILLER
	LOAD T2,ENTFIL		;GET # OF FILE PAGES USED
	MOVX T3,NUMFLG		;GET NUMERIC FIELD FLAGS
	NOUT			;OUTPUT # OF FILE PAGES USED
	 JSERR			;UNEXPECTED ERROR
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	MOVNI T3,.FSLPT+.FSCDR+.FSDEV
	SOUT			;OUTPUT PADDING
	HRROI T2,EOR		;GET POINTER TO END OF RECORD
	SETZM T3		;TERMINATE ON NULL
	SOUT			;OUTPUT END-OF-RECORD
	RET			;RETURN
SUBTTL	PROCESS CDR ENTRIES

TRCDR:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	LOAD T2,ENTRUN		;GET RUNTIME FROM ENTRY
	MOVX T3,NUMFLG		;GET NUMERIC FIELD FLAGS
	NOUT			;OUTPUT RUNTIME
	 JSERR			;UNEXPECTED ERROR
	MOVEI T1,.AWCDR		;GET INDEX TO ACCOUNT WORD IN ENTRY
	CALL TSTACT		;GO TEST ACCOUNT TO SEE IF NUMERIC
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVEI T2,"A"		;GET "ALPHANUMERIC ACCOUNT" INDICATOR
	SKIPL FCTENT+.AWCDR	;NUMERIC ACCOUNT ?
	MOVEI T2,"N"		;YES, GET "NUMERIC ACCOUNT" INDICATOR
	BOUT			;OUTPUT ACCOUNT TYPE

; OUTPUT ACCOUNT

	SKIPL FCTENT+.AWCDR	;NUMERIC ACCOUNT ?
	JRST TRCDR2		;YES, GO OUTPUT NUMERIC ACCOUNT
	HRROI T2,FCTENT+.AWCDR+1 ;GET POINTER TO ACCOUNT STRING
	MOVE T3,FCTENT+.AWCDR	;GET -<NUMBER OF CHARS> IN ACCOUNT STRING
	SOUT			;OUTPUT ACCOUNT STRING
	MOVN T3,FCTENT+.AWLGI	;GET NUMBER OF CHARACTERS IN ACCOUNT STRING
	SOS T3			;DO NOT COUNT FIRST NULL
	JRST TRCDR4		;GO PAD REMAINDER OF RECORD

; HERE TO OUTPUT NUMERIC ACCOUNT

TRCDR2:	HRROI T2,SPCBUF		;GET POINTER TO SPACE BUFFER
	MOVNI T3,^D27		;GET # OF SPACES TO OUTPUT
	SOUT			;OUTPUT FILLER
	MOVE T2,FCTENT+.AWCDR	;GET ACCOUNT TYPE WORD (NUMERIC ACCOUNT #)
	MOVX T3,<FLD(^D12,NO%COL)+FLD(^D10,NO%RDX)+NO%LFL>
	NOUT			;OUTPUT ACCOUNT NUMBER
	 JSERR			;UNEXPECTED ERROR
	MOVEI T3,.FSACT		;NUMBER OF CHARACTERS IN ACCOUNT STRING

; HERE TO OUTPUT FILLER FOR ACCOUNT NUMBER, FILLER TO # OF FILE PAGES,
; # OF FILE PAGES, AND REST OF RECORD

TRCDR4:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	SUBI T3,.FSACT+.FSCON+.FSFIL+.FSLPT ;GET # OF COL IN FIELDS TO CDR FIELD
	SOUT			;OUTPUT FILLER
	LOAD T2,ENTQUA		;GET QUANTITY OF OUTPUT
	MOVX T3,NUMFLG		;GET NUMERIC OUTPUT FLAGS
	NOUT			;OUTPUT NUMBER OF CARDS READ
	 JSERR			;UNEXPECTED ERROR
	MOVE T1,[NAMBUF,,NAMBUF+1] ;SET UP TO CLEAR NAME BUFFER
	SETZM NAMBUF		;CLEAR FIRST WORD OF BUFFER
	BLT T1,NAMBUF+NAMSIZ-1	;CLEAR NAME BUFFER
	HRROI T1,NAMBUF		;GET POINTER TO NAME BUFFER
	LOAD T2,ENTDEV		;GET DEVICE DESIGNATOR FROM ENTRY
	DEVST			;CONVERT DEVICE DESIGNATOR TO STRING
	 JSERR			;UNEXPECTED ERROR
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,NAMBUF		;GET POINTER TO NAME BUFFER
	MOVEI T3,.FSDEV		;GET MAXIMUM # OF CHARACTERS IN FIELD
	MOVEI T4,.CHNUL		;GET TERMINATING CHARACTER
	SOUT			;OUTPUT DEVICE NAME TO OUTPUT FILE
	MOVEI T2," "		;GET A SPACE FOR FILLER
	JUMPE T3,TRCDR6		;GO ON IF DONE
TRCDR5:	BOUT			;OUTPUT A SPACE
	SOJG T3,TRCDR5		;LOOP UNTIL ENTIRE FIELD IS FULL
TRCDR6:	HRROI T2,EOR		;GET END-OF-RECORD
	SETZM T3		;TERMINATE ON NULL
	SOUT			;OUTPUT END OF RECORD
	RET			;RETURN
SUBTTL	PROCESS LPT ENTRIES

TRLPT:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	LOAD T2,ENTRUN		;GET RUNTIME FROM ENTRY
	MOVX T3,NUMFLG		;GET NUMERIC FIELD FLAGS
	NOUT			;OUTPUT RUNTIME
	 JSERR			;UNEXPECTED ERROR
	MOVEI T1,.AWLPT		;GET INDEX TO ACCOUNT WORD IN ENTRY
	CALL TSTACT		;GO TEST ACCOUNT TO SEE IF NUMERIC
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVEI T2,"A"		;GET "ALPHANUMERIC ACCOUNT" INDICATOR
	SKIPL FCTENT+.AWLPT	;NUMERIC ACCOUNT ?
	MOVEI T2,"N"		;YES, GET "NUMERIC ACCOUNT" INDICATOR
	BOUT			;OUTPUT ACCOUNT TYPE

; OUTPUT ACCOUNT

	SKIPL FCTENT+.AWLPT	;NUMERIC ACCOUNT ?
	JRST TRLPT2		;YES, GO OUTPUT NUMERIC ACCOUNT
	HRROI T2,FCTENT+.AWLPT+1 ;GET POINTER TO ACCOUNT STRING
	MOVE T3,FCTENT+.AWLPT	;GET -<NUMBER OF CHARS> IN ACCOUNT STRING
	SOUT			;OUTPUT ACCOUNT STRING
	MOVN T3,FCTENT+.AWLGI	;GET NUMBER OF CHARACTERS IN ACCOUNT STRING
	SOS T3			;DO NOT COUNT FIRST NULL
	JRST TRLPT4		;GO PAD REMAINDER OF RECORD

; HERE TO OUTPUT NUMERIC ACCOUNT

TRLPT2:	HRROI T2,SPCBUF		;GET POINTER TO SPACE BUFFER
	MOVNI T3,^D27		;GET # OF SPACES TO OUTPUT
	SOUT			;OUTPUT FILLER
	MOVE T2,FCTENT+.AWLPT	;GET ACCOUNT TYPE WORD (NUMERIC ACCOUNT #)
	MOVX T3,<FLD(^D12,NO%COL)+FLD(^D10,NO%RDX)+NO%LFL>
	NOUT			;OUTPUT ACCOUNT NUMBER
	 JSERR			;UNEXPECTED ERROR
	MOVEI T3,.FSACT		;NUMBER OF CHARACTERS IN ACCOUNT STRING

; HERE TO OUTPUT FILLER

TRLPT4:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,SPCBUF		;GET POINTER TO SPACES
	SUBI T3,.FSACT+.FSCON+.FSFIL ;GET # OF COLUMNS IN FIELDS TO LPT FIELD
	SOUT			;OUTPUT FILLER
	LOAD T2,ENTQUA		;GET QUANTITY OF OUTPUT
	MOVX T3,NUMFLG		;GET NUMERIC OUTPUT FLAGS
	NOUT			;OUTPUT NUMBER OF PAGES PRINTED
	 JSERR			;UNEXPECTED ERROR
	MOVEI T2,0		;GET A ZERO
	MOVX T3,NUMFLG		;GET NUMERIC FIELD FLAGS
	NOUT			;OUTPUT # OF CARDS
	 JSERR			;UNEXPECTED ERROR
	MOVE T1,[NAMBUF,,NAMBUF+1] ;SET UP TO CLEAR NAME BUFFER
	SETZM NAMBUF		;CLEAR FIRST WORD OF BUFFER
	BLT T1,NAMBUF+NAMSIZ-1	;CLEAR NAME BUFFER
	HRROI T1,NAMBUF		;GET POINTER TO NAME BUFFER
	LOAD T2,ENTDEV		;GET DEVICE DESIGNATOR FROM ENTRY
	DEVST			;CONVERT DEVICE DESIGNATOR TO STRING
	 JSERR			;UNEXPECTED ERROR
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	HRROI T2,NAMBUF		;GET POINTER TO NAME BUFFER
	MOVEI T3,.FSDEV		;GET MAXIMUM # OF CHARACTERS IN FIELD
	MOVEI T4,.CHNUL		;GET TERMINATING CHARACTER
	SOUT			;OUTPUT DEVICE NAME TO OUTPUT FILE
	MOVEI T2," "		;GET A SPACE FOR FILLER
	JUMPE T3,TRLPT6		;GO ON IF DONE
TRLPT5:	BOUT			;OUTPUT A SPACE
	SOJG T3,TRLPT5		;LOOP UNTIL ENTIRE FIELD IS FULL
TRLPT6:	HRROI T2,EOR		;GET END-OF-RECORD
	SETZM T3		;TERMINATE ON NULL
	SOUT			;OUTPUT END OF RECORD
	RET			;RETURN
SUBTTL	SUBROUTINES

; GET NEXT ENTRY FROM FACT FILE
;
; CALL:		CALL GETENT
; RETURNS:	T1/INDEX INTO TYPTAB (TABLE OF KNOWN ENTRY TYPE CODES)

GETENT:	STKVAR <GTENTF,GTENTI>	;ALLOCATE "UNKNOWN ENTRY SEEN" FLAG
	SETOM GTENTF		;INDICATE NO UNKOWN ENTRIES SEEN
GETEN1:	MOVE T1,[FCTENT,,FCTENT+1] ;SET UP TO CLEAR FACT ENTRY
	SETZM FCTENT		;CLEAR FIRST WORD OF FACT ENTRY BLOCK
	BLT T1,FCTENT+ENTMSZ-1	;CLEAR FACT ENTRY BLOCK
	MOVE T1,INJFN		;GET JFN FOR INPUT FACT FILE
	BIN			;INPUT FIRST WORD OF AN ENTRY
	MOVEM T2,FCTENT		;STORE FIRST WORD OF FACT FILE ENTRY

	MOVEI T1,TYPSIZ-1	;GET INITIAL INDEX INTO TYPE TABLE
	LOAD T2,ENTCOD;		;GET ENTRY TYPE CODE FROM ENTRY
GETEN2:	HLRZ T3,TYPTAB(T1)	;GET ENTRY TYPE CODE FROM TABLE
	CAMN T3,T2		;FOUND A KNOWN TYPE CODE ?
	JRST GETEN5		;YES, GO INPUT REMAINDER OF ENTRY
	SOJGE T1,GETEN2		;NO, GO CHECK NEXT TABLE ENTRY

; HERE IF ENTRY TYPE CODE NOT IN TABLE OF KNOWN CODES

	SKIPL GTENTF		;ANY UNKNOWN ENTRIES PREVIOUSLY ENCOUNTERED ?
	JRST GETEN1		;YES, DO NOT ISSUE MESSAGE AGAIN
	SETZM GTENTF		;INDICATE AN UNKNOWN ENTRY HAS BEEN FOUND
	CALL TSTCOL		;OUTPUT CRLF IF NEEDED
	TMSG <% ACCTPR: Unknown entry type >
	MOVEI T1,.PRIOU		;GET PRIMARY OUTPUT JFN
	LOAD T2,ENTCOD;		;GET ENTRY TYPE CODE
	MOVX T3,^D8		;USE OCTAL RADIX
	NOUT			;OUTPUT ENTRY TYPE
	 JSERR			;UNEXPECTED ERROR
	TMSG < encountered
>				;OUTPUT END OF MESSAGE
	JRST GETEN1		;GO GET NEXT WORD FROM INPUT FILE

; HERE TO INPUT REMAINDER OF ENTRY

GETEN5:	MOVEM T1,GTENTI		;SAVE INDEX INTO TYPTAB
	LOAD T3,ENTSIZ		;GET SIZE OF ENTRY
	SUBI T3,1		;COMPENSATE FOR HEADER WORD, ALREADY INPUT
	JUMPE T3,GETEN8		;IF NO MORE TO INPUT, RETURN
	MOVN T3,T3		;GET NEGATIVE # OF WORDS TO INPUT
	MOVE T1,INJFN		;GET INPUT JFN
	MOVX T2,<POINT 36,FCTENT+.EFUSR> ;GET POINTER TO WHERE ENTRY GOES
	SIN			;INPUT REMAINDER OF FACT ENTRY

GETEN8:	LOAD T1,ENTUSR		;GET USER NUMBER FROM FACT ENTRY
	TLNN T1,-1		;OLD STYLE USER NUMBER ?
	HRLI T1,500000		;YES, CONVERT TO NEW STYLE USER NUMBER
	STOR T1,ENTUSR		;REPLACE USER NUMBER IN FACT ENTRY
	MOVE T1,GTENTI		;RESTORE INDEX INTO TYPTAB
	RET			;RETURN TO WHENCE WE CAME ...
; SUBROUTINE TO OUTPUT THE ENTRY TYPE CODE, JOB #, AND TERMINAL LINE #
;
; CALL:		CALL DOHDR1
; RETURNS: +1 ALWAYS

DOHDR1:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	LOAD T2,ENTCOD		;GET ENTRY TYPE CODE
	MOVX T3,<FLD(3,NO%COL)+FLD(^D8,NO%RDX)+NO%LFL+NO%ZRO>
	NOUT			;OUTPUT ENTRY TYPE CODE
	 JSERR			;UNEXPECTED ERROR
	LOAD T2,ENTJOB		;GET JOB NUMBER FROM ENTRY
	MOVX T3,<FLD(3,NO%COL)+FLD(^D10,NO%RDX)+NO%LFL+NO%ZRO>
	NOUT			;OUTPUT JOB NUMBER
	 JSERR			;UNEXPECTED ERROR
	LOAD T2,ENTLIN		;GET TERMINAL LINE NUMBER FROM ENTRY
	MOVX T3,<FLD(4,NO%COL)+FLD(^D8,NO%RDX)+NO%LFL+NO%ZRO>
	NOUT			;OUTPUT TERMINAL LINE NUMBER
	 JSERR			;UNEXPECTED ERROR
	RET			;RETURN TO WHENCE WE CAME ...
; OUTPUT DIRECTORY #, DIRECTORY NAME, AND TIME AND DATE TO OUTPUT FILE
;
; CALL:		CALL DOHDR2
; RETURNS: +1 ALWAYS

DOHDR2:	STKVAR <DOHD2D,DOHD2M,DOHD2Y>; ;ALLOCATE LOCAL STORAGE
	MOVE T1,[ASCII /     /]	;GET FIVE SPACES
	MOVEM T1,NAMBUF		;STORE AT FIRST WORD IN NAMBUF
	MOVE T1,[NAMBUF,,NAMBUF+1] ;SET UP TO CLEAR NAME BUFFER
	BLT T1,NAMBUF+NAMSIZ-1	;CLEAR NAME BUFFER TO SPACES
	LOAD T2,ENTCOD		;GET ENTRY CODE
	CAIN T2,.EFDSK		;DISKS ARE SPECIAL
	JRST [	LOAD T1,ENTSIZ	;GET SIZE
		SETZM FCTENT(T1) ;GRNTEE NULL AT END
		MOVEI T1,0	;ASSUME NUMERIC
		HLRZ T2,FCTENT+.AWDSK
		CAIN T2,-1	;???
		CALL [	MOVN T1,FCTENT+.AWDSK ;ALPHA - GET SIZE
			IDIVI T1,NCHPW
			SKIPE T2
			AOS T1		;ADJUST TO # OF WORDS
			RET]
		HRROI T2,FCTENT+.AWDSK+2(T1) ;POINT TO STRING
		HRROI T1,NAMBUF ;COPY TO NAME BUFFER
		MOVEI T3,0
		SOUT
		JRST DOHD2A]	;CONTINUE PROCESSING
	HRROI T1,NAMBUF		;GET POINTER TO NAME BUFFER
	LOAD T2,ENTUSR		;GET USER NUMBER
	DIRST			;OUTPUT DIRECTORY NAME
	 JRST [	MOVEI T3,.FSNAM	;CANNOT TRANSLATE, GET # OF COLUMNS IN FIELD
		JRST DOHD2B ]	;GO PAD FIELD WITH SPACES
DOHD2A:	MOVEI T4," "		;GET A SPACE
	IDPB T4,T1		;STORE A SPACE TO TERMINATE NAME STRING
	MOVE T1,OUTJFN		;GET OUTPUT JFN
	HRROI T2,NAMBUF		;GET POINTER TO DIRECTORY NAME
	MOVEI T3,.FSNAM		;GET MAXIMUM CHARACTER COUNT
	MOVEI T4," "		;GET TERMINATING CHARACTER
	SOUT			;OUTPUT DIRECTORY NAME
	JUMPE T3,DOHD2E		;IF ENTIRE FIELD FILLED, GO ON
DOHD2B:	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVEI T2," "		;GET A SPACE
DOHD2C:	BOUT			;OUTPUT A SPACE AS FILLER
	SOJG T3,DOHD2C		;LOOP UNTIL ENTIRE FIELD FILLED
	; ..
	; ..
DOHD2E:	LOAD T2,ENTTAD		;GET TIME AND DATE FROM ENTRY
	SETZM T4		;NORMAL FORMAT
	ODCNV			;GET DATE AND TIME IN DAY, MONTH, YEAR
	HLRZM T3,DOHD2D		;SAVE DAY OF MONTH
	HRRZM T2,DOHD2M		;SAVE MONTH
	HLRZM T2,DOHD2Y		;SAVE YEAR
	MOVEI T1,1		;ODCNV RETURNS DAY FROM 0-6, MONTH FROM 0-11
	ADDM T1,DOHD2D		;MAKE DAY BE BETWEEN 1 AND 7
	ADDM T1,DOHD2M		;MAKE DAY BE BETWEEN 1 AND 12
	MOVE T1,DOHD2Y		;GET YEAR
	IDIVI T1,^D100		;REMAINDER IS LAST TWO DIGITS OF YEAR
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVX T3,<FLD(2,NO%COL)+FLD(^D10,NO%RDX)+NO%LFL+NO%ZRO>
	NOUT			;OUTPUT YEAR
	 JSERR			;UNEXPECTED ERROR
	MOVE T1,OUTJFN		;GET OUTPUT FILE JFN
	MOVE T2,DOHD2M		;GET MONTH
	NOUT			;OUTPUT MONTH
	 JSERR			;UNEXPECTED ERROR
	MOVE T2,DOHD2D		;GET DAY OF MONTH
	NOUT			;OUTPUT DAY OF MONTH
	 JSERR			;UNEXPECTED ERROR
	LOAD T2,ENTTAD		;GET TIME AND DATE FROM ENTRY AGAIN
	MOVX T3,1B0+1B10+1B12	;OMIT DATE FROM OUTPUT
	ODTIM			;OUTPUT TIME
	RET			;RETURN
; ROUTINE TO TEST ACCOUNTS IN FACT ENTRIES, CONVERTING ALPHANUMERIC
; ACCOUNTS OF ALL DIGITS TO THE EQUIVALENT NUMERIC ACCOUNT, AND TO TURN
; OFF NUMERIC ACCOUNT DESIGNATOR IF ON.


; CALL:	ACCEPTS IN T1/ INDEX INTO FACT ENTRY OF ACCOUNT TYPE WORD
;		CALL TSTACT
; RETURNS: +1 ALWAYS, FACT ENTRY CHANGED IF REQUIRED

TSTACT:	HLRZ T2,FCTENT(T1)	;PICK UP LEFT HALF OF ACCOUNT NUMBER
	CAIN T2,-1		;ALPHANUMERIC ACCOUNT IN ENTRY
	JRST TSTAC1		;YES
	TRZ T2,500000		;NO, TURN OFF NUMERIC ACCOUNT INDICATOR
	HRLM T2,FCTENT(T1)	;STORE RIGHT HALF BACK
	RET			;RETURN
TSTAC1:	STKVAR <TACTWD>		;ALLOCATE LOCAL STORAGE
	MOVEM T1,TACTWD		;SAVE INDEX INTO FACT ENTRY TO ACCOUNT WORD
	HRROI T1,FCTENT+1(T1)	;GET POINTER TO ACCOUNT STRING IN ENTRY
	MOVX T3,<FLD(^D10,NO%RDX)> ;GET DECIMAL RADIX
	NIN			;INPUT NUMBER FROM ACCOUNT STRING
	 RET			;RETURN IF FIRST CHARACTER NOT A DIGIT
	LDB T1,T1		;GET TERMINATING CHARACTER
	JUMPN T1,R		;RETURN IF TERMINATED BY A NON-DIGIT CHARACTER
	MOVE T1,TACTWD		;GET INDEX TO ACCOUNT WORD IN FACT ENTRY
	MOVEM T2,FCTENT(T1)	;SAVE NUMERIC ACCOUNT IN FACT ENTRY
	RET			;RETURN


; output last error string to terminal

typerr:	MOVEI T1,.PRIOU		;GET PRIMARY OUTPUT JFN
	HRLOI T2,.FHSLF		;GET OUR FORK HANDLE
	SETZM T3		;NO LIMIT
	ERSTR			;OUTPUT GTJFN ERROR MESSAGE
	 JFCL			;IGNORE ERSTR ERRORS
	 JFCL			;IGNORE ERSTR ERRORS
	RET			;RETURN
SUBTTL	COMMAND ERROR SUBROUTINES

; INVALID END-OF-COMMAND

COMER1:	CALL TSTCOL		;TEST COLUMN POSITION
	TMSG <? CHKPNT: Garbage at end-of-command
>				;OUTPUT ERROR MESSAGE
	RET			;RETURN TO WHENCE WE CAME ...


; SUBROUTINE TO TEST COLUMN POSITION AND OUTPUT CRLF IF NEEDED

TSTCOL:	movei t1,.priou		;get primary output designator
	rfpos			;read file position
	hrrz t2,t2		;keep just the column position
	JUMPE T2,R		;IF AT COLUMN 1 DO NOT OUTPUT CRLF
	tmsg <
>				;no, output a crlf
	RET			;RETURN TO WHENCE WE CAME ...
SUBTTL CONSTANTS AND TABLES

DEFINE TB(RTN,TXT)
<	[ASCIZ/TXT/] ,, RTN
>

CMDTAB: CMDSIZ-1,, CMDSIZ
	TB (.EXIT,EXIT)
	TB (.HELP,HELP)
	TB (.TRANS,TRANSLATE)

	CMDSIZ==.-CMDTAB

PROMPT:	ASCIZ /ACCTPR>/

; TABLE OF KNOWN ENTRY CODE TYPES

TYPTAB:	.EFLGI ,, TRLGI
	.EFLGO ,, TRLGO
	.EFDET ,, TRDET
	.EFATT ,, TRATT
	.EFCAC ,, TRCAC
	.EFCHK ,, TRCHK
	.EFSDU ,, TRSDU
	.EFDSK ,, TRDSK
	.EFRES ,, TRRES
	.EFTIM ,, TRTIM
	.EFLPT ,, TRLPT
	.EFCDR ,, TRCDR

	TYPSIZ==.-TYPTAB
; ENTRY VECTOR

ENTVEC:	JRST START
	JRST START
	VACCTP

; TABLES FOR INTERRUPT SYSTEM

LEVTAB:	RETPC1
	RETPC2
	RETPC3

CHNTAB:	REPEAT .ICEOF, <0>
	1,, EOFINT
	REPEAT ^D36-.ICEOF-1, <0>

; BUFFER OF SPACES FOR USE IN PADDING

SPCBUF:	REPEAT ^D34, <ASCII "     ">
	ASCIZ " "

EOR:	ASCIZ /
/				;END-OF-RECORD TEXT

; HELP TEXT

HLPMSG:	ASCIZ /
FUNCTION
	ACCTPR translates the entries in the binary accounting files
(FACT files) to a printable, ascii text file.  This text file is
suitable for use as input to a subsequent processing program for sorting,
data reduction, report generation, and so on. The prompt which indicates
the program's readyness to accept commands is ACCTPR>.

COMMANDS

TRANSLATE (FACT FILE) FILE-SPEC (TO) OUTPUT-FILE-SPEC
EXIT (TO MONITOR)
HELP

/
SUBTTL	VARIABLE DATA STORAGE

RETPC1:	BLOCK 1			;RETURN PC 1 FOR INTERRUPT SYSTEM
RETPC2:	BLOCK 1			;RETURN PC 2 FOR INTERRUPT SYSTEM
RETPC3:	BLOCK 1			;RETURN PC 3 FOR INTERRUPT SYSTEM
CMDBLK:	BLOCK .CMGJB+5		;COMMAND STATE BLOCK FOR COMND JSYS
BUFFER:	BLOCK BUFSIZ		;INPUT TEXT STORED HERE
ATMBFR:	BLOCK ATMSIZ		;ATOM BUFFER FOR COMND JSYS
GJFBLK:	BLOCK GJFSIZ		;GTJFN BLOCK FOR COMND JSYS
NAMBUF:	BLOCK NAMSIZ		;NAME BUFFER
HITAD:	BLOCK 1			;HIGHEST TIME AND DATE SEEN THUS FAR
FCTENT:	BLOCK ENTMSZ		;FACT FILE ENTRY GOES HERE
INJFN:	BLOCK 1			;INPUT FACT FILE JFN
OUTJFN:	BLOCK 1			;OUTPUT FILE JFN
PDL:	BLOCK PDLEN		;PUSH DOWN POINTER

	END <3,,ENTVEC>