mirror of
https://github.com/fadden/6502bench.git
synced 2025-02-17 17:30: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:
parent
0dfa2326dd
commit
39b7b20144
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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"));
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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 =
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "6502X"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
jsr L1035
|
||||
jsr L1038
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65C02"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
jsr L1014
|
||||
jsr L108A
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65816"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
.a8
|
||||
.i8
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65C02"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
jsr L1017
|
||||
jsr L1099
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "6502X"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
jsr L1035
|
||||
jsr L1038
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65C02"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
jsr L1014
|
||||
jsr L108A
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65816"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
.a8
|
||||
.i8
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65C02"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
jsr L1017
|
||||
jsr L1099
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "6502X"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
jsr L100F
|
||||
jsr L1017
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65816"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
.a8
|
||||
.i8
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "6502X"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
clv
|
||||
cld
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65816"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
.a8
|
||||
.i8
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "6502X"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
lda L10AC
|
||||
ora L10BC
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -1,6 +1,5 @@
|
||||
;Project file was edited to get zero-length strings and reverse DCI.
|
||||
.setcpu "6502"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
rts
|
||||
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -1,6 +1,5 @@
|
||||
;Project file was edited to force ASCII formatting for some operands.
|
||||
.setcpu "65816"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
.a8
|
||||
.i8
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -1,9 +1,7 @@
|
||||
!cpu 6502
|
||||
* = $0000
|
||||
!pseudopc $1000 {
|
||||
* = $1000
|
||||
!word $1000 ;PRG-style header
|
||||
|
||||
} ;!pseudopc
|
||||
!pseudopc $1000 {
|
||||
jsr L1100
|
||||
jsr L1107
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -1,9 +1,7 @@
|
||||
!cpu 6502
|
||||
* = $0000
|
||||
!pseudopc $1000 {
|
||||
* = $1000
|
||||
jmp L0000
|
||||
|
||||
} ;!pseudopc
|
||||
!pseudopc $0000 {
|
||||
L0000 bit+2 L0000
|
||||
L0003 lda+1 L0000
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -1,6 +1,5 @@
|
||||
;6502bench SourceGen v1.7.3-dev2
|
||||
.setcpu "65816"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
.a8
|
||||
.i8
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "6502"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
.byte $03
|
||||
.byte $02
|
||||
|
@ -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 {}
|
||||
|
@ -1,7 +1,6 @@
|
||||
.setcpu "65C02"
|
||||
REALLYLONGLABELNAME = $8888 ;that's a long name
|
||||
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
nop
|
||||
_start: lda @start
|
||||
|
@ -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 {}
|
||||
|
@ -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-
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "6502"
|
||||
; .segment "SEG000"
|
||||
.org $0000
|
||||
nop
|
||||
nop
|
||||
|
@ -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 {}
|
||||
|
@ -1,6 +1,5 @@
|
||||
;Projected edited to format non-char operands as chars.
|
||||
.setcpu "6502"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
lda #'A'
|
||||
lda #'A' | $80
|
||||
|
@ -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 {}
|
||||
|
@ -1,5 +1,4 @@
|
||||
.setcpu "65816"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
.a8
|
||||
.i8
|
||||
|
@ -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 {}
|
||||
|
@ -1,6 +1,5 @@
|
||||
;Projected edited to format non-char operands as chars.
|
||||
.setcpu "6502"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
lda #'A'
|
||||
lda #'A' | $80
|
||||
|
@ -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 {}
|
||||
|
@ -1,6 +1,5 @@
|
||||
;Projected edited to format non-char operands as chars.
|
||||
.setcpu "6502"
|
||||
; .segment "SEG000"
|
||||
.org $1000
|
||||
lda #'A'
|
||||
lda #'A' | $80
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user