mirror of
https://github.com/fadden/6502bench.git
synced 2024-12-03 05:49:48 +00:00
Expand max local variable width to 257
Code generated by one of the C compilers sets up the stack frame and then maps the direct page on top of it. If the value at the top of the stack is 16 bits, it will be referenced via address $ff. The local variable editor was regarding this as illegal, because lvars are currently only defined for direct page data, and the value doesn't entirely fit there (unless you're doing an indirect JMP on an NMOS 6502, in which case it wraps around to $00... but let's ignore that). The actual max width of a local variable is 257 because of the possibility of a 16-bit access at $ff. Older versions of SourceGen don't seem to have an issue when they encounter this situation, as worrying about (start+width) is really just an editor affectation. The access itself is still a direct-page operation. You won't be able to edit the entry without reducing the length, but otherwise everything works. I don't think there's a need to bump the file version.
This commit is contained in:
parent
bc7a225080
commit
03a0fc13fd
@ -397,8 +397,8 @@ delete the table, click the "Delete Table" button.</p>
|
|||||||
variable has a name, a value, a width, and an optional comment. The
|
variable has a name, a value, a width, and an optional comment. The
|
||||||
standard naming rules for symbols apply. Variables are only used for
|
standard naming rules for symbols apply. Variables are only used for
|
||||||
zero-page and stack-relative operands, so all values must fall in the
|
zero-page and stack-relative operands, so all values must fall in the
|
||||||
range 0-255, with their width factored in. So the maximum address for
|
range 0-255. The width may extend one byte past the end (to address $0100)
|
||||||
a two-byte pointer is $fe.</p>
|
to allow 16-bit accesses to $ff (particularly useful on 65816).</p>
|
||||||
<p>You can move a table to any offset that is the start of an instruction
|
<p>You can move a table to any offset that is the start of an instruction
|
||||||
and doesn't already have a local variable table present. Click the
|
and doesn't already have a local variable table present. Click the
|
||||||
"Move Table" button and enter the new offset in hex. You can also click
|
"Move Table" button and enter the new offset in hex. You can also click
|
||||||
|
@ -817,7 +817,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
"DataDescriptor":{
|
"DataDescriptor":{
|
||||||
"Length":3,
|
"Length":4,
|
||||||
"Format":"NumericLE",
|
"Format":"NumericLE",
|
||||||
"SubFormat":"Hex",
|
"SubFormat":"Hex",
|
||||||
"SymbolRef":null},
|
"SymbolRef":null},
|
||||||
|
@ -75,7 +75,7 @@ limitations under the License.
|
|||||||
<TextBox Name="valueTextBox" Margin="0,1,0,0" Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"
|
<TextBox Name="valueTextBox" Margin="0,1,0,0" Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"
|
||||||
FontFamily="{StaticResource GeneralMonoFont}"
|
FontFamily="{StaticResource GeneralMonoFont}"
|
||||||
IsReadOnly="{Binding ReadOnlyValueAndType}"/>
|
IsReadOnly="{Binding ReadOnlyValueAndType}"/>
|
||||||
<TextBlock Name="varValueRangeLabel" Text="• Value between 0-255, including width" Margin="0,4,0,0"
|
<TextBlock Name="varValueRangeLabel" Text="• Value between 0-255, <= 256 with width" Margin="0,4,0,0"
|
||||||
Visibility="{Binding IsVariable, Converter={StaticResource BoolToVis}}"/>
|
Visibility="{Binding IsVariable, Converter={StaticResource BoolToVis}}"/>
|
||||||
<TextBlock Name="addrValueRangeLabel" Text="• Address between 00/0000 - ff/ffff, incl. width" Margin="0,4,0,0"
|
<TextBlock Name="addrValueRangeLabel" Text="• Address between 00/0000 - ff/ffff, incl. width" Margin="0,4,0,0"
|
||||||
Visibility="{Binding IsNotVariable, Converter={StaticResource BoolToVis}}"/>
|
Visibility="{Binding IsNotVariable, Converter={StaticResource BoolToVis}}"/>
|
||||||
|
@ -29,6 +29,9 @@ namespace SourceGen.WpfGui {
|
|||||||
/// Symbol edit dialog.
|
/// Symbol edit dialog.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class EditDefSymbol : Window, INotifyPropertyChanged {
|
public partial class EditDefSymbol : Window, INotifyPropertyChanged {
|
||||||
|
// 256-byte zero page, +1 for 16-bit access at $ff.
|
||||||
|
private const int MAX_VAR_WIDTH = 257;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Result; will be set non-null on OK.
|
/// Result; will be set non-null on OK.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -200,7 +203,7 @@ namespace SourceGen.WpfGui {
|
|||||||
int maxWidth;
|
int maxWidth;
|
||||||
if (isVariable) {
|
if (isVariable) {
|
||||||
ConstantLabel = (string)FindResource("str_VariableConstant");
|
ConstantLabel = (string)FindResource("str_VariableConstant");
|
||||||
maxWidth = 256;
|
maxWidth = MAX_VAR_WIDTH;
|
||||||
} else {
|
} else {
|
||||||
ConstantLabel = (string)FindResource("str_ProjectConstant");
|
ConstantLabel = (string)FindResource("str_ProjectConstant");
|
||||||
maxWidth = 65536;
|
maxWidth = 65536;
|
||||||
@ -309,17 +312,20 @@ namespace SourceGen.WpfGui {
|
|||||||
widthValid = mIsWidthOptional;
|
widthValid = mIsWidthOptional;
|
||||||
} else if (!Asm65.Number.TryParseInt(VarWidth, out thisWidth, out int unusedBase) ||
|
} else if (!Asm65.Number.TryParseInt(VarWidth, out thisWidth, out int unusedBase) ||
|
||||||
thisWidth < DefSymbol.MIN_WIDTH || thisWidth > DefSymbol.MAX_WIDTH ||
|
thisWidth < DefSymbol.MIN_WIDTH || thisWidth > DefSymbol.MAX_WIDTH ||
|
||||||
(IsVariable && thisWidth > 256)) {
|
(IsVariable && thisWidth > MAX_VAR_WIDTH)) {
|
||||||
// All widths must be between 1 and 65536. For a variable, the full thing must
|
// All widths must be between 1 and 65536. For a variable, the full thing must
|
||||||
// fit on zero page without wrapping. We test for 256 here so that we highlight
|
// fit on zero page, except on 65816 where a 16-bit access at $ff can extend
|
||||||
// the "bad width" label, rather than the "it doesn't fit on the page" label.
|
// off the end of the direct page.
|
||||||
|
//
|
||||||
|
// We test the variable width here so that we highlight the "width limit" label,
|
||||||
|
// rather than the "value range" label.
|
||||||
widthValid = false;
|
widthValid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool valueRangeValid = true;
|
bool valueRangeValid = true;
|
||||||
if (IsVariable && valueValid && widthValid) {
|
if (IsVariable && valueValid && widthValid) {
|
||||||
// $ff with width 1 is okay, $ff with width 2 is not
|
// $ff with width 1 is okay, $ff with width 2 is okay on 65816, width=3 is bad
|
||||||
if (thisValue < 0 || thisValue + thisWidth > 256) {
|
if (thisValue < 0 || thisValue + thisWidth > MAX_VAR_WIDTH) {
|
||||||
valueRangeValid = false;
|
valueRangeValid = false;
|
||||||
}
|
}
|
||||||
} else if (IsAddress && valueValid) {
|
} else if (IsAddress && valueValid) {
|
||||||
|
Loading…
Reference in New Issue
Block a user