NEW
  AUTO 3,1
				.LIST OFF
*--------------------------------------
* In: A = current CHAR
* Out: CC, int16 on stack or pSTR in stack
*--------------------------------------
EXP.Eval		stz EXP.TYPE
*--------------------------------------
EXP.Eval.R		lda EXP.AOP
				pha

				lda #$FF
				>PUSHA					Previous OP = none
*--------------------------------------
.10				jsr CORE.GetCharNB
				bcs .39

.11				cmp #'('
				bne .12

				jsr CORE.GetNextCharNB	skip (
				bcs .39

				jsr EXP.Eval.R
				bcs .39

				jsr CORE.GetCharNB
				bcs .39

				cmp #')'
				sec
				bne .39

				jsr CORE.GetNextCharNB	skip )
				bra .41

.12				cmp #'"'
				bne .20

				jsr EXP.CreateStrConst
				bra .39
*--------------------------------------
.20				jsr CORE.IsLetter
				bcs .30					No, go check for number...

				>LDYA L.ACOS.KW			Yes, KW, FN or VAR ?
				jsr CORE.Lookup
				bcc .80					KW, end of exp

				>LDYA L.ACOS.FN
				jsr CORE.LookupSkip
				bcs .25

				jsr EXP.FNjmpX
				bra .39

.25				jsr EXP.VARLookup
				bra .39
*--------------------------------------
.30				jsr EXP.Int16
*--------------------------------------
.39				bcs .99
*--------------------------------------
.40				jsr CORE.GetCharNB
.41				bcs .80

.50				jsr CORE.IsEndExp
				bcs .80

				jsr CORE.IsKW
				bcc .80

				jsr CORE.LookupLOPS
				bcs .51

				phx
				jsr EXP.ComputeAll		compute all until $FF
				plx

				bcs .99

				txa
				lsr
				adc #14
				>PUSHA
				jsr EXP.Eval.R
				bcs .99

				bra .40

.51				jsr CORE.LookupAOPS
				bcs .90

				stx EXP.AOP

				lda (pStack)			get op context
				bmi .60					no prev op, go get arg2

				cmp EXP.AOP				we have arg1 A=op1 arg2 X=op2
				bcc .60

				inc pStack				prev op has precedence

				tay
				jsr EXP.ComputeY		go compute (arg1 op1 arg2)
				bcs .90

.60				lda EXP.AOP				we must compute arg2 op2 arg3 before
				>PUSHA

				jsr CORE.GetCharNB
				bcs .90
				jmp .11
*--------------------------------------
.80				jsr EXP.ComputeAll		go compute (arg1 op1 arg2)
				bcs .99

				inc pStack				discard $FF

				bra .88

.90				lda #E.ESYN

.99				tay						Save Err code

.98				>PULLA
				tax
				bpl .98

				sec

.88				pla
				sta EXP.AOP

				tya

				rts
*--------------------------------------
EXP.FNjmpX		 jmp (J.ACOS.FN,x)
*--------------------------------------
EXP.CreateStrConst
				lda #'$'
				sta EXP.TYPE

				ldy #0

.1				jsr CORE.GetNextChar
				bcs .9

				cmp #'"'
				beq .2

				sta (ZPStrBuf1),y
				iny
				bne .1

.9				lda #E.ESYN
*				sec
.99				rts

.2				lda #0
				sta (ZPStrBuf1),y

				jsr CORE.GetNextCharNB	skip "

				>PUSHB hStrings
				jsr CORE.GetStrID
				>PUSHYA
				>PUSHW ZPStrBuf1
				>SYSCALL StrVSet
				bcs .99

				ldy STRID
				ldx STRID+1
				clc
				jmp CODE.PUSHYXI		push StrID on stack
*--------------------------------------
EXP.Int16		jsr CORE.IsDigit10
				bcc .1

				cmp #'-'
				bne .90

.1				>PUSHW ZPInputBufPtr
				>PUSHWI ZPInputBufPtr
				>PUSHBI 10
				>SYSCALL StrToL
				bcs .99

				jsr CODE.PUSHINT16

				>POP 4					Discard long on stack

				clc
				rts

.90				lda #E.ESYN
				sec
.99				rts
*--------------------------------------
EXP.VARLookup	>LDA.G hVars

				>PUSHA
				>PUSHA					for SListGetData/SListAddData

				>PUSHW ZPInputBufPtr
				>PUSHWI 0				ScopeID
				>SYSCALL SListLookup
				bcs .3

				>PUSHYA					KeyID

				txa
				jsr CORE.SkipA

.1				>PUSHWI EXP.ADDR
				>PUSHWI 3				3 bytes : ADDR + TYPE
				>PUSHWZ					From Start
				>SYSCALL SListGetData
				bcs .99

				jsr CORE.GetVarType

				cpx EXP.TYPE
				beq .7

				lda #E.TMISMATCH
				sec
.99				rts
*--------------------------------------
.3				jsr CORE.NewVarKey
				bcs .9

				>PUSHYA 				SID

				jsr CORE.GetVarType
				stx EXP.TYPE
				beq .4

				jsr CORE.GetStrID
				bra .5

.4				jsr CORE.GetWord
.5				>STYA EXP.ADDR

				>PUSHWI EXP.ADDR
				>PUSHWI 3				3 bytes : ADDR + TYPE
				>SYSCALL SListAddData
				bcc .7

.9				inc pStack				discard extra hVars
				rts
*--------------------------------------
.7				ldy EXP.ADDR
				ldx EXP.ADDR+1

				lda EXP.TYPE
				bne .8

				jsr CODE.LDYXI

				ldx #RT.IntGet.ID
				clc
				jmp CODE.JSRRT

.8				clc
				jmp CODE.PUSHYXI
*--------------------------------------
EXP.ComputeAll	lda (pStack)
				bmi .8					nothing to do

				inc pStack

				tay
				jsr EXP.ComputeY		go compute (arg1 op1 arg2)
				bcc EXP.ComputeAll

*				sec
				rts

.8				clc
				rts
*--------------------------------------
EXP.ComputeY	lda EXP.TYPE
				bne .1

				ldx ACOS.AOPS2FPU,y
				jsr CODE.FPUCALL
				clc
				rts

.1				cpy #3					+
				bne .2

				ldx #RT.StrAdd.ID
				clc
				jmp CODE.JSRRT

.2				stz EXP.TYPE			at the end ....TRUE/FALSE is int

				cpy #11					<>
				bne .3

				ldx #RT.StrCmp.ID
				clc
				jmp CODE.JSRRT

.3				cpy #13					=
				bne .9

				ldx #RT.StrCmp.ID
				jsr CODE.JSRRT

				ldx #RT.NOT.ID
				clc
				jmp CODE.JSRRT

.9				lda #E.TMISMATCH
				sec
				rts
*--------------------------------------
MAN
SAVE usr/src/bin/acos.s.exp
LOAD usr/src/bin/acos.s
ASM
