NEW
  AUTO 3,1
				.LIST OFF
*--------------------------------------
* Built in Keywords
*--------------------------------------
CSH.KW.JMP		txa
				>STA.G CSH.CmdSave
				jmp (J.CSH.KW,x)
*--------------------------------------
CSH.WHILE
CSH.IF			jsr CSH.GetCharNB
				bcs .9

				cmp #'('
				bne .9

				jsr CSH.GetNextCharNB
				bcs .9

				ldy #0					Any var type
				lda #0
				jsr CSH.ExpEval
				bcs .99

				jsr CSH.IsValue0		result in X

				jsr CSH.GetCharNB
				bcs .99

				cmp #')'
				bne .9

				jsr CSH.GetNextCharNB	skip ')'
				bcs .9

				cmp #'{'
				bne .9

				jsr CSH.GetNextCharNB	Skip '{'
				bcs .9

				txa
				beq .6					Value=0, skip {{....}}

				>LDA.G CSH.CmdSave
				beq .1					IF

				pha
				>LDA.G CSH.BufPtrSave+1	WHILE : push loop address...
				jsr CSH.Push
				>LDA.G CSH.BufPtrSave
				jsr CSH.Push
				pla
.1				jsr CSH.Push
				bcs .99

				lda #'}'				Tell '}' is expected at the end of block
				jsr CSH.Push

.99				rts

.6				jsr CSH.SkipBlock

				bcc .99
				
.9				lda #E.CSYN
				sec
				rts
*--------------------------------------
CSH.IF.END		clc
				rts
*--------------------------------------
CSH.WHILE.END	jsr CSH.Pop
				sta ZPInputBufPtr
				jsr CSH.Pop
				sta ZPInputBufPtr+1
				clc
				rts
*--------------------------------------
CSH.ELSE
*--------------------------------------
CSH.DO
CSH.FOR
CSH.SWITCH
CSH.CASE
CSH.BREAK
CSH.CONTINUE
CSH.SIZEOF
*--------------------------------------
CSH.TYPEDEF		lda #E.CSYN
				sec
				rts
*--------------------------------------
CSH.STRUCT		>ENTER 4

				jsr CSH.GetCharNB
				bcs .99

				>LDA.G CSH.hTags
				jsr CSH.NewKey
				bcs .99

				sta (pStack)			Y,A = KeyID
				tya
				ldy #1
				sta (pStack),y

				jsr CSH.GetNextCharNB
				bcs .99

				cmp #'{'
				bne .99

.1				jsr CSH.GetNextCharNB
				bcs .99

				cmp #'}'
				bne .1

				jsr CSH.GetNextCharNB	skip }

				clc
.99				>LEAVE
				rts
*--------------------------------------
* Type Declaration keywords
*--------------------------------------
CSH.CONST		ldy #1
				
				lda (pStack),y
				ora #CSH.Q.CONST
				sta (pStack),y

				jsr CSH.CheckSpace
				bcs .9

				>LDYA L.CSH.TMODS2
				jsr CSH.LookupID
				bcs .9
				
				jmp (J.CSH.TMODS2,x)
				
.9				lda #E.CSYN
				sec
				rts
*--------------------------------------
CSH.SIGNED		sec
				.HS 90					BCC
*--------------------------------------
CSH.UNSIGNED	clc
				php

				jsr CSH.CheckSpace
				bcs .9

				>LDYA L.CSH.TYPES
				jsr CSH.LookupID

				bcs .9

				cpx #CSH.T.UCHAR
				bcc .9					void
				
				cpx #CSH.T.SLONG+1		only char int long allowed
				bcs .9

				plp
				bcs .8

				jmp (J.CSH.UTYPES-2,x)

.8				jmp (J.CSH.STYPES-2,x)

.9				plp

				lda #E.CSYN
				sec
				rts
*--------------------------------------
CSH.SHORT		jsr CSH.CheckSpace
				bcs .9
				
				>LDYA L.CSH.TYPES
				jsr CSH.LookupID

				bcs CSH.UCHAR
				
				cpx #4					only int allowed
				beq CSH.SCHAR
				
.9				lda #E.CSYN
				sec
				rts				
*--------------------------------------
CSH.VOID		lda #CSH.T.VOID
				bra CSH.TYPE

CSH.CHAR
CSH.UCHAR		lda #CSH.T.UCHAR
				bra CSH.TYPE

CSH.SCHAR		lda #CSH.T.SCHAR
				bra CSH.TYPE

CSH.UINT		lda #CSH.T.UINT
				bra CSH.TYPE

CSH.INT
CSH.SINT		lda #CSH.T.SINT
				bra CSH.TYPE

CSH.ULONG		lda #CSH.T.ULONG
				bra CSH.TYPE

CSH.LONG
CSH.SLONG		lda #CSH.T.SLONG
				bra CSH.TYPE

CSH.FLOAT		lda #CSH.T.FLOAT

CSH.TYPE		sta (pStack)

				jsr CSH.GetCharNB
				bcs .9

				ldy #1

.1				cmp #'*'
				bne .10

				lda (pStack),y
				clc
				adc #CSH.Q.POINTER
				bcs .9					more than ***

				sta (pStack),y
				
				jsr CSH.GetNextCharNB
				bcc .1
				
.9				lda #E.CSYN
				sec
.99				rts

.10				jsr CSH.IsLetter
				bcs .8

				>LDYA L.CSH.FTYPES
				jsr CSH.LookupID
				bcs .8					next char is an identifier
				
				sec
				ror bFastCall

				ldy #1
				lda (pStack),y
				ora #CSH.Q.FUNC
				sta (pStack),y

				jsr CSH.GetNextCharNB
				bcs .9					next char is an identifier, ",", "(",")"
				
.8				clc
				rts
*--------------------------------------
MAN
SAVE usr/src/bin/csh.s.kw
LOAD usr/src/bin/csh.s
ASM
