private Vector3 _handleBack, _handleFront; // Handle positions, origin at BezierPoint position public BezierPoint(Vector3 pos, Vector3 _handleB, Vector3 _handleF, int iter, ArmMode armM) { position = pos; _handleBack = _handleB; _handleFront = _handleF; iterations = iter; armMode = armM; }
/// <summary> /// Initializes a new instance of the <see cref="ArmEmulator"/> class with the specified /// <see cref="ArmMode"/> to use. /// </summary> /// <param name="mode">Mode to use.</param> public ArmEmulator(ArmMode mode) : base(Bindings.Arch.ARM, (Bindings.Mode)mode) { _registers = new ArmRegisters(this); }
private void emulate_Click(object sender, EventArgs e) { ArmMode arm_mode = ArmMode.Arm; if (thumb.Checked) { arm_mode = ArmMode.Thumb; } uint addr = (uint)ReadStartAddress.Value; if ((addr & 1) == 1) { arm_mode = ArmMode.Thumb; addr--; } if (addr >= GBAMemory.ROM_ADDR) { addr -= GBAMemory.ROM_ADDR; U.ForceUpdate(ReadStartAddress, addr); } if (addr >= (uint)Program.ROM.Data.Length) { return; } addr += GBAMemory.ROM_ADDR; EncodedData enc; // 即时汇编 if (arm_mode == ArmMode.Thumb) { using (Engine keystone = new Engine(Architecture.ARM, Mode.THUMB) { ThrowOnError = true }) { enc = keystone.Assemble(assembly.Text, addr); } } else { using (Engine keystone = new Engine(Architecture.ARM, Mode.ARM) { ThrowOnError = true }) { enc = keystone.Assemble(assembly.Text, addr); } } // 模拟运行 using (var emulator = new ArmEmulator(arm_mode)) { // load register value emulator.Registers.R0 = (long)r0.Value; emulator.Registers.R1 = (long)r1.Value; emulator.Registers.R2 = (long)r2.Value; emulator.Registers.R3 = (long)r3.Value; emulator.Registers.R4 = (long)r4.Value; emulator.Registers.R5 = (long)r5.Value; emulator.Registers.R6 = (long)r6.Value; emulator.Registers.R7 = (long)r7.Value; emulator.Registers.R8 = (long)r8.Value; emulator.Registers.R9 = (long)r9.Value; emulator.Registers.R10 = (long)r10.Value; emulator.Registers.R11 = (long)r11.Value; emulator.Registers.R12 = (long)r12.Value; emulator.Registers.SP = (long)r13.Value; emulator.Registers.LR = (long)r14.Value; //emulator.Registers.PC = (long)r15.Value; // load ROM if (whole_rom.Checked) { emulator.Memory.Map(GBAMemory.ROM_ADDR, Program.ROM.Data.Length, MemoryPermissions.Execute | MemoryPermissions.Read); emulator.Memory.Write(GBAMemory.ROM_ADDR, Program.ROM.Data, Program.ROM.Data.Length); } else { emulator.Memory.Map(addr, enc.Buffer.Length, MemoryPermissions.All); } // load assembly emulator.Memory.Write(addr, enc.Buffer, enc.Buffer.Length); // 加载GBA地址布局 if (memory.Checked) { // laod WRAM emulator.Memory.Map(GBAMemory.EWRAM_ADDR, GBAMemory.EWRAM_MAX_LENGTH, MemoryPermissions.All); emulator.Memory.Map(GBAMemory.IWRAM_ADDR, GBAMemory.IWRAM_MAX_LENGTH, MemoryPermissions.All); if (!String.IsNullOrEmpty(sgm.Text)) { if (File.Exists(sgm.Text)) { //TODO load data in .sgm to EWRAM and IWRAM } } // load SRAM emulator.Memory.Map(GBAMemory.SRAM_ADDR, GBAMemory.SRAM_MAX_LENGTH, MemoryPermissions.Write | MemoryPermissions.Read); if (!String.IsNullOrEmpty(sav.Text)) { if (File.Exists(sav.Text)) { FileInfo fi = new FileInfo(sav.Text); byte[] buff = new byte[Math.Min(GBAMemory.SRAM_MAX_LENGTH, fi.Length)]; FileStream fs = fi.OpenRead(); fs.Read(buff, 0, Math.Min(buff.Length, Convert.ToInt32(fs.Length))); fs.Close(); emulator.Memory.Write(GBAMemory.SRAM_ADDR, buff, buff.Length); } } // load BIOS emulator.Memory.Map(GBAMemory.BIOS_ADDR, GBAMemory.BIOS_MAX_LENGTH, MemoryPermissions.Execute); if (!String.IsNullOrEmpty(bios.Text)) { if (File.Exists(bios.Text)) { FileInfo fi = new FileInfo(bios.Text); byte[] buff = new byte[Math.Min(GBAMemory.BIOS_MAX_LENGTH, fi.Length)]; FileStream fs = fi.OpenRead(); fs.Read(buff, 0, Math.Min(buff.Length, Convert.ToInt32(fs.Length))); fs.Close(); emulator.Memory.Write(GBAMemory.BIOS_ADDR, buff, buff.Length); } else { bios.Clear(); } } // load IOREG // PageSize = 1KB, 不翻倍map内存的时候会报错 emulator.Memory.Map(GBAMemory.IOREG_ADDR, GBAMemory.IOREG_MAX_LENGTH * 2, MemoryPermissions.Read | MemoryPermissions.Write); if (!String.IsNullOrEmpty(ioreg.Text)) { if (File.Exists(ioreg.Text)) { FileInfo fi = new FileInfo(ioreg.Text); byte[] buff = new byte[Math.Min(GBAMemory.IOREG_MAX_LENGTH, fi.Length)]; FileStream fs = fi.OpenRead(); fs.Read(buff, 0, Math.Min(buff.Length, Convert.ToInt32(fs.Length))); fs.Close(); emulator.Memory.Write(GBAMemory.IOREG_ADDR, buff, buff.Length); } } // load PALRAM // PageSize = 1KB, 不翻倍map内存的时候会报错 emulator.Memory.Map(GBAMemory.PALRAM_ADDR, GBAMemory.PALRAM_MAX_LENGTH * 2, MemoryPermissions.Read | MemoryPermissions.Write); if (!String.IsNullOrEmpty(palram.Text)) { if (File.Exists(palram.Text)) { FileInfo fi = new FileInfo(palram.Text); byte[] buff = new byte[Math.Min(GBAMemory.PALRAM_MAX_LENGTH, fi.Length)]; FileStream fs = fi.OpenRead(); fs.Read(buff, 0, Math.Min(buff.Length, Convert.ToInt32(fs.Length))); fs.Close(); emulator.Memory.Write(GBAMemory.PALRAM_ADDR, buff, buff.Length); } } // load VRAM emulator.Memory.Map(GBAMemory.VRAM_ADDR, GBAMemory.VRAM_MAX_LENGTH, MemoryPermissions.Read | MemoryPermissions.Write); if (!String.IsNullOrEmpty(vram.Text)) { if (File.Exists(vram.Text)) { FileInfo fi = new FileInfo(vram.Text); byte[] buff = new byte[Math.Min(GBAMemory.VRAM_MAX_LENGTH, fi.Length)]; FileStream fs = fi.OpenRead(); fs.Read(buff, 0, Math.Min(buff.Length, Convert.ToInt32(fs.Length))); fs.Close(); emulator.Memory.Write(GBAMemory.VRAM_ADDR, buff, buff.Length); } } // load OAM // PageSize = 1KB, 不翻倍map内存的时候会报错 emulator.Memory.Map(GBAMemory.OAM_ADDR, GBAMemory.OAM_MAX_LENGTH * 2, MemoryPermissions.Read | MemoryPermissions.Write); if (!String.IsNullOrEmpty(oam.Text)) { if (File.Exists(oam.Text)) { FileInfo fi = new FileInfo(oam.Text); byte[] buff = new byte[Math.Min(GBAMemory.OAM_MAX_LENGTH, fi.Length)]; FileStream fs = fi.OpenRead(); fs.Read(buff, 0, Math.Min(buff.Length, Convert.ToInt32(fs.Length))); fs.Close(); emulator.Memory.Write(GBAMemory.OAM_ADDR, buff, buff.Length); } } // load address value list if (!String.IsNullOrEmpty(address_value.Text)) { foreach (string line in address_value.Lines) { if (String.IsNullOrWhiteSpace(line)) { string[] record = line.Split(':'); if (record.Length == 2) { ulong address = ulong.Parse(record[0], System.Globalization.NumberStyles.HexNumber); string[] byte_list = (record[1]).Split(); emulator.Memory.Write(address, Array.ConvertAll <string, byte>(byte_list, s => byte.Parse(s, System.Globalization.NumberStyles.HexNumber)), byte_list.Length); } } } } } // emulate emulator.Start(addr, addr + (ulong)enc.Buffer.Length, new TimeSpan(0, 0, Convert.ToInt32(timeout.Value)), Convert.ToInt32(code_num_limit.Value)); // show registers r0.Value = emulator.Registers.R0; r0.Update(); r1.Value = emulator.Registers.R1; r1.Update(); r2.Value = emulator.Registers.R2; r2.Update(); r3.Value = emulator.Registers.R3; r3.Update(); r4.Value = emulator.Registers.R4; r4.Update(); r5.Value = emulator.Registers.R5; r5.Update(); r6.Value = emulator.Registers.R6; r6.Update(); r7.Value = emulator.Registers.R7; r7.Update(); r8.Value = emulator.Registers.R8; r8.Update(); r9.Value = emulator.Registers.R9; r9.Update(); r10.Value = emulator.Registers.R10; r10.Update(); r11.Value = emulator.Registers.R11; r11.Update(); r12.Value = emulator.Registers.R12; r12.Update(); r13.Value = emulator.Registers.SP; r13.Update(); r14.Value = emulator.Registers.LR; r14.Update(); r15.Value = emulator.Registers.PC; r15.Update(); if (memory.Checked) { // dump binaries if (!String.IsNullOrEmpty(sav.Text)) { byte[] buff = new byte[GBAMemory.SRAM_MAX_LENGTH]; emulator.Memory.Read(GBAMemory.SRAM_ADDR, buff, buff.Length); FileStream fs = new FileStream(sav.Text, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); bw.Write(buff, 0, buff.Length); bw.Close(); fs.Close(); } if (!String.IsNullOrEmpty(sgm.Text)) { //TODO dump data in EWRAM and IWRAM to .sgm } if (!String.IsNullOrEmpty(ioreg.Text)) { byte[] buff = new byte[GBAMemory.IOREG_MAX_LENGTH]; emulator.Memory.Read(GBAMemory.IOREG_ADDR, buff, buff.Length); FileStream fs = new FileStream(ioreg.Text, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); bw.Write(buff, 0, buff.Length); bw.Close(); fs.Close(); } if (!String.IsNullOrEmpty(palram.Text)) { byte[] buff = new byte[GBAMemory.PALRAM_MAX_LENGTH]; emulator.Memory.Read(GBAMemory.PALRAM_ADDR, buff, buff.Length); FileStream fs = new FileStream(palram.Text, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); bw.Write(buff, 0, buff.Length); bw.Close(); fs.Close(); } if (!String.IsNullOrEmpty(vram.Text)) { byte[] buff = new byte[GBAMemory.VRAM_MAX_LENGTH]; emulator.Memory.Read(GBAMemory.VRAM_ADDR, buff, buff.Length); FileStream fs = new FileStream(vram.Text, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); bw.Write(buff, 0, buff.Length); bw.Close(); fs.Close(); } if (!String.IsNullOrEmpty(oam.Text)) { byte[] buff = new byte[GBAMemory.OAM_MAX_LENGTH]; emulator.Memory.Read(GBAMemory.OAM_ADDR, buff, buff.Length); FileStream fs = new FileStream(oam.Text, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); bw.Write(buff, 0, buff.Length); bw.Close(); fs.Close(); } } } }
public PrebuiltStaticLibraries(string moduleName, string libraryPath, ArmMode armMode = ArmMode.Thumb) { ModuleName = moduleName; LibraryPath = libraryPath; Mode = armMode; }
/// <summary> /// Initializes a new instance of the <see cref="ArmEmulator"/> class with the specified /// <see cref="ArmMode"/> to use. /// </summary> /// <param name="mode">Mode to use.</param> public ArmEmulator(ArmMode mode) : base(UnicornArch.ARM, (UnicornMode)mode) { _registers = new ArmRegisters(this); }
public static int FrameIndex(this ArmMode mode) { return(mode.GetAttribute <ArmModeAttribute>().frameIndex); }
public static Vector2Int ItemAnchor(this ArmMode mode) { return(mode.GetAttribute <ArmModeAttribute>().itemAnchor); }
public static bool Show(this ArmMode mode) { return(mode.GetAttribute <ArmModeAttribute>().show); }
public static string Name(this ArmMode mode) { return(mode.GetAttribute <ArmModeAttribute>().name); }