Added NukedOPL emulator for OPL3. Based on patch from Battler.
This commit is contained in:
parent
472a76892a
commit
099b7a21d1
17 changed files with 281 additions and 49 deletions
|
|
@ -1,15 +1,18 @@
|
|||
#include "dosbox/dbopl.h"
|
||||
#include "dosbox/nukedopl.h"
|
||||
#include "sound_dbopl.h"
|
||||
|
||||
static struct
|
||||
{
|
||||
DBOPL::Chip chip;
|
||||
struct opl3_chip opl3chip;
|
||||
int addr;
|
||||
int timer[2];
|
||||
uint8_t timer_ctrl;
|
||||
uint8_t status_mask;
|
||||
uint8_t status;
|
||||
int is_opl3;
|
||||
int opl_emu;
|
||||
|
||||
void (*timer_callback)(void *param, int timer, int64_t period);
|
||||
void *timer_param;
|
||||
|
|
@ -31,13 +34,25 @@ enum
|
|||
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();
|
||||
opl[nr].chip.Setup(48000, is_opl3);
|
||||
opl[nr].timer_callback = timer_callback;
|
||||
opl[nr].timer_param = timer_param;
|
||||
opl[nr].is_opl3 = is_opl3;
|
||||
if (!is_opl3 || !opl_emu)
|
||||
{
|
||||
DBOPL::InitTables();
|
||||
opl[nr].chip.Setup(48000, 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)
|
||||
|
|
@ -67,10 +82,18 @@ void opl_timer_over(int nr, int timer)
|
|||
void opl_write(int nr, uint16_t addr, uint8_t val)
|
||||
{
|
||||
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
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
|
@ -133,9 +156,16 @@ void opl3_update(int nr, int16_t *buffer, int samples)
|
|||
{
|
||||
int c;
|
||||
Bit32s buffer_32[samples*2];
|
||||
|
||||
opl[nr].chip.GenerateBlock3(samples, buffer_32);
|
||||
|
||||
for (c = 0; c < samples*2; c++)
|
||||
buffer[c] = (int16_t)buffer_32[c];
|
||||
|
||||
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++)
|
||||
buffer[c] = (int16_t)buffer_32[c];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue