1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-12-28 01:29:29 +00:00

Show load address in Edit Address dialog

Sometimes code relocates a few bits of itself but not others.  We
don't currently have a way to say, "go back to where we would have
been".  As a cheap alternative, we now show the "load address", i.e.
where we'd be if there were no address map entries after the first.
This commit is contained in:
Andy McFadden 2019-10-22 13:52:19 -07:00
parent 1b0ee7de21
commit 463fbff368
5 changed files with 54 additions and 9 deletions

View File

@ -306,8 +306,11 @@ namespace SourceGen {
// picked up as an address for something else. So we set it to the same
// address as the start of the file. The overlapping-address code should do
// the right thing with it.
//
// Updated after adding the "load address" report to the address edit dialog.
// We don't want the two-byte offset.
int loadAddr = RawData.GetWord(mFileData, 0, 2, false);
AddrMap.Set(0, loadAddr);
AddrMap.Set(0, loadAddr - 2);
AddrMap.Set(2, loadAddr);
OperandFormats[0] = FormatDescriptor.Create(2, FormatDescriptor.Type.NumericLE,
FormatDescriptor.SubType.None);

View File

@ -1614,7 +1614,13 @@ namespace SourceGen {
int offset = CodeLineList[selIndex].FileOffset;
Anattrib attr = mProject.GetAnattrib(offset);
EditAddress dlg = new EditAddress(mMainWin, attr.Address, mProject.CpuDef.MaxAddressValue);
// Compute load address, i.e. where the byte would have been placed if the entire
// file were loaded at the address of the first address map entry. We assume
// offsets wrap at the bank boundary.
int firstAddr = mProject.AddrMap.OffsetToAddress(0);
int loadAddr = ((firstAddr + offset) & 0xffff) | (firstAddr & 0xff0000);
EditAddress dlg = new EditAddress(mMainWin, attr.Address, loadAddr,
mProject.CpuDef.MaxAddressValue, mOutputFormatter);
if (dlg.ShowDialog() != true) {
return;
}

View File

@ -25,6 +25,9 @@ would resolve to address $123456.</p>
<p>There will always be an address directive at the start of the file.
Attempts to remove it will be ignored.</p>
<p>If the byte at the current offset is not at the address where it was
initially loaded, the "load address" will be shown for reference.</p>
<h2><a name="flags">Edit Status Flag Override</a></h2>
<p>The state of the processor status flags are tracked for every

View File

@ -32,7 +32,7 @@ limitations under the License.
<StackPanel Orientation="Horizontal" Margin="0,8,0,0">
<TextBlock Text="Address:"/>
<!--<TextBlock Text="$" FontFamily="{StaticResource GeneralMonoFont}" Margin="4,2,0,0"/>-->
<TextBox Name="addrTextBox" Width="100" Margin="4,1,0,0"
FontFamily="{StaticResource GeneralMonoFont}"
Text="{Binding Path=AddressText, UpdateSourceTrigger=PropertyChanged}"
@ -44,9 +44,13 @@ limitations under the License.
Color="LightBlue"/>
</TextBox.Resources>
</TextBox>
<TextBlock Margin="16,0,0,0" Text="(load address: " Visibility="{Binding LoadAddressVis}"/>
<TextBlock Text="{Binding LoadAddressText, FallbackValue=$1234}" Visibility="{Binding LoadAddressVis}"/>
<TextBlock Text=")" Visibility="{Binding LoadAddressVis}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,8,0,0">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,0,0">
<Button Name="okButton" Content="OK" IsDefault="True" Width="70"
IsEnabled="{Binding IsValid}" Click="OkButton_Click"/>
<Button Name="cancelButton" Content="Cancel" IsCancel="True"

View File

@ -20,6 +20,8 @@ using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using Asm65;
namespace SourceGen.WpfGui {
/// <summary>
/// Edit Address dialog.
@ -36,6 +38,16 @@ namespace SourceGen.WpfGui {
/// </summary>
private int mMaxAddressValue;
/// <summary>
/// What the address would be if there were no addresses set after the initial one.
/// </summary>
private int mBaseAddr;
/// <summary>
/// Text formatter.
/// </summary>
private Formatter mFormatter;
/// <summary>
/// Bound two-way property.
/// </summary>
@ -46,13 +58,21 @@ namespace SourceGen.WpfGui {
/// </summary>
public bool IsValid {
get { return mIsValid; }
set {
mIsValid = value;
OnPropertyChanged();
}
set { mIsValid = value; OnPropertyChanged(); }
}
private bool mIsValid;
public Visibility LoadAddressVis {
get { return mLoadAddressVis; }
set { mLoadAddressVis = value; OnPropertyChanged(); }
}
public Visibility mLoadAddressVis = Visibility.Collapsed;
public string LoadAddressText {
get { return mLoadAddressText; }
set { mLoadAddressText = value; OnPropertyChanged(); }
}
public string mLoadAddressText = string.Empty;
// INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = "") {
@ -60,13 +80,22 @@ namespace SourceGen.WpfGui {
}
public EditAddress(Window owner, int initialAddr, int maxAddressValue) {
public EditAddress(Window owner, int initialAddr, int loadAddr, int maxAddressValue,
Formatter formatter) {
// Set the property before initializing the window -- we don't have a property
// change notifier.
Address = -2;
mMaxAddressValue = maxAddressValue;
mBaseAddr = loadAddr;
mFormatter = formatter;
AddressText = Asm65.Address.AddressToString(initialAddr, false);
if (initialAddr != loadAddr) {
LoadAddressVis = Visibility.Visible;
LoadAddressText = mFormatter.FormatAddress(loadAddr, loadAddr > 0xffff);
}
InitializeComponent();
Owner = owner;
DataContext = this;