Cosmos/source/Indy.IL2CPU/Assembler/ElementReference.cs
mterwoord_cp 65be2a5545
2008-12-29 10:59:19 +00:00

79 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Indy.IL2CPU.Assembler {
public class ElementReference {
public ElementReference(string aName, int aOffset)
: this(aName) {
Offset = aOffset;
}
public ElementReference(string aName) {
if (aName == "00h") {
Console.Write("");
}
if (aName.StartsWith(".")) {
Name = Label.LastFullLabel + aName;
} else {
Name = aName;
}
}
private ulong? mActualAddress;
public bool Resolve(Assembler aAssembler, out ulong aAddress) {
if (mActualAddress != null) {
aAddress = mActualAddress.Value;
return true;
}
var xItems = (from item in aAssembler.Instructions
let xLabel = item as Label
where xLabel != null && xLabel.QualifiedName.Equals(Name, StringComparison.InvariantCultureIgnoreCase)
select item).ToArray();
if (xItems.Count() > 1) {
Console.Write("");
}
BaseAssemblerElement xElement = (from item in aAssembler.Instructions
let xLabel = item as Label
where xLabel != null && xLabel.QualifiedName.Equals(Name, StringComparison.InvariantCultureIgnoreCase)
select item).SingleOrDefault();
if (xElement == null) {
xElement = (from item in aAssembler.DataMembers
where item.Name.Equals(Name, StringComparison.InvariantCultureIgnoreCase)
select item).SingleOrDefault();
}
if (xElement != null) {
if (xElement.ActualAddress.HasValue) {
mActualAddress = (ulong)((long)xElement.ActualAddress.Value + Offset);
aAddress = mActualAddress.Value;
return true;
}
}
aAddress = 0;
return false;
}
public int Offset {
get;
set;
}
public string Name {
get;
set;
}
public override string ToString() {
if (Offset != 0) {
return Label.FilterStringForIncorrectChars(Name) + " + " + Offset;
}else {
return Label.FilterStringForIncorrectChars(Name);
}
}
}
}