	.TITLE GCCI
	.IDENT /130984/
  	
; 
; This procedure implements the GCCI (Get Command for Command-line
;    Interpreter ) directive of RSX-11M V4.1. This directive
;    is really only usefull for user-written CLI tasks. See the
;    Executive Reference and System Management manuals for 
;    information on user-written CLIs. 
;
; FILE: PA3:[22,310]GCCI.MAC
; Author: Jim Bostwick 13-Sep-84
; History: 
;
; Last Edit:  13-SEP-1984 16:34:07 
;
; PROCEDURE GCCI( VAR Buff: CH80; VAR Len:Integer; 
;		  VAR Info: GCCI_Info_rec); EXTERNAL;
;			
;{ Pascal-3 procedure to implement the GCCI$ directive.
;  GCCI gets a command line for a CLI task. Buff is the buffer
;  to receive the command, Len is the length of the command. 
;  Info is a structure containing all other data returned by 
;  GCCI$. This structure is defined in ex:[22,320]GCCI.TYP,
;  Flags word and no-command word values are defined in ex:[22,320]GCCI.CON.
;
;  Directive status is available in DSW upon return. 
;
;   } 
;
; Assemble with PASMAC.MAC as prefix file.
; Compile with LB:[22,10]GCCIINFO.PAS as include file.
;  
; NOTE: This procedure employs internal data PSECT CLIDAT. Therefore,
;    it is not possible to include GCCI in a resident library.
;
; j.m.b.  13-SEP-1984 16:33:36  
;

	.MCALL GCCI$, DIR$
	
	.PSECT CLIDAT, D, RW
;
; Local data. NOTE: Use of CLIDAT precludes inclusion of GCCI in
; a shared library.
;

GCIDPB:	GCCI$ GCCBUF,GCCLEN,, IBFL,,	; skeleton directive

GCCLEN = 80.+G.CCBF	; command buffer length
IBFL = G.CCCA+2		; length of info buffer

; Define internal command buffer..

GCCBUF:	.BLKB GCCLEN	

; NOTE:
; The internal buffer maps directly into a part of the 
; Pascal GCCI_Info record.
;
; The CW2 field marks the beginning of the information buffer
; in GCCI_INFO.


  	.PSECT
; define the GCCI_INFO record in macro....

RECORD	PASINF		; GCCI_INFO
FIELD NOCMD,	INTEGER		; NO-COMMAND CONTROL (BYTE) WORD
FIELD DEVICE,	INTEGER		; CH2 
FIELD UNIT, 	INTEGER		; 
FIELD CCL, 	INTEGER		; ORIGINAL LENGTH
FIELD FLAGS, 	INTEGER		
FIELD TERM, 	CHAR
FIELD CW2, 	INTEGER
FIELD PARENT,   4
FIELD POCB, 	ADDRESS
FIELD LOGGR,	INTEGER
FIELD LOGME,	INTEGER
FIELD CURGR,	INTEGER
FIELD CURME,	INTEGER
FIELD CMDADR, 	ADDRESS
ENDREC


	PROC GCCI
	PARAM BUFF, ADDRESS
  	PARAM LEN, ADDRESS
	PARAM INFO, ADDRESS
	SAVE <R0, R1, R2 >
	BEGIN
	MOV	#GCIDPB, R1	; R1-> GCCI$ DPB
	MOV 	INFO(SP), R0	; R0-> GCCI_INFO
	MOV	NOCMD(R0), G.CCNC(R1)	; COPY NO-COMMAND ACTION
	ADD	#CW2, R0	; R0-> INFORMATION BUFFER
	MOV	R0, G.CCIA(R1)	; info buffer address to DPB
	DIR$	#GCIDPB
	BCS 	50$

	; COPY RETURNED INFO BACK TO PASCAL...
  	; (THE INFO BUFFER IS RETURNED BY GCCI$ DIRECTLY
  	; TO PASCAL SPACE), BUT WE HAVE TO SHUFFLE IT
  	; A BIT TO TURN UICS FROM BYTES TO INTEGERS...

  	MOV	INFO(SP), R0	; R0-> INFO BUFFER
	MOV	CURGR(R0), CMDADR(R0)	; REPOSITION CMDADR
	MOVB	LOGME+1(R0), CURGR(R0)	
	CLRB	CURGR+1(R0)
	MOVB	LOGME(R0), CURME(R0)
	CLRB	CURME+1(R0)
	MOVB	LOGGR(R0), LOGME(R0)
	CLRB	LOGME+1(R0)
        MOVB	LOGGR+1(R0), LOGGR(R0)
	CLRB	LOGGR+1(R0)
  	MOV	#GCCBUF, R1	; R1-> INTERNAL BUFFER
	MOVB	G.CCCT(R1), R2	; R2= CHARACTER COUNT
	MOV	R2, @LEN(SP)	; RETURN COUNT TO PASCAL
  	BLE	3$		; SKIP COPY IF NO LENGTH
	ADD	#G.CCBF, R1	; R1-> GCCI COMMAND TEXT
	MOV	BUFF(SP), R0	; R0-> PASCAL BUFFER
2$:	MOVB	(R1)+, (R0)+	; COPY COMMAND TO PASCAL
	SOB	R2, 2$

3$:	MOV	#GCCBUF, R1		; R1-> GCCI COMMAND BUFFER
	MOV	INFO(SP), R0		; R0-> PASCAL INFO RECORD
	MOV	G.CCDV(R1), DEVICE(R0)	; COPY DEVICE
	MOVB	G.CCUN(R1), UNIT(R0)	; COPY UNIT NUMBER
	CLRB	UNIT+1(R0)		; CLEAR HI BYTE
	MOV	G.CCCL(R1), CCL(R0)	; COPY INPUT COMMAND LENGTH
	MOVB	G.CCFL(R1), FLAGS(R0) 	; FLAGS BYTE
	CLRB	FLAGS+1(R0)		; CLEAR HI BYTE
	MOVB	G.CCTC(R1), TERM(R0)	; COPY TERMINATOR

50$:	
	ENDPR
	.END

