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

142 lines
3.1 KiB
C#

using System;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Nintendo.SubGBHawk
{
public partial class SubGBHawk : IEmulator
{
public IEmulatorServiceProvider ServiceProvider { get; }
public ControllerDefinition ControllerDefinition => _GBCore.ControllerDefinition;
public bool FrameAdvance(IController controller, bool render, bool renderSound)
{
//Console.WriteLine("-----------------------FRAME-----------------------");
//Update the color palette if a setting changed
if (GetSettings().Palette == GBHawk.GBHawk.GBSettings.PaletteType.BW)
{
_GBCore.ppu.color_palette[0] = GBHawk.GBHawk.color_palette_BW[0];
_GBCore.ppu.color_palette[1] = GBHawk.GBHawk.color_palette_BW[1];
_GBCore.ppu.color_palette[2] = GBHawk.GBHawk.color_palette_BW[2];
_GBCore.ppu.color_palette[3] = GBHawk.GBHawk.color_palette_BW[3];
}
else
{
_GBCore.ppu.color_palette[0] = GBHawk.GBHawk.color_palette_Gr[0];
_GBCore.ppu.color_palette[1] = GBHawk.GBHawk.color_palette_Gr[1];
_GBCore.ppu.color_palette[2] = GBHawk.GBHawk.color_palette_Gr[2];
_GBCore.ppu.color_palette[3] = GBHawk.GBHawk.color_palette_Gr[3];
}
if (_tracer.Enabled)
{
_GBCore.cpu.TraceCallback = s => _tracer.Put(s);
}
else
{
_GBCore.cpu.TraceCallback = null;
}
_frame++;
reset_frame = false;
if (controller.IsPressed("P1 Power"))
{
reset_frame = true;
}
input_frame_length = controller.AxisValue("Input Cycle");
input_frame_length_int = (int)Math.Floor(input_frame_length);
if (input_frame_length_int == 0)
{
input_frame_length_int = 70224;
}
pass_a_frame = false;
InputCallbacks.Call();
DoFrame(controller);
bool ret = pass_a_frame;
if (pass_a_frame) { frame_cycle = 0; }
current_cycle = 0;
_isLag = pass_a_frame;
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 int frame_cycle;
private float input_frame_length;
private int input_frame_length_int;
private void DoFrame(IController controller)
{
stop_cur_frame = false;
_GBCore.GetControllerState(controller);
_GBCore.do_controller_check();
while (!stop_cur_frame)
{
_GBCore.do_single_step();
if (reset_frame)
{
HardReset();
reset_frame = false;
stop_cur_frame |= true;
pass_a_frame |= true;
}
current_cycle++;
frame_cycle++;
if (frame_cycle == 70224)
{
stop_cur_frame |= true;
pass_a_frame |= true;
}
if (current_cycle == input_frame_length_int)
{
stop_cur_frame |= true;
}
if (_GBCore.vblank_rise)
{
_GBCore.SendVideoBuffer();
_GBCore.vblank_rise = false;
}
}
}
public int Frame => _frame;
public string SystemId => "GB";
public bool DeterministicEmulation => _GBCore.DeterministicEmulation;
public void ResetCounters()
{
_frame = 0;
_lagCount = 0;
_isLag = false;
}
public void Dispose() => _GBCore.Dispose();
}
}