	.XLIST
;	.	.	.	.	.
;
; SAVE MACRO   SAVE SPECIFIED REGITERS.
;
;  SAVE  R1,R2,R3,R4
;
;	R1-R4 MAY BE BC,DE,HL OR AF SAVED
;	IN ORDER SPECIFIED, IF REGS ARE OMITTED
;	SAVE BC,DE AND HL.
;
SAVE	MACRO	R1,R2,R3,R4
	IFNB	<R1&R2&R3&R4>
	IRP	R,<R1,R2,R3,R4>
	IFB	<R>
	EXITM
	ENDIF
	PUSH	R
	ENDM
	ELSE
	IRP	REG,<BC,DE,HL>
	PUSH	REG
	ENDM
	ENDIF
	ENDM
;
;	.	.	.	.	.
;
; RESTORE MACRO   RESTORE REGITERS
; (INVERSE OF SAVE)
;
;	RESTORE R1,R2,R3,R4
;
;	R1-R4 MAY BE BC,DE,HL OR AF
;	RESTORED IN ORDER SPECIFIED
;	IF REGS OMITTED RESTORE HL,DE,BC.
;
RESTORE	MACRO	R1,R2,R3,R4
	IFNB	<R1&R2&R3&R4>
	IRP	R,<R1,R2,R3,R4>
	IFB	<R>
	EXITM
	ENDIF
	POP	R
	ENDM
	ELSE
	IRP	REG,<HL,DE,BC>
	POP	REG
	ENDM
	ENDIF
	ENDM
;
;	.	.	.	.	.	.	.
;
; PRINT MACRO  PRINT A STRING ON CONSOLE
;
; PRINT (CERRIAGE RETURN,LINE FEED)
; PRINT 'LITERAL'
; PRINT <'LITERAL,CR,LF,'SECOND LITERAL'>
; PRINT ADDR,$		(ASCII OUTPUT UNTIL $)
; PRINT ADDR,L,'H'	(HEX OUTPUT L CHARACTERS)
; PRINT ADDR,L,'A'	(ASCII OUTPUT L CHARACTERS)
;
; LITERALS MUST BE IN SINGLE QUOTES 'LIT'
; IF LITERAL CONTAINS CONTROL CODES ENTIRE
; STRING MUST BE IN <> BRACKETS.
;
; MACRO ALSO ASSEMBLES:
;	CR = CARRIAGE RETURN
;	LF = LINE FEED
;	BEL = BELL CODE
;
; MACRO ASSUMES ADDR ALREADY IN HL IF ARUMENT
; IS OMITTED.
;
;	.	.	.	.	.	.	.
PRINT	MACRO	?STRING,LEN,TC
	LOCAL	@OVER,@MESS,PLOOP,PASTCR,@CRLF
CR	DEFL	0DH
LF	DEFL	0AH
BEL	DEFL	07H
	IFB	<?STRING&LEN&TC>
	JR	PASTCR
@CRLF:	DEFB	CR
	DEFB	LF
	DEFB	'$'
PASTCR:	LD	DE,@CRLF
	LD	C,9
	CALL	5
	ELSE
	IFB	<LEN&TC>
	JR	@OVER
@MESS:	DEFB	?STRING
	DEFB	'$'
@OVER:	LD	DE,@MESS
	LD	C,9
	CALL	5
	ELSE
	IFB	<TC>
	IFNB	<?STRING>

	LD	DE,?STRING
	ENDIF
	LD	C,9
	CALL	5
	ELSE
	IFNB	<?STRING>
	LD	HL,?STRING
	ENDIF
	LD	C,LEN
PLOOP:	PUSH	BC
	PUSH	HL
	IF	TC EQ 'H'
	LD	A,(HL)		; GET A BYTE
	HEXOUT			; CONV. TO HEX&OUTP.
	ELSE
	LD	E,(HL)
	LD	C,2
	CALL	5
	ENDIF
	POP	HL
	POP	BC
	INC	HL
	DEC	C
	JR	NZ,PLOOP
	ENDIF
	ENDIF
	ENDIF
	ENDM
;
;	.	.	.	.	.	.
;
; HEXOUT MACRO  CONVERT BINARY NO
; AND OUTPUT TO CONSOLE.
;
; HEXOUT ADDR
;
; NUMBER ASSUMED IN A IF NO ARGUMENT.
;
HEXOUT	MACRO	ADDR
	LOCAL	OUTCHR,HEXEND
	JP	HEXEND
HEXPRN:	SAVE	AF
	RRCA
	RRCA
	RRCA
	RRCA
	CALL	OUTCHR
	RESTORE	AF
OUTCHR:	AND	0FH		;MASK 4 BITS
	ADD	A,90H		; ADD OFFSET
	DAA
	ADC	A,40H
	DAA
	LD	E,A
	LD	C,2
	JP	5
HEXEND:
HEXOUT	MACRO	?ADDR
	IFNB	<?ADDR>
	LD	A,(?ADDR)
	ENDIF
	CALL	HEXPRN
	ENDM
	HEXOUT	ADDR
	ENDM
;	.	.	.	.	.
;
;HEXIN MACRO
; CONVERT A NUMBER IN MEMORY FROM
; HEX TO BINARY.
; IF NO ARGUMENT, MACRO ASSUMES
; ADDR OF STRING IN HL.
; ASNWER LEFT IN HL, WITH LEAST SIGN.
; 8BITS IN A. CARRY SET ON ERROR.
; CONVERSION STOPS IF A ZERO IS FOUND
; IN INPUT STRING.
;
;	HEXIN	[ADDR]
;
HEXIN	MACRO	ADDR
	LOCAL	IN1,IN2,OVERSUB
	JR	OVERSUB
@HEXIN:	LD	HL,0		; ZERO NUMBER
IN1:	LD	A,(DE)		; GET A CHAR
	OR	A		; CHECK FOR END
	RET	Z
	SUB	'0'
	RET	C
	ADD	A,'0'-'G'
	RET	C
	ADD	A,6
	JP	P,IN2
	ADD	A,7
	RET	C
IN2:	ADD	A,10
	OR	A
	LD	C,A
	LD	B,0
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL		; SHIFT LEFT 4
	ADD	HL,BC		; ADD IN NEW DIGIT
	INC	DE		; INCR BUFFER POINTER
	JR	IN1
;
OVERSUB:
HEXIN	MACRO	?ADDR
	IFNB	<?ADDR>
	LD	DE,?ADDR
	ELSE
	EX	DE,HL
	ENDIF
	CALL	@HEXIN
	LD	A,L
	ENDM
	HEXIN	ADDR
	ENDM
;
;
;	.	.	.	.	.	.
;
; CHARIN MACRO CONSOLE INPUT
; TO A AND TO (ADDR) IF SPECIFIED.
;
;	CHARIN	[ADDR]
;
CHARIN	MACRO	ADDR
	LD	C,1	;CONSOLE INPUT
	CALL	5
	IFNB	<ADDR>
	LD	(ADDR),A
	ENDIF
	ENDM
;
;	.	.	.	.	.
;
; CHAROUT MACRO CONSOLE OUTPUT
; FROM A OR (ADDR) IF SPECIFIED.
;
;	CHAROUT [ADDR]
;
CHAROUT	MACRO	ADDR
	IFNB	<ADDR>
	LD	A,(ADDR)
	ENDIF
	LD	C,2
	LD	E,A
	CALL	5
	ENDM
;
;	.	.	.	.	.
;
; CHARSTAT MACRO, CHECK CONSOLE STATUS.
;
; RETURN TRUE (FF) IF CHAR READY
;	 FALSE (0) IF NOT.
;
CHARSTAT	MACRO
	LOCAL	EXIT
	LD	C,11
	CALL	5
	OR	A
	JR	Z,EXIT
	LD	A,0FFH
EXIT:
	ENDM
;
;	.	.	.	.	.
;
; INPUT MACRO
; INPUT CHAR STRING FROM CONSOLE.
;
; INPUT ADDR,BUFLEN
;
;	ADDR	START OF TEXT BUFFER.
;	BUFLEN	LENGTH OF BUFFER (DEFAULT 127).
;
INPUT	MACRO	ADDR,BUFLEN
	LD	C,10
	IFNB	<ADDR>
	LD	DE,ADDR		;SET BUFFER ADDRESS
	ENDIF
	IFNB	<BUFLEN>
	LD	(DE),A
	ELSE
	LD	A,127
	LD	(DE),A
	ENDIF
	CALL	5
	ENDM
;
	.LIST
