	.TITLE MK$GET_INFO
;----------------------------------------------------------------------
;
;		Routine to get the necessary information
;		from a version 3 accounting record
;
;----------------------------------------------------------------------
; written by:  K. Trumbley
; date:        March 1984
; VMS version: V3.x
;
;----------------------------------------------------------------------
;  FORTRAN calling sequence
;
;	LOGICAL*1 ACC_REC(256),MK$REC_TYP,STATUS
; C
; C  ACC_REC	= array containing accounting record
; C  MK$REC_TYP	= first variable in common area into which this routine
; C		  will put information extracted from the accounting
; C		  record.
; C  STATUS	= .FALSE. on record error
; C
;	CALL MK$GET_INFO(ACC_REC,MK$REC_TYP,STATUS)
;

;----------------------------------------------------------------------
;  DEFINITION OF OFFSETS INTO ACCOUNTING COMMON AREA
;
;C******************************************************************************
;C MK.INC
;C
;C
;C******************************************************************************
;C
;	CHARACTER*12 MK$USR_NAM,MK$QUE_NAM
;	LOGICAL*1    MK$NOD_NAM
;	CHARACTER*8  MK$USR_ACC,MK$TER_NAM
;C
;	LOGICAL*1 MK$REC_TYP,MK$SUB_TYP,MK$CUSTOMR,MK$VERSION
;	LOGICAL*1 MK$USR_PKT(256)
;C
;	INTEGER*2 MK$USR_GRP,MK$USR_MEM,MK$USR_PKT_LEN
;C
;	INTEGER*4 MK$SYS_TIM(2),MK$STA_TIM(2)
;C
;	INTEGER*4 MK$VOL_MNT
;     &	         ,MK$PAG_CNT
;     &	         ,MK$CPU_TIM
;     &	         ,MK$DIR_IO,MK$BUF_IO
;     &	         ,MK$PAG_FLT,MK$SYM_TIM
;C
;	COMMON/MK$COMMON/ MK$REC_TYP,MK$SUB_TYP,MK$CUSTOMR,MK$VERSION
;     &	                , MK$SYS_TIM,MK$STA_TIM
;     &	                , MK$USR_NAM,MK$NOD_NAM,MK$QUE_NAM
;     &	                , MK$USR_ACC,MK$TER_NAM
;     &	                , MK$USR_GRP,MK$USR_MEM
;     &	                , MK$VOL_MNT
;     &	                , MK$PAG_CNT,MK$SYM_TIM
;     &	                , MK$CPU_TIM
;     &	                , MK$DIR_IO,MK$BUF_IO
;     &	                , MK$PAG_FLT
;     &	                , MK$USR_PKT,MK$USR_PKT_LEN
;

MK$REC_TYP=0
MK$SUB_TYP=1
MK$CUSTOMR=2
MK$VERSION=3
MK$SYS_TIM=4
MK$STA_TIM=12
MK$USR_NAM=20
MK$NOD_NAM=32
MK$QUE_NAM=44
MK$USR_ACC=56
MK$TER_NAM=64
MK$USR_GRP=72
MK$USR_MEM=74
MK$VOL_MNT=76
MK$PAG_CNT=80
MK$SYM_TIM=84
MK$CPU_TIM=88
MK$DIR_IO=92
MK$BUF_IO=96
MK$PAG_FLT=100
MK$USR_PKT=104
MK$USR_PKT_LEN=MK$USR_PKT+256
;
;----------------------------------------------------------------------
;
;  Define all required MACROS
;
	.MCALL	$ACRDEF
	$ACRDEF
;----------------------------------------------------------------------
;  Define parameter offsets into argument list
;
ACC_REC=4
REC_TYP=8
STATUS=12

;----------------------------------------------------------------------
;  MK$GET_INFO routine
;
	.PSECT	CODE	PIC,EXE,NOWRT,LONG
MK$GET_INFO::
	.WORD	^M<R1,R2,R3,R4,R5,R6,R7,R8,R9>
;
;  Register usage
;	R4 = Common area start address
;	R5 = Record address
;	R6 = Packet 1 address
;	R7 = Packet 2 address
;
;  Setup all registers
;
	MOVL	REC_TYP(AP),R4		; setup common address
	PUSHR	#^M<R4,R5>
	MOVC5	#0,(R5),#0,#MK$USR_PKT_LEN,(R4)
	POPR	#^M<R4,R5>
	MOVL	ACC_REC(AP),R5		; setup record address
	ADDL3	#12,R5,R6		; setup Packet 1 address
	MOVZWL	ACR$W_LENGTH(R6),R2
	ADDL3	R2,R6,R7		; setup Packet 2 address
	BITB	#ACR$M_PACKET,ACR$W_TYPE(R5) ; check if really a record
	BEQL	10$
	JMP	RECORD_ERR		; exit on record error
;
;  Get record type
;
10$:	MOVZWL	ACR$W_TYPE(R5),R2	; get record type
	BICL2	#-ACR$M_TYPE-1,R2
	ASHL	#-ACR$V_TYPE,R2,R2
	MOVB	R2,MK$REC_TYP(R4)	; return record type
;
;  Get SUB_TYPE
;
	MOVZWL	ACR$W_TYPE(R5),R2	; get record type
	BICL2	#-ACR$M_SUBTYPE-1,R2
	ASHL	#-ACR$V_SUBTYPE,R2,R2
	MOVB	R2,MK$SUB_TYP(R4)
;
;  Get VERSION
;
	MOVZWL	ACR$W_TYPE(R5),R2	; get record type
	BICL2	#-ACR$M_VERSION-1,R2
	ASHL	#-ACR$V_VERSION,R2,R2
	MOVB	R2,MK$VERSION(R4)
;
;  Get CUSTOMER
;
	MOVZWL	ACR$W_TYPE(R5),R2	; get record type
	BICL2	#-ACR$M_CUSTOMER-1,R2
	ASHL	#-ACR$V_CUSTOMER,R2,R2
	MOVB	R2,MK$CUSTOMR(R4)
;
;  Get SYSTEM TIME
;
	MOVQ	ACR$Q_SYSTIME(R5),MK$SYS_TIM(R4)
;
; Return at this point if the record is a - file backward link record
;                                         - file forward link record
;
	CMPB	#ACR$K_FILE_BL,MK$REC_TYP(R4)
	BNEQ	11$
	JMP	IGNORE_RECORD
11$:	CMPB	#ACR$K_FILE_FL,MK$REC_TYP(R4)
	BNEQ	12$
	JMP	IGNORE_RECORD
12$:
;
;----------------------------------------------------------------
;
;	ID PACKET HANDLER
;
;  Move Process UIC
;
	MOVW	ACR$W_GRP(R6),MK$USR_GRP(R4)
	MOVW	ACR$W_MEM(R6),MK$USR_MEM(R4)
;
;  Move USER NAME
;
	MOVZWL	ACR$W_USERNAME(R6),R2
	ADDL3	R2,R6,R2		; address of string
	MOVZBL	(R2)+,R3		; length of string
	ADDL3	#MK$USR_NAM,R4,R1
	PUSHR	#^M<R4,R5>
	MOVC5	R3,(R2),#0,#12,(R1)
	POPR	#^M<R4,R5>
;
;  Move NODE NAME
;
	MOVZWL	ACR$W_NODENAME(R6),R2
	ADDL3	R2,R6,R2		; address of string
	MOVZBL	(R2)+,R3		; length of string
	ADDL3	#MK$NOD_NAM,R4,R1
	PUSHR	#^M<R4,R5>
	MOVC5	R3,(R2),#0,#12,(R1)
	POPR	#^M<R4,R5>
;
;  Move QUEUE NAME
;
	MOVZWL	ACR$W_QUEUE(R6),R2
	ADDL3	R2,R6,R2		; address of string
	MOVZBL	(R2)+,R3		; length of string
	ADDL3	#MK$QUE_NAM,R4,R1
	PUSHR	#^M<R4,R5>
	MOVC5	R3,(R2),#0,#12,(R1)
	POPR	#^M<R4,R5>
;
;  Move ACCOUNT NAME
;
	MOVZWL	ACR$W_ACCOUNT(R6),R2
	ADDL3	R2,R6,R2		; address of string
	MOVZBL	(R2)+,R3		; length of string
	ADDL3	#MK$USR_ACC,R4,R1
	PUSHR	#^M<R4,R5>
	MOVC5	R3,(R2),#0,#8,(R1)
	POPR	#^M<R4,R5>
;
;  Move TERMINAL NAME
;
	MOVZWL	ACR$W_TERMINAL(R6),R2
	ADDL3	R2,R6,R2		; address of string
	MOVZBL	(R2)+,R3		; length of string
	ADDL3	#MK$TER_NAM,R4,R1
	PUSHR	#^M<R4,R5>
	MOVC5	R3,(R2),#0,#8,(R1)
	POPR	#^M<R4,R5>

;----------------------------------------------------------------
;  Check if record type = ACR$K_PRCDEL, IMGDEL, SYSINIT, LOGFAIL
;	then the next packet is RESOURCE PACKET.
;	else if record type = ACR$K_PRINT then PRINT PACKET
;	else if record type = ACR$K_USER  then USER PACKET
;
	CMPB	#ACR$K_PRINT,MK$REC_TYP(R4)
	BNEQ	1$
	JMP	PRINT_PACKET
1$:	CMPB	#ACR$K_USER,MK$REC_TYP(R4)
	BNEQ	2$
	JMP	USER_PACKET
2$:
;
;  RESOURCE PACKET
;
;  Move PROCESS START TIME
;
	MOVQ	ACR$Q_LOGIN(R7),MK$STA_TIM(R4)
;
;  Move PROCESS CPU TIME
;
	MOVL	ACR$L_CPUTIME(R7),MK$CPU_TIM(R4)
;
;  Move PAGE FAULTS
;
	MOVL	ACR$L_FAULTS(R7),MK$PAG_FLT(R4)
;
;  Move DIRECT IO
;
	MOVL	ACR$L_DIOCNT(R7),MK$DIR_IO(R4)
;
;  Move BUFFERED IO
;
	MOVL	ACR$L_BIOCNT(R7),MK$BUF_IO(R4)
;
;  Move VOLUMES MOUNTED
;
	MOVL	ACR$L_VOLUMES(R7),MK$VOL_MNT(R4)
	JMP	SUCCESS_EXIT

;-------------------------------------------------------------
;
;	PRINT PACKET
;
;  Move SYMBIONT CPU TIME
;
PRINT_PACKET:
	MOVL	ACR$L_SYMCPUTIM(R7),MK$SYM_TIM(R4)
;
;  Move PAGE COUNT
;
	MOVL	ACR$L_PAGECNT(R7),MK$PAG_CNT(R4)
	JMP	SUCCESS_EXIT

;--------------------------------------------------------------
;
;	USER PACKET
;
;  Move USER LENGTH, USER DATA
;
USER_PACKET:
	MOVZBW	ACR$T_USER_DATA(R7),MK$USR_PKT_LEN(R4)
	MOVZBL	ACR$T_USER_DATA(R7),R2
	ADDL3	#ACR$T_USER_DATA+1,R7,R3
	ADDL3	#MK$USR_PKT,R4,R1
	PUSHR	#^M<R4,R5>
	MOVC5	R2,(R3),#0,#256,(R1)
	POPR	#^M<R4,R5>
;
;  SUCCESS EXIT
;
SUCCESS_EXIT:
	MOVB	#1,@STATUS(AP)		; Set STATUS = .TRUE.
	RET
;
;  Record error has occurred so set status=.FALSE. and return
;
IGNORE_RECORD:
RECORD_ERR:
	CLRB	@STATUS(AP)		; Set STATUS = .FALSE.
	RET
	.END
