NEW
  AUTO 3,1
				.LIST OFF
*--------------------------------------
CORE.Init		ldy #CCS.MAX
				sty pCCS

				>LDYAI CODESEG
				>SYSCALL GetMem
				bcs .90

				>STYA ZPCodeBufPtr
				txa
				>STA.G hCodeBuf

				>LDYAI DATASEG
				>SYSCALL GetMem
				bcs .9

				>STYA ZPDataBufPtr
				txa
				>STA.G hDataBuf

				lda #SL..+SL._
				>SYSCALL SListNew
.90				bcs .9

				>STA.G hLabels

				lda #SL..+SL._
				>SYSCALL SListNew
				bcs .9

				>STA.G hVars

				>LDYAI STRVSEG
				>SYSCALL StrVNew
				bcs .9

				sta hStrings

				>LDYAI 256
				>SYSCALL GetMem
				bcs .9

				>STYA ZPStrBuf1
				txa
				>STA.G hStrBuf1

				>LDYAI 256
				>SYSCALL GetMem
				bcs .9

				>STYA ZPStrBuf2
				txa
				>STA.G hStrBuf2

				>LDYAI FWREF
				>SYSCALL GetMem

				>STYA ZPFWRefBufPtr
				txa
				>STA.G hFWRefBuf

				lda #0
				sta (ZPFWRefBufPtr)

				clc
.9				rts
*--------------------------------------
CORE.Quit		lda hStrings
				beq .1

				>SYSCALL StrVFree

.1				ldy #hStrBuf2
				jsr CORE.Quit.Freemem

				ldy #hStrBuf1
				jsr CORE.Quit.Freemem

				ldy #hDataBuf
				jsr CORE.Quit.Freemem

				ldy #hCodeBuf
				jsr CORE.Quit.Freemem
*--------------------------------------
CORE.Cleanup	ldy #hFWRefBuf
				jsr CORE.Quit.Freemem

				>LDA.G hVars
				beq .1

				>SYSCALL SListFree

				>STZ.G hVars

.1				>LDA.G hLabels
				beq .8

				>SYSCALL SListFree

				>STZ.G hLabels

.8				clc
CORE.Quit.RTS	rts
*--------------------------------------
CORE.Quit.Freemem
				lda (pData),y
				beq .8

				pha
				lda #0
				sta (pData),y
				pla

				>SYSCALL FreeMem

.8				rts
*--------------------------------------
CORE.Compile	jsr CORE.GetChar
				bcs CORE.Quit.RTS

				cmp #'#'
				beq .80					#/bin/acos....

				cmp #';'
				bne .1

.80				jmp CORE.SkipLine		Comment: skip line...

.1				cmp #C.CR
				beq .88 				EOL

				jsr CORE.CheckCharNB
				bcs .2					CS=SPACE -> go check VAR or KW

				jsr CORE.IsLetter		LABEL must start with a letter
				bcs .39

				jsr CORE.CreateLabel
				bcs .99

				bra .8
*--------------------------------------
.2				jsr CORE.GetNextCharNB	skip SPACE(s) or ":"
				bcs .99

.21				cmp #C.CR
				beq .88 				EOL

				jsr CORE.IsLetter
				bcs .90

				>LDYA L.ACOS.KW
				jsr CORE.LookupSkip
				bcs .3

				jsr CORE.KW.JMP
				bcs .99

				bra .8
*--------------------------------------
.3				jsr CORE.CreateOrGetVar
.39				bcs .99

				jsr CORE.GetCharNB
				bcs .90

				cmp #'='
				bne .90

				jsr CORE.GetNextCharNB	skip '='
				bcs .90

				jsr EXP.Eval			VAR.TYPE set by CreateOrGetVar
				bcs .99

				lda VAR.TYPE
				cmp EXP.TYPE
				bne .91

				tax
				beq .4

				jsr CODE.LDVARDDRI

				ldx #RT.StrSet.ID
				jsr CODE.JSRRT			Store String in hSTRV
				bra .8

.4				jsr CODE.LDVARDDRI

				ldx #RT.IntSet.ID
				jsr CODE.JSRRT			Store Int16 result in DATASEG
*--------------------------------------
.8				jsr CORE.GetCharNB
				bcs .88

				cmp #':'
				beq .2					go skip : and continue

				bra .21

.88				ldy pCCS
				bmi .89

				lda (pData),y
				cmp #KWID.IF
				bne .89

				jsr KW.ENDIF
				bcs .99

.89				clc

				jmp CORE.GetNextChar	skip char

.90				lda #E.CSYN
				sec
.99				rts

.91				lda #E.TMISMATCH
				sec
				rts
*--------------------------------------
CORE.KW.JMP		jmp (J.ACOS.KW,x)
*--------------------------------------
CORE.FWREF		>LDYA L.MSG.FWREF
				>SYSCALL PutS

				>LDA.G hFWRefBuf
				>SYSCALL GetMemPtr
				>STYA ZPInputBufPtr

.1				lda (ZPInputBufPtr)
				beq .8

.2				sta ZPPtr1+1

				jsr CORE.GetNextChar
				sta ZPPtr1

				jsr CORE.GetNextChar

				jsr CORE.GetLabel
				bcs .9

				lda VAR.ADDR
				sta (ZPPtr1)
				ldy #1
				lda VAR.ADDR+1
				sta (ZPPtr1),y

				jsr CORE.GetNextChar	skip \0
				bcc .2

.8				clc
				rts

.9				>PUSHW L.MSG.FWREFERR
				>PUSHW ZPInputBufPtr
				>PUSHBI 2
				>SYSCALL PrintF

				lda #E.CSYN
				sec
				rts
*--------------------------------------
CORE.Run		jsr CORE.Cleanup

				>PUSHW L.MSG.RUN

				lda ZPCodeBufPtr
				sta ZPPtr1

				lda ZPCodeBufPtr+1
				sta ZPPtr1+1

				>LDA.G hCodeBuf
				>SYSCALL GetMemPtr
				>STYA ZPCodeBufPtr

				lda ZPPtr1
				sec
				sbc ZPCodeBufPtr
				pha

				lda ZPPtr1+1
				sbc ZPCodeBufPtr+1
				>PUSHA
				pla
				>PUSHA					Code Size

				lda ZPDataBufPtr
				sta ZPPtr1

				lda ZPDataBufPtr+1
				sta ZPPtr1+1

				>LDA.G hDataBuf
				>SYSCALL GetMemPtr
				>STYA ZPDataBufPtr

				lda ZPPtr1
				sec
				sbc ZPDataBufPtr
				pha
				eor #$ff
				sta ZPPtr2

				lda ZPPtr1+1
				sbc ZPDataBufPtr+1
				>PUSHA
				eor #$ff
				sta ZPPtr2+1

				pla
				>PUSHA					Data Size

				>PUSHBI 4
				>SYSCALL PrintF

				lda #0
				tay

.1				inc ZPPtr2
				bne .2

				inc ZPPtr2+1
				beq .8

.2				sta (ZPDataBufPtr),y
				iny
				bne .1
				inc ZPDataBufPtr+1
				bra .1

.8				jmp (ZPCodeBufPtr)
*--------------------------------------
CORE.LookupAOPS	lda (ZPInputBufPtr)
				jsr CORE.IsOPSChar
				bcc .55

				jsr CORE.IsLetter
				bcs .99

				sec

.55				ror bFlag

				>LDYA L.ACOS.AOPS
				>STYA ZPPtr1

				ldx #0

.1				ldy #$ff

.2				jsr .10					get next valid char in src text
				bcs .4

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

				bcc .2					not last char in this keyword

				jsr .10					next char in text...
				bcc .6					valid....failed

.3				tya						Keyword Len

				jmp CORE.SkipA

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

				iny
.5				jsr CORE.IncPtr1		skip chars to next keyword

.6				lda (ZPPtr1)
				bpl .5

				jsr CORE.IncPtr1

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

.9				sec
				rts
*--------------------------------------
.10				iny
				lda (ZPInputBufPtr),y	Get Src text char...
				beq .19					end of text

				bit bFlag
				bmi .11					Letter expected

				jmp CORE.IsOPSChar

.11				jmp CORE.IsLetter

.19				sec
.99				rts
*--------------------------------------
CORE.LookupLOPS	>LDYA L.ACOS.LOPS

CORE.LookupSkip	sec
				.HS	90					BCC
CORE.Lookup		clc
				php

				>STYA ZPPtr1

				ldx #0

.1				ldy #$ff

.2				jsr .10					get next valid char in src text
				bcs .4

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

				bcc .2					not last char in this keyword

				jsr .10					next char in text...
				bcc .6					valid....failed

.3				plp
				bcc .8

				tya						Keyword Len

				jmp CORE.SkipA

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

				iny
.5				jsr CORE.IncPtr1		skip chars to next keyword

.6				lda (ZPPtr1)
				bpl .5

				jsr CORE.IncPtr1

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

				plp

.9				sec
.8				rts
*--------------------------------------
.10				iny
				lda (ZPInputBufPtr),y	Get Src text char...
				beq .9					end of text

				cmp #'$'
				bne .11

				clc
				rts

.11				jmp CORE.IsLetterOrDigit	CS=end of valid chars
*--------------------------------------
CORE.IncPtr1	inc ZPPtr1
				bne .8

				inc ZPPtr1+1

.8				rts
*--------------------------------------
CORE.CreateLabel
				>LDA.G hLabels
				jsr CORE.NewKey
				bcs .9

				>STYA VAR.ID

				>PUSHB.G hLabels
				>PUSHW VAR.ID
				>PUSHWI ZPCodeBufPtr
				>PUSHWI 2				2 bytes : ADDR
				>SYSCALL SListAddData
.9				rts
*--------------------------------------
CORE.GetLabel	>PUSHB.G hLabels
				>PUSHW ZPInputBufPtr
				>PUSHWI 0				ScopeID
				>SYSCALL SListLookup
				bcs .9

				>STYA VAR.ID

				txa
				jsr CORE.SkipA

				>PUSHB.G hLabels
				>PUSHW VAR.ID
				>PUSHWI VAR.ADDR
				>PUSHWI 2				2 bytes : ADDR
				>PUSHWZ					From Start
				>SYSCALL SListGetData

.9				rts
*--------------------------------------
CORE.AddFWRef	lda ZPCodeBufPtr+1

				jsr CORE.2FWRefBuf

				lda ZPCodeBufPtr
				jsr CORE.2FWRefBuf

 				ldy #$ff

.1				iny
				lda (ZPInputBufPtr),y
				beq .8

				jsr CORE.IsIDValid
				bcs .8

				jsr CORE.2FWRefBuf
				bra .1

.8				tya
				jsr CORE.SkipA

				lda #0

				clc
*--------------------------------------
CORE.2FWRefBuf	sta (ZPFWRefBufPtr)
				inc ZPFWRefBufPtr
				bne .8

				inc ZPFWRefBufPtr+1

.8				rts
*--------------------------------------
CORE.CreateOrGetVar
				>LDA.G hVars
				jsr CORE.GetAddr
				bcc .7

				jsr CORE.NewVarKey
				bcs .9

				>STYA VAR.ID

				jsr CORE.GetVarType
				stx VAR.TYPE

				beq .1

				jsr CORE.GetStrID
				bra .2

.1				jsr CORE.GetWord

.2				>STYA VAR.ADDR

				>PUSHB.G hVars
				>PUSHW VAR.ID
				>PUSHWI VAR.ADDR
				>PUSHWI 3				3 bytes : ADDR + TYPE
				>SYSCALL SListAddData
				rts
*--------------------------------------
.7				jsr CORE.GetVarType

				cpx VAR.TYPE
				beq .8

				lda #E.TMISMATCH
				sec
				rts

.8				clc
.9				rts
*--------------------------------------
CORE.NewVarKey	>LDA.G hVars

CORE.NewKey		>PUSHA
				>PUSHW ZPInputBufPtr
				>PUSHWI 0				ScopeID
				>SYSCALL SListNewKey
				bcs .9

				pha

				txa
				jsr CORE.SkipA

				pla						Y,A = KeyID
				clc

.9				rts
*--------------------------------------
CORE.GetAddr	>PUSHA
				>PUSHA					for SListGetData

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

				>STYA VAR.ID

				txa
				jsr CORE.SkipA

.1				>PUSHW VAR.ID
				>PUSHWI VAR.ADDR
				>PUSHWI 3				3 bytes : ADDR + TYPE
				>PUSHWZ					From Start
				>SYSCALL SListGetData
				rts

.9				>POP 1

				rts
*--------------------------------------
CORE.GetVarType	jsr CORE.GetChar
				bcs .9

				cmp #'$'
				bne .9

				inc ZPInputBufPtr
				bne .1

				inc ZPInputBufPtr+1		skip $

.1				tax						NZ

				rts

.9				ldx #0					Z

				rts
*--------------------------------------
CORE.GetWord	lda ZPDataBufPtr
				tay
				clc
				adc #2					Word
				sta ZPDataBufPtr

				lda ZPDataBufPtr+1
				bcc .8

				inc ZPDataBufPtr+1

				clc

.8				rts
*--------------------------------------
CORE.GetStrID	inc STRID
				bne .8

				inc STRID+1

.8				>LDYA STRID
				clc
				rts
*--------------------------------------
CORE.ToUpperCase
				cmp #'a'
				bcc .8

				cmp #'z'+1
				bcs .8

				eor #$20

.8
CORE.ToUpperCase.RTS
				rts
*--------------------------------------
CORE.IsOPSChar	phx

				ldx #ACOS.OPSChars.Cnt-1

.1				cmp ACOS.OPSChars,x
				beq .8

				dex
				bpl .1

				plx
				sec
				rts

.8				plx
				clc
				rts
*--------------------------------------
CORE.IsKW		jsr CORE.IsLetter
				bcs .9

				>LDYA L.ACOS.KW
				jmp CORE.Lookup

.9				rts
*--------------------------------------
CORE.IsEndExp	cmp #')'				CS = true
				beq CORE.ToUpperCase.RTS

				cmp #','
				beq CORE.ToUpperCase.RTS

				cmp #';'
				beq CORE.ToUpperCase.RTS

				cmp #'\'
				beq CORE.ToUpperCase.RTS

CORE.IsEndInst	cmp #':'				CS = true
				beq .8

				cmp #C.CR
				beq .8

				clc

.8				rts
*---------------------------------------
CORE.IsIDValid	cmp #'.'
				clc
				beq CORE.IsLetterRTS
*---------------------------------------
CORE.IsLetterOrDigit
				jsr CORE.IsDigit10
				bcc CORE.IsLetterRTS
*---------------------------------------
CORE.IsLetter	cmp #'_'				CC = true
				bne .1

				clc
				rts

.1				cmp #'A'
				bcc .9

				cmp #'Z'+1
				bcc CORE.IsLetterRTS

				cmp #'a'
				bcc .9

				cmp #'z'+1

				rts						CC if lowercase

.9				sec
CORE.IsLetterRTS
				rts
*---------------------------------------
CORE.IsDigit10	cmp #'0'
				bcc .9

				cmp #'9'+1
				rts						cc if ok, cs if not

.9				sec
				rts
*--------------------------------------
CORE.CheckOP	jsr CORE.GetCharNB
				bcs CORE.CheckCP.CSYN

				cmp #'('
				bne CORE.CheckCP.CSYN

				jsr CORE.GetNextCharNB	skip (
				clc
				rts
*--------------------------------------
CORE.CheckComma	jsr CORE.GetCharNB
				bcs CORE.CheckCP.CSYN

				cmp #','
				bne CORE.CheckCP.CSYN

				jsr CORE.GetNextCharNB	skip ,
				clc
				rts
*--------------------------------------
CORE.CheckCP	jsr CORE.GetCharNB
				bcs CORE.CheckCP.CSYN

				cmp #')'
				bne CORE.CheckCP.CSYN

				jsr CORE.GetNextCharNB	skip )
				clc
				rts

CORE.CheckCP.CSYN
				lda #E.CSYN
				sec
				rts
*--------------------------------------
CORE.CheckCharNB
				cmp #C.SPACE
				beq .9

				cmp #C.LF
				beq .9

				cmp #C.TAB
				beq .9

				clc
.9				rts
*--------------------------------------
CORE.GetCharNB	jsr CORE.GetChar
				bcs CORE.GetNextCharNB.RTS
				jsr CORE.CheckCharNB
				bcc CORE.GetNextCharNB.RTS
*--------------------------------------
CORE.GetNextCharNB
				jsr CORE.GetNextChar
				bcs CORE.GetNextCharNB.RTS

				jsr CORE.CheckCharNB
				bcs CORE.GetNextCharNB

CORE.GetNextCharNB.RTS
				rts
*--------------------------------------
CORE.SkipA		clc
				adc ZPInputBufPtr
				sta ZPInputBufPtr
				bcc .1

				clc
				inc ZPInputBufPtr+1

.1				rts						Exit with CC for JMP to
*--------------------------------------
CORE.SkipLine	jsr CORE.GetNextChar
				bcs CORE.GetNextCharNB.RTS

				cmp #C.CR
				bne CORE.SkipLine
*--------------------------------------
CORE.GetNextChar
				inc ZPInputBufPtr
				bne CORE.GetChar
				inc ZPInputBufPtr+1
*--------------------------------------
CORE.GetChar	lda (ZPInputBufPtr)
				bne .8

				lda #MLI.E.EOF
				sec
				rts

.8				clc
				rts
*--------------------------------------
MAN
SAVE usr/src/bin/acos.s.core
LOAD usr/src/bin/acos.s
ASM
