NEW
  AUTO 3,1
*---------------------------------------
DIR.Reset		lda #$ff
				>STA.G ASM.LI.ON
				iny						#ASM.LI.CON
				sta (pData),y
				iny						#ASM.LI.MON
				sta (pData),y
				iny						#ASM.LI.XON
				sta (pData),y

				>STA.G MAC.StkPtr

				rts
*---------------------------------------
DIR.AC			clc
				rts
*---------------------------------------
DIR.AT			sec
				.HS 90					BCC
*---------------------------------------
DIR.AS			clc
				lda #0
				ror
				sta DIR.Byte			Save b7 of last char in string
				jsr	SRC.GetNextChar
				bcs .9

				cmp #'-'
				bne .1

				lda #$40				save b7 status of ALL chars
				tsb DIR.Byte

				jsr	SRC.GetNextChar
				bcs .9

.1				sta DIR.Word			Save delimiter....
				sta DIR.Word+1			Save also in prev char..

.2				jsr	SRC.GetNextChar
				bcs .8

				cmp DIR.Word			delimiter ?
				beq .8

				ldx DIR.Word+1			Get prev char
				sta DIR.Word+1			replace it with new
				txa
				cmp DIR.Word			is it the starting delimiter
				beq .2					yes, skip

				bit DIR.Byte
				bvc .3

				ora #$80

.3				jsr OUT.EmitByte		no, emit prev char
				bcc .2

.9				lda #E.SYNTAX.ERROR
				sec
				rts

.8				lda DIR.Word+1			Get prev char
				cmp DIR.Word			someone typed .AS "" ?
				beq .88

				bit DIR.Byte
				bpl .81

				eor #$80

.81				jmp OUT.EmitByte

.88				clc
DIR.AS.RTS		rts
*---------------------------------------
DIR.AZ			jsr DIR.AS
				bcs DIR.AS.RTS
				lda #0
				jmp OUT.EmitByte
*---------------------------------------
DIR.PS			jsr SRC.GetNextChar
				bcs .9

				sta DIR.Word			Save delimiter....

				ldx #$ff
				ldy #1					skip delimiter

.1				inx
				lda (ZPLinePtr),y
				beq .9

				cmp #$0D
				beq .9

				iny

				cmp DIR.Word
				bne .1

				txa
				jsr OUT.EmitByte		emit length
				bcs .9

.2				jsr SRC.GetNextChar
				jsr OUT.EmitByte
				bcs .9

				dex
				bne .2

				jsr SRC.GetNextChar		skip delimiter

				clc
				rts

.9				lda #E.SYNTAX.ERROR
				sec
				rts
*---------------------------------------
DIR.CS			jsr SRC.GetNextChar
				bcs .9

				stz DIR.Byte

				cmp #'-'
				bne .1

				ror DIR.Byte			save b7 status of ALL chars

				jsr	SRC.GetNextChar
				bcs .9

.1				sta DIR.Word			Save delimiter....

.2				jsr	SRC.GetNextChar
				bcs .9

				cmp DIR.Word			delimiter ?
				beq .8

				cmp #'\'
				bne .7

				jsr	SRC.GetNextChar
				bcs .9

				ldx #DIR.EscChars.L-1

.3				cmp DIR.EscChars,x
				beq .4

				dex
				bpl .3

				bmi .9

.4				lda DIR.EscCodes,x

.7				ora DIR.Byte

				jsr OUT.EmitByte
				bcc .2

.9				lda #E.SYNTAX.ERROR
				sec
				rts

.8				clc
DIR.CZ.RTS		rts
*---------------------------------------
DIR.CZ			jsr DIR.CS
				bcs DIR.CZ.RTS
				lda #0
				jmp OUT.EmitByte
*---------------------------------------
DIR.BS			jsr SRC.GetNextCharNB
				bcs .98

				jsr EXP.ResetAcc

				jsr EXP.Eval
				bcs .9

				lda SRC.ACC+3
				ora SRC.ACC+2
				bne .99

				lda SRC.ACC
				eor #$ff
				sta DIR.Word

				lda SRC.ACC+1
				eor #$ff
				sta DIR.Word+1

				stz DIR.Byte
				jsr SRC.GetChar
				bcs .1

				cmp #C.SPACE
				beq .1

				cmp #','
				bne .98

				jsr EXP.ResetAcc

				jsr EXP.Eval
				bcs .9

				lda SRC.ACC+3
				ora SRC.ACC+2
				ora SRC.ACC+1
				bne .99

				lda SRC.ACC
				sta DIR.Byte

.1				inc DIR.Word
				bne .2
				inc DIR.Word+1
				beq .8

.2				lda DIR.Byte
				jsr OUT.EmitByte
				bcc .1
				rts

.8				clc
.9				rts

.99				lda #E.RANGE
				sec
				rts

.98				lda #E.SYNTAX.ERROR
				sec
				rts
*---------------------------------------
DIR.DA			jsr SRC.GetNextCharNB
				bcs .98

.1				jsr EXP.ResetAcc

				jsr EXP.Eval
				bcs .9

				ldy #0
				ldx SRC.ACC.SIZE

.2				lda SRC.ACC,y
				jsr OUT.EmitByte
				bcs .9

				iny
				dex
				bne .2

.3				jsr	SRC.GetChar
				bcs .8

				cmp #C.SPACE
				beq .8

				cmp #','
				bne .98

				jsr	SRC.GetNextChar
				bcc .1

.98				lda #E.SYNTAX.ERROR
				sec
.9				rts

.8				clc
				rts
*---------------------------------------
DIR.DO			>LDA.G ASM.DO.StackPtr
				tay
				inc
				cmp #DO.MAXDEPTH
				bcs .98

				tya
				beq .1

*				clc
				adc #ASM.DO.Stack-1
				tay

				lda (pData),y			Previous DO is false?
				bne .1

				>INC.G ASM.DO.StackPtr	yes,stack FALSE

*				clc
				adc #ASM.DO.Stack-1
				tay
				lda #0
				bra .8

.1				jsr	SRC.GetNextCharNB
				bcs .99

				jsr EXP.ResetAcc

				jsr EXP.Eval
				bcs .99

				>INC.G ASM.DO.StackPtr
*				clc
				adc #ASM.DO.Stack-1
				tay
				lda SRC.ACC
				ora SRC.ACC+1
				ora SRC.ACC+2
				ora SRC.ACC+3
				beq .8
				lda #$ff

.8				sta (pData),y

				clc
				rts

.98				lda #E.TOO.MANY.DO
				sec
.99				rts
*---------------------------------------
DIR.EL			>LDA.G ASM.DO.StackPtr
				beq .9

				tax
				dec
				beq .1					no previous DO context

				clc
				adc #ASM.DO.Stack-1
				tay
				lda (pData),y
				beq .8					previous is FALSE

.1				txa
				clc
				adc #ASM.DO.Stack-1
				tay
				lda (pData),y
				eor #$ff
				sta (pData),y

.8				clc
				rts

.9				lda #E.ELSE.WITHOUT.DO
				sec
				rts
*---------------------------------------
DIR.EM			lda #E.MACRO.INV.DEF
				sec
				rts
*---------------------------------------
DIR.DU			>LDA.G ASM.DU.ON
				bmi DIR.EP.ILLEGAL

				lda #$80
				sta (pData),y

				ldy #ASM.PC.DU
				jmp DIR.SavePC
*---------------------------------------
DIR.PH			>LDA.G ASM.PH.ON
				bmi DIR.EP.ILLEGAL

				lda #$80
				sta (pData),y
				ldy #ASM.PC.PH
				jsr DIR.SavePC

				jmp DIR.OR
*---------------------------------------
DIR.ED			>LDA.G ASM.DU.ON
				bpl DIR.EP.ILLEGAL

				lda #0
				sta (pData),y

				ldy #ASM.PC.DU
				jmp DIR.RestorePC
*---------------------------------------
DIR.EP			>LDA.G ASM.PH.ON
				bpl .9

				lda #0
				sta (pData),y
				ldy #ASM.PC.PH
				jmp DIR.RestorePC
.9
DIR.EP.ILLEGAL	lda #E.ILLEGAL.DIR
				sec
DIR.EP.RTS		rts
*---------------------------------------
DIR.SE			sec
				.HS 90					BCC
*---------------------------------------
DIR.EQ			clc

				lda #$ff
				>STA.G OUT.bEquate

				>LDA.G SYM.BufPtr
				beq DIR.EP.ILLEGAL		not in global symbol context

				eor #SYMG
				beq .1

				bcs DIR.EP.ILLEGAL		.SE not allowed in local/private
				bcc .10					.EQ in local, skip F update

.1				ror						A = 0 : CS = SYMG.F.RW

				ora #SYMG.F.EQU
				sta SRC.ACC.F

.10				jsr	SRC.GetNextCharNB
				bcs .9

				jsr EXP.ResetAccV		keep F

				jsr EXP.Eval
				bcs DIR.EP.RTS

				>LDA.G SYM.BufPtr

				cmp #SYMG
				beq .12

				tay
				ldx #3					we are in local/private

.11				lda SRC.ACC,x			update value
				dey
				sta (ZPSymbolBuf),y
				dex
				bpl .11

				clc
				rts

.12				ldy #SYMG-1

.13				lda SRC.ACC.F,y
				sta (ZPSymbolBuf),y
				dey
				bpl .13

				>LDA.G ASM.PASS
				bne .2

				jmp SYM.StoreGlobal

.2				jmp SYM.UpdateGlobal

.9				lda #E.SYNTAX.ERROR
				sec
				rts
*---------------------------------------
DIR.FI			>LDA.G ASM.DO.StackPtr
				beq DIR.EP.ILLEGAL

				dec
				sta (pData),y

				clc
				rts
*---------------------------------------
DIR.HS			clc
				.HS B0					BCS
				
DIR.HX			sec
				ror DIR.Word

				jsr SRC.GetNextCharNB
				bcs .99

				jsr SRC.IsDigit16
				bcs .99

.1				sta DIR.Byte
				jsr	SRC.GetNextChar
				bcc .2

				jmp OUT.EmitByte

.2				jsr SRC.IsDigit16
				bcc .3

				cmp #','
				beq .22

				cmp #'.'
				bne .99

.22				lda DIR.Byte
				jsr OUT.EmitByte
				bcc .5
				rts
*---------------------------------------
.3				bit DIR.Word
				bmi .30
				
				asl DIR.Byte
				asl DIR.Byte
				asl DIR.Byte
				asl DIR.Byte
				
				bra .4
				
.30				asl
				asl
				asl
				asl

.4				ora DIR.Byte
				jsr OUT.EmitByte
				bcs .9

				jsr	SRC.GetNextChar
				bcs .8

				cmp #C.SPACE
				beq .8

				jsr SRC.IsDigit16
				bcc .1

				cmp #','
				beq .5

				cmp #'.'
				bne .99

.5				jsr	SRC.GetNextChar
				bcs .99

				jsr SRC.IsDigit16
				bcc .1

.99				lda #E.SYNTAX.ERROR
				sec
.9				rts

.8				clc
				rts
*---------------------------------------
DIR.IN			jsr SRC.GetNextCharNB
				bcs .9

				>LDYA ZPLinePtr
				jmp FIO.OpenFile

.9				lda #E.SYNTAX.ERROR
				sec
				rts
*---------------------------------------
DIR.LI			jsr SRC.GetNextChar
				bcs .9

				>LDYA L.T.LI
				jsr SRC.GetKeyword
				bcs .9
				jsr .7

				jsr	SRC.GetChar
				bcs .8
				cmp #','
				beq DIR.LI

				cmp #C.SPACE
				beq .8

.9				lda #E.SYNTAX.ERROR
				sec
				rts

.7				jmp (J.LI,x)

.8				clc
				rts

DIR.LI.ON		ldy #ASM.LI.ON
				sec
				bra DIR.LI.APPLY

DIR.LI.OFF		ldy #ASM.LI.ON
				clc
				bra DIR.LI.APPLY

DIR.LI.CON		ldy #ASM.LI.CON
				sec
				bra DIR.LI.APPLY

DIR.LI.COFF		ldy #ASM.LI.CON
				clc
				bra DIR.LI.APPLY

DIR.LI.MON		ldy #ASM.LI.MON
				sec
				bra DIR.LI.APPLY

DIR.LI.MOFF		ldy #ASM.LI.MON
				clc
				bra DIR.LI.APPLY

DIR.LI.XON		ldy #ASM.LI.XON
				sec
				bra DIR.LI.APPLY

DIR.LI.XOFF		ldy #ASM.LI.XON
				clc
DIR.LI.APPLY	lda #0
				ror

				sta (pData),y
				rts
*---------------------------------------
DIR.MA			>LDA.G ASM.MA.ON
				bmi .9

				>LDA.G ASM.PASS		If Pass#2, ignore
				bne .8

				jsr SRC.GetNextCharNB
				beq DIR.OP.SYNERR

				>PUSHB.G MAC.hList
				>PUSHW ZPLinePtr
				>PUSHWI 0				ScopeID
				>SYSCALL SListNewKey
				bcs .99

				>STYA.G MAC.ID

.8				lda #$ff
				>STA.G ASM.MA.ON
				clc
				rts

.9				lda #E.MACRO.INV.DEF
				sec
.99				rts
*---------------------------------------
DIR.OP			jsr SRC.GetNextCharNB
				bcs DIR.OP.SYNERR
				>LDYA ZPLinePtr

				jmp FIO.LOAD.CPU

DIR.OP.SYNERR	lda #E.SYNTAX.ERROR
				sec
				rts
*---------------------------------------
DIR.OR			jsr SRC.GetNextCharNB
				bcs DIR.OP.SYNERR

				jsr EXP.ResetAcc

				jsr EXP.Eval
				bcs .9

				ldx #0
				ldy #ASM.PC

.1				lda SRC.ACC,x
				sta (pData),y
				iny
				inx
				cpx #4
				bne .1

				>LDA.G ASM.DU.ON
				bmi .8

				>LDA.G ASM.PH.ON
				bmi .8

				lda SRC.ACC
				>STA.G DST.AUXTYPE
				lda SRC.ACC+1
				iny
				sta (pData),y

.8				clc
.9				rts
*---------------------------------------
DIR.EN
*---------------------------------------
DIR.PG
*---------------------------------------
DIR.TI
*---------------------------------------
DIR.US
*---------------------------------------
DIR.TA

DIR.TA.8		clc
DIR.TA.RTS		rts
*---------------------------------------
DIR.TF			>LDA.G ASM.PASS			If Pass#1, ignore
				beq DIR.TA.8

				>LDA.G ArgDstFile
				beq .1

				>SYSCALL ArgV
				bra .2

.1				jsr SRC.GetNextCharNB
				bcs DIR.OP.SYNERR

				>LDYA ZPLinePtr

.2				>SYSCALL StrDup
				bcs DIR.TA.RTS
				>STYA ZPPtr1
				stx ZPPtr2

				lda #S.FI.T.BIN
				sta ZPPtr2+1

				ldy #$ff

.3				iny
				lda (ZPPtr1),y
				beq .7
				cmp #','
				bne .3

				lda #0
				sta (ZPPtr1),y

				iny
				lda (ZPPtr1),y
				cmp #'T'
				beq .4

.30				lda #E.SYNTAX.ERROR
				bra .9

.4				ldx #0

.5				iny
				lda (ZPPtr1),y
				cmp DIR.SYS,x			including \0
				bne .30
				inx
				cpx #4
				bne .5

				lda #S.FI.T.SYS
				sta ZPPtr2+1

.7				>PUSHW ZPPtr1
				>PUSHWZ					Allocate
				>SYSCALL RealPath
				bcs .9

				txa
				>STA.G DST.hFILENAME
				>SYSCALL GetMemPtr
				>PUSHYA
				>PUSHBI O.WRONLY+O.CREATE
				>PUSHB ZPPtr2+1			Type
				>PUSHW.G DST.AUXTYPE
				>SYSCALL FOpen
				bcs .9

				>STA.G DST.hREFNUM

				clc

.9				php
				pha
				lda ZPPtr2
				>SYSCALL FreeMem
				pla
				plp

				rts
*---------------------------------------
DIR.SavePC		phy
				plx
				ldy #ASM.PC+3

.1				lda (pData),y
				pha
				dey
				cpy #ASM.PC-1
				bne .1

				phx
				ply
				ldx #3

.2				pla
				sta (pData),y
				iny
				dex
				bpl .2

				clc
				rts
*---------------------------------------
DIR.RestorePC	ldx #3

.1				lda (pData),y
				pha
				iny
				dex
				bpl .1

				ldy #ASM.PC+3
				ldx #3

.2				pla
				sta (pData),y
				dey
				dex
				bpl .2

				clc						because of JMP to it
				rts
*---------------------------------------
MAN
SAVE usr/src/bin/asm.s.dir
LOAD usr/src/bin/asm.s
ASM
