mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-20 21:08:51 +00:00
51 lines
No EOL
2.1 KiB
C#
51 lines
No EOL
2.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Text;
|
|
using Indy.IL2CPU.Plugs;
|
|
|
|
namespace Indy.IL2CPU.IL.X86.CustomImplementations.System.Runtime.CompilerServices {
|
|
[Plug(Target = typeof(RuntimeHelpers))]
|
|
public static class RuntimeHelpersImpl {
|
|
[PlugMethod(Signature = "System_Void__System_Runtime_CompilerServices_RuntimeHelpers__cctor__")]
|
|
public static void CCtor() {
|
|
//todo: do something
|
|
}
|
|
|
|
[PlugMethod(MethodAssembler = typeof(InitializeArrayAssembler))]
|
|
public static void InitializeArray(Array array, RuntimeFieldHandle fldHandle) {
|
|
}
|
|
}
|
|
|
|
public class InitializeArrayAssembler: AssemblerMethod {
|
|
public override void Assemble(Indy.IL2CPU.Assembler.Assembler aAssembler) {
|
|
// Arguments:
|
|
// Array aArray, RuntimeFieldHandle aFieldHandle
|
|
new Assembler.X86.Move(Assembler.X86.Registers.EDI, "[ebp+0xC]"); // aArray
|
|
new Assembler.X86.Move(Assembler.X86.Registers.ESI, "[ebp+8]"); // aFieldHandle
|
|
new Assembler.X86.Add(Assembler.X86.Registers.EDI, "8");
|
|
new Assembler.X86.Push("dword [edi]");
|
|
new Assembler.X86.Add(Assembler.X86.Registers.EDI, "4");
|
|
new Assembler.X86.Move("eax", "[edi]");
|
|
new Assembler.X86.Multiply("dword [esp]");
|
|
new Assembler.X86.Pop("ecx");
|
|
new Assembler.X86.Move("ecx", "eax");
|
|
new Assembler.X86.Move(Assembler.X86.Registers.EAX, "0");
|
|
new Assembler.X86.Add(Assembler.X86.Registers.EDI, "4");
|
|
new Assembler.X86.Add(Assembler.X86.Registers.ESI, "16");
|
|
|
|
new Assembler.Label(".StartLoop");
|
|
new Assembler.X86.Move("byte", Assembler.X86.Registers.DL, Assembler.X86.Registers.AtESI);
|
|
new Assembler.X86.Move("byte", Assembler.X86.Registers.AtEDI, Assembler.X86.Registers.DL);
|
|
new Assembler.X86.Add(Assembler.X86.Registers.EAX, "1");
|
|
new Assembler.X86.Add(Assembler.X86.Registers.ESI, "1");
|
|
new Assembler.X86.Add(Assembler.X86.Registers.EDI, "1");
|
|
new Assembler.X86.Compare(Assembler.X86.Registers.EAX, Assembler.X86.Registers.ECX);
|
|
new Assembler.X86.JumpIfEquals(".EndLoop");
|
|
new Assembler.X86.JumpAlways(".StartLoop");
|
|
|
|
new Assembler.Label(".EndLoop");
|
|
}
|
|
}
|
|
} |