NEW
  AUTO 3,1
*--------------------------------------
KW.Lookup		>LDYA L.KEYWORDS
				>STYA ZPPtr1

				ldx #0

.1				ldy #$ff

.2				jsr .7					get next valid char in src text
				bcs .3

.20				jsr ToUpperCase
				eor (ZPPtr1),y			match table char ?
				asl						compare only 7 bits
				bne .4					no match...get next table keyword

				bcc .2					not last char in this keyword

				jsr .7					next char in text...
				bcc .4					valid....failed

.8				tya						Keyword Len

				jsr NextKW

				clc
				rts

.3				dey
				lda (ZPPtr1),y			was last char in this keyword ?
				bmi .8

				iny
.41				jsr IncPtr1				skip chars to next keyword

.4				lda (ZPPtr1)
				bpl .41
				jsr IncPtr1

.6				inx
				inx
				lda (ZPPtr1)			Array Ending 0, lookup failed
				bne .1

.9				sec
				rts

.7				iny
				lda (ZPCLBufPtr),y		Get Src text char...
				beq .9					end of text

				jmp IsSpaceOrCR			CS=end of valid chars
*--------------------------------------
KW.INVALID		lda #E.CSYN
				sec
				rts
*--------------------------------------
KW.qDUP			lda (pStack)
				ldy #1
				ora (pStack),y
				bne KW.DUP

				clc
				rts
*--------------------------------------
KW.DUP			lda pStack
				beq .9

				cmp #$FF
				bcs .9

				cmp #2
				bcc .99

				ldy #1
				lda (pStack),y
				>PUSHA
				lda (pStack),y
				>PUSHA
				clc
				rts

.9				lda #E.STACKERROR
				sec
				rts

.99				lda #E.STKOVERFLOW
				sec
				rts
*--------------------------------------
KW.DROP			lda pStack
				beq .9

				inc pStack
				beq .9
				inc pStack

				clc
				rts

.9				lda #E.STACKERROR
				sec
				rts
*--------------------------------------
KW.SWAP			ldy #3
				lda (pStack),y
				pha

				dey						#2
				lda (pStack),y
				pha

				lda (pStack)
				tax
				pla
				sta (pStack)

				txa
				sta (pStack),y			#2

				dey 					#1
				lda (pStack),y
				tax
				pla
				sta (pStack),y

				iny
				iny						#3
				txa
				sta (pStack),y

				clc
				rts
*--------------------------------------
KW.OVER			jsr CheckStackPop4
				bcs .9

				cmp #2
				bcc .99

				ldy #3
				lda (pStack),y
				>PUSHA
				lda (pStack),y
				>PUSHA

				clc
				rts

.99				lda #E.STKOVERFLOW
				sec
.9				rts
*--------------------------------------
KW.ROT			lda pStack
				beq .9

				cmp #$FB
				bcs .9

				ldy #5
				lda (pStack),y			n1 HI
				pha
				dey
				lda (pStack),y			n1 LO
				pha

.1				dey

				lda (pStack),y
				iny
				iny
				sta (pStack),y
				dey
				dey
				bne .1

				iny

				pla
				sta (pStack)
				pla
				sta (pStack),y

				clc
				rts

.9				lda #E.STACKERROR
				sec
				rts
*--------------------------------------
KW.Add			jsr CheckStackPop4
				bcs .9

				>FPU iADD

				clc
.9				rts
*--------------------------------------
KW.DAdd			>FPU lADD
				clc
				rts
*--------------------------------------
KW.Sub			jsr CheckStackPop4
				bcs .9

				>FPU iSUB

				clc
.9				rts
*--------------------------------------
KW.DSub			>FPU lSUB
				clc
				rts
*--------------------------------------
KW.Mul			jsr CheckStackPop4
				bcs .9

				>FPU iMUL

				clc
.9				rts
*--------------------------------------
KW.Div			jsr KW.DivMoD.1
				bcs .9

				>LDYA ZPPtr2
				jsr KW.PushWSigned

				clc

.9				rts
*--------------------------------------
KW.Mod			jsr KW.DivMoD.1
				bcs .9

				>PUSHW ZPPtr3

.9				rts
*--------------------------------------
KW.DivMod		jsr KW.DivMoD.1
				bcs .9

				>PUSHW ZPPtr3
				>LDYA ZPPtr2
				jsr KW.PushWSigned

				clc

.9				rts
*--------------------------------------
KW.MulDivMod
*--------------------------------------
KW.MulDiv
				lda #E.SYN
				sec
				rts
*--------------------------------------
KW.DivMoD.1		jsr CheckStackPop4
				bcs .9

				jsr KW.GetPtr1Ptr2Sign

				stz ZPPtr3
				stz ZPPtr3+1

				ldx #16

.1				asl	ZPPtr2
				rol ZPPtr2+1
				rol ZPPtr3
				rol ZPPtr3+1

				sec
				lda ZPPtr3
				sbc ZPPtr1
				pha
				lda ZPPtr3+1
				sbc ZPPtr1+1
				bcs .2

				pla
				dex
				bne .1

				bra .8

.2				sta ZPPtr3+1
				pla
				sta ZPPtr3
				inc ZPPtr2

				dex
				bne .1

.8				clc
.9				rts
*--------------------------------------
KW.GetPtr1Ptr2Sign
				>PULLW ZPPtr1
				sta Sign

				asl
				bcc .1

				lda ZPPtr1
				clc
				eor #$ff
				adc #1
				sta ZPPtr1

				lda ZPPtr1+1
				eor #$ff
				adc #0
				sta ZPPtr1+1

.1				>PULLW ZPPtr2

				asl
				bcc .8

				lda ZPPtr2
				clc
				eor #$ff
				adc #1
				sta ZPPtr2

				lda ZPPtr2+1
				eor #$ff
				adc #0
				sta ZPPtr2+1

				lda Sign
				eor #$80
				sta Sign

.8				rts
*--------------------------------------
KW.PushWSigned	bit Sign
				bpl .8

				pha
				tya

				clc
				eor #$ff
				adc #1
				tay

				pla
				eor #$ff
				adc #0

.8				>PUSHYA
				rts
*--------------------------------------
KW.MAX			jsr CheckStackPop4
				bcs .9

				lda (pStack)			LO
				ldy #2
				cmp (pStack),y

				dey						#1

				lda (pStack),y			HI
				iny
				iny						#3
				sbc (pStack),y
				bcc .1

				jsr KW.SWAP

.1				jmp KW.DROP

.9				rts
*--------------------------------------
KW.MIN			jsr CheckStackPop4
				bcs .9

				lda (pStack)			LO
				ldy #2
				cmp (pStack),y

				dey						#1

				lda (pStack),y			HI
				iny
				iny						#3
				sbc (pStack),y
				bcs .1

				jsr KW.SWAP

.1				jmp KW.DROP

.9				rts
*--------------------------------------
KW.ABS			ldy #1

				lda (pStack),y			HI
				bpl KW.NEGATE.8
*--------------------------------------
KW.NEGATE		lda (pStack)			LO
				eor #$ff
				sec
				adc #0
				sta (pStack)

				ldy #1
				lda (pStack),y			HI
				eor #$ff
				adc #0
				sta (pStack),y

KW.NEGATE.8		clc
				rts
*--------------------------------------
KW.DABS			ldy #3

				lda (pStack),y			HI
				bpl KW.DNEGATE.8
*--------------------------------------
KW.DNEGATE		lda (pStack)			LO
				eor #$ff
				sec
				adc #0
				sta (pStack)

				ldy #1
				lda (pStack),y			HI
				eor #$ff
				adc #0
				sta (pStack),y

				iny
				lda (pStack),y
				eor #$ff
				adc #0
				sta (pStack),y

				iny
				lda (pStack),y
				eor #$ff
				adc #0
				sta (pStack),y

KW.DNEGATE.8	clc
				rts
*--------------------------------------
KW.AND			jsr CheckStackPop4
				bcs .9

				ldy #2
				lda (pStack),y
				and (pStack)
				sta (pStack),y
				inc pStack

				lda (pStack),y
				and (pStack)
				sta (pStack),y
				inc pStack

*				clc

.9				rts
*--------------------------------------
KW.OR			jsr CheckStackPop4
				bcs .9

				ldy #2
				lda (pStack),y
				ora (pStack)
				sta (pStack),y
				inc pStack

				lda (pStack),y
				ora (pStack)
				sta (pStack),y
				inc pStack

*				clc

.9				rts
*--------------------------------------
KW.XOR			jsr CheckStackPop4
				bcs .9

				ldy #2
				lda (pStack),y
				eor (pStack)
				sta (pStack),y
				inc pStack

				lda (pStack),y
				eor (pStack)
				sta (pStack),y
				inc pStack

*				clc

.9				rts
*--------------------------------------
KW.LWR			jsr CheckStackPop4
				bcs .9

				ldy #2
				lda (pStack),y
				cmp (pStack)
				inc pStack

				lda (pStack),y
				sbc (pStack)
				inc pStack

				inc pStack

				lda #0
				ror
				eor #$80

				sta (pStack)

*				clc

.9				rts
*--------------------------------------
KW.GTR			jsr CheckStackPop4
				bcs .9

				ldy #2
				lda (pStack),y
				cmp (pStack)
				inc pStack

				lda (pStack),y
				sbc (pStack)
				inc pStack

				inc pStack

				lda #0
				ror

				sta (pStack)

*				clc

.9				rts
*--------------------------------------
* : TL BEGIN DUP . 1 - DUP 0 = UNTIL ;
*--------------------------------------
KW.EQ			jsr CheckStackPop4
				bcs .9

*				clc

				ldy #2
				lda (pStack),y
				eor (pStack)

				inc pStack
				tax
				bne .1

				lda (pStack),y
				eor (pStack)
				bne .1

				sec

.1				lda #0
				ror

				inc pStack
				inc pStack

				sta (pStack)

*				clc
.9				rts
*--------------------------------------
KW.NEGATIVE		inc pStack

				clc
				rts
*--------------------------------------
KW.ZERO			clc

				>PULLA
				ora (pStack)
				bne .9

				sec

.9				lda #0
				ror

				sta (pStack)

*				clc
				rts
*--------------------------------------
KW..			jsr KW.DUP
				bcs .9

				ldy #2
				lda L.FMT.int16
				sta (pStack),y
				iny
				lda L.FMT.int16+1
				sta (pStack),y
				>PUSHBI 2
				>SYSCALL PrintF

*				clc

.9				rts
*--------------------------------------
KW.U.			jsr KW.DUP
				bcs .9

				ldy #2
				lda L.FMT.uint16
				sta (pStack),y
				iny
				lda L.FMT.uint16+1
				sta (pStack),y
				>PUSHBI 2
				>SYSCALL PrintF

*				clc

.9				rts
*--------------------------------------
KW..R
				lda #E.SYN
				sec
				rts
*--------------------------------------
KW.D.			>PUSHW L.FMT.int32
				ldy #5
				ldx #4

.1				lda (pStack),y
				>PUSHA
				dex
				bne .1

				>PUSHBI 4
				>SYSCALL PrintF

				>RET 4
*--------------------------------------
KW.D.R
				lda #E.SYN
				sec
				rts
*--------------------------------------
KW.CR			>PUSHW L.MSG.ECHOCRLF
				>PUSHBI 0
				>SYSCALL PrintF
				rts
*--------------------------------------
KW.SPACE		lda #C.SPACE
				>SYSCALL PutChar
				rts
*--------------------------------------
KW.SPACES		>PULLA

				beq .8

.1				dec

				pha

				lda #C.SPACE
				>SYSCALL PutChar
				pla
				bne .1

.8				clc
				rts
*--------------------------------------
KW.PRINT		>LDYAI 256
				>SYSCALL GetMem
				bcs .9

				>STYA ZPPtr1
				phx

				ldy #$ff

				clc

.1				iny
				lda (ZPCLBufPtr),y
				beq .2

				sta (ZPPtr1),y
				eor #'"
				bne .1

				sec

.2				sta (ZPPtr1),y
				tya
				adc ZPCLBufPtr
				sta ZPCLBufPtr
				bcc .3

				inc ZPCLBufPtr+1

.3				>LDYA ZPPtr1
				>SYSCALL PutS

				pla
				>SYSCALL FreeMem

.9				rts
*--------------------------------------
KW.KEY			>SYSCALL GetChar
				bcs .9

				>PUSHA

.9				rts
*--------------------------------------
KW.EMIT			>PULLA
				>SYSCALL PutChar
				rts
*--------------------------------------
KW.EXPECT		>PULLW ZPPtr1			n
				>PULLW ZPAddrPtr

				lda ZPPtr1+1
				bmi .8					n < 0, no action

				eor #$ff
				sta ZPPtr1+1

				lda ZPPtr1
				eor #$ff
				sta ZPPtr1

				ldy #0

.1				inc ZPPtr1
				bne .2

				inc ZPPtr1+1
				beq .6

.2				phy

				>SYSCALL GetChar

				ply
				cmp #C.CR
				beq .7

				phy
				pha
				>SYSCALL PutChar
				pla
				ply
				iny
				sta (ZPAddrPtr),y

				bra .1

.6				tya
				beq .8

				sta (ZPAddrPtr)

.7				lda #0
				sta (ZPAddrPtr),y

.8				clc
				rts
*--------------------------------------
KW.COUNT		lda (pStack)
				sta ZPAddrPtr
				sec
				adc #0
				sta (pStack)

				ldy #1
				lda (pStack),y
				sta ZPAddrPtr+1
				adc #0
				sta (pStack),y

				lda #0
				>PUSHA
				lda (ZPAddrPtr)
				>PUSHA

				clc
				rts
*--------------------------------------
KW.TYPE			>PULLW ZPPtr1			n
				>PULLW ZPAddrPtr

				ldy #$ff

.1				iny
				lda (ZPAddrPtr),y
				bne .1

				cpy ZPPtr1
				bcs .8

				iny
				lda (ZPAddrPtr),y
				pha
				lda #0
				sta (ZPAddrPtr),y
				jsr .8

				pla
				sta (ZPAddrPtr),y
				clc
				rts

.8				ldy #S.PS.hStdOut
				lda (pPS),y
				>PUSHA
				>PUSHW ZPAddrPtr
				>SYSCALL FPutS

				clc
				rts
*--------------------------------------
KW.WORD
*--------------------------------------
KW.DUMP
				lda #E.SYN
				sec
				rts
*--------------------------------------
KW.TERMINAL
				lda #E.SYN
				sec
				rts
*--------------------------------------
KW.NUMBER
*--------------------------------------
KW.STARTSTR
*--------------------------------------
KW.STRADD
*--------------------------------------
KW.STRDBL
*--------------------------------------
KW.SIGN
*--------------------------------------
KW.ENDSTR
*--------------------------------------
KW.HOLD
*--------------------------------------
KW.DECIMAL
*--------------------------------------
KW.HEX
*--------------------------------------
KW.OCTAL		lda #E.SYN
				sec
				rts
*--------------------------------------
KW.FETCHSP		lda pStack+1
				ldy pStack
				bne .1

				inc

.1				>PUSHYA
				clc
				rts
*--------------------------------------
KW.FETCHW		lda (pStack)
				sta ZPAddrPtr
				ldy #1
				lda (pStack),y
				sta ZPAddrPtr+1

				lda (ZPAddrPtr)
				sta (pStack)
				lda (ZPAddrPtr),y
				sta (pStack),y
				clc
				rts
*--------------------------------------
KW.STOREW		jsr CheckStackPop4
				bcs .9

				>PULLW ZPAddrPtr
				>PULLA
				sta (ZPAddrPtr)
				>PULLA
				ldy #1
				sta (ZPAddrPtr),y

*				clc

.9				rts
*--------------------------------------
KW.FETCHB		>PULLW ZPAddrPtr
				lda (ZPAddrPtr)
				>PUSHA
				clc
				rts
*--------------------------------------
KW.STOREB		>PULLW ZPAddrPtr
				>PULLA
				sta (ZPAddrPtr)
				clc
KW.STOREB.RTS	rts
*--------------------------------------
KW.FETCHPRINTW	jsr KW.FETCHW
				bcs KW.STOREB.RTS
				jmp KW..
*--------------------------------------
KW.ADDTOW		jsr KW.FETCHW
				bcs KW.STOREB.RTS
				jsr KW.Add
				bcs KW.STOREB.RTS
				jmp KW.STOREW
*--------------------------------------
KW.CMOVE
				lda #E.SYN
				sec
				rts
*--------------------------------------
KW.FILL			>PULLA
				bra KW.FILL2

KW.ERASE		lda #0
				bra KW.FILL2

KW.BLANKS		lda #C.SPACE

KW.FILL2		tax

				>PULLA
				tay

				>PULLW ZPAddrPtr

				txa

.1				dey
				sta (ZPAddrPtr),y
				cpy #0
				bne .1

				clc
				rts
*--------------------------------------
KW.HERE			>PUSHW ZPDataPtr
				clc
				rts
*--------------------------------------
KW.PAD			>PUSHW ZPOutputBufPtr
				clc
				rts

KW.ALLOT.9		lda #E.STACKERROR
				sec
				rts
*--------------------------------------
KW.ALLOT		lda #SYM.T.VAR
				sta ZPType

				lda pStack
				beq KW.ALLOT.9

				cmp #$FF
				bcs KW.ALLOT.9

				>PUSHB.G hSList
				>PUSHW ZPCLBufPtr

				>SYSCALL SListNewKey
				bcs .9

				>STYA ZPKeyID

				txa
				jsr NextKW

				>LDYA ZPDataPtr
				>STYA ZPAddrPtr

				>PULLA
				clc
				adc ZPDataPtr
				sta ZPDataPtr

				>PULLA
				adc ZPDataPtr+1
				sta ZPDataPtr+1

				>PUSHB.G hSList
				>PUSHW ZPKeyID
				>PUSHWI ZPType
				>PUSHWI 4
				>SYSCALL SListAddData

.9				rts
*--------------------------------------
KW.nCOMPILE
KW.QUOTE
KW.FORGET
KW.DEFINITIONS
KW.VOCABULARY
KW.FORTH
KW.EDITOR
KW.ASSEMBLER
				lda #E.SYN
				sec
				rts
*--------------------------------------
KW.VLIST		stz ZPPtr1
				lda #1
				sta ZPPtr1+1

.1				>LDYA ZPPtr1
				>STYA ZPKeyID

				>PUSHB.G hSList
				>PUSHW ZPKeyID
				>PUSHW ZPOutputBufPtr
				>SYSCALL SListGetByID
				bcs .8

				>STYA ZPPtr1			Save Next ID

				jsr CS.RUN.GetSymbolData
				bcs .9

				>PUSHW L.MSG.DUMP2
				>PUSHW ZPOutputBufPtr
				ldx #4
				bit ZPType
				bmi .2

				dex
				dex
				bvs .2

				dex
				dex

.2				>PUSHW L.MSG.TYPES,x
				>PUSHW ZPAddrPtr
				>PUSHBI 6
				>SYSCALL PrintF
				jmp .1

.8				clc
.9				rts

KW.VC.9			lda #E.STACKERROR
				sec
				rts
*--------------------------------------
KW.VARIABLE		lda #SYM.T.VAR
				bra KM.VC
*--------------------------------------
KW.CONSTANT		lda #SYM.T.CONST

KM.VC			sta ZPType

				lda pStack
				beq KW.VC.9

				cmp #$FF
				bcs KW.VC.9

				>PUSHB.G hSList
				>PUSHW ZPCLBufPtr
				>PUSHWI 0				ScopeID
				>SYSCALL SListNewKey
				bcs .9

				>STYA ZPKeyID

				txa
				jsr NextKW

				bit ZPType
				bvs .1

				>PULLW ZPAddrPtr

				bra .2

.1				>PULLA
				sta (ZPDataPtr)
				>PULLA
				ldy #1
				sta (ZPDataPtr),y

				>LDYA ZPDataPtr
				>STYA ZPAddrPtr

				lda ZPDataPtr
				clc
				adc #2
				sta ZPDataPtr
				bcc .2

				inc ZPDataPtr+1

.2				>PUSHB.G hSList
				>PUSHW ZPKeyID
				>PUSHWI ZPType
				>PUSHWI 4
				>SYSCALL SListAddData

.9				rts
*--------------------------------------
KW.BCOLON		>PUSHB.G hSList
				>PUSHW ZPCLBufPtr
				>PUSHWI 0				ScopeID
				>SYSCALL SListNewKey
				bcs .9

				>STYA ZPKeyID

				txa
				jsr NextKW

				lda #SYM.T.CODE
				sta ZPType

				>LDYA ZPCodePtr
				>STYA ZPAddrPtr

				>PUSHB.G hSList
				>PUSHW ZPKeyID
				>PUSHWI ZPType
				>PUSHWI 4
				>SYSCALL SListAddData
				bcs .9

				sec
				ror bCompile

				clc
.9				rts
*--------------------------------------
KW.ACODE
*--------------------------------------
KW.FCODE

				lda #E.SYN
				sec
				rts
*--------------------------------------
MAN
SAVE usr/src/bin/forth.s.kw
LOAD usr/src/bin/forth.s
ASM
