please dont rip this site

Language Forth Z80FIG-FORTH1_1G_FILES Z80FORTH.ASM

	TITLE	< Z80 fig-FORTH 1.1 g >
	SUBTTL	Adaptive version by EHR
;
;
; Modified frm FIG document keyed by Dennis L. Wilson 800907
; Converted frm "8080 FIG-FORTH VERSION A0 15SEP79"
;
; fig-FORTH release 1.1 for the 8080 processor.
;
; ALL PUBLICATIONS OF THE FORTH INTEREST GROUP
; ARE PUBLIC DOMAIN. THEY MAY BE FURTHER
; DISTRIBUTED BY THE INCLUSION OF THIS CREDIT NOTICE:
;
; This publication has been made available by the
;	Forth Interest Group
;	P.O.Box 1105
;	San Carlos, CA 94070
;	U.S.A.
;
; Implementation on 8080 by:
;	John Cassady
;	339 15th Street
;	Oakland, CA 94612
;	U.S.A
;	on 790528
; Modified by:
;	Kim Harris
; Acknowledgements:
;	George Flammer
;	Robt. D. Villwock
; ----------------------------------------------------------------------
; Z80 Version for Cromemco CDOS & Digital Research CP/M by:
;	Dennis Lee Wilson c/o
;	Aristotelian Logicians
;	2631 East Pinchot Avenue
;	Phoenix, AZ 85016
;	U.S.A.
; ----------------------------------------------------------------------
; The 2 byte Z80 code for Jump Relative (JR) has been substituted for
; the 3 byte Jump (JP) wherever practical. The port I/O words P@ & P!
; have been made ROMable by use of Z80 instructions.
; ----------------------------------------------------------------------
; Further modifications (marked ;/) by:
;	Edmund Ramm
;	Anderheitsallee 24
;	2000 Hamburg 71
;	Fed. Rep. of Germany	840418
; ----------------------------------------------------------------------
; Disc I/O has been modified a la Albert van der Horst (HCCH) to employ
; CP/M 2.x's random access feature.
; ----------------------------------------------------------------------
;
;	Release & Version numbers
;
FIGREL	EQU	1		;FIG RELEASE #
FIGREV	EQU	1		;FIG REVISION #
USRVER	EQU	67H		;USER VERSION # g by DLW/EHR/AvdH
;
;Console & printer drivers are in external source named
;CONPRTIO.FTH & disc drivers in DISCIO.FTH. It has 4 screen
;buffers & end of memory is set to FBASE from locn. 0007H.
	FORM
;	ASCII characters used
;
ABL	EQU	20H		;BLANK
ACR	EQU	0DH		;CR
ADOT	EQU	2EH		;.
BELL	EQU	07H		;^G
BSIN	EQU	08H		;backspace chr = ^H
BSOUT	EQU	08H
DLE	EQU	10H		;^P
LF	EQU	0AH		;^J
FF	EQU	0CH		;^L
;
;	Memory allocation
;
BDOSS	EQU	0005H		;/ system entry
NSCR	EQU	4		;  # of 1024 byte screens
KBBUF	EQU	128		;  bytes/disc buffer
US	EQU	40H		;  user variables space
RTS	EQU	400H		;  Return Stack & term buff space
CO	EQU	KBBUF+4		;  Disc buff + 2 header + 2 tail
NBUF	EQU	NSCR*400H/KBBUF	;  # of buffers
BUFSIZ	EQU	CO*NBUF		;/ total disc buffer size
	FORM
	ABS
;
	ORG	0100H
ORIG:	NOP
	JP	CLD		;VECTOR TO COLD START
	NOP
	JP	WRM		;VECTOR TO WARM START
	DEFB	FIGREL		;FIG RELEASE #
	DEFB	FIGREV		;FIG REVISION #
	DEFB	USRVER		;USER VERSION #
	DEFB	0EH		;IMPLEMENTATION ATTRIBUTES
;
;
;
;	0EH = 0000:1110
;	      ---------
; B +ORIGIN   ...W:IEBA
;
; W: 0=above sufficient
;    1=other differences exist
; I: Interpreter is	0=pre-
;			1=post incrementing
; E: Addr must be even: 0 yes
;			1 no
; B: High byte @	0=low addr.
;			1=high addr.
; A: CPU Addr.		0=BYTE
;			1=WORD
;
;
;
	DEFW	TASK-7		;  TOPMOST WORD IN FORTH VOCABULARY
	DEFW	BSIN		;  BACKSPACE CHR
UPINIT:	DEFW	0		;/ INIT (UP)
;
; * FOLLOWING USED BY COLD; MUST BE IN SAME ORDER AS USER VARIABLES *
;
S0INIT:	DEFW	0		;/ INIT (S0)
R0INIT:	DEFW	0		;/ INIT (R0)
TIBINI:	DEFW	0		;/ INIT (TIB)
	DEFW	1FH		;  INIT (WIDTH)
	DEFW	0		;  INIT (WARNING)
	DEFW	INITDP		;  INIT (FENCE)
	DEFW	INITDP		;  INIT (DP)
	DEFW	FORTH+8		;  INIT (VOC-LINK)
;
; *  END DATA USED BY COLD *
;
	DEFW	0H,0B250H	;Z80 CPU NAME (HW,LW)
				;(32 BIT BASE 36 INTEGER)
	FORM
;	REGISTERS
;
;	FORTH	Z80	FORTH PRESERVATION RULES
;	-----	---	-----------------------
;	IP	BC	should be preserved
;			accross FORTH words.
;	W	DE	sometimes output from
;			NEXT, may be altered
;			b4 JP'ing to NEXT,
;			input only when 
;			"DPUSH" called.
;	SP	SP	should be used only as
;			Data Stack accross
;			FORTH words, may be
;			used within FORTH
;			words if restored
;			b4 "NEXT"
;		HL	Never output frm NEXT
;			input only when
;			"HPUSH" called
;
;
UP:	DEFW	0		;/ USER AREA PTR
RPP:	DEFW	0		;/ RETURN STACK PTR
BUF1:	DEFW	0		;/ address of 1st disc buffer
;
;
;	COMMENT CONVENTIONS:
;
;	=	MEANS "IS EQUAL TO"
;	<--	MEANS ASSIGNMENT
;	NAME	=     ADDR OF NAME
;	(NAME)  =     CONTENTS @ NAME
;	((NAME))=     INDIRECT CONTENTS
;	CFA	=     CODE FIELD ADDR
;	LFA	=     LINK FIELD ADDR
;	NFA	=     NAME FIELD ADDR
;	PFA	=     PARAMETER FIELD ADDR
;	S1	=     ADDR OF 1st WORD OF PARAMETER STACK
;	S2	=     -"-  OF 2nd -"-  OF    -"-     -"-
;	R1	=     -"-  OF 1st -"-  OF RETURN STACK
;	R2	=     -"-  OF 2nd -"-  OF  -"-    -"-
; ( above Stack posn. valid b4 & after execution of any word, not during)
;
;	LSB	=     LEAST SIGNIFICANT BIT
;	MSB	=     MOST  SIGNIFICANT BIT
;	LB	=     LOW  BYTE
;	HB	=     HIGH BYTE
;	LW	=     LOW  WORD
;	HW	=     HIGH WORD
; (May be used as suffix to above names)
	FORM
;	FORTH ADDRESS INTERPRETER
;	POST INCREMENTING VERSION
;
DPUSH:	PUSH	DE
HPUSH:	PUSH	HL		;		IY points here
NEXT:	LD	A,(BC)		;(W)<--((IP))	IX points here
	LD	L,A
	INC	BC		;INC IP
	LD	A,(BC)
	LD	H,A		;(HL)<--CFA
	INC	BC		;INC IP
NEXT1:	LD	E,(HL)		;(PC)<--((W))
	INC	HL
	LD	D,(HL)
	EX	DE,HL
	JP	(HL)		;NOTE: (DE)=CFA+1
;
JNEXT	MACRO
	JP	(IX)
	ENDM
;
JHPUSH	MACRO
	JP	(IY)
	ENDM
	FORM
;	FORTH DICTIONARY
;	DICTIONARY FORMAT:
;
;				BYTE
;	ADDRESS NAME		CONTENTS
;	------- ----		--------
;						(MSB=1
;						(P=PRECEDENCE BIT
;						(S=SMUDGE BIT
;	NFA	NAME FIELD	1PS<LEN>	<NAME LENGTH
;				0<1CHAR>	MSB=0, NAME'S 1st CHAR
;				0<2CHAR>
;				  ...
;				1<LCHAR>	MSB=1, NAME'S LAST CHAR
;	LFA	LINK FIELD	<LINKLB>	=PREVIOUS WORD'S NFA
;				<LINKHB>
;LABEL:	CFA	CODE FIELD	<CODELB>	=ADDR CPU CODE
;				<CODEHB>
;	PFA	PARAMETER	<1PARAM>	1st PARAMETER BYTE
;		FIELD		<2PARAM>
;				  ...
;
;
;
DP0:	DEFB	83H		;LIT
	DM	'LIT'
	DEFW	0		;(LFA)=0 MARKS END OF DICTIONARY
LIT:	DEFW	$+2		;(S1)<--((IP))
	LD	A,(BC)		;(HL)<--((IP))=LITERAL
	INC	BC		;(IP)<--(IP)+2
	LD	L,A		;LB
	LD	A,(BC)		;HB
	INC	BC
	LD	H,A
	JHPUSH			;(S1)<--(HL)
;
	DEFB	87H		;EXECUTE
	DM	'EXECUTE'
	DEFW	LIT-6
EXEC:	DEFW	$+2
	POP	HL
	JP	NEXT1
;
	DEFB	86H		;BRANCH
	DM	'BRANCH'
	DEFW	EXEC-0AH
BRAN:	DEFW	$+2		;(IP)<--(IP)+((IP))
BRAN1:	LD	H,B		;(HL)<--(IP)
	LD	L,C
	LD	E,(HL)		;(DE)<--((IP))=BRANCH OFFSET
	INC	HL
	LD	D,(HL)
	DEC	HL
	ADD	HL,DE		;(HL)<--(HL)+((IP))
	LD	C,L		;(IP)<--(HL)
	LD	B,H
	JNEXT
;
	DEFB	87H		;0BRANCH
	DM	'0BRANCH'
	DEFW	BRAN-9
ZBRAN:	DEFW	$+2
	POP	HL
	LD	A,L
	OR	H
	JR	Z,BRAN1		;IF (S1)=0 THEN BRANCH
	INC	BC		;ELSE SKIP BRANCH OFFSET
	INC	BC
	JNEXT
;
	DEFB	86H		;(LOOP)
	DM	'(LOOP)'
	DEFW	ZBRAN-0AH
XLOOP:	DEFW	$+2
	LD	HL,(RPP)	;  ((HL))=INDEX=(R1)
	inc	(hl)		;/  index(lb) += 1
	LD	E,(HL)		;/
	INC	HL		;/ (hl)-->index(hb)
	jr	nz,xloop1	;/ jump if ((hl)) < 256
	inc	(hl)		;/ else index(hb) += 1
xloop1:	LD	D,(HL)		;/ (DE)<-- new INDEX
	INC	HL		;/ ((HL))=LIMIT
	LD	A,E
	SUB	(HL)
	LD	A,D
	INC	HL
	SBC	A,(HL)		;  INDEX<LIMIT?
	JP	M,BRAN1		;  YES, LOOP AGAIN
	INC	HL		;  NO, DONE
	LD	(RPP),HL	;  DISCARD R1 & R2
	INC	BC
	INC	BC		;  SKIP BRANCH OFFSET
	JNEXT
;
	DEFB	87H		;(+LOOP)
	DM	'(+LOOP)'
	DEFW	XLOOP-9
XPLOO:	DEFW	$+2
	POP	DE		;(DE)<--INCR
	LD	HL,(RPP)	;((HL))=INDEX
	LD	A,(HL)		;INDEX<--INDEX+INCR
	ADD	A,E
	LD	(HL),A
	LD	E,A
	INC	HL
	LD	A,(HL)
	ADC	A,D
	LD	(HL),A
	INC	HL		;((HL))=LIMIT
	INC	D
	DEC	D
	LD	D,A		;(DE)<--NEW INDEX
	JP	M,XLOO2		;IF INCR>0
	LD	A,E
	SUB	(HL)		;THEN (A)<--INDEX - LIMIT
	LD	A,D
	INC	HL
	SBC	A,(HL)
	JP	XLOO3
XLOO2:	LD	A,(HL)		;ELSE (A)<--LIMIT - INDEX
	SUB	E
	INC	HL
	LD	A,(HL)
	SBC	A,D
;				;IF (A)<0
XLOO3:	JP	M,BRAN1		;THEN LOOP AGN
	INC	HL		;ELSE DONE
	LD	(RPP),HL	;DISCARD R1 & R2
	INC	BC		;SKIP BRANCH OFFSET
	INC	BC
	JNEXT
;
	DEFB	84H		;  (DO)
	DM	'(DO)'
	DEFW	XPLOO-0AH
XDO:	DEFW	$+2
	EXX			;/ SAVE IP
	POP	DE		;  (DE)<--INITIAL INDEX
	POP	BC		;/ (BC)<--LIMIT
	LD	HL,(RPP)	;  (HL)<--(RP)
	DEC	HL
	LD	(HL),B
	DEC	HL
	LD	(HL),C		;/ (R2)<--LIMIT
	DEC	HL
	LD	(HL),D
	DEC	HL
	LD	(HL),E		;  (R1)<--INITIAL INDEX
	LD	(RPP),HL	;  (RP)<--(RP)-4
	EXX			;/ RESTORE IP
	JNEXT
;
	DEFB	81H		;I
	DM	'I'
	DEFW	XDO-7
IDO:	DEFW	$+2		;(S1)<--(R1), (R1) UNCHANGED
	LD	HL,(RPP)
	LD	E,(HL)		;(DE)<--(R1)
	INC	HL
	LD	D,(HL)
	PUSH	DE		;(S1)<--(DE)
	JNEXT
;
	DEFB	85H		;DIGIT
	DM	'DIGIT'
	DEFW	IDO-4
DIGIT:	DEFW	$+2
	POP	HL		;(L)<--(S1)LB = BASE VALUE
	POP	DE		;(E)<--(S2)LB = ASCII CHR TO BE CONVERTED
	LD	A,E		;ACCU<--CHR
	SUB	'0'		;>=0?
	JR	C,DIGI2		;/ <0 IS INVALID
	CP	0AH		;>9?
	JR	C,DIGI1		;/ NO, TEST BASE VALUE
	SUB	07H		;GAP BETWEEN "9" & "A", NW "A"=0AH
	CP	0AH		;>="A"?
	JR	C,DIGI2		;/ CHRs BETWEEN "9" & "A" ARE INVALID
DIGI1:	CP	L		;<BASE VALUE?
	JR	NC,DIGI2	;/ NO, INVALID
	LD	E,A		;(S2)<--(DE) = CONVERTED DIGIT
	LD	HL,0001H	;(S1)<--TRUE
	JP	DPUSH
DIGI2:	LD	L,H		;(HL)<--FALSE
	JHPUSH			;(S1)<--FALSE
;
	DEFB	86H		;(FIND) (2-1)FAILURE
	DM	'(FIND)'	;	(2-3)SUCCESS
	DEFW	DIGIT-8
PFIND:	DEFW	$+2
	POP	DE		;(DE)<--NFA
PFIN1:	POP	HL		;(HL)<--STRING ADDR
	PUSH	HL		;SAVE FOR NEXT ITERATION
	LD	A,(DE)
	XOR	(HL)		;FILTER DEVIATIONS
	AND	3FH		;MASK MSB & PRECEDENCE BIT
	JR	NZ,PFIN4	;LENGTHS DIFFER
PFIN2:	INC	HL		;(HL)<--ADDR NEXT CHR IN STRING
	INC	DE		;(DE)<--ADDR NEXT CHR IN NF
	LD	A,(DE)
	XOR	(HL)		;FILTER DEVIATIONS
	ADD	A,A
	JR	NZ,PFIN3	;NO MATCH
	JR	NC,PFIN2	;MATCH SO FAR, LOOP AGN
	LD	HL,0005H	;STRING MATCHES
	ADD	HL,DE		;((SP))<--PFA
	EX	(SP),HL
PFIN6:	DEC	DE		;POSN DE ON NFA
	LD	A,(DE)
	OR	A		;MSB=1? =LENGTH BYTE
	JP	P,PFIN6		;NO, TRY NEXT CHR
	LD	E,A		;(E)<--LENGTH BYTE
	LD	D,00H
	LD	HL,0001H	;(HL)<--TRUE
	JP	DPUSH		;NF FOUND, RETURN
;
;ABOVE NF NOT A MATCH, TRY NEXT ONE
;
PFIN3:	JR	C,PFIN5		;CARRY=END OF NF
PFIN4:	INC	DE		;FIND END OF NF
	LD	A,(DE)
	OR	A		;MSB=1?
	JP	P,PFIN4		;NO, LOOP
PFIN5:	INC	DE		;(DE)<--LFA
	EX	DE,HL
	LD	E,(HL)
	INC	HL
	LD	D,(HL)		;(DE)<--(LFA)
	LD	A,D
	OR	E		;END OF DICTIONARY? (LFA)=0
	JR	NZ,PFIN1	;NO, TRY PREVIOUS DEFINITION
	POP	HL		;DROP STRING ADDR
	LD	HL,0		;(HL)<--FALSE
	JHPUSH			;NO MATCH FOUND, RETURN
;
	DEFB	87H		;ENCLOSE
	DM	'ENCLOSE'
	DEFW	PFIND-9
ENCL:	DEFW	$+2
	POP	DE		;(DE)<--(S1)=DELIMITER CHR
	POP	HL		;(HL)<--(S2)=ADDR OF TEXT TO SCAN
	PUSH	HL		;(S4)<--ADDR
	LD	A,E
	LD	D,A		;(D)<--DELIM CHR
	LD	E,-1		;INIT CHR OFFSET COUNTER
	DEC	HL		;(HL)<--ADDR-1
ENCL1:	INC	HL		;SKIP OVER LEADING DELIM CHRs
	INC	E
	CP	(HL)		;DELIM CHR?
	JR	Z,ENCL1		;YES, LOOP
	LD	D,0
	PUSH	DE		;(S3)<--(E)=OFFSET TO 1st NON DELIM
	LD	D,A		;(D)<--DELIM CHR
	LD	A,(HL)
	AND	A		;1st non-DELIM=NULL?
	JR	NZ,ENCL2	;NO
	LD	D,0		;YES
	INC	E
	PUSH	DE		;(S2)<--OFFSET TO BYTE FOLLOWING NULL
	DEC	E
	PUSH	DE		;(S1)<--OFFSET TO NULL
	JNEXT
ENCL2:	LD	A,D		;(A)<--DELIM CHR
	INC	HL		;(HL)<--ADDR NEXT CHR
	INC	E		;(E)<--OFFSET TO NEXT CHR
	CP	(HL)		;DELIM CHR?
	JR	Z,ENCL4		;YES
	LD	A,(HL)
	AND	A		;NULL?
	JR	NZ,ENCL2	;NO, CONT SCAN
ENCL3:	LD	D,0
	PUSH	DE		;(S2)<--OFFSET TO NULL
	PUSH	DE		;(S1)<--OFFSET TO NULL
	JNEXT
ENCL4:	LD	D,0
	PUSH	DE		;(S2)<--OFFSET TO BYTE FOLLOWING TEXT
	INC	E
	PUSH	DE		;(S1)<--OFFSET TO 2 BYTES AFTER END OF WORD
	JNEXT
;
	DEFB	84H		;EMIT
	DM	'EMIT'
	DEFW	ENCL-0AH
EMIT:	DEFW	DOCOL
	DEFW	PEMIT
	DEFW	ONE,OUTT
	DEFW	PSTOR,SEMIS
;
	DEFB	83H		;KEY
	DM	'KEY'
	DEFW	EMIT-7
KEY:	DEFW	$+2
	JP	PKEY
;
	DEFB	89H		;?TERMINAL
	DM	'?TERMINAL'
	DEFW	KEY-6
QTERM:	DEFW	$+2
	LD	HL,0
	JP	PQTER
;
	DEFB	82H		;CR
	DM	'CR'
	DEFW	QTERM-0CH
CR:	DEFW	$+2
	JP	PCR
;
	DEFB	85H		;CMOVE
	DM	'CMOVE'
	DEFW	CR-5
CMOVE:	DEFW	$+2
	EXX			;/ SAVE IP
	POP	BC		;  (BC)<--(S1)= #CHRs
	POP	DE		;  (DE)<--(S2)= DEST ADDR
	POP	HL		;/ (HL)<--(S3)= SOURCE ADDR
	LD	A,B
	OR	C		;  BC=0?
	JR	Z,EXCMOV	;  YES, DON'T MOVE ANYTHING
	LDIR			;/ XFER STRING
EXCMOV:	EXX			;/ RESTORE IP
	JNEXT
;
	DEFB	82H		;U*   16*16 unsigned multiply
	DM	'U*'		;994 T cycles average (8080)
	DEFW	CMOVE-8
USTAR:	DEFW	$+2
	POP	DE		;(DE)<--MPLIER
	POP	HL		;(HL)<--MPCAND
	PUSH	BC		;SAVE IP
	LD	B,H
	LD	A,L		;(BA)<--MPCAND
	CALL	MPYX		;(AHL)1<--MPCAND.LB*MPLIER
				;       1st PARTIAL PRODUCT
	PUSH	HL		;SAVE (HL)1
	LD	H,A
	LD	A,B
	LD	B,H		;SAVE (A)1
	CALL	MPYX		;(AHL)2<--MPCAND.HB*MPLIER
				;	2nd PARTIAL PRODUCT
	POP	DE		;(DE)<--(HL)1
	LD	C,D		;(BC)<--(AH)1
;	FORM SUM OF PARTIALS:
;				; (AHL)1
;				;+(AHL)2
;				;-------
;				; (AHLE)
	ADD	HL,BC		;(HL)<--(HL)2+(AH)1
	ADC	A,00H		;(AHLE)<--(BA)*(DE)
	LD	D,L
	LD	L,H
	LD	H,A		;(HLDE)<--MPLIER*MPCAND
	POP	BC		;RESTORE IP
	PUSH	DE		;(S2)<--PRODUCT.LW
	JHPUSH			;(S1)<--PRODUCT.HW
;
;	MULTIPLY PRIMITIVE
;		 (AHL)<--(A)*(DE)
;	#BITS:	  24	8   16
;
MPYX:	LD	HL,0		;(HL)<--0=PARTIAL PRODUCT.LW
	LD	C,08H		;LOOP COUNTER
MPYX1:	ADD	HL,HL		;LEFT SHIFT (AHL) 24 BITS
	RLA
	JR	NC,MPYX2	;IF NEXT MPLIER BIT = 1
	ADD	HL,DE		;THEN ADD MPCAND
	ADC	A,0
MPYX2:	DEC	C		;LAST MPLIER BIT?
	JR	NZ,MPYX1	;NO, LOOP AGN
	RET			;YES, DONE
;
	DEFB	82H		;U/
	DM	'U/'
	DEFW	USTAR-5
USLAS:	DEFW	$+2
	LD	HL,0004H
	ADD	HL,SP		;((HL))<--NUMERATOR.LW
	LD	E,(HL)		;(DE)<--NUMER.LW
	LD	(HL),C		;SAVE IP ON STACK
	INC	HL
	LD	D,(HL)
	LD	(HL),B
	POP	BC		;(BC)<--DENOMINATOR
	POP	HL		;(HL)<--NUMER.HW
	LD	A,L
	SUB	C
	LD	A,H
	SBC	A,B		;NUMER >= DENOM?
	JR	C,USLA1		;NO, GO AHEAD
	LD	HL,0FFFFH	;YES, OVERFLOW
	LD	D,H
	LD	E,L		;/ SET REM & QUOT TO MAX
	JP	USLA7
USLA1:	LD	A,10H		;LOOP COUNTER
USLA2:	ADD	HL,HL		;LEFT SHIFT (HLDE) THRU CARRY
	RLA			;ROT CARRY INTO ACCU BIT 0
	EX	DE,HL
	ADD	HL,HL
	JR	NC,USLA3
	INC	DE		;ADD CARRY
	AND	A		;RESET CARRY
USLA3:	EX	DE,HL		;SHIFT DONE
	RRA			;RESTORE 1st CARRY & COUNTER
	JR	NC,USLA4	;IF CARRY=1
	OR	A		;/ RESET CARRY
	SBC	HL,BC		;/ THEN (HL)<--(HL)-(BC)
	JP	USLA5
USLA4:	SBC	HL,BC		;/ (HL)<--PARTIAL REMAINDER
	JR	NC,USLA5
	ADD	HL,BC		;UNDERFLOW, RESTORE
	DEC	DE
USLA5:	INC	DE		;INC QUOT
	DEC	A		;COUNTER=0?
	JP	NZ,USLA2	;NO, LOOP AGN
USLA7:	POP	BC		;RESTORE IP
	PUSH	HL		;(S2)<--REMAINDER
	PUSH	DE		;(S1)<--QUOTIENT
	JNEXT
;
	DEFB	83H		;AND
	DM	'AND'
	DEFW	USLAS-5
ANDD:	DEFW	$+2		;(S1)<--(S1) AND (S2)
	POP	DE
	POP	HL
	LD	A,E
	AND	L
	LD	L,A
	LD	A,D
	AND	H
	LD	H,A
	JHPUSH
;
	DEFB	82H		;OR
	DM	'OR'
	DEFW	ANDD-6
ORR:	DEFW	$+2		;(S1)<--(S1) OR (S2)
	POP	DE
	POP	HL
	LD	A,E
	OR	L
	LD	L,A
	LD	A,D
	OR	H
	LD	H,A
	JHPUSH
;
	DEFB	83H		;XOR
	DM	'XOR'
	DEFW	ORR-5
XORR:	DEFW	$+2		;(S1)<--(S1) XOR (S2)
	POP	DE
	POP	HL
	LD	A,E
	XOR	L
	LD	L,A
	LD	A,D
	XOR	H
	LD	H,A
	JHPUSH
;
	DEFB	83H		;SP@
	DM	'SP@'
	DEFW	XORR-6
SPAT:	DEFW	$+2		;(S1)<--(SP)
	LD	HL,0
	ADD	HL,SP		;(HL)<--(SP)
	JHPUSH
;
	DEFB	83H		;SP!
	DM	'SP!'
	DEFW	SPAT-6
SPSTO:	DEFW	$+2		;(SP)<--(S0) (USER VARIABLE)
	LD	HL,(UP)		;(HL)<--USER VAR BASE ADDR
	LD	DE,0006H
	ADD	HL,DE		;(HL)<--S0
	LD	E,(HL)
	INC	HL
	LD	D,(HL)		;(DE)<--(S0)
	EX	DE,HL
	LD	SP,HL		;(SP)<--(S0)
	JNEXT
;
	DEFB	83H		;RP@
	DM	'RP@'
	DEFW	SPSTO-6
RPAT:	DEFW	$+2		;(S1)<--(RP)
	LD	HL,(RPP)
	JHPUSH
;
	DEFB	83H		;RP!
	DM	'RP!'
	DEFW	RPAT-6
RPSTO:	DEFW	$+2		;(RP)<--(R0) (USER VARIABLE)
	LD	HL,(UP)		;(HL)<--USER VAR BASE ADDR
	LD	DE,0008H
	ADD	HL,DE		;(HL)<--R0
	LD	E,(HL)
	INC	HL
	LD	D,(HL)		;(DE)<--(R0)
	LD	(RPP),DE	;/ (RP)<--(R0)
	JNEXT
;
	DEFB	82H		; ;S
	DM	';S'
	DEFW	RPSTO-6
SEMIS:	DEFW	$+2		;(IP)<--(R1)
	LD	HL,(RPP)
	LD	C,(HL)
	INC	HL
	LD	B,(HL)		;(BC)<--(R1)
	INC	HL
	LD	(RPP),HL	;(RP)<--(RP)+2
	JNEXT
;
	DEFB	85H		;LEAVE
	DM	'LEAVE'
	DEFW	SEMIS-5
LEAVE:	DEFW	$+2		;LIMIT<--INDEX
	LD	HL,(RPP)
	LD	E,(HL)
	INC	HL
	LD	D,(HL)		;(DE)<--(R1)=INDEX
	INC	HL
	LD	(HL),E
	INC	HL
	LD	(HL),D		;(R2)<--(DE)=LIMIT
	JNEXT
;
	DEFB	82H		;>R
	DM	'>R'
	DEFW	LEAVE-8
TOR:	DEFW	$+2
	POP	DE
	LD	HL,(RPP)
	DEC	HL
	LD	(HL),D		
	DEC	HL
	LD	(HL),E		;/ (R1)<--(DE)
	LD	(RPP),HL	;  (RP)<--(RP)-2
	JNEXT
;
	DEFB	82H		;R>
	DM	'R>'
	DEFW	TOR-5
FROMR:	DEFW	$+2
	LD	HL,(RPP)
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	INC	HL
	LD	(RPP),HL
	PUSH	DE		;(S1)<--(R1)
	JNEXT
;
	DEFB	81H		;R
	DM	'R'
	DEFW	FROMR-5
RR:	DEFW	IDO+2
;
	DEFB	82H		;0=
	DM	'0='
	DEFW	RR-4
ZEQU:	DEFW	$+2
	POP	HL
	LD	A,L
	OR	H
	LD	HL,0
	JR	NZ,ZEQU1
	INC	L		;(HL)<--TRUE
ZEQU1:	JHPUSH
;
	DEFB	82H		;0<
	DM	'0<'
	DEFW	ZEQU-5
ZLESS:	DEFW	$+2
	POP	AF		;/ (A)<--(S1)H
	RLA			;/ (CARRY)<--BIT 7
	LD	HL,0		;  (HL)<--FALSE
	JR	NC,ZLES1
	INC	L		;  (HL)<--TRUE
ZLES1:	JHPUSH
;
	DEFB	81H		;+
	DM	'+'
	DEFW	ZLESS-5
PLUS:	DEFW	$+2
	POP	DE
	POP	HL
	ADD	HL,DE
	JHPUSH
;
	DEFB	82H		;D+ ( d1L d1H d2L d2h -- d3L d3H)
	DM	'D+'
	DEFW	PLUS-4
DPLUS:	DEFW	$+2
	EXX			;/ SAVE IP
	POP	BC		;  (BC)<--d2H
	POP	HL		;  (HL)<--d2L
	POP	AF		;d (AF)<--d1H
	POP	DE		;  (DE)<--d1L
	PUSH	AF		;/ (S1)<--d1H
	ADD	HL,DE		;  (HL)<--d2L+d1L=d3L
	EX	DE,HL		;  (DE)<--d3L
	POP	HL		;  (HL)<--d1H
	ADC	HL,BC		;/ (HL)<--d1H+d2H+CARRY=d3H
	PUSH	DE		;  (S2)<--d3L
	PUSH	HL		;/ (S1)<--d3H
	EXX			;/ RESTORE IP
	JNEXT
;
	DEFB	85H		;MINUS
	DM	'MINUS'
	DEFW	DPLUS-5
MINUS:	DEFW	$+2
	POP	DE		;/
	XOR	A		;/ RESET CARRY, (A)<--0
	LD	H,A		;/
	LD	L,A		;/ LD HL,0
	SBC	HL,DE		;/ (HL)<--(DE)2's COMPL.
	JHPUSH
;
	DEFB	86H		;DMINUS
	DM	'DMINUS'
	DEFW	MINUS-8
DMINU:	DEFW	$+2
	POP	HL		;(HL)<--d1H
	POP	DE		;(DE)<--d1L
	SUB	A		;(A)<--0
	SUB	E
	LD	E,A		;(E)<--NEG(E)
	LD	A,00H
	SBC	A,D
	LD	D,A		;(D)<--NEG(D)
	LD	A,00H
	SBC	A,L
	LD	L,A		;(L)<--NEG(L)
	LD	A,00H
	SBC	A,H
	LD	H,A		;(H)<--NEG(H)
	JP	DPUSH		;(S2)<--d2L, (S1)<--d2H
;
	DEFB	84H		;OVER
	DM	'OVER'
	DEFW	DMINU-9
OVER:	DEFW	$+2
	POP	DE
	POP	HL
	PUSH	HL
	JP	DPUSH
;
	DEFB	84H		;DROP
	DM	'DROP'
	DEFW	OVER-7
DROP:	DEFW	$+2
	POP	HL
	JNEXT
;
	DEFB	84H		;SWAP
	DM	'SWAP'
	DEFW	DROP-7
SWAP:	DEFW	$+2
	POP	HL
	EX	(SP),HL
	JHPUSH
;
	DEFB	83H		;DUP
	DM	'DUP'
	DEFW	SWAP-7
DUP:	DEFW	$+2
	POP	HL
	PUSH	HL
	JHPUSH
;
	DEFB	84H		;2DUP
	DM	'2DUP'
	DEFW	DUP-6
TDUP:	DEFW	$+2
	POP	HL
	POP	DE
	PUSH	DE
	PUSH	HL
	JP	DPUSH
;
	DEFB	82H		;+!
	DM	'+!'
	DEFW	TDUP-7
PSTOR:	DEFW	$+2
	POP	HL		;(HL)<--VAR ADDR
	POP	DE		;(DE)<--NUMBER
	LD	A,(HL)
	ADD	A,E
	LD	(HL),A
	INC	HL
	LD	A,(HL)
	ADC	A,D
	LD	(HL),A		;((HL))<--((HL))+NUMBER
	JNEXT
;
	DEFB	86H		;TOGGLE
	DM	'TOGGLE'
	DEFW	PSTOR-5
TOGGL:	DEFW	$+2
	POP	DE		;(E)<--BIT PATTERN
	POP	HL		;(HL)<--ADDR
	LD	A,(HL)
	XOR	E
	LD	(HL),A
	JNEXT
;
	DEFB	81H		;@
	DM	'@'
	DEFW	TOGGL-9
AT:	DEFW	$+2
	POP	HL
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	PUSH	DE
	JNEXT
;
	DEFB	82H		;C@
	DM	'C@'
	DEFW	AT-4
CAT:	DEFW	$+2
	POP	HL
	LD	L,(HL)
	LD	H,0
	JHPUSH
;
	DEFB	82H		;2@
	DM	'2@'
	DEFW	CAT-5
TAT:	DEFW	$+2
	EXX			;/ SAVE IP
	POP	HL		;  (HL)<--ADDR
	LD	C,(HL)
	INC	HL
	LD	B,(HL)		;/ (BC)<--dH
	INC	HL
	LD	E,(HL)
	INC	HL
	LD	D,(HL)		;  (DE)<--dL
	PUSH	DE		;  (S2)<--dL
	PUSH	BC		;/ (S1)<--dH
	EXX			;/ RESTORE IP
	JNEXT
;
	DEFB	81H		;!
	DM	'!'
	DEFW	TAT-5
STORE:	DEFW	$+2
	POP	HL
	POP	DE
	LD	(HL),E
	INC	HL
	LD	(HL),D
	JNEXT
;
	DEFB	82H		;C!
	DM	'C!'
	DEFW	STORE-4
CSTOR:	DEFW	$+2
	POP	HL
	POP	DE
	LD	(HL),E
	JNEXT
;
	DEFB	82H		;2!
	DM	'2!'
	DEFW	CSTOR-5
TSTOR:	DEFW	$+2
	POP	HL
	POP	DE
	LD	(HL),E
	INC	HL
	LD	(HL),D
	INC	HL
	POP	DE
	LD	(HL),E
	INC	HL
	LD	(HL),D
	JNEXT
;
	DEFB	0C1H		; :
	DM	':'
	DEFW	TSTOR-5
COLON:	DEFW	DOCOL
	DEFW	QEXEC
	DEFW	SCSP
	DEFW	CURR
	DEFW	AT
	DEFW	CONT
	DEFW	STORE
	DEFW	CREAT
	DEFW	RBRAC
	DEFW	PSCOD
DOCOL:	LD	HL,(RPP)
	DEC	HL
	LD	(HL),B
	DEC	HL
	LD	(HL),C
	LD	(RPP),HL
	INC	DE
	LD	C,E
	LD	B,D
	JNEXT
;
	DEFB	0C1H		; ;
	DM	';'
	DEFW	COLON-4
SEMI:	DEFW	DOCOL
	DEFW	QCSP
	DEFW	COMP
	DEFW	SEMIS
	DEFW	SMUDG
	DEFW	LBRAC
	DEFW	SEMIS
;
	DEFB	84H		;NOOP
	DM	'NOOP'
	DEFW	SEMI-4
NOOP:	DEFW	DOCOL
	DEFW	SEMIS
;
	DEFB	88H		;CONSTANT
	DM	'CONSTANT'
	DEFW	NOOP-7
CON:	DEFW	DOCOL
	DEFW	CREAT
	DEFW	SMUDG
	DEFW	COMMA
	DEFW	PSCOD
DOCON:	INC	DE
	EX	DE,HL
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	PUSH	DE
	JNEXT
;
	DEFB	88H		;VARIABLE
	DM	'VARIABLE'
	DEFW	CON-0BH
VAR:	DEFW	DOCOL
	DEFW	CON
	DEFW	PSCOD
DOVAR:	INC	DE
	PUSH	DE
	JNEXT
;
	DEFB	84H		;USER
	DM	'USER'
	DEFW	VAR-0BH
USER:	DEFW	DOCOL
	DEFW	CON
	DEFW	PSCOD
DOUSE:	INC	DE
	EX	DE,HL
	LD	E,(HL)
	LD	D,00H
	LD	HL,(UP)
	ADD	HL,DE
	JHPUSH
;
	DEFB	81H		;0
	DM	'0'
	DEFW	USER-7
ZERO:	DEFW	$+2		;/
	LD	HL,0		;/
	JHPUSH			;/
;
	DEFB	81H		;1
	DM	'1'
	DEFW	ZERO-4
ONE:	DEFW	$+2		;/
	LD	HL,1		;/
	JHPUSH			;/
;
	DEFB	81H		;2
	DM	'2'
	DEFW	ONE-4
TWO:	DEFW	$+2		;/
	LD	HL,2		;/
	JHPUSH			;/
;
	DEFB	81H		;3
	DM	'3'
	DEFW	TWO-4
THREE:	DEFW	$+2		;/
	LD	HL,3		;/
	JHPUSH			;/
;
	DEFB	82H		;BL
	DM	'BL'
	DEFW	THREE-4
BL:	DEFW	DOCON
	DEFW	20H
;
	DEFB	83H		;C/L
	DM	'C/L'
	DEFW	BL-5
CSLL:	DEFW	DOCON
	DEFW	64
;
	DEFB	85H		;FIRST
	DM	'FIRST'
	DEFW	CSLL-6
FIRST:	DEFW	DOCON
	DEFW	0		;/ set by CLD
;
	DEFB	85H		;LIMIT
	DM	'LIMIT'
	DEFW	FIRST-8
LIMIT:	DEFW	DOCON
	DEFW	0		;/ set by CLD
;
	DEFB	85H		;B/BUF
	DM	'B/BUF'
	DEFW	LIMIT-8
BBUF:	DEFW	DOCON
	DEFW	KBBUF
;
	DEFB	85H		;B/SCR
	DM	'B/SCR'
	DEFW	BBUF-8
BSCR:	DEFW	DOCON
	DEFW	400H/KBBUF
;
	DEFB	87H		;+ORIGIN
	DM	'+ORIGIN'
	DEFW	BSCR-8
PORIG:	DEFW	DOCOL
	DEFW	LIT
	DEFW	ORIG
	DEFW	PLUS
	DEFW	SEMIS
;
;	USER VARIABLES
;
	DEFB	82H		;S0
	DM	'S0'
	DEFW	PORIG-0AH
SZERO:	DEFW	DOUSE
	DEFW	6
;
	DEFB	82H		;R0
	DM	'R0'
	DEFW	SZERO-5
RZERO:	DEFW	DOUSE
	DEFW	8
;
	DEFB	83H		;TIB
	DM	'TIB'
	DEFW	RZERO-5
TIB:	DEFW	DOUSE
	DEFB	0AH
;
	DEFB	85H		;WIDTH
	DM	'WIDTH'
	DEFW	TIB-6
WIDTH:	DEFW	DOUSE
	DEFB	0CH
;
	DEFB	87H		;WARNING
	DM	'WARNING'
	DEFW	WIDTH-8
WARN:	DEFW	DOUSE
	DEFB	0EH
;
	DEFB	85H		;FENCE
	DM	'FENCE'
	DEFW	WARN-0AH
FENCE:	DEFW	DOUSE
	DEFB	10H
;
	DEFB	82H		;DP
	DM	'DP'
	DEFW	FENCE-8
DP:	DEFW	DOUSE
	DEFB	12H
;
	DEFB	88H		;VOC-LINK
	DM	'VOC-LINK'
	DEFW	DP-5
VOCL:	DEFW	DOUSE
	DEFW	14H
;
	DEFB	83H		;BLK
	DM	'BLK'
	DEFW	VOCL-0BH
BLK:	DEFW	DOUSE
	DEFB	16H
;
	DEFB	82H		;IN
	DM	'IN'
	DEFW	BLK-6
INN:	DEFW	DOUSE
	DEFB	18H
;
	DEFB	83H		;OUT
	DM	'OUT'
	DEFW	INN-5
OUTT:	DEFW	DOUSE
	DEFB	1AH
;
	DEFB	83H		;SCR
	DM	'SCR'
	DEFW	OUTT-6
SCR:	DEFW	DOUSE
	DEFB	1CH
;
	DEFB	86H		;OFFSET
	DM	'OFFSET'
	DEFW	SCR-6
OFSET:	DEFW	DOUSE
	DEFB	1EH
;
	DEFB	87H		;CONTEXT
	DM	'CONTEXT'
	DEFW	OFSET-9
CONT:	DEFW	DOUSE
	DEFB	20H
;
	DEFB	87H		;CURRENT
	DM	'CURRENT'
	DEFW	CONT-0AH
CURR:	DEFW	DOUSE
	DEFB	22H
;
	DEFB	85H		;STATE
	DM	'STATE'
	DEFW	CURR-0AH
STATE:	DEFW	DOUSE
	DEFB	24H
;
	DEFB	84H		;BASE
	DM	'BASE'
	DEFW	STATE-8
BASE:	DEFW	DOUSE
	DEFB	26H
;
	DEFB	83H		;DPL
	DM	'DPL'
	DEFW	BASE-7
DPL:	DEFW	DOUSE
	DEFB	28H
;
	DEFB	83H		;FLD
	DM	'FLD'
	DEFW	DPL-6
FLD:	DEFW	DOUSE
	DEFB	2AH
;
	DEFB	83H		;CSP
	DM	'CSP'
	DEFW	FLD-6
CSPP:	DEFW	DOUSE
	DEFB	2CH
;
	DEFB	82H		;R#
	DM	'R#'
	DEFW	CSPP-6
RNUM:	DEFW	DOUSE
	DEFB	2EH
;
	DEFB	83H		;HLD
	DM	'HLD'
	DEFW	RNUM-5
HLD:	DEFW	DOUSE
	DEFW	30H
;
;	END OF USER VARIABLES
;
	DEFB	82H		;1+
	DM	'1+'
	DEFW	HLD-6
ONEP:	DEFW	$+2		;/
	POP	HL		;/
	INC	HL		;/
	JHPUSH			;/
;
	DEFB	82H		;2+
	DM	'2+'
	DEFW	ONEP-5
TWOP:	DEFW	$+2		;/
	POP	HL		;/
	INC	HL		;/
	INC	HL		;/
	JHPUSH			;/
;
	DEFB	82H		;/ 1-
	DM	'1-'		;/
	DEFW	TWOP-5		;/
ONEMIN:	DEFW	$+2		;/
	POP	HL		;/
	DEC	HL		;/
	JHPUSH			;/
;
	DEFB	82H		;/ 2-
	DM	'2-'		;/
	DEFW	ONEMIN-5	;/
TWOMIN:	DEFW	$+2		;/
	POP	HL		;/
	DEC	HL		;/
	DEC	HL		;/
	JHPUSH			;/
;
	DEFB	82H		;/ 2*
	DM	'2*'		;/
	DEFW	TWOMIN-5	;/
TWOSTA:	DEFW	$+2		;/
	POP	HL		;/
	ADD	HL,HL		;/ ASL HL
	JHPUSH			;/
;
	DEFB	82H		;/ 2/
	DM	'2/'		;/
	DEFW	TWOSTA-5	;/
TWOSLA:	DEFW	$+2		;/
	POP	HL		;/
	BIT	7,H		;/
	JR	Z,TWOSL1	;/
	INC	HL		;/
TWOSL1:	SRA	H		;/
	RR	L		;/ ASR HL
	JHPUSH			;/
;
	DEFB	84H		;HERE
	DM	'HERE'
	DEFW	TWOSLA-5
HERE:	DEFW	DOCOL
	DEFW	DP
	DEFW	AT
	DEFW	SEMIS
;
	DEFB	85H		;ALLOT
	DM	'ALLOT'
	DEFW	HERE-7
ALLOT:	DEFW	DOCOL
	DEFW	DP
	DEFW	PSTOR
	DEFW	SEMIS
;
	DEFB	81H		; ,
	DM	','
	DEFW	ALLOT-8
COMMA:	DEFW	DOCOL
	DEFW	HERE
	DEFW	STORE
	DEFW	TWO
	DEFW	ALLOT
	DEFW	SEMIS
;
	DEFB	82H		;C,
	DM	'C,'
	DEFW	COMMA-4
CCOMM:	DEFW	DOCOL
	DEFW	HERE
	DEFW	CSTOR
	DEFW	ONE
	DEFW	ALLOT
	DEFW	SEMIS
;
	DEFB	81H		;-
	DM	'-'
	DEFW	CCOMM-5
SUBB:	DEFW	$+2
	POP	DE
	POP	HL
	OR	A		;/ RESET CARRY
	SBC	HL,DE		;/
	JHPUSH
;
	DEFB	81H		;=
	DM	'='
	DEFW	SUBB-4
EQUAL:	DEFW	$+2		;/
	POP	DE		;/
	POP	HL		;/
	XOR	A		;/ RESET CARRY
	SBC	HL,DE		;/
	LD	H,A		;/
	LD	L,A		;/ LD HL,0000H
	JR	NZ,EXEQU	;/ FALSE
	INC	L		;/ TRUE
EXEQU:	JHPUSH			;/
;
	DEFB	81H		;  <
	DM	'<'
	DEFW	EQUAL-4
LESS:	DEFW	$+2
	POP	DE
	POP	HL		;  (HL) (DE) <
	LD	A,D
	XOR	H		;  ONE OF THEM NEGATIVE?
	JP	M,LES1		;  YES, DETERMINE WHICH
	OR	A		;/ CLR CARRY
	SBC	HL,DE		;/
LES1:	BIT	7,H		;/ (H) NEGATIVE?
	LD	HL,0
	JR	Z,EXLESS	;/ NO, FALSE
	INC	L		;/ TRUE
EXLESS:	JHPUSH
;
	DEFB	82H		;U<
	DM	'U<'
	DEFW	LESS-4
ULESS:	DEFW	$+2		;/
	POP	DE
	POP	HL		;/ (HL) (DE) U<
	XOR	A		;/
	SBC	HL,DE		;/
	LD	H,A		;/
	LD	L,A		;/ LD HL,0000H
	JR	NC,EXULES	;/ FALSE
	INC	L		;/ TRUE
EXULES:	JHPUSH
;
	DEFB	81H		;>
	DM	'>'
	DEFW	ULESS-5
GREAT:	DEFW	$+2
	POP	HL		;/
	POP	DE		;/ (HL) (DE) > = (DE) (HL) <
	LD	A,D
	XOR	H		;  ONE OF THEM NEGATIVE?
	JP	M,GREAT1	;  YES, DETERMINE WHICH
	OR	A		;/ CLR CARRY
	SBC	HL,DE		;/
GREAT1:	BIT	7,H		;/ (H) NEGATIVE?
	LD	HL,0		;  (HL)<--FALSE
	JR	Z,GREAT2	;/ NO, FALSE
	INC	L		;/ (HL)<--TRUE
GREAT2:	JHPUSH
;
	DEFB	83H		;ROT
	DM	'ROT'
	DEFW	GREAT-4
ROT:	DEFW	$+2
	POP	DE
	POP	HL
	EX	(SP),HL
	JP	DPUSH
;
	DEFB	85H		;SPACE
	DM	'SPACE'
	DEFW	ROT-6
SPACE:	DEFW	DOCOL
	DEFW	BL
	DEFW	EMIT
	DEFW	SEMIS
;
	DEFB	84H		;-DUP
	DM	'-DUP'
	DEFW	SPACE-8
DDUP:	DEFW	$+2		;/
	POP	HL		;/
	LD	A,H		;/
	OR	L		;/ (HL)=0?
	JR	Z,EXDDUP	;/ YES, DON'T DUP
	PUSH	HL		;/
EXDDUP:	JHPUSH
;
	DEFB	88H		;TRAVERSE
	DM	'TRAVERSE'
	DEFW	DDUP-7
TRAV:	DEFW	DOCOL
	DEFW	SWAP
TRAV1:	DEFW	OVER		;BEGIN
	DEFW	PLUS
	DEFW	LIT
	DEFW	7FH
	DEFW	OVER
	DEFW	CAT
	DEFW	LESS
	DEFW	ZBRAN		;UNTIL
	DEFW	TRAV1-$
	DEFW	SWAP
	DEFW	DROP
	DEFW	SEMIS
;
	DEFB	86H		;LATEST
	DM	'LATEST'
	DEFW	TRAV-0BH
LATES:	DEFW	DOCOL
	DEFW	CURR
	DEFW	AT
	DEFW	AT
	DEFW	SEMIS
;
	DEFB	83H		;LFA
	DM	'LFA'
	DEFW	LATES-9
LFA:	DEFW	$+2		;/
	POP	HL		;/ (HL)<--PFA
	DEC	HL		;/
	DEC	HL		;/
	DEC	HL		;/
	DEC	HL		;/ (HL)<--(HL)-4 = LFA
	JHPUSH			;/
;
	DEFB	83H		;CFA
	DM	'CFA'
	DEFW	LFA-6
CFA:	DEFW	DOCOL
	DEFW	TWOMIN		;/
	DEFW	SEMIS
;
	DEFB	83H		;NFA
	DM	'NFA'
	DEFW	CFA-6
NFA:	DEFW	DOCOL
	DEFW	LIT
	DEFW	5
	DEFW	SUBB
	DEFW	LIT
	DEFW	-1
	DEFW	TRAV
	DEFW	SEMIS
;
	DEFB	83H		;PFA
	DM	'PFA'
	DEFW	NFA-6
PFA:	DEFW	DOCOL
	DEFW	ONE
	DEFW	TRAV
	DEFW	LIT
	DEFW	5
	DEFW	PLUS
	DEFW	SEMIS
;
	DEFB	84H		;!CSP
	DM	'!CSP'
	DEFW	PFA-6
SCSP:	DEFW	DOCOL
	DEFW	SPAT
	DEFW	CSPP
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	86H		;?ERROR
	DM	'?ERROR'
	DEFW	SCSP-7
QERR:	DEFW	DOCOL
	DEFW	SWAP
	DEFW	ZBRAN		;IF
	DEFW	QERR1-$
	DEFW	ERROR
	DEFW	BRAN		;ELSE
	DEFW	QERR2-$
QERR1:	DEFW	DROP		;ENDIF
QERR2:	DEFW	SEMIS
;
	DEFB	85H		;?COMP
	DM	'?COMP'
	DEFW	QERR-9
QCOMP:	DEFW	DOCOL
	DEFW	STATE
	DEFW	AT
	DEFW	ZEQU
	DEFW	LIT
	DEFW	11H
	DEFW	QERR
	DEFW	SEMIS
;
	DEFB	85H		;?EXEC
	DM	'?EXEC'
	DEFW	QCOMP-8
QEXEC:	DEFW	DOCOL
	DEFW	STATE
	DEFW	AT
	DEFW	LIT
	DEFW	12H
	DEFW	QERR
	DEFW	SEMIS
;
	DEFB	86H		;?PAIRS
	DM	'?PAIRS'
	DEFW	QEXEC-8
QPAIR:	DEFW	DOCOL
	DEFW	SUBB
	DEFW	LIT
	DEFW	13H
	DEFW	QERR
	DEFW	SEMIS
;
	DEFB	84H		;?CSP
	DM	'?CSP'
	DEFW	QPAIR-9
QCSP:	DEFW	DOCOL
	DEFW	SPAT
	DEFW	CSPP
	DEFW	AT
	DEFW	SUBB
	DEFW	LIT
	DEFW	14H
	DEFW	QERR
	DEFW	SEMIS
;
	DEFB	88H		;?LOADING
	DM	'?LOADING'
	DEFW	QCSP-7
QLOAD:	DEFW	DOCOL
	DEFW	BLK
	DEFW	AT
	DEFW	ZEQU
	DEFW	LIT
	DEFW	16H
	DEFW	QERR
	DEFW	SEMIS
;
	DEFB	87H		;COMPILE
	DM	'COMPILE'
	DEFW	QLOAD-0BH
COMP:	DEFW	DOCOL
	DEFW	QCOMP
	DEFW	FROMR
	DEFW	DUP
	DEFW	TWOP
	DEFW	TOR
	DEFW	AT
	DEFW	COMMA
	DEFW	SEMIS
;
	DEFB	0C1H		;[
	DM	'['
	DEFW	COMP-0AH
LBRAC:	DEFW	DOCOL
	DEFW	ZERO
	DEFW	STATE
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	81H		;]
	DM	']'
	DEFW	LBRAC-4
RBRAC:	DEFW	DOCOL
	DEFW	LIT,0C0H
	DEFW	STATE,STORE
	DEFW	SEMIS
;
	DEFB	86H		;SMUDGE
	DM	'SMUDGE'
	DEFW	RBRAC-4
SMUDG:	DEFW	DOCOL
	DEFW	LATES
	DEFW	LIT
	DEFW	20H
	DEFW	TOGGL
	DEFW	SEMIS
;
	DEFB	83H		;HEX
	DM	'HEX'
	DEFW	SMUDG-9
HEX:	DEFW	DOCOL
	DEFW	LIT
	DEFW	10H
	DEFW	BASE
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	87H		;DECIMAL
	DM	'DECIMAL'
	DEFW	HEX-6
DEC:	DEFW	DOCOL
	DEFW	LIT
	DEFW	0AH
	DEFW	BASE
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	87H		;(;CODE)
	DM	'(;CODE)'
	DEFW	DEC-0AH
PSCOD:	DEFW	DOCOL
	DEFW	FROMR
	DEFW	LATES
	DEFW	PFA
	DEFW	CFA
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	0C5H		; ;CODE
	DM	';CODE'
	DEFW	PSCOD-0AH
SEMIC:	DEFW	DOCOL
	DEFW	QCSP
	DEFW	COMP
	DEFW	PSCOD
	DEFW	LBRAC
SEMI1:	DEFW	NOOP		;ASSEMBLER
	DEFW	SEMIS
;
	DEFB	87H		;<BUILDS
	DM	'<BUILDS'
	DEFW	SEMIC-8
BUILD:	DEFW	DOCOL
	DEFW	ZERO
	DEFW	CON
	DEFW	SEMIS
;
	DEFB	85H		;DOES>
	DM	'DOES>'
	DEFW	BUILD-0AH
DOES:	DEFW	DOCOL
	DEFW	FROMR
	DEFW	LATES
	DEFW	PFA
	DEFW	STORE
	DEFW	PSCOD
DODOE:	LD	HL,(RPP)
	DEC	HL
	LD	(HL),B
	DEC	HL
	LD	(HL),C
	LD	(RPP),HL
	INC	DE
	EX	DE,HL
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	INC	HL
	JHPUSH
;
	DEFB	85H		;COUNT
	DM	'COUNT'
	DEFW	DOES-8
COUNT:	DEFW	DOCOL
	DEFW	DUP
	DEFW	ONEP
	DEFW	SWAP
	DEFW	CAT
	DEFW	SEMIS
;
	DEFB	84H		;TYPE
	DM	'TYPE'
	DEFW	COUNT-8
TYPE:	DEFW	DOCOL
	DEFW	DDUP
	DEFW	ZBRAN		;IF
	DEFW	TYPE1-$
	DEFW	OVER
	DEFW	PLUS
	DEFW	SWAP
	DEFW	XDO		;DO
TYPE2:	DEFW	IDO
	DEFW	CAT
	DEFW	EMIT
	DEFW	XLOOP		;LOOP
	DEFW	TYPE2-$
	DEFW	BRAN		;ELSE
	DEFW	TYPE3-$
TYPE1:	DEFW	DROP		;ENDIF
TYPE3:	DEFW	SEMIS
;
	DEFB	89H		;-TRAILING
	DM	'-TRAILING'
	DEFW	TYPE-7
DTRAI:	DEFW	DOCOL
	DEFW	DUP
	DEFW	ZERO
	DEFW	XDO		;DO
DTRA1:	DEFW	TDUP		;/
	DEFW	PLUS
	DEFW	ONEMIN		;/
	DEFW	CAT
	DEFW	BL
	DEFW	SUBB
	DEFW	ZBRAN		;IF
	DEFW	DTRA2-$
	DEFW	LEAVE
	DEFW	BRAN		;ELSE
	DEFW	DTRA3-$
DTRA2:	DEFW	ONEMIN		;/
DTRA3:	DEFW	XLOOP		;LOOP
	DEFW	DTRA1-$
	DEFW	SEMIS
;
	DEFB	84H		;(.")
	DM	'(.")'
	DEFW	DTRAI-0CH
PDOTQ:	DEFW	DOCOL
	DEFW	RR
	DEFW	COUNT
	DEFW	DUP
	DEFW	ONEP
	DEFW	FROMR
	DEFW	PLUS
	DEFW	TOR
	DEFW	TYPE
	DEFW	SEMIS
;
	DEFB	0C2H		;."
	DM	'."'
	DEFW	PDOTQ-7
DOTQ:	DEFW	DOCOL
	DEFW	LIT
	DEFW	22H
	DEFW	STATE
	DEFW	AT
	DEFW	ZBRAN		;IF
	DEFW	DOTQ1-$
	DEFW	COMP
	DEFW	PDOTQ
	DEFW	WORD
	DEFW	HERE
	DEFW	CAT
	DEFW	ONEP
	DEFW	ALLOT
	DEFW	BRAN		;ELSE
	DEFW	DOTQ2-$
DOTQ1:	DEFW	WORD
	DEFW	HERE
	DEFW	COUNT
	DEFW	TYPE		;ENDIF
DOTQ2:	DEFW	SEMIS
;
	DEFB	86H		;EXPECT
	DM	'EXPECT'
	DEFW	DOTQ-5
EXPEC:	DEFW	DOCOL
	DEFW	OVER
	DEFW	PLUS
	DEFW	OVER
	DEFW	XDO		;DO
EXPE1:	DEFW	KEY
	DEFW	DUP
	DEFW	LIT
	DEFW	0EH
	DEFW	PORIG
	DEFW	AT
	DEFW	EQUAL
	DEFW	ZBRAN		;IF
	DEFW	EXPE2-$
	DEFW	DROP
	DEFW	DUP
	DEFW	IDO
	DEFW	EQUAL
	DEFW	DUP
	DEFW	FROMR
	DEFW	TWOMIN		;/
	DEFW	PLUS
	DEFW	TOR
	DEFW	ZBRAN		;IF
	DEFW	EXPE6-$
	DEFW	LIT
	DEFW	BELL
	DEFW	BRAN		;ELSE
	DEFW	EXPE7-$
EXPE6:	DEFW	LIT
	DEFW	BSOUT		;ENDIF
EXPE7:	DEFW	BRAN		;ELSE
	DEFW	EXPE3-$
EXPE2:	DEFW	DUP
	DEFW	LIT
	DEFW	ACR		;/
	DEFW	EQUAL
	DEFW	ZBRAN		;IF
	DEFW	EXPE4-$
	DEFW	LEAVE
	DEFW	DROP
	DEFW	BL
	DEFW	ZERO
	DEFW	BRAN		;ELSE
	DEFW	EXPE5-$
EXPE4:	DEFW	DUP		;ENDIF
EXPE5:	DEFW	IDO
	DEFW	CSTOR
	DEFW	ZERO
	DEFW	IDO
	DEFW	ONEP
	DEFW	STORE		;ENDIF
EXPE3:	DEFW	EMIT
	DEFW	XLOOP		;LOOP
	DEFW	EXPE1-$
	DEFW	DROP
	DEFW	SEMIS
;
	DEFB	85H		;QUERY
	DM	'QUERY'
	DEFW	EXPEC-9
QUERY:	DEFW	DOCOL
	DEFW	TIB
	DEFW	AT
	DEFW	LIT
	DEFW	50H
	DEFW	EXPEC
	DEFW	ZERO
	DEFW	INN
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	0C1H		;NULL
	DEFB	80H
	DEFW	QUERY-8
NULL:	DEFW	DOCOL
	DEFW	BLK
	DEFW	AT
	DEFW	ZBRAN		;IF
	DEFW	NULL1-$
	DEFW	ONE
	DEFW	BLK
	DEFW	PSTOR
	DEFW	ZERO
	DEFW	INN
	DEFW	STORE
	DEFW	BLK
	DEFW	AT
	DEFW	BSCR
	DEFW	ONEMIN		;/
	DEFW	ANDD
	DEFW	ZEQU
	DEFW	ZBRAN		;IF
	DEFW	NULL2-$
	DEFW	QEXEC
	DEFW	FROMR
	DEFW	DROP		;ENDIF
NULL2:	DEFW	BRAN		;ELSE
	DEFW	NULL3-$
NULL1:	DEFW	FROMR
	DEFW	DROP		;ENDIF
NULL3:	DEFW	SEMIS
;
	DEFB	84H		;FILL
	DM	'FILL'
	DEFW	NULL-4
FILL:	DEFW	$+2
	EXX			;/ SAVE IP
	POP	DE		;/ (E)<--BYTE
	POP	BC		;  (BC)<--QUANTITY
	POP	HL		;/ (HL)<--ADDR
FILL1:	LD	A,B
	OR	C		;  QTY=0?
	JR	Z,FILL2		;  YES
	LD	(HL),E		;/ ((HL))<--BYTE
	INC	HL		;  INC POINTER
	DEC	BC		;  DEC COUNTER
	JP	FILL1		;/
FILL2:	EXX			;/ RESTORE IP
	JNEXT
;
	DEFB	85H		;ERASE
	DM	'ERASE'
	DEFW	FILL-7
ERASEE:	DEFW	DOCOL
	DEFW	ZERO
	DEFW	FILL
	DEFW	SEMIS
;
	DEFB	86H		;BLANKS
	DM	'BLANKS'
	DEFW	ERASEE-8
BLANK:	DEFW	DOCOL
	DEFW	BL
	DEFW	FILL
	DEFW	SEMIS
;
	DEFB	84H		;HOLD
	DM	'HOLD'
	DEFW	BLANK-9
HOLD:	DEFW	DOCOL
	DEFW	LIT
	DEFW	-1
	DEFW	HLD
	DEFW	PSTOR
	DEFW	HLD
	DEFW	AT
	DEFW	CSTOR
	DEFW	SEMIS
;
	DEFB	83H		;PAD
	DM	'PAD'
	DEFW	HOLD-7
PAD:	DEFW	DOCOL
	DEFW	HERE
	DEFW	LIT
	DEFW	44H
	DEFW	PLUS
	DEFW	SEMIS
;
	DEFB	84H		;WORD
	DM	'WORD'
	DEFW	PAD-6
WORD:	DEFW	DOCOL
	DEFW	BLK
	DEFW	AT
	DEFW	ZBRAN		;IF
	DEFW	WORD1-$
	DEFW	BLK
	DEFW	AT
	DEFW	BLOCK
	DEFW	BRAN		;ELSE
	DEFW	WORD2-$
WORD1:	DEFW	TIB
	DEFW	AT		;ENDIF
WORD2:	DEFW	INN
	DEFW	AT
	DEFW	PLUS
	DEFW	SWAP
	DEFW	ENCL
	DEFW	HERE
	DEFW	LIT
	DEFW	22H
	DEFW	BLANK
	DEFW	INN
	DEFW	PSTOR
	DEFW	OVER
	DEFW	SUBB
	DEFW	TOR
	DEFW	RR
	DEFW	HERE
	DEFW	CSTOR
	DEFW	PLUS
	DEFW	HERE
	DEFW	ONEP
	DEFW	FROMR
	DEFW	CMOVE
	DEFW	SEMIS
;
	DEFB	88H		;(NUMBER)
	DM	'(NUMBER)'
	DEFW	WORD-7
PNUMB:	DEFW	DOCOL
PNUM1:	DEFW	ONEP		;BEGIN
	DEFW	DUP
	DEFW	TOR
	DEFW	CAT
	DEFW	BASE
	DEFW	AT
	DEFW	DIGIT
	DEFW	ZBRAN		;WHILE
	DEFW	PNUM2-$
	DEFW	SWAP
	DEFW	BASE
	DEFW	AT
	DEFW	USTAR
	DEFW	DROP
	DEFW	ROT
	DEFW	BASE
	DEFW	AT
	DEFW	USTAR
	DEFW	DPLUS
	DEFW	DPL
	DEFW	AT
	DEFW	ONEP
	DEFW	ZBRAN		;IF
	DEFW	PNUM3-$
	DEFW	ONE
	DEFW	DPL
	DEFW	PSTOR		;ENDIF
PNUM3:	DEFW	FROMR
	DEFW	BRAN		;REPEAT
	DEFW	PNUM1-$
PNUM2:	DEFW	FROMR
	DEFW	SEMIS
;
	DEFB	86H		;NUMBER
	DM	'NUMBER'
	DEFW	PNUMB-0BH
NUMB:	DEFW	DOCOL
	DEFW	ZERO
	DEFW	ZERO
	DEFW	ROT
	DEFW	DUP
	DEFW	ONEP
	DEFW	CAT
	DEFW	LIT
	DEFW	2DH
	DEFW	EQUAL
	DEFW	DUP
	DEFW	TOR
	DEFW	PLUS
	DEFW	LIT
	DEFW	-1
NUMB1:	DEFW	DPL		;BEGIN
	DEFW	STORE
	DEFW	PNUMB
	DEFW	DUP
	DEFW	CAT
	DEFW	BL
	DEFW	SUBB
	DEFW	ZBRAN		;WHILE
	DEFW	NUMB2-$
	DEFW	DUP
	DEFW	CAT
	DEFW	LIT
	DEFW	2EH
	DEFW	SUBB
	DEFW	ZERO
	DEFW	QERR
	DEFW	ZERO
	DEFW	BRAN		;REPEAT
	DEFW	NUMB1-$
NUMB2:	DEFW	DROP
	DEFW	FROMR
	DEFW	ZBRAN		;IF
	DEFW	NUMB3-$
	DEFW	DMINU		;ENDIF
NUMB3:	DEFW	SEMIS
;
	DEFB	85H		;-FIND (0-3) SUCCESS
	DM	'-FIND'		;      (0-1) FAILURE
	DEFW	NUMB-9
DFIND:	DEFW	DOCOL
	DEFW	BL
	DEFW	WORD
	DEFW	HERE
	DEFW	CONT
	DEFW	AT
	DEFW	AT
	DEFW	PFIND
	DEFW	DUP
	DEFW	ZEQU
	DEFW	ZBRAN		;IF
	DEFW	DFIN1-$
	DEFW	DROP
	DEFW	HERE
	DEFW	LATES
	DEFW	PFIND		;ENDIF
DFIN1:	DEFW	SEMIS
;
	DEFB	87H		;(ABORT)
	DM	'(ABORT)'
	DEFW	DFIND-8
PABOR:	DEFW	DOCOL
	DEFW	ABORT
	DEFW	SEMIS
;
	DEFB	85H		;ERROR
	DM	'ERROR'
	DEFW	PABOR-0AH
ERROR:	DEFW	DOCOL
	DEFW	WARN
	DEFW	AT
	DEFW	ZLESS
	DEFW	ZBRAN		;IF
	DEFW	ERRO1-$
	DEFW	PABOR		;ENDIF
ERRO1:	DEFW	HERE
	DEFW	COUNT
	DEFW	TYPE
	DEFW	PDOTQ
	DEFB	2
	DB	'? '
	DEFW	MESS
	DEFW	SPSTO
;	CHANGE FROM fig MODEL
;	DEFW	INN,AT,BLK,AT
	DEFW	BLK,AT
	DEFW	DDUP
	DEFW	ZBRAN,ERRO2-$	;IF
	DEFW	INN,AT
	DEFW	SWAP		;ENDIF
ERRO2:	DEFW	QUIT
;
	DEFB	83H		;ID.
	DM	'ID.'
	DEFW	ERROR-8
IDDOT:	DEFW	DOCOL
	DEFW	PAD
	DEFW	LIT
	DEFW	20H
	DEFW	BLANK		;/
	DEFW	DUP
	DEFW	PFA
	DEFW	LFA
	DEFW	OVER
	DEFW	SUBB
	DEFW	DUP		;/ change frm MODEL
	DEFW	TOR		;/ to suppress BIT 7
	DEFW	PAD
	DEFW	SWAP
	DEFW	CMOVE
	DEFW	PAD
	DEFW	FROMR		;/ for terminals
	DEFW	PAD		;/ with an 8 bit
	DEFW	PLUS		;/ ASCCI character set.
	DEFW	ONEMIN		;/
	DEFW	DUP		;/
	DEFW	AT		;/
	DEFW	LIT		;/
	DEFW	7FH		;/
	DEFW	ANDD		;/
	DEFW	SWAP		;/
	DEFW	STORE		;/
	DEFW	COUNT
	DEFW	LIT
	DEFW	1FH		;  WIDTH
	DEFW	ANDD
	DEFW	TYPE
	DEFW	SPACE
	DEFW	SEMIS
;
	DEFB	86H		;CREATE
	DM	'CREATE'
	DEFW	IDDOT-6
CREAT:	DEFW	DOCOL
	DEFW	DFIND
	DEFW	ZBRAN		;IF
	DEFW	CREA1-$
	DEFW	DROP
	DEFW	NFA
	DEFW	IDDOT
	DEFW	LIT
	DEFW	4
	DEFW	MESS
	DEFW	SPACE		;ENDIF
CREA1:	DEFW	HERE
	DEFW	DUP
	DEFW	CAT
	DEFW	WIDTH
	DEFW	AT
	DEFW	MIN
	DEFW	ONEP
	DEFW	ALLOT
	DEFW	DUP
	DEFW	LIT
	DEFW	0A0H
	DEFW	TOGGL
	DEFW	HERE
	DEFW	ONEMIN
	DEFW	LIT
	DEFW	80H
	DEFW	TOGGL
	DEFW	LATES
	DEFW	COMMA
	DEFW	CURR
	DEFW	AT
	DEFW	STORE
	DEFW	HERE
	DEFW	TWOP
	DEFW	COMMA
	DEFW	SEMIS
;
	DEFB	0C9H		;[COMPILE]
	DM	'[COMPILE]'
	DEFW	CREAT-9
BCOMP:	DEFW	DOCOL
	DEFW	DFIND
	DEFW	ZEQU
	DEFW	ZERO
	DEFW	QERR
	DEFW	DROP
	DEFW	CFA
	DEFW	COMMA
	DEFW	SEMIS
;
	DEFB	0C7H		;LITERAL
	DM	'LITERAL'
	DEFW	BCOMP-0CH
LITER:	DEFW	DOCOL
	DEFW	STATE
	DEFW	AT
	DEFW	ZBRAN		;IF
	DEFW	LITE1-$
	DEFW	COMP
	DEFW	LIT
	DEFW	COMMA		;ENDIF
LITE1:	DEFW	SEMIS
;
	DEFB	0C8H		;DLITERAL
	DM	'DLITERAL'
	DEFW	LITER-0AH
DLITE:	DEFW	DOCOL
	DEFW	STATE
	DEFW	AT
	DEFW	ZBRAN		;IF
	DEFW	DLIT1-$
	DEFW	SWAP
	DEFW	LITER
	DEFW	LITER		;ENDIF
DLIT1:	DEFW	SEMIS
;
	DEFB	86H		;?STACK
	DM	'?STACK'
	DEFW	DLITE-0BH
QSTAC:	DEFW	DOCOL
	DEFW	SPAT
	DEFW	SZERO
	DEFW	AT
	DEFW	SWAP
	DEFW	ULESS
	DEFW	ONE
	DEFW	QERR
	DEFW	SPAT
	DEFW	HERE
	DEFW	LIT
	DEFW	80H
	DEFW	PLUS
	DEFW	ULESS
	DEFW	LIT
	DEFW	7
	DEFW	QERR
	DEFW	SEMIS
;
	DEFB	89H		;INTERPRET
	DM	'INTERPRET'
	DEFW	QSTAC-9
INTER:	DEFW	DOCOL
INTE1:	DEFW	DFIND		;BEGIN
	DEFW	ZBRAN		;IF
	DEFW	INTE2-$
	DEFW	STATE
	DEFW	AT
	DEFW	LESS
	DEFW	ZBRAN		;IF
	DEFW	INTE3-$
	DEFW	CFA
	DEFW	COMMA
	DEFW	BRAN		;ELSE
	DEFW	INTE4-$
INTE3:	DEFW	CFA
	DEFW	EXEC		;ENDIF
INTE4:	DEFW	QSTAC
	DEFW	BRAN		;ELSE
	DEFW	INTE5-$
INTE2:	DEFW	HERE
	DEFW	NUMB
	DEFW	DPL
	DEFW	AT
	DEFW	ONEP
	DEFW	ZBRAN		;IF
	DEFW	INTE6-$
	DEFW	DLITE
	DEFW	BRAN		;ELSE
	DEFW	INTE7-$
INTE6:	DEFW	DROP
	DEFW	LITER		;ENDIF
INTE7:	DEFW	QSTAC		;ENDIF
INTE5:	DEFW	BRAN		;AGAIN
	DEFW	INTE1-$
;
	DEFB	89H		;IMMEDIATE
	DM	'IMMEDIATE'
	DEFW	INTER-0CH
IMMED:	DEFW	DOCOL
	DEFW	LATES
	DEFW	LIT
	DEFW	40H
	DEFW	TOGGL
	DEFW	SEMIS
;
	DEFB	8AH		;VOCABULARY
	DM	'VOCABULARY'
	DEFW	IMMED-0CH
VOCAB:	DEFW	DOCOL
	DEFW	BUILD
	DEFW	LIT
	DEFW	0A081H
	DEFW	COMMA
	DEFW	CURR
	DEFW	AT
	DEFW	CFA
	DEFW	COMMA
	DEFW	HERE
	DEFW	VOCL
	DEFW	AT
	DEFW	COMMA
	DEFW	VOCL
	DEFW	STORE
	DEFW	DOES
DOVOC:	DEFW	TWOP
	DEFW	CONT
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	0C5H		;FORTH
	DM	'FORTH'
	DEFW	VOCAB-0DH
FORTH:	DEFW	DODOE
	DEFW	DOVOC
	DEFW	0A081H
	DEFW	TASK-7		;COLD START VALUE ONLY.
;				CHANGED EACH TIME A DEF IS APPENDED
;				TO THE FORTH VOCABULARY
	DEFW	0		;END OF VOCABULARY LIST
;
	DEFB	8BH		;DEFINITIONS
	DM	'DEFINITIONS'
	DEFW	FORTH-8
DEFIN:	DEFW	DOCOL
	DEFW	CONT
	DEFW	AT
	DEFW	CURR
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	0C1H		;(
	DM	'('
	DEFW	DEFIN-0EH
PAREN:	DEFW	DOCOL
	DEFW	LIT
	DEFW	29H
	DEFW	WORD
	DEFW	SEMIS
;
	DEFB	84H		;QUIT
	DM	'QUIT'
	DEFW	PAREN-4
QUIT:	DEFW	DOCOL
	DEFW	ZERO
	DEFW	BLK
	DEFW	STORE
	DEFW	LBRAC
QUIT1:	DEFW	RPSTO		;BEGIN
	DEFW	CR
	DEFW	QUERY
	DEFW	INTER
	DEFW	STATE
	DEFW	AT
	DEFW	ZEQU
	DEFW	ZBRAN		;IF
	DEFW	QUIT2-$
	DEFW	PDOTQ
	DEFB	2
	DB	'ok'		;ENDIF
QUIT2:	DEFW	BRAN		;AGAIN
	DEFW	QUIT1-$
;
	DEFB	85H		;ABORT
	DM	'ABORT'
	DEFW	QUIT-7
ABORT:	DEFW	DOCOL
	DEFW	SPSTO
	DEFW	DEC
	DEFW	QSTAC
	DEFW	CR
	DEFW	DOTCPU
	DEFW	PDOTQ
	DEFB	0EH		;count of CHRs to follow
	DB	'fig-FORTH '
	DEFB	FIGREL+30H,ADOT,FIGREV+30H,USRVER
	DEFW	FORTH
	DEFW	DEFIN
	DEFW	QUIT
;
WRM:	LD	BC,WRM1
	JNEXT
WRM1:	DEFW	WARM
;
	DEFB	84H		;WARM
	DM	'WARM'
	DEFW	ABORT-8
WARM:	DEFW	DOCOL
	DEFW	MTBUF
	DEFW	ABORT
;
CLD:	LD	HL,(BDOSS+1)	;/
	LD	L,0		;/ (HL)<--FBASE
	LD	(LIMIT+2),HL	;/ set LIMIT
	LD	DE,BUFSIZ	;/ (DE)<--total disc buffer size
	OR	A		;/ clr carry
	SBC	HL,DE		;/ (HL)<--addr. of 1st disc buffer
	LD	(FIRST+2),HL	;/ set FIRST
	LD	(USE+2),HL	;/ set USE
	LD	(PREV+2),HL	;/ set PREV
	LD	(BUF1),HL	;/
	LD	DE,US		;/ (DE)<--user variable space
	SBC	HL,DE		;/ (HL)<--INITR0
	LD	(UPINIT),HL	;/
	LD	(R0INIT),HL	;/
	LD	(UP),HL		;/
	LD	(RPP),HL	;/
	LD	DE,RTS		;/ (DE)<--return stack & terminal buffer space
	SBC	HL,DE		;/ (HL)<--INITS0
	LD	(S0INIT),HL	;/
	LD	(TIBINI),HL	;/
	LD	SP,HL		;/
	LD	BC,CLD1
	LD	IX,NEXT		; POINTER TO NEXT
	LD	IY,HPUSH	; POINTER TO HPUSH
	JNEXT
;
CLD1:	DEFW	COLD
;
	DEFB	84H		;COLD
	DM	'COLD'
	DEFW	WARM-7
COLD:	DEFW	DOCOL
	DEFW	MTBUF
	DEFW	ONE,RECADR	;AvdH
	DEFW	STORE
	DEFW	LIT,BUF1
	DEFW	AT		;/
	DEFW	USE,STORE
	DEFW	LIT,BUF1
	DEFW	AT		;/
	DEFW	PREV,STORE
	DEFW	DRZER
	DEFW	ZERO		;/
	DEFW	LIT,EPRINT
	DEFW	CSTOR		;/
;
	DEFW	LIT
	DEFW	ORIG+12H
	DEFW	LIT
	DEFW	UP
	DEFW	AT
	DEFW	LIT
	DEFW	6
	DEFW	PLUS
	DEFW	LIT
	DEFW	10H
	DEFW	CMOVE
	DEFW	LIT
	DEFW	ORIG+0CH
	DEFW	AT
	DEFW	LIT
	DEFW	FORTH+6
	DEFW	STORE
	DEFW	FCB		;/A
	DEFW	LIT,OPNFIL	;/A open mass storage
	DEFW	BDOS		;/A
	DEFW	LIT,0FFH	;/A
	DEFW	EQUAL		;/A file present?
	DEFW	ZBRAN,CLD2-$	;/A
	DEFW	ZERO		;/A
	DEFW	WARN,STORE	;/A
	DEFW	CR,PDOTQ	;/A
	DEFB	7		;/A
	DB	'No file'	;/A
CLD2:	DEFW	ABORT
;
	DEFB	84H		;S->D
	DM	'S->D'
	DEFW	COLD-7
STOD:	DEFW	$+2
	POP	DE
	LD	HL,0
	BIT	7,D		;/ # NEGATIVE?
	JR	Z,STOD1		;  NO
	DEC	HL		;  YES, EXTEND SIGN
STOD1:	JP	DPUSH		;  ( n1--d1L d1H)
;
	DEFB	82H		;+-
	DM	'+-'
	DEFW	STOD-7
PM:	DEFW	DOCOL
	DEFW	ZLESS
	DEFW	ZBRAN		;IF
	DEFW	PM1-$
	DEFW	MINUS		;ENDIF
PM1:	DEFW	SEMIS
;
	DEFB	83H		;D+-
	DM	'D+-'
	DEFW	PM-5
DPM:	DEFW	DOCOL
	DEFW	ZLESS
	DEFW	ZBRAN		;IF
	DEFW	DPM1-$
	DEFW	DMINU		;ENDIF
DPM1:	DEFW	SEMIS
;
	DEFB	83H		;ABS
	DM	'ABS'
	DEFW	DPM-6
ABS:	DEFW	DOCOL
	DEFW	DUP
	DEFW	PM
	DEFW	SEMIS
;
	DEFB	84H		;DABS
	DM	'DABS'
	DEFW	ABS-6
DABS:	DEFW	DOCOL
	DEFW	DUP
	DEFW	DPM
	DEFW	SEMIS
;
	DEFB	83H		;MIN
	DM	'MIN'
	DEFW	DABS-7
MIN:	DEFW	DOCOL,TDUP
	DEFW	GREAT
	DEFW	ZBRAN		;IF
	DEFW	MIN1-$
	DEFW	SWAP		;ENDIF
MIN1:	DEFW	DROP
	DEFW	SEMIS
;
	DEFB	83H		;MAX
	DM	'MAX'
	DEFW	MIN-6
MAX:	DEFW	DOCOL
	DEFW	TDUP
	DEFW	LESS
	DEFW	ZBRAN		;IF
	DEFW	MAX1-$
	DEFW	SWAP		;ENDIF
MAX1:	DEFW	DROP
	DEFW	SEMIS
;
	DEFB	82H		;M*
	DM	'M*'
	DEFW	MAX-6
MSTAR:	DEFW	DOCOL,TDUP
	DEFW	XORR
	DEFW	TOR
	DEFW	ABS
	DEFW	SWAP
	DEFW	ABS
	DEFW	USTAR
	DEFW	FROMR
	DEFW	DPM
	DEFW	SEMIS
;
	DEFB	82H		;M/
	DM	'M/'
	DEFW	MSTAR-5
MSLAS:	DEFW	DOCOL
	DEFW	OVER
	DEFW	TOR
	DEFW	TOR
	DEFW	DABS
	DEFW	RR
	DEFW	ABS
	DEFW	USLAS
	DEFW	FROMR
	DEFW	RR
	DEFW	XORR
	DEFW	PM
	DEFW	SWAP
	DEFW	FROMR
	DEFW	PM
	DEFW	SWAP
	DEFW	SEMIS
;
	DEFB	81H		;  *
	DM	'*'
	DEFW	MSLAS-5
STAR:	DEFW	$+2
	EXX			;/ SAVE IP
	POP	HL
	POP	DE
	LD	A,L		;/
	LD	C,H		;/
	LD	B,10H		;/
	LD	HL,0		;/
STAR1:	SRL	C		;/
	RRA			;/ SRL CA  (MPCATOR)
	JR	NC,STAR2	;/ LSB (CA)=0?
	ADD	HL,DE		;/ NO, ADD MPCANT TO HL
STAR2:	SLA	E		;/
	RL	D		;/ SLA DE  (MPCANT 2 *)
	DJNZ	STAR1		;/ DO ALL 16 BITS
	PUSH	HL		;/ (S1)<--PRODUCT
	EXX			;/ RESTORE IP
	JNEXT
;
	DEFB	84H		;  /MOD
	DM	'/MOD'
	DEFW	STAR-4
SLMOD:	DEFW	$+2
	POP	DE		;/ DIVISOR
	POP	HL		;/ DIVIDEND
	PUSH	BC		;/ SAVE IP
	XOR	A		;/ RESET NEGATE FLAG
	EX	AF,AF'		;/ ALT SET
	LD	A,D		;/
	OR	E		;/ DIV BY 0?
	JR	NZ,SLMOD1	;/
	LD	HL,-1		;/ YES
	LD	D,H		;/
	LD	E,L		;/ QUOT & REM <-- -1
	JR	SLMOD7		;/ EXIT
SLMOD1:	BIT	7,D		;/ DIVISOR NEGATIVE?
	JR	Z,SLMOD2	;/
	LD	A,E		;/ YES
	CPL			;/
	LD	E,A		;/
	LD	A,D		;/
	CPL			;/
	LD	D,A		;/
	INC	DE		;/ (DE)<--(DE)'s 2's COMPLEMENT
	EX	AF,AF'		;/ STD SET
	SCF			;/ SET NEGATE FLAG
	EX	AF,AF'		;/ ALT SET
SLMOD2:	BIT	7,H		;/ DIVIDEND NEGATIVE?
	JR	Z,SLMOD3	;/
	LD	A,L		;/ YES
	CPL			;/
	LD	L,A		;/
	LD	A,H		;/
	CPL			;/
	LD	H,A		;/
	INC	HL		;/ (HL)<--(HL)'s 2's COMPLEMENT
	EX	AF,AF'		;/ STD SET
	CCF			;/ NEGATE FLAG
	INC	A		;/ DIVIDEND SIGN FLAG
	EX	AF,AF'		;/ ALT SET
SLMOD3:	LD	A,L		;/
	LD	C,H		;/ (CA)<--DIVIDEND
	LD	HL,0		;/ PRIME REMAINDER
	LD	B,10H		;/ LOOP COUNTER
SLMOD4:	RLA			;/
	RL	C		;/ RL CA
	ADC	HL,HL		;/ (HL)<--(HL) 2 * CARRY +
	SBC	HL,DE		;/ UNDERFLOW?
	JR	NC,SLMOD5	;/ NO
	ADD	HL,DE		;/ YES, RESTORE REMAINDER
SLMOD5:	CCF			;/
	DJNZ	SLMOD4		;/ DO ALL 16 BITS
	RLA			;/
	RL	C		;/ RL CA
	LD	E,A		;/
	LD	D,C		;/ (DE)<--QUOTIENT
	EX	AF,AF'		;/ STD SET
	JR	Z,SLMOD6	;/ DIVIDEND POSITIVE
	LD	A,L		;/
	CPL			;/
	LD	L,A		;/
	LD	A,H		;/
	CPL			;/
	LD	H,A		;/
	INC	HL		;/ REM GETS DIVIDEND'S SIGN
SLMOD6:	JR	NC,SLMOD7	;/ QUOTIENT POSITIVE
	LD	A,E		;/
	CPL			;/
	LD	E,A		;/
	LD	A,D		;/
	CPL			;/
	LD	D,A		;/
	INC	DE		;/ NEGATIVE QUOTIENT
SLMOD7:	POP	BC		;/ RESTORE IP
	EX	DE,HL		;/ (S2)<--REMAINDER
	JP	DPUSH		;/ (S1)<--QUOTIENT
;
	DEFB	81H		; /
	DM	'/'
	DEFW	SLMOD-7
SLASH:	DEFW	$+2
	POP	DE		;/ DIVISOR
	POP	HL		;/ DIVIDEND
	PUSH	BC		;/ SAVE IP
	XOR	A		;/ RESET NEG. FLAG
	EX	AF,AF'		;/ ALT SET
	LD	A,D		;/
	OR	E		;/ DIV BY 0?
	JR	NZ,SLASH1	;/
	LD	HL,-1		;/ YES, SET QUOTIENT TO -1
	JR	SLASH6		;/ EXIT
SLASH1:	BIT	7,D		;/ DIVISOR NEGATIVE?
	JR	Z,SLASH2	;/
	LD	A,E		;/ YES
	CPL			;/
	LD	E,A		;/
	LD	A,D		;/
	CPL			;/
	LD	D,A		;/
	INC	DE		;/ (DE)<--(DE)'s 2's COMPLEMENT
	EX	AF,AF'		;/ STD SET
	SCF			;/ SET NEG. FLAG
	EX	AF,AF'		;/ ALT SET
SLASH2:	BIT	7,H		;/ DIVIDEND NEGATIVE?
	JR	Z,SLASH3	;/
	LD	A,L		;/ YES
	CPL			;/
	LD	L,A		;/
	LD	A,H		;/
	CPL			;/
	LD	H,A		;/
	INC	HL		;/ (HL)<--(HL)'s 2's COMPLEMENT
	EX	AF,AF'		;/ STD SET
	CCF			;/ NEG. FLAG
	EX	AF,AF'		;/ ALT SET
SLASH3:	LD	A,L		;/
	LD	C,H		;/ (CA)<--DIVIDEND
	LD	HL,0		;/
	LD	B,10H		;/ LOOP COUNTER
SLASH4:	RLA			;/
	RL	C		;/ RL CA
	ADC	HL,HL		;/ (HL)<--(HL) 2 * CARRY +
	SBC	HL,DE		;/ UNDERFLOW?
	JR	NC,SLASH5	;/ NO
	ADD	HL,DE		;/ YES, RESTORE REMAINDER
SLASH5:	CCF			;/
	DJNZ	SLASH4		;/ DO ALL 16 BITS
	RLA			;/
	RL	C		;/ RL CA
	LD	L,A		;/
	LD	H,C		;/ (HL)<--QUOTIENT
	EX	AF,AF'		;/ STD SET
	JR	NC,SLASH6	;/ POSITIVE QUOTIENT
	LD	A,L		;/
	CPL			;/
	LD	L,A		;/
	LD	A,H		;/
	CPL			;/
	LD	H,A		;/
	INC	HL		;/ NEGATIVE QUOTIENT
SLASH6:	POP	BC		;/ RESTORE IP
	JHPUSH
;
	DEFB	83H		; MOD
	DM	'MOD'
	DEFW	SLASH-4
MODD:	DEFW	DOCOL
	DEFW	SLMOD
	DEFW	DROP
	DEFW	SEMIS
;
	DEFB	85H		; */MOD
	DM	'*/MOD'
	DEFW	MODD-6
SSMOD:	DEFW	DOCOL
	DEFW	TOR
	DEFW	MSTAR
	DEFW	FROMR
	DEFW	MSLAS
	DEFW	SEMIS
;
	DEFB	82H		; */
	DM	'*/'
	DEFW	SSMOD-8
SSLA:	DEFW	DOCOL
	DEFW	SSMOD
	DEFW	SWAP
	DEFW	DROP
	DEFW	SEMIS
;
	DEFB	85H		; M/MOD
	DM	'M/MOD'
	DEFW	SSLA-5
MSMOD:	DEFW	DOCOL
	DEFW	TOR
	DEFW	ZERO
	DEFW	RR
	DEFW	USLAS
	DEFW	FROMR
	DEFW	SWAP
	DEFW	TOR
	DEFW	USLAS
	DEFW	FROMR
	DEFW	SEMIS
;
;	Block moved down 2 pages
;
	DEFB	86H		; (LINE)
	DM	'(LINE)'
	DEFW	MSMOD-8
PLINE:	DEFW	DOCOL
	DEFW	TOR
	DEFW	LIT
	DEFW	40H
	DEFW	BBUF
	DEFW	SSMOD
	DEFW	FROMR
	DEFW	BSCR
	DEFW	STAR
	DEFW	PLUS
	DEFW	BLOCK
	DEFW	PLUS
	DEFW	LIT
	DEFW	40H
	DEFW	SEMIS
;
	DEFB	85H		; .LINE
	DM	'.LINE'
	DEFW	PLINE-9
DLINE:	DEFW	DOCOL
	DEFW	PLINE
	DEFW	DTRAI
	DEFW	TYPE
	DEFW	SEMIS
;
	DEFB	87H		;MESSAGE
	DM	'MESSAGE'
	DEFW	DLINE-8
MESS:	DEFW	DOCOL
	DEFW	WARN
	DEFW	AT
	DEFW	ZBRAN		;IF
	DEFW	MESS1-$
	DEFW	DDUP
	DEFW	ZBRAN		;IF
	DEFW	MESS2-$
	DEFW	LIT
	DEFW	4		;1st MESSAGE SCREEN
	DEFW	OFSET
	DEFW	AT
	DEFW	BSCR
	DEFW	SLASH
	DEFW	SUBB
	DEFW	DLINE
	DEFW	SPACE		;ENDIF
MESS2:	DEFW	BRAN		;ELSE
	DEFW	MESS3-$
MESS1:	DEFW	PDOTQ
	DEFB	6
	DB	'MSG # '
	DEFW	DOT		;ENDIF
MESS3:	DEFW	SEMIS
;
	DEFB	82H		;P@
	DM	'P@'
	DEFW	MESS-0AH
PTAT:	DEFW	$+2
	EXX			;d SAVE REGISTERS
	POP	BC		;d (BC)<--PORT#
	IN	L,(C)		;d (L)<--DATA BYTE
	LD	H,0
	PUSH	HL
	EXX			;d RESTORE REGISTERS
	JNEXT
;
	DEFB	82H		;P!
	DM	'P!'
	DEFW	PTAT-5
PTSTO:	DEFW	$+2
	EXX			;d SAVE REGISTERS
	POP	BC		;d (C)<--PORT#
	POP	HL		;d (L)<--DATA BYTE
	OUT	(C),L
	EXX			;d RESTORE REGISTERS
	JNEXT
;
	FORM
*INCLUDE DISCIO.FTH
	FORM
*INCLUDE CONPRTIO.FTH
	FORM
;
	DEFB	0C1H		; ' (tick)
	DEFB	0A7H
	DEFW	ARROW-6
TICK:	DEFW	DOCOL
	DEFW	DFIND
	DEFW	ZEQU
	DEFW	ZERO
	DEFW	QERR
	DEFW	DROP
	DEFW	LITER
	DEFW	SEMIS
;
	DEFB	86H		;FORGET
	DM	'FORGET'
	DEFW	TICK-4
FORG:	DEFW	DOCOL
	DEFW	CURR
	DEFW	AT
	DEFW	CONT
	DEFW	AT
	DEFW	SUBB
	DEFW	LIT
	DEFW	18H
	DEFW	QERR
	DEFW	TICK
	DEFW	DUP
	DEFW	FENCE
	DEFW	AT
	DEFW	uless		;/ FORGET >8000h nw o.k.
	DEFW	LIT
	DEFW	15H
	DEFW	QERR
	DEFW	DUP
	DEFW	NFA
	DEFW	DP
	DEFW	STORE
	DEFW	LFA
	DEFW	AT
	DEFW	CONT
	DEFW	AT
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	84H		;BACK
	DM	'BACK'
	DEFW	FORG-9
BACK:	DEFW	DOCOL
	DEFW	HERE
	DEFW	SUBB
	DEFW	COMMA
	DEFW	SEMIS
;
	DEFB	0C5H		;BEGIN
	DM	'BEGIN'
	DEFW	BACK-7
BEGIN:	DEFW	DOCOL
	DEFW	QCOMP
	DEFW	HERE
	DEFW	ONE
	DEFW	SEMIS
;
	DEFB	0C5H		;ENDIF
	DM	'ENDIF'
	DEFW	BEGIN-8
ENDIFF:	DEFW	DOCOL
	DEFW	QCOMP
	DEFW	TWO
	DEFW	QPAIR
	DEFW	HERE
	DEFW	OVER
	DEFW	SUBB
	DEFW	SWAP
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	0C4H		;THEN
	DM	'THEN'
	DEFW	ENDIFF-8
THEN:	DEFW	DOCOL
	DEFW	ENDIFF
	DEFW	SEMIS
;
	DEFB	0C2H		;DO
	DM	'DO'
	DEFW	THEN-7
DO:	DEFW	DOCOL
	DEFW	COMP
	DEFW	XDO
	DEFW	HERE
	DEFW	THREE
	DEFW	SEMIS
;
	DEFB	0C4H		;LOOP
	DM	'LOOP'
	DEFW	DO-5
LOOP:	DEFW	DOCOL
	DEFW	THREE
	DEFW	QPAIR
	DEFW	COMP
	DEFW	XLOOP
	DEFW	BACK
	DEFW	SEMIS
;
	DEFB	0C5H		;+LOOP
	DM	'+LOOP'
	DEFW	LOOP-7
PLOOP:	DEFW	DOCOL
	DEFW	THREE
	DEFW	QPAIR
	DEFW	COMP
	DEFW	XPLOO
	DEFW	BACK
	DEFW	SEMIS
;
	DEFB	0C5H		;UNTIL
	DM	'UNTIL'
	DEFW	PLOOP-8
UNTIL:	DEFW	DOCOL
	DEFW	ONE
	DEFW	QPAIR
	DEFW	COMP
	DEFW	ZBRAN
	DEFW	BACK
	DEFW	SEMIS
;
	DEFB	0C3H		;END
	DM	'END'
	DEFW	UNTIL-8
ENDD:	DEFW	DOCOL
	DEFW	UNTIL
	DEFW	SEMIS
;
	DEFB	0C5H		;AGAIN
	DM	'AGAIN'
	DEFW	ENDD-6
AGAIN:	DEFW	DOCOL
	DEFW	ONE
	DEFW	QPAIR
	DEFW	COMP
	DEFW	BRAN
	DEFW	BACK
	DEFW	SEMIS
;
	DEFB	0C6H		;REPEAT
	DM	'REPEAT'
	DEFW	AGAIN-8
REPEA:	DEFW	DOCOL
	DEFW	TOR
	DEFW	TOR
	DEFW	AGAIN
	DEFW	FROMR
	DEFW	FROMR
	DEFW	TWOMIN		;/
	DEFW	ENDIFF
	DEFW	SEMIS
;
	DEFB	0C2H		;IF
	DM	'IF'
	DEFW	REPEA-9
IFF:	DEFW	DOCOL
	DEFW	COMP
	DEFW	ZBRAN
	DEFW	HERE
	DEFW	ZERO
	DEFW	COMMA
	DEFW	TWO
	DEFW	SEMIS
;
	DEFB	0C4H		;ELSE
	DM	'ELSE'
	DEFW	IFF-5
ELSEE:	DEFW	DOCOL
	DEFW	TWO
	DEFW	QPAIR
	DEFW	COMP
	DEFW	BRAN
	DEFW	HERE
	DEFW	ZERO
	DEFW	COMMA
	DEFW	SWAP
	DEFW	TWO
	DEFW	ENDIFF
	DEFW	TWO
	DEFW	SEMIS
;
	DEFB	0C5H		;WHILE
	DM	'WHILE'
	DEFW	ELSEE-7
WHILE:	DEFW	DOCOL
	DEFW	IFF
	DEFW	TWOP
	DEFW	SEMIS
;
	DEFB	86H		;SPACES
	DM	'SPACES'
	DEFW	WHILE-8
SPACS:	DEFW	DOCOL
	DEFW	ZERO
	DEFW	MAX
	DEFW	DDUP
	DEFW	ZBRAN		;IF
	DEFW	SPAX1-$
	DEFW	ZERO
	DEFW	XDO		;DO
SPAX2:	DEFW	SPACE
	DEFW	XLOOP		;LOOP ENDIF
	DEFW	SPAX2-$
SPAX1:	DEFW	SEMIS
;
	DEFB	82H		;<#
	DM	'<#'
	DEFW	SPACS-9
BDIGS:	DEFW	DOCOL
	DEFW	PAD
	DEFW	HLD
	DEFW	STORE
	DEFW	SEMIS
;
	DEFB	82H		;#>
	DM	'#>'
	DEFW	BDIGS-5
EDIGS:	DEFW	DOCOL
	DEFW	DROP
	DEFW	DROP
	DEFW	HLD
	DEFW	AT
	DEFW	PAD
	DEFW	OVER
	DEFW	SUBB
	DEFW	SEMIS
;
	DEFB	84H		;SIGN
	DM	'SIGN'
	DEFW	EDIGS-5
SIGN:	DEFW	DOCOL
	DEFW	ROT
	DEFW	ZLESS
	DEFW	ZBRAN		;IF
	DEFW	SIGN1-$
	DEFW	LIT
	DEFW	2DH
	DEFW	HOLD		;ENDIF
SIGN1:	DEFW	SEMIS
;
	DEFB	81H		;#
	DM	'#'
	DEFW	SIGN-7
DIG:	DEFW	DOCOL
	DEFW	BASE
	DEFW	AT
	DEFW	MSMOD
	DEFW	ROT
	DEFW	LIT
	DEFW	9
	DEFW	OVER
	DEFW	LESS
	DEFW	ZBRAN		;IF
	DEFW	DIG1-$
	DEFW	LIT
	DEFW	7
	DEFW	PLUS		;ENDIF
DIG1:	DEFW	LIT
	DEFW	30H
	DEFW	PLUS
	DEFW	HOLD
	DEFW	SEMIS
;
	DEFB	82H		;#S
	DM	'#S'
	DEFW	DIG-4
DIGS:	DEFW	DOCOL
DIGS1:	DEFW	DIG		;BEGIN
	DEFW	TDUP		;/
	DEFW	ORR
	DEFW	ZEQU
	DEFW	ZBRAN		;UNTIL
	DEFW	DIGS1-$
	DEFW	SEMIS
;
	DEFB	83H		;D.R
	DM	'D.R'
	DEFW	DIGS-5
DDOTR:	DEFW	DOCOL
	DEFW	TOR
	DEFW	SWAP
	DEFW	OVER
	DEFW	DABS
	DEFW	BDIGS
	DEFW	DIGS
	DEFW	SIGN
	DEFW	EDIGS
	DEFW	FROMR
	DEFW	OVER
	DEFW	SUBB
	DEFW	SPACS
	DEFW	TYPE
	DEFW	SEMIS
;
	DEFB	82H		;.R
	DM	'.R'
	DEFW	DDOTR-6
DOTR:	DEFW	DOCOL
	DEFW	TOR
	DEFW	STOD
	DEFW	FROMR
	DEFW	DDOTR
	DEFW	SEMIS
;
	DEFB	82H		;D.
	DM	'D.'
	DEFW	DOTR-5
DDOT:	DEFW	DOCOL
	DEFW	ZERO
	DEFW	DDOTR
	DEFW	SPACE
	DEFW	SEMIS
;
	DEFB	81H		; .
	DM	'.'
	DEFW	DDOT-5
DOT:	DEFW	DOCOL
	DEFW	STOD
	DEFW	DDOT
	DEFW	SEMIS
;
	DEFB	81H		;?
	DM	'?'
	DEFW	DOT-4
QUES:	DEFW	DOCOL
	DEFW	AT
	DEFW	DOT
	DEFW	SEMIS
;
	DEFB	82H		;U.
	DM	'U.'
	DEFW	QUES-4
UDOT:	DEFW	DOCOL
	DEFW	ZERO
	DEFW	DDOT
	DEFW	SEMIS
;
	DEFB	85H		;VLIST
	DM	'VLIST'
	DEFW	UDOT-5
VLIST:	DEFW	DOCOL
	DEFW	LIT
	DEFW	80H
	DEFW	OUTT
	DEFW	STORE
	DEFW	CONT
	DEFW	AT
	DEFW	AT
VLIS1:	DEFW	OUTT		;BEGIN
	DEFW	AT
	DEFW	CSLL
	DEFW	GREAT
	DEFW	ZBRAN		;IF
	DEFW	VLIS2-$
	DEFW	CR
	DEFW	ZERO
	DEFW	OUTT
	DEFW	STORE		;ENDIF
VLIS2:	DEFW	DUP
	DEFW	IDDOT
	DEFW	SPACE
	DEFW	SPACE
	DEFW	PFA
	DEFW	LFA
	DEFW	AT
	DEFW	DUP
	DEFW	ZEQU
	DEFW	QTERM
	DEFW	ORR
	DEFW	ZBRAN		;UNTIL
	DEFW	VLIS1-$
	DEFW	DROP
	DEFW	SEMIS
;
	DEFB	83H		;BYE
	DM	'BYE'
	DEFW	VLIST-8
BYE:	DEFW	DOCOL		;/A
	DEFW	FLUSH		;/A
	DEFW	FCB,LIT		;/E
	DEFW	10H,BDOS	;/E close file
	DEFW	DROP		;/E discard directory code
	DEFW	ZERO,ZERO	;/A
	DEFW	BDOS		;/A return to CP/M
	DEFW	SEMIS		;/A won't get this far, just for pretty
;
	DEFB	84H		;LIST
	DM	'LIST'
	DEFW	BYE-6
LIST:	DEFW	DOCOL,DEC
	DEFW	CR,DUP
	DEFW	SCR,STORE
	DEFW	PDOTQ
	DEFB	6
	DB	'SCR # '
	DEFW	DOT
	DEFW	LIT,10H
	DEFW	ZERO,XDO
LIST1:	DEFW	CR,IDO
	DEFW	THREE		;/ WAS LIT,3
	DEFW	DOTR,SPACE
	DEFW	IDO,SCR
	DEFW	AT,DLINE
	DEFW	QTERM
	DEFW	ZBRAN,LIST2-$	;IF
	DEFW	LEAVE
LIST2:	DEFW	XLOOP,LIST1-$	;ENDIF
	DEFW	CR,SEMIS
;
	DEFB	85H		;INDEX
	DM	'INDEX'
	DEFW	LIST-7
INDEX:	DEFW	DOCOL
	DEFW	LIT,FF
	DEFW	EMIT,CR
	DEFW	ONEP,SWAP
	DEFW	XDO
INDE1:	DEFW	CR,IDO
	DEFW	THREE		;/ WAS LIT,3
	DEFW	DOTR,SPACE
	DEFW	ZERO,IDO
	DEFW	DLINE,QTERM
	DEFW	ZBRAN,INDE2-$	;IF
	DEFW	LEAVE		;ENDIF
INDE2:	DEFW	XLOOP,INDE1-$
	DEFW	SEMIS
;
	DEFB	85H		;TRIAD
	DM	'TRIAD'
	DEFW	INDEX-8
TRIAD:	DEFW	DOCOL
	DEFW	LIT,FF
	DEFW	EMIT
	DEFW	THREE		;/ WAS LIT,3
	DEFW	SLASH
	DEFW	THREE		;/ WAS LIT,3
	DEFW	STAR
	DEFW	THREE		;/ WAS LIT,3
	DEFW	OVER,PLUS
	DEFW	SWAP,XDO
TRIA1:	DEFW	CR,IDO
	DEFW	LIST
	DEFW	QTERM
	DEFW	ZBRAN,TRIA2-$	;IF
	DEFW	LEAVE
TRIA2:	DEFW	XLOOP,TRIA1-$	;ENDIF
	DEFW	CR
	DEFW	LIT,15
	DEFW	MESS,CR
	DEFW	SEMIS
;
	DEFB	84H		;.CPU
	DM	'.CPU'
	DEFW	TRIAD-8
DOTCPU:	DEFW	DOCOL
	DEFW	BASE,AT
	DEFW	LIT,36
	DEFW	BASE,STORE
	DEFW	LIT,22H
	DEFW	PORIG,TAT
	DEFW	DDOT
	DEFW	BASE,STORE
	DEFW	SEMIS
;
	DEFB	84H		;TASK
	DM	'TASK'
	DEFW	DOTCPU-7
TASK:	DEFW	DOCOL
	DEFW	SEMIS
;
INITDP:	DEFW	0
;
	END


file: /Techref/language/FORTH/z80fig-Forth1_1g_files/Z80FORTH.ASM, 53KB, , updated: 1997/12/31 09:21, local time: 2024/4/25 17:43,
TOP NEW HELP FIND: 
18.118.2.15:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://massmind.org/techref/language/FORTH/z80fig-Forth1_1g_files/Z80FORTH.ASM"> language FORTH z80fig-Forth1_1g_files Z80FORTH</A>

Did you find what you needed?

 

Welcome to massmind.org!

 

Welcome to massmind.org!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .