Google
 

Trailing-Edge - PDP-10 Archives - AP-4172F-BM - 3a-sources/conv20.mac
There are 3 other files named conv20.mac in the archive. Click here to see a list.
;<HUIZENGA.CONV20>CONV20.MAC.7, 14-Dec-77 09:55:29, EDIT BY HUIZENGA
;CONSOLE CONNECT TIME IN LOGOUT ENTRY NEEDS TO BE IN MILLISECONDS
;<3-UTILITIES>CONV20.MAC.7,  8-Nov-77 10:46:51, EDIT BY KIRSCHEN
;MORE COPYRIGHT UPDATING...
;<3-UTILITIES>CONV20.MAC.6, 26-Oct-77 10:59:38, EDIT BY KIRSCHEN
;UPDATE COPYRIGHT FOR RELEASE 3

TITLE CONV20 - USAGE FORMAT TO FACT FORMAT CONVERSION PROGRAM - V3(5)
SUBTTL	BAHUIZENGA/BAH     13-JUN-77



;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.

	SALL
;TEMPORARIES

T1=1
T2=2
T3=3
T4=4

;PERMANENT ACS

P1=10
P2=11
P3=12
P4=13

;PUSHDOWN POINTER

P=17

	SEARCH	MONSYM,MACSYM
	.REQUIRE SYS:MACREL

VERS==3				;MAJOR VERSION NUMBER
UPDAT==0			;MINOR VERSION NUMBER
EDIT==5				;EDIT NUMBER
CUST==0				;CUSTOMER/SWS EDIT CODE

	PGVER.	VERS,UPDAT,EDIT,CUST

PDLLEN==50			;PUSHDOWN STACK LENGTH
SUBTTL	EDIT HISTORY

;EDIT 2/BAH	MAKE END OF FILE RETURN REPORT CORRECTLY. FIX SO THAT THE
;	RUNNING JOB'S USER ID NUMBER GETS PUT INTO WORD 2 OF DISK UTILIZATION
;	ENTRIES.  IN ADDITION, SET UP DEFAULT INPUT AND OUTPUT FILE-SPECS.

;EDIT 3/BAH	ONE CALL TO UNSUPP DOES NOT ALLOW FOR SKIP RETURN.

;EDIT 4/BAH	FACT FILE SET DATE-TIME ENTRIES NO BEING CORRECTLY SIMULATED
;	ON A SYSTEM RELOAD. ALSO DATE AND TIME WORD IN SET DATE-TIME ENTRIES
;	WAS ALWAYS ZERO.
SUBTTL	USAGE FILE ENTRY FORMATS

;*********************************
	RADIX	10
;*********************************

;LENGTH OF FIELDS TO BE PICKED UP IN A USAGE FILE RECORD

LENTYP==4			;ENTRY TYPE LENGTH
LENSEQ==1			;RECORD SEQUENCE LENGTH
LENJOB==4			;JOB # LENGTH
LENLIN==4			;LINE # LENGTH
LENUSR==39			;USER/DIRECTORY NAME LENGTH
LENDTM==14			;DATE/TIME LENGTH
LENACT==39			;ACCOUNT STRING LENGTH
LENRUN==9			;RUNTIME LENGTH
LENANO==3			;# OF ACCOUNT STRINGS IN DISK USAGE ENTRY LENGTH
LENPAG==10			;# OF FILE PAGES USED LENGTH
LENSTR==6			;FILE STRUCTURE NAME LENGTH
LENCON==7			;CONSOLE CONNECT TIME LENGTH

;*********************************
	RADIX	8
;*********************************

;BYTE POINTERS TO THE BEGINNING CHARACTER OF EACH FIELD CONTAINING DATA
;	THAT WILL BE CONVERTED AND PUT INTO A BINARY (MIXED MODE)
;	FACT FORMATED FILE.

;HEADER OF ALL USAGE RECORDS - FIRST 20 CHARACTERS (4 WORDS)

USETYP:	POINT 7,USEBLK		;ENTRY TYPE USED FOR BINARY CONVERSIONS
USESEQ:	POINT 7,USEBLK+1,6	;RECORD SEQUENCE NUMBER (WILL BE REFERENCED WITH
				; A LDB INSTEAD OF AN ILDB AS THE OTHERS)


;ENTRY HEADER RECORD - IS ALWAYS THE FIRST RECORD OF ALL ENTRIES

USEJOB:	POINT 7,USEBLK+4	;JOB #
USELDT:	POINT 7,USEBLK+4,27	;DATE/TIME ENTRY WAS MADE
USELIN:	POINT 7,USEBLK+7,27	;LINE #

;USER IDENTFICATION RECORD

USEUSR:	POINT 7,USEBLK+4	;USER/DIRECTORY NAME

;SESSION RECORD #1

USEACT:	POINT 7,USEBLK+4	;ACCOUNT STRING
USERUN:	POINT 7,USEBLK+13,27	;USER'S RUNTIME
USEBDT:	POINT 7,USEBLK+15,20	;DATE/TIME USER BEGAN SESSION
USECON:	POINT 7,USEBLK+32,27	;CONSOLE CONNECT TIME (SECONDS)
;DISK USAGE DIRECTORY RECORD

USEANO:	POINT 7,USEBLK+4	;NUMBER OF ACCOUNT STRINGS (RECORDS) IN ENTRY
USEDUN:	POINT 7,USEBLK+12,27	;POINTER TO USER/DIRECTORY NAME

;DISK USAGE ACCOUNT STRING RECORD

;USEACT:POINT 7,USEBLK+4	;ACCOUNT STRING. ALREADY DEFINED IN SESSION ENTRY
USEDIR:	POINT 7,USEBLK+13,27	;DIRECTORY NAME
USEPAG:	POINT 7,USEBLK+25,20	;NUMBER OF FILE PAGES USED
USESTR:	POINT 7,USEBLK+30,20	;STRUCTURE NAME
SUBTTL	FACT FILE ENTRY FORMATS


;HEADER BLOCK DEFINITIONS (FIRST THREE WORDS OF EVERY ENTRY)
	DEFSTR	HDRTYP,FACTBL,8,9	;TYPE CODE
	DEFSTR	HDRJOB,FACTBL,17,9	;JOB #
	DEFSTR	HDRLIN,FACTBL,29,12	;LINE #
	DEFSTR	HDRCNT,FACTBL,35,6	;WORD COUNT OF ENTRY
	DEFSTR	HDRUSR,FACTBL+1,35,36	;USER #
	DEFSTR	HDRDTM,FACTBL+2,35,36	;DATE/TIME

;LOGIN DEFINITIONS
	DEFSTR	LGIZER,FACTBL+3,35,36	;ZERO WORD
	DEFSTR	LGICHR,FACTBL+4,35,36	;CHAR COUNT OF ACCOUNT STRING
LGIACT:	POINT 7,FACTBL+5		;POINTER TO BEGINNING OF ACCOUNT STRING

;LOGOUT DEFINITIONS
	DEFSTR	LGORUN,FACTBL+3,35,36	;RUNTIME
	DEFSTR	LGOCON,FACTBL+4,35,36	;CONSOLE TIME (MILLISECONDS)

;DISK UTILIZATION DEFINITION
	DEFSTR	SPCPAG,FACTBL+3,35,36	;# OF FILE PAGES USED

;SINCE THE FORMAT AND PLACEMENT OF THE ACCOUNT STRING IN THE DISK
;UTILIZATION ENTRY IS THE SAME AS THE LOGIN ENTRY, LGICHR AND LGIACT, ALONG
;WITH THE ROUTINE LGIWD5 WILL BE USED.  THE CALL, HOWEVER, WILL BE FOR
;SPCWD5 INSTEAD OF LGIWD5.
;
;THE STRUCTURE/DIRECTORY NAME STRING WILL BE BUILT BY HAND WITHOUT THE USE
;OF DEFSTR'S. AFTER THE ACCOUNT STRING, THE NEXT WORD WILL CONTAIN THE WORD
;COUNT OF THE STRUCTURE/DIRECTORY NAME STRING. AFTER THAT WILL BE THE
;ACTUAL STRING.



;MISCELLANEOUS VALUES

SPACE==40			;SPACE ( )
SLASH==57			;SLASH (/)
COLON==72			;COLON (:)
LANGLE==74			;LEFT ANGLE BRACKET
RANGLE==76			;RIGHT ANLGE BRACKET
SUBTTL	TOP LEVEL ROUTINE

START:	RESET
	MOVE	P,[IOWD	PDLLEN,PDL]	;SET UP STACK POINTER
	CALL	GETIN		;GET USAGE FORMAT INPUT FILE SPEC
	CALL	GETOUT		;GET FACT  FORMAT OUTPUT FILE SPEC (NEW OR OLD)
	CALL	GETOPN		;GO OPEN THE FILES
	CALL	CLRTBL		;ZERO THE FACT ENTRY BUILDING TABLE


;HERE TO BEGIN TO READ AN ENTRY

READXX:	CALL	SETRD		;SET UP TO READ ANOTHER RECORD
READX1:	LDB	T1,USESEQ	;GET SEQUENCE # POINTER
	CAIE	T1,"1"		;IS THIS THE FIRST RECORD OF AN ENTRY?
	JRST	READXX		;NO, READ UNTIL WE FIND ONE
	MOVE	T1,USETYP	;GET POINTER TO ENTRY TYPE
	MOVEI	T2,LENTYP	;GET THE LENGTH
	CALL	NUMDEC		;CONVERT FOR DISPATCH TABLE
	MOVEM	T1,SAVTYP	;SAVE THE ENTRY TYPE
	CAIL	T1,DISLEN	;DO WE KNOW ABOUT THIS ENTRY TYPE?
	JRST	[CALL	UNSUPP	;NO REPORT IT AND READ NEXT ENTRY
		 JRST	READX1	;WILL NEVER HAPPEN
		JRST	READXX]
	CALL	@DISPAT(T1)	;GO PROCESS APPROPRIATE ROUTINE
				; THE DISPATCH ROUTINE WILL DO A SKIP RETURN
				; IF NO ERRORS ARE ENCOUNTERED. OTHERWISE,
				; IF A SEQUENCE NUMBER OF 1 IS READ, THE
				; ROUTINE WILL DO A NON-SKIP RETURN
	 JRST	[HRROI [ASCIZ /
%Incomplete entry found/]
		PSOUT
		JRST READX1]	;ERROR RETURN
	JRST	READXX		;GOOD RETURN
SUBTTL	DISPATCH TABLE TO PROCESS USAGE ENTRIES TO FACT ENTRIES

DISPAT:	UNSUPP			;NO ENTRY NUMBERED '0000'
	RESTAR			;SYSTEM RESTART ENTRY '0001' - MAKES AN
				; SYSTEM FROM SCRATCH ENTRY '740'
	SESSIO			;SESSION ENTRY '0002' - MAKES A LOGIN ENTRY
				; '501' AND A LOGOUT ENTRY '141'
	SESSIO			;INCOMPLETE SESSION ENTRY '0003' -
				; MAKES A LOGIN ENTRY '501' AND A CHKPNT
				; ENTRY '201'
	UNSUPP			;UNDEFINED ENTRY '0004'
	CNGDTM			;DATE/TIME CHANGE ENTRY '0005' - MAKES
				; A TIME SET ENTRY '741'
	UNSUPP			;'0006' ENTRY NOT SUPPORTED IN FACT FILE
	UNSUPP			;'0007' ENTRY NOT SUPPORTED IN FACT FILE
	UNSUPP			;'0008' ENTRY NOT SUPPORTED IN FACT FILE
	DISKUS			;DISK USAGE DIRECTORY AND ACCOUNT STRING
				; ENTRY '0009' - MAKES DISK UTILIZATION
				; ENTRIES '540' AND '601'
DISLEN=.-DISPAT			;LENGTH OF DISPATCH TABLE
SUBTTL	SECOND LEVEL ROUTINES

;GETIN - ROUTINE TO GET THE INPUT FILE SPEC FOR THE FILE THAT HAS THE USAGE
;	FORMAT.  THIS FILE'S DATA WILL BE CONVERTED TO FACT FILE FORMAT
;CALL	GETIN

GETIN:	HRROI	T1,[ASCIZ /
Please enter the USAGE file to be read: /]
	PSOUT			;ASK FOR THE INPUT FILE NAME
	MOVEI	T1,USEJTB	;ARGUMENT BLOCK FOR GTJFN LONG FORM
	MOVEI	T2,0
	GTJFN			;GET IT
	 ERJMP	[CALL	INERR	;REPORT ERROR. WILL RETURN TO ASK FOR ANOTHER
		JRST	GETIN]	; USAGE FILE NAME
	HRRZM	T1,USEJFN	;SAVE INPUT JFN
	RET


;GETOUT - ROUTINE TO THE THE OUTPUT FILE SPEC FOR THE FILE THAT WILL
;	HAVE THE FACT FILE FORMAT.
;CALL GETOUT

GETOUT:	HRROI	T1,[ASCIZ /
Please enter file to be written: /]
	PSOUT			;ASK FOR OUTPUT FILE NAME
	MOVEI	T1,FCTJTB	;ARGUMENT BLOCK FOR GTJFN LONG FORM
	MOVEI	T2,0
	GTJFN			;GET IT
	 ERJMP	[CALL	OUTERR	;REPORT ERROR. WILL RETURN TO ASK FOR ANOTHER
		JRST	GETOUT]	; OUTPUT FILE SPEC
	HRRZM	T1,FCTJFN	;SAVE OUTPUT JFN
	RET


;GETOPN - ROUTINE TO OPEN INPUT AND OUTPUT FILES
;CALL	GETOPN

GETOPN:	MOVE	T1,USEJFN	;GET INPUT JFN OF USAGE FILE
	MOVX	T2,7B5!OF%RD	;READ ONLY, ASCII
	OPENF			;OPEN THE FILE
	 ERJMP	[CALL	XERSTR
		HALTF]
	MOVE	T1,FCTJFN	;GET OUTPUT JFN OF FACT FILE
	MOVX	T2,44B5!OF%APP	;APPEND, BINARY (MIXED MODE)
	OPENF			;OPEN THE FILE
	 ERJMP	[CALL	XERSTR
		HALTF]
	RET			;NOW GO PROCESS
;FCTOUT - ROUTINE TO OUTPUT FACT FILE ENTRIES. THE ENTRY IS FOUND IN FACTBL:.
;	THE BYTE COUNT (36-BIT BYTES) IS FOUND BY REFERENCING HDRCNT
;CALL:	CALL	FCTOUT

FCTOUT:	LOAD	P1,HDRCNT	;GET THE WORD COUNT OF ENTRY
	SKIPA	P2,[0]		;ZERO INDEX TO WORD TO BE OUTPUT
FCTOU1:	AOS	P2		;ADJUST INDEX
	MOVE	T1,FCTJFN	;GET FACT FILE JFN
	MOVE	T2,FACTBL(P2)	;GET THE DATA
	BOUT			;OUTPUT THE WORD
	SOJG	P1,FCTOU1	;ARE WE FINISHED?
	CALL	CLRTBL		;YES. ZERO FACT FILE ENTRY BUILDING TABLE
	RET			;AND RETURN


;DONE - ROUTINE TO FINISH UP
;CALL	DONE

DONE:	CALL	CHKEOF		;GO SEE IF INPUT ERROR WAS AN EOF
	 CALL	XERSTR		;NOT AN EOF, REPORT IT
	MOVE	T1,USEJFN	;GET USAGE FILE JFN
	CLOSF			;CLOSE THE USAGE FILE
	 ERCAL	XERSTR		;REPORT THE ERROR
	MOVE	T1,FCTJFN	;GET THE FACT FILE JFN
	CLOSF			;CLOSE THE FACT FILE
	 ERCAL	XERSTR		;REPORT THE ERROR
	HALTF			;ALL DONE WITH PROCESS
	HALTF			;STOP

;CHKEOF - ROUTINE TO SEE IF AN END OF FILE WAS REACHED
;CALL:	CALL CHKEOF

CHKEOF:	MOVEI	T1,.FHSLF	;OUR PROCESS HANDLE
	GETER			;GET THE LAST ERROR
	HRRZS	T2		;ISOLATE THE ERROR
	CAIE	T2,IOX4	;IS IT AN END OF FILE?
	RET			;NO, DO A NON-SKIP RETURN
	HRROI	T1,[ASCIZ /
[USAGE to FACT conversion completed]/]	;YES. REPORT CONVERSION COMPLETE
	PSOUT
	RETSKP
SUBTTL	USAGE DATA TO FACT DATA CONVERSION ROUTINES

;UNSUPP - ROUTINE TO USE IF A USAGE FILE ENTRY HAS NOT BEEN SUPPORTED
;	IN THE FACT FILES PRODUCED BY TOPS20 VERSION 2 AND PREDECESSORS

UNSUPP:	SETZM	FLGDSK		;MAKE SURE DISK ENTRIES WILL BE RIGHT
	HRROI	T1,[ASCIZ /%Not supported in FACT format - /]
	PSOUT
	MOVEI	T1,.PRIOU	;REPORT THE ENTRY TYPE
	MOVE	T2,USETYP
	MOVNI	T3,LENTYP
	MOVEI	T4,0
	SOUT
	HRROI	T1,[ASCIZ /
/]
	PSOUT
	RETSKP


;RESTAR - ROUTINE TO PROCESS SYSTEM RESTART RECORD
;	ALWAYS DOES A SKIP RETURN SINCE ONLY ONE USAGE RECORD HAS TO BE
;	READ TO MAKE A FACT FILE ENTRY

RESTAR:	SETZM	FLGDSK		;MAKE SURE DISK ENTRIES WILL BE RIGHT
	SETZRO	HDRCNT		;ZERO WORD COUNT OF ENTRY

;CREATE THE FIRST WORD OF THE ENTRY (ONLY ONE WORD FOR THIS ONE)

	MOVEI	T1,740		;GET ENTRY TYPE
	STOR	T1,HDRTYP	;FORMAT IT
	INCR	HDRCNT		;FIRST WORD IS DONE
	CALL	FCTOUT		;OUTPUT THE ENTRY
;	RETSKP			;TIME SET ENTRY MUST BE MADE ON RESTARTS
				; SO FALL INTO CNGDTM.



;CNGDTM- ROUTINE TO CONVERT A CHANGE DATE/TIME ENTRY OF A USAGE FILE TO A
;	TIME SET ENTRY OF A FACT FILE.

CNGDTM:	SETZM	FLGDSK		;MAKE SURE DISK ENTRIES WILL BE RIGHT
	SETZRO	HDRCNT		;ZERO THE WORD COUNT
	MOVEI	T1,741		;ENTRY TYPE OF A TIME SET ENTRY
	STOR	T1,HDRTYP	;STORE IT
	MOVE	T1,USEJOB	;GET THE POINTER TO JOB #
	MOVEI	T2,LENJOB	; AND ITS LENGTH
	CALL	NUMDEC		;CONVERT
	STOR	T1,HDRJOB	;STORE IT
	MOVE	T1,USELIN	;GET THE POINTER TO LINE #
	MOVEI	T2,LENLIN	; AND ITS LENGTH
	CALL	NUMOCT		;CONVERT
	STOR	T1,HDRLIN	;STORE IT
	INCR	HDRCNT		;DONE WITH FIRST WORD
	SETZRO	HDRUSR		;NO DIRECTORY/USER INFORMATION AVAILABLE
	INCR	HDRCNT		;DONE WITH SECOND WORD
	MOVE	T1,USELDT	;GET POINTER TO DATE/TIME
	CALL	DATTIM		;CONVERT IT
	STOR	T2,HDRDTM	;STORE IT
	INCR	HDRCNT		;DONE WITH THIRD WORD
	CALL	FCTOUT		;NOW OUTPUT THE ENTRY
	RETSKP			;FINISHED
;DISKUS - ROUTINE TO CONVERT USAGE FILE DISK USAGE DIRECTORY AND ACCOUNT
;	STRING RECORDS TO FACT FILE DISK UTILIZATION ENTRIES.

DISKUS:	SKIPN	FLGDSK		;HAS THE DISK UTILIZATION INITIAL ENTRY BEEN MADE?
	CALL	SPCBEG		;NO. GO MAKE IT
	MOVE	T1,USELDT	;DATE/TIME IS IN THIS RECORD
	CALL	DATTIM		;CONVERT IT TO INTERNAL FORMAT
	MOVEM	T2,SAVDAT	;AND THEN SAVE IT FOR THE REST OF THE ENTRIES
DISKU1:	CALL	SETRD		;READ NEXT RECORD
	MOVE	T1,USETYP	;GET THE ENTRY TYPE TO ENSURE DISK ENTRYS ARE
	MOVEI	T2,LENTYP	; STILL BEING READ
	CALL	NUMDEC		;CONVERT
	CAME	T1,SAVTYP	;IS THIS A DISK ENTRY?
	RET			;NO.  DO A NON-SKIP RETURN.  A NON-SKIP RETURN WILL BE
				; THE ONLY RETURN TO THE MAIN LOOP SINCE THE
				; THE FIRST RECORD OF THE NEXT ENTRY WILL
				; ALREADY HAVE BEEN READ
	LDB	T1,USESEQ	;GET THE SEQUENCE NUMBER
	CAIE	T1,"2"		;IS THIS THE SECOND RECORD?
	RET			;NO. RETURN
	SETOM	T1		;NOW FIND THIS JOB'S 36-BIT USER NUMBER
	MOVE	T2,[-3,,TEMP]
	MOVEI	T3,.JIUNO
	GETJI
	 JRST	[ERCAL XERSTR
		SETZM	SAVUSR
		JRST DISKU2]
	MOVE	T1,TEMP(.JIUNO)
	MOVEM	T1,SAVUSR	;SAVE THE USER NUMBER
DISKU2:	CALL	SETRD		;THIS SECTION PROCESSES THE ACCOUNT STRING RECORDS
	MOVE	T1,USETYP	;GET THE ENTRY TYPE TO ENSURE DISK RECORDS
	MOVEI	T2,LENTYP	;ARE STILL BEING READ
	CALL	NUMDEC		;CONVERT
	CAME	T1,SAVTYP	;IS IT THE SAME TYPE?
	RET			;NO. RETURN TO MAIN LOOP (READX1)
	LDB	T1,USESEQ	;GET THE SEQUENCE NUMBER
	CAIE	T1,"3"		;MAKE SURE THIS IS AN ACCOUNT STRING RECORD
	RET			;RETURN TO THE MAIN LOOP. (READX1)
	CALL	SPCWD1		;WORK ON FIRST WORD OF ENTRY (TYPE,JOB,LINE,COUNT)
	MOVE	T1,SAVUSR	;GET THE USER/DIRECTORY NUMBER
	STOR	T1,HDRUSR	;STORE IT
	INCR	HDRCNT		;DONE WITH SECOND WORD OF ENTRY
	MOVE	T1,SAVDAT	;NOW GET THE DATE/TIME
	STOR	T1,HDRDTM	;STORE IT
	INCR	HDRCNT		;DONE WITH THIRD WORD OF ENTRY
	CALL	SPCWD4		;GET THE NUMBER OF FILE PAGES USED
	CALL	SPCWD5		;GET THE ACCOUNT STRING
	CALL	SPCWDN		;GET THE DIRECTORY NAME
	CALL	FCTOUT		;OUTPUT THE ENTRY
	JRST	DISKU2		;GO PROCESS THE NEXT RECORD
;SPCBEG - ROUTINE TO MAKE THE BEGINNING OF DISK UTILIZATION ENTRY.  THIS
;	ENTRY WILL BE MADE IF 'FLGDSK' IS ZERO.

SPCBEG:	SETZRO	HDRCNT		;ZERO THE WORD COUNT
	MOVEI	T1,540		;SIGNIFY THE BEGINNING OF DISK UTILIZATION
	STOR	T1,HDRTYP	; STATISTICS
	INCR	HDRCNT		;DONE WITH FIRST WORD AND ENTRY
	CALL	FCTOUT		;GO OUTPUT IT NOW
	SETOM	FLGDSK		;SIGNIFY THAT THE ENTRY HAS BEEN MADE
	RET



;SPCWD1 - ROUTINE TO WORK ON FIRST WORD OF DISK UTILIZATION ENTRY

SPCWD1:	MOVEI	T1,601		;ENTRY TYPE
	STOR	T1,HDRTYP	;STORE IT
	SETZRO	HDRJOB		;JOB # AND LINE # ARE ZERO IN THESE
	SETZRO	HDRLIN		; ENTRIES
	INCR	HDRCNT		;DONE WITH FIRST WORD
	RET



;SPCWD4 - ROUTINE TO WORK ON FOURTH WORD OF DISK UTILIZATION ENTRY, NAMELY,
;	THE NUMBER OF FILE PAGES USED.

SPCWD4:	MOVE	T1,USEPAG	;GET POINTER TO THE NUMBER
	MOVEI	T2,LENPAG	;AND ITS FIELD LENGTH
	CALL	NUMDEC		;CONVERT IT
	STOR	T1,SPCPAG	;STORE IT
	INCR	HDRCNT		;DONE WITH WORD FOUR
	RET


;SPCWDN - ROUTINE TO WORK ON THE LAST SET OF WORDS OF THE DISK UTILIZATION ENTRY.
;	THE FIRST WORD OF THIS SET HAS THE WORD COUNT USED BY THE STRUCTURE/DIRECTORY
;	NAME STRING.  THE REST OF THIS SET CONTAINS THE STRUCTURE/DIRECTORY
;	NAME STRING.  IT IS IMPORTANT THAT ALL THE REST OF THE DISK UTILIZATION
;	ENTRY BE DONE BEFORE THIS ROUTINE IS CALLED.

SPCWDN:	STKVAR	<CNTADR>	;DEFINE A WORD WHERE THE ADDRESS OF
				; THE WORD COUNT WILL BE STORED
	LOAD	T1,HDRCNT	;GET THE CURRENT WORD COUNT OF THE ENTRY
	MOVEI	T2,FACTBL(T1)	;GET THE ADDRESS OF THE DIRECTORY WORD COUNT
	MOVEM	T2,CNTADR	;STORE IT FOR FUTURE REFERENCE
	MOVE	T3,[POINT 7,FACTBL+1] ;SET UP POINTER TO FIRST WORD OF DIRECTORY NAME
	ADD	T3,T1
	MOVE	T1,USESTR	;GET THE POINTER TO THE STRUCTURE NAME
	MOVEI	T2,LENSTR	;AND ITS LENGTH
	MOVEI	P1,0		;P1 WILL BE USED TO KEEP THE NUMBER OF CHARACTERS
SPCWN1:	ILDB	T4,T1		;GET A CHARACTER
	CAIN	T4," "		;ARE WE FINISHED?
	JRST	SPCWN2		;YES. NOW GO GET DIRECTORY NAME
	IDPB	T4,T3		;STORE IT
	ADDI	P1,1		;COUNT THE CHARACTER
	SOJG	T2,SPCWN1	;HAVE WE REACHED THE MAXIMUM FIELD LENGTH?
SPCWN2:	MOVEI	T4,COLON	;SIGNIFY END OF STRUCTURE NAME
	IDPB	T4,T3		;NOW WE HAVE 'STRUCTURE:'
	MOVEI	T4,LANGLE	;ALSO SIGNIFY BEGINNING OF DIRECTORY NAME
	IDPB	T4,T3
	ADDI	P1,2		;COUNT THE COLON AND LEFT ANGLE BRACKET
	MOVE	T1,USEDIR	;GET THE POINTER TO THE DIRECTORY NAME
	MOVEI	T2,LENUSR	;AND THE FIELD LENGTH (T3 STILL CONTAINS POINTER
				; TO THE CORRECT PLACE
SPCWN3:	ILDB	T4,T1		;GET A CHARACTER
	CAIN	T4," "		;ARE WE FINISHED?
	JRST	SPCWN4		;YES. FINISH UP.
	IDPB	T4,T3		;STORE IT
	ADDI	P1,1		;COUNT THE CHARACTER
	SOJG	T2,SPCWN3	;HAVE WE REACHED THE MAXIMUM FIELD LENGTH?
SPCWN4:	MOVEI	T4,RANGLE	;YES. NOW SIGNIFY END OF DIRECTORY NAME
	IDPB	T4,T3		;STORE IT
	MOVEI	T4,.CHNUL	;JUST IN CASE BE SURE TO INCLUDE A NULL
	IDPB	T4,T3		;STORE IT
	ADDI	P1,2		;COUNT THE RIGHT ANGLE BRACKET AND NULL
	IDIVI	P1,5		;NOW FIND THE WORD COUNT
	CAIE	P2,0		;ARE THERE ANY CHARACTERS LEFT OVER?
	ADDI	P1,1		;YES. COUNT THE WORD
	MOVEM	P1,@CNTADR	;STORE THE WORD COUNT
	INCR	HDRCNT		;COUNT FOR THE WORD COUNT WORD
	LOAD	T1,HDRCNT	;GET THE ENTRY WORD COUNT
	ADD	T1,P1		;ADJUST IT.
	STOR	T1,HDRCNT	;STORE IT
	RET			;ALL DONE
;SESSIO - ROUTINE TO CONVERT A SESSION ENTRY OF A USAGE FILE
;	TO A LOGIN AND A LOGOUT ENTRY IN FACT FILE FORMAT.  A SESSION
;	ENTRY CONSISTS OF THREE RECORDS.  IF ANY INFORMATION IS MISSING,
;	THE ROUTINE WILL DO A NON-SKIP RETURN. OTHERWISE,
;	IT WILL DO A SKIP RETURN

SESSIO:	SETZRO	HDRCNT		;INITIALIZE THE WORD COUNT OF ENTRY
	CALL	LGIWD1		;WORK ON FIRST WORD OF LOGIN ENTRY (TYPE,JOB,LINE,COUNT)
	CALL	LGOWD3		;LOGOUT DATE/TIME IS IN THIS RECORD.
				; SO CONVERT IT NOW AND SAVE FOR LATER
	CALL	LGIWD4		;WORK ON FOURTH WORD OF LOGIN ENTRY (ALWAYS ZERO)

;NOW ALL DATA HAS BEEN OBTAINED FROM THE FIRST USAGE RECORD.  GO READ ANOTHER ONE.

	CALL	SETRD		;SET UP TO READ ANOTHER RECORD
	LDB	T1,USESEQ	;GET THE RECORD SEQUENCE #
	CAIE	T1,"2"		;IS THIS THE SECOND RECORD?
	RET			;NO GIVE A NON-SKIP ERROR RETURN
	CALL	LGIWD3		;WORK ON WORD THREE OF THE LOGIN ENTRY (DATE/TIME)
	CALL	LGIWD5		;WORK ON WORDS 5-N (ACCOUNT STRING)
	CALL	LGOWD4		;RUNTIME IS IN THIS RECORD. SO GET IT AND
				; SAVE IT FOR LATER (WORD 4, LOGOUT/CHKPNT)

;NOW ALL DATA HAS BEEN OBTAINED FROM THE SECOND USAGE RECORD.
;GO READ THE THIRD TO GET THE USER NAME

	CALL	SETRD		;GO READ ANOTHER RECORD
	LDB	T1,USESEQ	;GET THE RECORD SEQUENCE #
	CAIE	T1,"3"		;IS THIS THE THIRD RECORD?
	RET			;NO, GIVE A NON-SKIP RETURN
	CALL	LGIWD2		;WORK ON WORD 2 OF THE LOGIN ENTRY (USER NUMBER)
	CALL	FCTOUT		;NOW OUTPUT THE LOGIN ENTRY

;NOW MAKE A LOGOUT OR CHECKPOINT ENTRY. THE TWO DIFFERENCES OF THESE
;	ENTRIES ARE: 1)ENTRY TYPE AND 2) CHECKPOINT ENTRY HAS 0 FOR
;	THE CONSOLE TIME.

	CALL	LGOWD1		;WORK ON WORD 1 OF THE LOGOUT/CHECKPOINT ENTRY
	MOVE	T1,SAVUSR	;WORK ON WORD 2 OF THE LOGOUT/CHKPNT ENTRY
	STOR	T1,HDRUSR	;USER NUMBER HAS ALREADY BEEN FOUND
	MOVE	T1,SAVLDT	;WORK ON WORD 3
	STOR	T1,HDRDTM	;DATE/TIME HAS ALREADY BEEN FOUND
	MOVE	T1,SAVRUN	;WORK ON WORD 4
	STOR	T1,LGORUN	;RUNTIME HAS ALREADY BEEN FOUND
	CALL	LGOWD5		;WORK ON WORD 5
	CALL	FCTOUT		;OUTPUT THE ENTRY
	RETSKP			;DONE
;LGIWD1 - ROUTINE TO MAKE THE FIRST WORD OF A LOGIN ENTRY
;	THE ENTRY HEADER RECORD MUST BE IN USEBLK

LGIWD1:	MOVEI	T1,501		;LOGIN TYPE CODE
	STOR	T1,HDRTYP	;STORE IT
	MOVE	T1,USEJOB	;GET POINTER TO JOB #
	MOVEI	T2,LENJOB	; AND ITS LENGTH
	CALL	NUMDEC		;CONVERT
	STOR	T1,HDRJOB	;STORE IT
	MOVEM	T1,SAVJOB	;ALSO SAVE IT FOR THE LOGOUT ENTRY
	MOVE	T1,USELIN	;GET POINTER TO LINE #
	MOVEI	T2,LENLIN	; AND ITS LENGTH
	CALL	NUMOCT		;CONVERT
	STOR	T1,HDRLIN	;STORE IT
	MOVEM	T1,SAVLIN	;ALSO SAVE IT FOR THE LOGOUT ENTRY
	INCR	HDRCNT		;DONE WITH FIRST WORD
	RET


;LGIWD2 - ROUTINE TO MAKE WORD 2 OF A LOGIN ENTRY, A 36-BIT
;	USER NUMBER

LGIWD2:	MOVE	T1,USEUSR	;GET THE POINTER TO THE USER NAME
	CALL	USRNUM		;GET THE USER NUMBER
	STOR	T3,HDRUSR	;STORE IT
	INCR	HDRCNT		;DONE WITH ANOTHER WORD
	MOVEM	T3,SAVUSR	;ALSO SAVE IT
	RET			;AND RETURN


;LGIWD3 - ROUTINE TO MAKE WORD 3 OF THE LOGIN ENTRY.  THE DATE/TIME IS
;	FOUND IN THE SECOND USAGE RECORD OF A SESSION ENTRY.

LGIWD3:	MOVE	T1,USEBDT	;GET POINTER OF LOGIN DATE/TIME
	CALL	DATTIM		;CONVERT
	STOR	T2,HDRDTM	;STORE IT IN FACT FILE BLOCK
	MOVEM	T2,SAVBDT	;ALSO SAVE IT TO COMPUTE CONSOLE TIME IN LOGOUT ENTRY
	INCR	HDRCNT		;DONE WITH WORD 3
	RET

;LGIWD4 - ROUTINE TO MAKE WORD 4 OF LOGIN.  IT IS ALWAYS ZERO.

LGIWD4:	SETZRO	LGIZER		;STORE IT
	INCR	HDRCNT		;DONE WITH WORD 4
	RET
;LGIWD5/SPCWD5 - ROUTINE TO MAKE THE FIFTH THROUGH N WORDS, WHERE N IS THE NUMBER
;	OF WORDS NEEDED TO STORE THE ACCOUNT STRING.  AN ACCOUNT STRING
;	IS LEFT-JUSTIFIED SPACE-FILLED IN THE USAGE FILE

SPCWD5:
LGIWD5:	SETZRO	LGICHR		;MAKE SURE COUNT IS ZERO
	MOVE	T1,USEACT	;GET POINTER TO ACCOUNT STRING
	MOVEI	T2,LENACT	;AND ITS MAXIMUM LENGTH
	MOVE	T3,LGIACT	;SET UP A POINTER TO THE FACT ACCOUNT STRING
LGIW5A:	ILDB	T4,T1		;GET THE A CHARACTER
	CAIN	T4," "		;ARE WE FINISHED?
	JRST	LGIW5B		;GO FINISH UP
	IDPB	T4,T3		;STORE THE CHARACTER
	DECR	LGICHR		;COUNT THE CHARACTER (MUST BE NEGATIVE)
	SOJG	T2,LGIW5A	;HAVE WE REACHED 39 CHARS YET?
LGIW5B:	INCR	HDRCNT		;COUNT THE CHARACTER COUNT WORD
	LOAD	T1,LGICHR	;YES, GET THE CHARACTER COUNT
	MOVNS	T1		;MAKE THE COUNT POSITIVE
	IDIVI	T1,5		;GET THE WORD COUNT OF ACCOUNT STRING
	LOAD	T3,HDRCNT	;GET THE OLD ENTRY WORD COUNT
	ADD	T3,T1		;ADJUST THE COUNT
	CAIE	T2,0		;ARE THERE ANY CHARACTERS LEFT OVER?
	ADDI	T3,1		;YES, INDICATE ONE MORE WORD IN THE ENTRY
	STOR	T3,HDRCNT	;STORE IT
	RET			;AND RETURN


;LGOWD1 - ROUTINE TO MAKE WORD 1 OF A LOGOUT/CHECKPOINT ENTRY. IT
;	CONTAINS THE ENTRY TYPE, JOB #, LINE #, AND WORD COUNT
;	(ALWAYS 5).

LGOWD1:	MOVE	T1,SAVTYPE	;GET THE ENTRY TYPE
	CAIE	T1,2		;IS THIS A COMPLETE SESSION?
	SKIPA	T1,[201]	;NO. HAVE TO MAKE A CHECKPOINT ENTRY
	MOVEI	T1,141		;YES. HAVE TO MAKE A LOGOUT ENTRY
	STOR	T1,HDRTYP	;STORE IT
	MOVE	T1,SAVJOB	;GET THE JOB #
	STOR	T1,HDRJOB	;STORE IT
	MOVE	T1,SAVLIN	;GET THE LINE #
	STO