Cosmos/source/Indy.IL2CPU/Assembler/x86/X/Memory.cs
mterwoord_cp 5928581f2f
2008-11-07 12:27:08 +00:00

121 lines
8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Indy.IL2CPU.Assembler.X86.X {
public class Memory {
public MemoryAction this[Address aAddress] {
get {
var xAddrDirect = aAddress as AddressDirect;
if (xAddrDirect != null) {
if (xAddrDirect.Label != null) {
return new MemoryAction(new ElementReference(xAddrDirect.Label));
} else {
if (xAddrDirect.Register != Guid.Empty) {
return new MemoryAction(xAddrDirect.Register);
} else {
return new MemoryAction(xAddrDirect.Address);
}
}
} else {
var xAddrIndirect = aAddress as AddressIndirect;
if (xAddrIndirect != null) {
if (xAddrIndirect.Reference != null) {
return new MemoryAction(xAddrIndirect.Reference, xAddrIndirect.Displacement);
} else {
if (xAddrDirect.Register != Guid.Empty) {
return new MemoryAction(xAddrDirect.Register, xAddrIndirect.Displacement);
} else {
return new MemoryAction(xAddrDirect.Address, xAddrIndirect.Displacement);
}
}
}
throw new Exception("Address type not supported!");
}
}
set {
if (value.Register!=Guid.Empty) {
var xAddrDirect = aAddress as AddressDirect;
if (xAddrDirect != null) {
if (xAddrDirect.Label != null) {
new X86.Move { DestinationRef = new ElementReference(xAddrDirect.Label), SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
} else {
new X86.Move { DestinationValue = xAddrDirect.Address, SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
}
} else {
var xAddrIndirect = aAddress as AddressIndirect;
if (xAddrIndirect != null) {
new X86.Move { DestinationRef = xAddrIndirect.Reference, DestinationDisplacement = xAddrIndirect.Displacement, DestinationValue = xAddrIndirect.Address, DestinationReg = xAddrIndirect.Register, DestinationIsIndirect = true, SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
} else {
throw new Exception("Invalid Address type!");
}
}
} else {
var xAddrDirect = aAddress as AddressDirect;
if (xAddrDirect != null) {
if (xAddrDirect.Label != null) {
new X86.Move { DestinationRef = new ElementReference(xAddrDirect.Label), SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
} else {
new X86.Move { DestinationValue = xAddrDirect.Address, SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
}
} else {
var xAddrIndirect = aAddress as AddressIndirect;
if (xAddrIndirect != null) {
new X86.Move { DestinationRef = xAddrIndirect.Reference, DestinationDisplacement = xAddrIndirect.Displacement, DestinationValue = xAddrIndirect.Address, DestinationReg = xAddrIndirect.Register, DestinationIsIndirect = true, SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
} else {
throw new Exception("Invalid Address type!");
}
}
}
}
}
public MemoryAction this[Address aAddress, byte aSize] {
get {
var xResult = this[aAddress];
xResult.Size = aSize;
return xResult;
}
set {
// ++ operators return ++
// Maybe later change ++ etc to return actions?
if (value != null) {
if (value.Register != Guid.Empty) {
var xAddrDirect = aAddress as AddressDirect;
if (xAddrDirect != null) {
if (xAddrDirect.Label != null) {
new X86.Move { DestinationRef = new ElementReference(xAddrDirect.Label), SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect};
} else {
new X86.Move { DestinationValue = xAddrDirect.Address, SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
}
} else {
var xAddrIndirect = aAddress as AddressIndirect;
if (xAddrIndirect != null) {
new X86.Move { DestinationRef = xAddrIndirect.Reference, DestinationDisplacement = xAddrIndirect.Displacement, DestinationValue = xAddrIndirect.Address, DestinationReg = xAddrIndirect.Register, DestinationIsIndirect = true, SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
} else {
throw new Exception("Invalid Address type!");
}
}
} else {
var xAddrDirect = aAddress as AddressDirect;
if (xAddrDirect != null) {
if (xAddrDirect.Label != null) {
new X86.Move { DestinationRef = new ElementReference(xAddrDirect.Label), SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
} else {
new X86.Move { DestinationValue = xAddrDirect.Address, SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
}
} else {
var xAddrIndirect = aAddress as AddressIndirect;
if (xAddrIndirect != null) {
new X86.Move { DestinationRef = xAddrIndirect.Reference, DestinationDisplacement = xAddrIndirect.Displacement, DestinationValue = xAddrIndirect.Address, DestinationReg = xAddrIndirect.Register, DestinationIsIndirect = true, SourceValue = value.Value.GetValueOrDefault(), SourceRef = value.Reference, SourceReg = value.Register, SourceIsIndirect = value.IsIndirect };
} else {
throw new Exception("Invalid Address type!");
}
}
}
}
}
}
}
}