;
;  PROGRAM:  ECHO
;  AUTHOR:  RICHARD CONN
;  VERSION:  1.2
;  DATE:  21 JUN 83
;  PREVIOUS VERSIONS:  1.1 (6 JAN 83), 1.0 (10 DEC 82)
;
VERS	EQU	12

;
;	This program is Copyright (c) 1982, 1983 by Richard Conn
;	All Rights Reserved
;
;	ZCPR2 and its utilities, including this one, are released
; to the public domain.  Anyone who wishes to USE them may do so with
; no strings attached.  The author assumes no responsibility or
; liability for the use of ZCPR2 and its utilities.
;
;	The author, Richard Conn, has sole rights to this program.
; ZCPR2 and its utilities may not be sold without the express,
; written permission of the author.
;


;
;	ECHO is used to echo the command line to the screen.  It is invoked
; in two different ways:
;		ECHO			<-- print Help Message
;		ECHO //			<-- print Help Message
;		ECHO text		<-- print text
;
;	This seems like a trivial program, but it buys the user one key thing:
; for ZCPR2 use, a message may be stored in the multiple command line buffer
; by using ECHO, so that programs like STARTUP can print a welcome message
; after they have run.  For STARTUP in particular, a sample command line
; would be:
;		ioloader;ld ld;tinit;echo WELCOME TO ZCPR II
;	This line runs IOLOADER, which loads the redirectable I/O devices,
; followed by LD LD, which loads a named directory into memory, and TINIT,
; which initializes a TVI 950 terminal (function keys, user line, etc).
; When all is done, TINIT will have cleared the screen and ECHO will have
; printed its message.
;

;
;  Externals
;
	ext	epstr	; print string pted to by HL
	ext	crlf	; new line
	ext	print	; print string pted to by ret adr

;
;  CP/M Constants
;
tbuff	equ	80h	; console line buffer
cr	equ	0dh
lf	equ	0ah

;
;  Branch to Start of Program
;
	jmp	start

;
;******************************************************************
;
;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
;
;	This data block precisely defines the data format for
; initial features of a ZCPR2 system which are required for proper
; initialization of the ZCPR2-Specific Routines in SYSLIB.
;

;
;  EXTERNAL PATH DATA
;
EPAVAIL:
	DB	0FFH	; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
EPADR:
	DW	40H	; ADDRESS OF EXTERNAL PATH IF AVAILABLE

;
;  INTERNAL PATH DATA
;
INTPATH:
	DB	0,0	; DISK, USER FOR FIRST PATH ELEMENT
			; DISK = 1 FOR A, '$' FOR CURRENT
			; USER = NUMBER, '$' FOR CURRENT
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0	; DISK, USER FOR 8TH PATH ELEMENT
	DB	0	; END OF PATH

;
;  MULTIPLE COMMAND LINE BUFFER DATA
;
MCAVAIL:
	DB	0FFH	; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
MCADR:
	DW	0FF00H	; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE

;
;  DISK/USER LIMITS
;
MDISK:
	DB	4	; MAXIMUM NUMBER OF DISKS
MUSER:
	DB	31	; MAXIMUM USER NUMBER

;
;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
;
DOK:
	DB	0FFH	; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
UOK:
	DB	0FFH	; ALLOW USER CHANGE? (0=NO, 0FFH=YES)

;
;  PRIVILEGED USER DATA
;
PUSER:
	DB	10	; BEGINNING OF PRIVILEGED USER AREAS
PPASS:
	DB	'chdir',0	; PASSWORD FOR MOVING INTO PRIV USER AREAS
	DS	41-($-PPASS)	; 40 CHARS MAX IN BUFFER + 1 for ending NULL

;
;  CURRENT USER/DISK INDICATOR
;
CINDIC:
	DB	'$'	; USUAL VALUE (FOR PATH EXPRESSIONS)

;
;  DMA ADDRESS FOR DISK TRANSFERS
;
DMADR:
	DW	80H	; TBUFF AREA

;
;  NAMED DIRECTORY INFORMATION
;
NDRADR:
	DW	00000H	; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
NDNAMES:
	DB	64	; MAX NUMBER OF DIRECTORY NAMES
DNFILE:
	DB	'NAMES   '	; NAME OF DISK NAME FILE
	DB	'DIR'		; TYPE OF DISK NAME FILE

;
;  REQUIREMENTS FLAGS
;
EPREQD:
	DB	000H	; EXTERNAL PATH?
MCREQD:
	DB	000H	; MULTIPLE COMMAND LINE?
MXREQD:
	DB	000H	; MAX USER/DISK?
UDREQD:
	DB	000H	; ALLOW USER/DISK CHANGE?
PUREQD:
	DB	000H	; PRIVILEGED USER?
CDREQD:
	DB	000H	; CURRENT INDIC AND DMA?
NDREQD:
	DB	000H	; NAMED DIRECTORIES?
Z2CLASS:
	DB	0	; CLASS 0
	DB	'ZCPR2'
	DS	10	; RESERVED

;
;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
;
;******************************************************************
;

;
;  Start of Program
;
start:
	lxi	h,tbuff	; place zero at end of command line
	mov	a,m	; get char count
	inx	h	; pt to first char
	push	h	; save ptr
	add	l	; HL=HL+A
	mov	l,a
	mov	a,h
	aci	0
	mov	h,a
	mvi	m,0	; store ending zero
	pop	h	; pt to first char
	call	sblank	; skip to first non-blank
	ora	a	; EOL means print Help Message
	jz	phelp
	cpi	'/'	; slash means print Help Message also
	jnz	echo	; if not slash, print buffer contents
;
;  Print Help Message
;
phelp:
	call	print
	db	'ECHO  Version '
	db	(vers/10)+'0','.',(vers mod 10)+'0'
	db	cr,lf,'	ECHO prints the command line on the user''s console.'
	db	cr,lf,'It is invoked by the following forms:'
	db	cr,lf
	db	cr,lf,'		ECHO or ECHO //		<-- Print this Help'
	db	cr,lf,'		ECHO text		<-- Print text'
	db	cr,lf,0
	ret
;
;  Echo Command Line
;
echo:
	call	crlf	; new line
	call	epstr	; simply print string starting at HL
	ret
;
;  Skip to Non-Blank
;
sblank:
	mov	a,m	; get char
	inx	h	; pt to next
	cpi	' '	; skip if space
	jz	sblank
	dcx	h	; back up to non-space
	ret

	end