diff --git a/DiskRef/WC/VGMPLAY.WMF b/DiskRef/WC/VGMPLAY.WMF index 6f253eb..a0e1a30 100644 Binary files a/DiskRef/WC/VGMPLAY.WMF and b/DiskRef/WC/VGMPLAY.WMF differ diff --git a/VGMPLAY.WMF b/VGMPLAY.WMF index 6f253eb..a0e1a30 100644 Binary files a/VGMPLAY.WMF and b/VGMPLAY.WMF differ diff --git a/src_sdcc/asm/cmdblocks.asm b/src_sdcc/asm/cmdblocks.asm index f620cfd..8b18270 100644 --- a/src_sdcc/asm/cmdblocks.asm +++ b/src_sdcc/asm/cmdblocks.asm @@ -110,7 +110,8 @@ ptr_table: dw blk_saa_init ; 11 = CMDBLK_SAA_INIT dw blk_saa2_init ; 12 = CMDBLK_SAA2_INIT dw blk_init_opl4 ; 13 = CMDBLK_INIT_OPL4 - dw blk_silence_wave ; 14 = CMDBLK_SILENCE_WAVE + dw blk_silence_wave_off ; 14 = CMDBLK_SILENCE_WAVE_OFF + dw blk_silence_wave_tl ; 15 = CMDBLK_SILENCE_WAVE_TL ; ═══════════════════════════════════════════════════════════════════════ ; CMDBLK_INIT_OPL3 — OPL3 init (NEW=1, clean state) @@ -292,7 +293,7 @@ blk_silence_opl: ; D0 02 50 FF ... D0 02 67 FF (TL max, 24 канала) ; 66 ; ═══════════════════════════════════════════════════════════════════════ -blk_silence_wave: +blk_silence_wave_off: opl4_wave_write #68, #40 opl4_wave_write #69, #40 opl4_wave_write #6A, #40 @@ -317,6 +318,9 @@ blk_silence_wave: opl4_wave_write #7D, #40 opl4_wave_write #7E, #40 opl4_wave_write #7F, #40 + blk_end + +blk_silence_wave_tl: opl4_wave_write #50, #FF opl4_wave_write #51, #FF opl4_wave_write #52, #FF diff --git a/src_sdcc/inc/vgm.h b/src_sdcc/inc/vgm.h index 8943782..94ded75 100644 --- a/src_sdcc/inc/vgm.h +++ b/src_sdcc/inc/vgm.h @@ -286,7 +286,8 @@ const char *vgm_chip_name(uint8_t id); #define CMDBLK_SAA_INIT 11 /* SAA1099 chip 1: Sound Enable ON */ #define CMDBLK_SAA2_INIT 12 /* SAA1099 chip 2: Sound Enable ON+clk */ #define CMDBLK_INIT_OPL4 13 /* OPL4 init: NEW=1 + NEW2=1 (wave unlock) */ -#define CMDBLK_SILENCE_WAVE 14 /* OPL4 wave-часть silence: 24 канала KeyOff+Damp+TL max */ +#define CMDBLK_SILENCE_WAVE_OFF 14 /* OPL4 wave: 24x KeyOff+Damp */ +#define CMDBLK_SILENCE_WAVE_TL 15 /* OPL4 wave: 24x TL max */ /* ─── Очередь высокоуровневых команд (HL queue) ───────────────── */ diff --git a/src_sdcc/main.c b/src_sdcc/main.c index a647348..0e7c044 100644 --- a/src_sdcc/main.c +++ b/src_sdcc/main.c @@ -156,8 +156,12 @@ static void hl_push(uint8_t cmd, uint8_t param) static void hl_push_opl_silence(void) { hl_push(HLCMD_CMDBLK, CMDBLK_SILENCE_OPL); - if (vgm_chip_type == VGM_CHIP_OPL4) - hl_push(HLCMD_CMDBLK, CMDBLK_SILENCE_WAVE); + if (vgm_chip_type == VGM_CHIP_OPL4) { + /* Два блока по 24 записи: вместе с OPL silence они не помещаются + * в один ISR-буфер, а cmdblock нельзя продолжать с середины. */ + hl_push(HLCMD_CMDBLK, CMDBLK_SILENCE_WAVE_OFF); + hl_push(HLCMD_CMDBLK, CMDBLK_SILENCE_WAVE_TL); + } } /* ── Построение очереди воспроизведения по обнаруженным чипам / loop info ─ */