- 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;
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user