diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Core.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Core.cs
index c566479896..fbddc1e881 100644
--- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Core.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Core.cs
@@ -188,6 +188,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
case "Famicom":
apu = new APU(this, apu, false);
ppu.region = PPU.Region.NTSC;
+ CoreComm.VsyncNum = 39375000;
+ CoreComm.VsyncDen = 655171;
cpuclockrate = 1789773;
cpu_sequence = cpu_sequence_NTSC;
break;
diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs
index 79d83b72b1..6449bdb124 100644
--- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs
@@ -208,6 +208,14 @@ 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);
+ ///
+ /// get the mapper that's loaded
+ ///
+ /// Context
+ /// recieves mapper number
+ /// mapper name
+ [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
+ public static extern IntPtr qn_get_mapper(IntPtr e, ref int number);
///
/// handle "string error" as returned by some quicknes functions
diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs
index 623e9ce698..cdfd1d5fe9 100644
--- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs
@@ -64,6 +64,13 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
InitVideo();
InitAudio();
InitMemoryDomains();
+
+ int mapper = 0;
+ string mappername = Marshal.PtrToStringAnsi(LibQuickNES.qn_get_mapper(Context, ref mapper));
+ Console.WriteLine("QuickNES: Booted with Mapper #{0} \"{1}\"", mapper, mappername);
+ BoardName = mappername;
+ CoreComm.VsyncNum = 39375000;
+ CoreComm.VsyncDen = 655171;
}
catch
{
@@ -153,7 +160,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
public string SystemId { get { return "NES"; } }
public bool DeterministicEmulation { get { return true; } }
- public string BoardName { get { return null; } } // TODO
+ public string BoardName { get; private set; }
#region saveram
diff --git a/output/dll/libquicknes.dll b/output/dll/libquicknes.dll
index fa768bfa87..5b8ef0eb80 100644
Binary files a/output/dll/libquicknes.dll and b/output/dll/libquicknes.dll differ
diff --git a/quicknes/bizinterface.cpp b/quicknes/bizinterface.cpp
index a8a29374d8..7a18b16f24 100644
--- a/quicknes/bizinterface.cpp
+++ b/quicknes/bizinterface.cpp
@@ -226,6 +226,18 @@ EXPORT int qn_get_memory_area(Nes_Emu *e, int which, const void **data, int *siz
*writable = 0;
*name = "CIRAM (nametables)";
return 1;
+ case 4:
+ *data = e->cart()->prg();
+ *size = e->cart()->prg_size();
+ *writable = 0;
+ *name = "PRG ROM";
+ return 1;
+ case 5:
+ *data = e->cart()->chr();
+ *size = e->cart()->chr_size();
+ *writable = 0;
+ *name = "CHR VROM";
+ return 1;
}
}
@@ -238,3 +250,30 @@ EXPORT void qn_poke_prgbus(Nes_Emu *e, int addr, unsigned char val)
{
e->poke_prg(addr & 0xffff, val);
}
+
+EXPORT const char *qn_get_mapper(Nes_Emu *e, int *number)
+{
+ int m = e->cart()->mapper_code();
+ if (number)
+ *number = m;
+ switch (m)
+ {
+ default: return "unknown";
+ case 0: return "nrom";
+ case 1: return "mmc1";
+ case 2: return "unrom";
+ case 3: return "cnrom";
+ case 4: return "mmc3";
+ case 7: return "aorom";
+ case 69: return "fme7";
+ case 5: return "mmc5";
+ case 19: return "namco106";
+ case 24: return "vrc6a";
+ case 26: return "vrc6b";
+ case 11: return "color_dreams";
+ case 34: return "nina1";
+ case 66: return "gnrom";
+ case 87: return "mapper_87";
+ case 232: return "quattro";
+ }
+}