lag counter in sneshawk

c++ is dum
This commit is contained in:
goyuken 2012-09-23 15:57:01 +00:00
parent 5d4703f71f
commit 7e89882d42
7 changed files with 40 additions and 10 deletions

View File

@ -52,6 +52,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate ushort snes_input_state_t(int port, int device, int index, int id); public delegate ushort snes_input_state_t(int port, int device, int index, int id);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void snes_input_notify_t(int index);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void snes_audio_sample_t(ushort left, ushort right); public delegate void snes_audio_sample_t(ushort left, ushort right);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void snes_scanlineStart_t(int line); public delegate void snes_scanlineStart_t(int line);
@ -63,6 +65,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
[DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void snes_set_input_state(snes_input_state_t input_state); public static extern void snes_set_input_state(snes_input_state_t input_state);
[DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void snes_set_input_notify(snes_input_notify_t input_notify);
[DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void snes_set_audio_sample(snes_audio_sample_t audio_sample); public static extern void snes_set_audio_sample(snes_audio_sample_t audio_sample);
[DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void snes_set_scanlineStart(snes_scanlineStart_t scanlineStart); public static extern void snes_set_scanlineStart(snes_scanlineStart_t scanlineStart);
@ -296,6 +300,9 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
inputcb = new LibsnesDll.snes_input_state_t(snes_input_state); inputcb = new LibsnesDll.snes_input_state_t(snes_input_state);
BizHawk.Emulation.Consoles.Nintendo.SNES.LibsnesDll.snes_set_input_state(inputcb); BizHawk.Emulation.Consoles.Nintendo.SNES.LibsnesDll.snes_set_input_state(inputcb);
notifycb = new LibsnesDll.snes_input_notify_t(snes_input_notify);
BizHawk.Emulation.Consoles.Nintendo.SNES.LibsnesDll.snes_set_input_notify(notifycb);
soundcb = new LibsnesDll.snes_audio_sample_t(snes_audio_sample); soundcb = new LibsnesDll.snes_audio_sample_t(snes_audio_sample);
BizHawk.Emulation.Consoles.Nintendo.SNES.LibsnesDll.snes_set_audio_sample(soundcb); BizHawk.Emulation.Consoles.Nintendo.SNES.LibsnesDll.snes_set_audio_sample(soundcb);
@ -322,6 +329,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
LibsnesDll.snes_video_refresh_t vidcb; LibsnesDll.snes_video_refresh_t vidcb;
LibsnesDll.snes_input_poll_t pollcb; LibsnesDll.snes_input_poll_t pollcb;
LibsnesDll.snes_input_state_t inputcb; LibsnesDll.snes_input_state_t inputcb;
LibsnesDll.snes_input_notify_t notifycb;
LibsnesDll.snes_audio_sample_t soundcb; LibsnesDll.snes_audio_sample_t soundcb;
LibsnesDll.snes_scanlineStart_t scanlineStart_cb; LibsnesDll.snes_scanlineStart_t scanlineStart_cb;
@ -356,6 +364,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
} }
void snes_input_poll() void snes_input_poll()
{
// libsnes.cpp calls this on every video refresh regardless of any underlying anything, so...
//IsLagFrame = false;
}
void snes_input_notify(int index)
{ {
IsLagFrame = false; IsLagFrame = false;
} }

View File

@ -204,14 +204,14 @@ uint8 CPU::mmio_r4217() {
return status.rdmpy >> 8; return status.rdmpy >> 8;
} }
uint8 CPU::mmio_r4218() { return status.joy1 >> 0; } //JOY1L uint8 CPU::mmio_r4218() { interface->inputNotify(8); return status.joy1 >> 0; } //JOY1L
uint8 CPU::mmio_r4219() { return status.joy1 >> 8; } //JOY1H uint8 CPU::mmio_r4219() { interface->inputNotify(9); return status.joy1 >> 8; } //JOY1H
uint8 CPU::mmio_r421a() { return status.joy2 >> 0; } //JOY2L uint8 CPU::mmio_r421a() { interface->inputNotify(10); return status.joy2 >> 0; } //JOY2L
uint8 CPU::mmio_r421b() { return status.joy2 >> 8; } //JOY2H uint8 CPU::mmio_r421b() { interface->inputNotify(11); return status.joy2 >> 8; } //JOY2H
uint8 CPU::mmio_r421c() { return status.joy3 >> 0; } //JOY3L uint8 CPU::mmio_r421c() { interface->inputNotify(12); return status.joy3 >> 0; } //JOY3L
uint8 CPU::mmio_r421d() { return status.joy3 >> 8; } //JOY3H uint8 CPU::mmio_r421d() { interface->inputNotify(13); return status.joy3 >> 8; } //JOY3H
uint8 CPU::mmio_r421e() { return status.joy4 >> 0; } //JOY4L uint8 CPU::mmio_r421e() { interface->inputNotify(14); return status.joy4 >> 0; } //JOY4L
uint8 CPU::mmio_r421f() { return status.joy4 >> 8; } //JOY4H uint8 CPU::mmio_r421f() { interface->inputNotify(15); return status.joy4 >> 8; } //JOY4H
//DMAPx //DMAPx
uint8 CPU::mmio_r43x0(uint8 i) { uint8 CPU::mmio_r43x0(uint8 i) {

View File

@ -14,6 +14,9 @@ int16_t Interface::inputPoll(bool port, Input::Device device, unsigned index, un
return 0; return 0;
} }
void Interface::inputNotify(int index) {
}
void Interface::message(const string &text) { void Interface::message(const string &text) {
print(text, "\n"); print(text, "\n");
} }

View File

@ -3,6 +3,8 @@ struct Interface {
virtual void audioSample(int16_t lsample, int16_t rsample); virtual void audioSample(int16_t lsample, int16_t rsample);
virtual int16_t inputPoll(bool port, Input::Device device, unsigned index, unsigned id); virtual int16_t inputPoll(bool port, Input::Device device, unsigned index, unsigned id);
virtual void inputNotify(int index);
virtual string path(Cartridge::Slot slot, const string &hint) = 0; virtual string path(Cartridge::Slot slot, const string &hint) = 0;
virtual void message(const string &text); virtual void message(const string &text);
virtual time_t currentTime(); virtual time_t currentTime();

View File

@ -10,6 +10,7 @@ struct Interface : public SNES::Interface {
snes_audio_sample_t paudio_sample; snes_audio_sample_t paudio_sample;
snes_input_poll_t pinput_poll; snes_input_poll_t pinput_poll;
snes_input_state_t pinput_state; snes_input_state_t pinput_state;
snes_input_notify_t pinput_notify;
string basename; string basename;
uint32_t *buffer; uint32_t *buffer;
uint32_t *palette; uint32_t *palette;
@ -52,6 +53,10 @@ struct Interface : public SNES::Interface {
return 0; return 0;
} }
void inputNotify(int index) {
if (pinput_notify) pinput_notify(index);
}
void message(const string &text) { void message(const string &text) {
print(text, "\n"); print(text, "\n");
} }
@ -60,7 +65,7 @@ struct Interface : public SNES::Interface {
return { basename, hint }; return { basename, hint };
} }
Interface() : pvideo_refresh(0), paudio_sample(0), pinput_poll(0), pinput_state(0) { Interface() : pvideo_refresh(0), paudio_sample(0), pinput_poll(0), pinput_state(0), pinput_notify(0) {
buffer = new uint32_t[512 * 480]; buffer = new uint32_t[512 * 480];
palette = new uint32_t[16 * 32768]; palette = new uint32_t[16 * 32768];
@ -128,6 +133,10 @@ void snes_set_input_state(snes_input_state_t input_state) {
interface.pinput_state = input_state; interface.pinput_state = input_state;
} }
void snes_set_input_notify(snes_input_notify_t input_notify) {
interface.pinput_notify = input_notify;
}
void snes_set_controller_port_device(bool port, unsigned device) { void snes_set_controller_port_device(bool port, unsigned device) {
SNES::input.connect(port, (SNES::Input::Device)device); SNES::input.connect(port, (SNES::Input::Device)device);
} }

View File

@ -71,6 +71,7 @@ typedef void (*snes_video_refresh_t)(const uint32_t *data, unsigned width, unsig
typedef void (*snes_audio_sample_t)(uint16_t left, uint16_t right); typedef void (*snes_audio_sample_t)(uint16_t left, uint16_t right);
typedef void (*snes_input_poll_t)(void); typedef void (*snes_input_poll_t)(void);
typedef int16_t (*snes_input_state_t)(unsigned port, unsigned device, unsigned index, unsigned id); typedef int16_t (*snes_input_state_t)(unsigned port, unsigned device, unsigned index, unsigned id);
typedef void (*snes_input_notify_t)(int index);
const char* snes_library_id(void); const char* snes_library_id(void);
unsigned snes_library_revision_major(void); unsigned snes_library_revision_major(void);
@ -80,6 +81,7 @@ void snes_set_video_refresh(snes_video_refresh_t);
void snes_set_audio_sample(snes_audio_sample_t); void snes_set_audio_sample(snes_audio_sample_t);
void snes_set_input_poll(snes_input_poll_t); void snes_set_input_poll(snes_input_poll_t);
void snes_set_input_state(snes_input_state_t); void snes_set_input_state(snes_input_state_t);
void snes_set_input_notify(snes_input_notify_t);
void snes_set_controller_port_device(bool port, unsigned device); void snes_set_controller_port_device(bool port, unsigned device);
void snes_set_cartridge_basename(const char *basename); void snes_set_cartridge_basename(const char *basename);