NESHawk: update start up state and some cleanups

This commit is contained in:
alyosha-tas 2021-12-16 22:03:25 -05:00
parent aa6f74108e
commit b821012099
3 changed files with 25 additions and 23 deletions

View File

@ -664,7 +664,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
out_silence = true;
DMC_RATE = pal ? DMC_RATE_PAL : DMC_RATE_NTSC;
timer_reload = DMC_RATE[0];
timer = 1020; // confirmed in VisualNES although aligning controller read glitches still doesn't work
timer = 1023; // confirmed in VisualNES although aligning controller read glitches still doesn't work
sample_buffer_filled = false;
out_deltacounter = 64;
out_bits_remaining = 7; //confirmed in VisualNES
@ -939,13 +939,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
ser.Sync(nameof(sequence_reset_pending), ref sequence_reset_pending);
ser.Sync(nameof(sequencer_irq_clear_pending), ref sequencer_irq_clear_pending);
ser.Sync(nameof(sequencer_irq_assert), ref sequencer_irq_assert);
ser.Sync(nameof(sequencer_check_1), ref sequencer_check_1);
ser.Sync(nameof(sequencer_check_2), ref sequencer_check_2);
ser.Sync(nameof(dmc_dma_countdown), ref dmc_dma_countdown);
ser.Sync(nameof(DMC_RDY_check), ref DMC_RDY_check);
ser.Sync("sample_length_delay", ref pending_length_change);
ser.Sync("dmc_called_from_write", ref call_from_write);
ser.Sync("sequencer_tick_delay", ref seq_tick);
ser.Sync("seq_val_to_apply", ref seq_val);
ser.Sync(nameof(call_from_write), ref call_from_write);
ser.Sync(nameof(seq_tick), ref seq_tick);
ser.Sync(nameof(seq_val), ref seq_val);
ser.Sync(nameof(sequencer_irq_flag), ref sequencer_irq_flag);
ser.Sync(nameof(len_clock_active), ref len_clock_active);
@ -985,6 +986,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
private readonly int[][] sequencer_lut = new int[2][];
private int sequencer_check_1, sequencer_check_2;
private static readonly int[][] sequencer_lut_ntsc = {
new[]{7457,14913,22371,29830},
new[]{7457,14913,22371,29830,37282}
@ -1024,6 +1027,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
sequencer_counter = 0;
sequencer_step = 0;
if (sequencer_mode == 0) { sequencer_check_2 = sequencer_lut[0][3] - 2; }
else { sequencer_check_2 = sequencer_lut[1][4] - 2; }
}
}
}
@ -1133,6 +1139,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
}
sequencer_counter = 0;
sequencer_step = 0;
sequencer_check_1 = (sequencer_lut[0][1] - 1);
if(sequencer_mode == 0) { sequencer_check_2 = sequencer_lut[0][3] - 2; }
else { sequencer_check_2 = sequencer_lut[1][4] - 2; }
}
public void NESHardReset()
@ -1140,6 +1151,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
// "at power on it is as if $00 was written to $4017 9-12 cycles before the reset vector"
// that translates to a starting value for the counter of -3
sequencer_counter = -1;
sequencer_check_1 = (sequencer_lut[0][1] - 1);
if (sequencer_mode == 0) { sequencer_check_2 = sequencer_lut[0][3] - 2; }
else { sequencer_check_2 = sequencer_lut[1][4] - 2; }
}
public void WriteReg(int addr, byte val)
@ -1242,8 +1258,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public int DebugCallbackDivider;
public int DebugCallbackTimer;
private int pending_length_change;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void RunOneFirst()
{
@ -1261,22 +1275,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public void RunOneLast()
{
if (pending_length_change > 0)
{
pending_length_change--;
if (pending_length_change == 0)
{
dmc.sample_length--;
}
}
// we need to predict if there will be a length clock here, because the sequencer ticks last, but the
// timer reload shouldn't happen if length clock and write happen simultaneously
// I'm not sure if we can avoid this by simply processing the sequencer first
// but at the moment that would break everything, so this is good enough for now
if (sequencer_counter == (sequencer_lut[0][1] - 1) ||
(sequencer_counter == sequencer_lut[0][3] - 2 && sequencer_mode == 0) ||
(sequencer_counter == sequencer_lut[1][4] - 2 && sequencer_mode == 1))
if ((sequencer_counter == sequencer_check_1) || (sequencer_counter == sequencer_check_2))
{
len_clock_active = true;
}
@ -1287,7 +1290,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
// the current code simply matches known behaviour
if (pending_reg != -1)
{
if (pending_reg == 0x4015 || pending_reg == 0x4015 || pending_reg == 0x4003 || pending_reg == 0x4007)
if (pending_reg == 0x4015 || pending_reg == 0x4003 || pending_reg == 0x4007)
{
_WriteReg(pending_reg, pending_val);
pending_reg = -1;
@ -1320,7 +1323,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
// since the units run concurrently, the APU frame sequencer is ran last because
// it can change the output values of the pulse/triangle channels
// we want the changes to affect it on the *next* cycle.
if (sequencer_irq_flag == false)
sequencer_irq = false;

View File

@ -88,7 +88,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public bool CanProvideAsync => false;
public void ResetControllerDefinition()
internal void ResetControllerDefinition()
{
ControllerDefinition = null;

View File

@ -358,7 +358,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
ppu_open_bus = 0;
ppu_open_bus_decay_timer = new int[8];
double_2007_read = 0;
start_up_offset = 4;
start_up_offset = 3;
}
private void runppu()