NES APU improvements
passes some more of the test_apu_2 tests
This commit is contained in:
parent
64e9a70d26
commit
05304b465b
|
@ -1016,6 +1016,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
bool irq_pending;
|
bool irq_pending;
|
||||||
bool dmc_irq;
|
bool dmc_irq;
|
||||||
int pending_reg = -1;
|
int pending_reg = -1;
|
||||||
|
bool doing_tick_quarter = false;
|
||||||
byte pending_val = 0;
|
byte pending_val = 0;
|
||||||
public int seq_tick;
|
public int seq_tick;
|
||||||
public byte seq_val;
|
public byte seq_val;
|
||||||
|
@ -1032,14 +1033,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
void sequencer_reset()
|
void sequencer_reset()
|
||||||
{
|
{
|
||||||
sequencer_counter = 0;
|
sequencer_counter = 0;
|
||||||
|
|
||||||
if (sequencer_mode == 1)
|
|
||||||
{
|
|
||||||
sequencer_step = 0;
|
|
||||||
QuarterFrame();
|
|
||||||
HalfFrame();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sequencer_step = 0;
|
sequencer_step = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1062,6 +1055,20 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
if (seq_tick>0)
|
if (seq_tick>0)
|
||||||
{
|
{
|
||||||
seq_tick--;
|
seq_tick--;
|
||||||
|
|
||||||
|
// check if we will be doing the extra frame ticks or not
|
||||||
|
if (seq_tick==0)
|
||||||
|
{
|
||||||
|
if (((val >> 7) & 1) > 0)
|
||||||
|
{
|
||||||
|
if (!doing_tick_quarter)
|
||||||
|
{
|
||||||
|
QuarterFrame();
|
||||||
|
HalfFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (seq_tick==0)
|
if (seq_tick==0)
|
||||||
{
|
{
|
||||||
sequencer_mode = (val >> 7) & 1;
|
sequencer_mode = (val >> 7) & 1;
|
||||||
|
@ -1149,6 +1156,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
|
|
||||||
void HalfFrame()
|
void HalfFrame()
|
||||||
{
|
{
|
||||||
|
doing_tick_quarter = true;
|
||||||
pulse[0].clock_length_and_sweep();
|
pulse[0].clock_length_and_sweep();
|
||||||
pulse[1].clock_length_and_sweep();
|
pulse[1].clock_length_and_sweep();
|
||||||
triangle.clock_length_and_sweep();
|
triangle.clock_length_and_sweep();
|
||||||
|
@ -1157,6 +1165,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
|
|
||||||
void QuarterFrame()
|
void QuarterFrame()
|
||||||
{
|
{
|
||||||
|
doing_tick_quarter = true;
|
||||||
pulse[0].clock_env();
|
pulse[0].clock_env();
|
||||||
pulse[1].clock_env();
|
pulse[1].clock_env();
|
||||||
triangle.clock_linear_counter();
|
triangle.clock_linear_counter();
|
||||||
|
@ -1334,9 +1343,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
//notes: this set up is a bit convoluded at the moment, mainly because APU behaviour is not entirely understood
|
//notes: this set up is a bit convoluded at the moment, mainly because APU behaviour is not entirely understood
|
||||||
//in partiuclar, there are several clock pulses affecting the APU, and when new written are latched is not known in detail
|
//in partiuclar, there are several clock pulses affecting the APU, and when new written are latched is not known in detail
|
||||||
//the current code simply matches known behaviour
|
//the current code simply matches known behaviour
|
||||||
|
|
||||||
if (pending_reg != -1)
|
if (pending_reg != -1)
|
||||||
{
|
{
|
||||||
if (pending_reg == 0x4015 || pending_reg == 0x4017 || pending_reg==0x4003 || pending_reg==0x4007)
|
if (pending_reg == 0x4015 || pending_reg == 0x4015 || pending_reg == 0x4003 || pending_reg==0x4007)
|
||||||
{
|
{
|
||||||
_WriteReg(pending_reg, pending_val);
|
_WriteReg(pending_reg, pending_val);
|
||||||
pending_reg = -1;
|
pending_reg = -1;
|
||||||
|
@ -1352,6 +1362,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
|
|
||||||
sequencer_tick();
|
sequencer_tick();
|
||||||
sequencer_write_tick(seq_val);
|
sequencer_write_tick(seq_val);
|
||||||
|
doing_tick_quarter = false;
|
||||||
|
|
||||||
if (sequencer_irq_assert>0) {
|
if (sequencer_irq_assert>0) {
|
||||||
sequencer_irq_assert--;
|
sequencer_irq_assert--;
|
||||||
|
|
Loading…
Reference in New Issue