From 7d33d604aef1749833a7cf2807c39ccff7098f69 Mon Sep 17 00:00:00 2001 From: MrWint Date: Tue, 28 May 2019 22:56:39 +0200 Subject: [PATCH] cycle-based RTC --- .../Nintendo/Gameboy/Gambatte.ISaveRam.cs | 22 --- .../Nintendo/Gameboy/Gambatte.ISettable.cs | 22 --- .../Consoles/Nintendo/Gameboy/Gambatte.cs | 70 +-------- .../Consoles/Nintendo/Gameboy/LibGambatte.cs | 29 ++-- libgambatte/include/gambatte.h | 7 +- libgambatte/libgambatte.vcxproj | 2 + libgambatte/libgambatte.vcxproj.filters | 6 + libgambatte/src/cinterface.cpp | 16 +- libgambatte/src/cpu.h | 9 +- libgambatte/src/gambatte.cpp | 16 +- libgambatte/src/initstate.cpp | 13 +- libgambatte/src/initstate.h | 2 +- libgambatte/src/mem/cartridge.cpp | 53 +++++-- libgambatte/src/mem/cartridge.h | 20 +-- libgambatte/src/mem/rtc.cpp | 76 ++++----- libgambatte/src/mem/rtc.h | 41 +++-- libgambatte/src/mem/time.cpp | 144 ++++++++++++++++++ libgambatte/src/mem/time.h | 78 ++++++++++ libgambatte/src/memory.cpp | 6 +- libgambatte/src/memory.h | 12 +- libgambatte/src/savestate.h | 10 +- output/dll/libgambatte.dll | Bin 168448 -> 170496 bytes 22 files changed, 402 insertions(+), 252 deletions(-) create mode 100644 libgambatte/src/mem/time.cpp create mode 100644 libgambatte/src/mem/time.h diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISaveRam.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISaveRam.cs index 3776eb00f7..218d2bf3ec 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISaveRam.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISaveRam.cs @@ -41,31 +41,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy break; default: throw new ArgumentException("Size of saveram data does not match expected!"); - case 44: - data = FixRTC(data, 44); - break; - case 40: - data = FixRTC(data, 40); - break; } LibGambatte.gambatte_loadsavedata(GambatteState, data); } - - private byte[] FixRTC(byte[] data, int offset) - { - // length - offset is the start of the VBA-only data; so - // length - offset - 4 is the start of the RTC block - int idx = data.Length - offset - 4; - - byte[] ret = new byte[idx + 4]; - Buffer.BlockCopy(data, 0, ret, 0, idx); - data[idx] = (byte)zerotime; - data[idx + 1] = (byte)(zerotime >> 8); - data[idx + 2] = (byte)(zerotime >> 16); - data[idx + 3] = (byte)(zerotime >> 24); - - return ret; - } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISettable.cs index 297b029f11..3681c532d3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISettable.cs @@ -116,18 +116,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy [DefaultValue(false)] public bool RealTimeRTC { get; set; } - [DisplayName("RTC Initial Time")] - [Description("Set the initial RTC time in terms of elapsed seconds. Only used when RealTimeRTC is false.")] - [DefaultValue(0)] - public int RTCInitialTime - { - get { return _RTCInitialTime; } - set { _RTCInitialTime = Math.Max(0, Math.Min(1024 * 24 * 60 * 60, value)); } - } - - [JsonIgnore] - private int _RTCInitialTime; - [DisplayName("Equal Length Frames")] [Description("When false, emulation frames sync to vblank. Only useful for high level TASing.")] [DefaultValue(false)] @@ -141,11 +129,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy [DeepEqualsIgnore] private bool _equalLengthFrames; - [DisplayName("Initial DIV offset")] - [Description("Internal. Probably doesn't work. Leave this set to 0. Accepts values from 0 to 65532 in steps of 4")] - [DefaultValue(0)] - public int InitialDiv { get; set; } - public GambatteSyncSettings() { SettingsUtil.SetDefaultValues(this); @@ -160,11 +143,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy { return !DeepEquality.DeepEquals(x, y); } - - public uint GetInitialDivInternal() - { - return (uint)(InitialDiv & 0xfffc); - } } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 1790f04703..3b837f5b78 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -58,13 +58,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy { _syncSettings = (GambatteSyncSettings)syncSettings ?? new GambatteSyncSettings(); - // copy over non-loadflag syncsettings now; they won't take effect if changed later - zerotime = (uint)_syncSettings.RTCInitialTime; - - real_rtc_time = !DeterministicEmulation && _syncSettings.RealTimeRTC; - - DivInternal = _syncSettings.GetInitialDivInternal(); - LibGambatte.LoadFlags flags = 0; switch (_syncSettings.ConsoleMode) @@ -90,7 +83,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy flags |= LibGambatte.LoadFlags.MULTICART_COMPAT; } - if (LibGambatte.gambatte_load(GambatteState, file, (uint)file.Length, GetCurrentTime(), flags, DivInternal) != 0) + if (LibGambatte.gambatte_load(GambatteState, file, (uint)file.Length, flags) != 0) { throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_load)}() returned non-zero (is this not a gb or gbc rom?)"); } @@ -133,8 +126,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy string romname = System.Text.Encoding.ASCII.GetString(buff); Console.WriteLine("Core reported rom name: {0}", romname); - TimeCallback = new LibGambatte.RTCCallback(GetCurrentTime); - LibGambatte.gambatte_setrtccallback(GambatteState, TimeCallback); + if (!DeterministicEmulation && _syncSettings.RealTimeRTC) + { + LibGambatte.gambatte_settimemode(GambatteState, false); + } _cdCallback = new LibGambatte.CDCallback(CDCallbackProc); @@ -167,59 +162,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// private LibGambatte.Buttons CurrentButtons = 0; - private uint DivInternal = 0; - - #region RTC - - /// - /// RTC time when emulation begins. - /// - private readonly uint zerotime = 0; - - /// - /// if true, RTC will run off of real elapsed time - /// - private bool real_rtc_time = false; - - private LibGambatte.RTCCallback TimeCallback; - - private static long GetUnixNow() - { - // because internally the RTC works off of relative time, we don't need to base - // this off of any particular canonical epoch. - return DateTime.UtcNow.Ticks / 10000000L - 60000000000L; - } - - private uint GetCurrentTime() - { - if (real_rtc_time) - { - return (uint)GetUnixNow(); - } - - ulong fn = (ulong)Frame; - - // as we're exactly tracking cpu cycles, this can be pretty accurate - fn *= 4389; - fn /= 262144; - fn += zerotime; - return (uint)fn; - } - - private uint GetInitialTime() - { - if (real_rtc_time) - { - return (uint)GetUnixNow(); - } - - // setting the initial boot time to 0 will cause our zerotime - // to function as an initial offset, which is what we want - return 0; - } - - #endregion - #region ALL SAVESTATEABLE STATE GOES HERE /// @@ -320,7 +262,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy if (controller.IsPressed("Power")) { - LibGambatte.gambatte_reset(GambatteState, GetCurrentTime(), DivInternal); + LibGambatte.gambatte_reset(GambatteState); } if (Tracer.Enabled) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs index 06cb95ece3..038ff62021 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -53,11 +53,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// opaque state pointer /// the rom data, can be disposed of once this function returns /// length of romdata in bytes - /// RTC time when the rom is loaded /// ORed combination of LoadFlags. /// 0 on success, negative value on failure. [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern int gambatte_load(IntPtr core, byte[] romdata, uint length, long now, LoadFlags flags, uint div); + public static extern int gambatte_load(IntPtr core, byte[] romdata, uint length, LoadFlags flags); /// /// Load GB(C) BIOS image. @@ -114,9 +113,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// Equivalent to reloading a ROM image, or turning a Game Boy Color off and on again. /// /// opaque state pointer - /// RTC time when the reset occurs [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern void gambatte_reset(IntPtr core, long now, uint div); + public static extern void gambatte_reset(IntPtr core); /// /// palette type for gambatte_setdmgpalettecolor @@ -259,21 +257,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// 0-153 inclusive [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void gambatte_setscanlinecallback(IntPtr core, ScanlineCallback callback, int sl); - - /// - /// type of the RTC callback - /// - /// what time is it, unixy - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate uint RTCCallback(); - - /// - /// sets RTC callback. probably mandatory. - /// - /// opaque state pointer - /// the callback - [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern void gambatte_setrtccallback(IntPtr core, RTCCallback callback); /// /// type of the link data sent callback @@ -289,6 +272,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void gambatte_setlinkcallback(IntPtr core, LinkCallback callback); + /// + /// Changes between cycle-based and real-time RTC. Defaults to cycle-based. + /// + /// opaque state pointer + /// use cycle-based RTC + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void gambatte_settimemode(IntPtr core, bool useCycles); + /// /// Returns true if the currently loaded ROM image is treated as having CGB support. /// diff --git a/libgambatte/include/gambatte.h b/libgambatte/include/gambatte.h index 8bebff11bc..d86187c0fd 100644 --- a/libgambatte/include/gambatte.h +++ b/libgambatte/include/gambatte.h @@ -64,7 +64,7 @@ public: * @param flags ORed combination of LoadFlags. * @return 0 on success, negative value on failure. */ - LoadRes load(char const *romfiledata, unsigned romfilelength, std::uint32_t now, unsigned flags, unsigned div); + LoadRes load(char const *romfiledata, unsigned romfilelength, unsigned flags); int loadBios(char const *biosfiledata, std::size_t size); @@ -106,7 +106,7 @@ public: * Reset to initial state. * Equivalent to reloading a ROM image, or turning a Game Boy Color off and on again. */ - void reset(std::uint32_t now, unsigned div); + void reset(); /** * @param palNum 0 <= palNum < 3. One of BG_PALETTE, SP1_PALETTE and SP2_PALETTE. @@ -128,6 +128,9 @@ public: void setRTCCallback(std::uint32_t (*callback)()); void setLinkCallback(void(*callback)()); + /** Use cycle-based RTC instead of real-time. */ + void setTimeMode(bool useCycles); + /** Returns true if the currently loaded ROM image is treated as having CGB support. */ bool isCgb() const; diff --git a/libgambatte/libgambatte.vcxproj b/libgambatte/libgambatte.vcxproj index 33e0eb0aee..6612bff667 100644 --- a/libgambatte/libgambatte.vcxproj +++ b/libgambatte/libgambatte.vcxproj @@ -170,6 +170,7 @@ + @@ -202,6 +203,7 @@ + diff --git a/libgambatte/libgambatte.vcxproj.filters b/libgambatte/libgambatte.vcxproj.filters index 38cbfcdb7d..f096a22f6b 100644 --- a/libgambatte/libgambatte.vcxproj.filters +++ b/libgambatte/libgambatte.vcxproj.filters @@ -126,6 +126,9 @@ Header Files + + Header Files + @@ -203,5 +206,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/libgambatte/src/cinterface.cpp b/libgambatte/src/cinterface.cpp index c342d81418..51c4730ae1 100644 --- a/libgambatte/src/cinterface.cpp +++ b/libgambatte/src/cinterface.cpp @@ -45,8 +45,8 @@ GBEXPORT void gambatte_destroy(GB *g) { delete g; } -GBEXPORT int gambatte_load(GB *g, char const *romfiledata, unsigned romfilelength, long long now, unsigned flags, unsigned div) { - return g->load(romfiledata, romfilelength, now, flags, div); +GBEXPORT int gambatte_load(GB *g, char const *romfiledata, unsigned romfilelength, unsigned flags) { + return g->load(romfiledata, romfilelength, flags); } GBEXPORT int gambatte_loadbios(GB *g, char const *biosfiledata, unsigned size) { @@ -68,8 +68,12 @@ GBEXPORT void gambatte_setlayers(GB *g, unsigned mask) { g->setLayers(mask); } -GBEXPORT void gambatte_reset(GB *g, long long now, unsigned div) { - g->reset(now, div); +GBEXPORT void gambatte_setTimeMode(GB *g, bool useCycles) { + g->setTimeMode(useCycles); +} + +GBEXPORT void gambatte_reset(GB *g) { + g->reset(); } GBEXPORT void gambatte_setdmgpalettecolor(GB *g, unsigned palnum, unsigned colornum, unsigned rgb32) { @@ -109,10 +113,6 @@ GBEXPORT void gambatte_setscanlinecallback(GB *g, void (*callback)(), int sl) { g->setScanlineCallback(callback, sl); } -GBEXPORT void gambatte_setrtccallback(GB *g, unsigned int (*callback)()) { - g->setRTCCallback(callback); -} - GBEXPORT void gambatte_setlinkcallback(GB *g, void(*callback)()) { g->setLinkCallback(callback); } diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 5349514e05..6059b0fad4 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -31,9 +31,9 @@ public: void setStatePtrs(SaveState &state); void loadState(SaveState const &state); void setLayers(unsigned mask) { mem_.setLayers(mask); } - void loadSavedata(char const *data) { mem_.loadSavedata(data); } + void loadSavedata(char const *data) { mem_.loadSavedata(data, cycleCounter_); } int saveSavedataLength() {return mem_.saveSavedataLength(); } - void saveSavedata(char *dest) { mem_.saveSavedata(dest); } + void saveSavedata(char *dest) { mem_.saveSavedata(dest, cycleCounter_); } bool getMemoryArea(int which, unsigned char **data, int *length) { return mem_.getMemoryArea(which, data, length); } @@ -69,10 +69,6 @@ public: mem_.setScanlineCallback(callback, sl); } - void setRTCCallback(std::uint32_t (*callback)()) { - mem_.setRTCCallback(callback); - } - void setLinkCallback(void(*callback)()) { mem_.setLinkCallback(callback); } @@ -94,6 +90,7 @@ public: void setCgbPalette(unsigned *lut) { mem_.setCgbPalette(lut); } + void setTimeMode(bool useCycles) { mem_.setTimeMode(useCycles, cycleCounter_); } void setBios(char const *buffer, std::size_t size) { mem_.setBios(buffer, size); } bool gbIsCgb() { return mem_.gbIsCgb(); } diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index d4beddafce..d222874ac6 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -75,7 +75,7 @@ void GB::blitTo(gambatte::uint_least32_t *videoBuf, std::ptrdiff_t pitch) { } } -void GB::reset(const std::uint32_t now, const unsigned div) { +void GB::reset() { if (p_->cpu.loaded()) { int length = p_->cpu.saveSavedataLength(); @@ -88,7 +88,7 @@ void GB::reset(const std::uint32_t now, const unsigned div) { SaveState state; p_->cpu.setStatePtrs(state); - setInitState(state, !(p_->loadflags & FORCE_DMG), p_->loadflags & GBA_CGB, now, div); + setInitState(state, !(p_->loadflags & FORCE_DMG), p_->loadflags & GBA_CGB); p_->cpu.loadState(state); if (length > 0) { @@ -126,22 +126,22 @@ void GB::setScanlineCallback(void (*callback)(), int sl) { p_->cpu.setScanlineCallback(callback, sl); } -void GB::setRTCCallback(std::uint32_t (*callback)()) { - p_->cpu.setRTCCallback(callback); -} - void GB::setLinkCallback(void(*callback)()) { p_->cpu.setLinkCallback(callback); } -LoadRes GB::load(char const *romfiledata, unsigned romfilelength, const std::uint32_t now, unsigned const flags, const unsigned div) { +void GB::setTimeMode(bool useCycles) { + p_->cpu.setTimeMode(useCycles); +} + +LoadRes GB::load(char const *romfiledata, unsigned romfilelength, unsigned const flags) { LoadRes const loadres = p_->cpu.load(romfiledata, romfilelength, flags & FORCE_DMG, flags & MULTICART_COMPAT); if (loadres == LOADRES_OK) { SaveState state; p_->cpu.setStatePtrs(state); p_->loadflags = flags; - setInitState(state, !(flags & FORCE_DMG), flags & GBA_CGB, now, div); + setInitState(state, !(flags & FORCE_DMG), flags & GBA_CGB); p_->cpu.loadState(state); } diff --git a/libgambatte/src/initstate.cpp b/libgambatte/src/initstate.cpp index d147eb03d6..72e26c6f85 100644 --- a/libgambatte/src/initstate.cpp +++ b/libgambatte/src/initstate.cpp @@ -20,6 +20,7 @@ #include "counterdef.h" #include "savestate.h" #include "sound/sound_unit.h" +#include "mem/time.h" #include #include @@ -1146,7 +1147,7 @@ static void setInitialDmgIoamhram(unsigned char ioamhram[]) { } // anon namespace -void gambatte::setInitState(SaveState &state, const bool cgb, const bool gbaCgbMode, const std::uint32_t now, const unsigned div) { +void gambatte::setInitState(SaveState &state, const bool cgb, const bool gbaCgbMode) { static unsigned char const cgbObjpDump[0x40] = { 0x00, 0x00, 0xF2, 0xAB, 0x61, 0xC2, 0xD9, 0xBA, @@ -1198,7 +1199,7 @@ void gambatte::setInitState(SaveState &state, const bool cgb, const bool gbaCgbM state.mem.ioamhram.ptr[0x140] = 0; state.mem.ioamhram.ptr[0x144] = 0x00; - state.mem.divLastUpdate = 0 - div; + state.mem.divLastUpdate = 0; state.mem.timaBasetime = 0; state.mem.timaLastUpdate = 0; state.mem.tmatime = disabled_time; @@ -1315,8 +1316,12 @@ void gambatte::setInitState(SaveState &state, const bool cgb, const bool gbaCgbM state.spu.ch4.nr4 = 0; state.spu.ch4.master = false; - state.rtc.baseTime = now; - state.rtc.haltTime = state.rtc.baseTime; + state.time.seconds = 0; + state.time.lastTimeSec = Time::now().tv_sec; + state.time.lastTimeUsec = Time::now().tv_usec; + state.time.lastCycles = state.cpu.cycleCounter; + + state.rtc.haltTime = state.time.seconds; state.rtc.dataDh = 0; state.rtc.dataDl = 0; state.rtc.dataH = 0; diff --git a/libgambatte/src/initstate.h b/libgambatte/src/initstate.h index 02363941d8..0e31dd35bb 100644 --- a/libgambatte/src/initstate.h +++ b/libgambatte/src/initstate.h @@ -23,7 +23,7 @@ namespace gambatte { -void setInitState(struct SaveState &state, bool cgb, bool gbaCgbMode, std::uint32_t now, unsigned div); +void setInitState(struct SaveState &state, bool cgb, bool gbaCgbMode); } #endif diff --git a/libgambatte/src/mem/cartridge.cpp b/libgambatte/src/mem/cartridge.cpp index 5465548f22..0d6539af68 100644 --- a/libgambatte/src/mem/cartridge.cpp +++ b/libgambatte/src/mem/cartridge.cpp @@ -50,7 +50,7 @@ public: { } - virtual void romWrite(unsigned const p, unsigned const data) { + virtual void romWrite(unsigned const p, unsigned const data, unsigned long const /*cc*/) { if (p < 0x2000) { enableRam_ = (data & 0xF) == 0xA; memptrs_.setRambank(enableRam_ ? MemPtrs::read_en | MemPtrs::write_en : 0, 0); @@ -92,7 +92,7 @@ public: { } - virtual void romWrite(unsigned const p, unsigned const data) { + virtual void romWrite(unsigned const p, unsigned const data, unsigned long const /*cc*/) { switch (p >> 13 & 3) { case 0: enableRam_ = (data & 0xF) == 0xA; @@ -166,7 +166,7 @@ public: { } - virtual void romWrite(unsigned const p, unsigned const data) { + virtual void romWrite(unsigned const p, unsigned const data, unsigned long const /*cc*/) { switch (p >> 13 & 3) { case 0: enableRam_ = (data & 0xF) == 0xA; @@ -238,7 +238,7 @@ public: { } - virtual void romWrite(unsigned const p, unsigned const data) { + virtual void romWrite(unsigned const p, unsigned const data, unsigned long const /*cc*/) { switch (p & 0x6100) { case 0x0000: enableRam_ = (data & 0xF) == 0xA; @@ -282,7 +282,7 @@ public: { } - virtual void romWrite(unsigned const p, unsigned const data) { + virtual void romWrite(unsigned const p, unsigned const data, unsigned long const cc) { switch (p >> 13 & 3) { case 0: enableRam_ = (data & 0xF) == 0xA; @@ -298,7 +298,7 @@ public: break; case 3: if (rtc_) - rtc_->latch(data); + rtc_->latch(data, cc); break; } @@ -356,7 +356,7 @@ public: { } - virtual void romWrite(unsigned const p, unsigned const data) { + virtual void romWrite(unsigned const p, unsigned const data, unsigned long const /*cc*/) { switch (p >> 13 & 3) { case 0: enableRam_ = (data & 0xF) == 0xA; @@ -424,7 +424,7 @@ public: { } - virtual void romWrite(unsigned const p, unsigned const data) { + virtual void romWrite(unsigned const p, unsigned const data, unsigned long const /*cc*/) { switch (p >> 13 & 3) { case 0: enableRam_ = (data & 0xF) == 0xA; @@ -487,6 +487,11 @@ static bool hasRtc(unsigned headerByte0x147) { } +Cartridge::Cartridge() +: rtc_(time_) +{ +} + void Cartridge::setStatePtrs(SaveState &state) { state.mem.vram.set(memptrs_.vramdata(), memptrs_.vramdataend() - memptrs_.vramdata()); state.mem.sram.set(memptrs_.rambankdata(), memptrs_.rambankdataend() - memptrs_.rambankdata()); @@ -652,7 +657,7 @@ static bool hasBattery(unsigned char headerByte0x147) { } } -void Cartridge::loadSavedata(char const *data) { +void Cartridge::loadSavedata(char const *data, unsigned long const cc) { if (hasBattery(memptrs_.romdata()[0x147])) { int length = memptrs_.rambankdataend() - memptrs_.rambankdata(); std::memcpy(memptrs_.rambankdata(), data, length); @@ -661,9 +666,17 @@ void Cartridge::loadSavedata(char const *data) { } if (hasRtc(memptrs_.romdata()[0x147])) { - unsigned long basetime; - std::memcpy(&basetime, data, 4); - rtc_.setBaseTime(basetime); + timeval basetime; + basetime.tv_sec = (*data++); + basetime.tv_sec = basetime.tv_sec << 8 | (*data++); + basetime.tv_sec = basetime.tv_sec << 8 | (*data++); + basetime.tv_sec = basetime.tv_sec << 8 | (*data++); + basetime.tv_usec = (*data++); + basetime.tv_usec = basetime.tv_usec << 8 | (*data++); + basetime.tv_usec = basetime.tv_usec << 8 | (*data++); + basetime.tv_usec = basetime.tv_usec << 8 | (*data++); + + time_.setBaseTime(basetime, cc); } } @@ -673,12 +686,12 @@ int Cartridge::saveSavedataLength() { ret = memptrs_.rambankdataend() - memptrs_.rambankdata(); } if (hasRtc(memptrs_.romdata()[0x147])) { - ret += 4; + ret += 8; } return ret; } -void Cartridge::saveSavedata(char *dest) { +void Cartridge::saveSavedata(char *dest, unsigned long const cc) { if (hasBattery(memptrs_.romdata()[0x147])) { int length = memptrs_.rambankdataend() - memptrs_.rambankdata(); std::memcpy(dest, memptrs_.rambankdata(), length); @@ -686,8 +699,15 @@ void Cartridge::saveSavedata(char *dest) { } if (hasRtc(memptrs_.romdata()[0x147])) { - const unsigned long basetime = rtc_.getBaseTime(); - std::memcpy(dest, &basetime, 4); + timeval basetime = time_.baseTime(cc); + *dest++ = (basetime.tv_sec >> 24 & 0xFF); + *dest++ = (basetime.tv_sec >> 16 & 0xFF); + *dest++ = (basetime.tv_sec >> 8 & 0xFF); + *dest++ = (basetime.tv_sec & 0xFF); + *dest++ = (basetime.tv_usec >> 24 & 0xFF); + *dest++ = (basetime.tv_usec >> 16 & 0xFF); + *dest++ = (basetime.tv_usec >> 8 & 0xFF); + *dest++ = (basetime.tv_usec & 0xFF); } } @@ -723,6 +743,7 @@ bool Cartridge::getMemoryArea(int which, unsigned char **data, int *length) cons SYNCFUNC(Cartridge) { SSS(memptrs_); + SSS(time_); SSS(rtc_); TSS(mbc_); } diff --git a/libgambatte/src/mem/cartridge.h b/libgambatte/src/mem/cartridge.h index 245bf537aa..db46afb262 100644 --- a/libgambatte/src/mem/cartridge.h +++ b/libgambatte/src/mem/cartridge.h @@ -21,6 +21,7 @@ #include "loadres.h" #include "memptrs.h" +#include "time.h" #include "rtc.h" #include "savestate.h" #include @@ -33,7 +34,7 @@ namespace gambatte { class Mbc { public: virtual ~Mbc() {} - virtual void romWrite(unsigned P, unsigned data) = 0; + virtual void romWrite(unsigned P, unsigned data, unsigned long cycleCounter) = 0; virtual void loadState(SaveState::Mem const &ss) = 0; virtual bool isAddressWithinAreaRombankCanBeMappedTo(unsigned address, unsigned rombank) const = 0; @@ -47,6 +48,7 @@ public: class Cartridge { public: + Cartridge(); void setStatePtrs(SaveState &); void loadState(SaveState const &); bool loaded() const { return mbc_.get(); } @@ -64,23 +66,23 @@ public: void setWrambank(unsigned bank) { memptrs_.setWrambank(bank); } void setOamDmaSrc(OamDmaSrc oamDmaSrc) { memptrs_.setOamDmaSrc(oamDmaSrc); } unsigned curRomBank() const { return memptrs_.curRomBank(); } - void mbcWrite(unsigned addr, unsigned data) { mbc_->romWrite(addr, data); } + void mbcWrite(unsigned addr, unsigned data, unsigned long const cc) { mbc_->romWrite(addr, data, cc); } bool isCgb() const { return gambatte::isCgb(memptrs_); } - void rtcWrite(unsigned data) { rtc_.write(data); } + void resetCc(unsigned long const oldCc, unsigned long const newCc) { time_.resetCc(oldCc, newCc); } + void speedChange(unsigned long const cc) { time_.speedChange(cc); } + void setTimeMode(bool useCycles, unsigned long const cc) { time_.setTimeMode(useCycles, cc); } + void rtcWrite(unsigned data, unsigned long const cc) { rtc_.write(data, cc); } unsigned char rtcRead() const { return *rtc_.activeData(); } - void loadSavedata(char const *data); + void loadSavedata(char const *data, unsigned long cycleCounter); int saveSavedataLength(); - void saveSavedata(char *dest); + void saveSavedata(char *dest, unsigned long cycleCounter); bool getMemoryArea(int which, unsigned char **data, int *length) const; LoadRes loadROM(char const *romfiledata, unsigned romfilelength, bool forceDmg, bool multicartCompat); char const * romTitle() const { return reinterpret_cast(memptrs_.romdata() + 0x134); } - void setRTCCallback(std::uint32_t (*callback)()) { - rtc_.setRTCCallback(callback); - } - private: MemPtrs memptrs_; + Time time_; Rtc rtc_; std::unique_ptr mbc_; diff --git a/libgambatte/src/mem/rtc.cpp b/libgambatte/src/mem/rtc.cpp index 5495201c4c..5b79c04d7b 100644 --- a/libgambatte/src/mem/rtc.cpp +++ b/libgambatte/src/mem/rtc.cpp @@ -22,10 +22,10 @@ namespace gambatte { -Rtc::Rtc() -: activeData_(0) +Rtc::Rtc(Time &time) +: time_(time) +, activeData_(0) , activeSet_(0) -, baseTime_(0) , haltTime_(0) , index_(5) , dataDh_(0) @@ -35,16 +35,15 @@ Rtc::Rtc() , dataS_(0) , enabled_(false) , lastLatchData_(false) -, timeCB(0) { } -void Rtc::doLatch() { - std::uint32_t tmp = ((dataDh_ & 0x40) ? haltTime_ : timeCB()) - baseTime_; +void Rtc::doLatch(unsigned long const cc) { + std::uint32_t tmp = time(cc); - while (tmp > 0x1FF * 86400) { - baseTime_ += 0x1FF * 86400; - tmp -= 0x1FF * 86400; + if (tmp >= 0x200 * 86400) { + tmp %= 0x200 * 86400; + time_.set(tmp, cc); dataDh_ |= 0x80; } @@ -91,7 +90,6 @@ void Rtc::doSwapActive() { } void Rtc::loadState(SaveState const &state) { - baseTime_ = state.rtc.baseTime; haltTime_ = state.rtc.haltTime; dataDh_ = state.rtc.dataDh; dataDl_ = state.rtc.dataDl; @@ -102,45 +100,50 @@ void Rtc::loadState(SaveState const &state) { doSwapActive(); } -void Rtc::setDh(unsigned const newDh) { - const std::uint32_t unixtime = (dataDh_ & 0x40) ? haltTime_ : timeCB(); - const std::uint32_t oldHighdays = ((unixtime - baseTime_) / 86400) & 0x100; - baseTime_ += oldHighdays * 86400; - baseTime_ -= ((newDh & 0x1) << 8) * 86400; +void Rtc::setDh(unsigned const newDh, unsigned const long cc) { + std::uint32_t seconds = time(cc); + std::uint32_t const oldHighdays = (seconds / 86400) & 0x100; + seconds -= oldHighdays * 86400; + seconds += ((newDh & 0x1) << 8) * 86400; + time_.set(seconds, cc); if ((dataDh_ ^ newDh) & 0x40) { if (newDh & 0x40) - haltTime_ = timeCB(); + haltTime_ = seconds; else - baseTime_ += timeCB() - haltTime_; + time_.set(haltTime_, cc); } } -void Rtc::setDl(unsigned const newLowdays) { - const std::uint32_t unixtime = (dataDh_ & 0x40) ? haltTime_ : timeCB(); - const std::uint32_t oldLowdays = ((unixtime - baseTime_) / 86400) & 0xFF; - baseTime_ += oldLowdays * 86400; - baseTime_ -= newLowdays * 86400; +void Rtc::setDl(unsigned const newLowdays, unsigned const long cc) { + std::uint32_t seconds = time(cc); + std::uint32_t const oldLowdays = (seconds / 86400) & 0xFF; + seconds -= oldLowdays * 86400; + seconds += newLowdays * 86400; + time_.set(seconds, cc); } -void Rtc::setH(unsigned const newHours) { - const std::uint32_t unixtime = (dataDh_ & 0x40) ? haltTime_ : timeCB(); - const std::uint32_t oldHours = ((unixtime - baseTime_) / 3600) % 24; - baseTime_ += oldHours * 3600; - baseTime_ -= newHours * 3600; +void Rtc::setH(unsigned const newHours, unsigned const long cc) { + std::uint32_t seconds = time(cc); + std::uint32_t const oldHours = (seconds / 3600) % 24; + seconds -= oldHours * 3600; + seconds += newHours * 3600; + time_.set(seconds, cc); } -void Rtc::setM(unsigned const newMinutes) { - const std::uint32_t unixtime = (dataDh_ & 0x40) ? haltTime_ : timeCB(); - const std::uint32_t oldMinutes = ((unixtime - baseTime_) / 60) % 60; - baseTime_ += oldMinutes * 60; - baseTime_ -= newMinutes * 60; +void Rtc::setM(unsigned const newMinutes, unsigned const long cc) { + std::uint32_t seconds = time(cc); + std::uint32_t const oldMinutes = (seconds / 60) % 60; + seconds -= oldMinutes * 60; + seconds += newMinutes * 60; + time_.set(seconds, cc); } -void Rtc::setS(unsigned const newSeconds) { - const std::uint32_t unixtime = (dataDh_ & 0x40) ? haltTime_ : timeCB(); - baseTime_ += (unixtime - baseTime_) % 60; - baseTime_ -= newSeconds; +void Rtc::setS(unsigned const newSeconds, unsigned const long cc) { + std::uint32_t seconds = time(cc); + seconds -= seconds % 60; + seconds += newSeconds; + time_.reset(seconds, cc); } SYNCFUNC(Rtc) @@ -161,7 +164,6 @@ SYNCFUNC(Rtc) EVS(activeSet_, &Rtc::setDh, 5); EES(activeSet_, NULL); - NSS(baseTime_); NSS(haltTime_); NSS(index_); NSS(dataDh_); diff --git a/libgambatte/src/mem/rtc.h b/libgambatte/src/mem/rtc.h index f7594e2eec..853027ed58 100644 --- a/libgambatte/src/mem/rtc.h +++ b/libgambatte/src/mem/rtc.h @@ -20,6 +20,7 @@ #define RTC_H #include +#include "time.h" #include "newstate.h" namespace gambatte { @@ -28,18 +29,12 @@ struct SaveState; class Rtc { public: - Rtc(); - + Rtc(Time &time); unsigned char const * activeData() const { return activeData_; } - std::uint32_t getBaseTime() const { return baseTime_; } - void setBaseTime(const std::uint32_t baseTime) { - this->baseTime_ = baseTime; - } - - void latch(unsigned data) { + void latch(unsigned data, unsigned long const cc) { if (!lastLatchData_ && data == 1) - doLatch(); + doLatch(cc); lastLatchData_ = data; } @@ -55,19 +50,15 @@ public: doSwapActive(); } - void write(unsigned data) { - (this->*activeSet_)(data); + void write(unsigned data, unsigned long const cc) { + (this->*activeSet_)(data, cc); *activeData_ = data; } - void setRTCCallback(std::uint32_t (*callback)()) { - timeCB = callback; - } - private: + Time &time_; unsigned char *activeData_; - void (Rtc::*activeSet_)(unsigned); - std::uint32_t baseTime_; + void (Rtc::*activeSet_)(unsigned, unsigned long); std::uint32_t haltTime_; unsigned char index_; unsigned char dataDh_; @@ -77,16 +68,18 @@ private: unsigned char dataS_; bool enabled_; bool lastLatchData_; - std::uint32_t (*timeCB)(); - void doLatch(); + void doLatch(unsigned long cycleCounter); void doSwapActive(); - void setDh(unsigned newDh); - void setDl(unsigned newLowdays); - void setH(unsigned newHours); - void setM(unsigned newMinutes); - void setS(unsigned newSeconds); + void setDh(unsigned newDh, unsigned long cycleCounter); + void setDl(unsigned newLowdays, unsigned long cycleCounter); + void setH(unsigned newHours, unsigned long cycleCounter); + void setM(unsigned newMinutes, unsigned long cycleCounter); + void setS(unsigned newSeconds, unsigned long cycleCounter); + std::uint32_t time(unsigned long const cc) { + return dataDh_ & 0x40 ? haltTime_ : time_.get(cc); + } public: templatevoid SyncState(NewState *ns); }; diff --git a/libgambatte/src/mem/time.cpp b/libgambatte/src/mem/time.cpp new file mode 100644 index 0000000000..71e92d1356 --- /dev/null +++ b/libgambatte/src/mem/time.cpp @@ -0,0 +1,144 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +// + +#include "time.h" +#include "../savestate.h" + +namespace gambatte { + +static timeval operator-(timeval l, timeval r) { + timeval t; + t.tv_sec = l.tv_sec - r.tv_sec; + t.tv_usec = l.tv_usec - r.tv_usec; + if (t.tv_usec < 0) { + t.tv_sec--; + t.tv_usec += 1000000; + } + return t; +} + +Time::Time() +: useCycles_(true) +{ +} + +void Time::loadState(SaveState const &state) { + seconds_ = state.time.seconds; + lastTime_.tv_sec = state.time.lastTimeSec; + lastTime_.tv_usec = state.time.lastTimeUsec; + lastCycles_ = state.time.lastCycles; + ds_ = state.ppu.isCgb & state.mem.ioamhram.get()[0x14D] >> 7; +} + +std::uint32_t Time::get(unsigned long const cc) { + update(cc); + return seconds_; +} + +void Time::set(std::uint32_t seconds, unsigned long const cc) { + update(cc); + seconds_ = seconds; +} + +void Time::reset(std::uint32_t seconds, unsigned long const cc) { + set(seconds, cc); + lastTime_ = now(); + lastCycles_ = cc; +} + +void Time::resetCc(unsigned long const oldCc, unsigned long const newCc) { + update(oldCc); + lastCycles_ -= oldCc - newCc; +} + +void Time::speedChange(unsigned long const cc) { + update(cc); + + if (useCycles_) { + unsigned long diff = cc - lastCycles_; + lastCycles_ = cc - (ds_ ? diff >> 1 : diff << 1); + } + + ds_ = !ds_; +} + +timeval Time::baseTime(unsigned long const cc) { + if (useCycles_) + timeFromCycles(cc); + + timeval baseTime = lastTime_; + baseTime.tv_sec -= seconds_; + return baseTime; +} + +void Time::setBaseTime(timeval baseTime, unsigned long const cc) { + seconds_ = (now() - baseTime).tv_sec; + lastTime_ = baseTime; + lastTime_.tv_sec += seconds_; + + if (useCycles_) + cyclesFromTime(cc); +} + +void Time::setTimeMode(bool useCycles, unsigned long const cc) { + if (useCycles != useCycles_) { + if (useCycles_) + timeFromCycles(cc); + else + cyclesFromTime(cc); + + useCycles_ = useCycles; + } +} + +void Time::update(unsigned long const cc) { + if (useCycles_) { + std::uint32_t diff = (cc - lastCycles_) / (0x400000 << ds_); + seconds_ += diff; + lastCycles_ += diff * (0x400000 << ds_); + } else { + std::uint32_t diff = (now() - lastTime_).tv_sec; + seconds_ += diff; + lastTime_.tv_sec += diff; + } +} + +void Time::cyclesFromTime(unsigned long const cc) { + update(cc); + timeval diff = now() - lastTime_; + lastCycles_ = cc - diff.tv_usec * ((0x400000 << ds_) / 1000000.0f); +} + +void Time::timeFromCycles(unsigned long const cc) { + update(cc); + unsigned long diff = cc - lastCycles_; + timeval usec = { 0, (long)(diff / ((0x400000 << ds_) / 1000000.0f)) }; + lastTime_ = now() - usec; +} + +SYNCFUNC(Time) +{ + NSS(seconds_); + NSS(lastTime_.tv_sec); + NSS(lastTime_.tv_usec); + NSS(lastCycles_); + NSS(useCycles_); + NSS(ds_); +} + +} diff --git a/libgambatte/src/mem/time.h b/libgambatte/src/mem/time.h new file mode 100644 index 0000000000..aa8e49b5e3 --- /dev/null +++ b/libgambatte/src/mem/time.h @@ -0,0 +1,78 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +// + +#ifndef TIME_H +#define TIME_H + +#include +#include +#include +#include "newstate.h" + +namespace gambatte { + +struct SaveState; + +struct timeval { + std::uint32_t tv_sec; + std::uint32_t tv_usec; +}; + +class Time { +public: + static timeval now() { + long long micros = std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()) + .count(); + timeval t; + t.tv_usec = micros % 1000000; + t.tv_sec = micros / 1000000; + return t; + } + + Time(); + void loadState(SaveState const &state); + + std::uint32_t get(unsigned long cycleCounter); + void set(std::uint32_t seconds, unsigned long cycleCounter); + void reset(std::uint32_t seconds, unsigned long cycleCounter); + void resetCc(unsigned long oldCc, unsigned long newCc); + void speedChange(unsigned long cycleCounter); + + timeval baseTime(unsigned long cycleCounter); + void setBaseTime(timeval baseTime, unsigned long cycleCounter); + void setTimeMode(bool useCycles, unsigned long cycleCounter); + +private: + std::uint32_t seconds_; + timeval lastTime_; + unsigned long lastCycles_; + bool useCycles_; + bool ds_; + + void update(unsigned long cycleCounter); + void cyclesFromTime(unsigned long cycleCounter); + void timeFromCycles(unsigned long cycleCounter); + +public: + templatevoid SyncState(NewState *ns); +}; + +} + +#endif diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index 2e39855eda..6ddce9da05 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -345,6 +345,7 @@ unsigned long Memory::stop(unsigned long cc) { if (ioamhram_[0x14D] & isCgb()) { psg_.generateSamples(cc + 4, isDoubleSpeed()); lcd_.speedChange((cc + 7) & ~7); + cart_.speedChange(cc); ioamhram_[0x14D] ^= 0x81; intreq_.setEventTime(ioamhram_[0x140] & lcdc_en ? lcd_.nextMode1IrqTime() @@ -403,6 +404,7 @@ unsigned long Memory::resetCounters(unsigned long cc) { unsigned long const oldCC = cc; cc -= dec; intreq_.resetCc(oldCC, cc); + cart_.resetCc(oldCC, cc); tima_.resetCc(oldCC, cc, TimaInterruptRequester(intreq_)); lcd_.resetCc(oldCC, cc); psg_.resetCounter(cc, oldCC, isDoubleSpeed()); @@ -1099,7 +1101,7 @@ void Memory::nontrivial_write(unsigned const p, unsigned const data, unsigned lo if (p < 0xFE00) { if (p < 0xA000) { if (p < 0x8000) { - cart_.mbcWrite(p, data); + cart_.mbcWrite(p, data, cc); } else if (lcd_.vramAccessible(cc)) { lcd_.vramChange(cc); cart_.vrambankptr()[p] = data; @@ -1108,7 +1110,7 @@ void Memory::nontrivial_write(unsigned const p, unsigned const data, unsigned lo if (cart_.wsrambankptr()) cart_.wsrambankptr()[p] = data; else - cart_.rtcWrite(data); + cart_.rtcWrite(data, cc); } else cart_.wramdata(p >> 12 & 1)[p & 0xFFF] = data; } else if (p - 0xFF80u >= 0x7Fu) { diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 051a5ea904..f00e28ac24 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -29,6 +29,7 @@ static unsigned char const agbOverride[0xD] = { 0xFF, 0x00, 0xCD, 0x03, 0x35, 0x #include "gambatte.h" namespace gambatte { + class FilterInfo; class Memory { @@ -42,9 +43,9 @@ public: int debugGetLY() const { return lcd_.debugGetLY(); } void setStatePtrs(SaveState &state); void loadState(SaveState const &state); - void loadSavedata(char const *data) { cart_.loadSavedata(data); } + void loadSavedata(char const *data, unsigned long const cc) { cart_.loadSavedata(data, cc); } int saveSavedataLength() {return cart_.saveSavedataLength(); } - void saveSavedata(char *dest) { cart_.saveSavedata(dest); } + void saveSavedata(char *dest, unsigned long const cc) { cart_.saveSavedata(dest, cc); } void updateInput(); void setBios(char const *buffer, std::size_t size) { @@ -243,10 +244,6 @@ public: lcd_.setScanlineCallback(callback, sl); } - void setRTCCallback(std::uint32_t (*callback)()) { - cart_.setRTCCallback(callback); - } - void setLinkCallback(void(*callback)()) { this->linkCallback_ = callback; } @@ -266,6 +263,9 @@ public: } void setCgbPalette(unsigned *lut); + void setTimeMode(bool useCycles, unsigned long const cc) { + cart_.setTimeMode(useCycles, cc); + } int linkStatus(int which); diff --git a/libgambatte/src/savestate.h b/libgambatte/src/savestate.h index e56290685d..c130ab5ecb 100644 --- a/libgambatte/src/savestate.h +++ b/libgambatte/src/savestate.h @@ -36,7 +36,7 @@ struct SaveState { void set(T *p, std::size_t size) { ptr = p; size_ = size; } friend class SaverList; - friend void setInitState(SaveState &, bool, bool, std::uint32_t, unsigned); + friend void setInitState(SaveState &, bool, bool); private: T *ptr; std::size_t size_; @@ -190,8 +190,14 @@ struct SaveState { unsigned long cycleCounter; } spu; + struct Time { + unsigned long seconds; + unsigned long lastTimeSec; + unsigned long lastTimeUsec; + unsigned long lastCycles; + } time; + struct RTC { - unsigned long baseTime; unsigned long haltTime; unsigned char dataDh; unsigned char dataDl; diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 2d96928fd030cb9b9bd00955371f0b3847f7a58e..17b09b4e0ac45dce42e273eb93cc6acafc2ba02c 100644 GIT binary patch delta 70820 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 AcmMzZ