Fix OPL4 abort completion

This commit is contained in:
2026-09-15 15:34:25 +03:00
parent c6004c19fb
commit 3ef0b1dc95
5 changed files with 14 additions and 5 deletions
+6 -2
View File
@@ -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
+2 -1
View File
@@ -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) ───────────────── */
+6 -2
View File
@@ -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 ─ */