NEW
  PREFIX
AUTO 4,1
*---------------------------------------
* EXP.Modifiers:
* # : 8b,Byte 1 
* / : 8b,Byte 2
* ^ : 8b,Byte 3
* < : 24b,Byte 1,2,3
* > : 32b
*---------------------------------------
* Num Format : 0-9 -> decimal
* 				$ = Hex
*				% = binary
*               & = octal
*               * = PC
*---------------------------------------
EXP.Eval.Missing
				lda #E.MISSING.EXP
				sec
				rts				

EXP.Eval		>STZ.G EXP.Modifier
				>STZ.G EXP.Prefix
				>STZ.G EXP.Operator
				
				jsr SRC.GetChar
				bcs EXP.Eval.Missing
				
				jsr SRC.IsMODReserved
				bcs EXP.Eval.Next
				
				txa
				>STA.G EXP.Modifier
				lda #'#'
				>STA.G EXP.Prefix
				
EXP.Eval.Next0	jsr SRC.GetNextChar
				
EXP.Eval.Next	stz SRC.ACC.F
				lda #2
				sta SRC.ACC.SIZE		Default To WORD (2 bytes)

				stz SRC.ACC
				stz SRC.ACC+1
				stz SRC.ACC+2
				stz SRC.ACC+3
				
				jsr SRC.GetChar
				bcs EXP.Eval.Missing
				
				cmp #'.'				Local Label?
				beq .13

				cmp #':'
				bne .12
				
.13				jsr EXP.GetLocal
				bcs .14			
				
				jmp EXP.EvalOperator
.14				rts
			
.12				cmp #'*'
				bne .10

				ldy #ASM.PC+3
				ldx #3
				
.11				lda (pData),y
				sta SRC.ACC,x
				dey
				dex
				bpl .11

				jsr SRC.GetNextChar
				jmp EXP.EvalOperator
				
.10				jsr SRC.IsDigit10		Decimal constant ?
				bcs .1
				
				jsr SRC.GetDecimal
				
				bcs EXP.EvalExitRTS
				jmp EXP.EvalOperator
				
.1				cmp #'$'			Hex?
				bne .2
				
				jsr SRC.GetHex
				
				bcs EXP.EvalExitRTS
				bra EXP.EvalOperator
				
				
.2				cmp #'%'			binary?
				bne .3

				jsr SRC.GetBinary
				
				bcs EXP.EvalExitRTS
				bra EXP.EvalOperator
				
				
.3				cmp #'&'			octal?
				bne .4
				jsr SRC.GetOctal
				
				bcs EXP.EvalExitRTS
				bra EXP.EvalOperator					
				
.4				cmp #'''
				bne .43
				jsr SRC.GetNextChar
				bcs EXP.EvalExitSYN
				
				jsr EXP.SetAccA
				jsr SRC.GetNextChar
				bcs EXP.EvalOperator
				cmp #'''
				beq .44
				cmp #','
				bne EXP.EvalExitSYN
				bra EXP.EvalOperator
				
.44				jsr SRC.GetNextChar
				bra EXP.EvalOperator	
				
.43				cmp #'"'
				bne .42
				jsr SRC.GetNextChar
				bcs EXP.EvalExitSYN
				ora #$80
				jsr EXP.SetAccA
				jsr SRC.GetNextChar
				bcs EXP.EvalOperator
				cmp #'"'
				beq .45
				cmp #','
				bne EXP.EvalExitSYN
				bra EXP.EvalOperator
				
.45				jsr SRC.GetNextChar
				bra EXP.EvalOperator	
				
.42				jsr SRC.IsLetter		Symbol ?
				bcs EXP.EvalExitSYN

				jsr EXP.GetGlobal
				bcs EXP.EvalExitUND
				bra EXP.EvalOperator
				
EXP.EvalExitOK	>LDA.G EXP.Modifier
				beq .8
				asl
				tax
				jmp (J.EXP.MOD-2,x)
				
.8				clc
EXP.EvalExitRTS	rts
				
EXP.EvalExitSYN	lda #E.SYNTAX.ERROR
				sec
				rts

EXP.EvalExitUND	lda #E.UNDEF.SYMBOL
				sec
				rts					
*---------------------------------------					
EXP.EvalOperator
				>LDA.G EXP.Operator
				beq .7
				
				jsr EXP.Compute
				bcs EXP.EvalExitRTS
				
.7				jsr SRC.GetChar
				bcs EXP.EvalExitOK

				cmp #' '
				beq EXP.EvalExitOK

				jsr SRC.IsAMReserved
				bcc EXP.EvalExitOK

				jsr SRC.IsEXPReserved
				bcs EXP.EvalExitSYN
				txa
				>STA.G EXP.Operator
				
				ldx #4
				
.8				lda SRC.ACC.SIZE,x
				sta SRC.ARG.SIZE,x
				dex
				bpl .8
				
				jmp EXP.Eval.Next0
*---------------------------------------
EXP.GetLocal	jsr SRC.GetNextChar
				bcs .9
				
				jsr SRC.GetDecimal
				bcs EXP.EvalExitSYN
				lda SRC.ACC+1
				ora SRC.ACC+2
				ora SRC.ACC+3
				bne EXP.EvalExitSYN		Max .255
				ldx SRC.ACC
				beq EXP.EvalExitSYN		.0 is not allowed

				jsr SYM.GetLocalX
				bcc .8
				
				>LDA.G ASM.PASS			pass#2?
				bne EXP.EvalExitUND
				
				lda #SYMG.F.FWREF		Mark ACC as pending
				sta SRC.ACC.F
				stz SRC.ACC.SIZE
				
				clc
				rts
				
.9				lda #E.SYNTAX.ERROR
				sec
.8				rts					
*---------------------------------------					
EXP.GetGlobal	jsr SYM.LookupGlobal
				bcc .8

				>LDA.G ASM.PASS			pass#2?
				bne EXP.EvalExitUND		yes, undefined symbol
				
				lda #SYMG.F.FWREF
				sta SRC.ACC.F			Mark ACC as pending
				stz SRC.ACC.SIZE
				
.1				jsr SRC.GetNextChar
				bcs .8
				
				jsr SRC.IsLetterOrDigit
				bcc .1
				cmp #'.'
				beq .1
				cmp #'_'
				beq .1
				
.8				clc
				rts
*---------------------------------------
EXP.MOD.8.3		lda SRC.ACC+2
				bra EXP.MOD.8
EXP.MOD.8.2		lda SRC.ACC+1
EXP.MOD.8		sta SRC.ACC					
EXP.MOD.8.1		lda #1
				sta SRC.ACC.SIZE
				clc
				rts
EXP.MOD.24		lda #3
				sta SRC.ACC.SIZE
				clc
				rts		
EXP.MOD.32		lda #4
				sta SRC.ACC.SIZE
				clc
				rts		
*---------------------------------------
EXP.Compute		ldx SRC.ACC.SIZE
				beq .1
				ldx SRC.ARG.SIZE
				beq .1
				
				asl
				tax
				jmp (J.EXP.OP-2,x)
				
.1				>LDA.G ASM.PASS
				beq .8
				
				lda #E.UNDEF.SYMBOL
				sec
				rts
				
.8				lda #SYMG.F.FWREF		Mark ACC as pending
				tsb SRC.ACC.F
				stz SRC.ACC.SIZE
				clc
				rts
*---------------------------------------
EXP.OP.EOR		ldx #3

.1				lda SRC.ARG,x
				eor	SRC.ACC,x
				sta SRC.ACC,x
				dex
				bpl .1
				rts
*---------------------------------------
EXP.OP.ORA		ldx #3

.1				lda SRC.ARG,x
				ora	SRC.ACC,x
				sta SRC.ACC,x
				dex
				bpl .1
				rts
*---------------------------------------
EXP.OP.AND		ldx #3

.1				lda SRC.ARG,x
				and	SRC.ACC,x
				sta SRC.ACC,x
				dex
				bpl .1
				rts
*---------------------------------------
EXP.OP.LOW		jsr EXP.OP.SUB

				lda #0
				rol
				
				jmp EXP.SetAccA
*---------------------------------------
EXP.OP.EQU		ldx #0				ARG-ACC->ACC
				ldy #4
				
				clc					il not Equals, return 0
				
.1				lda SRC.ARG,x
				eor	SRC.ACC,x
				bne .2
				inx
				dey
				bne .1

				sec					equals, return 1
				
.2				lda #0
				rol
				sta SRC.ACC

				lda #1
				sta SRC.ACC.SIZE	
				
.9				rts				
*---------------------------------------
EXP.OP.GRT		jsr EXP.OP.SUB

				lda #0
				rol
				eor #1
				
				jmp EXP.SetAccA
*---------------------------------------
EXP.OP.ADD		ldx #0				ARG-ACC->ACC
				ldy #4
		
				clc
				
.1				lda SRC.ARG,x
				adc	SRC.ACC,x
				sta SRC.ACC,x
				inx
				dey
				bne .1
				
				bcc .8
				
				lda #E.VAL.TOO.BIG
.8				rts
*---------------------------------------
EXP.OP.SUB		ldx #0				ARG-ACC->ACC
				ldy #4

				sec

.1				lda SRC.ARG,x
				sbc	SRC.ACC,x
				sta SRC.ACC,x
				inx
				dey
				bne .1
				
				bcs .8
				
				lda #E.VAL.TOO.BIG
				sec
				rts
				
.8				clc
				rts
*---------------------------------------
EXP.OP.MUL
*---------------------------------------
EXP.OP.DIV
				clc
				rts
*---------------------------------------
EXP.SetAccA		sta SRC.ACC
				stz SRC.ACC+1
				stz SRC.ACC+2
				stz SRC.ACC+3
				lda #1
				sta SRC.ACC.SIZE
				clc
				rts
*---------------------------------------
MAN
SAVE USR/SRC/BIN/ASM.S.EXP
LOAD USR/SRC/BIN/ASM.S
ASM
