From c36510a9f2da8654846bae6e36a350de647c4040 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 19 Dec 2024 02:24:31 -0500 Subject: [PATCH] Add additional OPL & OPN chips --- src/include/86box/snd_opl.h | 52 +++++- src/sound/snd_opl.c | 70 ++++++++ src/sound/snd_opl_ymfm.cpp | 298 ++++++++++++++++++++++++++++++++-- src/sound/ymfm/CMakeLists.txt | 12 +- 4 files changed, 408 insertions(+), 24 deletions(-) diff --git a/src/include/86box/snd_opl.h b/src/include/86box/snd_opl.h index 0feb64646..71dc6813f 100644 --- a/src/include/86box/snd_opl.h +++ b/src/include/86box/snd_opl.h @@ -18,17 +18,31 @@ #define SOUND_OPL_H enum fm_type { - FM_YM3812 = 0, /* OPL2 */ - FM_YMF262 = 1, /* OPL3 */ - FM_YMF289B = 2, /* OPL3-L */ - FM_YMF278B = 3, /* OPL4 */ - FM_YM2151 = 4, /* OPM */ + FM_YM3526 = 0, /* OPL */ + FM_Y8950 = 1, /* MSX-Audio (OPL with ADPCM) */ + FM_YM3812 = 2, /* OPL2 */ + FM_YMF262 = 3, /* OPL3 */ + FM_YMF289B = 4, /* OPL3-L */ + FM_YMF278B = 5, /* OPL4 */ + FM_YM2413 = 6, /* OPLL */ + FM_YM2423 = 7, /* OPLL-X */ + FM_YMF281 = 8, /* OPLLP */ + FM_DS1001 = 9, /* Konami VRC7 MMC */ + FM_YM2151 = 10, /* OPM */ + FM_YM2203 = 11, /* OPN */ + FM_YM2608 = 12, /* OPNA */ + FM_YMF288 = 13, /* OPN3L */ + FM_YM2610 = 14, /* OPNB */ + FM_YM2610B = 15, /* OPNB2 */ + FM_YM2612 = 16, /* OPN2 */ + FM_YM3438 = 17, /* OPN2C */ + FM_YMF276 = 18, /* OPN2L */ #if 0 - FM_YM2164 = 5, /* OPP */ + FM_YM2164 = 19, /* OPP */ #endif - FM_ESFM = 6, /* ESFM */ - FM_OPL2BOARD = 7, /* OPL2Board (External Device) */ - FM_MAX = 8 + FM_ESFM = 20, /* ESFM */ + FM_OPL2BOARD = 21, /* OPL2Board (External Device) */ + FM_MAX = 22 }; enum fm_driver { @@ -58,13 +72,33 @@ extern const fm_drv_t ymfm_opl2board_drv; extern const device_t ym3812_nuked_device; extern const device_t ymf262_nuked_device; +/* OPL Series */ +extern const device_t ym3526_ymfm_device; +extern const device_t y8950_ymfm_device; extern const device_t ym3812_ymfm_device; extern const device_t ymf262_ymfm_device; extern const device_t ymf289b_ymfm_device; extern const device_t ymf278b_ymfm_device; +extern const device_t ym2413_ymfm_device; +extern const device_t ym2423_ymfm_device; +extern const device_t ymf281_ymfm_device; +extern const device_t ds1001_ymfm_device; +/* OPM Series */ extern const device_t ym2151_ymfm_device; + +/* OPN Series */ +extern const device_t ym2203_ymfm_device; +extern const device_t ym2608_ymfm_device; +extern const device_t ymf288_ymfm_device; +extern const device_t ym2610_ymfm_device; +extern const device_t ym2610b_ymfm_device; +extern const device_t ym2612_ymfm_device; +extern const device_t ym3438_ymfm_device; +extern const device_t ymf276_ymfm_device; + #if 0 +/* OPP Series */ extern const device_t ym2164_ymfm_device; #endif diff --git a/src/sound/snd_opl.c b/src/sound/snd_opl.c index c3a54ddfb..434fec6c6 100644 --- a/src/sound/snd_opl.c +++ b/src/sound/snd_opl.c @@ -39,6 +39,16 @@ uint8_t fm_driver_get(int chip_id, fm_drv_t *drv) { switch (chip_id) { + case FM_YM3526: /* OPL */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym3526_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_Y8950: /* MSX-Audio (OPL with ADPCM) */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&y8950_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + case FM_YM3812: /* OPL2 */ if (fm_driver == FM_DRV_NUKED) { *drv = nuked_opl_drv; @@ -69,11 +79,71 @@ fm_driver_get(int chip_id, fm_drv_t *drv) drv->priv = device_add_inst(&ymf278b_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); break; + case FM_YM2413: /* OPLL */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2413_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YM2423: /* OPLL-X */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2423_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YMF281: /* OPLLP */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ymf281_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_DS1001: /* Konami VRC7 MMC */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ds1001_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + case FM_YM2151: /* OPM */ *drv = ymfm_drv; drv->priv = device_add_inst(&ym2151_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); break; + case FM_YM2203: /* OPN */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2203_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YM2608: /* OPNA */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2608_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YMF288: /* OPN3L */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ymf288_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YM2610: /* OPNB */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2610_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YM2610B: /* OPNB2 */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2610b_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YM2612: /* OPN2 */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2612_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YM3438: /* OPN2C */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym3438_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + + case FM_YMF276: /* OPN2L */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ymf276_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + #if 0 case FM_YM2164: /* OPP */ *drv = ymfm_drv; diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index 8861abe69..1f69a8d35 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -18,8 +18,10 @@ #include #include #include +#include "ymfm/ymfm_ssg.h" #include "ymfm/ymfm_opl.h" #include "ymfm/ymfm_opm.h" +#include "ymfm/ymfm_opn.h" extern "C" { #define HAVE_STDARG_H @@ -320,6 +322,16 @@ ymfm_drv_init(const device_t *info) YMFMChipBase *fm; switch (info->local) { + case FM_YM3526: /* OPL */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM3526, FREQ_49716); + break; + + case FM_Y8950: /* MSX-Audio (OPL with ADPCM) */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_Y8950, FREQ_49716); + break; + default: case FM_YM3812: /* OPL2 */ fm = (YMFMChipBase *) new YMFMChip(3579545, FM_YM3812, FREQ_49716); @@ -339,12 +351,74 @@ ymfm_drv_init(const device_t *info) fm = (YMFMChipBase *) new YMFMChip(33868800, FM_YMF278B, FREQ_44100); break; + case FM_YM2413: /* OPLL */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2413, FREQ_49716); + break; + + case FM_YM2423: /* OPLL-X */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2423, FREQ_49716); + break; + + case FM_YMF281: /* OPLLP */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YMF281, FREQ_49716); + break; + + case FM_DS1001: /* Konami VRC7 MMC */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_DS1001, FREQ_49716); + break; + case FM_YM2151: /* OPM */ + // TODO: Check rates and frequency fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2151, FREQ_49716); break; + case FM_YM2203: /* OPN */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2203, FREQ_49716); + break; + + case FM_YM2608: /* OPNA */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2608, FREQ_49716); + break; + + case FM_YMF288: /* OPN3L */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YMF288, FREQ_49716); + break; + + case FM_YM2610: /* OPNB */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2610, FREQ_49716); + break; + + case FM_YM2610B: /* OPNB2 */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2610B, FREQ_49716); + break; + + case FM_YM2612: /* OPN2 */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2612, FREQ_49716); + break; + + case FM_YM3438: /* OPN2C */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM3438, FREQ_49716); + break; + + case FM_YMF276: /* OPN2L */ + // TODO: Check function call, rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YMF276, FREQ_49716); + break; + #if 0 case FM_YM2164: /* OPP */ + // TODO: Check rates and frequency fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2164, FREQ_49716); break; #endif @@ -428,6 +502,34 @@ ymfm_drv_generate(void *priv, int32_t *data, uint32_t num_samples) drv->generate(data, num_samples); } +const device_t ym3526_ymfm_device = { + .name = "Yamaha YM3526 OPL (YMFM)", + .internal_name = "ym3526_ymfm", + .flags = 0, + .local = FM_YM3526, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t y8950_ymfm_device = { + .name = "Yamaha Y8950 (YMFM)", + .internal_name = "y8950_ymfm", + .flags = 0, + .local = FM_Y8950, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t ym3812_ymfm_device = { .name = "Yamaha YM3812 OPL2 (YMFM)", .internal_name = "ym3812_ymfm", @@ -470,6 +572,76 @@ const device_t ymf289b_ymfm_device = { .config = NULL }; +const device_t ymf278b_ymfm_device = { + .name = "Yamaha YMF278B OPL4 (YMFM)", + .internal_name = "ymf278b_ymfm", + .flags = 0, + .local = FM_YMF278B, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ym2413_ymfm_device = { + .name = "Yamaha YM2413 OPLL (YMFM)", + .internal_name = "ym2413_ymfm", + .flags = 0, + .local = FM_YM2413, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ym2423_ymfm_device = { + .name = "Yamaha YM2423 OPLL-X (YMFM)", + .internal_name = "ym2423_ymfm", + .flags = 0, + .local = FM_YM2423, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ymf281_ymfm_device = { + .name = "Yamaha YMF281 OPLLP (YMFM)", + .internal_name = "ymf281_ymfm", + .flags = 0, + .local = FM_YMF281, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ds1001_ymfm_device = { + .name = "Konami VRC7 MMC (YMFM)", + .internal_name = "ds1001_ymfm", + .flags = 0, + .local = FM_DS1001, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t ym2151_ymfm_device = { .name = "Yamaha YM2151 OPM (YMFM)", .internal_name = "ym2151_ymfm", @@ -484,6 +656,118 @@ const device_t ym2151_ymfm_device = { .config = NULL }; +const device_t ym2203_ymfm_device = { + .name = "Yamaha YM2203 OPN (YMFM)", + .internal_name = "ym2203_ymfm", + .flags = 0, + .local = FM_YM2203, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ym2608_ymfm_device = { + .name = "Yamaha YM2608 OPNA (YMFM)", + .internal_name = "ym2608_ymfm", + .flags = 0, + .local = FM_YM2608, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ymf288_ymfm_device = { + .name = "Yamaha YMF288 OPN3L (YMFM)", + .internal_name = "ymf288_ymfm", + .flags = 0, + .local = FM_YMF288, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ym2610_ymfm_device = { + .name = "Yamaha YM2610 OPNB (YMFM)", + .internal_name = "ym2610_ymfm", + .flags = 0, + .local = FM_YM2610, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ym2610b_ymfm_device = { + .name = "Yamaha YM2610b OPNB2 (YMFM)", + .internal_name = "ym2610b_ymfm", + .flags = 0, + .local = FM_YM2610B, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ym2612_ymfm_device = { + .name = "Yamaha YM2612 OPN2 (YMFM)", + .internal_name = "ym2612_ymfm", + .flags = 0, + .local = FM_YM2612, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ym3438_ymfm_device = { + .name = "Yamaha YM3438 OPN2C (YMFM)", + .internal_name = "ym3438_ymfm", + .flags = 0, + .local = FM_YM3438, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ymf276_ymfm_device = { + .name = "Yamaha YMF276 OPN2L (YMFM)", + .internal_name = "ymf276_ymfm", + .flags = 0, + .local = FM_YMF276, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + #if 0 const device_t ym2164_ymfm_device = { .name = "Yamaha YM2164 OPP (YMFM)", @@ -500,20 +784,6 @@ const device_t ym2164_ymfm_device = { }; #endif -const device_t ymf278b_ymfm_device = { - .name = "Yamaha YMF278B OPL4 (YMFM)", - .internal_name = "ymf278b_ymfm", - .flags = 0, - .local = FM_YMF278B, - .init = ymfm_drv_init, - .close = ymfm_drv_close, - .reset = NULL, - .available = NULL, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - const fm_drv_t ymfm_drv { .read = &ymfm_drv_read, .write = &ymfm_drv_write, diff --git a/src/sound/ymfm/CMakeLists.txt b/src/sound/ymfm/CMakeLists.txt index e1ff35369..fcc07093f 100644 --- a/src/sound/ymfm/CMakeLists.txt +++ b/src/sound/ymfm/CMakeLists.txt @@ -9,4 +9,14 @@ # CMake build script. # -add_library(ymfm STATIC ymfm_misc.cpp ymfm_opl.cpp ymfm_opm.cpp ymfm_opn.cpp ymfm_opq.cpp ymfm_opz.cpp ymfm_pcm.cpp ymfm_adpcm.cpp) \ No newline at end of file +add_library(ymfm STATIC + ymfm_adpcm.cpp + ymfm_misc.cpp + ymfm_opl.cpp + ymfm_opm.cpp + ymfm_opn.cpp + ymfm_opq.cpp + ymfm_opz.cpp + ymfm_pcm.cpp + ymfm_ssg.cpp +)