Hackadoodle to change the initial value of the DIV register? This is probably a bad idea
This commit is contained in:
parent
7ae374df01
commit
bd23975201
|
@ -132,6 +132,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
[DeepEqualsIgnore]
|
[DeepEqualsIgnore]
|
||||||
private bool _equalLengthFrames;
|
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()
|
public GambatteSyncSettings()
|
||||||
{
|
{
|
||||||
SettingsUtil.SetDefaultValues(this);
|
SettingsUtil.SetDefaultValues(this);
|
||||||
|
@ -146,6 +151,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
{
|
{
|
||||||
return !DeepEquality.DeepEquals(x, y);
|
return !DeepEquality.DeepEquals(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public uint GetInitialDivInternal()
|
||||||
|
{
|
||||||
|
return (uint)(InitialDiv & 0xfffc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
|
|
||||||
real_rtc_time = !DeterministicEmulation && _syncSettings.RealTimeRTC;
|
real_rtc_time = !DeterministicEmulation && _syncSettings.RealTimeRTC;
|
||||||
|
|
||||||
|
DivInternal = _syncSettings.GetInitialDivInternal();
|
||||||
|
|
||||||
LibGambatte.LoadFlags flags = 0;
|
LibGambatte.LoadFlags flags = 0;
|
||||||
|
|
||||||
switch (_syncSettings.ConsoleMode)
|
switch (_syncSettings.ConsoleMode)
|
||||||
|
@ -88,7 +90,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
flags |= LibGambatte.LoadFlags.MULTICART_COMPAT;
|
flags |= LibGambatte.LoadFlags.MULTICART_COMPAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LibGambatte.gambatte_load(GambatteState, file, (uint)file.Length, GetCurrentTime(), flags) != 0)
|
if (LibGambatte.gambatte_load(GambatteState, file, (uint)file.Length, GetCurrentTime(), flags, DivInternal) != 0)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("gambatte_load() returned non-zero (is this not a gb or gbc rom?)");
|
throw new InvalidOperationException("gambatte_load() returned non-zero (is this not a gb or gbc rom?)");
|
||||||
}
|
}
|
||||||
|
@ -172,6 +174,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private LibGambatte.Buttons CurrentButtons = 0;
|
private LibGambatte.Buttons CurrentButtons = 0;
|
||||||
|
|
||||||
|
private uint DivInternal = 0;
|
||||||
|
|
||||||
#region RTC
|
#region RTC
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -322,7 +326,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
|
|
||||||
if (controller.IsPressed("Power"))
|
if (controller.IsPressed("Power"))
|
||||||
{
|
{
|
||||||
LibGambatte.gambatte_reset(GambatteState, GetCurrentTime());
|
LibGambatte.gambatte_reset(GambatteState, GetCurrentTime(), DivInternal);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Tracer.Enabled)
|
if (Tracer.Enabled)
|
||||||
|
|
|
@ -57,7 +57,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
/// <param name="flags">ORed combination of LoadFlags.</param>
|
/// <param name="flags">ORed combination of LoadFlags.</param>
|
||||||
/// <returns>0 on success, negative value on failure.</returns>
|
/// <returns>0 on success, negative value on failure.</returns>
|
||||||
[DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)]
|
[DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||||
public static extern int gambatte_load(IntPtr core, byte[] romdata, uint length, long now, LoadFlags flags);
|
public static extern int gambatte_load(IntPtr core, byte[] romdata, uint length, long now, LoadFlags flags, uint div);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Load GB BIOS image.
|
/// Load GB BIOS image.
|
||||||
|
@ -124,7 +124,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
/// <param name="core">opaque state pointer</param>
|
/// <param name="core">opaque state pointer</param>
|
||||||
/// <param name="now">RTC time when the reset occurs</param>
|
/// <param name="now">RTC time when the reset occurs</param>
|
||||||
[DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)]
|
[DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||||
public static extern void gambatte_reset(IntPtr core, long now);
|
public static extern void gambatte_reset(IntPtr core, long now, uint div);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// palette type for gambatte_setdmgpalettecolor
|
/// palette type for gambatte_setdmgpalettecolor
|
||||||
|
|
|
@ -60,7 +60,7 @@ public:
|
||||||
* @param flags ORed combination of LoadFlags.
|
* @param flags ORed combination of LoadFlags.
|
||||||
* @return 0 on success, negative value on failure.
|
* @return 0 on success, negative value on failure.
|
||||||
*/
|
*/
|
||||||
int load(const char *romfiledata, unsigned romfilelength, std::uint32_t now, unsigned flags = 0);
|
int load(const char *romfiledata, unsigned romfilelength, std::uint32_t now, unsigned flags, unsigned div);
|
||||||
|
|
||||||
int loadGBCBios(const char* biosfiledata);
|
int loadGBCBios(const char* biosfiledata);
|
||||||
int loadDMGBios(const char* biosfiledata);
|
int loadDMGBios(const char* biosfiledata);
|
||||||
|
@ -93,7 +93,7 @@ public:
|
||||||
/** Reset to initial state.
|
/** Reset to initial state.
|
||||||
* Equivalent to reloading a ROM image, or turning a Game Boy Color off and on again.
|
* Equivalent to reloading a ROM image, or turning a Game Boy Color off and on again.
|
||||||
*/
|
*/
|
||||||
void reset(std::uint32_t now);
|
void reset(std::uint32_t now, unsigned div);
|
||||||
|
|
||||||
/** @param palNum 0 <= palNum < 3. One of BG_PALETTE, SP1_PALETTE and SP2_PALETTE.
|
/** @param palNum 0 <= palNum < 3. One of BG_PALETTE, SP1_PALETTE and SP2_PALETTE.
|
||||||
* @param colorNum 0 <= colorNum < 4
|
* @param colorNum 0 <= colorNum < 4
|
||||||
|
|
|
@ -29,9 +29,9 @@ GBEXPORT void gambatte_destroy(GB *g)
|
||||||
delete g;
|
delete g;
|
||||||
}
|
}
|
||||||
|
|
||||||
GBEXPORT int gambatte_load(GB *g, const char *romfiledata, unsigned romfilelength, long long now, unsigned flags)
|
GBEXPORT int gambatte_load(GB *g, const char *romfiledata, unsigned romfilelength, long long now, unsigned flags, unsigned div)
|
||||||
{
|
{
|
||||||
int ret = g->load(romfiledata, romfilelength, now, flags);
|
int ret = g->load(romfiledata, romfilelength, now, flags, div);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,9 +65,9 @@ GBEXPORT void gambatte_setlayers(GB *g, unsigned mask)
|
||||||
g->setLayers(mask);
|
g->setLayers(mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
GBEXPORT void gambatte_reset(GB *g, long long now)
|
GBEXPORT void gambatte_reset(GB *g, long long now, unsigned div)
|
||||||
{
|
{
|
||||||
g->reset(now);
|
g->reset(now, div);
|
||||||
}
|
}
|
||||||
|
|
||||||
GBEXPORT void gambatte_setdmgpalettecolor(GB *g, unsigned palnum, unsigned colornum, unsigned rgb32)
|
GBEXPORT void gambatte_setdmgpalettecolor(GB *g, unsigned palnum, unsigned colornum, unsigned rgb32)
|
||||||
|
|
|
@ -81,7 +81,7 @@ void GB::blitTo(gambatte::uint_least32_t *videoBuf, int pitch)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GB::reset(const std::uint32_t now) {
|
void GB::reset(const std::uint32_t now, const unsigned div) {
|
||||||
if (p_->cpu.loaded()) {
|
if (p_->cpu.loaded()) {
|
||||||
|
|
||||||
int length = p_->cpu.saveSavedataLength();
|
int length = p_->cpu.saveSavedataLength();
|
||||||
|
@ -94,7 +94,7 @@ void GB::reset(const std::uint32_t now) {
|
||||||
|
|
||||||
SaveState state;
|
SaveState state;
|
||||||
p_->cpu.setStatePtrs(state);
|
p_->cpu.setStatePtrs(state);
|
||||||
setInitState(state, !(p_->loadflags & FORCE_DMG), p_->loadflags & GBA_CGB, now);
|
setInitState(state, !(p_->loadflags & FORCE_DMG), p_->loadflags & GBA_CGB, now, div);
|
||||||
p_->cpu.loadState(state);
|
p_->cpu.loadState(state);
|
||||||
if (length > 0)
|
if (length > 0)
|
||||||
{
|
{
|
||||||
|
@ -140,7 +140,7 @@ void GB::setLinkCallback(void(*callback)()) {
|
||||||
p_->cpu.setLinkCallback(callback);
|
p_->cpu.setLinkCallback(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
int GB::load(const char *romfiledata, unsigned romfilelength, const std::uint32_t now, const unsigned flags) {
|
int GB::load(const char *romfiledata, unsigned romfilelength, const std::uint32_t now, const unsigned flags, const unsigned div) {
|
||||||
//if (p_->cpu.loaded())
|
//if (p_->cpu.loaded())
|
||||||
// p_->cpu.saveSavedata();
|
// p_->cpu.saveSavedata();
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ int GB::load(const char *romfiledata, unsigned romfilelength, const std::uint32_
|
||||||
SaveState state;
|
SaveState state;
|
||||||
p_->cpu.setStatePtrs(state);
|
p_->cpu.setStatePtrs(state);
|
||||||
p_->loadflags = flags;
|
p_->loadflags = flags;
|
||||||
setInitState(state, !(flags & FORCE_DMG), flags & GBA_CGB, now);
|
setInitState(state, !(flags & FORCE_DMG), flags & GBA_CGB, now, div);
|
||||||
p_->cpu.loadState(state);
|
p_->cpu.loadState(state);
|
||||||
//p_->cpu.loadSavedata();
|
//p_->cpu.loadSavedata();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1146,7 +1146,7 @@ static void setInitialDmgIoamhram(unsigned char *const ioamhram) {
|
||||||
|
|
||||||
} // anon namespace
|
} // anon namespace
|
||||||
|
|
||||||
void gambatte::setInitState(SaveState &state, const bool cgb, const bool gbaCgbMode, const std::uint32_t now) {
|
void gambatte::setInitState(SaveState &state, const bool cgb, const bool gbaCgbMode, const std::uint32_t now, const unsigned div) {
|
||||||
static const unsigned char cgbObjpDump[0x40] = {
|
static const unsigned char cgbObjpDump[0x40] = {
|
||||||
0x00, 0x00, 0xF2, 0xAB,
|
0x00, 0x00, 0xF2, 0xAB,
|
||||||
0x61, 0xC2, 0xD9, 0xBA,
|
0x61, 0xC2, 0xD9, 0xBA,
|
||||||
|
@ -1198,7 +1198,7 @@ void gambatte::setInitState(SaveState &state, const bool cgb, const bool gbaCgbM
|
||||||
state.mem.ioamhram.ptr[0x140] = 0;
|
state.mem.ioamhram.ptr[0x140] = 0;
|
||||||
state.mem.ioamhram.ptr[0x144] = 0x00;
|
state.mem.ioamhram.ptr[0x144] = 0x00;
|
||||||
|
|
||||||
state.mem.divLastUpdate = 0;
|
state.mem.divLastUpdate = 0 - div;
|
||||||
state.mem.timaLastUpdate = 0;
|
state.mem.timaLastUpdate = 0;
|
||||||
state.mem.tmatime = DISABLED_TIME;
|
state.mem.tmatime = DISABLED_TIME;
|
||||||
state.mem.nextSerialtime = DISABLED_TIME;
|
state.mem.nextSerialtime = DISABLED_TIME;
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
namespace gambatte {
|
namespace gambatte {
|
||||||
void setInitState(struct SaveState &state, bool cgb, bool gbaCgbMode, std::uint32_t now);
|
void setInitState(struct SaveState &state, bool cgb, bool gbaCgbMode, std::uint32_t now, unsigned div);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -38,7 +38,7 @@ struct SaveState {
|
||||||
void set(T *ptr, const unsigned long sz) { this->ptr = ptr; this->sz = sz; }
|
void set(T *ptr, const unsigned long sz) { this->ptr = ptr; this->sz = sz; }
|
||||||
|
|
||||||
friend class SaverList;
|
friend class SaverList;
|
||||||
friend void setInitState(SaveState &, bool, bool, std::uint32_t);
|
friend void setInitState(SaveState &, bool, bool, std::uint32_t, unsigned);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CPU {
|
struct CPU {
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue