From c36510a9f2da8654846bae6e36a350de647c4040 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 19 Dec 2024 02:24:31 -0500 Subject: [PATCH 1/6] 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 +) From 7b9d025a2689c0b32bc7e97baa43e4705c3d2f47 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 19 Dec 2024 03:08:22 -0500 Subject: [PATCH 2/6] Enable YM2164 --- src/include/86box/snd_opl.h | 4 ---- src/sound/snd_opl.c | 2 -- src/sound/snd_opl_ymfm.cpp | 4 ---- 3 files changed, 10 deletions(-) diff --git a/src/include/86box/snd_opl.h b/src/include/86box/snd_opl.h index 71dc6813f..f5a1058a8 100644 --- a/src/include/86box/snd_opl.h +++ b/src/include/86box/snd_opl.h @@ -37,9 +37,7 @@ enum fm_type { FM_YM2612 = 16, /* OPN2 */ FM_YM3438 = 17, /* OPN2C */ FM_YMF276 = 18, /* OPN2L */ -#if 0 FM_YM2164 = 19, /* OPP */ -#endif FM_ESFM = 20, /* ESFM */ FM_OPL2BOARD = 21, /* OPL2Board (External Device) */ FM_MAX = 22 @@ -97,10 +95,8 @@ 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 extern const device_t esfm_esfmu_device; diff --git a/src/sound/snd_opl.c b/src/sound/snd_opl.c index 434fec6c6..9fb96777e 100644 --- a/src/sound/snd_opl.c +++ b/src/sound/snd_opl.c @@ -144,12 +144,10 @@ fm_driver_get(int chip_id, fm_drv_t *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; drv->priv = device_add_inst(&ym2164_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); break; -#endif case FM_ESFM: *drv = esfmu_opl_drv; diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index 1f69a8d35..d414e910e 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -416,12 +416,10 @@ ymfm_drv_init(const device_t *info) 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 } fm->set_do_cycles(1); @@ -768,7 +766,6 @@ const device_t ymf276_ymfm_device = { .config = NULL }; -#if 0 const device_t ym2164_ymfm_device = { .name = "Yamaha YM2164 OPP (YMFM)", .internal_name = "ym2164_ymfm", @@ -782,7 +779,6 @@ const device_t ym2164_ymfm_device = { .force_redraw = NULL, .config = NULL }; -#endif const fm_drv_t ymfm_drv { .read = &ymfm_drv_read, From a05582320eb6ef70dcba70b2971ad1b62a087355 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 19 Dec 2024 03:29:07 -0500 Subject: [PATCH 3/6] Add SSG --- src/include/86box/snd_opl.h | 49 ++++++++++++++++++++----------------- src/sound/snd_opl.c | 5 ++++ src/sound/snd_opl_ymfm.cpp | 23 +++++++++++++++++ 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/src/include/86box/snd_opl.h b/src/include/86box/snd_opl.h index f5a1058a8..5bd1166a2 100644 --- a/src/include/86box/snd_opl.h +++ b/src/include/86box/snd_opl.h @@ -18,29 +18,30 @@ #define SOUND_OPL_H enum fm_type { - 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 */ - FM_YM2164 = 19, /* OPP */ - FM_ESFM = 20, /* ESFM */ - FM_OPL2BOARD = 21, /* OPL2Board (External Device) */ - FM_MAX = 22 + FM_YM2149 = 0, /* SSG */ + FM_YM3526 = 1, /* OPL */ + FM_Y8950 = 2, /* MSX-Audio (OPL with ADPCM) */ + FM_YM3812 = 3, /* OPL2 */ + FM_YMF262 = 4, /* OPL3 */ + FM_YMF289B = 5, /* OPL3-L */ + FM_YMF278B = 6, /* OPL4 */ + FM_YM2413 = 7, /* OPLL */ + FM_YM2423 = 8, /* OPLL-X */ + FM_YMF281 = 9, /* OPLLP */ + FM_DS1001 = 10, /* Konami VRC7 MMC */ + FM_YM2151 = 11, /* OPM */ + FM_YM2203 = 12, /* OPN */ + FM_YM2608 = 13, /* OPNA */ + FM_YMF288 = 14, /* OPN3L */ + FM_YM2610 = 15, /* OPNB */ + FM_YM2610B = 16, /* OPNB2 */ + FM_YM2612 = 17, /* OPN2 */ + FM_YM3438 = 18, /* OPN2C */ + FM_YMF276 = 19, /* OPN2L */ + FM_YM2164 = 20, /* OPP */ + FM_ESFM = 21, /* ESFM */ + FM_OPL2BOARD = 22, /* OPL2Board (External Device) */ + FM_MAX = 23 }; enum fm_driver { @@ -70,6 +71,8 @@ extern const fm_drv_t ymfm_opl2board_drv; extern const device_t ym3812_nuked_device; extern const device_t ymf262_nuked_device; +extern const device_t ym2149_ymfm_device; + /* OPL Series */ extern const device_t ym3526_ymfm_device; extern const device_t y8950_ymfm_device; diff --git a/src/sound/snd_opl.c b/src/sound/snd_opl.c index 9fb96777e..1cf3bab29 100644 --- a/src/sound/snd_opl.c +++ b/src/sound/snd_opl.c @@ -39,6 +39,11 @@ uint8_t fm_driver_get(int chip_id, fm_drv_t *drv) { switch (chip_id) { + case FM_YM2149: /* SSG */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2149_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + case FM_YM3526: /* OPL */ *drv = ymfm_drv; drv->priv = device_add_inst(&ym3526_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index d414e910e..007722e82 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -19,9 +19,13 @@ #include #include #include "ymfm/ymfm_ssg.h" +#include "ymfm/ymfm_misc.h" #include "ymfm/ymfm_opl.h" #include "ymfm/ymfm_opm.h" #include "ymfm/ymfm_opn.h" +#include "ymfm/ymfm_opq.h" +#include "ymfm/ymfm_opx.h" +#include "ymfm/ymfm_opz.h" extern "C" { #define HAVE_STDARG_H @@ -322,6 +326,11 @@ ymfm_drv_init(const device_t *info) YMFMChipBase *fm; switch (info->local) { + case FM_YM2149: /* OPL */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2149, FREQ_49716); + break; + case FM_YM3526: /* OPL */ // TODO: Check rates and frequency fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM3526, FREQ_49716); @@ -500,6 +509,20 @@ ymfm_drv_generate(void *priv, int32_t *data, uint32_t num_samples) drv->generate(data, num_samples); } +const device_t ym2149_ymfm_device = { + .name = "Yamaha 2149 SSG (YMFM)", + .internal_name = "ym2149_ymfm", + .flags = 0, + .local = FM_YM2149, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t ym3526_ymfm_device = { .name = "Yamaha YM3526 OPL (YMFM)", .internal_name = "ym3526_ymfm", From 7b2508f81774ea8a4e03561db12b79311cefd15c Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 19 Dec 2024 04:31:56 -0500 Subject: [PATCH 4/6] Add OPQ, OPX(Partial), and OPZ chips --- src/include/86box/snd_opl.h | 22 +++++++++++-- src/sound/snd_opl.c | 17 ++++++++++ src/sound/snd_opl_ymfm.cpp | 64 +++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 3 deletions(-) diff --git a/src/include/86box/snd_opl.h b/src/include/86box/snd_opl.h index 5bd1166a2..62c62e965 100644 --- a/src/include/86box/snd_opl.h +++ b/src/include/86box/snd_opl.h @@ -39,9 +39,14 @@ enum fm_type { FM_YM3438 = 18, /* OPN2C */ FM_YMF276 = 19, /* OPN2L */ FM_YM2164 = 20, /* OPP */ - FM_ESFM = 21, /* ESFM */ - FM_OPL2BOARD = 22, /* OPL2Board (External Device) */ - FM_MAX = 23 + FM_YM3806 = 21, /* OPQ */ +#if 0 + FM_YMF271 = 22, /* OPX */ +#endif + FM_YM2414 = 23, /* OPZ */ + FM_ESFM = 24, /* ESFM */ + FM_OPL2BOARD = 25, /* OPL2Board (External Device) */ + FM_MAX = 26 }; enum fm_driver { @@ -101,6 +106,17 @@ extern const device_t ymf276_ymfm_device; /* OPP Series */ extern const device_t ym2164_ymfm_device; +/* OPQ Series */ +extern const device_t ym3806_ymfm_device; + +/* OPX Series */ +#if 0 +extern const device_t ymf271_ymfm_device; +#endif + +/* OPZ Series */ +extern const device_t ym2414_ymfm_device; + extern const device_t esfm_esfmu_device; #ifdef USE_LIBSERIALPORT diff --git a/src/sound/snd_opl.c b/src/sound/snd_opl.c index 1cf3bab29..1ee687f1e 100644 --- a/src/sound/snd_opl.c +++ b/src/sound/snd_opl.c @@ -153,6 +153,23 @@ fm_driver_get(int chip_id, fm_drv_t *drv) *drv = ymfm_drv; drv->priv = device_add_inst(&ym2164_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); break; + + case FM_YM3806: /* OPQ */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym3806_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; + +#if 0 + case FM_YMF271: /* OPX */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ymf271_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; +#endif + + case FM_YM2414: /* OPZ */ + *drv = ymfm_drv; + drv->priv = device_add_inst(&ym2414_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); + break; case FM_ESFM: *drv = esfmu_opl_drv; diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index 007722e82..fb00401d5 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -24,7 +24,9 @@ #include "ymfm/ymfm_opm.h" #include "ymfm/ymfm_opn.h" #include "ymfm/ymfm_opq.h" +#if 0 #include "ymfm/ymfm_opx.h" +#endif #include "ymfm/ymfm_opz.h" extern "C" { @@ -429,6 +431,23 @@ ymfm_drv_init(const device_t *info) // TODO: Check rates and frequency fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2164, FREQ_49716); break; + + case FM_YM3806: /* OPQ */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM3806, FREQ_49716); + break; + +#if 0 + case FM_YMF271: /* OPX */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YMF271, FREQ_49716); + break; +#endif + + case FM_YM2414: /* OPZ */ + // TODO: Check rates and frequency + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YM2414, FREQ_49716); + break; } fm->set_do_cycles(1); @@ -803,6 +822,51 @@ const device_t ym2164_ymfm_device = { .config = NULL }; +const device_t ym3806_ymfm_device = { + .name = "Yamaha YM3806 OPQ (YMFM)", + .internal_name = "ym3806_ymfm", + .flags = 0, + .local = FM_YM3806, + .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 ymf271_ymfm_device = { + .name = "Yamaha YMF271 OPX (YMFM)", + .internal_name = "ym271_ymfm", + .flags = 0, + .local = FM_YMF271, + .init = ymfm_drv_init, + .close = ymfm_drv_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; +#endif + +const device_t ym2414_ymfm_device = { + .name = "Yamaha YM2414 OPZ (YMFM)", + .internal_name = "ym2414_ymfm", + .flags = 0, + .local = FM_YM2414, + .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, From 86024cffee00c8b471186313b90abe89a62af4a0 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 19 Dec 2024 04:13:19 -0500 Subject: [PATCH 5/6] Some fixes to ymfm_opx.h --- src/sound/ymfm/ymfm_opx.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sound/ymfm/ymfm_opx.h b/src/sound/ymfm/ymfm_opx.h index 9f9bbdba7..f8ee1c34f 100644 --- a/src/sound/ymfm/ymfm_opx.h +++ b/src/sound/ymfm/ymfm_opx.h @@ -105,7 +105,7 @@ public: static constexpr uint8_t STATUS_IRQ = 0; // constructor - opz_registers(); + opx_registers(); // reset to initial state void reset(); @@ -244,17 +244,17 @@ protected: // IMPLEMENTATION CLASSES //********************************************************* -// ======================> ym2414 +// ======================> ymf271 -class ym2414 +class ymf271 { public: - using fm_engine = fm_engine_base; + using fm_engine = fm_engine_base; static constexpr uint32_t OUTPUTS = fm_engine::OUTPUTS; using output_data = fm_engine::output_data; // constructor - ym2414(ymfm_interface &intf); + ymf271(ymfm_interface &intf); // reset void reset(); @@ -287,4 +287,4 @@ protected: } -#endif // YMFM_OPZ_H +#endif // YMFM_OPX_H From 82d5f7d1336b06b5bebe58f7fa7f27fa80ea69f1 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 19 Dec 2024 04:43:03 -0500 Subject: [PATCH 6/6] Fix ymf276 --- src/sound/ymfm/ymfm_opn.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/ymfm/ymfm_opn.h b/src/sound/ymfm/ymfm_opn.h index bab68ed93..daed8b0bf 100644 --- a/src/sound/ymfm/ymfm_opn.h +++ b/src/sound/ymfm/ymfm_opn.h @@ -793,7 +793,7 @@ public: ymf276(ymfm_interface &intf) : ym2612(intf) { } // generate one sample of sound - void generate(output_data *output, uint32_t numsamples); + void generate(output_data *output, uint32_t numsamples = 1); }; }