From 4ab407bb4208c3f3f88d4b078581bf46ff3fd43f Mon Sep 17 00:00:00 2001 From: nattthebear Date: Mon, 29 May 2017 12:16:24 -0400 Subject: [PATCH] virtual boy: add IInputPollable. Unfortunately, adding one more field to EmulateSpec caused C# to vomit its brains out, so yeah... --- .../Consoles/Nintendo/VB/LibVirtualBoyee.cs | 18 +++++++++- .../Consoles/Nintendo/VB/VirtualBoyee.cs | 34 ++++++++++-------- output64/dll/vb.wbx | Bin 96270 -> 96270 bytes waterbox/vb/git.h | 3 ++ waterbox/vb/vb.cpp | 13 +++++++ 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/LibVirtualBoyee.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/LibVirtualBoyee.cs index 6e25e72e3a..d41b77ec6e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/LibVirtualBoyee.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/LibVirtualBoyee.cs @@ -21,37 +21,47 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB public int H; } - [StructLayout(LayoutKind.Sequential)] + [StructLayout(LayoutKind.Explicit)] // TODO: find out why Sequential is sometimes ignored on the native layout public class EmulateSpec { // Pitch(32-bit) must be equal to width and >= the "fb_width" specified in the MDFNGI struct for the emulated system. // Height must be >= to the "fb_height" specified in the MDFNGI struct for the emulated system. // The framebuffer pointed to by surface->pixels is written to by the system emulation code. + [FieldOffset(0)] public IntPtr Pixels; // Pointer to sound buffer, set by the driver code, that the emulation code should render sound to. // Guaranteed to be at least 500ms in length, but emulation code really shouldn't exceed 40ms or so. Additionally, if emulation code // generates >= 100ms, // DEPRECATED: Emulation code may set this pointer to a sound buffer internal to the emulation module. + [FieldOffset(8)] public IntPtr SoundBuf; // Number of cycles that this frame consumed, using MDFNGI::MasterClock as a time base. // Set by emulation code. + [FieldOffset(16)] public long MasterCycles; // Set by the system emulation code every frame, to denote the horizontal and vertical offsets of the image, and the size // of the image. If the emulated system sets the elements of LineWidths, then the width(w) of this structure // is ignored while drawing the image. + [FieldOffset(24)] public Rect DisplayRect; // Maximum size of the sound buffer, in frames. Set by the driver code. + [FieldOffset(40)] public int SoundBufMaxSize; // Number of frames currently in internal sound buffer. Set by the system emulation code, to be read by the driver code. + [FieldOffset(44)] public int SoundBufSize; // 0 UDLR SelectStartBA UDLR(right dpad) LtrigRtrig 13 + [FieldOffset(48)] public Buttons Buttons; + + [FieldOffset(52)] + public bool Lagged; } public enum MemoryArea : int @@ -77,6 +87,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB R = 0x4 } + [UnmanagedFunctionPointer(CC)] + public delegate void InputCallback(); + [BizImport(CC)] public abstract bool Load(byte[] rom, int length); @@ -88,5 +101,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB [BizImport(CC)] public abstract void HardReset(); + + [BizImport(CC)] + public abstract void SetInputCallback(InputCallback callback); } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/VirtualBoyee.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/VirtualBoyee.cs index 2ca48735a6..d21f9054e7 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/VirtualBoyee.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/VirtualBoyee.cs @@ -11,9 +11,10 @@ using System.Threading.Tasks; namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB { - [CoreAttributes("Virtual Boyee", "???", true, false, "0.9.44.1", + [CoreAttributes("Virtual Boyee", "???", true, false, "0.9.44.1", "https://mednafen.github.io/releases/", false)] - public class VirtualBoyee : IEmulator, IVideoProvider, ISoundProvider, IStatable + public class VirtualBoyee : IEmulator, IVideoProvider, ISoundProvider, IStatable, + IInputPollable { private PeRunner _exe; private LibVirtualBoyee _boyee; @@ -42,6 +43,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB } _exe.Seal(); + + _inputCallback = InputCallbacks.Call; } private bool _disposed = false; @@ -60,6 +63,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB public unsafe void FrameAdvance(IController controller, bool render, bool rendersound = true) { + _boyee.SetInputCallback(InputCallbacks.Count > 0 ? _inputCallback : null); + if (controller.IsPressed("Power")) _boyee.HardReset(); @@ -78,20 +83,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB BufferWidth = spec.DisplayRect.W; BufferHeight = spec.DisplayRect.H; _numSamples = spec.SoundBufSize; + + Frame++; + + IsLagFrame = spec.Lagged; + if (IsLagFrame) + LagCount++; + } - - Frame++; - - /*_core.biz_set_input_callback(InputCallbacks.Count > 0 ? _inputCallback : null); - - UpdateControls(controller); - Frame++; - LibSnes9x.frame_info frame = new LibSnes9x.frame_info(); - - _core.biz_run(frame, _inputState); - IsLagFrame = frame.padread == 0; - if (IsLagFrame) - LagCount++;*/ } public int Frame { get; private set; } @@ -199,6 +198,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB public int LagCount { get; set; } public bool IsLagFrame { get; set; } + private LibVirtualBoyee.InputCallback _inputCallback; + + public IInputCallbackSystem InputCallbacks { get; } = new InputCallbackSystem(); + #region IStatable public bool BinarySaveStatesPreferred @@ -230,6 +233,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB LagCount = reader.ReadInt32(); IsLagFrame = reader.ReadBoolean(); // any managed pointers that we sent to the core need to be resent now! + _boyee.SetInputCallback(null); } public void SaveStateBinary(BinaryWriter writer) diff --git a/output64/dll/vb.wbx b/output64/dll/vb.wbx index f398cbff38883fe9a0fd866b58995892261a838f..34b3f7d41371f9b49ba21502b2753529d65a9f69 100644 GIT binary patch delta 14983 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 diff --git a/waterbox/vb/git.h b/waterbox/vb/git.h index edcd8a8415..d9e8108b3d 100644 --- a/waterbox/vb/git.h +++ b/waterbox/vb/git.h @@ -41,6 +41,9 @@ struct EmulateSpecStruct // 0 UDLR SelectStartBA UDLR(right dpad) LtrigRtrig 13 int32 Buttons; + + // set by core, true if lagged + int32 Lagged; }; /*typedef struct diff --git a/waterbox/vb/vb.cpp b/waterbox/vb/vb.cpp index bf0639cc4f..8e79dc7671 100644 --- a/waterbox/vb/vb.cpp +++ b/waterbox/vb/vb.cpp @@ -25,6 +25,9 @@ namespace MDFN_IEN_VB { +static void (*input_callback)(); +static bool lagged; + enum { ANAGLYPH_PRESET_DISABLED = 0, @@ -126,6 +129,9 @@ static MDFN_FASTCALL uint8 HWCTRL_Read(v810_timestamp_t ×tamp, uint32 A) case 0x10: case 0x14: case 0x28: + lagged = false; + if (input_callback) + input_callback(); ret = VBINPUT_Read(timestamp, A); break; } @@ -738,6 +744,7 @@ EXPORT void GetMemoryArea(int which, void **ptr, int *size) EXPORT void Emulate(EmulateSpecStruct *espec) { v810_timestamp_t v810_timestamp; + lagged = true; VBINPUT_Frame(&espec->Buttons); @@ -753,6 +760,7 @@ EXPORT void Emulate(EmulateSpecStruct *espec) VSU_CycleFix = (v810_timestamp + VSU_CycleFix) & 3; espec->MasterCycles = v810_timestamp; + espec->Lagged = lagged; TIMER_ResetTS(); VBINPUT_ResetTS(); @@ -768,6 +776,11 @@ EXPORT void HardReset() VB_Power(); } +EXPORT void SetInputCallback(void (*callback)()) +{ + input_callback = callback; +} + int main() { return 0;