quicknes: support getcpuflagsandregisters

This commit is contained in:
goyuken 2014-05-26 19:49:45 +00:00
parent e68e691e3c
commit ab74f31d41
6 changed files with 34 additions and 45 deletions

View File

@ -45,22 +45,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr qn_set_sample_rate(IntPtr e, int rate);
/// <summary>
/// get required min dimensions of output video buffer (8bpp)
/// </summary>
/// <param name="e">context</param>
/// <param name="width">width</param>
/// <param name="height">height</param>
//[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
//public static extern void qn_get_image_dimensions(IntPtr e, ref int width, ref int height);
/// <summary>
/// set output video buffer that will be used for all subsequent renders until replaced
/// </summary>
/// <param name="e">context</param>
/// <param name="dest">8bpp, at least as big as qn_get_image_dimensions()</param>
/// <param name="pitch">byte pitch</param>
//[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
//public static extern void qn_set_pixels(IntPtr e, IntPtr dest, int pitch);
/// <summary>
/// emulate a single frame
/// </summary>
/// <param name="e">context</param>
@ -216,6 +200,13 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
public static extern void qn_poke_prgbus(IntPtr e, int addr, byte val);
/// <summary>
/// get internal registers
/// </summary>
/// <param name="e">Context</param>
/// <param name="dest">a, x, y, sp, pc, p</param>
[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
public static extern void qn_get_cpuregs(IntPtr e, [Out] int[] dest);
/// <summary>
/// get the mapper that's loaded
/// </summary>
/// <param name="e">Context</param>

View File

@ -361,7 +361,16 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
public Dictionary<string, int> GetCpuFlagsAndRegisters()
{
throw new NotImplementedException();
int[] regs = new int[6];
var ret = new Dictionary<string, int>();
LibQuickNES.qn_get_cpuregs(Context, regs);
ret["A"] = regs[0];
ret["X"] = regs[1];
ret["Y"] = regs[2];
ret["SP"] = regs[3];
ret["PC"] = regs[4];
ret["P"] = regs[5];
return ret;
}
#endregion
@ -494,11 +503,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
LibQuickNES.qn_delete(Context);
Context = IntPtr.Zero;
}
//if (VideoInput != null)
//{
// VideoInputH.Free();
// VideoInput = null;
//}
if (VideoOutput != null)
{
VideoOutputH.Free();
@ -509,8 +513,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
#region VideoProvider
int[] VideoOutput;
//byte[] VideoInput;
//GCHandle VideoInputH;
GCHandle VideoOutputH;
int cropleft = 0;
@ -528,11 +530,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
void InitVideo()
{
//int w = 0, h = 0;
//LibQuickNES.qn_get_image_dimensions(Context, ref w, ref h);
//VideoInput = new byte[w * h];
//VideoInputH = GCHandle.Alloc(VideoInput, GCHandleType.Pinned);
//LibQuickNES.qn_set_pixels(Context, VideoInputH.AddrOfPinnedObject(), w);
VideoOutput = new int[256 * 240];
VideoOutputH = GCHandle.Alloc(VideoOutput, GCHandleType.Pinned);
}
@ -569,7 +566,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
NumSamples = LibQuickNES.qn_read_audio(Context, MonoBuff, MonoBuff.Length);
unsafe
{
fixed (short *_src = &MonoBuff[0], _dst = &StereoBuff[0])
fixed (short* _src = &MonoBuff[0], _dst = &StereoBuff[0])
{
short* src = _src;
short* dst = _dst;

Binary file not shown.

View File

@ -49,19 +49,6 @@ EXPORT const char *qn_set_sample_rate(Nes_Emu *e, int rate)
return ret;
}
//EXPORT void qn_get_image_dimensions(Nes_Emu *e, int *width, int *height)
//{
// if (width)
// *width = e->buffer_width;
// if (height)
// *height = e->buffer_height();
//}
//EXPORT void qn_set_pixels(Nes_Emu *e, void *dest, int pitch)
//{
// e->set_pixels(dest, pitch);
//}
EXPORT const char *qn_emulate_frame(Nes_Emu *e, int pad1, int pad2)
{
return e->emulate_frame(pad1, pad2);
@ -260,6 +247,11 @@ EXPORT void qn_poke_prgbus(Nes_Emu *e, int addr, unsigned char val)
e->poke_prg(addr & 0xffff, val);
}
EXPORT void qn_get_cpuregs(Nes_Emu *e, unsigned int *dest)
{
e->get_regs(dest);
}
EXPORT const char *qn_get_mapper(Nes_Emu *e, int *number)
{
int m = e->cart()->mapper_code();

View File

@ -495,3 +495,12 @@ Nes_Emu::rgb_t const Nes_Emu::nes_colors [color_table_size] =
{136,190,197},{184,184,184},{ 0, 0, 0},{ 0, 0, 0}
};
void Nes_Emu::get_regs(unsigned int *dest) const
{
dest[0] = emu.r.a;
dest[1] = emu.r.x;
dest[2] = emu.r.y;
dest[3] = emu.r.sp;
dest[4] = emu.r.pc;
dest[5] = emu.r.status;
}

View File

@ -204,6 +204,7 @@ public:
byte peek_prg(nes_addr_t addr) const { return *static_cast<Nes_Cpu>(emu).get_code(addr); }
void poke_prg(nes_addr_t addr, byte value) { *static_cast<Nes_Cpu>(emu).get_code(addr) = value; }
void get_regs(unsigned int *dest) const;
// End of public interface
public:
@ -271,4 +272,3 @@ inline long Nes_Emu::chr_size() const
}
#endif