A2osX/BIN/ASM.S.EXP.txt

455 lines
7.2 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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