[NES] fixup square waves a tiny bit
This commit is contained in:
parent
44619d747c
commit
fe7e80d723
|
@ -36,7 +36,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
||||||
//reg0
|
//reg0
|
||||||
int duty, length_halt, envelope_constant, envelope_cnt_value;
|
int duty, length_halt, envelope_constant, envelope_cnt_value;
|
||||||
//reg1
|
//reg1
|
||||||
int sweep_en, timer_period, negate, shiftcount;
|
int sweep_en, sweep_period, negate, shiftcount;
|
||||||
//reg2/3
|
//reg2/3
|
||||||
int len_cnt;
|
int len_cnt;
|
||||||
int timer_raw_reload_value, timer_reload_value;
|
int timer_raw_reload_value, timer_reload_value;
|
||||||
|
@ -58,7 +58,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
||||||
case 1:
|
case 1:
|
||||||
shiftcount = val & 7;
|
shiftcount = val & 7;
|
||||||
negate = (val >> 3) & 1;
|
negate = (val >> 3) & 1;
|
||||||
timer_period = (val >> 4) & 7;
|
sweep_period = (val >> 4) & 7;
|
||||||
sweep_en = (val >> 7) & 1;
|
sweep_en = (val >> 7) & 1;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -71,6 +71,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
||||||
timer_reload_value = (timer_reload_value & 0xFF) | ((val & 0x07) << 8);
|
timer_reload_value = (timer_reload_value & 0xFF) | ((val & 0x07) << 8);
|
||||||
timer_raw_reload_value = timer_reload_value;
|
timer_raw_reload_value = timer_reload_value;
|
||||||
sq_seq = 0;
|
sq_seq = 0;
|
||||||
|
timer_counter = timer_raw_reload_value;
|
||||||
calc_sweep_unit();
|
calc_sweep_unit();
|
||||||
//serves as a useful note-on diagnostic
|
//serves as a useful note-on diagnostic
|
||||||
Console.WriteLine("{0} timer_reload_value: {1}", unit, timer_reload_value);
|
Console.WriteLine("{0} timer_reload_value: {1}", unit, timer_reload_value);
|
||||||
|
@ -81,6 +82,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
||||||
int swp_val_result;
|
int swp_val_result;
|
||||||
bool swp_silence;
|
bool swp_silence;
|
||||||
int sq_seq;
|
int sq_seq;
|
||||||
|
int timer_counter;
|
||||||
public int sample;
|
public int sample;
|
||||||
int envelope_value;
|
int envelope_value;
|
||||||
|
|
||||||
|
@ -120,11 +122,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
||||||
//writes and frame counter, and envelope is set through the memory
|
//writes and frame counter, and envelope is set through the memory
|
||||||
//regs also, so we just need to deal with the timer and sequencer here
|
//regs also, so we just need to deal with the timer and sequencer here
|
||||||
|
|
||||||
if (--timer_period==0)
|
timer_counter--;
|
||||||
|
if (timer_counter == 0)
|
||||||
{
|
{
|
||||||
sq_seq = (sq_seq + 1) & 7;
|
sq_seq = (sq_seq + 1) & 7;
|
||||||
//reload timer
|
//reload timer
|
||||||
timer_period = timer_raw_reload_value + 2;
|
timer_counter = timer_raw_reload_value + 2;
|
||||||
}
|
}
|
||||||
if (PULSE_DUTY[duty,sq_seq] == 1) //we are outputting something
|
if (PULSE_DUTY[duty,sq_seq] == 1) //we are outputting something
|
||||||
{
|
{
|
||||||
|
@ -182,7 +185,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
||||||
if (sequencer_irq_inhibit == 0)
|
if (sequencer_irq_inhibit == 0)
|
||||||
{
|
{
|
||||||
sequencer_irq_flag = 1;
|
sequencer_irq_flag = 1;
|
||||||
//TODO - actually fire IRQ
|
//nes.cpu.Interrupt = true;
|
||||||
|
//Console.WriteLine("APU trigger IRQ (cpu needs implementation)");
|
||||||
}
|
}
|
||||||
sequencer_step = 0;
|
sequencer_step = 0;
|
||||||
}
|
}
|
||||||
|
@ -245,13 +249,14 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
||||||
{
|
{
|
||||||
pulse[0].Run();
|
pulse[0].Run();
|
||||||
pulse[1].Run();
|
pulse[1].Run();
|
||||||
sequencer_tick();
|
|
||||||
|
|
||||||
int mix = pulse[0].sample;
|
int mix = pulse[0].sample;
|
||||||
mix += pulse[1].sample;
|
mix += pulse[1].sample;
|
||||||
|
|
||||||
EmitSample(mix);
|
EmitSample(mix);
|
||||||
|
|
||||||
|
sequencer_tick();
|
||||||
|
|
||||||
//since the units run concurrently, the APU frame sequencer
|
//since the units run concurrently, the APU frame sequencer
|
||||||
//is ran last because
|
//is ran last because
|
||||||
//it can change the ouput values of the pulse/triangle channels,
|
//it can change the ouput values of the pulse/triangle channels,
|
||||||
|
|
|
@ -315,7 +315,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
||||||
if (!reg_2000.vblank_nmi_gen & ((value & 0x80) != 0) && (Reg2002_vblank_active))
|
if (!reg_2000.vblank_nmi_gen & ((value & 0x80) != 0) && (Reg2002_vblank_active))
|
||||||
{
|
{
|
||||||
//if we just unleashed the vblank interrupt then activate it now
|
//if we just unleashed the vblank interrupt then activate it now
|
||||||
//FCEUX would use a "trigger NMI2" here. why?? why isn't a regular NMI good enough?
|
//FCEUX would use a "trigger NMI2" here in order to result in some delay effect
|
||||||
TriggerNMI();
|
TriggerNMI();
|
||||||
}
|
}
|
||||||
reg_2000.Value = value;
|
reg_2000.Value = value;
|
||||||
|
|
Loading…
Reference in New Issue