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 >STA.G EXP.Prefix >STA.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 stz SRC.ACC+1 stz SRC.ACC+2 stz SRC.ACC+3 jsr SRC.GetChar bcs EXP.Eval.Missing cmp #'.' Local Label? bne .12 >LDA.G MAC.StkPtr bne .9 illegal INSIDE macro bra .13 .12 cmp #':' bne .14 >LDA.G MAC.StkPtr beq .9 illegal OUTSIDE macro .13 jsr EXP.GetLocal bcs .99 jmp EXP.EvalOperator .14 cmp #'*' bne .10 jsr SYM.PC2Acc jsr SRC.GetNextChar jmp EXP.EvalOperator .9 lda #E.INV.LABEL sec .99 rts *--------------------------------------- .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 jmp EXP.EvalOperator .2 cmp #'%' binary? bne .3 jsr SRC.GetBinary bcs EXP.EvalExitRTS jmp 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 SYM.LookupGlobal bcc EXP.EvalOperator EXP.EvalExitRTS rts EXP.EvalExitOK >LDA.G EXP.Modifier beq .1 asl tax lda #SYMG.F.FWREF Reset FW flag because of IMM modifier trb SRC.ACC.F jmp (J.EXP.MOD-2,x) .1 clc 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 no previous OP.... asl tax lda SRC.ACC.F ora SRC.ARG.F and #SYMG.F.FWREF tsb SRC.ACC.F jsr EXP.Compute ARG op ACC -> ACC bcc .7 tax >LDA.G ASM.PASS beq .7 Ignore error ... txa rts .7 jsr SRC.GetChar bcs EXP.EvalExitOK cmp #C.SPACE beq EXP.EvalExitOK jsr SRC.IsAMReserved bcc EXP.EvalExitOK jsr SRC.IsEXPReserved bcs EXP.EvalExitSYN txa >STA.G EXP.Operator ldx #3 .8 lda SRC.ACC,x sta SRC.ARG,x dex bpl .8 lda SRC.ACC.F sta SRC.ARG.F jmp EXP.Eval.Next0 *--------------------------------------- EXP.GetLocal jsr SRC.GetNextChar bcs .9 jsr SRC.GetDecimal8 bcs EXP.EvalExitSYN tax jsr SYM.LookupLocalX bcc .8 >LDA.G ASM.PASS pass#2? bne EXP.EvalExitUND lda #SYMG.F.FWREF tsb SRC.ACC.F lda #2 sta SRC.ACC.SIZE lda #$ff sta SRC.ACC sta SRC.ACC+1 clc rts .9 lda #E.SYNTAX.ERROR sec .8 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 jmp (J.EXP.OP-2,x) *--------------------------------------- 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.EQU ldx #0 ARG-ACC->ACC ldy #4 clc if 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 jmp EXP.SetAccA *--------------------------------------- EXP.OP.LWR jsr EXP.SUB bcc .2 ldx #3 .1 lda SRC.ACC,x bne .2 dex bpl .1 clc .2 lda #0 rol jmp EXP.SetAccA *--------------------------------------- EXP.OP.GRT jsr EXP.SUB bcc .2 ldx #3 .1 lda SRC.ACC,x bne .2 dex bpl .1 clc .2 lda #0 rol 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 jsr EXP.SUB bcs .8 lda #E.VAL.TOO.BIG sec rts .8 clc rts *--------------------------------------- EXP.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 rts *--------------------------------------- EXP.OP.MUL >PUSHL SRC.ARG >PUSHL SRC.ACC >FPU uMUL >PULLL SRC.ACC clc rts *--------------------------------------- EXP.OP.DIV >PUSHL SRC.ARG >PUSHL SRC.ACC >FPU uDIV >PULLL SRC.ACC clc rts *--------------------------------------- EXP.ResetAcc stz SRC.ACC.F EXP.ResetAccV lda #2 sta SRC.ACC.SIZE stz SRC.ACC stz SRC.ACC+1 stz SRC.ACC+2 stz SRC.ACC+3 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 *--------------------------------------- .DO ASMDBG=1 EXP.DBG >SYSCALL putchar >PUSHW L.MSG.DBG >PUSHB.G MAC.CtxID >PUSHL SRC.ARG >PUSHL SRC.ACC >PUSHB SRC.ACC.F >PUSHB SRC.ACC.SIZE >PUSHBI 11 >SYSCALL PrintF * >DEBUG rts .FIN *--------------------------------------- MAN SAVE usr/src/bin/asm.s.exp LOAD usr/src/bin/asm.s ASM