From dae509f7c02c443ba58a662f659785c470c7b358 Mon Sep 17 00:00:00 2001 From: Tatsuya Fujita Date: Sat, 7 Dec 2024 15:14:15 +0900 Subject: [PATCH] Workaround for "Sonic & Kuckles All Emeralds" --- lib/fm/fm.cpp | 1 + src/common.h | 1 + src/main.cpp | 2 +- src/vgm.cpp | 15 +++++++++------ 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/fm/fm.cpp b/lib/fm/fm.cpp index 40d7b82..b37ca01 100644 --- a/lib/fm/fm.cpp +++ b/lib/fm/fm.cpp @@ -129,6 +129,7 @@ void FMChip::writeRaw(byte data, byte chipno, si5351Freq_t freq) { // 3.579MHz : 0.2794us * 32 = 8.94 us // 1.5MHz : 0.66us * 32 = 21.3 us WR_LOW; + ets_delay_us((32000000 / freq)); WR_HIGH; diff --git a/src/common.h b/src/common.h index ea3d474..9b13760 100644 --- a/src/common.h +++ b/src/common.h @@ -8,6 +8,7 @@ #define USE_YM2612 #define USE_SN76489 +#define USE_YM2203 #define CHIP0_CLOCK CLK_0 #define CHIP1_CLOCK CLK_1 diff --git a/src/main.cpp b/src/main.cpp index 4ee129e..d359b9f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -64,7 +64,7 @@ void setup() { lcd.setFont(&fonts::Font2); lcd.println("NANO DRIVE 6"); lcd.println("2024 Fujix@e2j.net"); - lcd.printf("Firmware: 1.82\n\n"); + lcd.printf("Firmware: 1.83\n\n"); // PSRAM 初期化確認 if (psramInit()) { diff --git a/src/vgm.cpp b/src/vgm.cpp index b826a75..81f6a97 100644 --- a/src/vgm.cpp +++ b/src/vgm.cpp @@ -80,13 +80,11 @@ bool VGM::ready() { // version version = get_ui32_at(8); - // total # samples // totalSamples = get_ui32_at(0x18); // loop offset loopOffset = get_ui32_at(0x1c); - // vg3 offset gd3Offset = get_ui32_at(0x14) + 0x14; @@ -644,10 +642,15 @@ void VGM::vgmProcessMain() { break; case 0x50: // SN76489 CHIP 1 - if (SN76489_Freq0is0X400) { - FM.writeRaw(get_ui8(), 1, freq[chipSlot[CHIP_SN76489_0]]); - } else { - FM.write(get_ui8(), 1, freq[chipSlot[CHIP_SN76489_0]]); + + // WORKAROUND FOR COMMAND TO UNDEFINED SN CHIP + // Sonic & Knuckles 30th song + if (freq[chipSlot[CHIP_SN76489_0]] != SI5351_UNDEFINED) { + if (SN76489_Freq0is0X400) { + FM.writeRaw(get_ui8(), 1, freq[chipSlot[CHIP_SN76489_0]]); + } else { + FM.write(get_ui8(), 1, freq[chipSlot[CHIP_SN76489_0]]); + } } break; #endif