; GET_DCL
;
;     THIS SUBROUTINE GETS THE COMMAND LINE THAT RAN A PROGRAM.  IT UNWINDS
;     THE STACK TO FIND THE LEVEL THAT THE SYSTEM CALL TOOK PLACE FROM SO
;     IT MAY BE ANY NUMBER OF LEVELS DOWN.  (THIS IS IN CONTRAST TO THE
;     EXAMPLE PRESENTED AT THE FALL 1978, DECUS CONVENTION THAT HAD TO BE IN
;     THE MAIN ROUTINE IN ORDER TO WORK.
;
; CALLING SEQUENCE (FROM FORTRAN):
;
;	CHARACTER*80 STRING
;	INTEGER*4 STATUS
;	INTEGER*4 NCHAR
;
;	CALL GET_DCL(NCHAR,STRING,STATUS)
;
;  WHERE:
;
;		NCHAR IS THE NUMBER OF CHARACTERS RETURNED
;		STRING IS ANY CHARACTER VARIABLE
;		STATUS IS A STATUS CODE RETURNED AS FOLLOWES:
;			STATUS = 1  SUCCESSFUL OPERATION
;			STATUS = 2  DCL COMMAND BUFFER EMPTY
;			STATUS = 3  CHARACTER STRING OVERFLOW
;					(NCHAR WILL CONTAIN LENGTH STRING
;					 SHOULD HAVE BEEN)
;
; THIS ROUTINE WAS ORIGIONALLY WRITTEN BY SOME UNKNOWN SOUL IN A SLIGHTLY
; DIFFERENT FORM AND CALLED GET_DCL_FOR.  THE ERROR PARAMETER WAS REMOVED
; AND THE EXIT CHANGED SLIGHTLY AND RENAMED BY RICH GRECO OF LEWIS AND CLARK
; COLLEGE OF PORTLAND, OREGON.  I AM GRATEFUL TO WHOEVER I PLAGERIZED THIS FROM.
;
	$CLISERVDEF	; DEFINE CLI SERVICE COMMAND
;
GETCMD:	$CLIREQDESC	CLI$K_GETCMD	; DEFINE REQUEST DESCRIPTOR FOR GET COMMAND
;
	BLANK		= ^X20	; ASCII BLANK
	FRAME_FP	= ^X0C	; OFFSET TO STORED FP
	FRAME_AP	= ^X08	; OFFSET TO STORED AP
	ARG_NCHAR	= ^X04	; OFFSET TO NCHAR PARAMETER
	ARG_STRING	= ^X08	; OFFSET TO STRING PARAMETER
	ARG_STATUS	= ^X0C	; OFFSET TO STATUS PARAMETER
;
	.ENTRY	GET_DCL,^M<R2>
;
	MOVL	FP,R0		; R0 = STARTING FRAME POINTER
	MOVL	AP,R1		; R1 = STARTING ARGUMENT POINTER
	MOVL	AP,R2		; R2 = PREVIOUS ARGUMENT POINTER
;
11$:	TSTL	FRAME_FP(R0)	; TEST IF FIRST FRAME
	BEQL	12$		; YES - EXIT
	MOVL	R1,R2		; SAVE PREVIOUS AP
	MOVL	FRAME_AP(R0),R1	; SAVE PREVIOUS AP
	MOVL	FRAME_FP(R0),R0	; UNWIND TO NEXT FRAME
	BRB	11$
;
12$:	PUSHAB	W^GETCMD	; COMMAND DESCRIPTOR ADDR
	CALLS	#1,@CLI$A_UTILSERV(R2)	; GET DCL COMMAND LINE
;
	MOVZWL	GETCMD+CLI$W_RQSIZE,-	; SET NUMBER CHARS
		@ARG_NCHAR(AP)
	BEQL	502$		; COMMAND BUFFER EMPTY - STATUS 2
;
	MOVQ	@ARG_STRING(AP),R0	; GET CHARACTER DESCRIPTOR
	CVTWL	R0,R0		; CLEAR HIGH WORD
	CMPW	R0,GETCMD+CLI$W_RQSIZE	; TEST ARG_STRING SIZE
	BLSS	601$		; CHARACTER STRING OVERFLOW - STATUS 3
;
	MOVC5	GETCMD+CLI$W_RQSIZE,-
		@GETCMD+CLI$A_RQADDR,-	; MOVE DCL STRING TO ARG_STRING
		#BLANK,R0,(R1)
;
	MOVL	#1,@ARG_STATUS(AP)
	RET
;
502$:	MOVL	#2,@ARG_STATUS(AP)
	RET
;
601$:	MOVL	#3,@ARG_STATUS(AP)
	RET
	.END
