diff --git a/.Docs/ASM.md b/.Docs/ASM.md index 004a64b3..722f01c7 100644 --- a/.Docs/ASM.md +++ b/.Docs/ASM.md @@ -16,8 +16,10 @@ no .AC support | .AC | Ascii Compressed string| S-C | NOT IMPL. | | As strings are supposed to be printed with A2osX API, Printf cannot handle 'AC' compressed strings | | .AS | Ascii String | S-C,A2osX | Working | `.AS dTEXTd` where d is any delimiter `.AS -"TEXT"`produce ascii code with b7=1 | | | .AT | Ascii string Terminated | S-C,A2osX | Working | (same as above) | | -| .AZ | Ascii string Zero terminated (C String) | S-C,A2osX | Working | (same as above) | | +| .AZ | Ascii string Zero terminated | S-C,A2osX | Working | (same as above) | | | .BS | Block (Byte) Storage | S-C,A2osX | Working | `.BS count[,value]` | Reserves `count` bytes in output and sets them to `value` (or zero if omitted) | +| .CS | C-string | S-C 3.1,A2osX | Working | | | +| .CZ | C-String Zero terminated| S-C 3.1,A2osX | Working | | | | .DA | DAta value | S-C,A2osX | Working | `.DA value` | 2-byte address: `.DA $1234` only high byte: `.DA /$1234` only low byte: `.DA #$1234` | | .DO | conditional start | S-C,A2osX | Working | | | | .DU,.DUMMY | begin DUmmy section | S-C,A2osX | Working | | | @@ -36,6 +38,7 @@ no .AC support | .OR | ORigin | S-C,A2osX | Working | `.OR address` | Set initial output address (only one allowed per assembly) | | .PG | PaGe control | S-C,A2osX | IGNORED | | | | .PH | PHase start | S-C,A2osX | Working | `.PH address` | Start a temporary addressing range | +| .CS | Pascal-string | S-C 3.1,A2osX | Working | | | | .SE | | S-C,A2osX | Working | | | | .TA | Target Address| S-C,A2osX | IGNORED | | | | .TF | Target File | S-C,A2osX | Working | `.TF TargetFile[,Txxx]` | only ,TSYS supported | diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 3b6fc381..ff886c0a 100644 Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ diff --git a/.Floppies/A2OSX.TEST.po b/.Floppies/A2OSX.TEST.po index 1b214564..49e17be7 100644 Binary files a/.Floppies/A2OSX.TEST.po and b/.Floppies/A2OSX.TEST.po differ diff --git a/.Floppies/ProDOSFX.BOOT.po b/.Floppies/ProDOSFX.BOOT.po index b44ae936..4377c5d8 100644 Binary files a/.Floppies/ProDOSFX.BOOT.po and b/.Floppies/ProDOSFX.BOOT.po differ diff --git a/.Tools/userDefineLang.xml b/.Tools/userDefineLang.xml index 9f6716be..c19fc3b1 100644 --- a/.Tools/userDefineLang.xml +++ b/.Tools/userDefineLang.xml @@ -24,7 +24,7 @@ - .BS .DA .AS .AT .AZ .EQ .MA .EM .OR .TF .LIST .HS .IN .INB .OP .TA .EM .PH .EP .DUMMY .ED + .BS .DA .AS .AT .AZ .EQ .MA .EM .OR .TF .LIST .HS .IN .INB .OP .TA .EM .PH .EP .DUMMY .ED .CS .CZ .PS adc and asl bit brk clc cld cli clv cmp cpx cpy dec dex dey eor inc inx iny lda ldx ldy lsr nop ora rmb rol ror rti rts sbc sec sed sei smb sta stp stx sty stz tax tay trb tsb tsx txa txs tya wai $ % / # & ^ .1 .2 .3 .4 .5 .6 .7 .8 .9 @@ -35,30 +35,30 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BIN/ASM.S.DIR.txt b/BIN/ASM.S.DIR.txt index 2e278e45..51c2a513 100644 --- a/BIN/ASM.S.DIR.txt +++ b/BIN/ASM.S.DIR.txt @@ -9,9 +9,9 @@ DIR.Reset lda #$ff sta (pData),y iny #ASM.LI.XON sta (pData),y - + >STA.G MAC.StkPtr - + rts *--------------------------------------- DIR.AC clc @@ -22,7 +22,7 @@ DIR.AT sec *--------------------------------------- DIR.AS clc lda #0 - ror + ror sta DIR.Byte Save b7 of last char in string jsr SRC.GetNextChar bcs .9 @@ -82,11 +82,107 @@ DIR.AZ jsr DIR.AS lda #0 jmp OUT.EmitByte *--------------------------------------- +DIR.PS jsr SRC.GetNextChar + bcs .9 + + sta DIR.Word Save delimiter.... + + ldx #$ff + ldy #1 skip delimiter + +.1 inx + lda (ZPLinePtr),y + beq .9 + + cmp #$0D + beq .9 + + iny + + cmp DIR.Word + bne .1 + + txa + jsr OUT.EmitByte emit length + bcs .9 + +.2 jsr SRC.GetNextChar + jsr OUT.EmitByte + bcs .9 + + dex + bne .2 + + jsr SRC.GetNextChar skip delimiter + + clc + rts + +.9 lda #E.SYNTAX.ERROR + sec + rts +*--------------------------------------- +DIR.CS jsr SRC.GetNextChar + bcs .9 + + stz DIR.Byte + + cmp #'-' + bne .1 + + ror DIR.Byte save b7 status of ALL chars + + jsr SRC.GetNextChar + bcs .9 + +.1 sta DIR.Word Save delimiter.... + +.2 jsr SRC.GetNextChar + bcs .9 + + cmp DIR.Word delimiter ? + beq .8 + + cmp #'\' + bne .7 + + jsr SRC.GetNextChar + bcs .9 + + ldx #DIR.EscChars.L-1 + +.3 cmp DIR.EscChars,x + beq .4 + + dex + bpl .3 + + bmi .9 + +.4 lda DIR.EscCodes,x + +.7 ora DIR.Byte + + jsr OUT.EmitByte + bcc .2 + +.9 lda #E.SYNTAX.ERROR + sec + rts + +.8 clc +DIR.CZ.RTS rts +*--------------------------------------- +DIR.CZ jsr DIR.CS + bcs DIR.CZ.RTS + lda #0 + jmp OUT.EmitByte +*--------------------------------------- DIR.BS jsr SRC.GetNextCharNB bcs .98 jsr EXP.ResetAcc - + jsr EXP.Eval bcs .9 @@ -105,15 +201,15 @@ DIR.BS jsr SRC.GetNextCharNB stz DIR.Byte jsr SRC.GetChar bcs .1 - + cmp #C.SPACE beq .1 - + cmp #',' bne .98 - + jsr EXP.ResetAcc - + jsr EXP.Eval bcs .9 @@ -121,15 +217,15 @@ DIR.BS jsr SRC.GetNextCharNB ora SRC.ACC+2 ora SRC.ACC+1 bne .99 - + lda SRC.ACC sta DIR.Byte - + .1 inc DIR.Word bne .2 inc DIR.Word+1 beq .8 - + .2 lda DIR.Byte jsr OUT.EmitByte bcc .1 @@ -148,35 +244,35 @@ DIR.BS jsr SRC.GetNextCharNB *--------------------------------------- DIR.DA jsr SRC.GetNextCharNB bcs .98 - + .1 jsr EXP.ResetAcc jsr EXP.Eval bcs .9 - + ldy #0 ldx SRC.ACC.SIZE - + .2 lda SRC.ACC,y jsr OUT.EmitByte bcs .9 - + iny dex bne .2 - + .3 jsr SRC.GetChar bcs .8 cmp #C.SPACE beq .8 - + cmp #',' bne .98 - + jsr SRC.GetNextChar bcc .1 - + .98 lda #E.SYNTAX.ERROR sec .9 rts @@ -189,17 +285,17 @@ DIR.DO >LDA.G ASM.DO.StackPtr inc cmp #DO.MAXDEPTH bcs .98 - + tya beq .1 - + * clc adc #ASM.DO.Stack-1 tay - + lda (pData),y Previous DO is false? bne .1 - + >INC.G ASM.DO.StackPtr yes,stack FALSE * clc @@ -212,7 +308,7 @@ DIR.DO >LDA.G ASM.DO.StackPtr bcs .99 jsr EXP.ResetAcc - + jsr EXP.Eval bcs .99 @@ -238,11 +334,11 @@ DIR.DO >LDA.G ASM.DO.StackPtr *--------------------------------------- DIR.EL >LDA.G ASM.DO.StackPtr beq .9 - + tax dec beq .1 no previous DO context - + clc adc #ASM.DO.Stack-1 tay @@ -256,7 +352,7 @@ DIR.EL >LDA.G ASM.DO.StackPtr lda (pData),y eor #$ff sta (pData),y - + .8 clc rts @@ -273,7 +369,7 @@ DIR.DU >LDA.G ASM.DU.ON lda #$80 sta (pData),y - + ldy #ASM.PC.DU jmp DIR.SavePC *--------------------------------------- @@ -298,7 +394,7 @@ DIR.ED >LDA.G ASM.DU.ON *--------------------------------------- DIR.EP >LDA.G ASM.PH.ON bpl .9 - + lda #0 sta (pData),y ldy #ASM.PC.PH @@ -315,29 +411,29 @@ DIR.EQ clc lda #$ff >STA.G OUT.bEquate - + >LDA.G SYM.BufPtr beq DIR.EP.ILLEGAL not in global symbol context eor #SYMG beq .1 - + bcs DIR.EP.ILLEGAL .SE not allowed in local/private bcc .10 .EQ in local, skip F update - + .1 ror A = 0 : CS = SYMG.F.RW ora #SYMG.F.EQU sta SRC.ACC.F - + .10 jsr SRC.GetNextCharNB bcs .9 jsr EXP.ResetAccV keep F - + jsr EXP.Eval bcs DIR.EP.RTS - + >LDA.G SYM.BufPtr cmp #SYMG @@ -345,28 +441,28 @@ DIR.EQ clc tay ldx #3 we are in local/private - + .11 lda SRC.ACC,x update value dey sta (ZPSymbolBuf),y dex bpl .11 - + clc rts - + .12 ldy #SYMG-1 .13 lda SRC.ACC.F,y sta (ZPSymbolBuf),y dey bpl .13 - + >LDA.G ASM.PASS bne .2 jmp SYM.StoreGlobal - + .2 jmp SYM.UpdateGlobal .9 lda #E.SYNTAX.ERROR @@ -384,16 +480,16 @@ DIR.FI >LDA.G ASM.DO.StackPtr *--------------------------------------- DIR.HS jsr SRC.GetNextCharNB bcs .99 - + jsr SRC.IsDigit16 bcs .99 - + .1 sta DIR.Byte jsr SRC.GetNextChar bcc .2 jmp OUT.EmitByte - + .2 jsr SRC.IsDigit16 bcc .3 @@ -407,7 +503,7 @@ DIR.HS jsr SRC.GetNextCharNB jsr OUT.EmitByte bcc .5 rts - + .3 pha lda DIR.Byte asl @@ -417,44 +513,44 @@ DIR.HS jsr SRC.GetNextCharNB sta DIR.Byte pla ora DIR.Byte - + .4 jsr OUT.EmitByte bcs .9 - + jsr SRC.GetNextChar bcs .8 - + cmp #C.SPACE beq .8 - + jsr SRC.IsDigit16 bcc .1 - + cmp #',' beq .5 cmp #'.' bne .99 - + .5 jsr SRC.GetNextChar bcs .99 - + jsr SRC.IsDigit16 bcc .1 - + .99 lda #E.SYNTAX.ERROR sec -.9 rts +.9 rts .8 clc rts *--------------------------------------- DIR.IN jsr SRC.GetNextCharNB bcs .9 - + >LDYA ZPLinePtr jmp FIO.OpenFile - + .9 lda #E.SYNTAX.ERROR sec rts @@ -471,10 +567,10 @@ DIR.LI jsr SRC.GetNextChar bcs .8 cmp #',' beq DIR.LI - + cmp #C.SPACE beq .8 - + .9 lda #E.SYNTAX.ERROR sec rts @@ -485,15 +581,15 @@ DIR.LI jsr SRC.GetNextChar rts DIR.LI.ON ldy #ASM.LI.ON - sec + sec bra DIR.LI.APPLY DIR.LI.OFF ldy #ASM.LI.ON - clc + clc bra DIR.LI.APPLY DIR.LI.CON ldy #ASM.LI.CON - sec + sec bra DIR.LI.APPLY DIR.LI.COFF ldy #ASM.LI.CON @@ -501,19 +597,19 @@ DIR.LI.COFF ldy #ASM.LI.CON bra DIR.LI.APPLY DIR.LI.MON ldy #ASM.LI.MON - sec + sec bra DIR.LI.APPLY DIR.LI.MOFF ldy #ASM.LI.MON - clc + clc bra DIR.LI.APPLY DIR.LI.XON ldy #ASM.LI.XON - sec + sec bra DIR.LI.APPLY DIR.LI.XOFF ldy #ASM.LI.XON - clc + clc DIR.LI.APPLY lda #0 ror @@ -533,14 +629,14 @@ DIR.MA >LDA.G ASM.MA.ON >PUSHW ZPLinePtr >SYSCALL SListNewKey bcs .99 - + >STYA.G MAC.ID - + .8 lda #$ff >STA.G ASM.MA.ON clc rts - + .9 lda #E.MACRO.INV.DEF sec .99 rts @@ -548,7 +644,7 @@ DIR.MA >LDA.G ASM.MA.ON DIR.OP jsr SRC.GetNextCharNB bcs DIR.OP.SYNERR >LDYA ZPLinePtr - + jmp FIO.LOAD.CPU DIR.OP.SYNERR lda #E.SYNTAX.ERROR @@ -557,34 +653,34 @@ DIR.OP.SYNERR lda #E.SYNTAX.ERROR *--------------------------------------- DIR.OR jsr SRC.GetNextCharNB bcs DIR.OP.SYNERR - + jsr EXP.ResetAcc - + jsr EXP.Eval bcs .9 ldx #0 ldy #ASM.PC - + .1 lda SRC.ACC,x sta (pData),y iny inx cpx #4 bne .1 - + >LDA.G ASM.DU.ON bmi .8 - + >LDA.G ASM.PH.ON bmi .8 - + lda SRC.ACC >STA.G DST.AUXTYPE lda SRC.ACC+1 iny sta (pData),y - + .8 clc .9 rts *--------------------------------------- @@ -603,37 +699,37 @@ DIR.TA.RTS rts *--------------------------------------- DIR.TF >LDA.G ASM.PASS If Pass#1, ignore beq DIR.TA.8 - + >LDA.G ArgDstFile beq .1 - + >SYSCALL ArgV bra .2 - + .1 jsr SRC.GetNextCharNB bcs DIR.OP.SYNERR >LDYA ZPLinePtr - + .2 >SYSCALL StrDup bcs DIR.TA.RTS >STYA ZPPtr1 stx ZPPtr2 - + lda #S.FI.T.BIN sta ZPPtr2+1 - + ldy #$ff - + .3 iny lda (ZPPtr1),y beq .7 cmp #',' bne .3 - + lda #0 sta (ZPPtr1),y - + iny lda (ZPPtr1),y cmp #'T' @@ -641,7 +737,7 @@ DIR.TF >LDA.G ASM.PASS If Pass#1, ignore .30 lda #E.SYNTAX.ERROR bra .9 - + .4 ldx #0 .5 iny @@ -651,7 +747,7 @@ DIR.TF >LDA.G ASM.PASS If Pass#1, ignore inx cpx #4 bne .5 - + lda #S.FI.T.SYS sta ZPPtr2+1 @@ -659,7 +755,7 @@ DIR.TF >LDA.G ASM.PASS If Pass#1, ignore >PUSHWZ Allocate >SYSCALL RealPath bcs .9 - + txa >STA.G DST.hFILENAME >SYSCALL GetMemPtr @@ -669,18 +765,18 @@ DIR.TF >LDA.G ASM.PASS If Pass#1, ignore >PUSHW.G DST.AUXTYPE >SYSCALL FOpen bcs .9 - + >STA.G DST.hREFNUM - + clc - + .9 php pha lda ZPPtr2 >SYSCALL FreeMem pla plp - + rts *--------------------------------------- DIR.SavePC phy @@ -692,7 +788,7 @@ DIR.SavePC phy dey cpy #ASM.PC-1 bne .1 - + phx ply ldx #3 @@ -716,7 +812,7 @@ DIR.RestorePC ldx #3 ldy #ASM.PC+3 ldx #3 - + .2 pla sta (pData),y dey diff --git a/BIN/ASM.S.MAC.txt b/BIN/ASM.S.MAC.txt index 7f359175..d84f826d 100644 --- a/BIN/ASM.S.MAC.txt +++ b/BIN/ASM.S.MAC.txt @@ -198,12 +198,8 @@ MAC.Exec jsr SRC.GetNextChar skip '>' bcs .90 >STYA ZPPtr1 MAC.ID - txa -* clc - adc ZPLinePtr - sta ZPLinePtr - bcc .1 - inc ZPLinePtr+1 + + jsr SRC.SkipX .1 jsr SRC.GetChar bcs .8 diff --git a/BIN/ASM.S.OUT.txt b/BIN/ASM.S.OUT.txt index de40fbd1..f723c680 100644 --- a/BIN/ASM.S.OUT.txt +++ b/BIN/ASM.S.OUT.txt @@ -107,7 +107,10 @@ OUT.PrintBuf.RTS rts *--------------------------------------- OUT.PrintLine jsr OUT.PrintLineOn - bcs OUT.PrintBuf.RTS + bcc OUT.PrintLine.1 + + clc + rts OUT.PrintLine.1 jsr OUT.PrintLineOutBuf bcs OUT.PrintBuf.RTS @@ -254,7 +257,7 @@ OUT.PrintLineErr jsr OUT.PrintLine.1 bcs OUT.PrintLineOnRTS -.1 >PUSHW L.MSG.ERROR + >PUSHW L.MSG.ERROR >PUSHB DIR.Byte >PUSHBI 1 >SYSCALL PrintF diff --git a/BIN/ASM.S.SRC.txt b/BIN/ASM.S.SRC.txt index 49d14df8..0ffa8cc4 100644 --- a/BIN/ASM.S.SRC.txt +++ b/BIN/ASM.S.SRC.txt @@ -91,13 +91,13 @@ SRC.ParseLine.DirOp jsr SRC.DoCheck bcs .1 TRUE, always execute - cpx #12 .DO? + cpx #DIR.DO.ID beq .1 - cpx #20 .ELSE? + cpx #DIR.EL.ID beq .1 - cpx #30 .FIN? + cpx #DIR.FI.ID bne SRC.ParseLine.Ok .1 jmp (J.DIRECTIVES,x) @@ -988,6 +988,18 @@ SRC.IsDigit8 cmp #'0' .9 sec rts *--------------------------------------- +SRC.SkipX clc + .HS B0 BCS +SRC.SkipXp1 sec + txa + adc ZPLinePtr + sta ZPLinePtr + bcc .8 + + inc ZPLinePtr+1 + +.8 rts +*--------------------------------------- SRC.GetNextCharNB jsr SRC.GetNextChar bcs .9 @@ -996,30 +1008,26 @@ SRC.GetNextCharNB clc .9 rts *--------------------------------------- -SRC.GetNextCharUC - jsr SRC.GetNextChar - bcs .9 - cmp #'a' - bcc .8 - cmp #'z'+1 - bcs .8 - eor #$20 to Uppercase -.8 clc -.9 rts -*--------------------------------------- SRC.GetNextChar lda (ZPLinePtr) beq SRC.GetChar.ERR + cmp #$0D beq SRC.GetChar.ERR + inc ZPLinePtr bne SRC.GetChar + inc ZPLinePtr+1 + SRC.GetChar lda (ZPLinePtr) beq SRC.GetChar.ERR + cmp #$0D beq SRC.GetChar.ERR + clc rts + SRC.GetChar.ERR sec rts *--------------------------------------- diff --git a/BIN/ASM.S.SYM.txt b/BIN/ASM.S.SYM.txt index f4e13223..66e07edf 100644 --- a/BIN/ASM.S.SYM.txt +++ b/BIN/ASM.S.SYM.txt @@ -10,10 +10,10 @@ NEW * 2-5 : 32 bits Value * 6+ : Local Symbols..... *--------------------------------------- -* Local/Private Symbol Record: (6 bytes) +* Local/Private Symbol Record: (4 bytes) * 0 : Local ID (1->255) * 1 : Macro Context ID (private) -* 2-5 : 32 bits Value (PC) +* 2-3 : 16 bits offset (PC) *--------------------------------------- SYM.Init >SYSCALL SListNew bcs .9 @@ -55,12 +55,7 @@ SYM.NewGlobal >LDA.G ASM.PASS >STYA.G SYM.ID - txa -* clc - adc ZPLinePtr - sta ZPLinePtr - bcc .1 - inc ZPLinePtr+1 + jsr SRC.SkipX .1 stz SRC.ACC.F jsr SYM.PC2Acc @@ -83,6 +78,7 @@ SYM.NewGlobal >LDA.G ASM.PASS .9 cmp #E.DUPKEY bne .99 + lda #E.SYMBOL.REDEF .99 SYM.NewGlobal.RTS @@ -95,12 +91,7 @@ SYM.GetGlobal >PUSHB.G SYM.hList Pass #2: should be already defined... >STYA.G SYM.ID - txa -* clc - adc ZPLinePtr - sta ZPLinePtr - bcc .1 - inc ZPLinePtr+1 + jsr SRC.SkipX .1 >PUSHB.G SYM.hList Pass #2: Restore full context >PUSHW.G SYM.ID @@ -156,12 +147,7 @@ SYM.LookupGlobal >STYA ZPPtr1 KeyID - txa -* clc - adc ZPLinePtr - sta ZPLinePtr - bcc .1 - inc ZPLinePtr+1 + jsr SRC.SkipX .1 >LDA.G SYM.ID cmp ZPPtr1 @@ -198,7 +184,7 @@ SYM.LookupGlobal lda #2 sta SRC.ACC.SIZE - + lda #$ff sta SRC.ACC sta SRC.ACC+1 @@ -271,7 +257,7 @@ SYM.UpdateGlobal >SYSCALL SListSetData bcs .9 - + >STZ.G SYM.BufPtr .9 rts *--------------------------------------- @@ -322,6 +308,29 @@ SYM.NewLocalA tax Save Local ID cpy #ASM.PC bne .1 + ldy #SYMG.V + + sec + + pla + sbc (ZPSymbolBuf),y + sta SYM.LocalOfs + + iny + pla + sbc (ZPSymbolBuf),y + sta SYM.LocalOfs+1 + + iny + pla + sbc (ZPSymbolBuf),y + bne .97 + + iny + pla + sbc (ZPSymbolBuf),y + bne .98 + >LDA.G MAC.CtxID Get Macro Context ID pha @@ -331,13 +340,17 @@ SYM.NewLocalA tax Save Local ID txa Get Back ID sta (ZPSymbolBuf),y - ldx #5 MAC ID + PC (4) - -.2 pla + pla + iny + sta (ZPSymbolBuf),y + + lda SYM.LocalOfs + iny + sta (ZPSymbolBuf),y + + lda SYM.LocalOfs+1 iny sta (ZPSymbolBuf),y - dex - bne .2 iny lda #0 @@ -350,7 +363,7 @@ SYM.NewLocalA tax Save Local ID ora #SYMG.F.LOCALS sta (ZPSymbolBuf) -.8 clc + clc rts .91 lda #E.INV.LABEL @@ -361,6 +374,12 @@ SYM.NewLocalA tax Save Local ID sec rts +.97 pla +.98 lda #E.RANGE + + sec + rts + .9 lda #E.SYMBOL.REDEF sec rts @@ -369,7 +388,7 @@ SYM.NewLocalA tax Save Local ID clc adc #SYML sta (pData),y - +* clc rts *--------------------------------------- SYM.LookupLocalX @@ -379,45 +398,60 @@ SYM.LookupLocalX ldy #SYMG -.1 phy - lda (ZPSymbolBuf),y - beq .9 +.1 lda (ZPSymbolBuf),y + beq .99 + phy SYML.ID + txa cmp (ZPSymbolBuf),y - bne .3 + bne .4 >LDA.G MAC.CtxID ply phy - iny + iny SYML.CtxID cmp (ZPSymbolBuf),y - bne .3 + bne .4 + ldy #SYMG.V ldx #0 -.2 iny - lda (ZPSymbolBuf),y +.2 lda (ZPSymbolBuf),y sta SRC.ACC,x inx - cpx #4 - + iny + cpy #SYMG bne .2 - pla + ply + iny + iny SYML.O + lda (ZPSymbolBuf),y clc + adc SRC.ACC + sta SRC.ACC + + iny + lda (ZPSymbolBuf),y + adc SRC.ACC+1 + sta SRC.ACC+1 + bcc .3 + + inc SRC.ACC+2 + +.3 clc rts -.3 pla +.4 pla clc adc #SYML tay bra .1 -.9 ply .99 lda #E.UNDEF.SYMBOL sec rts @@ -579,19 +613,38 @@ SYM.Dump.LP ldy #SYMG .8 rts *--------------------------------------- SYM.Dump.PushValueY - ldx #4 + iny + lda (ZPSymbolBuf),y + sta SRC.ACC iny - iny - iny - iny + lda (ZPSymbolBuf),y + sta SRC.ACC+1 + + stz SRC.ACC+2 + stz SRC.ACC+3 -.1 lda (ZPSymbolBuf),y - >PUSHA - dey - dex + ldy #SYMG.V + ldx #0 + + clc + +.1 lda (ZPSymbolBuf),y + adc SRC.ACC,x + sta SRC.ACC,x + iny + inx + txa + eor #4 bne .1 + ldx #3 + +.2 lda SRC.ACC,x + >PUSHA + dex + bpl .1 + rts *--------------------------------------- MAN diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 5f281e31..79bdfd09 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -38,6 +38,7 @@ ZPMacroArgCnt .BS 1 DIR.Byte .BS 1 DIR.Word .BS 2 +SYM.LocalOfs .BS 2 ZPPtr1 .BS 2 ZPPtr2 .BS 2 @@ -57,9 +58,9 @@ SYMG .EQ 6 *--------------------------------------- SYML.ID .EQ 0 1..255 SYML.CtxID .EQ 1 0 if local, !0 if private -SYML.V .EQ 2 DWORD +SYML.O .EQ 2 WORD * -SYML .EQ 6 +SYML .EQ 4 *--------------------------------------- ASM.T.AM .EQ 0 ASM.T.R .EQ 2 @@ -149,22 +150,27 @@ L.SRC.ACC.SIZE .DA SRC.ACC.SIZE L.SRC.ACC .DA SRC.ACC L.SRC.ARG .DA SRC.ARG L.T.DIRECTIVES .DA T.DIRECTIVES -J.DIRECTIVES .DA DIR.AC 0 +J.DIRECTIVES .DA DIR.AC .DA DIR.AS .DA DIR.AT .DA DIR.AZ .DA DIR.BS + .DA DIR.CS + .DA DIR.CZ .DA DIR.DA - .DA DIR.DO 12 +DIR.DO.ID .EQ *-J.DIRECTIVES + .DA DIR.DO .DA DIR.DU .DA DIR.DU .DA DIR.ED - .DA DIR.EL 20 +DIR.EL.ID .EQ *-J.DIRECTIVES + .DA DIR.EL .DA DIR.EM .DA DIR.EN .DA DIR.EP .DA DIR.EQ - .DA DIR.FI 30 +DIR.FI.ID .EQ *-J.DIRECTIVES + .DA DIR.FI .DA DIR.HS .DA DIR.IN .DA DIR.IN @@ -184,6 +190,7 @@ J.DIRECTIVES .DA DIR.AC 0 .DA DIR.OR .DA DIR.PG .DA DIR.PH + .DA DIR.PS .DA DIR.SE .DA DIR.TA .DA DIR.TF @@ -341,7 +348,7 @@ CS.RUN.LOOP ldy #S.PS.hStdIn .2 jsr SRC.ParseLine bcs .9 - jsr OUT.PrintLine + jmp OUT.PrintLine .8 clc rts @@ -364,6 +371,7 @@ CS.RUN.ARGS ldy #S.PS.ARGC lda ZPPtr1 >SYSCALL ArgV bcs .8 + >STYA ZPPtr2 lda (ZPPtr2) @@ -461,92 +469,101 @@ CS.QUIT >LDA.G SRC.Depth .INB usr/src/bin/asm.s.sym *--------------------------------------- CS.END -T.DIRECTIVES >PSTR "AC" - >PSTR "AS" - >PSTR "AT" - >PSTR "AZ" - >PSTR "BS" - >PSTR "DA" - >PSTR "DO" - >PSTR "DU" - >PSTR "DUMMY" - >PSTR "ED" - >PSTR "ELSE" - >PSTR "EM" - >PSTR "EN" - >PSTR "EP" - >PSTR "EQ" - >PSTR "FIN" - >PSTR "HS" - >PSTR "IN" - >PSTR "INB" - >PSTR "INB1" - >PSTR "INB2" - >PSTR "INB3" - >PSTR "INB4" - >PSTR "INB5" - >PSTR "INB6" - >PSTR "INB7" - >PSTR "INB8" - >PSTR "INB9" - >PSTR "LI" - >PSTR "LIST" - >PSTR "MA" - >PSTR "OP" - >PSTR "OR" - >PSTR "PG" - >PSTR "PH" - >PSTR "SE" - >PSTR "TA" - >PSTR "TF" - >PSTR "TI" - >PSTR "US" +T.DIRECTIVES .PS "AC" + .PS "AS" + .PS "AT" + .PS "AZ" + .PS "BS" + .PS "CS" + .PS "CZ" + .PS "DA" + .PS "DO" + .PS "DU" + .PS "DUMMY" + .PS "ED" + .PS "ELSE" + .PS "EM" + .PS "EN" + .PS "EP" + .PS "EQ" + .PS "FIN" + .PS "HS" + .PS "IN" + .PS "INB" + .PS "INB1" + .PS "INB2" + .PS "INB3" + .PS "INB4" + .PS "INB5" + .PS "INB6" + .PS "INB7" + .PS "INB8" + .PS "INB9" + .PS "LI" + .PS "LIST" + .PS "MA" + .PS "OP" + .PS "OR" + .PS "PG" + .PS "PH" + .PS "PS" + .PS "SE" + .PS "TA" + .PS "TF" + .PS "TI" + .PS "US" .HS 00 *--------------------------------------- -T.LI >PSTR "ON" - >PSTR "OFF" - >PSTR "CON" - >PSTR "COFF" - >PSTR "MON" - >PSTR "MOFF" - >PSTR "XON" - >PSTR "XOFF" +T.LI .PS "ON" + .PS "OFF" + .PS "CON" + .PS "COFF" + .PS "MON" + .PS "MOFF" + .PS "XON" + .PS "XOFF" .HS 00 +*-------------------------------------- +DIR.EscChars .AS "abefnrtv" + .HS 5C27223F \'"? +DIR.EscChars.L .EQ *-DIR.EscChars +DIR.EscCodes .HS 07081B0C0A0D090B + .HS 5C27223F *--------------------------------------- -SRC.MOD.RESERVED >PSTR "#/^<>" -SRC.EXP.RESERVED >PSTR "^!|&<=>+-*/" -SRC.AM.RESERVED >PSTR "[]()," +SRC.MOD.RESERVED .PS "#/^<>" +SRC.EXP.RESERVED .PS "^!|&<=>+-*/" +SRC.AM.RESERVED .PS "[]()," *--------------------------------------- DIR.SYS .AZ "SYS" -*--------------------------------------- ASM.6502 .AZ "6502" -MSG.HELP .AS "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\n" - .AS "Usage : ASM [type TXT ($04) or S-C/BAS ($FA)]\r\n" - .AS " -L : Override .LIST (C,M,X)OFF\r\n" - .AS " -T : Override .TF directive" -MSG.CRLF .AZ "\r\n" -MSG.PASS .AZ "**** Pass:#%d" -MSG.SRC.FILE .AZ "**** Reading SRC File:%s" -MSG.OBJ.FILE .AZ "**** Writing OBJ File:%s, Type=%02x" -MSG.CPU.FILE .AZ "**** Loading CPU File:%s" -MSG.OUT0 .AZ "%H- " -MSG.OUT1 .AZ "%H-%h " -MSG.OUT2 .AZ "%H-%h %h " -MSG.OUT3 .AZ "%H-%h %h %h" -MSG.EQU0 .AZ " [ ?] " -MSG.EQU1 .AZ " [ %h] " -MSG.EQU2 .AZ " [ %h%h] " -MSG.EQU3 .AZ " [ %h%h%h] " -MSG.EQU4 .AZ " [%h%h%h%h] " -MSG.LINENUM .AZ " %05D " -MSG.ERROR .AZ "**** Fatal Error $%h" -MSG.SYMBOLS .AZ "**** Symbol Table:" -MSG.LSYMBOL .AZ " .%d=%h%h%h%h" -MSG.PSYMBOL .AZ " :%d(%d)=%h%h%h%h" -MSG.SUMMARY .AZ "\r\n**** Symbol Table Size : %5D Bytes.\r\n" -MSG.END .AZ "**** End Of Assembly." +*--------------------------------------- +MSG.HELP .CS "A2osX-Macro Assembler (S-C MASM 3.1 Dialect)\r\n" + .CS "Usage : ASM [type TXT ($04) or S-C/BAS ($FA)]\r\n" + .CS " -L : Override .LIST (C,M,X)OFF\r\n" + .CS " -T : Override .TF directive" +MSG.CRLF .CZ "\r\n" +MSG.PASS .CZ "**** Pass:#%d" +MSG.SRC.FILE .CZ "**** Reading SRC File:%s" +MSG.OBJ.FILE .CZ "**** Writing OBJ File:%s, Type=%02x" +MSG.CPU.FILE .CZ "**** Loading CPU File:%s" +MSG.OUT0 .CZ "%H- " +MSG.OUT1 .CZ "%H-%h " +MSG.OUT2 .CZ "%H-%h %h " +MSG.OUT3 .CZ "%H-%h %h %h" +MSG.EQU0 .CZ " [ ?] " +MSG.EQU1 .CZ " [ %h] " +MSG.EQU2 .CZ " [ %h%h] " +MSG.EQU3 .CZ " [ %h%h%h] " +MSG.EQU4 .CZ " [%h%h%h%h] " +MSG.LINENUM .CZ " %05D " +MSG.ERROR .CZ "**** Fatal Error $%h" +MSG.SYMBOLS .CZ "**** Symbol Table:" +MSG.LSYMBOL .CZ " .%d=%h%h%h%h" +MSG.PSYMBOL .CZ " :%d(%d)=%h%h%h%h" +MSG.SUMMARY .CZ "\r\n**** Symbol Table Size : %5D Bytes.\r\n" +MSG.END .CZ "**** End Of Assembly." .DO ASMDBG=1 -MSG.DBG .AZ "\r\nCtxID=%d, ARG=%H%H ACC=%H%H -> ACC %b [%h]\r\n" +MSG.DBG .CZ "\r\nCtxID=%d, ARG=%H%H ACC=%H%H -> ACC %b [%h]\r\n" .FIN *--------------------------------------- ASM.CPU.FILE .BS 65 diff --git a/BIN/CC.S.CORE.txt b/BIN/CC.S.CORE.txt index 59da5e0d..15e7c760 100644 --- a/BIN/CC.S.CORE.txt +++ b/BIN/CC.S.CORE.txt @@ -164,23 +164,29 @@ CC.CompileLine jsr CC.GetCharNB *-------------------------------------- CC.CompileStmt >LDYA L.CC.KW jsr CC.LookupID - bcs .10 not an internal CC keyword.... + bcs .1 not an internal CC keyword.... txa >STA.G CC.CmdSave jmp (J.CC.KW,x) *-------------------------------------- -* Declaration : int var or int func() +* Declaration : typedef, type var or type func() *-------------------------------------- -.10 >LDYA L.CC.TYPEQUAL +.1 >LDYA L.CC.SCSPEC jsr CC.LookupID - bcs .6 + bcs .2 + + jmp (J.CC.SCSPEC,x) + +.2 >LDYA L.CC.TYPEQUAL + jsr CC.LookupID + bcs .3 jmp CC.DECL *-------------------------------------- * Statement : ++var, var=, func(); *-------------------------------------- -.6 jmp CC.STMT +.3 jmp CC.STMT *-------------------------------------- .99 lda #E.CSYN sec diff --git a/BIN/CC.S.DECL.txt b/BIN/CC.S.DECL.txt index db550dde..9b557a63 100644 --- a/BIN/CC.S.DECL.txt +++ b/BIN/CC.S.DECL.txt @@ -1,71 +1,6 @@ NEW AUTO 3,1 *-------------------------------------- -* X = type qual -*-------------------------------------- -CC.DECL jsr CC.TYPE.Decl - bcs .9 - - ldx #SYM.SC.STATIC Y,A = Type/Qual - bit bLocalScope - bpl .25 - - bit #SYM.Q.FUNC someone wants to add a local f() ? - sec - bne .29 - - ldx #SYM.SC.AUTO - -.25 jsr CC.SYM.New Y,A=T/Q, add with undef value... - bcs .29 OOM or DUP - -.22 jsr CC.GetCharNB - bcs .99 - - cmp #';' - beq .28 - - cmp #'{' - bne .26 - - jsr CC.GetNextCharNB skip '{' - bcs .99 - - jmp CC.SYM.StoreF -*-------------------------------------- -* Initializer -*-------------------------------------- -.26 cmp #'=' type var = value ? - bne .99 - - jsr CC.GetNextCharNB skip '=' - bcs .99 - - jsr CC.SYM.GetTypeInYA expected T/Q - jsr CC.EXP.Eval - bcs .9 - - jsr CC.SYM.GetAddr1 - bcs .9 - - jsr CC.SYM.GetTypeInYA Y,A = T/Q - jsr CC.SYM.PopValue Set value to this var -.29 bcs .9 - -.28 jsr CC.SYM.Store - bcs .9 - - jsr CC.GetCharNB - cmp #';' - bne .99 - - clc - rts -*-------------------------------------- -.99 lda #E.CSYN - sec -.9 rts -*-------------------------------------- CC.SCSPEC.AUTO CC.SCSPEC.REGISTER CC.SCSPEC.STATIC @@ -75,7 +10,101 @@ CC.SCSPEC.EXTERN .99 rts *-------------------------------------- CC.SCSPEC.TYPEDEF - >DEBUG + jsr CC.GetNextCharNB + bcs .98 + + >LDYA L.CC.TYPEQUAL + jsr CC.LookupID + bcs .98 + + cpx #4 no const nor volatile + bcc .98 + + jsr CC.TYPE.Decl + bcs .99 + + ldx #SYM.SC.TYPEDEF + sec Reset Buffer + jsr CC.SYM.New Y,A=T/Q,storage class TYPEDEF + bcs .99 + + jsr CC.GetCharNB + bcs .98 + + cmp #';' + bne .98 + + jsr CC.GetNextCharNB skip ';' + + jmp CC.SYM.Store + +.98 lda #E.CSYN + sec +.99 +CC.SCSPEC.TYPEDEF.RTS + rts +*-------------------------------------- +* X = type qual +*-------------------------------------- +CC.DECL jsr CC.TYPE.Decl + bcs CC.SCSPEC.TYPEDEF.RTS + + sec Reset Buffer + +CC.DECL.YAC ldx #SYM.SC.STATIC Y,A = Type/Qual + bit bLocalScope + bpl .25 + + bit #SYM.Q.FUNC someone wants to add a local f() ? + bne .98 + + ldx #SYM.SC.AUTO + +.25 jsr CC.SYM.New Y,A=T/Q, add with undef value... + bcs .98 OOM or DUP + +.22 jsr CC.GetCharNB + bcs .98 + + cmp #';' + beq .28 + + cmp #'{' + bne .26 + + jsr CC.GetNextCharNB skip '{' + bcs .98 + + jmp CC.SYM.StoreF +*-------------------------------------- +* Initializer +*-------------------------------------- +.26 cmp #'=' type var = value ? + bne .98 + + jsr CC.GetNextCharNB skip '=' + bcs .98 + + jsr CC.SYM.GetTypeInYA expected T/Q + jsr CC.EXP.Eval + bcs .99 + + jsr CC.SYM.GetAddr1 + bcs .99 + + jsr CC.SYM.GetTypeInYA Y,A = T/Q + jsr CC.SYM.PopValue Set value to this var +.29 bcs .99 + +.28 jsr CC.SYM.Store + bcs .99 + + jsr CC.GetCharNB + cmp #';' + bne .98 + + clc + rts .98 lda #E.CSYN sec diff --git a/BIN/CC.S.F.txt b/BIN/CC.S.F.txt index c4e401f9..1e45a58e 100644 --- a/BIN/CC.S.F.txt +++ b/BIN/CC.S.F.txt @@ -25,6 +25,7 @@ CC.F.Decl stz LocalPtr >STYA ZPPtr2 Save T/Q jsr CC.SYM.AddWord + bcs .99 jsr CC.GetCharNB bcs .9 @@ -51,9 +52,8 @@ CC.F.Decl stz LocalPtr sec .99 rts *-------------------------------------- -.6 ldy #0 - lda #0 - jsr CC.SYM.AddWord definition End +.6 jsr CC.SYM.Add0000 definition End + bcs .99 jsr CC.GetNextCharNBNL Skip ) bcs .9 @@ -146,6 +146,7 @@ CC.F.NewArg >LDYA.G CC.SymID >LDYA ZPPtr2 ldx #SYM.SC.AUTO + sec Reset Buffer jsr CC.SYM.New bcs .9 diff --git a/BIN/CC.S.KW.txt b/BIN/CC.S.KW.txt index c8006d2d..aa1d48ea 100644 --- a/BIN/CC.S.KW.txt +++ b/BIN/CC.S.KW.txt @@ -53,7 +53,7 @@ CC.KW.IF.END jsr CC.GetCharNBNL .1 lda #'E' define ELSE Label jsr CC.KW.NewLabel bcs .99 - + clv pop context rts *-------------------------------------- @@ -159,7 +159,7 @@ CC.KW.DO jsr CC.KW.BEGIN00 lda #'C' define CONT Label jsr CC.SYM.NewA bcs .99 - + jmp CC.KW.STMT .99 rts @@ -199,14 +199,14 @@ CC.KW.DO.END >LDYA L.CC.KW2.DO Check allowed KW for DO.... cmp #')' bne .9 - + jsr CC.GetNextCharNB bcs .9 clv pop context clc rts - + .9 lda #E.CSYN sec .99 rts @@ -354,10 +354,10 @@ CC.KW.SWITCH jsr CC.GetCharNB tax bne .97 - + cpy #SYM.T.UCHAR bcc .97 - + cpy #SYM.T.FLOAT bcs .97 @@ -371,10 +371,10 @@ CC.KW.SWITCH jsr CC.GetCharNB jsr CC.Push push SizeOf(type) bcs .99 - + jsr CC.KW.BEGIN bcs .99 - + jsr CC.GetCharNB bcs .99 @@ -382,10 +382,10 @@ CC.KW.SWITCH jsr CC.GetCharNB bne .98 jmp CC.KW.STMT - + .97 lda #E.TMISMATCH sec - rts + rts .98 lda #E.CSYN sec @@ -395,7 +395,7 @@ CC.KW.SWITCH.END lda #'B' define BREAK Label jsr CC.KW.NewLabel bcs .99 - + clv pop context .99 rts @@ -407,7 +407,7 @@ CC.KW.CASE ldy CStackPtr lda (ZPCCStack),y cmp #10 SWITCH ?? bne .9 - + lda CStackPtr clc adc #7 @@ -416,13 +416,13 @@ CC.KW.CASE ldy CStackPtr lda (ZPCCStack),y type tay lda #0 for integral type - + jsr CC.EXP.Eval bcs .99 jsr CC.GetCharNB bcs .9 - + cmp #':' bne .9 @@ -430,7 +430,7 @@ CC.KW.CASE ldy CStackPtr clc rts - + .9 lda #E.CSYN sec .99 rts @@ -442,18 +442,18 @@ CC.KW.DEFAULT ldy CStackPtr lda (ZPCCStack),y cmp #10 SWITCH ?? bne .9 - + jsr CC.GetCharNB bcs .9 - + cmp #':' bne .9 jsr CC.GetNextCharNB skip ':' - + clc rts - + .9 lda #E.CSYN sec .99 rts @@ -462,10 +462,10 @@ CC.KW.BREAK lda #'B' jsr CC.KW.LookupLabel bcs .9 - + lda #$4C emit JMP break jmp CODE.TOABSYX - + .9 lda #E.CSYN sec rts @@ -474,10 +474,10 @@ CC.KW.CONTINUE lda #'C' jsr CC.KW.LookupLabel bcs .9 - + lda #$4C emit JMP cont jmp CODE.TOABSYX - + .9 lda #E.CSYN sec rts @@ -531,51 +531,275 @@ CC.KW.SIZEOF sec rts *-------------------------------------- -CC.KW.STRUCT >ENTER 4 +CC.KW.STRUCT clc + .HS B0 BCS +*-------------------------------------- +CC.KW.UNION sec + stz ZPPtr2 bNewTagDef + + ror ZPPtr2+1 bStrucUnion - jsr CC.GetCharNB - bcs .99 - - ldx #SYM.SC.TAG - >LDA.G CC.hTags - jsr CC.SYM.NewKey - bcs .99 - - sta (pStack) Y,A = KeyID - tya - ldy #1 - sta (pStack),y - - jsr CC.SkipX - - jsr CC.GetNextCharNB - bcs .99 + bit bPass2 + bpl CC.KW.SU.1 Pass 1: create def +*-------------------------------------- +CC.KW.SU.2 jsr CC.GetNextCharNB + bcs .98 cmp #'{' - bne .99 + beq .1 no TAG -.1 jsr CC.GetNextCharNB + jsr CC.KW.GetTag bcs .99 + jsr CC.GetNextCharNBNL + bcs .98 + + cmp #'{' + bne .2 + +.1 jsr CC.GetNextCharNBNL skip '{' + cmp #'}' bne .1 - jsr CC.GetNextCharNB skip '}' + jsr CC.GetNextCharNBNL skip '}' + + cmp #';' + bne .2 + + jsr CC.GetNextCharNB skip ';' + + clc + rts + +.2 clc reuse buffer + + jsr CC.SYM.Lookup + bcs .99 + + jsr CC.GetCharNB + bcs .98 + + cmp #',' + bne .3 + + jsr CC.GetNextCharNBNL + bcc .2 + bcs .98 + +.3 cmp #';' + bne .98 + + clc + rts + +.98 lda #E.CSYN + sec +.99 rts +*-------------------------------------- +CC.KW.SU.1 ldy #SYM.T.STRUCT + lda #0 + ldx #SYM.SC.TAG + sec reset buffer + jsr CC.SYM.BufInitYAX + + jsr CC.GetNextCharNB + bcs .98 + + cmp #'{' + beq .30 no TAG + + jsr CC.KW.NewTag + bcc .20 + + jsr CC.KW.GetTag + bcs .99 +*-------------------------------------- +.20 jsr CC.GetNextCharNBNL + bcs .98 + + cmp #'{' + beq .30 + + bit ZPPtr2 bNewTagDef + bmi .98 + + bra .41 go create vars... +*-------------------------------------- +.30 jsr CC.GetNextCharNBNL skip '{' of ';' + bcs .98 + + cmp #'}' + beq .38 + + >LDYA L.CC.TYPEQUAL + jsr CC.LookupID + bcs .98 + + cpx #4 no const nor volatile + bcc .98 + + jsr CC.TYPE.Decl + bcs .99 + + jsr CC.TYPE.SizeOf get sizeof in X + + jsr CC.KW.SU.AddYAX + bcs .99 + + jsr CC.SYM.Add0000 TODO: bitO & bitW + bcs .99 + + jsr CC.SYM.AddName + bcs .99 + + jsr CC.GetCharNB + cmp #';' + bne .98 + + bra .30 + +.38 jsr CC.GetNextCharNB skip '}' + bcs .98 + + cmp #';' + bne .40 + + jsr CC.GetNextCharNB skip ';' + + bit ZPPtr2 bNewTagDef + bpl .98 no tag & no var, error + + jmp CC.KW.StoreTag +*-------------------------------------- +.98 lda #E.CSYN + sec +.99 rts +*-------------------------------------- +.40 bit ZPPtr2 bNewTagDef + bpl .41 + + jsr CC.KW.StoreTag + bcs .99 + +.41 clc reuse buffer + + ldy #SYM.T.STRUCT + lda #0 + jsr CC.DECL.YAC + bcs .99 + + jsr CC.GetCharNB + bcs .98 + + cmp #',' + bne .42 + + jsr CC.GetNextCharNBNL + bcc .41 + bcs .98 + +.42 cmp #';' + bne .98 clc -.99 >LEAVE rts *-------------------------------------- -CC.KW.UNION +CC.KW.SU.AddYAX jsr CC.SYM.AddWord add T/Q + bcs .99 + + bit ZPPtr2+1 bStrucUnion + bmi .1 + + ldy #SYM.SizeOf + lda (ZPSymBufPtr),y + pha + iny + lda (ZPSymBufPtr),y + ply + + jsr CC.SYM.AddWord Add Y/A Offset + bcs .99 + + txa + + ldy #SYM.SizeOf +* clc + adc (ZPSymBufPtr),y + sta (ZPSymBufPtr),y + bcc .99 + + iny + lda #0 + adc (ZPSymBufPtr),y + sta (ZPSymBufPtr),y + +* clc + +.99 rts + +.1 txa + ldy #SYM.SizeOf + cmp (ZPSymBufPtr),y + bcs .2 + + sta (ZPSymBufPtr),y + +.2 jmp CC.SYM.Add0000 Add Y/A Offset (always 0 for union) +*-------------------------------------- CC.KW.ENUM lda #E.CSYN sec rts *-------------------------------------- +CC.KW.NewTag >LDA.G CC.hTags + jsr CC.SYM.NewKey + bcs .9 + + >STYA ZPPtr1 TagID + dec ZPPtr2 bNewTagDef = true + + jsr CC.SkipX + +.9 rts +*-------------------------------------- +CC.KW.GetTag >PUSHB.G CC.hTags + >PUSHW ZPLineBufPtr + + >SYSCALL SListLookup + bcs .9 + + phy Y,A = KeyID + pha + + jsr CC.SkipX X = KeyLen + + >PUSHB.G CC.hTags + pla + >PUSHA + pla + >PUSHA + >PUSHW ZPSymBufPtr + >PUSHWI 65535 all + >PUSHWZ From Start + >SYSCALL SListGetData +.9 rts +*-------------------------------------- +CC.KW.StoreTag >PUSHB.G CC.hTags + >PUSHW ZPPtr1 + >PUSHW ZPSymBufPtr + >PUSHBI 0 + ldy #SYM.DefSize + lda (ZPSymBufPtr),y + >PUSHA + + >SYSCALL SListAddData + rts +*-------------------------------------- CC.KW.BEGIN00 lda #0 jsr CC.Push no T/Q bcs CC.KW.BEGIN.RTS - + jsr CC.Push bcs CC.KW.BEGIN.RTS @@ -670,7 +894,7 @@ CC.KW.LookupLabel lda (ZPCCStack),y bmi .9 f() - + iny iny iny @@ -680,12 +904,12 @@ CC.KW.LookupLabel iny lda (ZPCCStack),y iny - + iny iny - + sty ArgIndex - + ply >STYA.G CC.CPSPFX+2 @@ -693,10 +917,10 @@ CC.KW.LookupLabel pha jsr CC.SYM.LookupA bcs .1 - + pla .8 rts - + .9 pla lda #E.CSYN sec diff --git a/BIN/CC.S.LINK.txt b/BIN/CC.S.LINK.txt index 7497f4c7..e2118aea 100644 --- a/BIN/CC.S.LINK.txt +++ b/BIN/CC.S.LINK.txt @@ -26,6 +26,11 @@ CC.Link >LDYA L.MSG.LINKING >SYSCALL SListGetData bcs .99 + ldy #SYM.SC + lda (ZPSymBufPtr),y + cmp #SYM.SC.TYPEDEF + bcs .6 + ldy #SYM.Addr+1 lda (ZPSymBufPtr),y dey diff --git a/BIN/CC.S.STMT.txt b/BIN/CC.S.STMT.txt index a229cb4a..d5a59ffa 100644 --- a/BIN/CC.S.STMT.txt +++ b/BIN/CC.S.STMT.txt @@ -28,7 +28,30 @@ CC.STMT jsr CC.GetCharNB jmp CC.SYM.LookupFree -.60 jsr STMT.SetVar +.60 ldy #SYM.SC + lda (ZPLookupSymPtr),y + cmp #SYM.SC.TYPEDEF + bne .61 + + jsr CC.GetNextCharNB + bcs .9 + + ldy #SYM.Q + lda (ZPLookupSymPtr),y + pha + lda (ZPLookupSymPtr) + pha + + jsr CC.SYM.LookupFree + + ply + pla + + sec Reset Buffer + + jmp CC.DECL.YAC + +.61 jsr STMT.SetVar bcs .99 jmp CC.SYM.LookupFree diff --git a/BIN/CC.S.SYM.txt b/BIN/CC.S.SYM.txt index 2ba6fe00..8c11ab38 100644 --- a/BIN/CC.S.SYM.txt +++ b/BIN/CC.S.SYM.txt @@ -2,16 +2,18 @@ NEW AUTO 3,1 *-------------------------------------- * Input : ZPLineBufPtr, Y,A = T/Q, X = SC +* CS : Reset Buffer +* CC : Reuse Buffer * Output : Y,A = VarID *-------------------------------------- CC.SYM.New >STYA ZPPtr2 T/Q stx ZPPtr3 SC bit bPass2 - bpl CC.SYM.New1 + bpl CC.SYM.New.1 bit bLocalScope - bmi CC.SYM.New1 + bmi CC.SYM.New.1 >PUSHB.G CC.hScopes Global Scope >PUSHW ZPLineBufPtr @@ -29,11 +31,13 @@ CC.SYM.New >STYA ZPPtr2 T/Q >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData - bcc CC.SYM.New2 + bcc CC.SYM.New.2 CC.SYM.New.9 rts Y,A = SymSize *-------------------------------------- -CC.SYM.New1 ldy ScopeIdx +CC.SYM.New.1 jsr CC.SYM.BufInitYAX set buf according C + + ldy ScopeIdx lda (pData),y jsr CC.SYM.NewKey bcs CC.SYM.New.9 @@ -41,34 +45,21 @@ CC.SYM.New1 ldy ScopeIdx >STYA.G CC.SymID Y,A = KeyID jsr CC.SkipX X = KeyLen +*-------------------------------------- +CC.SYM.New.2 jsr CC.GetCharNB + bcs .98 - lda ZPPtr2 - sta (ZPSymBufPtr) #SYM.T - - lda ZPPtr2+1 - ldy #SYM.Q - sta (ZPSymBufPtr),y - - lda ZPPtr3 - iny #SYM.SC - sta (ZPSymBufPtr),y - - iny - lda #0 - -.1 sta (ZPSymBufPtr),y - iny - cpy #SYM.Def + cmp #';' bne .1 - tya - ldy #SYM.DefSize - sta (ZPSymBufPtr),y -*-------------------------------------- -CC.SYM.New2 jsr CC.GetCharNB - bcs CC.SYM.SetAddr + lda ZPPtr3 + cmp #SYM.SC.TYPEDEF + bne CC.SYM.SetAddr - cmp #'(' + clc + rts + +.1 cmp #'(' bne CC.SYM.NewV ldy #SYM.Q @@ -77,6 +68,10 @@ CC.SYM.New2 jsr CC.GetCharNB sta (ZPSymBufPtr),y jmp CC.F.Decl + +.98 lda #E.CSYN + sec +.99 rts *-------------------------------------- CC.SYM.NewV cmp #'[' bne CC.SYM.SetAddr @@ -98,7 +93,7 @@ CC.SYM.NewV cmp #'[' sta (ZPSymBufPtr),y jsr CC.GetNextCharNB Skip [ - bcs .99 + bcs .98 cmp #']' bne .2 @@ -106,22 +101,24 @@ CC.SYM.NewV cmp #'[' ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.PPPOINTER - beq .99 [] only allowed for * + beq .98 [] only allowed for * + + jsr CC.SYM.Add0000 set as [0] (deref) + bcs .99 - >LDYAI 0 set as [0] (deref) - jsr CC.SYM.AddWord bra .3 .2 jsr CC.EXP.IntConst - bcs .99 + bcs .98 jsr CC.SYM.AddWord - - jsr CC.GetCharNB bcs .99 + jsr CC.GetCharNB + bcs .98 + cmp #']' - bne .99 + bne .98 .3 jsr CC.GetNextCharNB Skip ] bcs CC.SYM.SetAddr @@ -133,15 +130,22 @@ CC.SYM.NewV cmp #'[' lda (ZPSymBufPtr),y and #SYM.Q.AAARRAY cmp #SYM.Q.AAARRAY - beq .99 already [][][] + bne .1 already [][][] ? - bra .1 - -.99 lda #E.CSYN +.98 lda #E.CSYN sec -.9 rts +.99 rts *-------------------------------------- -CC.SYM.SetAddr ldy #SYM.Q +CC.SYM.SetAddr ldy #SYM.SizeOf + lda (ZPSymBufPtr),y + iny + ora (ZPSymBufPtr),y + bne .1 + + jsr CC.SYM.GetSymSizeOfInAXC + jsr CC.SYM.SetSizeOf + +.1 ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.FUNC bne .9 @@ -157,14 +161,7 @@ CC.SYM.SetAddr ldy #SYM.Q sec rts *-------------------------------------- -CC.SYM.SetAddrG jsr CC.SYM.GetSymSizeOfInAXC - jsr CC.SYM.SetSizeOf - -* clc / sec A,X=Size, CS if pointer - - pha - - ldy #SYM.Addr +CC.SYM.SetAddrG ldy #SYM.Addr lda ZPCCData sta (ZPSymBufPtr),y @@ -174,22 +171,21 @@ CC.SYM.SetAddrG jsr CC.SYM.GetSymSizeOfInAXC lda ZPCCData+1 sta (ZPSymBufPtr),y - pla + ldy #SYM.SizeOf + lda (ZPSymBufPtr),y clc adc ZPCCData sta ZPCCData - txa + iny + lda (ZPSymBufPtr),y adc ZPCCData+1 sta ZPCCData+1 clc rts *-------------------------------------- -CC.SYM.SetAddrL jsr CC.SYM.GetSymSizeOfInAXC - jsr CC.SYM.SetSizeOf - - ldy #SYM.SizeOf+1 +CC.SYM.SetAddrL ldy #SYM.SizeOf+1 lda (ZPSymBufPtr),y bne .9 @@ -197,8 +193,7 @@ CC.SYM.SetAddrL jsr CC.SYM.GetSymSizeOfInAXC lda (ZPSymBufPtr),y -* clc / sec A,X=Size, CS if pointer - clc + clc adc LocalPtr sta LocalPtr bcs .9 @@ -206,7 +201,8 @@ CC.SYM.SetAddrL jsr CC.SYM.GetSymSizeOfInAXC ldy #SYM.Addr sta (ZPSymBufPtr),y - jsr CC.SYM.GetSymSizeOfInAXC + ldy #SYM.SizeOf + lda (ZPSymBufPtr),y jsr CODE.nAddLocal clc @@ -216,6 +212,35 @@ CC.SYM.SetAddrL jsr CC.SYM.GetSymSizeOfInAXC sec rts *-------------------------------------- +CC.SYM.BufInitYAX + pha + tya + sta (ZPSymBufPtr) #SYM.T + + pla + ldy #SYM.Q + sta (ZPSymBufPtr),y + + txa + iny #SYM.SC + sta (ZPSymBufPtr),y + + bcc .8 DONT reset buffer + + iny + lda #0 + +.1 sta (ZPSymBufPtr),y + iny + cpy #SYM.Def + bne .1 + + tya + ldy #SYM.DefSize + sta (ZPSymBufPtr),y + +.8 rts +*-------------------------------------- CC.SYM.PushAddr ldy #SYM.SC lda (ZPSymBufPtr),y beq .1 SYM.SC.STATIC @@ -291,7 +316,7 @@ CC.SYM.GetAddr1 ldy #SYM.SC >LDYA L.PCC.GetIAddr1 jmp CODE.EmitPCC - + .2 >LDYA L.PCC.GetUAddr1 jmp CODE.EmitPCC @@ -344,25 +369,87 @@ CC.SYM.NewKey >PUSHA .9 rts Y,A = KeyID, X = KeyLen *-------------------------------------- -CC.SYM.AddWord pha - phy +CC.SYM.Add0000 >LDYAI 0 +*-------------------------------------- +CC.SYM.AddWord phy + pha ldy #SYM.DefSize lda (ZPSymBufPtr),y - pha - inc - inc + clc + adc #2 + bcs .9 + + sta (ZPSymBufPtr),y + tay + + dey + + pla A sta (ZPSymBufPtr),y - ply - - pla + dey + + pla Y + pha sta (ZPSymBufPtr),y iny + lda (ZPSymBufPtr),y get back A + ply get back Y + +* clc + rts + +.9 pla + pla + lda #E.BUF + sec + rts +*-------------------------------------- +CC.SYM.AddName jsr CC.GetCharNB + + bcs .98 + + jsr CC.IsLetter + bcs .98 + +.1 jsr CC.SYM.AddByte + bcs .99 + + jsr CC.GetNextCharNB + bcs .98 + + jsr CC.IsLetterOrDigit + bcc .1 + + lda #0 + bra CC.SYM.AddByte + +.98 lda #E.CSYN + sec +.99 rts +*-------------------------------------- +CC.SYM.AddByte pha + + ldy #SYM.DefSize + lda (ZPSymBufPtr),y + + inc + beq .9 + + sta (ZPSymBufPtr),y + dec + tay pla sta (ZPSymBufPtr),y -CC.SYM.AddWord.RTS + + clc + rts + +.9 pla + lda #E.BUF + sec rts *-------------------------------------- CC.SYM.NewCPSID >LDYA.G CC.CPSID @@ -372,19 +459,19 @@ CC.SYM.NewCPSID >LDYA.G CC.CPSID inc cmp #'Z'+1 bne .1 - + dey CC.CPSID lda (pData),y inc cmp #'Z'+1 beq .9 - + sta (pData),y lda #'A' iny CC.CPSID+1 - -.1 sta (pData),y + +.1 sta (pData),y clc rts @@ -402,7 +489,7 @@ CC.SYM.NewA bit bPass2 >PUSHEA.G CC.CPSPFX >SYSCALL SListNewKey - bcs CC.SYM.AddWord.RTS + bcs .99 >STYA.G CC.SymID Y,A = KeyID @@ -647,7 +734,7 @@ CC.SYM.LookupCheckTQ eor (ZPLookupSymPtr),y and #$F8 ignore VOLATILE|FUNC|FASTCALL bne .9 - + clc rts @@ -661,16 +748,16 @@ CC.SYM.PopValue jsr CC.SYM.GetYASizeOfInAXC tax dex bne .1 - + >LDYA L.PCC.PopValue1 jmp CODE.EmitPCC - + .1 cpx #1 bne .2 - + >LDYA L.PCC.PopValue2 jmp CODE.EmitPCC - + .2 jsr CODE.LDXI bcs .9 diff --git a/BIN/CC.S.TYPE.txt b/BIN/CC.S.TYPE.txt index d49f7f77..b5c63005 100644 --- a/BIN/CC.S.TYPE.txt +++ b/BIN/CC.S.TYPE.txt @@ -7,7 +7,7 @@ CC.TYPE.Decl >ENTER 2 ldy #1 sta (pStack),y Qual - jsr .7 + jsr .8 bcs .99 ldy #1 @@ -22,7 +22,7 @@ CC.TYPE.Decl >ENTER 2 .99 >LEAVE rts -.7 jmp (J.CC.TYPEQUAL,x) +.8 jmp (J.CC.TYPEQUAL,x) *-------------------------------------- * Type Declaration keywords *-------------------------------------- diff --git a/BIN/CC.S.txt b/BIN/CC.S.txt index 88a98f53..e9a54197 100644 --- a/BIN/CC.S.txt +++ b/BIN/CC.S.txt @@ -622,22 +622,22 @@ CS.END *-------------------------------------- * Initialized DATA *-------------------------------------- -MSG.GREETINGS .AZ "\r\nA2osX C Compiler %d.%d\r\n\r\n" -MSG.USAGE .AS "Usage : CC