NEW AUTO 3,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