mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-20 21:08:51 +00:00
49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Indy.IL2CPU.Assembler.X86;
|
|
using Indy.IL2CPU.Plugs;
|
|
using Assembler = Indy.IL2CPU.Assembler.Assembler;
|
|
using CPUx86 = Indy.IL2CPU.Assembler.X86;
|
|
|
|
namespace Indy.IL2CPU.IL.X86.CustomImplementations.System.Assemblers {
|
|
public class Array_InternalCopy: AssemblerMethod {
|
|
|
|
/* void Copy(Array sourceArray, ebp + 0x1C
|
|
* int sourceIndex, ebp + 0x18
|
|
* Array destinationArray, ebp + 0x14
|
|
* int destinationIndex, ebp + 0x10
|
|
* int length, ebp + 0xC
|
|
* bool reliable); ebp + 0x8
|
|
*/
|
|
public override void Assemble(Indy.IL2CPU.Assembler.Assembler aAssembler) {
|
|
new CPUx86.Pushd("[ebp + 0x1C]");
|
|
new CPUx86.Add("dword [esp]", "12"); // pointer is at the element size
|
|
new CPUx86.Pop("eax");
|
|
new CPUx86.Move("eax", "[eax]"); // element size
|
|
new CPUx86.Move("ebx", "[ebp + 0x18]");
|
|
new CPUx86.Multiply("ebx");
|
|
new CPUx86.Add("eax", "16");
|
|
new CPUx86.Move("esi", "[ebp + 0x1C]");
|
|
new CPUx86.Add("esi", "eax"); // source ptr
|
|
|
|
new CPUx86.Pushd("[ebp + 0x14]");
|
|
new CPUx86.Add("dword [esp]", "12"); // pointer is at element size
|
|
new CPUx86.Pop("eax");
|
|
new CPUx86.Move("eax", "[eax]"); // element size
|
|
new CPUx86.Move("ecx", "[ebp + 0x10]");
|
|
new CPUx86.Multiply("ecx");
|
|
new CPUx86.Add("eax", "16");
|
|
new CPUx86.Move("edi", "[ebp + 0x14]");
|
|
new CPUx86.Add("edi", "eax");
|
|
|
|
// calculate byte count to copy
|
|
new CPUx86.Move("eax", "[ebp + 0x14]");
|
|
new CPUx86.Add("eax", "12");
|
|
new CPUx86.Move("eax", "[eax]");
|
|
new CPUx86.Move("edx", "[ebp + 0xC]");
|
|
new CPUx86.Multiply("edx");
|
|
new CPUx86.Move("ecx", "eax");
|
|
new RepeatMovsd();
|
|
}
|
|
}
|
|
}
|