1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-06-11 17:29:29 +00:00

ORG rework, part 1

This is the first step toward changing the address region map from a
linear list to a hierarchy.  See issue #107 for the plan.

The AddressMap class has been rewritten to support the new approach.
The rest of the project has been updated to conform to the new API,
but feature-wise is unchanged.  While the map class supports
nested regions with explicit lengths, the rest of the application
still assumes a series of non-overlapping regions with "floating"
lengths.

The Set Address dialog is currently non-functional.

All of the output for cc65 changed because generation of segment
comments has been removed.  Some of the output for ACME changed as
well, because we no longer follow "* = addr" with a redundant
pseudopc statement.  ACME and 65tass have similar approaches to
placing things in memory, and so now have similar implementations.
This commit is contained in:
Andy McFadden 2021-09-16 17:02:19 -07:00
parent 0dfa2326dd
commit 39b7b20144
127 changed files with 1644 additions and 718 deletions

File diff suppressed because it is too large Load Diff

View File

@ -179,11 +179,12 @@ namespace PluginCommon {
/// Invokes the Prepare() method on all active plugins.
/// </summary>
/// <param name="appRef">Reference to host object providing app services.</param>
/// <param name="spanLength">Length of data spanned by address map.</param>
/// <param name="addrEntries">Serialized AddressMap entries.</param>
/// <param name="plSyms">SymbolTable contents, converted to PlSymbol.</param>
public void PreparePlugins(IApplication appRef,
public void PreparePlugins(IApplication appRef, int spanLength,
List<AddressMap.AddressMapEntry> addrEntries, List<PlSymbol> plSyms) {
AddressMap addrMap = new AddressMap(addrEntries);
AddressMap addrMap = new AddressMap(spanLength, addrEntries);
AddressTranslate addrTrans = new AddressTranslate(addrMap);
foreach (KeyValuePair<string, IPlugin> kvp in mActivePlugins) {
IPlugin ipl = kvp.Value;

View File

@ -92,6 +92,20 @@ namespace SourceGen.AsmGen {
/// </summary>
private StreamWriter mOutStream;
/// <summary>
/// Output mode; determines how ORG is handled.
/// </summary>
private enum OutputMode {
Unknown = 0, Loadable = 1, Streamable = 2
}
private OutputMode mOutputMode;
/// <summary>
/// Current pseudo-PC depth. 0 is the "real" PC.
/// </summary>
private int mPcDepth;
private bool mFirstIsOpen;
/// <summary>
/// Holds detected version of configured assembler.
/// </summary>
@ -101,9 +115,6 @@ namespace SourceGen.AsmGen {
private static CommonUtil.Version V0_96_4 = new CommonUtil.Version(0, 96, 4);
private static CommonUtil.Version V0_97 = new CommonUtil.Version(0, 97);
// Set if we're inside a "pseudopc" block, which will need to be closed.
private bool mInPseudoPcBlock;
// v0.97 started treating '\' in constants as an escape character.
private bool mBackslashEscapes = true;
@ -191,6 +202,20 @@ namespace SourceGen.AsmGen {
AssemblerConfig config = AssemblerConfig.GetConfig(settings,
AssemblerInfo.Id.Acme);
mColumnWidths = (int[])config.ColumnWidths.Clone();
// ACME wants the entire file to be loadable into a 64KB memory area. If the
// initial address is too large, a file smaller than 64KB might overrun the bank
// boundary and cause a failure. In that case we want to set the initial address
// to zero and "stream" the rest.
int firstAddr = project.AddrMap.OffsetToAddress(0);
if (firstAddr == AddressMap.NON_ADDR) {
firstAddr = 0;
}
if (firstAddr + project.FileDataLength > 65536) {
mOutputMode = OutputMode.Streamable;
} else {
mOutputMode = OutputMode.Loadable;
}
}
/// <summary>
@ -244,6 +269,9 @@ namespace SourceGen.AsmGen {
mLocalizer.QuirkNoOpcodeMnemonics = true;
mLocalizer.Analyze();
mPcDepth = 0;
mFirstIsOpen = true;
// Use UTF-8 encoding, without a byte-order mark.
using (StreamWriter sw = new StreamWriter(pathName, false, new UTF8Encoding(false))) {
mOutStream = sw;
@ -258,16 +286,15 @@ namespace SourceGen.AsmGen {
// don't try
OutputLine(SourceFormatter.FullLineCommentDelimiter +
"ACME can't handle 65816 code that lives outside bank zero");
int orgAddr = Project.AddrMap.Get(0);
OutputOrgDirective(0, orgAddr);
int orgAddr = Project.AddrMap.OffsetToAddress(0);
AddressMap.AddressMapEntry fakeEnt = new AddressMap.AddressMapEntry(0,
Project.FileData.Length, orgAddr, false, false);
OutputOrgDirective(fakeEnt, true);
OutputDenseHex(0, Project.FileData.Length, string.Empty, string.Empty);
OutputOrgDirective(fakeEnt, false);
} else {
GenCommon.Generate(this, sw, worker);
}
if (mInPseudoPcBlock) {
OutputLine(string.Empty, CLOSE_PSEUDOPC, string.Empty, string.Empty);
}
}
mOutStream = null;
@ -283,7 +310,7 @@ namespace SourceGen.AsmGen {
return false;
}
foreach (AddressMap.AddressMapEntry ent in Project.AddrMap) {
if (ent.Addr > 0xffff) {
if (ent.Address > 0xffff) {
return true;
}
}
@ -541,29 +568,39 @@ namespace SourceGen.AsmGen {
}
// IGenerator
public void OutputOrgDirective(int offset, int address) {
// If there's only one address range, just set the "real" PC. If there's more
// than one we can run out of space if the source file has a chunk in high memory
// followed by a chunk in low memory, because the "real" PC determines when the
// 64KB bank is overrun.
if (offset == 0) {
// first one
if (Project.AddrMap.Count == 1) {
OutputLine("*", "=", SourceFormatter.FormatHexValue(address, 4), string.Empty);
return;
public void OutputOrgDirective(AddressMap.AddressMapEntry addrEntry, bool isStart) {
// This is similar in operation to the AsmTass64 implementation. See comments there.
Debug.Assert(mPcDepth >= 0);
if (isStart) {
if (mPcDepth == 0 && mFirstIsOpen) {
mPcDepth++;
// Set the "real" PC for the first address change. If we're in "loadable"
// mode, just set "*=". If we're in "streaming" mode, we set "*=" to zero
// and then use a pseudo-PC.
if (mOutputMode == OutputMode.Loadable) {
OutputLine("*", "=", SourceFormatter.FormatHexValue(addrEntry.Address, 4),
string.Empty);
return;
} else {
// set the real PC to address zero to ensure we get a full 64KB
OutputLine("*", "=", SourceFormatter.FormatHexValue(0, 4), string.Empty);
}
}
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(sDataOpNames.OrgDirective),
SourceFormatter.FormatHexValue(addrEntry.Address, 4) + " {", string.Empty);
mPcDepth++;
} else {
mPcDepth--;
if (mPcDepth > 0 || !mFirstIsOpen) {
// close previous block
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(CLOSE_PSEUDOPC),
string.Empty, string.Empty);
} else {
// set the real PC to address zero to ensure we get a full 64KB
OutputLine("*", "=", SourceFormatter.FormatHexValue(0, 4), string.Empty);
// mark initial "*=" region as closed, but don't output anything
mFirstIsOpen = false;
}
}
if (mInPseudoPcBlock) {
// close previous block
OutputLine(string.Empty, CLOSE_PSEUDOPC, string.Empty, string.Empty);
}
OutputLine(string.Empty, sDataOpNames.OrgDirective,
SourceFormatter.FormatHexValue(address, 4) + " {", string.Empty);
mInPseudoPcBlock = true;
}
// IGenerator

View File

@ -250,18 +250,20 @@ namespace SourceGen.AsmGen {
sw.WriteLine("MEMORY {");
sw.WriteLine(" MAIN: file=%O, start=%S, size=65536;");
for (int i = 0; i < Project.AddrMap.Count; i++) {
AddressMap.AddressMapEntry ame = Project.AddrMap[i];
sw.WriteLine(string.Format("# MEM{0:D3}: file=%O, start=${1:x4}, size={2};",
i, ame.Addr, ame.Length));
}
//int i = 0;
//foreach (AddressMap.AddressMapEntry ame in Project.AddrMap) {
// sw.WriteLine(string.Format("# MEM{0:D3}: file=%O, start=${1:x4}, size={2};",
// i, ame.Address, ame.Length));
// i++;
//}
sw.WriteLine("}");
sw.WriteLine("SEGMENTS {");
sw.WriteLine(" CODE: load=MAIN, type=rw;");
for (int i = 0; i < Project.AddrMap.Count; i++) {
sw.WriteLine(string.Format("# SEG{0:D3}: load=MEM{0:D3}, type=rw;", i));
}
//foreach (AddressMap.AddressMapEntry ame in Project.AddrMap) {
// sw.WriteLine(string.Format("# SEG{0:D3}: load=MEM{0:D3}, type=rw;", i));
// i++;
//}
sw.WriteLine("}");
sw.WriteLine("FEATURES {}");
@ -559,27 +561,31 @@ namespace SourceGen.AsmGen {
}
// IGenerator
public void OutputOrgDirective(int offset, int address) {
// Linear search for offset. List should be small, so this should be quick.
int index = 0;
foreach (AddressMap.AddressMapEntry ame in Project.AddrMap) {
if (ame.Offset == offset) {
break;
}
index++;
public void OutputOrgDirective(AddressMap.AddressMapEntry addrEntry, bool isStart) {
if (!isStart) {
return;
}
mLineBuilder.Clear();
TextUtil.AppendPaddedString(mLineBuilder, ";", 0);
// using +1 to make it look like the comment ';' shifted it over
TextUtil.AppendPaddedString(mLineBuilder, SourceFormatter.FormatPseudoOp(".segment"),
mColumnWidths[0] + 1);
TextUtil.AppendPaddedString(mLineBuilder, string.Format("\"SEG{0:D3}\"", index),
mColumnWidths[0] + mColumnWidths[1] + 1);
OutputLine(mLineBuilder.ToString());
//// Linear search for offset. List should be small, so this should be quick.
//int index = 0;
//foreach (AddressMap.AddressMapEntry ame in Project.AddrMap) {
// if (ame.Offset == addrEntry.Offset && ame.Length == addrEntry.Length) {
// break;
// }
// index++;
//}
//mLineBuilder.Clear();
//TextUtil.AppendPaddedString(mLineBuilder, ";", 0);
//// using +1 to make it look like the comment ';' shifted it over
//TextUtil.AppendPaddedString(mLineBuilder, SourceFormatter.FormatPseudoOp(".segment"),
// mColumnWidths[0] + 1);
//TextUtil.AppendPaddedString(mLineBuilder, string.Format("\"SEG{0:D3}\"", index),
// mColumnWidths[0] + mColumnWidths[1] + 1);
//OutputLine(mLineBuilder.ToString());
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(sDataOpNames.OrgDirective),
SourceFormatter.FormatHexValue(address, 4), string.Empty);
SourceFormatter.FormatHexValue(addrEntry.Address, 4), string.Empty);
}
// IGenerator

View File

@ -484,9 +484,11 @@ namespace SourceGen.AsmGen {
}
// IGenerator
public void OutputOrgDirective(int offset, int address) {
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(sDataOpNames.OrgDirective),
SourceFormatter.FormatHexValue(address, 4), string.Empty);
public void OutputOrgDirective(AddressMap.AddressMapEntry addrEntry, bool isStart) {
if (isStart) {
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(sDataOpNames.OrgDirective),
SourceFormatter.FormatHexValue(addrEntry.Address, 4), string.Empty);
}
}
// IGenerator

View File

@ -102,11 +102,6 @@ namespace SourceGen.AsmGen {
/// </summary>
private StreamWriter mOutStream;
/// <summary>
/// If we output a ".logical", we will need a ".here" eventually.
/// </summary>
private bool mNeedHereOp;
/// <summary>
/// What encoding are we currently set up for.
/// </summary>
@ -115,10 +110,16 @@ namespace SourceGen.AsmGen {
/// <summary>
/// Output mode; determines how ORG is handled.
/// </summary>
private enum TassOutputMode {
private enum OutputMode {
Unknown = 0, Loadable = 1, Streamable = 2
}
private TassOutputMode mOutputMode;
private OutputMode mOutputMode;
/// <summary>
/// Current pseudo-PC depth. 0 is the "real" PC.
/// </summary>
private int mPcDepth;
private bool mFirstIsOpen;
/// <summary>
/// Holds detected version of configured assembler.
@ -220,13 +221,13 @@ namespace SourceGen.AsmGen {
// of offset +000002.
bool hasPrgHeader = GenCommon.HasPrgHeader(project);
int offAdj = hasPrgHeader ? 2 : 0;
int startAddr = project.AddrMap.Get(offAdj);
int startAddr = project.AddrMap.OffsetToAddress(offAdj);
if (startAddr + project.FileDataLength - offAdj > 65536) {
// Does not fit into memory at load address.
mOutputMode = TassOutputMode.Streamable;
mOutputMode = OutputMode.Streamable;
mHasPrgHeader = false;
} else {
mOutputMode = TassOutputMode.Loadable;
mOutputMode = OutputMode.Loadable;
mHasPrgHeader = hasPrgHeader;
}
//Debug.WriteLine("startAddr=$" + startAddr.ToString("x6") +
@ -298,6 +299,9 @@ namespace SourceGen.AsmGen {
(needLongAddress ? AsmTass64.LONG_ADDRESS : string.Empty) +
(mHasPrgHeader ? string.Empty : AsmTass64.NOSTART);
mPcDepth = 0;
mFirstIsOpen = true;
// Use UTF-8 encoding, without a byte-order mark.
using (StreamWriter sw = new StreamWriter(pathName, false, new UTF8Encoding(false))) {
mOutStream = sw;
@ -309,11 +313,6 @@ namespace SourceGen.AsmGen {
}
GenCommon.Generate(this, sw, worker);
if (mNeedHereOp) {
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(HERE_PSEUDO_OP),
string.Empty, string.Empty);
}
}
mOutStream = null;
@ -654,34 +653,58 @@ namespace SourceGen.AsmGen {
}
// IGenerator
public void OutputOrgDirective(int offset, int address) {
public void OutputOrgDirective(AddressMap.AddressMapEntry addrEntry, bool isStart) {
// 64tass separates the "compile offset", which determines where the output fits
// into the generated binary, and "program counter", which determines the code
// the assembler generates. Since we need to explicitly specify every byte in
// the output file, having a distinct compile offset isn't very useful. We want
// the output file, having a distinct compile offset isn't useful here. We want
// to set it once before the first line of code, then leave it alone.
//
// Any subsequent ORG changes are made to the program counter, and take the form
// of a pair of ops (.logical <addr> to open, .here to end). Omitting the .here
// of a pair of ops (".logical <addr>" to open, ".here" to end). Omitting the .here
// causes an error.
//
// If this is a "streamable" file, meaning it won't actually load into 64K of RAM
// without wrapping around, then we skip the "* = addr" (same as "* = 0") and just
// start with ".logical" segments.
Debug.Assert(offset >= StartOffset);
if (offset == StartOffset && mOutputMode == TassOutputMode.Loadable) {
// Set the "compile offset" to the initial address.
OutputLine("*", "=",
SourceFormatter.FormatHexValue(Project.AddrMap.Get(StartOffset), 4),
string.Empty);
} else {
if (mNeedHereOp) {
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(HERE_PSEUDO_OP),
string.Empty, string.Empty);
//
// The assembler's approach is best represented by having an address region that
// spans the entire file, with one or more "logical" regions inside. In practice
// (especially for multi-bank 65816 code) that may not be the case, but the
// assembler is still expecting us to start with a "* =" and then fit everything
// inside that. So we treat the first region specially, whether or not it wraps
// the rest of the file.
Debug.Assert(mPcDepth >= 0);
if (isStart) {
if (mPcDepth == 0 && mFirstIsOpen) {
mPcDepth++;
// Set the "real" PC for the first address change. If we're in "loadable"
// mode, just set "*=". If we're in "streaming" mode, we set "*=" to zero
// and then use a pseudo-PC.
if (mOutputMode == OutputMode.Loadable) {
OutputLine("*", "=",
SourceFormatter.FormatHexValue(addrEntry.Address, 4), string.Empty);
return;
} else {
// Set the real PC to address zero to ensure we get a full 64KB. The
// assembler assumes this as a default, so it can be omitted.
//OutputLine("*", "=", SourceFormatter.FormatHexValue(0, 4), string.Empty);
}
}
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(sDataOpNames.OrgDirective),
SourceFormatter.FormatHexValue(address, 4), string.Empty);
mNeedHereOp = true;
SourceFormatter.FormatHexValue(addrEntry.Address, 4), string.Empty);
mPcDepth++;
} else {
mPcDepth--;
if (mPcDepth > 0 || !mFirstIsOpen) {
// close previous block
OutputLine(string.Empty, SourceFormatter.FormatPseudoOp(HERE_PSEUDO_OP),
string.Empty, string.Empty);
} else {
// mark initial "*=" region as closed, but don't output anything
mFirstIsOpen = false;
}
}
}

View File

@ -51,6 +51,14 @@ namespace SourceGen.AsmGen {
int lastProgress = 0;
// Create an address map iterator and advance it to match gen.StartOffset.
IEnumerator<AddressMap.AddressChange> addrIter = proj.AddrMap.AddressChangeIterator;
while (addrIter.MoveNext()) {
if (addrIter.Current.IsStart && addrIter.Current.Offset >= offset) {
break;
}
}
while (offset < proj.FileData.Length) {
Anattrib attr = proj.GetAnattrib(offset);
@ -68,10 +76,12 @@ namespace SourceGen.AsmGen {
}
}
// Check for address change.
int orgAddr = proj.AddrMap.Get(offset);
if (orgAddr >= 0) {
gen.OutputOrgDirective(offset, orgAddr);
// Check for address changes. There may be more than one at a given offset.
AddressMap.AddressChange change = addrIter.Current;
while (change != null && change.Offset == offset) {
gen.OutputOrgDirective(change.Entry, change.IsStart);
addrIter.MoveNext();
change = addrIter.Current;
}
List<DefSymbol> lvars = lvLookup.GetVariablesDefinedAtOffset(offset);
@ -132,6 +142,20 @@ namespace SourceGen.AsmGen {
//System.Threading.Thread.Sleep(500);
}
}
// Close off any open ORG blocks.
while (addrIter.Current != null) {
AddressMap.AddressChange change = addrIter.Current;
if (change.Offset != offset) {
Debug.WriteLine("Closing offset mismatch: change=+" +
change.Offset.ToString("x6") + ", cur offset=+" + offset.ToString("x6"));
Debug.Assert(false);
}
Debug.Assert(change.Offset == offset);
gen.OutputOrgDirective(change.Entry, change.IsStart);
addrIter.MoveNext();
change = addrIter.Current;
}
}
private static void GenerateHeader(IGenerator gen, StreamWriter sw) {
@ -533,14 +557,25 @@ namespace SourceGen.AsmGen {
//Debug.WriteLine("PRG test: +0/1 has label");
return false;
}
// The first part of the address map should be a two-byte region, either added
// explicitly or a hole left at the start of the file. Address doesn't matter.
IEnumerator<AddressMap.AddressChange> iter = project.AddrMap.AddressChangeIterator;
if (!iter.MoveNext()) {
Debug.Assert(false);
return false;
}
AddressMap.AddressChange change = iter.Current;
if (change.Entry.Length != 2) {
Debug.WriteLine("PRG test: first entry is not a two-byte region");
}
// Confirm there's an address map entry at offset 2.
if (project.AddrMap.Get(2) == AddressMap.NO_ENTRY_ADDR) {
if (project.AddrMap.GetRegions(0x000002).Count == 0) {
//Debug.WriteLine("PRG test: no ORG at +2");
return false;
}
// See if the address at offset 2 matches the value at 0/1.
int value01 = project.FileData[0] | (project.FileData[1] << 8);
int addr2 = project.AddrMap.OffsetToAddress(2);
int addr2 = project.AddrMap.OffsetToAddress(0x000002);
if (value01 != addr2) {
//Debug.WriteLine("PRG test: +0/1 value is " + value01.ToString("x4") +
// ", address at +2 is " + addr2);

View File

@ -168,9 +168,9 @@ namespace SourceGen.AsmGen {
/// <summary>
/// Outputs a code origin directive.
/// </summary>
/// <param name="offset">Offset of code targeted to new address.</param>
/// <param name="address">24-bit address.</param>
void OutputOrgDirective(int offset, int address);
/// <param name="addrEntry">Address map entry object.</param>
/// <param name="isStart">True if we're outputing a region-start directive.</param>
void OutputOrgDirective(CommonUtil.AddressMap.AddressMapEntry addrEntry, bool isStart);
/// <summary>
/// Notify the assembler of a change in register width.

View File

@ -355,13 +355,20 @@ namespace SourceGen {
/// Sets the address for every byte in the input.
/// </summary>
private void SetAddresses() {
// The AddressMap will have at least one entry, will start at offset 0, and
// will exactly span the file.
foreach (AddressMap.AddressMapEntry ent in mAddrMap) {
int addr = ent.Addr;
for (int i = ent.Offset; i < ent.Offset + ent.Length; i++) {
mAnattribs[i].Address = addr++;
IEnumerator<AddressMap.AddressChange> addrIter = mAddrMap.AddressChangeIterator;
addrIter.MoveNext();
int addr = 0;
for (int offset = 0; offset < mAnattribs.Length; offset++) {
// Process all change events at this offset.
AddressMap.AddressChange change = addrIter.Current;
while (change != null && change.Offset == offset) {
addr = change.Address;
addrIter.MoveNext();
change = addrIter.Current;
}
mAnattribs[offset].Address = addr++;
}
}
@ -1105,7 +1112,7 @@ namespace SourceGen {
" label='" + label + "'; file length is" + mFileData.Length);
}
if (!mAddrMap.IsSingleAddrRange(offset, length)) {
if (!mAddrMap.IsRangeUnbroken(offset, length)) {
LogW(offset, "SIDF: format crosses address map boundary (len=" + length + ")");
return false;
}
@ -1362,7 +1369,7 @@ namespace SourceGen {
dbrChanges[kvp.Key] = kvp.Value;
}
// Create an array for fast access.
// Create a full-file array for fast access.
short[] bval = new short[mAnattribs.Length];
Misc.Memset(bval, DbrValue.UNKNOWN);
foreach (KeyValuePair<int, DbrValue> kvp in dbrChanges) {
@ -1370,12 +1377,17 @@ namespace SourceGen {
}
// Run through file, updating instructions as needed.
short curVal = (byte)(mAddrMap.Get(0) >> 16); // start with B=K
// TODO(org): this is wrong if the file starts with a non-addr region; can walk
// through anattribs and set to mAnattribs[].Address of first instruction; maybe
// just init to DbrValue.UNKNOWN and set it inside the loop on first relevant instr
int firstAddr = mAddrMap.OffsetToAddress(0);
short curVal = (byte)(firstAddr >> 16); // start with B=K
for (int offset = 0; offset < mAnattribs.Length; offset++) {
if (bval[offset] != DbrValue.UNKNOWN) {
curVal = bval[offset];
}
if (!mAnattribs[offset].UsesDataBankReg) {
// Not a relevant instruction, move on to next.
continue;
}
Debug.Assert(mAnattribs[offset].IsInstructionStart);

View File

@ -682,7 +682,7 @@ namespace SourceGen {
// Check to see if we just crossed an address change.
if (offset < mAnattribs.Length &&
!mProject.AddrMap.IsSingleAddrRange(offset - 1, 2)) {
!mProject.AddrMap.IsRangeUnbroken(offset - 1, 2)) {
// Must be an ORG here. End region and scan.
AnalyzeRange(startOffset, offset - 1);
startOffset = -1;

View File

@ -270,7 +270,8 @@ namespace SourceGen {
ProjectPathName = string.Empty;
AddrMap = new AddressMap(fileDataLen);
AddrMap.Set(0, 0x1000); // default load address to $1000; override later
// set default load address to $1000; override later
AddrMap.AddRegion(0x000000, fileDataLen, 0x1000, false);
// Default value is "no tag".
AnalyzerTags = new CodeAnalysis.AnalyzerTag[fileDataLen];
@ -387,6 +388,7 @@ namespace SourceGen {
ProjectProps.EntryFlags = SystemDefaults.GetEntryFlags(sysDef);
// Configure the load address.
AddrMap.Clear();
if (SystemDefaults.GetFirstWordIsLoadAddr(sysDef) && mFileData.Length > 2) {
// First two bytes are the load address, with the actual file data starting
// at +000002. We need to assign an address to the bytes, but don't want them
@ -396,8 +398,13 @@ namespace SourceGen {
// So we just give it an offset of (start - 2) and leave it to the user to
// update if necessary.
int loadAddr = RawData.GetWord(mFileData, 0, 2, false);
AddrMap.Set(0, loadAddr < 2 ? 0 : loadAddr - 2);
AddrMap.Set(2, loadAddr);
// TODO(org): use NON_ADDR for first two bytes
AddressMap.AddResult addRes =
AddrMap.AddRegion(0, 2, loadAddr < 2 ? 0 : loadAddr - 2, false);
Debug.Assert(addRes == AddressMap.AddResult.Okay);
addRes = AddrMap.AddRegion(2, mFileData.Length - 2, loadAddr, false);
Debug.Assert(addRes == AddressMap.AddResult.Okay);
OperandFormats[0] = FormatDescriptor.Create(2, FormatDescriptor.Type.NumericLE,
FormatDescriptor.SubType.None);
Comments[0] = Res.Strings.LOAD_ADDRESS;
@ -405,7 +412,9 @@ namespace SourceGen {
AnalyzerTags[2] = CodeAnalysis.AnalyzerTag.Code;
} else {
int loadAddr = SystemDefaults.GetLoadAddress(sysDef);
AddrMap.Set(0, loadAddr);
AddressMap.AddResult addRes =
AddrMap.AddRegion(0, mFileData.Length, loadAddr, false);
Debug.Assert(addRes == AddressMap.AddResult.Okay);
}
foreach (string str in sysDef.SymbolFiles) {
@ -750,11 +759,16 @@ namespace SourceGen {
/// Checks to see if any part of the address map runs across a bank boundary.
/// </summary>
private void ValidateAddressMap() {
foreach (AddressMap.AddressMapEntry entry in AddrMap) {
if ((entry.Addr & 0xff0000) != ((entry.Addr + entry.Length - 1) & 0xff0000)) {
// Use the change list, because the region list can have "floating" length values.
IEnumerator<AddressMap.AddressChange> addrIter = AddrMap.AddressChangeIterator;
while (addrIter.MoveNext()) {
AddressMap.AddressChange change = addrIter.Current;
AddressMap.AddressMapEntry entry = change.Entry;
if (change.IsStart &&
(entry.Address & 0xff0000) != ((entry.Address + 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);
int firstNext = (entry.Address & 0xff0000) + 0x010000;
int badOffset = entry.Offset + (firstNext - entry.Address);
Messages.Add(new MessageList.MessageEntry(
MessageList.MessageEntry.SeverityLevel.Error,
entry.Offset,
@ -1035,7 +1049,7 @@ namespace SourceGen {
continue;
}
if (!AddrMap.IsSingleAddrRange(offset, dfd.Length)) {
if (!AddrMap.IsRangeUnbroken(offset, dfd.Length)) {
string msg = "descriptor straddles address change; len=" + dfd.Length;
genLog.LogE("+" + offset.ToString("x6") + ": " + msg);
Messages.Add(new MessageList.MessageEntry(
@ -2130,13 +2144,27 @@ namespace SourceGen {
//}
break;
case UndoableChange.ChangeType.SetAddress: {
// TODO(org): rewrite this
AddressMap addrMap = AddrMap;
if (addrMap.Get(offset) != (int)oldValue) {
Debug.WriteLine("GLITCH: old address value mismatch (" +
addrMap.Get(offset) + " vs " + (int)oldValue + ")");
Debug.Assert(false);
if ((int)oldValue == AddressMap.NON_ADDR) {
// adding new entry
if (addrMap.AddRegion(offset, AddressMap.FLOATING_LEN,
(int)newValue, false) != AddressMap.AddResult.Okay) {
Debug.Assert(false, "failed adding region");
}
} else if ((int)newValue == AddressMap.NON_ADDR) {
// removing existing entry
if (!addrMap.RemoveRegion(offset, AddressMap.FLOATING_LEN)) {
Debug.Assert(false, "failed removing region");
}
} else {
// updating existing entry
if (!addrMap.EditRegion(offset, AddressMap.FLOATING_LEN,
(int) newValue, false)) {
Debug.Assert(false, "failed editing region");
}
}
addrMap.Set(offset, (int)newValue);
Debug.WriteLine("Map offset +" + offset.ToString("x6") + " to $" +
((int)newValue).ToString("x6"));

View File

@ -1194,7 +1194,7 @@ namespace SourceGen {
}
Line topLine = lines[index];
Line newLine = new Line(topLine.FileOffset, 0, Line.Type.OrgDirective);
string addrStr = mFormatter.FormatHexValue(ent.Addr, 4);
string addrStr = mFormatter.FormatHexValue(ent.Address, 4);
newLine.Parts = FormattedParts.CreateDirective(
mFormatter.FormatPseudoOp(mPseudoOpNames.OrgDirective), addrStr);
lines.Insert(index, newLine);

View File

@ -259,6 +259,8 @@ namespace SourceGen {
/// to this point so we can report fatal errors directly to the user.
/// </summary>
public void WindowLoaded() {
// Run library unit tests.
Debug.Assert(CommonUtil.AddressMap.Test());
Debug.Assert(CommonUtil.RangeSet.Test());
Debug.Assert(CommonUtil.TypedRangeSet.Test());
Debug.Assert(CommonUtil.Version.Test());
@ -1803,12 +1805,16 @@ namespace SourceGen {
int lastOffset = CodeLineList[lastIndex].FileOffset;
int nextOffset = lastOffset + CodeLineList[lastIndex].OffsetSpan;
int nextAddr;
AddressMap addrMap = mProject.AddrMap;
// TODO(org): rewrite this - need to identify the specific .ORG statement since
// there can now be several at a single offset
if (firstOffset == lastOffset || nextOffset == mProject.FileDataLength) {
// Single item (which may not be a single *line*) is selected, or the
// Single item (which might not be a single *line*) is selected, or the
// last selected item is the end of the file.
nextOffset = -1;
nextAddr = AddressMap.NO_ENTRY_ADDR;
nextAddr = AddressMap.NON_ADDR;
} else {
// Compute "nextAddr". If there's an existing entry at nextOffset, we use
// that. If not, we use the "load address", which is determined by the very
@ -1829,7 +1835,7 @@ namespace SourceGen {
nextAddr = cloneMap.OffsetToAddress(nextOffset);
}
#else
int fileStartAddr = mProject.AddrMap.OffsetToAddress(0);
int fileStartAddr = addrMap.OffsetToAddress(0);
nextAddr = ((fileStartAddr + nextOffset) & 0xffff) | (fileStartAddr & 0xff0000);
#endif
}
@ -1849,37 +1855,40 @@ namespace SourceGen {
ChangeSet cs = new ChangeSet(1);
if (mProject.AddrMap.Get(firstOffset) != dlg.NewAddress) {
// Added / removed / changed existing entry.
//
// We allow creation of an apparently redundant address override, because
// sometimes it's helpful to add one to "anchor" an area before relocating
// something that appears earlier in the file.
int prevAddress = mProject.AddrMap.Get(firstOffset);
UndoableChange uc = UndoableChange.CreateAddressChange(firstOffset,
prevAddress, dlg.NewAddress);
cs.Add(uc);
Debug.WriteLine("EditAddress: changing addr at offset +" +
firstOffset.ToString("x6") + " to $" + dlg.NewAddress.ToString("x4"));
}
// TODO(org): I'm just commenting this out for now; needs to be totally redone
//if (addrMap.Get(firstOffset) != dlg.NewAddress) {
// // Added / removed / changed existing entry.
// //
// // We allow creation of an apparently redundant address override, because
// // sometimes it's helpful to add one to "anchor" an area before relocating
// // something that appears earlier in the file.
// int prevAddress = addrMap.Get(firstOffset);
// UndoableChange uc = UndoableChange.CreateAddressChange(firstOffset,
// prevAddress, dlg.NewAddress);
// cs.Add(uc);
// Debug.WriteLine("EditAddress: changing addr at offset +" +
// firstOffset.ToString("x6") + " to $" + dlg.NewAddress.ToString("x4"));
//}
// We want to create an entry for the chunk that follows the selected area.
// We don't modify the trailing address if an entry already exists.
// (Note the "can edit" code prevented us from being called if there's an
// address map entry in the middle of the selected area.)
//
// If they're removing an existing entry, don't add a new entry at the end.
if (nextAddr >= 0 && dlg.NewAddress != AddressMap.NO_ENTRY_ADDR &&
mProject.AddrMap.Get(nextOffset) == AddressMap.NO_ENTRY_ADDR) {
// We don't screen for redundant entries here. That should only happen if
// they select a range and then don't change the address. Maybe it's useful?
int prevAddress = mProject.AddrMap.Get(nextOffset);
UndoableChange uc = UndoableChange.CreateAddressChange(nextOffset,
prevAddress, nextAddr);
cs.Add(uc);
Debug.WriteLine("EditAddress: setting trailing addr at offset +" +
nextOffset.ToString("x6") + " to $" + nextAddr.ToString("x4"));
}
//// If they're removing an existing entry, don't add a new entry at the end.
//if (nextAddr >= 0 && dlg.NewAddress != AddressMap.NO_ENTRY_ADDR &&
// addrMap.Get(nextOffset) == AddressMap.NO_ENTRY_ADDR) {
// // We don't screen for redundant entries here. That should only happen if
// // they select a range and then don't change the address. Maybe it's useful?
// int prevAddress = addrMap.Get(nextOffset);
// UndoableChange uc = UndoableChange.CreateAddressChange(nextOffset,
// prevAddress, nextAddr);
// cs.Add(uc);
// Debug.WriteLine("EditAddress: setting trailing addr at offset +" +
// nextOffset.ToString("x6") + " to $" + nextAddr.ToString("x4"));
//}
if (cs.Count > 0) {
ApplyUndoableChanges(cs);
@ -2614,7 +2623,7 @@ namespace SourceGen {
// This must match what GroupedOffsetSetFromSelected() does.
if (!mProject.UserLabels.ContainsKey(nextOffset) &&
!mProject.HasCommentNoteOrVis(nextOffset) &&
mProject.AddrMap.IsSingleAddrRange(nextOffset - 1, 2)) {
mProject.AddrMap.IsRangeUnbroken(nextOffset - 1, 2)) {
// Good to go.
Debug.WriteLine("Grabbing second byte from +" + nextOffset.ToString("x6"));
trs.Add(nextOffset, rng.Type);
@ -3606,7 +3615,7 @@ namespace SourceGen {
// + expectedAddr.ToString("x4"));
expectedAddr = attr.Address;
groupNum++;
} else if (offset > 0 && !mProject.AddrMap.IsSingleAddrRange(offset - 1, 2)) {
} else if (offset > 0 && !mProject.AddrMap.IsRangeUnbroken(offset - 1, 2)) {
// Was the previous byte in a different address range? This is only
// strictly necessary if the previous byte was in the selection set (which
// it won't be if the selection starts at the beginning of an address

View File

@ -246,7 +246,7 @@ namespace SourceGen {
public SerAddressMap() { }
public SerAddressMap(AddressMap.AddressMapEntry ent) {
Offset = ent.Offset;
Addr = ent.Addr;
Addr = ent.Address;
}
}
public class SerTypeHintRange {
@ -668,8 +668,20 @@ namespace SourceGen {
}
// Deserialize address map.
proj.AddrMap.Clear();
foreach (SerAddressMap addr in spf.AddressMap) {
proj.AddrMap.Set(addr.Offset, addr.Addr);
// TODO(org): serialize length and isRelative
int length = CommonUtil.AddressMap.FLOATING_LEN;
AddressMap.AddResult addResult = proj.AddrMap.AddRegion(addr.Offset,
length, addr.Addr, false);
if (addResult != CommonUtil.AddressMap.AddResult.Okay) {
string msg = "off=+" + addr.Offset.ToString("x6") + " addr=$" +
addr.Addr.ToString("x4") + " len=" +
(length == CommonUtil.AddressMap.FLOATING_LEN ? "(floating)" : length.ToString());
string errMsg = string.Format(Res.Strings.ERR_BAD_ADDRESS_REGION_FMT, msg);
report.Add(FileLoadItem.Type.Warning, errMsg);
}
}
// Deserialize analyzer tags (formerly known as "type hints"). The default value

View File

@ -47,6 +47,7 @@ limitations under the License.
<system:String x:Key="str_EquAddress">addr</system:String>
<system:String x:Key="str_EquConstant">const</system:String>
<system:String x:Key="str_EquStackRelative">stkrl</system:String>
<system:String x:Key="str_ErrBadAddressRegionFmt">Bad address region {0}</system:String>
<system:String x:Key="str_ErrBadDefSymbolDir">Unknown I/O direction in symbol</system:String>
<system:String x:Key="str_ErrBadFdFmt">Bad format descriptor at +{0:x6}.</system:String>
<system:String x:Key="str_ErrBadFdFormat">Bad format descriptor type</system:String>

View File

@ -75,6 +75,8 @@ namespace SourceGen.Res {
(string)Application.Current.FindResource("str_EquConstant");
public static string EQU_STACK_RELATIVE =
(string)Application.Current.FindResource("str_EquStackRelative");
public static string ERR_BAD_ADDRESS_REGION_FMT =
(string)Application.Current.FindResource("str_ErrBadAddressRegionFmt");
public static string ERR_BAD_DEF_SYMBOL_DIR =
(string)Application.Current.FindResource("str_ErrBadDefSymbolDir");
public static string ERR_BAD_FD_FMT =

View File

@ -1,5 +1,4 @@
.setcpu "6502X"
; .segment "SEG000"
.org $1000
jsr L1035
jsr L1038

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10000-allops-value-6502
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=598;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65C02"
; .segment "SEG000"
.org $1000
jsr L1014
jsr L108A

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10001-allops-value-65C02
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=489;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65816"
; .segment "SEG000"
.org $1000
.a8
.i8

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10002-allops-value-65816
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=588;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65C02"
; .segment "SEG000"
.org $1000
jsr L1017
jsr L1099

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10003-allops-value-W65C02
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=541;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "6502X"
; .segment "SEG000"
.org $1000
jsr L1035
jsr L1038

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10010-allops-zero-6502
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=598;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65C02"
; .segment "SEG000"
.org $1000
jsr L1014
jsr L108A

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10011-allops-zero-65C02
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=489;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65816"
; .segment "SEG000"
.org $1000
.a8
.i8

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10012-allops-zero-65816
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=588;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65C02"
; .segment "SEG000"
.org $1000
jsr L1017
jsr L1099

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10013-allops-zero-W65C02
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=541;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "6502X"
; .segment "SEG000"
.org $1000
jsr L100F
jsr L1017

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10020-embedded-instructions
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=82;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65816"
; .segment "SEG000"
.org $1000
.a8
.i8

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10022-embedded-instructions
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=33;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "6502X"
; .segment "SEG000"
.org $1000
clv
cld

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10030-flags-and-branches
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=193;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65816"
; .segment "SEG000"
.org $1000
.a8
.i8

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10032-flags-and-branches
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=180;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "6502X"
; .segment "SEG000"
.org $1000
lda L10AC
ora L10BC

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 10040-data-recognition
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=196;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,8 +1,7 @@
;Project file was edited to get all big-endian data types, and to have an
;incorrect .junk alignment directive.
!cpu 6502
* = $0000
!pseudopc $1000 {
* = $1000
bit L1448
jsr L14A8
nop
@ -61,7 +60,6 @@ LABEL !hex 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff
!fill 2,$dd ;incorrect alignment
!align 255,0,$00
!fill 8,$82
} ;!pseudopc
!pseudopc $1408 {
!fill 8,$82 ;note no-op .ORG
!fill 8,$83

View File

@ -1,7 +1,6 @@
;Project file was edited to get all big-endian data types, and to have an
;incorrect .junk alignment directive.
.setcpu "6502"
; .segment "SEG000"
.org $1000
bit L1448
jsr L14A8
@ -63,11 +62,9 @@ LABEL: .byte $00,$11,$22,$33,$44,$55,$66,$77,$88,$99,$aa,$bb,$cc,$dd,$ee,$ff
.res 2,$dd ;incorrect alignment
.res 140,$00
.res 8,$82
; .segment "SEG001"
.org $1408
.res 8,$82 ;note no-op .ORG
.res 8,$83
; .segment "SEG002"
.org $1428
.res 8,$83 ;meaningful .ORG
.res 8,$84

View File

@ -1,15 +1,9 @@
# 6502bench SourceGen generated linker script for 20000-numeric-types
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=1032;
# MEM001: file=%O, start=$1408, size=16;
# MEM002: file=%O, start=$1428, size=152;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
# SEG002: load=MEM002, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
;Project file was edited to get zero-length strings and reverse DCI.
.setcpu "6502"
; .segment "SEG000"
.org $1000
rts

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20010-string-types
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=3132;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
;Project file was edited to force ASCII formatting for some operands.
.setcpu "6502"
; .segment "SEG000"
.org $1000
lda $01
lda $0102

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20020-operand-formats
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=165;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
;Project file was edited to force ASCII formatting for some operands.
.setcpu "65816"
; .segment "SEG000"
.org $1000
.a8
.i8

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20022-operand-formats
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=62;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -9,8 +9,7 @@ absh = $feed
plataddr = $3000 ;address only in platform file
projalsa = $3200 ;same val as projalso
* = $0000
!pseudopc $2345 {
* = $2345
start lda #zip
lda #zip+16
lda #zip-192
@ -59,7 +58,6 @@ start lda #zip
@L23A3 jmp @L1000_1
} ;!pseudopc
!pseudopc $1000 {
@L1000_1 nop
@L1000 nop

View File

@ -9,7 +9,6 @@ absh = $feed
plataddr = $3000 ;address only in platform file
projalsa = $3200 ;same val as projalso
; .segment "SEG000"
.org $2345
start: lda #zip
lda #zip+16
@ -59,7 +58,6 @@ start: lda #zip
@L23A3: jmp @L1000_1
; .segment "SEG001"
.org $1000
@L1000_1: nop
@L1000: nop

View File

@ -1,13 +1,9 @@
# 6502bench SourceGen generated linker script for 20030-labels-and-symbols
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$2345, size=97;
# MEM001: file=%O, start=$1000, size=355;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -11,7 +11,6 @@ thirty2 = $12345678 ;32-bit constant test
plataddr = $3000 ;address only in platform file
projalsa = $3200 ;same val as projalso
; .segment "SEG000"
.org $012345
.a8
.i8
@ -126,7 +125,6 @@ start: clc
@nextchunk: jml @L1000_1
; .segment "SEG001"
.org $1000
@L1000_1: nop
@L1000: nop

View File

@ -1,13 +1,9 @@
# 6502bench SourceGen generated linker script for 20032-labels-and-symbols
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$12345, size=279;
# MEM001: file=%O, start=$1000, size=416;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,9 +1,7 @@
!cpu 6502
* = $0000
!pseudopc $1000 {
* = $1000
!word $1000 ;PRG-style header
} ;!pseudopc
!pseudopc $1000 {
jsr L1100
jsr L1107

View File

@ -1,15 +1,12 @@
.setcpu "6502"
; .segment "SEG000"
.org $1000
.word $1000 ;PRG-style header
; .segment "SEG001"
.org $1000
jsr L1100
jsr L1107
jmp L2000
; .segment "SEG002"
.org $1100
L1100: bit L1100
L1103: lda #$11
@ -18,7 +15,6 @@ L1107: ldy #$11
clv
bvc L1103
; .segment "SEG003"
.org $1100
@L1100_0: bit @L1100_0
lda #$22
@ -26,7 +22,6 @@ L1107: ldy #$11
ldy #$22
jmp @L1105
; .segment "SEG004"
.org $1100
@L1100_1: bit @L1100_1
lda #$33
@ -35,20 +30,17 @@ L1107: ldy #$11
sec
bcs @L1107_0
; .segment "SEG005"
.org $2000
L2000: bit L2000
beq $2018
bne @L2020
; .segment "SEG006"
.org $2020
@L2020: bit @L2020
beq $2028
bne L2080
offend: nop
; .segment "SEG007"
.org $2080
L2080: bit L2080
lda offend
@ -63,22 +55,18 @@ L2080: bit L2080
beq @L2100
.byte $ad
; .segment "SEG008"
.org $2100
@L2100: nop
nop
jmp @L3000
; .segment "SEG009"
.org $2800
.byte $00
.byte $28
.res 14,$00
; .segment "SEG010"
.org $2820
.res 18,$00
; .segment "SEG011"
.org $3000
@L3000: bit @L3000
lda #$44
@ -88,7 +76,6 @@ L2080: bit L2080
ulabel: .byte $00
.byte $01
; .segment "SEG012"
.org $3100
.byte $02
@ -101,7 +88,6 @@ fwd: bit fwd
beq @L3182
.byte $ea
.byte $ea
; .segment "SEG013"
.org $3180
.byte $00
.byte $01
@ -116,7 +102,6 @@ fwd: bit fwd
label1: .byte $ea
.byte $ea
; .segment "SEG014"
.org $3200
L3200: bit L3200
.byte $00

View File

@ -1,39 +1,9 @@
# 6502bench SourceGen generated linker script for 20040-address-changes
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=2;
# MEM001: file=%O, start=$1000, size=9;
# MEM002: file=%O, start=$1100, size=12;
# MEM003: file=%O, start=$1100, size=12;
# MEM004: file=%O, start=$1100, size=12;
# MEM005: file=%O, start=$2000, size=7;
# MEM006: file=%O, start=$2020, size=8;
# MEM007: file=%O, start=$2080, size=32;
# MEM008: file=%O, start=$2100, size=5;
# MEM009: file=%O, start=$2800, size=16;
# MEM010: file=%O, start=$2820, size=18;
# MEM011: file=%O, start=$3000, size=14;
# MEM012: file=%O, start=$3100, size=23;
# MEM013: file=%O, start=$3180, size=19;
# MEM014: file=%O, start=$3200, size=5;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
# SEG002: load=MEM002, type=rw;
# SEG003: load=MEM003, type=rw;
# SEG004: load=MEM004, type=rw;
# SEG005: load=MEM005, type=rw;
# SEG006: load=MEM006, type=rw;
# SEG007: load=MEM007, type=rw;
# SEG008: load=MEM008, type=rw;
# SEG009: load=MEM009, type=rw;
# SEG010: load=MEM010, type=rw;
# SEG011: load=MEM011, type=rw;
# SEG012: load=MEM012, type=rw;
# SEG013: load=MEM013, type=rw;
# SEG014: load=MEM014, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65816"
; .segment "SEG000"
.org $021000
.a8
.i8
@ -10,7 +9,6 @@
jsr L21107 & $ffff
jmp L22000 & $ffff
; .segment "SEG001"
.org $021100
L21100: bit L21100 & $ffff
L21103: lda #$11
@ -19,7 +17,6 @@ L21107: ldy #$11
per L21103
bra L21103
; .segment "SEG002"
.org $021100
@L21100_0: bit @L21100_0 & $ffff
lda #$22
@ -28,7 +25,6 @@ L21107: ldy #$11
per @L21105
jmp @L21105 & $ffff
; .segment "SEG003"
.org $021100
@L21100_1: bit @L21100_1 & $ffff
lda #$33
@ -37,20 +33,17 @@ L21107: ldy #$11
per @L21107_0
bra @L21107_0
; .segment "SEG004"
.org $022000
L22000: bit L22000 & $ffff
beq $022018
bra @L22020
; .segment "SEG005"
.org $022020
@L22020: bit @L22020 & $ffff
beq $022029
brl @L22080
@offend: nop
; .segment "SEG006"
.org $022080
@L22080: bit @L22080 & $ffff
lda @offend & $ffff
@ -65,22 +58,18 @@ L22000: bit L22000 & $ffff
beq @L22100
.byte $ad
; .segment "SEG007"
.org $022100
@L22100: nop
nop
jmp @L23000 & $ffff
; .segment "SEG008"
.org $022800
.byte $00
.byte $28
.res 14,$00
; .segment "SEG009"
.org $022820
.res 18,$00
; .segment "SEG010"
.org $023000
@L23000: bit @L23000 & $ffff
lda #$44
@ -90,7 +79,6 @@ L22000: bit L22000 & $ffff
@ulabel: .byte $00
.byte $01
; .segment "SEG011"
.org $023100
.byte $02
@ -103,7 +91,6 @@ L22000: bit L22000 & $ffff
beq @L23182
.byte $ea
.byte $ea
; .segment "SEG012"
.org $023180
.byte $00
.byte $01
@ -117,7 +104,6 @@ L22000: bit L22000 & $ffff
@label1: .byte $ea
.byte $ea
; .segment "SEG013"
.org $023200
@L23200: bit @L23200 & $ffff
.byte $00

View File

@ -1,37 +1,9 @@
# 6502bench SourceGen generated linker script for 20042-address-changes
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$21000, size=13;
# MEM001: file=%O, start=$21100, size=14;
# MEM002: file=%O, start=$21100, size=15;
# MEM003: file=%O, start=$21100, size=14;
# MEM004: file=%O, start=$22000, size=7;
# MEM005: file=%O, start=$22020, size=9;
# MEM006: file=%O, start=$22080, size=32;
# MEM007: file=%O, start=$22100, size=5;
# MEM008: file=%O, start=$22800, size=16;
# MEM009: file=%O, start=$22820, size=18;
# MEM010: file=%O, start=$23000, size=14;
# MEM011: file=%O, start=$23100, size=23;
# MEM012: file=%O, start=$23180, size=18;
# MEM013: file=%O, start=$23200, size=5;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
# SEG002: load=MEM002, type=rw;
# SEG003: load=MEM003, type=rw;
# SEG004: load=MEM004, type=rw;
# SEG005: load=MEM005, type=rw;
# SEG006: load=MEM006, type=rw;
# SEG007: load=MEM007, type=rw;
# SEG008: load=MEM008, type=rw;
# SEG009: load=MEM009, type=rw;
# SEG010: load=MEM010, type=rw;
# SEG011: load=MEM011, type=rw;
# SEG012: load=MEM012, type=rw;
# SEG013: load=MEM013, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,9 +1,7 @@
!cpu 6502
* = $0000
!pseudopc $1000 {
* = $1000
jmp L0000
} ;!pseudopc
!pseudopc $0000 {
L0000 bit+2 L0000
L0003 lda+1 L0000

View File

@ -1,9 +1,7 @@
.setcpu "6502"
; .segment "SEG000"
.org $1000
jmp L0000
; .segment "SEG001"
.org $0000
L0000: bit a:L0000
L0003: lda L0000
@ -21,12 +19,10 @@ L0012: lda lodat+1
clc
.byte $90,$a9
; .segment "SEG002"
.org $0080
L0080: bit a:L0080
jmp LFFC6
; .segment "SEG003"
.org $ffc0
LFFC0: bit LFFC0
LFFC3: clc

View File

@ -1,17 +1,9 @@
# 6502bench SourceGen generated linker script for 20050-branches-and-banks
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=3;
# MEM001: file=%O, start=$0000, size=23;
# MEM002: file=%O, start=$0080, size=6;
# MEM003: file=%O, start=$ffc0, size=7;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
# SEG002: load=MEM002, type=rw;
# SEG003: load=MEM003, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
;ACME can't handle 65816 code that lives outside bank zero
* = $0000
!pseudopc $1000 {
* = $1000
!hex 18fbe2305c000044000102cf000044af000044ad0000a50030f562b2ffd0b082
!hex a9ff1700170044cfc0ff44f005303c8239005c0020002c0020f41700f44400d0
!hex 03dc0810ea201220201520200f20225634125c103254cf1032548006eaea6016
@ -10,4 +9,3 @@
!hex 7d3254eaea60200e20eac23008a90000e230a90028a9eaeae23008a900c230a9
!hex 000028a9eaeac230eaad0e20ad2220200e20202220fc0e20d0037c0e2020cbed
!hex adcbedd0037ccbedea6b
} ;!pseudopc

View File

@ -2,7 +2,6 @@
zero = $00
longsym = $123456
; .segment "SEG000"
.org $1000
.a8
.i8
@ -15,7 +14,6 @@ lodat: .byte $00
.byte $01
.byte $02
; .segment "SEG001"
.org $440000
L440000: cmp L440000
L440004: lda L440000
@ -29,7 +27,6 @@ L440004: lda L440000
dat44: .word dat44 & $ffff
.faraddr dat44
; .segment "SEG002"
.org $44ffc0
L44FFC0: cmp L44FFC0
high44: beq @L44FFCB
@ -38,7 +35,6 @@ high44: beq @L44FFCB
@L44FFCB: jml @L2000
; .segment "SEG003"
.org $2000
@L2000: bit @L2000
pea dat44 & $ffff
@ -53,7 +49,6 @@ j2: jsr j2+3
jsl longsym
jml bank54
; .segment "SEG004"
.org $543210
bank54: cmp bank54
bra L54321C

View File

@ -1,19 +1,9 @@
# 6502bench SourceGen generated linker script for 20052-branches-and-banks
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=11;
# MEM001: file=%O, start=$440000, size=28;
# MEM002: file=%O, start=$44ffc0, size=15;
# MEM003: file=%O, start=$2000, size=32;
# MEM004: file=%O, start=$543210, size=180;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
# SEG002: load=MEM002, type=rw;
# SEG003: load=MEM003, type=rw;
# SEG004: load=MEM004, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
!cpu 6502
* = $0000
!pseudopc $1000 {
* = $1000
load11 lda #$11
@L1002 ldx #$22
@load33 ldy #$33
@ -47,7 +46,6 @@ load11 lda #$11
!byte $80
@dat81 !byte $81
} ;!pseudopc
!pseudopc $2000 {
@L2000 !byte $82
!byte $83

View File

@ -1,5 +1,4 @@
.setcpu "6502"
; .segment "SEG000"
.org $1000
load11: lda #$11
@L1002: ldx #$22
@ -47,7 +46,6 @@ load11: lda #$11
.byte $80
@dat81: .byte $81
; .segment "SEG001"
.org $2000
@L2000: .byte $82
.byte $83

View File

@ -1,13 +1,9 @@
# 6502bench SourceGen generated linker script for 20060-target-adjustment
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=133;
# MEM001: file=%O, start=$2000, size=58;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
;6502bench SourceGen v1.7.3-dev2
.setcpu "65816"
; .segment "SEG000"
.org $1000
.a8
.i8

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20062-target-adjustment
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=23;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "6502"
; .segment "SEG000"
.org $1000
.byte $03
.byte $02

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20070-hinting
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=72;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,7 +1,6 @@
.setcpu "65C02"
REALLYLONGLABELNAME = $8888 ;that's a long name
; .segment "SEG000"
.org $1000
nop
_start: lda @start

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20081-label-localizer
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=103;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -19,7 +19,6 @@ plataddr = $3000 ;address only in platform file
;Short, unboxed comment here!!
;Two spaces after. More hyp-
;hens?
; .segment "SEG000"
.org $1000
lda #$01 ;Comment!
;Comment rulers can be helpful in findin the edges of notes. Comments are hyph-

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20090-notes-and-comments
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=98;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
!cpu 6510
* = $0000
!pseudopc $1000 {
* = $1000
jsr L1035
jsr L1038
jsr L1059
@ -295,7 +294,6 @@ L1238 isc (L0080),y
sbc+2 L0086,x
inc+2 L0086,x
isc+2 L0086,x
} ;!pseudopc
!pseudopc $0080 {
L0080 bit+1 @L0082
@L0082 bit+1 @L0082

View File

@ -1,5 +1,4 @@
.setcpu "6502X"
; .segment "SEG000"
.org $1000
jsr L1035
jsr L1038
@ -295,7 +294,6 @@ L1238: isc (L0080),y
sbc a:L0086,x
inc a:L0086,x
isc a:L0086,x
; .segment "SEG001"
.org $0080
L0080: bit z:@L0082
@L0082: bit @L0082

View File

@ -1,13 +1,9 @@
# 6502bench SourceGen generated linker script for 20100-label-dp
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=598;
# MEM001: file=%O, start=$0080, size=9;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
!cpu 65816
* = $0000
!pseudopc $1000 {
* = $1000
!as
!rs
sec
@ -286,7 +285,6 @@ L11FC cmp+2 L0086,x
sbc+2 L0086,x
inc+2 L0086,x
sbc+3 L0089,x
} ;!pseudopc
!pseudopc $0080 {
L0080 bit+1 @L0082
@L0082 bit+1 @L0082

View File

@ -1,5 +1,4 @@
.setcpu "65816"
; .segment "SEG000"
.org $1000
.a8
.i8
@ -286,7 +285,6 @@ L11FC: cmp a:L0086,x
sbc a:L0086,x
inc a:L0086,x
sbc f:L0089,x
; .segment "SEG001"
.org $0080
L0080: bit z:@L0082
@L0082: bit @L0082

View File

@ -1,13 +1,9 @@
# 6502bench SourceGen generated linker script for 20102-label-dp
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=588;
# MEM001: file=%O, start=$0080, size=13;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "6502"
; .segment "SEG000"
.org $0000
nop
nop

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20110-64k-nops
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$0000, size=65536;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
;Projected edited to format non-char operands as chars.
.setcpu "6502"
; .segment "SEG000"
.org $1000
lda #'A'
lda #'A' | $80

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20120-char-encoding-a
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=1417;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,5 +1,4 @@
.setcpu "65816"
; .segment "SEG000"
.org $1000
.a8
.i8

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20122-char-encoding
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=19;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
;Projected edited to format non-char operands as chars.
.setcpu "6502"
; .segment "SEG000"
.org $1000
lda #'A'
lda #'A' | $80

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20130-char-encoding-p
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=1417;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -1,6 +1,5 @@
;Projected edited to format non-char operands as chars.
.setcpu "6502"
; .segment "SEG000"
.org $1000
lda #'A'
lda #'A' | $80

View File

@ -1,11 +1,9 @@
# 6502bench SourceGen generated linker script for 20140-char-encoding-s
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=1417;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -5,8 +5,7 @@ CONST_ZERO = $f0 ;project const
PROJ_ZERO = $00 ;project addr
PROJ_ONE = $01 ;project addr
* = $0000
!pseudopc $1000 {
* = $1000
ldy PROJ_ZERO
lda (PROJ_ONE),y
sta $03 ;could be PROJ_ONE+2, but "nearby" is off
@ -186,7 +185,6 @@ L103C lda #$fe
jsr DPCODE
rts
} ;!pseudopc
!pseudopc $0080 {
DPCODE nop
lda+1 DPCODE

View File

@ -5,7 +5,6 @@ CONST_ZERO = $f0 ;project const
PROJ_ZERO = $00 ;project addr
PROJ_ONE = $01 ;project addr
; .segment "SEG000"
.org $1000
ldy PROJ_ZERO
lda (PROJ_ONE),y
@ -99,7 +98,6 @@ DPNOP .set $80 ;same as org
jsr DPCODE
rts
; .segment "SEG001"
.org $0080
DPCODE: nop
lda DPCODE

View File

@ -1,13 +1,9 @@
# 6502bench SourceGen generated linker script for 20150-local-variables
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=126;
# MEM001: file=%O, start=$0080, size=25;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
}
FEATURES {}
SYMBOLS {}

View File

@ -5,8 +5,7 @@ CONST_ZERO = $f0 ;project const
PROJ_ZERO = $00 ;project addr
PROJ_ONE = $01 ;project addr
* = $0000
!pseudopc $1000 {
* = $1000
!as
!rs
ldy PROJ_ZERO
@ -188,7 +187,6 @@ L103C lda #$fe
jsr DPCODE
rts
} ;!pseudopc
!pseudopc $0080 {
DPCODE nop
lda+1 DPCODE

View File

@ -5,7 +5,6 @@ CONST_ZERO = $f0 ;project const
PROJ_ZERO = $00 ;project addr
PROJ_ONE = $01 ;project addr
; .segment "SEG000"
.org $1000
.a8
.i8
@ -101,7 +100,6 @@ DPNOP .set $80 ;same as org
jsr DPCODE
rts
; .segment "SEG001"
.org $0080
DPCODE: nop
lda DPCODE

View File

@ -1,13 +1,9 @@
# 6502bench SourceGen generated linker script for 20152-local-variables
MEMORY {
MAIN: file=%O, start=%S, size=65536;
# MEM000: file=%O, start=$1000, size=126;
# MEM001: file=%O, start=$0080, size=111;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
# SEG000: load=MEM000, type=rw;
# SEG001: load=MEM001, type=rw;
}
FEATURES {}
SYMBOLS {}

Some files were not shown because too many files have changed in this diff Show More