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