From 1c0f243d0439a3e21fee20e870c14a47d1ca1132 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Wed, 29 Jan 2025 14:03:51 +0100 Subject: [PATCH] - Treballant en el envelope sweep i el length del CH1 --- APU.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/APU.cpp b/APU.cpp index 3e11bec..37714ab 100644 --- a/APU.cpp +++ b/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;