110 lines
2.2 KiB
C#
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();
|
|
}
|
|
}
|