From 963b351a526709784106b5db1757f2df78397243 Mon Sep 17 00:00:00 2001 From: Andy McFadden Date: Sat, 31 Aug 2019 20:32:43 -0700 Subject: [PATCH] Add 2019-local-variables test This hits most of the edge cases, but doesn't exercise the two duplicate name situations (var name same as user label, var name same as project/platform symbol). Also, fixed a bug in the EditDefSymbol uniqueness check where it was comparing a symbol to itself. --- SourceGen/DisasmProject.cs | 3 +- SourceGen/LocalVariableLookup.cs | 2 +- SourceGen/SGTestData/2019-local-variables | Bin 0 -> 137 bytes .../SGTestData/2019-local-variables.dis65 | 182 ++++++++++++++++++ .../Expected/2019-local-variables_64tass.S | 110 +++++++++++ .../Expected/2019-local-variables_Merlin32.S | 106 ++++++++++ .../Expected/2019-local-variables_acme.S | 110 +++++++++++ .../Expected/2019-local-variables_cc65.S | 111 +++++++++++ .../Expected/2019-local-variables_cc65.cfg | 13 ++ .../SGTestData/Source/2019-local-variables.S | 148 ++++++++++++++ SourceGen/WpfGui/EditDefSymbol.xaml.cs | 3 +- 11 files changed, 784 insertions(+), 4 deletions(-) create mode 100644 SourceGen/SGTestData/2019-local-variables create mode 100644 SourceGen/SGTestData/2019-local-variables.dis65 create mode 100644 SourceGen/SGTestData/Expected/2019-local-variables_64tass.S create mode 100644 SourceGen/SGTestData/Expected/2019-local-variables_Merlin32.S create mode 100644 SourceGen/SGTestData/Expected/2019-local-variables_acme.S create mode 100644 SourceGen/SGTestData/Expected/2019-local-variables_cc65.S create mode 100644 SourceGen/SGTestData/Expected/2019-local-variables_cc65.cfg create mode 100644 SourceGen/SGTestData/Source/2019-local-variables.S diff --git a/SourceGen/DisasmProject.cs b/SourceGen/DisasmProject.cs index 0732e2c..d098f00 100644 --- a/SourceGen/DisasmProject.cs +++ b/SourceGen/DisasmProject.cs @@ -932,7 +932,7 @@ namespace SourceGen { } else if (!sym.IsVariable) { // Somehow we have a variable and a non-variable with the same // name. Platform/project symbols haven't been processed yet, so - // this must be a clash with a user label. This will likely cause + // this must be a clash with a user label. This could cause // assembly source gen to fail later on. It's possible to do this // by "hiding" a table and then adding a user label, so we can't just // fix it at project load time. The full fix is to permanently @@ -940,7 +940,6 @@ namespace SourceGen { // hate trashing user data. Debug.WriteLine("Found non-variable with var name in symbol table: " + sym); - Debug.Assert(false); } } } diff --git a/SourceGen/LocalVariableLookup.cs b/SourceGen/LocalVariableLookup.cs index f629092..67b4d0b 100644 --- a/SourceGen/LocalVariableLookup.cs +++ b/SourceGen/LocalVariableLookup.cs @@ -245,7 +245,7 @@ namespace SourceGen { mRecentSymbols.Add(defSym); } - mCurrentTable.DebugDump(mNextLvtOffset); + //mCurrentTable.DebugDump(mNextLvtOffset); } // Update state to look for next table. diff --git a/SourceGen/SGTestData/2019-local-variables b/SourceGen/SGTestData/2019-local-variables new file mode 100644 index 0000000000000000000000000000000000000000..716a16a31a9fe0bd8c5d2b9a37ee98d57a5b20a5 GIT binary patch literal 137 zcmYkuy9ok86a~;bJ6pi4HZX`UGw@r2eQYTY#0o6IcOMumB6c;=n2R6SWI4$(Ji|>0{su$STkV& literal 0 HcmV?d00001 diff --git a/SourceGen/SGTestData/2019-local-variables.dis65 b/SourceGen/SGTestData/2019-local-variables.dis65 new file mode 100644 index 0000000..2447965 --- /dev/null +++ b/SourceGen/SGTestData/2019-local-variables.dis65 @@ -0,0 +1,182 @@ +### 6502bench SourceGen dis65 v1.0 ### +{ +"_ContentVersion":2,"FileDataLength":137,"FileDataCrc32":708791740,"ProjectProps":{ +"CpuName":"65816","IncludeUndocumentedInstr":false,"EntryFlags":32702671,"AutoLabelStyle":"Simple","AnalysisParams":{ +"AnalyzeUncategorizedData":true,"DefaultTextScanMode":"LowHighAscii","MinCharsForString":4,"SeekNearbyTargets":true}, +"PlatformSymbolFileIdentifiers":[],"ExtensionScriptFileIdentifiers":[],"ProjectSyms":{ +"CONST_ONE":{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"project const","Label":"CONST_ONE","Value":241,"Source":"Project","Type":"Constant"}, +"CONST_ZERO":{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"project const","Label":"CONST_ZERO","Value":240,"Source":"Project","Type":"Constant"}, +"PROJ_ONE":{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"project addr","Label":"PROJ_ONE","Value":1,"Source":"Project","Type":"ExternalAddr"}, +"PROJ_ZERO":{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"project addr","Label":"PROJ_ZERO","Value":0,"Source":"Project","Type":"ExternalAddr"}, +"PTR_2":{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"project addr, should clash","Label":"PTR_2","Value":248,"Source":"Project","Type":"ExternalAddr"}}}, +"AddressMap":[{ +"Offset":0,"Addr":4096}, +{ +"Offset":126,"Addr":128}],"TypeHints":[{ +"Low":0,"High":0,"Hint":"Code"}],"StatusFlagOverrides":{ +}, +"Comments":{ +}, +"LongComments":{ +"-2147483647":{ +"Text":"Would need to be edited to test duplicate labels. Those currently cause assembly to fail (see the X_* vars).","BoxMode":false,"MaxWidth":80,"BackgroundColor":0}, +"81":{ +"Text":"Test name redefinition. This is mostly of interest for assemblers without redefinable variables, but also of interest to the cross-reference window.","BoxMode":false,"MaxWidth":80,"BackgroundColor":0}}, +"Notes":{ +}, +"UserLabels":{ +"87":{ +"Label":"PTR_1","Value":4183,"Source":"User","Type":"LocalOrGlobalAddr"}, +"126":{ +"Label":"DPCODE","Value":128,"Source":"User","Type":"LocalOrGlobalAddr"}}, +"OperandFormats":{ +"8":{ +"Length":2,"Format":"NumericLE","SubFormat":"Symbol","SymbolRef":{ +"Label":"CONST_ZERO","Part":"Low"}}, +"24":{ +"Length":2,"Format":"NumericLE","SubFormat":"Decimal","SymbolRef":null}, +"26":{ +"Length":2,"Format":"NumericLE","SubFormat":"Decimal","SymbolRef":null}}, +"LvTables":{ +"12":{ +"Variables":[{ +"DataDescriptor":{ +"Length":2,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAR_ZERO","Value":0,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAR_TWO","Value":2,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAR_THREE","Value":3,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"CONST_ZERO_VAR","Value":240,"Source":"Variable","Type":"Constant"}],"ClearPrevious":false}, +"28":{ +"Variables":[{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"clash with project symbol","Label":"X_PROJ_ZERO","Value":16,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"clash with user label","Label":"X_DPCODE","Value":128,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"34":{ +"Variables":[],"ClearPrevious":false}, +"44":{ +"Variables":[],"ClearPrevious":true}, +"51":{ +"Variables":[{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"hidden table","Label":"HIDDEN0","Value":0,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"hidden table","Label":"HIDDEN1","Value":1,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"60":{ +"Variables":[{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"not hidden","Label":"NH0","Value":0,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"not hidden","Label":"NH1","Value":1,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"71":{ +"Variables":[{ +"DataDescriptor":{ +"Length":2,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"PTR0","Value":16,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":4,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"CONST0","Value":16,"Source":"Variable","Type":"Constant"}],"ClearPrevious":false}, +"81":{ +"Variables":[{ +"DataDescriptor":{ +"Length":2,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"#1","Label":"PTR","Value":32,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"83":{ +"Variables":[{ +"DataDescriptor":{ +"Length":2,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"#2","Label":"PTR","Value":34,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"85":{ +"Variables":[{ +"DataDescriptor":{ +"Length":2,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"#3","Label":"PTR","Value":36,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"88":{ +"Variables":[{ +"DataDescriptor":{ +"Length":2,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"PTR_A","Value":32,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"90":{ +"Variables":[{ +"DataDescriptor":{ +"Length":2,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"PTR_B","Value":31,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"92":{ +"Variables":[{ +"DataDescriptor":{ +"Length":4,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"PTR_C","Value":29,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"94":{ +"Variables":[{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"PTR_D","Value":33,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"96":{ +"Variables":[{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAL0","Value":48,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAL1","Value":49,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAL2","Value":50,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAL3","Value":51,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAL4","Value":52,"Source":"Variable","Type":"ExternalAddr"}, +{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAL5","Value":53,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"108":{ +"Variables":[{ +"DataDescriptor":{ +"Length":4,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"","Label":"VAL14","Value":49,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}, +"120":{ +"Variables":[{ +"DataDescriptor":{ +"Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, +"Comment":"same as org","Label":"DPNOP","Value":128,"Source":"Variable","Type":"ExternalAddr"}],"ClearPrevious":false}}} diff --git a/SourceGen/SGTestData/Expected/2019-local-variables_64tass.S b/SourceGen/SGTestData/Expected/2019-local-variables_64tass.S new file mode 100644 index 0000000..3820eb6 --- /dev/null +++ b/SourceGen/SGTestData/Expected/2019-local-variables_64tass.S @@ -0,0 +1,110 @@ +;Would need to be edited to test duplicate labels. Those currently cause +;assembly to fail (see the X_* vars). + .cpu "65816" +PROJ_ZERO = $00 ;project addr +PROJ_ONE = $01 ;project addr +CONST_ZERO = $f0 ;project const + +* = $1000 + .as + .xs + ldy PROJ_ZERO + lda (PROJ_ONE),y + sta $03 + ldx $04 + lda CONST_ZERO,s + sta $f1,s +VAR_ZERO .var $00 +VAR_TWO .var $02 +VAR_THREE .var $03 +CONST_ZERO_VAR .var $f0 + ldy VAR_ZERO + lda (VAR_ZERO+1),y + sta VAR_THREE + ldx $04 + lda CONST_ZERO_VAR,s + sta $f1,s + eor 0 + ora 240,s +X_PROJ_ZERO .var $10 ;clash with project symbol +X_DPCODE .var $80 ;clash with user label + lda VAR_ZERO + lda VAR_ZERO+1 + lda VAR_TWO + lda VAR_THREE + lda $04 + lda X_PROJ_ZERO + lda $11 + lda DPCODE + ldx PROJ_ZERO + ldx PROJ_ONE + ldx $02 + bit $ffa9 + ldy PROJ_ZERO + ldy PROJ_ONE + ldy $02 + .byte $2c +NH0 .var $00 ;not hidden +NH1 .var $01 ;not hidden +L103C lda #$fe + beq L103C + ldy NH0 + ldy NH1 + ldy $02 + nop +PTR0 .var $10 +CONST0 .var $10 + lda PTR0 + ldx PTR0+1 + ldy $12 + lda (CONST0,s),y + sta (CONST0+3,s),y +;Test name redefinition. This is mostly of interest for assemblers without +;redefinable variables, but also of interest to the cross-reference window. +PTR .var $20 ;#1 + ldx PTR +PTR .var $22 ;#2 + ldx PTR +PTR .var $24 ;#3 + ldx PTR +PTR_1 nop +PTR_A .var $20 + ldy PTR_A +PTR_B .var $1f + ldy PTR_B+1 +PTR_C .var $1d + ldy PTR_C+3 +PTR_D .var $21 + ldy PTR_C+3 +VAL0 .var $30 +VAL1 .var $31 +VAL2 .var $32 +VAL3 .var $33 +VAL4 .var $34 +VAL5 .var $35 + and VAL0 + and VAL1 + and VAL2 + and VAL3 + and VAL4 + and VAL5 +VAL14 .var $31 + and VAL0 + and VAL14 + and VAL14+1 + and VAL14+2 + and VAL14+3 + and VAL5 +DPNOP .var $80 ;same as org + lda DPCODE + jsr DPCODE + rts + + .logical $0080 +DPCODE nop + lda DPCODE + lda @wDPCODE + lda @lDPCODE + rts + + .here diff --git a/SourceGen/SGTestData/Expected/2019-local-variables_Merlin32.S b/SourceGen/SGTestData/Expected/2019-local-variables_Merlin32.S new file mode 100644 index 0000000..0663970 --- /dev/null +++ b/SourceGen/SGTestData/Expected/2019-local-variables_Merlin32.S @@ -0,0 +1,106 @@ +;Would need to be edited to test duplicate labels. Those currently cause +;assembly to fail (see the X_* vars). +PROJ_ZERO equ $00 ;project addr +PROJ_ONE equ $01 ;project addr +CONST_ZERO equ $f0 ;project const + + org $1000 + ldy PROJ_ZERO + lda (PROJ_ONE),y + sta $03 + ldx $04 + lda CONST_ZERO,S + sta $f1,S +]VAR_ZERO equ $00 +]VAR_TWO equ $02 +]VAR_THREE equ $03 +]CONST_ZERO_VAR equ $f0 + ldy ]VAR_ZERO + lda (]VAR_ZERO+1),y + sta ]VAR_THREE + ldx $04 + lda ]CONST_ZERO_VAR,S + sta $f1,S + eor 0 + ora 240,S +]X_PROJ_ZERO equ $10 ;clash with project symbol +]X_DPCODE equ $80 ;clash with user label + lda ]VAR_ZERO + lda ]VAR_ZERO+1 + lda ]VAR_TWO + lda ]VAR_THREE + lda $04 + lda ]X_PROJ_ZERO + lda $11 + lda DPCODE + ldx PROJ_ZERO + ldx PROJ_ONE + ldx $02 + bit $ffa9 + ldy PROJ_ZERO + ldy PROJ_ONE + ldy $02 + dfb $2c +]NH0 equ $00 ;not hidden +]NH1 equ $01 ;not hidden +L103C lda #$fe + beq L103C + ldy ]NH0 + ldy ]NH1 + ldy $02 + nop +]PTR0 equ $10 +]CONST0 equ $10 + lda ]PTR0 + ldx ]PTR0+1 + ldy $12 + lda (]CONST0,S),y + sta (]CONST0+3,S),y +;Test name redefinition. This is mostly of interest for assemblers without +;redefinable variables, but also of interest to the cross-reference window. +]PTR equ $20 ;#1 + ldx ]PTR +]PTR equ $22 ;#2 + ldx ]PTR +]PTR equ $24 ;#3 + ldx ]PTR +PTR_1 nop +]PTR_A equ $20 + ldy ]PTR_A +]PTR_B equ $1f + ldy ]PTR_B+1 +]PTR_C equ $1d + ldy ]PTR_C+3 +]PTR_D equ $21 + ldy ]PTR_C+3 +]VAL0 equ $30 +]VAL1 equ $31 +]VAL2 equ $32 +]VAL3 equ $33 +]VAL4 equ $34 +]VAL5 equ $35 + and ]VAL0 + and ]VAL1 + and ]VAL2 + and ]VAL3 + and ]VAL4 + and ]VAL5 +]VAL14 equ $31 + and ]VAL0 + and ]VAL14 + and ]VAL14+1 + and ]VAL14+2 + and ]VAL14+3 + and ]VAL5 +]DPNOP equ $80 ;same as org + lda DPCODE + jsr DPCODE + rts + + org $0080 +DPCODE nop + lda DPCODE + lda: DPCODE + ldal DPCODE + rts + diff --git a/SourceGen/SGTestData/Expected/2019-local-variables_acme.S b/SourceGen/SGTestData/Expected/2019-local-variables_acme.S new file mode 100644 index 0000000..d92dd05 --- /dev/null +++ b/SourceGen/SGTestData/Expected/2019-local-variables_acme.S @@ -0,0 +1,110 @@ +;Would need to be edited to test duplicate labels. Those currently cause +;assembly to fail (see the X_* vars). + !cpu 65816 +PROJ_ZERO = $00 ;project addr +PROJ_ONE = $01 ;project addr +CONST_ZERO = $f0 ;project const + +* = $1000 + !as + !rs + ldy PROJ_ZERO + lda (PROJ_ONE),y + sta $03 + ldx $04 + lda CONST_ZERO,S + sta $f1,S +VAR_ZERO = $00 +VAR_TWO = $02 +VAR_THREE = $03 +CONST_ZERO_VAR = $f0 + ldy VAR_ZERO + lda (VAR_ZERO+1),y + sta VAR_THREE + ldx $04 + lda CONST_ZERO_VAR,S + sta $f1,S + eor 0 + ora 240,S +X_PROJ_ZERO = $10 ;clash with project symbol +X_DPCODE = $80 ;clash with user label + lda VAR_ZERO + lda VAR_ZERO+1 + lda VAR_TWO + lda VAR_THREE + lda $04 + lda X_PROJ_ZERO + lda $11 + lda+1 DPCODE + ldx PROJ_ZERO + ldx PROJ_ONE + ldx $02 + bit $ffa9 + ldy PROJ_ZERO + ldy PROJ_ONE + ldy $02 + !byte $2c +NH0 = $00 ;not hidden +NH1 = $01 ;not hidden +L103C lda #$fe + beq L103C + ldy NH0 + ldy NH1 + ldy $02 + nop +PTR0 = $10 +CONST0 = $10 + lda PTR0 + ldx PTR0+1 + ldy $12 + lda (CONST0,S),y + sta (CONST0+3,S),y +;Test name redefinition. This is mostly of interest for assemblers without +;redefinable variables, but also of interest to the cross-reference window. +PTR = $20 ;#1 + ldx PTR +PTR_3 = $22 ;#2 + ldx PTR_3 +PTR_4 = $24 ;#3 + ldx PTR_4 +PTR_1 nop +PTR_A = $20 + ldy PTR_A +PTR_B = $1f + ldy PTR_B+1 +PTR_C = $1d + ldy PTR_C+3 +PTR_D = $21 + ldy PTR_C+3 +VAL0 = $30 +VAL1 = $31 +VAL2 = $32 +VAL3 = $33 +VAL4 = $34 +VAL5 = $35 + and VAL0 + and VAL1 + and VAL2 + and VAL3 + and VAL4 + and VAL5 +VAL14 = $31 + and VAL0 + and VAL14 + and VAL14+1 + and VAL14+2 + and VAL14+3 + and VAL5 +DPNOP = $80 ;same as org + lda+1 DPCODE + jsr DPCODE + rts + + !pseudopc $0080 { +DPCODE nop + lda+1 DPCODE + lda+2 DPCODE + lda+3 DPCODE + rts + + } ;!pseudopc diff --git a/SourceGen/SGTestData/Expected/2019-local-variables_cc65.S b/SourceGen/SGTestData/Expected/2019-local-variables_cc65.S new file mode 100644 index 0000000..8687686 --- /dev/null +++ b/SourceGen/SGTestData/Expected/2019-local-variables_cc65.S @@ -0,0 +1,111 @@ +;Would need to be edited to test duplicate labels. Those currently cause +;assembly to fail (see the X_* vars). + .setcpu "65816" +PROJ_ZERO = $00 ;project addr +PROJ_ONE = $01 ;project addr +CONST_ZERO = $f0 ;project const + +; .segment "SEG000" + .org $1000 + .a8 + .i8 + ldy PROJ_ZERO + lda (PROJ_ONE),y + sta $03 + ldx $04 + lda CONST_ZERO,S + sta $f1,S +VAR_ZERO = $00 +VAR_TWO = $02 +VAR_THREE = $03 +CONST_ZERO_VAR = $f0 + ldy VAR_ZERO + lda (VAR_ZERO+1),y + sta VAR_THREE + ldx $04 + lda CONST_ZERO_VAR,S + sta $f1,S + eor 0 + ora 240,S +X_PROJ_ZERO = $10 ;clash with project symbol +X_DPCODE = $80 ;clash with user label + lda VAR_ZERO + lda VAR_ZERO+1 + lda VAR_TWO + lda VAR_THREE + lda $04 + lda X_PROJ_ZERO + lda $11 + lda z:DPCODE + ldx PROJ_ZERO + ldx PROJ_ONE + ldx $02 + bit $ffa9 + ldy PROJ_ZERO + ldy PROJ_ONE + ldy $02 + .byte $2c +NH0 = $00 ;not hidden +NH1 = $01 ;not hidden +L103C: lda #$fe + beq L103C + ldy NH0 + ldy NH1 + ldy $02 + nop +PTR0 = $10 +CONST0 = $10 + lda PTR0 + ldx PTR0+1 + ldy $12 + lda (CONST0,S),y + sta (CONST0+3,S),y +;Test name redefinition. This is mostly of interest for assemblers without +;redefinable variables, but also of interest to the cross-reference window. +PTR = $20 ;#1 + ldx PTR +PTR_3 = $22 ;#2 + ldx PTR_3 +PTR_4 = $24 ;#3 + ldx PTR_4 +PTR_1: nop +PTR_A = $20 + ldy PTR_A +PTR_B = $1f + ldy PTR_B+1 +PTR_C = $1d + ldy PTR_C+3 +PTR_D = $21 + ldy PTR_C+3 +VAL0 = $30 +VAL1 = $31 +VAL2 = $32 +VAL3 = $33 +VAL4 = $34 +VAL5 = $35 + and VAL0 + and VAL1 + and VAL2 + and VAL3 + and VAL4 + and VAL5 +VAL14 = $31 + and VAL0 + and VAL14 + and VAL14+1 + and VAL14+2 + and VAL14+3 + and VAL5 +DPNOP = $80 ;same as org + lda z:DPCODE + jsr DPCODE + rts + +; .segment "SEG001" + .org $0080 +DPCODE: nop + lda DPCODE + lda a:DPCODE + lda f:DPCODE + rts + diff --git a/SourceGen/SGTestData/Expected/2019-local-variables_cc65.cfg b/SourceGen/SGTestData/Expected/2019-local-variables_cc65.cfg new file mode 100644 index 0000000..a1b5f7c --- /dev/null +++ b/SourceGen/SGTestData/Expected/2019-local-variables_cc65.cfg @@ -0,0 +1,13 @@ +# 6502bench SourceGen generated linker script for 2019-local-variables +MEMORY { + MAIN: file=%O, start=%S, size=65536; +# MEM000: file=%O, start=$1000, size=126; +# MEM001: file=%O, start=$0080, size=11; +} +SEGMENTS { + CODE: load=MAIN, type=rw; +# SEG000: load=MEM000, type=rw; +# SEG001: load=MEM001, type=rw; +} +FEATURES {} +SYMBOLS {} diff --git a/SourceGen/SGTestData/Source/2019-local-variables.S b/SourceGen/SGTestData/Source/2019-local-variables.S new file mode 100644 index 0000000..9872326 --- /dev/null +++ b/SourceGen/SGTestData/Source/2019-local-variables.S @@ -0,0 +1,148 @@ +; Copyright 2019 faddenSoft. All Rights Reserved. +; See the LICENSE.txt file for distribution terms (Apache 2.0). +; +; Assembler: Merlin 32 + + org $1000 + +; Define these as project symbols. +PROJ_ZERO equ $00 +PROJ_ONE equ $01 +CONST_ZERO equ $f0 +CONST_ONE equ $f1 +PTR_2 equ $f8 ;used to test uniqifier later on + + ldy PROJ_ZERO + lda (PROJ_ONE),y + sta $03 ;undefined yet + ldx $04 ;undefined yet + lda CONST_ZERO,S ;explicitly set symbol + sta CONST_ONE,S ;leave as default (hex) + +; TABLE - test redefinition of project symbol values +]VAR_ZERO equ $00 ;2b +]VAR_TWO equ $02 ;1b +]VAR_THREE equ $03 ;1b +]CONST_ZERO equ $f0 ;1b const + + ldy PROJ_ZERO ;should become ]VAR_ZERO + lda (PROJ_ONE),y ;should become ]VAR_ZERO+1 + sta $03 ;should become ]VAR_THREE + ldx $04 ;undefined yet + lda CONST_ZERO,S ;should become ]CONST_ZERO + sta CONST_ONE,S ;leave as default (hex) + + eor $00 ;explicitly format as decimal + ora $f0,S ;explicitly format as decimal + +; TABLE - test redefinition of symbol labels +]PROJ_ZERO equ $10 ;EDIT: rename to PROJ_ZERO +]DPCODE equ $80 ;EDIT: rename to DPCODE + + lda $00 + lda $01 + lda $02 + lda $03 + lda $04 + lda $10 + lda $11 + lda $80 + +; TABLE/CLEAR - empty table + ldx $00 + ldx $01 + ldx $02 + +; confirm that hidden tables are skipped over + dfb $2c +; TABLE (hidden) +]HIDDEN0 equ $00 +]HIDDEN1 equ $01 + lda #$ff + ldy $00 + ldy $01 + ldy $02 + + dfb $2c +; TABLE (not hidden) +]NH0 equ $00 +]NH1 equ $01 +:label lda #$fe + beq :label + ldy $00 + ldy $01 + ldy $02 + + nop + +; TABLE +]PTR0 equ $10 ;2b +]CONST0 equ $10 ;4b + lda ]PTR0 + ldx ]PTR0+1 + ldy ]PTR0+2 ;should be hex + lda (]CONST0,S),y + sta (]CONST0+3,S),y + +; test redefinition of name + +; TABLE +]PTR equ $20 ;2b + ldx ]PTR +; TABLE +]PTR equ $22 ;2b + ldx ]PTR +; TABLE +]PTR equ $24 ;2b + ldx ]PTR + +; define user label to try to trip up the uniqifier +PTR_1 nop + + +; test redefinition of value +; TABLE/CLEAR +]PTR_A equ $20 ;2b + ldy ]PTR_A ;PTR_A +]PTR_B equ $1f ;2b + ldy ]PTR_A ;PTR_B+1 +]PTR_C equ $1d ;4b + ldy ]PTR_A ;PTR_C+3 +]PTR_D equ $21 ;1b + ldy ]PTR_A ;should come up as hex + +; TABLE +]VAL0 equ $30 ;1b +]VAL1 equ $31 ;1b +]VAL2 equ $32 ;1b +]VAL3 equ $33 ;1b +]VAL4 equ $34 ;1b +]VAL5 equ $35 ;1b + and ]VAL0 + and ]VAL1 + and ]VAL2 + and ]VAL3 + and ]VAL4 + and ]VAL5 +; TABLE +]VAL14 equ $31 ;4b + and ]VAL0 + and ]VAL1 ;these four become ]VAL14 + and ]VAL2 + and ]VAL3 + and ]VAL4 + and ]VAL5 + + +; TABLE - test direct page label vs. variable +]DPNOP equ $80 + lda ]DPNOP + jsr DPCODE + rts + + org $0080 +DPCODE nop + lda DPCODE ;should be DPNOP + lda |DPCODE ;should be DPCODE + lda >DPCODE ;should be DPCODE + rts diff --git a/SourceGen/WpfGui/EditDefSymbol.xaml.cs b/SourceGen/WpfGui/EditDefSymbol.xaml.cs index 25c77f4..d3fd13a 100644 --- a/SourceGen/WpfGui/EditDefSymbol.xaml.cs +++ b/SourceGen/WpfGui/EditDefSymbol.xaml.cs @@ -226,7 +226,8 @@ namespace SourceGen.WpfGui { bool valueUniqueValid = true; if (mIsVariable && valueValid && widthValid) { foreach (KeyValuePair kvp in mDefSymbolList) { - if (DefSymbol.CheckOverlap(kvp.Value, thisValue, thisWidth, symbolType)) { + if (kvp.Value != mOldSym && + DefSymbol.CheckOverlap(kvp.Value, thisValue, thisWidth, symbolType)) { valueUniqueValid = false; break; }