Added NukedOPL emulator for OPL3. Based on patch from Battler.

This commit is contained in:
SarahW 2017-06-06 21:53:30 +01:00
commit 099b7a21d1
17 changed files with 281 additions and 49 deletions

View file

@ -27,7 +27,7 @@ vid_pc1512.c vid_pc1640.c vid_pcjr.c vid_ps1_svga.c vid_s3.c vid_s3_virge.c vid_
vid_stg_ramdac.c vid_svga.c vid_svga_render.c vid_tandy.c vid_tandysl.c vid_tgui9440.c \ vid_stg_ramdac.c vid_svga.c vid_svga_render.c vid_tandy.c vid_tandysl.c vid_tgui9440.c \
vid_tkd8001_ramdac.c vid_tvga.c vid_unk_ramdac.c vid_vga.c vid_voodoo.c video.c wd76c10.c vid_wy700.c \ vid_tkd8001_ramdac.c vid_tvga.c vid_unk_ramdac.c vid_vga.c vid_voodoo.c video.c wd76c10.c vid_wy700.c \
x86seg.c x87.c xtide.c sound_dbopl.cc sound_resid.cc dosbox/cdrom_image.cpp dosbox/dbopl.cpp \ x86seg.c x87.c xtide.c sound_dbopl.cc sound_resid.cc dosbox/cdrom_image.cpp dosbox/dbopl.cpp \
dosbox/vid_cga_comp.c resid-fp/convolve.cc resid-fp/convolve-sse.cc resid-fp/envelope.cc \ dosbox/nukedopl.cpp dosbox/vid_cga_comp.c resid-fp/convolve.cc resid-fp/convolve-sse.cc resid-fp/envelope.cc \
resid-fp/extfilt.cc resid-fp/filter.cc resid-fp/pot.cc resid-fp/sid.cc \ resid-fp/extfilt.cc resid-fp/filter.cc resid-fp/pot.cc resid-fp/sid.cc \
resid-fp/voice.cc resid-fp/wave6581_PS_.cc resid-fp/wave6581_PST.cc \ resid-fp/voice.cc resid-fp/wave6581_PS_.cc resid-fp/wave6581_PST.cc \
resid-fp/wave6581_P_T.cc resid-fp/wave6581__ST.cc resid-fp/wave8580_PS_.cc \ resid-fp/wave6581_P_T.cc resid-fp/wave6581__ST.cc resid-fp/wave8580_PS_.cc \

View file

@ -22,7 +22,7 @@ vid_pc1512.o vid_pc1640.o vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_
vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \ vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \
vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_wy700.o vid_voodoo.o video.o wd76c10.o \ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_wy700.o vid_voodoo.o video.o wd76c10.o \
x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o
DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -22,7 +22,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70
x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o
DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -21,7 +21,7 @@ vid_pc1512.o vid_pc1640.o vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_
vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \ vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \
vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o \ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o \
x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o
DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -22,7 +22,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70
x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o
DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad
vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \ vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \
win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \ win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \
win-status.o win-video.o x86seg.o x87.o xtide.o pc.res win-status.o win-video.o x86seg.o x87.o xtide.o pc.res
DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad
vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xtide.o \ vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xtide.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o
DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad
vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \ vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \
win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \ win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \
win-status.o win-video.o x86seg.o x87.o xtide.o pc.res win-status.o win-video.o x86seg.o x87.o xtide.o pc.res
DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -22,7 +22,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70
x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o
DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -768,12 +768,14 @@ void *adgold_init()
FILE *f; FILE *f;
int c; int c;
double out; double out;
int opl_emu;
adgold_t *adgold = malloc(sizeof(adgold_t)); adgold_t *adgold = malloc(sizeof(adgold_t));
memset(adgold, 0, sizeof(adgold_t)); memset(adgold, 0, sizeof(adgold_t));
adgold->surround_enabled = device_get_config_int("surround"); adgold->surround_enabled = device_get_config_int("surround");
opl_emu = device_get_config_int("opl_emu");
opl3_init(&adgold->opl); opl3_init(&adgold->opl, opl_emu);
if (adgold->surround_enabled) if (adgold->surround_enabled)
ym7128_init(&adgold->ym7128); ym7128_init(&adgold->ym7128);
@ -844,6 +846,23 @@ static device_config_t adgold_config[] =
.type = CONFIG_BINARY, .type = CONFIG_BINARY,
.default_int = 1 .default_int = 1
}, },
{
.name = "opl_emu",
.description = "OPL emulator",
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "DBOPL",
.value = OPL_DBOPL
},
{
.description = "NukedOPL",
.value = OPL_NUKED
},
},
.default_int = OPL_DBOPL
},
{ {
.type = -1 .type = -1
} }

View file

@ -1,15 +1,18 @@
#include "dosbox/dbopl.h" #include "dosbox/dbopl.h"
#include "dosbox/nukedopl.h"
#include "sound_dbopl.h" #include "sound_dbopl.h"
static struct static struct
{ {
DBOPL::Chip chip; DBOPL::Chip chip;
struct opl3_chip opl3chip;
int addr; int addr;
int timer[2]; int timer[2];
uint8_t timer_ctrl; uint8_t timer_ctrl;
uint8_t status_mask; uint8_t status_mask;
uint8_t status; uint8_t status;
int is_opl3; int is_opl3;
int opl_emu;
void (*timer_callback)(void *param, int timer, int64_t period); void (*timer_callback)(void *param, int timer, int64_t period);
void *timer_param; void *timer_param;
@ -31,13 +34,25 @@ enum
CTRL_TIMER1_CTRL = 0x01 CTRL_TIMER1_CTRL = 0x01
}; };
void opl_init(void (*timer_callback)(void *param, int timer, int64_t period), void *timer_param, int nr, int is_opl3) void opl_init(void (*timer_callback)(void *param, int timer, int64_t period), void *timer_param, int nr, int is_opl3, int opl_emu)
{ {
DBOPL::InitTables(); if (!is_opl3 || !opl_emu)
opl[nr].chip.Setup(48000, is_opl3); {
opl[nr].timer_callback = timer_callback; DBOPL::InitTables();
opl[nr].timer_param = timer_param; opl[nr].chip.Setup(48000, is_opl3);
opl[nr].is_opl3 = is_opl3; opl[nr].timer_callback = timer_callback;
opl[nr].timer_param = timer_param;
opl[nr].is_opl3 = is_opl3;
opl[nr].opl_emu = opl_emu;
}
else
{
OPL3_Reset(&opl[nr].opl3chip, 48000);
opl[nr].timer_callback = timer_callback;
opl[nr].timer_param = timer_param;
opl[nr].is_opl3 = is_opl3;
opl[nr].opl_emu = opl_emu;
}
} }
void opl_status_update(int nr) void opl_status_update(int nr)
@ -67,10 +82,18 @@ void opl_timer_over(int nr, int timer)
void opl_write(int nr, uint16_t addr, uint8_t val) void opl_write(int nr, uint16_t addr, uint8_t val)
{ {
if (!(addr & 1)) if (!(addr & 1))
opl[nr].addr = (int)opl[nr].chip.WriteAddr(addr, val) & (opl[nr].is_opl3 ? 0x1ff : 0xff); {
if (!opl[nr].is_opl3 || !opl[nr].opl_emu)
opl[nr].addr = (int)opl[nr].chip.WriteAddr(addr, val) & (opl[nr].is_opl3 ? 0x1ff : 0xff);
else
opl[nr].addr = (int)OPL3_WriteAddr(&opl[nr].opl3chip, addr, val) & 0x1ff;
}
else else
{ {
opl[nr].chip.WriteReg(opl[nr].addr, val); if (!opl[nr].is_opl3 || !opl[nr].opl_emu)
opl[nr].chip.WriteReg(opl[nr].addr, val);
else
OPL3_WriteReg(&opl[nr].opl3chip, opl[nr].addr, val);
switch (opl[nr].addr) switch (opl[nr].addr)
{ {
@ -134,8 +157,15 @@ void opl3_update(int nr, int16_t *buffer, int samples)
int c; int c;
Bit32s buffer_32[samples*2]; Bit32s buffer_32[samples*2];
opl[nr].chip.GenerateBlock3(samples, buffer_32); if (opl[nr].opl_emu)
{
OPL3_GenerateStream(&opl[nr].opl3chip, buffer, samples);
}
else
{
opl[nr].chip.GenerateBlock3(samples, buffer_32);
for (c = 0; c < samples*2; c++) for (c = 0; c < samples*2; c++)
buffer[c] = (int16_t)buffer_32[c]; buffer[c] = (int16_t)buffer_32[c];
}
} }

View file

@ -1,7 +1,7 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void opl_init(void (*timer_callback)(void *param, int timer, int64_t period), void *timer_param, int nr, int is_opl3); void opl_init(void (*timer_callback)(void *param, int timer, int64_t period), void *timer_param, int nr, int is_opl3, int opl_emu);
void opl_write(int nr, uint16_t addr, uint8_t val); void opl_write(int nr, uint16_t addr, uint8_t val);
uint8_t opl_read(int nr, uint16_t addr); uint8_t opl_read(int nr, uint16_t addr);
void opl_timer_over(int nr, int timer); void opl_timer_over(int nr, int timer);

View file

@ -159,17 +159,17 @@ static void opl_timer_callback11(void *p)
void opl2_init(opl_t *opl) void opl2_init(opl_t *opl)
{ {
opl_init(ym3812_timer_set_0, opl, 0, 0); opl_init(ym3812_timer_set_0, opl, 0, 0, 0);
opl_init(ym3812_timer_set_1, opl, 1, 0); opl_init(ym3812_timer_set_1, opl, 1, 0, 0);
timer_add(opl_timer_callback00, &opl->timers[0][0], &opl->timers_enable[0][0], (void *)opl); timer_add(opl_timer_callback00, &opl->timers[0][0], &opl->timers_enable[0][0], (void *)opl);
timer_add(opl_timer_callback01, &opl->timers[0][1], &opl->timers_enable[0][1], (void *)opl); timer_add(opl_timer_callback01, &opl->timers[0][1], &opl->timers_enable[0][1], (void *)opl);
timer_add(opl_timer_callback10, &opl->timers[1][0], &opl->timers_enable[1][0], (void *)opl); timer_add(opl_timer_callback10, &opl->timers[1][0], &opl->timers_enable[1][0], (void *)opl);
timer_add(opl_timer_callback11, &opl->timers[1][1], &opl->timers_enable[1][1], (void *)opl); timer_add(opl_timer_callback11, &opl->timers[1][1], &opl->timers_enable[1][1], (void *)opl);
} }
void opl3_init(opl_t *opl) void opl3_init(opl_t *opl, int opl_emu)
{ {
opl_init(ymf262_timer_set, opl, 0, 1); opl_init(ymf262_timer_set, opl, 0, 1, opl_emu);
timer_add(opl_timer_callback00, &opl->timers[0][0], &opl->timers_enable[0][0], (void *)opl); timer_add(opl_timer_callback00, &opl->timers[0][0], &opl->timers_enable[0][0], (void *)opl);
timer_add(opl_timer_callback01, &opl->timers[0][1], &opl->timers_enable[0][1], (void *)opl); timer_add(opl_timer_callback01, &opl->timers[0][1], &opl->timers_enable[0][1], (void *)opl);
} }

View file

@ -24,7 +24,10 @@ void opl2_poll(opl_t *opl, int16_t *bufl, int16_t *bufr);
void opl3_poll(opl_t *opl, int16_t *bufl, int16_t *bufr); void opl3_poll(opl_t *opl, int16_t *bufl, int16_t *bufr);
void opl2_init(opl_t *opl); void opl2_init(opl_t *opl);
void opl3_init(opl_t *opl); void opl3_init(opl_t *opl, int opl_emu);
void opl2_update2(opl_t *opl); void opl2_update2(opl_t *opl);
void opl3_update2(opl_t *opl); void opl3_update2(opl_t *opl);
#define OPL_DBOPL 0
#define OPL_NUKED 1

View file

@ -731,7 +731,7 @@ void *pas16_init()
pas16_t *pas16 = malloc(sizeof(pas16_t)); pas16_t *pas16 = malloc(sizeof(pas16_t));
memset(pas16, 0, sizeof(pas16_t)); memset(pas16, 0, sizeof(pas16_t));
opl3_init(&pas16->opl); opl3_init(&pas16->opl, 0);
sb_dsp_init(&pas16->dsp, SB2); sb_dsp_init(&pas16->dsp, SB2);
io_sethandler(0x9a01, 0x0001, NULL, NULL, NULL, pas16_out_base, NULL, NULL, pas16); io_sethandler(0x9a01, 0x0001, NULL, NULL, NULL, pas16_out_base, NULL, NULL, pas16);

View file

@ -39,6 +39,8 @@ typedef struct sb_t
int pos; int pos;
uint8_t pos_regs[8]; uint8_t pos_regs[8];
int opl_emu;
} sb_t; } sb_t;
static int sb_att[]= static int sb_att[]=
@ -61,8 +63,8 @@ static void sb_get_buffer_opl2(int32_t *buffer, int len, void *p)
{ {
int32_t out_l, out_r; int32_t out_l, out_r;
out_l = ((((sb->opl.buffer[c] * mixer->fm_l) >> 16) * 55000) >> 16); out_l = ((((sb->opl.buffer[c] * mixer->fm_l) >> 16) * 51000) >> 16);
out_r = ((((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16) * 55000) >> 16); out_r = ((((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16) * 51000) >> 16);
if (sb->mixer.filter) if (sb->mixer.filter)
{ {
@ -112,8 +114,8 @@ static void sb_get_buffer_opl3(int32_t *buffer, int len, void *p)
{ {
int32_t out_l, out_r; int32_t out_l, out_r;
out_l = ((((sb->opl.buffer[c] * mixer->fm_l) >> 16) * 55000) >> 16); out_l = ((((sb->opl.buffer[c] * mixer->fm_l) >> 16) * (sb->opl_emu ? 47000 : 55000)) >> 16);
out_r = ((((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16) * 55000) >> 16); out_r = ((((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16) * (sb->opl_emu ? 47000 : 55000)) >> 16);
if (sb->mixer.filter) if (sb->mixer.filter)
{ {
@ -322,6 +324,7 @@ uint8_t sb_16_mixer_read(uint16_t addr, void *p)
switch (mixer->index) switch (mixer->index)
{ {
case 0x40: return 0xff;
case 0x80: case 0x80:
switch (sb->dsp.sb_irqnum) switch (sb->dsp.sb_irqnum)
{ {
@ -535,7 +538,8 @@ void *sb_pro_v2_init()
uint16_t addr = device_get_config_int("addr"); uint16_t addr = device_get_config_int("addr");
memset(sb, 0, sizeof(sb_t)); memset(sb, 0, sizeof(sb_t));
opl3_init(&sb->opl); sb->opl_emu = device_get_config_int("opl_emu");
opl3_init(&sb->opl, sb->opl_emu);
sb_dsp_init(&sb->dsp, SBPRO2); sb_dsp_init(&sb->dsp, SBPRO2);
sb_dsp_setaddr(&sb->dsp, addr); sb_dsp_setaddr(&sb->dsp, addr);
sb_dsp_setirq(&sb->dsp, device_get_config_int("irq")); sb_dsp_setirq(&sb->dsp, device_get_config_int("irq"));
@ -558,14 +562,11 @@ void *sb_pro_v2_init()
void *sb_pro_mcv_init() void *sb_pro_mcv_init()
{ {
sb_t *sb = malloc(sizeof(sb_t)); sb_t *sb = malloc(sizeof(sb_t));
//uint16_t addr = device_get_config_int("addr");
memset(sb, 0, sizeof(sb_t)); memset(sb, 0, sizeof(sb_t));
opl3_init(&sb->opl); sb->opl_emu = device_get_config_int("opl_emu");
opl3_init(&sb->opl, sb->opl_emu);
sb_dsp_init(&sb->dsp, SBPRO2); sb_dsp_init(&sb->dsp, SBPRO2);
/*sb_dsp_setaddr(&sb->dsp, addr);
sb_dsp_setirq(&sb->dsp, device_get_config_int("irq"));
sb_dsp_setdma8(&sb->dsp, device_get_config_int("dma"));*/
sb_mixer_init(&sb->mixer); sb_mixer_init(&sb->mixer);
io_sethandler(0x0388, 0x0004, opl3_read, NULL, NULL, opl3_write, NULL, NULL, &sb->opl); io_sethandler(0x0388, 0x0004, opl3_read, NULL, NULL, opl3_write, NULL, NULL, &sb->opl);
sound_add_handler(sb_get_buffer_opl3, sb); sound_add_handler(sb_get_buffer_opl3, sb);
@ -587,7 +588,8 @@ void *sb_16_init()
sb_t *sb = malloc(sizeof(sb_t)); sb_t *sb = malloc(sizeof(sb_t));
memset(sb, 0, sizeof(sb_t)); memset(sb, 0, sizeof(sb_t));
opl3_init(&sb->opl); sb->opl_emu = device_get_config_int("opl_emu");
opl3_init(&sb->opl, sb->opl_emu);
sb_dsp_init(&sb->dsp, SB16); sb_dsp_init(&sb->dsp, SB16);
sb_dsp_setaddr(&sb->dsp, 0x0220); sb_dsp_setaddr(&sb->dsp, 0x0220);
sb_mixer_init(&sb->mixer); sb_mixer_init(&sb->mixer);
@ -626,7 +628,8 @@ void *sb_awe32_init()
int onboard_ram = device_get_config_int("onboard_ram"); int onboard_ram = device_get_config_int("onboard_ram");
memset(sb, 0, sizeof(sb_t)); memset(sb, 0, sizeof(sb_t));
opl3_init(&sb->opl); sb->opl_emu = device_get_config_int("opl_emu");
opl3_init(&sb->opl, sb->opl_emu);
sb_dsp_init(&sb->dsp, SB16 + 1); sb_dsp_init(&sb->dsp, SB16 + 1);
sb_dsp_setaddr(&sb->dsp, 0x0220); sb_dsp_setaddr(&sb->dsp, 0x0220);
sb_mixer_init(&sb->mixer); sb_mixer_init(&sb->mixer);
@ -812,7 +815,7 @@ static device_config_t sb_mcv_config[] =
} }
}; };
static device_config_t sb_pro_config[] = static device_config_t sb_pro_v1_config[] =
{ {
{ {
.name = "addr", .name = "addr",
@ -888,6 +891,123 @@ static device_config_t sb_pro_config[] =
} }
}; };
static device_config_t sb_pro_v2_config[] =
{
{
.name = "addr",
.description = "Address",
.type = CONFIG_BINARY,
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "0x220",
.value = 0x220
},
{
.description = "0x240",
.value = 0x240
},
{
.description = ""
}
},
.default_int = 0x220
},
{
.name = "irq",
.description = "IRQ",
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "IRQ 2",
.value = 2
},
{
.description = "IRQ 5",
.value = 5
},
{
.description = "IRQ 7",
.value = 7
},
{
.description = "IRQ 10",
.value = 10
},
{
.description = ""
}
},
.default_int = 7
},
{
.name = "dma",
.description = "DMA",
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "DMA 1",
.value = 1
},
{
.description = "DMA 3",
.value = 3
},
{
.description = ""
}
},
.default_int = 1
},
{
.name = "opl_emu",
.description = "OPL emulator",
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "DBOPL",
.value = OPL_DBOPL
},
{
.description = "NukedOPL",
.value = OPL_NUKED
},
},
.default_int = OPL_DBOPL
},
{
.type = -1
}
};
static device_config_t sb_pro_mcv_config[] =
{
{
.name = "opl_emu",
.description = "OPL emulator",
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "DBOPL",
.value = OPL_DBOPL
},
{
.description = "NukedOPL",
.value = OPL_NUKED
},
},
.default_int = OPL_DBOPL
},
{
.type = -1
}
};
static device_config_t sb_16_config[] = static device_config_t sb_16_config[] =
{ {
{ {
@ -896,6 +1016,23 @@ static device_config_t sb_16_config[] =
.type = CONFIG_MIDI, .type = CONFIG_MIDI,
.default_int = 0 .default_int = 0
}, },
{
.name = "opl_emu",
.description = "OPL emulator",
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "DBOPL",
.value = OPL_DBOPL
},
{
.description = "NukedOPL",
.value = OPL_NUKED
},
},
.default_int = OPL_DBOPL
},
{ {
.type = -1 .type = -1
} }
@ -941,6 +1078,23 @@ static device_config_t sb_awe32_config[] =
}, },
.default_int = 512 .default_int = 512
}, },
{
.name = "opl_emu",
.description = "OPL emulator",
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "DBOPL",
.value = OPL_DBOPL
},
{
.description = "NukedOPL",
.value = OPL_NUKED
},
},
.default_int = OPL_DBOPL
},
{ {
.type = -1 .type = -1
} }
@ -1004,7 +1158,7 @@ device_t sb_pro_v1_device =
sb_speed_changed, sb_speed_changed,
NULL, NULL,
sb_add_status_info, sb_add_status_info,
sb_pro_config sb_pro_v1_config
}; };
device_t sb_pro_v2_device = device_t sb_pro_v2_device =
{ {
@ -1016,7 +1170,7 @@ device_t sb_pro_v2_device =
sb_speed_changed, sb_speed_changed,
NULL, NULL,
sb_add_status_info, sb_add_status_info,
sb_pro_config sb_pro_v2_config
}; };
device_t sb_pro_mcv_device = device_t sb_pro_mcv_device =
{ {
@ -1028,7 +1182,7 @@ device_t sb_pro_mcv_device =
sb_speed_changed, sb_speed_changed,
NULL, NULL,
sb_add_status_info, sb_add_status_info,
NULL sb_pro_mcv_config
}; };
device_t sb_16_device = device_t sb_16_device =
{ {

View file

@ -78,11 +78,12 @@ static void wss_get_buffer(int32_t *buffer, int len, void *p)
void *wss_init() void *wss_init()
{ {
int opl_emu;
wss_t *wss = malloc(sizeof(wss_t)); wss_t *wss = malloc(sizeof(wss_t));
memset(wss, 0, sizeof(wss_t)); memset(wss, 0, sizeof(wss_t));
opl3_init(&wss->opl); opl_emu = device_get_config_int("opl_emu");
opl3_init(&wss->opl, opl_emu);
ad1848_init(&wss->ad1848); ad1848_init(&wss->ad1848);
ad1848_setirq(&wss->ad1848, 7); ad1848_setirq(&wss->ad1848, 7);
@ -111,6 +112,30 @@ void wss_speed_changed(void *p)
ad1848_speed_changed(&wss->ad1848); ad1848_speed_changed(&wss->ad1848);
} }
static device_config_t wss_config[] =
{
{
.name = "opl_emu",
.description = "OPL emulator",
.type = CONFIG_SELECTION,
.selection =
{
{
.description = "DBOPL",
.value = OPL_DBOPL
},
{
.description = "NukedOPL",
.value = OPL_NUKED
},
},
.default_int = OPL_DBOPL
},
{
.type = -1
}
};
device_t wss_device = device_t wss_device =
{ {
"Windows Sound System", "Windows Sound System",
@ -120,5 +145,6 @@ device_t wss_device =
NULL, NULL,
wss_speed_changed, wss_speed_changed,
NULL, NULL,
NULL NULL,
wss_config
}; };