- Treballant en el envelope sweep i el length del CH1
This commit is contained in:
52
APU.cpp
52
APU.cpp
@@ -33,12 +33,12 @@ namespace APU
|
|||||||
{
|
{
|
||||||
bool enabled = false;
|
bool enabled = false;
|
||||||
uint8_t length_timer = 0;
|
uint8_t length_timer = 0;
|
||||||
bool length_timer_expired = true;
|
|
||||||
bool length_enable = false;
|
bool length_enable = false;
|
||||||
uint16_t period_divider = 0;
|
uint16_t period_divider = 0;
|
||||||
uint8_t duty_cycle=0;
|
uint8_t duty_cycle=0;
|
||||||
uint8_t duty_step = 0;
|
uint8_t duty_step = 0;
|
||||||
uint8_t volume = 0;
|
uint8_t volume = 0;
|
||||||
|
uint8_t envelope_sweep_timer=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
channel_t channels[4];
|
channel_t channels[4];
|
||||||
@@ -113,13 +113,13 @@ namespace APU
|
|||||||
CH1.duty_cycle = 0;
|
CH1.duty_cycle = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void trigger(uint8_t channel)
|
void triggerCH1()
|
||||||
{
|
{
|
||||||
channels[channel].enabled = true;
|
CH1.enabled = true;
|
||||||
channels[channel].length_timer_expired = false;
|
CH1.length_timer=NR11&0x3f;
|
||||||
channels[channel].period_divider = NR13 | ((NR14 &0x7)<<8);
|
CH1.period_divider = NR13 | ((NR14 &0x7)<<8);
|
||||||
// envelope timer is reset
|
// envelope timer is reset
|
||||||
channels[channel].volume = NR12>>4;
|
CH1.volume = NR12>>4;
|
||||||
// sweep does several things (check documentation)
|
// sweep does several things (check documentation)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,10 +147,10 @@ namespace APU
|
|||||||
switch(address)
|
switch(address)
|
||||||
{
|
{
|
||||||
case 0xff10: NR10 = value; break;
|
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 0xff12: NR12 = value; break;
|
||||||
case 0xff13: NR13 = 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 0xff24: NR50 = value; break;
|
||||||
case 0xff25: NR51 = 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()
|
void incDIVAPU()
|
||||||
{
|
{
|
||||||
DIVAPU++;
|
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;
|
uint32_t dots = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user