OPL cycles fixes.
This commit is contained in:
@@ -32,7 +32,7 @@ typedef struct {
|
|||||||
#else
|
#else
|
||||||
void *opl;
|
void *opl;
|
||||||
#endif
|
#endif
|
||||||
int8_t is_opl3;
|
int8_t is_opl3, do_cycles;
|
||||||
|
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
@@ -47,6 +47,8 @@ typedef struct {
|
|||||||
} opl_t;
|
} opl_t;
|
||||||
|
|
||||||
|
|
||||||
|
extern void opl_set_do_cycles(opl_t *dev, int8_t do_cycles);
|
||||||
|
|
||||||
extern uint8_t opl2_read(uint16_t port, void *);
|
extern uint8_t opl2_read(uint16_t port, void *);
|
||||||
extern void opl2_write(uint16_t port, uint8_t val, void *);
|
extern void opl2_write(uint16_t port, uint8_t val, void *);
|
||||||
extern void opl2_init(opl_t *);
|
extern void opl2_init(opl_t *);
|
||||||
|
@@ -162,11 +162,20 @@ opl_write(opl_t *dev, uint16_t port, uint8_t val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
opl_set_do_cycles(opl_t *dev, int8_t do_cycles)
|
||||||
|
{
|
||||||
|
dev->do_cycles = do_cycles;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
opl_init(opl_t *dev, int is_opl3)
|
opl_init(opl_t *dev, int is_opl3)
|
||||||
{
|
{
|
||||||
memset(dev, 0x00, sizeof(opl_t));
|
memset(dev, 0x00, sizeof(opl_t));
|
||||||
|
|
||||||
dev->is_opl3 = is_opl3;
|
dev->is_opl3 = is_opl3;
|
||||||
|
dev->do_cycles = 1;
|
||||||
|
|
||||||
/* Create a NukedOPL object. */
|
/* Create a NukedOPL object. */
|
||||||
dev->opl = nuked_init(48000);
|
dev->opl = nuked_init(48000);
|
||||||
@@ -192,7 +201,8 @@ opl2_read(uint16_t port, void *priv)
|
|||||||
{
|
{
|
||||||
opl_t *dev = (opl_t *)priv;
|
opl_t *dev = (opl_t *)priv;
|
||||||
|
|
||||||
cycles -= ISA_CYCLES(8);
|
if (dev->do_cycles)
|
||||||
|
sub_cycles((int) (isa_timing * 8));
|
||||||
|
|
||||||
opl2_update(dev);
|
opl2_update(dev);
|
||||||
|
|
||||||
@@ -240,7 +250,8 @@ opl3_read(uint16_t port, void *priv)
|
|||||||
{
|
{
|
||||||
opl_t *dev = (opl_t *)priv;
|
opl_t *dev = (opl_t *)priv;
|
||||||
|
|
||||||
cycles -= ISA_CYCLES(8);
|
if (dev->do_cycles)
|
||||||
|
sub_cycles((int)(isa_timing * 8));
|
||||||
|
|
||||||
opl3_update(dev);
|
opl3_update(dev);
|
||||||
|
|
||||||
|
@@ -1187,6 +1187,8 @@ sb_pro_v1_opl_read(uint16_t port, void *priv)
|
|||||||
{
|
{
|
||||||
sb_t *sb = (sb_t *)priv;
|
sb_t *sb = (sb_t *)priv;
|
||||||
|
|
||||||
|
sub_cycles((int)(isa_timing * 8));
|
||||||
|
|
||||||
(void)opl2_read(port, &sb->opl2); // read, but ignore
|
(void)opl2_read(port, &sb->opl2); // read, but ignore
|
||||||
return(opl2_read(port, &sb->opl));
|
return(opl2_read(port, &sb->opl));
|
||||||
}
|
}
|
||||||
@@ -1225,7 +1227,9 @@ void *sb_pro_v1_init(const device_t *info)
|
|||||||
sb->opl_enabled = device_get_config_int("opl");
|
sb->opl_enabled = device_get_config_int("opl");
|
||||||
if (sb->opl_enabled) {
|
if (sb->opl_enabled) {
|
||||||
opl2_init(&sb->opl);
|
opl2_init(&sb->opl);
|
||||||
|
opl_set_do_cycles(&sb->opl, 0);
|
||||||
opl2_init(&sb->opl2);
|
opl2_init(&sb->opl2);
|
||||||
|
opl_set_do_cycles(&sb->opl2, 0);
|
||||||
}
|
}
|
||||||
sb_dsp_init(&sb->dsp, SBPRO, SB_SUBTYPE_DEFAULT, sb);
|
sb_dsp_init(&sb->dsp, SBPRO, SB_SUBTYPE_DEFAULT, sb);
|
||||||
sb_dsp_setaddr(&sb->dsp, addr);
|
sb_dsp_setaddr(&sb->dsp, addr);
|
||||||
|
Reference in New Issue
Block a user