Clean up subframe inputs: fixes #3111 as well as a bug in SubNEShawk where using zapper prevented reset cycle from appearing

This commit is contained in:
alyosha-tas 2022-01-31 09:55:23 -05:00
parent 850d8e027c
commit 8e7be7c1f2
6 changed files with 15 additions and 20 deletions

View File

@ -130,7 +130,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
[CoreConstructor(VSystemID.Raw.GB)]
[CoreConstructor(VSystemID.Raw.GBC)]
public GBHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ GBSettings settings, GBSyncSettings syncSettings)
public GBHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ GBSettings settings, GBSyncSettings syncSettings, bool subframe = false)
{
var ser = new BasicServiceProvider(this);
@ -199,7 +199,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
_controllerDeck = new(mppr is "MBC7"
? typeof(StandardTilt).DisplayName()
: GBHawkControllerDeck.DefaultControllerName);
: GBHawkControllerDeck.DefaultControllerName, subframe);
timer.Core = this;
audio.Core = this;

View File

@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{
public class GBHawkControllerDeck
{
public GBHawkControllerDeck(string controller1Name)
public GBHawkControllerDeck(string controller1Name, bool subframe)
{
Port1 = ControllerCtors.TryGetValue(controller1Name, out var ctor1)
? ctor1(1)
@ -24,6 +24,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
foreach (var kvp in Port1.Definition.Axes) Definition.Axes.Add(kvp);
if (subframe)
{
Definition.AddAxis("Input Cycle", 0.RangeTo(70224), 70224);
}
Definition.MakeImmutable();
}

View File

@ -88,7 +88,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public bool CanProvideAsync => false;
internal void ResetControllerDefinition()
internal void ResetControllerDefinition(bool subframe)
{
ControllerDefinition = null;
@ -115,7 +115,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
}
// Add in the reset timing axis for subneshawk
if (using_reset_timing && ControllerDefinition.Axes.Count == 0)
if (subframe)
{
ControllerDefinition.AddAxis("Reset Cycle", 0.RangeTo(500000), 0);
}
@ -398,8 +398,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public bool current_strobe;
public bool new_strobe;
public bool alt_lag;
// variable used with subneshawk to trigger reset at specific cycle after reset
public bool using_reset_timing = false;
// this function will run one step of the ppu
// it will return whether the controller is read or not.
public void do_single_step(IController controller, out bool cont_read, out bool frame_done)

View File

@ -14,7 +14,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
IBoardInfo, IRomInfo, ISettable<NES.NESSettings, NES.NESSyncSettings>, ICodeDataLogger
{
[CoreConstructor(VSystemID.Raw.NES)]
public NES(CoreComm comm, GameInfo game, byte[] rom, NESSettings settings, NESSyncSettings syncSettings)
public NES(CoreComm comm, GameInfo game, byte[] rom, NESSettings settings, NESSyncSettings syncSettings, bool subframe = false)
{
var ser = new BasicServiceProvider(this);
ServiceProvider = ser;
@ -71,7 +71,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
}
}
ResetControllerDefinition();
ResetControllerDefinition(subframe);
}
private static readonly bool USE_DATABASE = true;

View File

@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SubGBHawk
var subGBSettings = (GBHawk.GBHawk.GBSettings)settings ?? new GBHawk.GBHawk.GBSettings();
var subGBSyncSettings = (GBHawk.GBHawk.GBSyncSettings)syncSettings ?? new GBHawk.GBHawk.GBSyncSettings();
_GBCore = new GBHawk.GBHawk(comm, game, rom, subGBSettings, subGBSyncSettings);
_GBCore = new GBHawk.GBHawk(comm, game, rom, subGBSettings, subGBSyncSettings, true);
HardReset();
current_cycle = 0;
@ -41,9 +41,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.SubGBHawk
_tracer = new TraceBuffer(_GBCore.cpu.TraceHeader);
ser.Register(_tracer);
_GBCore.ControllerDefinition.AddAxis("Input Cycle", 0.RangeTo(70224), 70224)
.MakeImmutable();
}
public GBHawk.GBHawk _GBCore;

View File

@ -14,13 +14,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SubNESHawk
var subNesSettings = (NES.NES.NESSettings)settings ?? new NES.NES.NESSettings();
var subNesSyncSettings = (NES.NES.NESSyncSettings)syncSettings ?? new NES.NES.NESSyncSettings();
_nesCore = new NES.NES(comm, game, rom, subNesSettings, subNesSyncSettings)
{
using_reset_timing = true
};
// Adds Reset timing control to controller definition
_nesCore.ResetControllerDefinition();
_nesCore = new NES.NES(comm, game, rom, subNesSettings, subNesSyncSettings, true);
HardReset();
current_cycle = 0;