BizHawk/BizHawk.Emulation.Cores/Consoles/Nintendo/SubNESHawk/SubNESHawk.IEmulator.cs

110 lines
2.2 KiB
C#

using System;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Nintendo.SubNESHawk
{
public partial class SubNESHawk : IEmulator
{
public IEmulatorServiceProvider ServiceProvider { get; }
public ControllerDefinition ControllerDefinition => _nesCore.ControllerDefinition;
public bool FrameAdvance(IController controller, bool render, bool renderSound)
{
//Console.WriteLine("-----------------------FRAME-----------------------");
if (_tracer.Enabled)
{
_nesCore.cpu.TraceCallback = s => _tracer.Put(s);
}
else
{
_nesCore.cpu.TraceCallback = null;
}
_frame++;
if (controller.IsPressed("Power"))
{
HardReset();
}
reset_frame = false;
if (controller.IsPressed("Reset"))
{
reset_frame = true;
}
reset_cycle = controller.AxisValue("Reset Cycle");
reset_cycle_int = (int)Math.Floor(reset_cycle);
_isLag = true;
_nesCore.alt_lag = true;
InputCallbacks.Call();
DoFrame(controller);
bool ret = pass_a_frame;
if (pass_a_frame)
{
_nesCore.videoProvider.FillFrameBuffer();
current_cycle = 0;
_nesCore.cpu.ext_ppu_cycle = current_cycle;
}
_isLag = _nesCore.alt_lag;
if (_isLag)
{
_lagCount++;
VBL_CNT++;
}
reset_frame = false;
return ret;
}
private bool stop_cur_frame;
private bool pass_new_input;
private bool pass_a_frame;
private bool reset_frame;
private int current_cycle;
private float reset_cycle;
private int reset_cycle_int;
private void DoFrame(IController controller)
{
stop_cur_frame = false;
while (!stop_cur_frame)
{
if (reset_frame && (current_cycle == reset_cycle_int))
{
SoftReset();
reset_frame = false;
}
_nesCore.do_single_step(controller, out pass_new_input, out pass_a_frame);
current_cycle++;
_nesCore.cpu.ext_ppu_cycle = current_cycle;
stop_cur_frame |= pass_a_frame;
stop_cur_frame |= pass_new_input;
}
}
public int Frame => _frame;
public string SystemId => "NES";
public bool DeterministicEmulation => _nesCore.DeterministicEmulation;
public void ResetCounters()
{
_frame = 0;
_lagCount = 0;
_isLag = false;
}
public void Dispose() => _nesCore.Dispose();
}
}