diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs index 242410739c..f796d5272f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs @@ -22,7 +22,7 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx public static extern void Reset(IntPtr s); [DllImport(dllname, CallingConvention = cc)] - public static extern void Advance(IntPtr s, Buttons buttons, int[] vbuff, short[] sbuff, ref int sbuffsize); + public static extern bool Advance(IntPtr s, Buttons buttons, int[] vbuff, short[] sbuff, ref int sbuffsize); [DllImport(dllname, CallingConvention = cc)] public static extern bool GetSaveRamPtr(IntPtr s, out int size, out IntPtr data); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs index 8be37c98ff..8ea08b84d5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs @@ -111,8 +111,10 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx LibLynx.Reset(Core); int samples = soundbuff.Length; - LibLynx.Advance(Core, GetButtons(), videobuff, soundbuff, ref samples); + IsLagFrame = LibLynx.Advance(Core, GetButtons(), videobuff, soundbuff, ref samples); numsamp = samples / 2; // sound provider wants number of sample pairs + if (IsLagFrame) + LagCount++; } public int Frame { get; private set; } diff --git a/lynx/cinterface.cpp b/lynx/cinterface.cpp index 872d3851c7..9edf3d7699 100644 --- a/lynx/cinterface.cpp +++ b/lynx/cinterface.cpp @@ -32,9 +32,9 @@ EXPORT void Reset(CSystem *s) s->Reset(); } -EXPORT void Advance(CSystem *s, int buttons, uint32 *vbuff, int16 *sbuff, int *sbuffsize) +EXPORT int Advance(CSystem *s, int buttons, uint32 *vbuff, int16 *sbuff, int *sbuffsize) { - s->Advance(buttons, vbuff, sbuff, *sbuffsize); + return s->Advance(buttons, vbuff, sbuff, *sbuffsize); } EXPORT int GetSaveRamPtr(CSystem *s, int *size, uint8 **data) diff --git a/lynx/susie.cpp b/lynx/susie.cpp index 9615efc292..22ba6872da 100644 --- a/lynx/susie.cpp +++ b/lynx/susie.cpp @@ -2076,6 +2076,7 @@ uint8 CSusie::Peek(uint32 addr) retval= Modified.Byte; } // TRACE_SUSIE2("Peek(JOYSTICK)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + lagged = false; return retval; break; @@ -2083,6 +2084,7 @@ uint8 CSusie::Peek(uint32 addr) case (SWITCHES&0xff): retval=mSWITCHES.Byte; // TRACE_SUSIE2("Peek(SWITCHES)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + lagged = false; return retval; // Cartridge reading ports diff --git a/lynx/susie.h b/lynx/susie.h index ccd03132d3..470b56e904 100644 --- a/lynx/susie.h +++ b/lynx/susie.h @@ -324,9 +324,10 @@ class CSusie : public CLynxBase uint32 ObjectSize(void) {return SUSIE_SIZE;}; void SetButtonData(uint32 data) {mJOYSTICK.Byte=(uint8)data;mSWITCHES.Byte=(uint8)(data>>8);}; - uint32 GetButtonData(void) {return mJOYSTICK.Byte+(mSWITCHES.Byte<<8);}; + // uint32 GetButtonData(void) {return mJOYSTICK.Byte+(mSWITCHES.Byte<<8);}; uint32 PaintSprites(void); + bool lagged; // set to false whenever joystick/switches are read private: void DoMathDivide(void); diff --git a/lynx/system.cpp b/lynx/system.cpp index 833806806d..9114fd29ec 100644 --- a/lynx/system.cpp +++ b/lynx/system.cpp @@ -153,12 +153,13 @@ static int Load(MDFNFILE *fp) } */ -void CSystem::Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize) +bool CSystem::Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize) { // this check needs to occur at least once every 250 million cycles or better mMikie->CheckWrap(); SetButtonData(buttons); + mSusie->lagged = true; uint32 start = gSystemCycleCount; @@ -183,6 +184,8 @@ void CSystem::Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize) mMikie->mikbuf.end_frame((gSystemCycleCount - start) >> 2); sbuffsize = mMikie->mikbuf.read_samples(sbuff, sbuffsize); + + return mSusie->lagged; } diff --git a/lynx/system.h b/lynx/system.h index ddbf987dc4..bcaf6b8f36 100644 --- a/lynx/system.h +++ b/lynx/system.h @@ -139,7 +139,7 @@ public: } } - void Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize); + bool Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize); bool GetSaveRamPtr(int &size, uint8 *&data) { return mCart->GetSaveRamPtr(size, data); } // @@ -192,7 +192,7 @@ public: // Miscellaneous void SetButtonData(uint32 data) {mSusie->SetButtonData(data);}; - uint32 GetButtonData() {return mSusie->GetButtonData();}; + // uint32 GetButtonData() {return mSusie->GetButtonData();}; uint8* GetRamPointer() {return mRam->GetRamPointer();}; public: diff --git a/output/dll/bizlynx.dll b/output/dll/bizlynx.dll index 7554c99ebc..d60ab6abce 100644 Binary files a/output/dll/bizlynx.dll and b/output/dll/bizlynx.dll differ