mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-22 13:58:47 +00:00
Fix array copy.
This commit is contained in:
parent
37a4e71deb
commit
c8dfbd8127
1 changed files with 23 additions and 15 deletions
|
|
@ -1,54 +1,62 @@
|
|||
using Cosmos.Debug.Kernel;
|
||||
using Cosmos.IL2CPU.Plugs;
|
||||
using XSharp.Compiler;
|
||||
using ObjectInfo = Cosmos.IL2CPU.Plugs.System.ObjectImpl;
|
||||
using CPUx86 = Cosmos.Assembler.x86;
|
||||
|
||||
namespace Cosmos.Core.Plugs.System.Assemblers
|
||||
{
|
||||
public class Array_InternalCopy : AssemblerMethod
|
||||
{
|
||||
private const int SourceArrayDisplacement = 0x1C;
|
||||
private const int SourceIndexDisplacement = 0x18;
|
||||
private const int DestinationArrayDisplacement = 0x14;
|
||||
private const int SourceArrayDisplacement = 0x24;
|
||||
private const int SourceIndexDisplacement = 0x1C;
|
||||
private const int DestinationArrayDisplacement = 0x18;
|
||||
private const int DestinationIndexDisplacement = 0x10;
|
||||
private const int LengthDisplacement = 0xC;
|
||||
|
||||
/* void Copy(Array sourceArray, ebp + 0x1C
|
||||
* int sourceIndex, ebp + 0x18
|
||||
* Array destinationArray, ebp + 0x14
|
||||
/* void Copy(Array sourceArray, ebp + 0x24
|
||||
* int sourceIndex, ebp + 0x1C
|
||||
* Array destinationArray, ebp + 0x18
|
||||
* int destinationIndex, ebp + 0x10
|
||||
* int length, ebp + 0xC
|
||||
* bool reliable); ebp + 0x8
|
||||
*/
|
||||
public override void AssembleNew(Assembler.Assembler aAssembler, object aMethodInfo)
|
||||
{
|
||||
XS.Exchange(XSRegisters.BX, XSRegisters.BX);
|
||||
XS.Comment("Source");
|
||||
XS.Set(XSRegisters.EAX, XSRegisters.EBP, sourceDisplacement: SourceArrayDisplacement);
|
||||
XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference memory handle to pointer
|
||||
//XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference memory handle to pointer
|
||||
XS.Push(XSRegisters.EAX);
|
||||
new CPUx86.Add { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceValue = 12, Size = 32 }; // pointer is at the element size
|
||||
new CPUx86.Add { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceValue = ObjectInfo.FieldDataOffset, Size = 32 }; // pointer is at the element size
|
||||
XS.Pop(XSRegisters.EAX);
|
||||
XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // element size
|
||||
XS.Set(XSRegisters.EBX, XSRegisters.EBP, sourceDisplacement: SourceIndexDisplacement);
|
||||
XS.Multiply(XSRegisters.EBX);
|
||||
XS.Add(XSRegisters.EAX, 16);
|
||||
XS.Set(XSRegisters.ESI, XSRegisters.EBP, sourceDisplacement: SourceArrayDisplacement);
|
||||
XS.Set(XSRegisters.ESI, XSRegisters.ESI, sourceIsIndirect: true); // dereference memory handle to pointer
|
||||
//XS.Set(XSRegisters.ESI, XSRegisters.ESI, sourceIsIndirect: true); // dereference memory handle to pointer
|
||||
XS.Add(XSRegisters.ESI, XSRegisters.EAX); // source ptr
|
||||
|
||||
XS.Exchange(XSRegisters.BX, XSRegisters.BX);
|
||||
XS.Comment("Destination");
|
||||
XS.Set(XSRegisters.EDX, XSRegisters.EBP, sourceDisplacement: DestinationArrayDisplacement);
|
||||
XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true); // dereference memory handle to pointer
|
||||
//XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true); // dereference memory handle to pointer
|
||||
XS.Push(XSRegisters.EDX);
|
||||
new CPUx86.Add { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceValue = 12, Size = 32 }; // pointer is at element size
|
||||
new CPUx86.Add { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceValue = ObjectInfo.FieldDataOffset, Size = 32 }; // pointer is at element size
|
||||
XS.Pop(XSRegisters.EAX);
|
||||
XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference handle to pointer
|
||||
XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // element size
|
||||
XS.Set(XSRegisters.ECX, XSRegisters.EBP, sourceDisplacement: DestinationIndexDisplacement);
|
||||
XS.Multiply(XSRegisters.ECX);
|
||||
XS.Add(XSRegisters.EAX, 16);
|
||||
XS.Set(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: DestinationArrayDisplacement);
|
||||
XS.Set(XSRegisters.EDI, XSRegisters.EDI, sourceIsIndirect: true); // dereference handle to pointer
|
||||
XS.Add(XSRegisters.EDI, XSRegisters.EAX);
|
||||
//XS.Set(XSRegisters.EDI, XSRegisters.EDI, sourceIsIndirect: true); // dereference handle to pointer
|
||||
XS.Add(XSRegisters.EDI, XSRegisters.EAX); // destination ptr
|
||||
|
||||
// calculate byte count to copy
|
||||
XS.Exchange(XSRegisters.BX, XSRegisters.BX);
|
||||
XS.Set(XSRegisters.EAX, XSRegisters.EBP, sourceDisplacement: DestinationArrayDisplacement);
|
||||
XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference memory handle to pointer
|
||||
//XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference memory handle to pointer
|
||||
XS.Add(XSRegisters.EAX, 12);
|
||||
XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true);
|
||||
XS.Set(XSRegisters.EDX, XSRegisters.EBP, sourceDisplacement: LengthDisplacement);
|
||||
|
|
|
|||
Loading…
Reference in a new issue