Work In Progress (ASM)

This commit is contained in:
Rémy GIBERT 2015-11-27 17:26:11 +01:00
parent 3537472fa1
commit 49ba85b7da
4 changed files with 243 additions and 105 deletions

View File

@ -16,8 +16,22 @@ AUTO 6
EXP.Eval stz EXP.Operator
jsr SRC.GetCharNB
beq .98
cmp #'*'
bne .13
lda #ERR.MISSING.EXP
sec
.14 rts
.13 cmp #'.' Local Label?
bne .12
jsr EXP.GetLocal
bcs .14
jmp EXP.EvalOperator
.12 cmp #'*'
bne .10
ldy #ASM.PC+3
@ -30,7 +44,7 @@ EXP.Eval stz EXP.Operator
bpl .11
jsr SRC.GetCharNB
bne .97
bne EXP.EvalExitSYN
clc
rts
@ -39,79 +53,154 @@ EXP.Eval stz EXP.Operator
dec SRC.BufPtr
jsr SRC.GetDecimal
bcs .97
bra .8
bcs EXP.EvalExitSYN
bra EXP.EvalOperator
.1 cmp #'$' Hex?
bne .2
jsr SRC.GetHex
bcs .97
bra .8
bcs EXP.EvalExitSYN
bra EXP.EvalOperator
.2 cmp #'%' binary?
bne .3
jsr SRC.GetBinary
bcs .97
bra .8
bcs EXP.EvalExitSYN
bra EXP.EvalOperator
.3 cmp #'&' octal?
bne .4
jsr SRC.GetOctal
bcs .97
bra .8
bcs EXP.EvalExitSYN
bra EXP.EvalOperator
.4 jsr SRC.IsLetter Symbol ?
bcs .97
.4 cmp #'''
bne .43
jsr SRC.GetChar
beq EXP.EvalExitSYN
jsr EXP.SetAccA
jsr SRC.GetChar
beq EXP.EvalOperator
cmp #'''
bne EXP.EvalExitSYN
bra EXP.EvalOperator
.43 cmp '"'
bne .42
jsr SRC.GetChar
beq EXP.EvalExitSYN
ora #$80
jsr EXP.SetAccA
jsr SRC.GetChar
beq EXP.EvalOperator
cmp #'"'
bne EXP.EvalExitSYN
bra EXP.EvalOperator
.42 jsr SRC.IsLetter Symbol ?
bcs EXP.EvalExitSYN
dec SRC.BufPtr
>LDYA L.SRC.ELabel.Len
jsr SRC.GetLabel
bcs .97
jsr SYM.FindGlobal
bcc .41
ldy #ASM.PASS
lda (pData),y pass#2?
bne .96 yes, undefined symbol
jsr EXP.GetSymbol
bcs EXP.EvalExitRTS
bra EXP.EvalOperator
bra *
EXP.EvalExitOK dec SRC.BufPtr Back One Char
EXP.EvalExitOK1 clc
EXP.EvalExitRTS rts
.41 ldx #3
.5 lda SRC.FLabel.Value,x
sta SRC.ACC,x
dex
bpl .5
.8 clc
rts
.97 lda #ERR.SYNTAX.ERROR
EXP.EvalExitSYN lda #ERR.SYNTAX.ERROR
sec
rts
.98 lda #ERR.MISSING.EXP
sec
.99 rts
.96 lda #ERR.UNDEF.SYMBOL
EXP.EvalExitUND lda #ERR.UNDEF.SYMBOL
sec
rts
EXP.EvalOperator lda EXP.Operator
beq .7
jsr EXP.Compute
bcs EXP.EvalExitRTS
.7 jsr SRC.GetChar
beq EXP.EvalExitOK1
cmp #' '
beq EXP.EvalExitOK1
jsr SRC.IsAMReserved
bcc EXP.EvalExitOK
jsr SRC.IsEXPReserved
bcs *
bcs EXP.EvalExitSYN
sta EXP.Operator
ldx #3
.8 lda SRC.ACC,x
sta SRC.ARG,x
dex
bpl .8
jmp EXP.Eval
clc
rts
*---------------------------------------
stz SRC.ACC
EXP.GetLocal jsr SRC.GetDecimal
bcs EXP.EvalExitSYN
lda SRC.ACC+1
ora SRC.ACC+2
ora SRC.ACC+3
bne EXP.EvalExitSYN Max .255
lda SRC.ACC
beq EXP.EvalExitSYN .0 is not allowed
jsr SYM.FindLocal
bcs EXP.EvalExitUND
rts
*---------------------------------------
EXP.SetAccA sta SRC.ACC
stz SRC.ACC+1
stz SRC.ACC+2
stz SRC.ACC+3
rts
*---------------------------------------
EXP.GetSymbol >LDYA L.SRC.ELabel.Len
jsr SRC.GetLabel
bcs EXP.EvalExitSYN
jsr SYM.FindGlobal
bcc .1
ldy #ASM.PASS
lda (pData),y pass#2?
bne EXP.EvalExitUND yes, undefined symbol
lda #$C0 Valid+Pending
sta SRC.ELabel.Flags
>LDYA L.SRC.ELabel.Flags
jsr SYM.AddGToGBlockYA
rts
*---------------------------------------
.1 ldx #3
.2 lda SRC.FLabel.Value,x
sta SRC.ACC,x
dex
bpl .2
clc
rts
*---------------------------------------
EXP.Compute
clc
rts
*---------------------------------------
MAN
SAVE BIN/ASM.S.EXP
LOAD BIN/ASM.S

View File

@ -49,20 +49,32 @@ SRC.ParseLine ldx TmpBuffer256
SRC.ParseLine.Ok lda SRC.GLabel.New
bpl .1
bpl .8
lda SRC.GLabel.Flags
lsr .SE ?
jsr SYM.FindGlobal
bcs .1 if CS, not found, add
lda SRC.FLabel.Flags
and SRC.GLabel.Flags
lsr both are .SE ?
bcs .1 yes, update during pass 1 & 2
ldy #ASM.PASS
lda SRC.FLabel.Flags
and #$40 found symbol pending ?
bne .10
lda SRC.GLabel.Flags
and #$40 new is pending ? (if yes, no need to update)
bne .8
.10 ldy #ASM.PASS
lda (pData),y pass#2?
bne .8 yes, skip to avoid redefinition error
jsr SYM.FindGlobal
bcs SRC.ParseLine.Redef
bra SRC.ParseLine.Redef
.1 jsr SYM.AddGToGBlock
.1 >LDYA L.SRC.GLabel.Flags
jsr SYM.AddGToGBlockYA
bcs SRC.ParseLine.Err
@ -225,6 +237,19 @@ SRC.ParseLine.OpCode
bne .1
jsr SRC.ParseLine.AM
bcs *
bcs .99
ldy #ASM.PC
@ -278,6 +303,9 @@ SRC.ParseLine.AM stz SRC.AM.ID
.2 jsr SRC.IsLetter Any register?
bcs .70 no, try something else
lda SRC.BufPtr
sta SRC.BufPtrSave
stz SRC.AM.tmpBuf
sta SRC.AM.tmpBuf+1
inc SRC.AM.tmpBuf
@ -332,10 +360,13 @@ SRC.ParseLine.AM stz SRC.AM.ID
tay
bra .5
.71 lda SRC.BufPtrSave Does not match a register,restore Ptr
sta SRC.BufPtr
.70 dec SRC.BufPtr back one char
.71 jsr EXP.Eval
jsr EXP.Eval
bcs *
bcs .99
.72 jmp .1
clc
@ -382,6 +413,10 @@ SRC.GetDecimal stz SRC.ACC+1
beq .8
cmp #' '
beq .8
jsr SRC.IsEXPReserved
bcc .88
jsr SRC.IsAMReserved
bcc .88
jsr SRC.IsDigit10
bcs .99
and #$0F
@ -405,7 +440,8 @@ SRC.GetDecimal stz SRC.ACC+1
.9 lda #ERR.VAL.TOO.BIG
sec
rts
.88 dec SRC.BufPtr Back One Char
.8 clc
rts
@ -428,6 +464,10 @@ SRC.GetHex stz SRC.ACC+1
beq .8
cmp #' '
beq .8
jsr SRC.IsEXPReserved
bcc .88
jsr SRC.IsAMReserved
bcc .88
jsr SRC.IsDigit16
bcs .99
@ -443,6 +483,7 @@ SRC.GetHex stz SRC.ACC+1
sta SRC.ACC
bra .1
.88 dec SRC.BufPtr Back One Char
.8 clc
rts
@ -469,6 +510,10 @@ SRC.GetOctal stz SRC.ACC+1
beq .8
cmp #' '
beq .8
jsr SRC.IsEXPReserved
bcc .88
jsr SRC.IsAMReserved
bcc .88
jsr SRC.IsDigit8
bcs .99
@ -489,6 +534,7 @@ SRC.GetOctal stz SRC.ACC+1
bne .2
bra .1
.88 dec SRC.BufPtr Back One Char
.8 clc
rts
@ -515,6 +561,12 @@ SRC.GetBinary stz SRC.ACC+1
.1 jsr SRC.GetChar
beq .8
cmp #' '
beq .8
jsr SRC.IsEXPReserved
bcc .88
jsr SRC.IsAMReserved
bcc .88
cmp #'1'
beq .11
cmp #'0'
@ -529,6 +581,7 @@ SRC.GetBinary stz SRC.ACC+1
bcs .9
bra .1
.88 dec SRC.BufPtr Back One Char
.8 clc
rts
@ -563,9 +616,12 @@ SRC.GetLabel >STYA ZPPtr1
beq .2
jsr SRC.IsEXPReserved
bcc .8
bcc .88
jsr SRC.IsAMReserved
bcc .88
jsr SRC.IsLetterOrDigit
bcs .9
bcs *
* bcs .9
.2 iny
sta (ZPPtr1),y
@ -575,7 +631,8 @@ SRC.GetLabel >STYA ZPPtr1
.9 lda #ERR.SYNTAX.ERROR
sec
rts
.88 dec SRC.BufPtr Back One Char
.8 tya
sta (ZPPtr1)
clc
@ -621,35 +678,6 @@ SRC.GetKeyword >STYA ZPPtr1
inc SRC.Keyword.ID
bra .3
.9 sec
rts
*---------------------------------------
SRC.GetExp.DELETE stz SRC.Exp
jsr SRC.GetCharUC
beq .9
ldy #0
jsr SRC.IsAMReserved
bcc .8
iny
sta SRC.Exp+1
.1 jsr SRC.GetCharUC
beq .89
cmp #' '
beq .89
jsr SRC.IsAMReserved
bcc .8
iny
sta SRC.Exp,y
bra .1
.8 dec SRC.BufPtr
.89 sty SRC.Exp
clc
rts
.9 sec
rts
*---------------------------------------

View File

@ -151,6 +151,12 @@ SYM.LookupMacro
rts
*---------------------------------------
SYM.UpdateGlobal
clc
rts
*---------------------------------------
SYM.FindLocal
clc
rts
*---------------------------------------
SYM.FindGlobal jsr SYM.ResetGBlock
@ -205,7 +211,8 @@ SYM.AddLToGBlock jsr SYM.GetLastGBlock
jmp SYM.AddByteGBlock
.9 rts
*---------------------------------------
SYM.AddGToGBlock jsr SYM.GetLastGBlock
SYM.AddGToGBlockYA >STYA ZPSymbolPtr
jsr SYM.GetLastGBlock
ldy #SYM.hCurGBlock 1st Gblock to add?
lda (pData),y
@ -213,25 +220,29 @@ SYM.AddGToGBlock jsr SYM.GetLastGBlock
ora (pData),y
beq .10 yes, skip closing previous one
lda #0 Close Pending Global/Local
lda #0 Close Pending Global/Local
jsr SYM.AddByteGBlock
bcs .9
.10 ldx #0
.1 lda SRC.GLabel.Flags,x
.10 ldy #0
.1 lda (ZPSymbolPtr),y
jsr SYM.AddByteGBlock
bcs .9
inx
cpx #6
bne .1
iny
cpy #5
bne .1 moved Flags & Value to GBlock....
ldx #0
.2 lda SRC.GLabel.Name,x
lda (ZPSymbolPtr),y Get Len
tax
jsr SYM.AddByteGBlock
bcs .9
inx
cpx SRC.GLabel.Len
.2 lda (ZPSymbolPtr),y
jsr SYM.AddByteGBlock
bcs .9
iny
dex
bne .2
clc
@ -282,7 +293,9 @@ SYM.GetGBlockA clc
plx
rts
*---------------------------------------
SYM.AddByteGBlock pha
SYM.AddByteGBlock phx
phy
pha
ldy #SYM.iCurGBlock
lda (pData),y
tay
@ -292,15 +305,18 @@ SYM.AddByteGBlock pha
tya
inc
beq SYM.NewGBlock
beq SYM.NewGBlock2
ldy #SYM.iCurGBlock
sta (pData),y
ply
plx
clc
rts
*---------------------------------------
SYM.NewGBlock phx
>PUSHWI 256
phy
SYM.NewGBlock2 >PUSHWI 256
>PUSHBI S.MEM.F.INIT0
>SYSCALL SYS.GetMem
@ -324,7 +340,8 @@ SYM.NewGBlock phx
sta (pData),y
clc
.9 plx
.9 ply
plx
rts
*---------------------------------------
MAN

View File

@ -16,6 +16,7 @@ ZPPtr1 .EQ ZPBIN
ZPPtr2 .EQ ZPBIN+2
ZPPtr3 .EQ ZPBIN+4
ZPBlockPtr .EQ ZPBIN+6
ZPSymbolPtr .EQ ZPBIN+8
*---------------------------------------
ASM.T.AM .EQ 0
ASM.T.R .EQ 2
@ -83,7 +84,9 @@ L.MSG.SRC.FILE .DA MSG.SRC.FILE
L.MSG.OBJ.FILE .DA MSG.OBJ.FILE
L.MSG.T.FILE .DA MSG.T.FILE
L.SRC.AM.StrBuf .DA SRC.AM.StrBuf
L.SRC.GLabel.Flags .DA SRC.GLabel.Flags
L.SRC.GLabel.Len .DA SRC.GLabel.Len
L.SRC.ELabel.Flags .DA SRC.ELabel.Flags
L.SRC.ELabel.Len .DA SRC.ELabel.Len
L.SRC.BUFFER .DA SRC.BUFFER
L.ASM.T.FILENAME .DA ASM.T.FILENAME
@ -264,10 +267,10 @@ CS.RUN ldy #bCANCEL
.99 sec
rts
.2 jsr SRC.ParseLine
bcs .9
.2 jsr SRC.PrintLine with CC, conditional
jsr SRC.PrintLine with CC, conditional
jsr SRC.ParseLine
bcs .9
.8 clc
rts
@ -477,6 +480,7 @@ SRC.Directive.ID .BS 1
SRC.Keyword.ID .BS 1
SRC.ACC .BS 4
SRC.ACCTMP .BS 4
SRC.ARG .BS 4
SRC.AM.ID .BS 1
SRC.AM.StrBuf .BS 32
SRC.AM.tmpBuf .BS 32