all repos — mgba @ af59e28f906f8559fd9c4db447714e71eea3b620

mGBA Game Boy Advance Emulator

GB Serialize: Fix timing bug loading channel 4 timing
Vicki Pfau vi@endrift.com
Sat, 01 Feb 2020 12:17:45 -0800
commit

af59e28f906f8559fd9c4db447714e71eea3b620

parent

034d4bd43a7c79e01cb9ce2213aa1cf35f0f85df

2 files changed, 7 insertions(+), 2 deletions(-)

jump to
M CHANGESCHANGES

@@ -2,6 +2,7 @@ 0.9.0: (Future)

Emulation fixes: - ARM: Fix ALU reading PC after shifting - ARM: Fix STR storing PC after address calculation + - GB Serialize: Fix timing bug loading channel 4 timing - GBA DMA: Linger last DMA on bus (fixes mgba.io/i/301 and mgba.io/i/1320) - GBA Memory: Misaligned SRAM writes are ignored - GBA Memory: Improve gamepak prefetch timing
M src/gb/audio.csrc/gb/audio.c

@@ -1078,9 +1078,13 @@ LOAD_32LE(audio->ch4.lfsr, 0, &state->ch4.lfsr);

LOAD_32LE(audio->ch4.lastEvent, 0, &state->ch4.lastEvent); LOAD_32LE(when, 0, &state->ch4.nextEvent); if (audio->ch4.envelope.dead < 2 && audio->playingCh4) { - if (when - audio->ch4.lastEvent > (uint32_t) audio->sampleInterval) { + if (!audio->ch4.lastEvent) { // Back-compat: fake this value - audio->ch4.lastEvent = when - audio->sampleInterval; + uint32_t currentTime = mTimingCurrentTime(audio->timing); + int32_t cycles = audio->ch4.ratio ? 2 * audio->ch4.ratio : 1; + cycles <<= audio->ch4.frequency; + cycles *= 8 * audio->timingFactor; + audio->ch4.lastEvent = currentTime + (when & (cycles - 1)) - cycles; } mTimingSchedule(audio->timing, &audio->ch4Event, when); }