Cleanups to OPL backends
This commit is contained in:
@@ -21,9 +21,9 @@ enum fm_type {
|
||||
FM_YM3812 = 0, /* OPL2 */
|
||||
FM_YMF262 = 1, /* OPL3 */
|
||||
FM_YMF289B = 2, /* OPL3-L */
|
||||
FM_YMF278B = 3, /* OPL 4 */
|
||||
FM_YMF278B = 3, /* OPL4 */
|
||||
FM_ESFM = 4, /* ESFM */
|
||||
FM_OPL2BOARD = 5, /* OPL2BOARD (External Device)*/
|
||||
FM_OPL2BOARD = 5, /* OPL2Board (External Device) */
|
||||
FM_MAX = 6
|
||||
};
|
||||
|
||||
@@ -48,7 +48,7 @@ extern uint8_t fm_driver_get(int chip_id, fm_drv_t *drv);
|
||||
extern const fm_drv_t nuked_opl_drv;
|
||||
extern const fm_drv_t ymfm_drv;
|
||||
extern const fm_drv_t esfmu_opl_drv;
|
||||
extern const fm_drv_t ymfm_opl2board_drv;
|
||||
extern const fm_drv_t ymfm_opl2board_drv;
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t ym3812_nuked_device;
|
||||
@@ -60,6 +60,7 @@ extern const device_t ymf289b_ymfm_device;
|
||||
extern const device_t ymf278b_ymfm_device;
|
||||
|
||||
extern const device_t esfm_esfmu_device;
|
||||
|
||||
#ifdef USE_LIBSERIALPORT
|
||||
extern const device_t ym_opl2board_device;
|
||||
#endif
|
||||
|
||||
@@ -39,7 +39,7 @@ uint8_t
|
||||
fm_driver_get(int chip_id, fm_drv_t *drv)
|
||||
{
|
||||
switch (chip_id) {
|
||||
case FM_YM3812:
|
||||
case FM_YM3812: /* OPL2 */
|
||||
if (fm_driver == FM_DRV_NUKED) {
|
||||
*drv = nuked_opl_drv;
|
||||
drv->priv = device_add_inst(&ym3812_nuked_device, fm_dev_inst[fm_driver][chip_id]++);
|
||||
@@ -49,7 +49,7 @@ fm_driver_get(int chip_id, fm_drv_t *drv)
|
||||
}
|
||||
break;
|
||||
|
||||
case FM_YMF262:
|
||||
case FM_YMF262: /* OPL3 */
|
||||
if (fm_driver == FM_DRV_NUKED) {
|
||||
*drv = nuked_opl_drv;
|
||||
drv->priv = device_add_inst(&ymf262_nuked_device, fm_dev_inst[fm_driver][chip_id]++);
|
||||
@@ -58,18 +58,13 @@ fm_driver_get(int chip_id, fm_drv_t *drv)
|
||||
drv->priv = device_add_inst(&ymf262_ymfm_device, fm_dev_inst[fm_driver][chip_id]++);
|
||||
}
|
||||
break;
|
||||
#ifdef USE_LIBSERIALPORT
|
||||
case FM_OPL2BOARD:
|
||||
*drv = ymfm_opl2board_drv;
|
||||
drv->priv = device_add_inst(&ym_opl2board_device, fm_dev_inst[fm_driver][chip_id]++);
|
||||
break;
|
||||
#endif
|
||||
case FM_YMF289B:
|
||||
|
||||
case FM_YMF289B: /* OPL3-L */
|
||||
*drv = ymfm_drv;
|
||||
drv->priv = device_add_inst(&ymf289b_ymfm_device, fm_dev_inst[fm_driver][chip_id]++);
|
||||
break;
|
||||
|
||||
case FM_YMF278B:
|
||||
case FM_YMF278B: /* OPL4 */
|
||||
*drv = ymfm_drv;
|
||||
drv->priv = device_add_inst(&ymf278b_ymfm_device, fm_dev_inst[fm_driver][chip_id]++);
|
||||
break;
|
||||
@@ -79,6 +74,13 @@ fm_driver_get(int chip_id, fm_drv_t *drv)
|
||||
drv->priv = device_add_inst(&esfm_esfmu_device, fm_dev_inst[fm_driver][chip_id]++);
|
||||
break;
|
||||
|
||||
#ifdef USE_LIBSERIALPORT
|
||||
case FM_OPL2BOARD:
|
||||
*drv = ymfm_opl2board_drv;
|
||||
drv->priv = device_add_inst(&ym_opl2board_device, fm_dev_inst[fm_driver][chip_id]++);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -242,6 +242,7 @@ esfm_drv_read(uint16_t port, void *priv)
|
||||
if (dev->status & STAT_TMR_OVER)
|
||||
ret |= STAT_TMR_ANY;
|
||||
break;
|
||||
|
||||
case 0x0001:
|
||||
ret = ESFM_read_port(&dev->opl, port & 3);
|
||||
switch (dev->opl.addr_latch & 0x5ff) {
|
||||
@@ -256,6 +257,7 @@ esfm_drv_read(uint16_t port, void *priv)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0002:
|
||||
case 0x0003:
|
||||
ret = 0xff;
|
||||
@@ -338,18 +340,18 @@ const device_t esfm_esfmu_device = {
|
||||
.init = esfm_drv_init,
|
||||
.close = esfm_drv_close,
|
||||
.reset = NULL,
|
||||
{ .available = NULL },
|
||||
.available = NULL,
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
const fm_drv_t esfmu_opl_drv = {
|
||||
&esfm_drv_read,
|
||||
&esfm_drv_write,
|
||||
&esfm_drv_update,
|
||||
&esfm_drv_reset_buffer,
|
||||
&esfm_drv_set_do_cycles,
|
||||
NULL,
|
||||
NULL,
|
||||
.read = &esfm_drv_read,
|
||||
.write = &esfm_drv_write,
|
||||
.update = &esfm_drv_update,
|
||||
.reset_buffer = &esfm_drv_reset_buffer,
|
||||
.set_do_cycles = &esfm_drv_set_do_cycles,
|
||||
.priv = NULL,
|
||||
.generate = NULL,
|
||||
};
|
||||
|
||||
@@ -68,9 +68,6 @@
|
||||
|
||||
#define RSM_FRAC 10
|
||||
|
||||
// #define OPL_FREQ FREQ_48000
|
||||
#define OPL_FREQ FREQ_49716
|
||||
|
||||
// Channel types
|
||||
enum {
|
||||
ch_2op = 0,
|
||||
@@ -1276,7 +1273,7 @@ OPL3_Reset(opl3_chip *chip, uint32_t samplerate)
|
||||
}
|
||||
|
||||
chip->noise = 1;
|
||||
chip->rateratio = (samplerate << RSM_FRAC) / 49716;
|
||||
chip->rateratio = (samplerate << RSM_FRAC) / FREQ_49716;
|
||||
chip->tremoloshift = 4;
|
||||
chip->vibshift = 1;
|
||||
|
||||
@@ -1538,7 +1535,7 @@ nuked_drv_init(const device_t *info)
|
||||
dev->status = 0x06;
|
||||
|
||||
/* Initialize the NukedOPL object. */
|
||||
OPL3_Reset(&dev->opl, OPL_FREQ);
|
||||
OPL3_Reset(&dev->opl, FREQ_49716);
|
||||
|
||||
timer_add(&dev->timers[0], nuked_timer_1, dev, 0);
|
||||
timer_add(&dev->timers[1], nuked_timer_2, dev, 0);
|
||||
@@ -1659,7 +1656,7 @@ const device_t ym3812_nuked_device = {
|
||||
.init = nuked_drv_init,
|
||||
.close = nuked_drv_close,
|
||||
.reset = NULL,
|
||||
{ .available = NULL },
|
||||
.available = NULL ,
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
@@ -1673,18 +1670,18 @@ const device_t ymf262_nuked_device = {
|
||||
.init = nuked_drv_init,
|
||||
.close = nuked_drv_close,
|
||||
.reset = NULL,
|
||||
{ .available = NULL },
|
||||
.available = NULL,
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
const fm_drv_t nuked_opl_drv = {
|
||||
&nuked_drv_read,
|
||||
&nuked_drv_write,
|
||||
&nuked_drv_update,
|
||||
&nuked_drv_reset_buffer,
|
||||
&nuked_drv_set_do_cycles,
|
||||
NULL,
|
||||
NULL,
|
||||
.read = &nuked_drv_read,
|
||||
.write = &nuked_drv_write,
|
||||
.update = &nuked_drv_update,
|
||||
.reset_buffer = &nuked_drv_reset_buffer,
|
||||
.set_do_cycles = &nuked_drv_set_do_cycles,
|
||||
.priv = NULL,
|
||||
.generate = NULL,
|
||||
};
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "ymfm/ymfm_opl.h"
|
||||
#include <libserialport.h>
|
||||
|
||||
|
||||
extern "C" {
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
@@ -38,7 +37,6 @@ extern "C" {
|
||||
#include <86box/ini.h>
|
||||
#include <86box/device.h>
|
||||
|
||||
|
||||
// Disable c99-designator to avoid the warnings in *_ymfm_device
|
||||
#ifdef __clang__
|
||||
# if __has_warning("-Wc99-designator")
|
||||
@@ -46,21 +44,16 @@ extern "C" {
|
||||
# pragma clang diagnostic ignored "-Wc99-designator"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
#define RSM_FRAC 10
|
||||
|
||||
#define OPL_FREQ FREQ_48000
|
||||
|
||||
enum {
|
||||
FLAG_CYCLES = (1 << 0)
|
||||
};
|
||||
|
||||
uint8_t lastval = 0x00;
|
||||
|
||||
|
||||
class OPLBOARDChipBase {
|
||||
public:
|
||||
OPLBOARDChipBase(UNUSED(uint32_t clock), fm_type type, uint32_t samplerate)
|
||||
@@ -90,7 +83,6 @@ public:
|
||||
virtual uint8_t read(uint16_t addr) = 0;
|
||||
virtual void set_clock(uint32_t clock) = 0;
|
||||
|
||||
|
||||
protected:
|
||||
int32_t m_buffer[MUSICBUFLEN * 2];
|
||||
int m_buf_pos;
|
||||
@@ -244,7 +236,6 @@ public:
|
||||
|
||||
virtual void write(uint16_t addr, uint8_t data) override
|
||||
{
|
||||
|
||||
m_chip.write(addr, data);
|
||||
}
|
||||
|
||||
@@ -315,31 +306,27 @@ extern "C" {
|
||||
#include <86box/config.h>
|
||||
#include <86box/ini.h>
|
||||
|
||||
|
||||
#ifdef ENABLE_OPL_LOG
|
||||
int ymfm_do_log = ENABLE_OPL_LOG;
|
||||
#ifdef ENABLE_OPL_LOG
|
||||
int oplboard_do_log = ENABLE_OPL_LOG;
|
||||
|
||||
static void
|
||||
ymfm_log(const char *fmt, ...)
|
||||
oplboard_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (ymfm_do_log) {
|
||||
if (oplboard_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
# define ymfm_log(fmt, ...)
|
||||
# define oplboard_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
struct sp_port *port;
|
||||
|
||||
|
||||
|
||||
void opl2board_init() {
|
||||
|
||||
device_add(&opl2board_device);
|
||||
const char* port_name = device_get_config_string("host_serial_path");
|
||||
device_context_restore();
|
||||
@@ -348,13 +335,13 @@ void opl2board_init() {
|
||||
|
||||
result = sp_get_port_by_name(port_name, &port);
|
||||
if (result != SP_OK) {
|
||||
ymfm_log("Error: Cannot find port %s\n", port_name);
|
||||
oplboard_log("Error: Cannot find port %s\n", port_name);
|
||||
return;
|
||||
}
|
||||
|
||||
result = sp_open(port, SP_MODE_READ_WRITE);
|
||||
if (result != SP_OK) {
|
||||
ymfm_log ("Error: Cannot open port %s\n", port_name);
|
||||
oplboard_log ("Error: Cannot open port %s\n", port_name);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -364,33 +351,29 @@ void opl2board_init() {
|
||||
sp_set_parity(port, SP_PARITY_NONE);
|
||||
sp_set_stopbits(port, 1);
|
||||
sp_set_flowcontrol(port, SP_FLOWCONTROL_NONE);
|
||||
|
||||
|
||||
ymfm_log("OPL2Board Serial port %s initialized at 115200 baud.\n", port_name);
|
||||
|
||||
oplboard_log("OPL2Board Serial port %s initialized at 115200 baud.\n", port_name);
|
||||
}
|
||||
|
||||
|
||||
void opl2board_write(uint8_t data) {
|
||||
if (port == NULL) {
|
||||
ymfm_log(stderr, "Error: OPL2Board Port not initialized.\n");
|
||||
oplboard_log(stderr, "Error: OPL2Board Port not initialized.\n");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
enum sp_return result = sp_blocking_write(port, &data, sizeof(data), 1000);
|
||||
if (result < 0) {
|
||||
ymfm_log(stderr, "Error: Failed to write to OPL2Board port.\n");
|
||||
oplboard_log(stderr, "Error: Failed to write to OPL2Board port.\n");
|
||||
} else {
|
||||
ymfm_log("OPL2Board: data sent: %02X\n", data);
|
||||
oplboard_log("OPL2Board: data sent: %02X\n", data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void opl2board_reset() {
|
||||
|
||||
// Reset all voices to 0
|
||||
ymfm_log("Performing OPL2Board reset\n");
|
||||
oplboard_log("Performing OPL2Board reset\n");
|
||||
for (uint8_t i = 0x00; i < 0xFF; i++) {
|
||||
if (i >= 0x40 && i <= 0x55) {
|
||||
opl2board_write(i);
|
||||
@@ -408,11 +391,10 @@ void opl2board_close() {
|
||||
sp_close(port);
|
||||
sp_free_port(port);
|
||||
port = NULL;
|
||||
ymfm_log("OPL2Board port closed.\n");
|
||||
oplboard_log("OPL2Board port closed.\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
ymfm_opl2board_drv_init(const device_t *info)
|
||||
{
|
||||
@@ -433,6 +415,7 @@ static void
|
||||
ymfm_opl2board_drv_close(void *priv)
|
||||
{
|
||||
OPLBOARDChipBase *drv = (OPLBOARDChipBase *) priv;
|
||||
|
||||
opl2board_close();
|
||||
if (drv != NULL)
|
||||
delete drv;
|
||||
@@ -453,29 +436,27 @@ ymfm_opl2board_drv_read(uint16_t port, void *priv)
|
||||
uint8_t ret = drv->read(port);
|
||||
drv->update();
|
||||
|
||||
ymfm_log("YMFM read port %04x, status = %02x\n", port, ret);
|
||||
oplboard_log("OPLBoard read port %04x, status = %02x\n", port, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
ymfm_opl2board_drv_write(uint16_t port, uint8_t val, void *priv)
|
||||
{
|
||||
|
||||
OPLBOARDChipBase *drv = (OPLBOARDChipBase *) priv;
|
||||
|
||||
ymfm_log("YMFM write port %04x value = %02x\n", port, val);
|
||||
oplboard_log("OPLBoard write port %04x value = %02x\n", port, val);
|
||||
if ((port == 0x380) || (port == 0x381))
|
||||
port |= 4;
|
||||
// Allow initialization of adlib
|
||||
if ((val == 0x04 || val == 0x02) || (lastval == 0x04 || lastval == 0x02)) {
|
||||
// Allow initialization of adlib
|
||||
if ((val == 0x04 || val == 0x02) || (lastval == 0x04 || lastval == 0x02))
|
||||
drv->write(port, val);
|
||||
}
|
||||
|
||||
lastval = val;
|
||||
opl2board_write(val);
|
||||
drv->update();
|
||||
}
|
||||
|
||||
|
||||
static int32_t *
|
||||
ymfm_opl2board_drv_update(void *priv)
|
||||
{
|
||||
@@ -500,22 +481,19 @@ static void
|
||||
ymfm_opl2board_drv_set_do_cycles(void *priv, int8_t do_cycles)
|
||||
{
|
||||
OPLBOARDChipBase *drv = (OPLBOARDChipBase *) priv;
|
||||
|
||||
drv->set_do_cycles(do_cycles);
|
||||
}
|
||||
|
||||
static void
|
||||
ymfm_opl2board_drv_generate(void *priv, int32_t *data, uint32_t num_samples)
|
||||
{
|
||||
|
||||
{
|
||||
OPLBOARDChipBase *drv = (OPLBOARDChipBase *) priv;
|
||||
|
||||
// drv->generate_resampled(data, num_samples);
|
||||
drv->generate(data, num_samples);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
const device_t ym_opl2board_device = {
|
||||
.name = "YMOPL2Board (External Device)",
|
||||
.internal_name = "ym_opl2board_device",
|
||||
@@ -524,21 +502,20 @@ const device_t ym_opl2board_device = {
|
||||
.init = ymfm_opl2board_drv_init,
|
||||
.close = ymfm_opl2board_drv_close,
|
||||
.reset = NULL,
|
||||
{ .available = NULL },
|
||||
.available = NULL,
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
const fm_drv_t ymfm_opl2board_drv {
|
||||
&ymfm_opl2board_drv_read,
|
||||
&ymfm_opl2board_drv_write,
|
||||
&ymfm_opl2board_drv_update,
|
||||
&ymfm_opl2board_drv_reset_buffer,
|
||||
&ymfm_opl2board_drv_set_do_cycles,
|
||||
NULL,
|
||||
ymfm_opl2board_drv_generate
|
||||
|
||||
.read = &ymfm_opl2board_drv_read,
|
||||
.write = &ymfm_opl2board_drv_write,
|
||||
.update = &ymfm_opl2board_drv_update,
|
||||
.reset_buffer = &ymfm_opl2board_drv_reset_buffer,
|
||||
.set_do_cycles = &ymfm_opl2board_drv_set_do_cycles,
|
||||
.priv = NULL,
|
||||
.generate = ymfm_opl2board_drv_generate
|
||||
};
|
||||
|
||||
#ifdef __clang__
|
||||
|
||||
@@ -38,13 +38,10 @@ extern "C" {
|
||||
# pragma clang diagnostic ignored "-Wc99-designator"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#define RSM_FRAC 10
|
||||
|
||||
#define OPL_FREQ FREQ_48000
|
||||
|
||||
enum {
|
||||
FLAG_CYCLES = (1 << 0)
|
||||
};
|
||||
@@ -379,6 +376,7 @@ static void
|
||||
ymfm_drv_write(uint16_t port, uint8_t val, void *priv)
|
||||
{
|
||||
YMFMChipBase *drv = (YMFMChipBase *) priv;
|
||||
|
||||
ymfm_log("YMFM write port %04x value = %02x\n", port, val);
|
||||
if ((port == 0x380) || (port == 0x381))
|
||||
port |= 4;
|
||||
@@ -406,6 +404,7 @@ static void
|
||||
ymfm_drv_set_do_cycles(void *priv, int8_t do_cycles)
|
||||
{
|
||||
YMFMChipBase *drv = (YMFMChipBase *) priv;
|
||||
|
||||
drv->set_do_cycles(do_cycles);
|
||||
}
|
||||
|
||||
@@ -413,6 +412,7 @@ static void
|
||||
ymfm_drv_generate(void *priv, int32_t *data, uint32_t num_samples)
|
||||
{
|
||||
YMFMChipBase *drv = (YMFMChipBase *) priv;
|
||||
|
||||
// drv->generate_resampled(data, num_samples);
|
||||
drv->generate(data, num_samples);
|
||||
}
|
||||
@@ -474,13 +474,13 @@ const device_t ymf278b_ymfm_device = {
|
||||
};
|
||||
|
||||
const fm_drv_t ymfm_drv {
|
||||
&ymfm_drv_read,
|
||||
&ymfm_drv_write,
|
||||
&ymfm_drv_update,
|
||||
&ymfm_drv_reset_buffer,
|
||||
&ymfm_drv_set_do_cycles,
|
||||
NULL,
|
||||
ymfm_drv_generate,
|
||||
.read = &ymfm_drv_read,
|
||||
.write = &ymfm_drv_write,
|
||||
.update = &ymfm_drv_update,
|
||||
.reset_buffer = &ymfm_drv_reset_buffer,
|
||||
.set_do_cycles = &ymfm_drv_set_do_cycles,
|
||||
.priv = NULL,
|
||||
.generate = ymfm_drv_generate,
|
||||
};
|
||||
|
||||
#ifdef __clang__
|
||||
|
||||
Reference in New Issue
Block a user