BizHawk/BizHawk.Emulation.Cores/CPUs/ARM/Darm.cs

108 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace BizHawk.Emulation.Cores.Components.ARM
{
public class Darm
{
public const string dllname = "libdarm.dll";
public const CallingConvention cc = CallingConvention.Cdecl;
[StructLayout(LayoutKind.Sequential)]
public class Darm_T
{
public uint w;
public uint instr;
public uint instr_type;
public uint instr_imm_type;
public uint instr_flag_type;
public uint cond;
public uint B;
public uint S;
public uint E;
public uint M;
public uint N;
public uint option;
public uint U;
public uint H;
public uint P;
public uint R;
public uint T;
public uint W;
public uint I;
public uint rotate;
public uint Rd;
public uint Rn;
public uint Rm;
public uint Ra;
public uint Rt;
public uint Rt2;
public uint RdHi;
public uint RdLo;
public uint imm;
public uint sat_imm;
public uint shift_type;
public uint Rs;
public uint shift;
public uint lsb;
public uint msb;
public uint width;
public ushort reglist;
public byte coproc;
public byte opc1;
public byte opc2;
public uint CRd;
public uint CRn;
public uint Crm;
public uint D;
public uint firstcond;
public byte mask;
// just in case we got something wrong, padding
public uint Pad1;
public uint Pad2;
public uint Pad3;
public uint Pad4;
public uint Pad5;
public uint Pad6;
public uint Pad7;
public uint Pad8;
public uint Pad9;
}
[StructLayout(LayoutKind.Sequential)]
public class Darm_Str_T
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] mnemonic = new byte[12];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6 * 32)]
public byte[,] arg = new byte[6, 32];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] shift = new byte[12];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] total = new byte[64];
}
[DllImport(dllname, CallingConvention = cc, EntryPoint = "darm_disasm")]
public static extern bool Disassemble([Out] Darm_T d, ushort w, ushort w2, uint addr);
[DllImport(dllname, CallingConvention = cc, EntryPoint = "darm_str2")]
public static extern bool Str([In] [Out]Darm_T d, [Out]Darm_Str_T s, bool lowercase);
public static string DisassembleStuff(uint addr, uint opcode)
{
var d = new Darm_T();
var s = new Darm_Str_T();
if (!Disassemble(d, (ushort)opcode, (ushort)(opcode >> 16), addr))
return null;
if (Str(d, s, false))
return null;
return Encoding.ASCII.GetString(s.total, 0, Array.IndexOf(s.total, (byte)0));
}
}
}