.XLIST	;don't list as macros are loaded...
;======================================================================
;	FORTH.ASM macro support
;======================================================================

_LINK	= 0		;;variable used to keep dictionary links

$FAIL	MACRO	MSG	;;Force an assembler error
	%OUT	** &MSG
FORCED ERROR:&MSG	;;this will cause a syntax error, and print MSG
	ENDM

;=======================================================================
;	$NAME	compile a Fig-FORTH name field
;=======================================================================

$NAME	MACRO	LBYTE, NAME, LASTCH

	_NFA	= $

	DB	LBYTE		;;length
	IFNB	<NAME>
	DB	'&NAME'		;;first part of name, except last char
	ENDIF
	DB	'&LASTCH'+80H	;;last char has high bit set
	ENDM

;=======================================================================
;	$LINKS	compile LFA, set _LINK to the NFA just set up by $NAME
;=======================================================================

$LINKS	MACRO	CFA, LABEL

	IF	_ALIGN		;;align LFA if _ALIGN is TRUE
	EVEN
	ENDIF

	DW	_LINK		;;LFA
	_LINK	= _NFA		;;will become next LFA in list

	IFNB	<LABEL>
LABEL:				;;label to be used in definitions
	ENDIF
	DW	CFA

	ENDM

;=======================================================================
;	$CODE	compile a code definition header
;=======================================================================

$CODE	MACRO	ONE, TWO, THREE, FOUR

	$NAME	ONE, TWO, THREE
	$LINKS	$+2, FOUR	;;CFA points to next address
	ENDM

;=======================================================================
;	$COLON	compile a colon definition header
;=======================================================================

$COLON	MACRO	ONE, TWO, THREE, FOUR

	$NAME	ONE, TWO, THREE
	$LINKS	DOCOL, FOUR
	ENDM

;=======================================================================
;	$CONST	compile a constant header
;=======================================================================

$CONST	MACRO	ONE, TWO, THREE, FOUR

	$NAME	ONE, TWO, THREE
	$LINKS	DOCON, FOUR
	ENDM

;=======================================================================
;	$VAR	compile a variable header
;=======================================================================

$VAR	MACRO	ONE, TWO, THREE, FOUR

	$NAME	ONE, TWO, THREE
	$LINKS	DOVAR, FOUR
	ENDM

;=======================================================================
;	$USER	compile a user variable header
;=======================================================================

$USER	MACRO	ONE, TWO, THREE, FOUR

	$NAME	ONE, TWO, THREE
	$LINKS	DOUSE, FOUR
	ENDM

;=======================================================================
;	$DOES	compile a header for word defined by DOES>
;=======================================================================

$DOES	MACRO	ONE, TWO, THREE, FOUR

	$NAME	ONE, TWO, THREE
	$LINKS	DODOE, FOUR
	ENDM

;=======================================================================
;	$GOTO	compile an absolute branch
;=======================================================================

$GOTO	MACRO	LABEL

	DW	BRAN
	DW	OFFSET LABEL-$
	ENDM

;=======================================================================
;	$GO?0	compile a relative branch
;=======================================================================

$GO?0	MACRO	LABEL

	DW	ZBRAN
	DW	OFFSET LABEL-$
	ENDM

;=======================================================================
;	$LOOP	compile a loop
;=======================================================================

$LOOP	MACRO	LABEL

	DW	XLOOP
	DW	OFFSET LABEL-$
	ENDM

;=======================================================================
;	$REPORT	print a message if _REPORT is TRUE
;=======================================================================

$REPORT	MACRO	MESSAGE,VALUE

	IF	_REPORT
	IF2
	IFNB	<VALUE>
	%OUT	MESSAGE&VALUE
	ELSE
	%OUT	MESSAGE
	ENDIF
	ENDIF
	ENDIF
	ENDM

.LIST		;;start listing again

		POP	CX
		POP	CX
M