1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-09-29 16:54:50 +00:00

Check for bank overrun

If an address map entry wraps around the end of a bank, add a note
to the message log.  This is Error level, since some assemblers
will refuse to handle it.
This commit is contained in:
Andy McFadden 2019-11-05 13:29:51 -08:00
parent 6a8d6950e5
commit ceb07c809e
4 changed files with 27 additions and 0 deletions

View File

@ -664,6 +664,22 @@ namespace SourceGen {
}
}
private void ValidateAddressMap() {
foreach (AddressMap.AddressMapEntry entry in AddrMap) {
if ((entry.Addr & 0xff0000) != ((entry.Addr + entry.Length - 1) & 0xff0000)) {
string fmt = Res.Strings.MSG_BANK_OVERRUN_DETAIL_FMT;
int firstNext = (entry.Addr & 0xff0000) + 0x010000;
int badOffset = entry.Offset + (firstNext - entry.Addr);
Messages.Add(new MessageList.MessageEntry(
MessageList.MessageEntry.SeverityLevel.Error,
entry.Offset,
MessageList.MessageEntry.MessageType.BankOverrun,
string.Format(fmt, "+" + badOffset.ToString("x6")),
MessageList.MessageEntry.ProblemResolution.None));
}
}
}
#region Analysis
/// <summary>
@ -809,6 +825,7 @@ namespace SourceGen {
Validate();
reanalysisTimer.EndTask("Validate");
#endif
ValidateAddressMap();
reanalysisTimer.EndTask("DisasmProject.Analyze()");
//reanalysisTimer.DumpTimes("DisasmProject timers:", debugLog);

View File

@ -52,6 +52,7 @@ namespace SourceGen {
UnresolvedWeakRef,
InvalidOffsetOrLength,
InvalidDescriptor,
BankOverrun,
}
public MessageType MsgType { get; private set; }
@ -163,6 +164,9 @@ namespace SourceGen {
case MessageEntry.MessageType.InvalidDescriptor:
problem = Res.Strings.MSG_INVALID_DESCRIPTOR;
break;
case MessageEntry.MessageType.BankOverrun:
problem = Res.Strings.MSG_BANK_OVERRUN;
break;
default:
problem = "???";
break;

View File

@ -107,6 +107,8 @@ limitations under the License.
<system:String x:Key="str_InvalidFormatWordSelUnevenFmt">Unable to format as word: each selected region must have an even number of bytes ({0} region(s) are selected).</system:String>
<system:String x:Key="str_LocalVariableTableClear">• Clear variables</system:String>
<system:String x:Key="str_LocalVariableTableEmpty">• Empty variable table</system:String>
<system:String x:Key="str_MsgBankOverrun">Address bank overrun</system:String>
<system:String x:Key="str_MsgBankOverrunDetailFmt">Bank boundary crossed at offset {0}</system:String>
<system:String x:Key="str_MsgFormatDescriptorIgnored">Format ignored</system:String>
<system:String x:Key="str_MsgHiddenLabel">Hidden label</system:String>
<system:String x:Key="str_MsgHiddenLocalVariableTable">Hidden variable table</system:String>

View File

@ -195,6 +195,10 @@ namespace SourceGen.Res {
(string)Application.Current.FindResource("str_LocalVariableTableClear");
public static string LOCAL_VARIABLE_TABLE_EMPTY =
(string)Application.Current.FindResource("str_LocalVariableTableEmpty");
public static string MSG_BANK_OVERRUN =
(string)Application.Current.FindResource("str_MsgBankOverrun");
public static string MSG_BANK_OVERRUN_DETAIL_FMT =
(string)Application.Current.FindResource("str_MsgBankOverrunDetailFmt");
public static string MSG_FORMAT_DESCRIPTOR_IGNORED =
(string)Application.Current.FindResource("str_MsgFormatDescriptorIgnored");
public static string MSG_HIDDEN_LABEL =