- Treballant en el envelope sweep i el length del CH1

This commit is contained in:
2025-01-29 14:03:51 +01:00
parent 91a230ee44
commit 1c0f243d04

52
APU.cpp
View File

@@ -33,12 +33,12 @@ namespace APU
{
bool enabled = false;
uint8_t length_timer = 0;
bool length_timer_expired = true;
bool length_enable = false;
uint16_t period_divider = 0;
uint8_t duty_cycle=0;
uint8_t duty_step = 0;
uint8_t volume = 0;
uint8_t envelope_sweep_timer=0;
};
channel_t channels[4];
@@ -113,13 +113,13 @@ namespace APU
CH1.duty_cycle = 0;
}
void trigger(uint8_t channel)
void triggerCH1()
{
channels[channel].enabled = true;
channels[channel].length_timer_expired = false;
channels[channel].period_divider = NR13 | ((NR14 &0x7)<<8);
CH1.enabled = true;
CH1.length_timer=NR11&0x3f;
CH1.period_divider = NR13 | ((NR14 &0x7)<<8);
// envelope timer is reset
channels[channel].volume = NR12>>4;
CH1.volume = NR12>>4;
// sweep does several things (check documentation)
}
@@ -147,10 +147,10 @@ namespace APU
switch(address)
{
case 0xff10: NR10 = value; break;
case 0xff11: NR11 = value; CH1.duty_cycle = NR11>>6; break;
case 0xff11: NR11 = value; CH1.length_timer=NR11&0x3f; CH1.duty_cycle = NR11>>6; break;
case 0xff12: NR12 = value; break;
case 0xff13: NR13 = value; break;
case 0xff14: NR14 = value; if (value&0x80) trigger(0); break;
case 0xff14: NR14 = value; CH1.length_enable=(value&0x40); if (value&0x80) triggerCH1(); break;
case 0xff24: NR50 = value; break;
case 0xff25: NR51 = value; break;
@@ -158,9 +158,45 @@ namespace APU
}
}
uint8_t DIVAPU_envelope_sweep = 0;
uint8_t DIVAPU_length = 0;
uint8_t DIVAPU_CH1_freq_sweep = 0;
void incDIVAPU()
{
DIVAPU++;
DIVAPU_length++;
if (DIVAPU_length==2) {
DIVAPU_length=0;
if (CH1.enabled && CH1.length_enable) {
CH1.length_timer++;
if (CH1.length_timer==0) {
CH1.enabled = false;
}
}
}
DIVAPU_CH1_freq_sweep++;
if (DIVAPU_CH1_freq_sweep==4) {
DIVAPU_CH1_freq_sweep=0;
// Do the freq sweep thing
}
DIVAPU_envelope_sweep++;
if (DIVAPU_envelope_sweep==8) {
DIVAPU_envelope_sweep=0;
if ( NR12&0x7 ) { // If sweep pace != 0, envelope sweep is enabled
CH1.envelope_sweep_timer++;
if ( CH1.envelope_sweep_timer == (NR12&0x07) ) { // if timer == envelope sweep, increase or decrease volume
CH1.envelope_sweep_timer=0;
if (NR12&0x80) { // bit set increases, reset decreases
if (CH1.volume<0x0f) CH1.volume++;
} else {
if (CH1.volume>0) CH1.volume--;
}
}
}
// Do the envelope sweep thing
}
}
uint32_t dots = 0;