diff --git a/BIN/ASM.S.EXP.txt b/BIN/ASM.S.EXP.txt index dbdccb62..3fe4ae5e 100644 --- a/BIN/ASM.S.EXP.txt +++ b/BIN/ASM.S.EXP.txt @@ -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 diff --git a/BIN/ASM.S.SRC.txt b/BIN/ASM.S.SRC.txt index 88a31514..d73b0b35 100644 --- a/BIN/ASM.S.SRC.txt +++ b/BIN/ASM.S.SRC.txt @@ -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 *--------------------------------------- diff --git a/BIN/ASM.S.SYM.txt b/BIN/ASM.S.SYM.txt index 9a9e7749..45cdc55a 100644 --- a/BIN/ASM.S.SYM.txt +++ b/BIN/ASM.S.SYM.txt @@ -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 diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 127c7be7..f27b9577 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -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