mirror of
https://github.com/fadden/6502bench.git
synced 2024-11-29 10:50:28 +00:00
Fix code tracing bug
If you set things up just right, it's possible for flag status changes to fail to get merged. Added a regression test to 1003-flags-and-branches. Also, tweaked the instruction operand editor to be a bit smoother from the keyboard: added alt-key shortcuts, and put the focus on the OK button after creating/editing a label so you can just hit the return key twice.
This commit is contained in:
parent
c1056839b1
commit
1ddf4bed48
@ -821,6 +821,7 @@ namespace Asm65 {
|
||||
BaseMemEffect = MemoryEffect.Read,
|
||||
FlagsAffected = FlagsAffected_NVZC,
|
||||
StatusFlagUpdater = FlagUpdater_NVZC
|
||||
// We can assert C=0 after ADC #$00, but only if C=0 on entry. Doesn't seem useful.
|
||||
};
|
||||
private static OpDef OpAND = new OpDef() {
|
||||
Mnemonic = OpName.AND,
|
||||
|
@ -757,14 +757,16 @@ namespace SourceGen {
|
||||
// If we've already visited the next offset, and the updated status flags are
|
||||
// the same as the previous status flags, then there's nothing to gain by
|
||||
// continuing forward.
|
||||
if (mAnattribs[nextOffset].IsVisited) {
|
||||
if (!mAnattribs[nextOffset].IsChanged &&
|
||||
nextStatusBefore == mAnattribs[nextOffset].StatusFlags) {
|
||||
if (mAnattribs[nextOffset].IsVisited && !mAnattribs[nextOffset].IsChanged) {
|
||||
if (nextStatusBefore == mAnattribs[nextOffset].StatusFlags) {
|
||||
// Instruction has been visited, hasn't been flagged as changed,
|
||||
// and our status flag merge had no effect. No need to continue
|
||||
// through.
|
||||
LogV(offset, "Not re-examining " + nextOffset);
|
||||
break;
|
||||
} else {
|
||||
// We changed the flags, need to re-evaluate conditional branches.
|
||||
mAnattribs[nextOffset].IsChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
Binary file not shown.
@ -228,32 +228,41 @@ L10FA clc
|
||||
.byte $00
|
||||
.byte $00
|
||||
|
||||
L1102 rep #$20
|
||||
.al
|
||||
sep #$10
|
||||
jsr L111D
|
||||
rep #$30
|
||||
.xl
|
||||
jsr L1123
|
||||
sep #$30
|
||||
.as
|
||||
.xs
|
||||
jsr L1123
|
||||
L1102 sec
|
||||
bcs L1106
|
||||
|
||||
L1105 clc
|
||||
L1106 lda $33
|
||||
beq L1105
|
||||
bcs L110E
|
||||
lda $44
|
||||
L110E nop
|
||||
rep #$20
|
||||
.al
|
||||
sep #$10
|
||||
jsr L111D
|
||||
jsr L112A
|
||||
rep #$30
|
||||
.xl
|
||||
jsr L1130
|
||||
sep #$30
|
||||
.as
|
||||
.xs
|
||||
jsr L1130
|
||||
rep #$20
|
||||
.al
|
||||
sep #$10
|
||||
jsr L112A
|
||||
sep #$30
|
||||
.as
|
||||
rts
|
||||
|
||||
.al
|
||||
L111D lda #$1234
|
||||
L112A lda #$1234
|
||||
ldx #$ff
|
||||
rts
|
||||
|
||||
.as
|
||||
L1123 lda #$ff
|
||||
L1130 lda #$ff
|
||||
ldx #$ee
|
||||
ldy #$dd
|
||||
rts
|
||||
|
@ -223,31 +223,40 @@ L10FA clc
|
||||
dfb $00
|
||||
dfb $00
|
||||
|
||||
L1102 rep #$20
|
||||
mx %01
|
||||
sep #$10
|
||||
jsr L111D
|
||||
rep #$30
|
||||
mx %00
|
||||
jsr L1123
|
||||
sep #$30
|
||||
mx %11
|
||||
jsr L1123
|
||||
L1102 sec
|
||||
bcs L1106
|
||||
|
||||
L1105 clc
|
||||
L1106 lda $33
|
||||
beq L1105
|
||||
bcs L110E
|
||||
lda $44
|
||||
L110E nop
|
||||
rep #$20
|
||||
mx %01
|
||||
sep #$10
|
||||
jsr L111D
|
||||
jsr L112A
|
||||
rep #$30
|
||||
mx %00
|
||||
jsr L1130
|
||||
sep #$30
|
||||
mx %11
|
||||
jsr L1130
|
||||
rep #$20
|
||||
mx %01
|
||||
sep #$10
|
||||
jsr L112A
|
||||
sep #$30
|
||||
mx %11
|
||||
rts
|
||||
|
||||
mx %01
|
||||
L111D lda #$1234
|
||||
L112A lda #$1234
|
||||
ldx #$ff
|
||||
rts
|
||||
|
||||
mx %11
|
||||
L1123 lda #$ff
|
||||
L1130 lda #$ff
|
||||
ldx #$ee
|
||||
ldy #$dd
|
||||
rts
|
||||
|
@ -228,32 +228,41 @@ L10FA clc
|
||||
!byte $00
|
||||
!byte $00
|
||||
|
||||
L1102 rep #$20
|
||||
!al
|
||||
sep #$10
|
||||
jsr L111D
|
||||
rep #$30
|
||||
!rl
|
||||
jsr L1123
|
||||
sep #$30
|
||||
!as
|
||||
!rs
|
||||
jsr L1123
|
||||
L1102 sec
|
||||
bcs L1106
|
||||
|
||||
L1105 clc
|
||||
L1106 lda $33
|
||||
beq L1105
|
||||
bcs L110E
|
||||
lda $44
|
||||
L110E nop
|
||||
rep #$20
|
||||
!al
|
||||
sep #$10
|
||||
jsr L111D
|
||||
jsr L112A
|
||||
rep #$30
|
||||
!rl
|
||||
jsr L1130
|
||||
sep #$30
|
||||
!as
|
||||
!rs
|
||||
jsr L1130
|
||||
rep #$20
|
||||
!al
|
||||
sep #$10
|
||||
jsr L112A
|
||||
sep #$30
|
||||
!as
|
||||
rts
|
||||
|
||||
!al
|
||||
L111D lda #$1234
|
||||
L112A lda #$1234
|
||||
ldx #$ff
|
||||
rts
|
||||
|
||||
!as
|
||||
L1123 lda #$ff
|
||||
L1130 lda #$ff
|
||||
ldx #$ee
|
||||
ldy #$dd
|
||||
rts
|
||||
|
@ -229,32 +229,41 @@ L10FA: clc
|
||||
.byte $00
|
||||
.byte $00
|
||||
|
||||
L1102: rep #$20
|
||||
.a16
|
||||
sep #$10
|
||||
jsr L111D
|
||||
rep #$30
|
||||
.i16
|
||||
jsr L1123
|
||||
sep #$30
|
||||
.a8
|
||||
.i8
|
||||
jsr L1123
|
||||
L1102: sec
|
||||
bcs L1106
|
||||
|
||||
L1105: clc
|
||||
L1106: lda $33
|
||||
beq L1105
|
||||
bcs L110E
|
||||
lda $44
|
||||
L110E: nop
|
||||
rep #$20
|
||||
.a16
|
||||
sep #$10
|
||||
jsr L111D
|
||||
jsr L112A
|
||||
rep #$30
|
||||
.i16
|
||||
jsr L1130
|
||||
sep #$30
|
||||
.a8
|
||||
.i8
|
||||
jsr L1130
|
||||
rep #$20
|
||||
.a16
|
||||
sep #$10
|
||||
jsr L112A
|
||||
sep #$30
|
||||
.a8
|
||||
rts
|
||||
|
||||
.a16
|
||||
L111D: lda #$1234
|
||||
L112A: lda #$1234
|
||||
ldx #$ff
|
||||
rts
|
||||
|
||||
.a8
|
||||
L1123: lda #$ff
|
||||
L1130: lda #$ff
|
||||
ldx #$ee
|
||||
ldy #$dd
|
||||
rts
|
||||
|
@ -1,7 +1,7 @@
|
||||
# 6502bench SourceGen generated linker script for 1003-flags-and-branches
|
||||
MEMORY {
|
||||
MAIN: file=%O, start=%S, size=65536;
|
||||
# MEM000: file=%O, start=$1000, size=298;
|
||||
# MEM000: file=%O, start=$1000, size=311;
|
||||
}
|
||||
SEGMENTS {
|
||||
CODE: load=MAIN, type=rw;
|
||||
|
@ -204,6 +204,18 @@ ok_rol1
|
||||
brk $00
|
||||
ok_plp
|
||||
|
||||
; regression test for bug in analyzer
|
||||
sec ;here carry is clear
|
||||
bcs flg2
|
||||
flg1 clc
|
||||
|
||||
flg2 lda $33
|
||||
beq flg1
|
||||
bcs flg3 ;this should NOT be branch-always
|
||||
lda $44
|
||||
flg3 nop
|
||||
|
||||
; test tracking across subroutine calls
|
||||
rep #$20 ;long a
|
||||
sep #$10 ;short x/y
|
||||
mx %01
|
||||
|
@ -35,15 +35,15 @@ limitations under the License.
|
||||
<system:String x:Key="str_SymbolNotValid">[invalid symbol name]</system:String>
|
||||
<system:String x:Key="str_SymbolUnknown">?</system:String>
|
||||
|
||||
<system:String x:Key="str_CreateLocalVariable">Create Local Variable</system:String>
|
||||
<system:String x:Key="str_EditLocalVariable">Edit Local Variable</system:String>
|
||||
<system:String x:Key="str_CreateLocalVariable">Create Local _Variable</system:String>
|
||||
<system:String x:Key="str_EditLocalVariable">Edit Local _Variable</system:String>
|
||||
<system:String x:Key="str_LvMatchFoundAddress">Match found (ZP address):</system:String>
|
||||
<system:String x:Key="str_LvMatchFoundConstant">Match found (StackRel constant):</system:String>
|
||||
|
||||
<system:String x:Key="str_CreateLabel">Create Label</system:String>
|
||||
<system:String x:Key="str_EditLabel">Edit Label</system:String>
|
||||
<system:String x:Key="str_CreateProjectSymbol">Create Project Symbol</system:String>
|
||||
<system:String x:Key="str_EditProjectSymbol">Edit Project Symbol</system:String>
|
||||
<system:String x:Key="str_CreateLabel">Create _Label</system:String>
|
||||
<system:String x:Key="str_EditLabel">Edit _Label</system:String>
|
||||
<system:String x:Key="str_CreateProjectSymbol">Create _Project Symbol</system:String>
|
||||
<system:String x:Key="str_EditProjectSymbol">Edit _Project Symbol</system:String>
|
||||
<system:String x:Key="str_CurrentLabel">Current label:</system:String>
|
||||
<system:String x:Key="str_CurrentLabelAdjustedFmt">Current label (adjusted {0}):</system:String>
|
||||
</Window.Resources>
|
||||
@ -67,7 +67,7 @@ limitations under the License.
|
||||
|
||||
<StackPanel Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Orientation="Horizontal" Margin="0,0,0,8">
|
||||
<RadioButton GroupName="Main" Margin="0,2,0,0"
|
||||
Content="Default (auto-format as hex, local var, or reference to label/platform/project symbol)"
|
||||
Content="D_efault (auto-format as hex, local var, or reference to label/platform/project symbol)"
|
||||
IsChecked="{Binding FormatDefault}"/>
|
||||
</StackPanel>
|
||||
|
||||
@ -79,17 +79,17 @@ limitations under the License.
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<StackPanel Grid.Column="0">
|
||||
<RadioButton GroupName="Main" Content="Hexadecimal"
|
||||
<RadioButton GroupName="Main" Content="_Hexadecimal"
|
||||
IsChecked="{Binding FormatHex}"/>
|
||||
<RadioButton GroupName="Main" Content="Decimal" Margin="0,2,0,0"
|
||||
<RadioButton GroupName="Main" Content="_Decimal" Margin="0,2,0,0"
|
||||
IsChecked="{Binding FormatDecimal}"/>
|
||||
<RadioButton GroupName="Main" Content="Binary" Margin="0,2,0,0"
|
||||
<RadioButton GroupName="Main" Content="_Binary" Margin="0,2,0,0"
|
||||
IsChecked="{Binding FormatBinary}"/>
|
||||
<RadioButton GroupName="Main" Content="ASCII (low or high) character" Margin="0,2,0,0"
|
||||
<RadioButton GroupName="Main" Content="_ASCII (low or high) character" Margin="0,2,0,0"
|
||||
IsEnabled="{Binding IsFormatAsciiAllowed}" IsChecked="{Binding FormatAscii}"/>
|
||||
<RadioButton GroupName="Main" Content="C64 PETSCII character" Margin="0,2,0,0"
|
||||
<RadioButton GroupName="Main" Content="C64 _PETSCII character" Margin="0,2,0,0"
|
||||
IsEnabled="{Binding IsFormatPetsciiAllowed}" IsChecked="{Binding FormatPetscii}"/>
|
||||
<RadioButton GroupName="Main" Content="C64 Screen character" Margin="0,2,0,0"
|
||||
<RadioButton GroupName="Main" Content="C64 Sc_reen character" Margin="0,2,0,0"
|
||||
IsEnabled="{Binding IsFormatScreenCodeAllowed}" IsChecked="{Binding FormatScreenCode}"/>
|
||||
</StackPanel>
|
||||
|
||||
@ -104,7 +104,7 @@ limitations under the License.
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton Name="formatSymbolButton" Grid.Column="0" Grid.Row="0" GroupName="Main"
|
||||
Content="Symbol" IsChecked="{Binding FormatSymbol}"/>
|
||||
Content="_Symbol" IsChecked="{Binding FormatSymbol}"/>
|
||||
<StackPanel Grid.Column="0" Grid.Row="1" Orientation="Horizontal" Margin="18,1,0,0">
|
||||
<TextBox Name="symbolTextBox" Grid.Column="0" Grid.Row="1" Width="150"
|
||||
FontFamily="{StaticResource GeneralMonoFont}"
|
||||
@ -118,7 +118,7 @@ limitations under the License.
|
||||
IsEnabled="{Binding IsPartPanelEnabled}">
|
||||
<RadioButton GroupName="Part" Content="Low"
|
||||
IsChecked="{Binding FormatPartLow}"/>
|
||||
<RadioButton GroupName="Part" Content="High" Margin="10,0,0,0"
|
||||
<RadioButton GroupName="Part" Content="_High" Margin="10,0,0,0"
|
||||
IsChecked="{Binding FormatPartHigh}"/>
|
||||
<RadioButton GroupName="Part" Content="Bank" Margin="10,0,0,0"
|
||||
IsChecked="{Binding FormatPartBank}"/>
|
||||
@ -221,7 +221,7 @@ limitations under the License.
|
||||
|
||||
<DockPanel Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="2" Margin="0,8,0,0" LastChildFill="False">
|
||||
<Button DockPanel.Dock="Right" Content="Cancel" Width="70" IsCancel="True" Margin="8,0,0,0"/>
|
||||
<Button DockPanel.Dock="Right" Content="OK" Width="70" IsDefault="True"
|
||||
<Button Name="okButton" DockPanel.Dock="Right" Content="OK" Width="70" IsDefault="True"
|
||||
IsEnabled="{Binding IsValid}" Click="OkButton_Click"/>
|
||||
</DockPanel>
|
||||
</Grid>
|
||||
|
@ -946,6 +946,10 @@ namespace SourceGen.WpfGui {
|
||||
CreateEditLabelText = EDIT_LABEL;
|
||||
NarTargetLabel = mEditedLabel.Label;
|
||||
}
|
||||
|
||||
// Sort nice to just hit return twice after entering a label, so move the focus
|
||||
// to the OK button.
|
||||
okButton.Focus();
|
||||
}
|
||||
|
||||
private void EditProjectSymbol_Click(object sender, RoutedEventArgs e) {
|
||||
|
Loading…
Reference in New Issue
Block a user