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