Cleanup: clang-format
This commit is contained in:
@@ -13,7 +13,7 @@
|
|||||||
* Authors: Sarah Walker, <https://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <https://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
* TheCollector1995, <mariogplayer@gmail.com>
|
* TheCollector1995, <mariogplayer@gmail.com>
|
||||||
* Cacodemon345,
|
* Cacodemon345,
|
||||||
* Kagamiin~, <kagamiin@riseup.net>
|
* Kagamiin~, <kagamiin@riseup.net>
|
||||||
*
|
*
|
||||||
* Copyright 2008-2020 Sarah Walker.
|
* Copyright 2008-2020 Sarah Walker.
|
||||||
@@ -49,7 +49,6 @@
|
|||||||
#include <86box/snd_sb.h>
|
#include <86box/snd_sb.h>
|
||||||
#include <86box/plat_unused.h>
|
#include <86box/plat_unused.h>
|
||||||
|
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const double sb_att_4dbstep_3bits[] = {
|
static const double sb_att_4dbstep_3bits[] = {
|
||||||
164.0, 2067.0, 3276.0, 5193.0, 8230.0, 13045.0, 20675.0, 32767.0
|
164.0, 2067.0, 3276.0, 5193.0, 8230.0, 13045.0, 20675.0, 32767.0
|
||||||
@@ -74,7 +73,6 @@ static const double sb_att_2dbstep_4bits[] = {
|
|||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
||||||
/* SB PRO */
|
/* SB PRO */
|
||||||
typedef struct ess_mixer_t {
|
typedef struct ess_mixer_t {
|
||||||
double master_l;
|
double master_l;
|
||||||
@@ -109,21 +107,22 @@ typedef struct ess_mixer_t {
|
|||||||
} ess_mixer_t;
|
} ess_mixer_t;
|
||||||
|
|
||||||
typedef struct ess_t {
|
typedef struct ess_t {
|
||||||
uint8_t mixer_enabled;
|
uint8_t mixer_enabled;
|
||||||
fm_drv_t opl;
|
fm_drv_t opl;
|
||||||
sb_dsp_t dsp;
|
sb_dsp_t dsp;
|
||||||
ess_mixer_t mixer_sbpro;
|
ess_mixer_t mixer_sbpro;
|
||||||
|
|
||||||
mpu_t *mpu;
|
mpu_t *mpu;
|
||||||
void *gameport;
|
void *gameport;
|
||||||
|
|
||||||
uint16_t gameport_addr;
|
uint16_t gameport_addr;
|
||||||
|
|
||||||
void *opl_mixer;
|
void *opl_mixer;
|
||||||
void (*opl_mix)(void*, double*, double*);
|
void (*opl_mix)(void *, double *, double *);
|
||||||
} ess_t;
|
} ess_t;
|
||||||
|
|
||||||
static double ess_mixer_get_vol_4bit(uint8_t vol)
|
static double
|
||||||
|
ess_mixer_get_vol_4bit(uint8_t vol)
|
||||||
{
|
{
|
||||||
return sb_att_2dbstep_4bits[vol & 0x0F] / 32767.0;
|
return sb_att_2dbstep_4bits[vol & 0x0F] / 32767.0;
|
||||||
}
|
}
|
||||||
@@ -137,8 +136,7 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
if (!(addr & 1)) {
|
if (!(addr & 1)) {
|
||||||
mixer->index = val;
|
mixer->index = val;
|
||||||
mixer->regs[0x01] = val;
|
mixer->regs[0x01] = val;
|
||||||
if (val == 0x40)
|
if (val == 0x40) {
|
||||||
{
|
|
||||||
mixer->ess_id_str_pos = 0;
|
mixer->ess_id_str_pos = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -153,10 +151,10 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
|
|
||||||
/* Initialize ESS regs. */
|
/* Initialize ESS regs. */
|
||||||
mixer->regs[0x14] = mixer->regs[0x32] = 0x88;
|
mixer->regs[0x14] = mixer->regs[0x32] = 0x88;
|
||||||
mixer->regs[0x36] = 0x88;
|
mixer->regs[0x36] = 0x88;
|
||||||
mixer->regs[0x38] = 0x88;
|
mixer->regs[0x38] = 0x88;
|
||||||
mixer->regs[0x3a] = 0x00;
|
mixer->regs[0x3a] = 0x00;
|
||||||
mixer->regs[0x3e] = 0x00;
|
mixer->regs[0x3e] = 0x00;
|
||||||
|
|
||||||
sb_dsp_set_stereo(&ess->dsp, mixer->regs[0x0e] & 2);
|
sb_dsp_set_stereo(&ess->dsp, mixer->regs[0x0e] & 2);
|
||||||
} else {
|
} else {
|
||||||
@@ -171,24 +169,24 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0A:
|
case 0x0A:
|
||||||
{
|
{
|
||||||
uint8_t mic_vol_2bit = (mixer->regs[0x0a] >> 1) & 0x3;
|
uint8_t mic_vol_2bit = (mixer->regs[0x0a] >> 1) & 0x3;
|
||||||
mixer->mic_l = mixer->mic_r = sb_att_7dbstep_2bits[mic_vol_2bit] / 32768.0;
|
mixer->mic_l = mixer->mic_r = sb_att_7dbstep_2bits[mic_vol_2bit] / 32768.0;
|
||||||
mixer->regs[0x1A] = mic_vol_2bit | (mic_vol_2bit << 2) | (mic_vol_2bit << 4) | (mic_vol_2bit << 6);
|
mixer->regs[0x1A] = mic_vol_2bit | (mic_vol_2bit << 2) | (mic_vol_2bit << 4) | (mic_vol_2bit << 6);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0x0C:
|
case 0x0C:
|
||||||
switch (mixer->regs[0x0C] & 6) {
|
switch (mixer->regs[0x0C] & 6) {
|
||||||
case 2:
|
case 2:
|
||||||
mixer->input_selector = INPUT_CD_L | INPUT_CD_R;
|
mixer->input_selector = INPUT_CD_L | INPUT_CD_R;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
mixer->input_selector = INPUT_LINE_L | INPUT_LINE_R;
|
mixer->input_selector = INPUT_LINE_L | INPUT_LINE_R;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
mixer->input_selector = INPUT_MIC;
|
mixer->input_selector = INPUT_MIC;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -202,20 +200,13 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x1C:
|
case 0x1C:
|
||||||
if ((mixer->regs[0x1C] & 0x07) == 0x07)
|
if ((mixer->regs[0x1C] & 0x07) == 0x07) {
|
||||||
{
|
|
||||||
mixer->input_selector = INPUT_MIXER_L | INPUT_MIXER_R;
|
mixer->input_selector = INPUT_MIXER_L | INPUT_MIXER_R;
|
||||||
}
|
} else if ((mixer->regs[0x1C] & 0x07) == 0x06) {
|
||||||
else if ((mixer->regs[0x1C] & 0x07) == 0x06)
|
|
||||||
{
|
|
||||||
mixer->input_selector = INPUT_LINE_L | INPUT_LINE_R;
|
mixer->input_selector = INPUT_LINE_L | INPUT_LINE_R;
|
||||||
}
|
} else if ((mixer->regs[0x1C] & 0x06) == 0x02) {
|
||||||
else if ((mixer->regs[0x1C] & 0x06) == 0x02)
|
|
||||||
{
|
|
||||||
mixer->input_selector = INPUT_CD_L | INPUT_CD_R;
|
mixer->input_selector = INPUT_CD_L | INPUT_CD_R;
|
||||||
}
|
} else if ((mixer->regs[0x1C] & 0x02) == 0) {
|
||||||
else if ((mixer->regs[0x1C] & 0x02) == 0)
|
|
||||||
{
|
|
||||||
mixer->input_selector = INPUT_MIC;
|
mixer->input_selector = INPUT_MIC;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -255,26 +246,22 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
mixer->regs[mixer->index] &= ~0x8;
|
mixer->regs[mixer->index] &= ~0x8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x40: {
|
case 0x40:
|
||||||
/* TODO: Implement "Read-Sequence-Key" method of software address selection
|
{
|
||||||
* (needed for ESSCFG.EXE to work properly) */
|
|
||||||
|
|
||||||
uint16_t mpu401_base_addr = 0x300 | ((mixer->regs[0x40] << 1) & 0x30);
|
uint16_t mpu401_base_addr = 0x300 | ((mixer->regs[0x40] << 1) & 0x30);
|
||||||
gameport_remap(ess->gameport, !(mixer->regs[0x40] & 0x2) ? 0x00 : 0x200);
|
gameport_remap(ess->gameport, !(mixer->regs[0x40] & 0x2) ? 0x00 : 0x200);
|
||||||
|
|
||||||
if (0)
|
if (0) {
|
||||||
{
|
|
||||||
/* Not on ES1688. */
|
/* Not on ES1688. */
|
||||||
io_removehandler(0x0388, 0x0004,
|
io_removehandler(0x0388, 0x0004,
|
||||||
ess->opl.read, NULL, NULL,
|
ess->opl.read, NULL, NULL,
|
||||||
ess->opl.write, NULL, NULL,
|
ess->opl.write, NULL, NULL,
|
||||||
ess->opl.priv);
|
ess->opl.priv);
|
||||||
if ((mixer->regs[0x40] & 0x1) != 0)
|
if ((mixer->regs[0x40] & 0x1) != 0) {
|
||||||
{
|
|
||||||
io_sethandler(0x0388, 0x0004,
|
io_sethandler(0x0388, 0x0004,
|
||||||
ess->opl.read, NULL, NULL,
|
ess->opl.read, NULL, NULL,
|
||||||
ess->opl.write, NULL, NULL,
|
ess->opl.write, NULL, NULL,
|
||||||
ess->opl.priv);
|
ess->opl.priv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch ((mixer->regs[0x40] >> 5) & 0x7) {
|
switch ((mixer->regs[0x40] >> 5) & 0x7) {
|
||||||
@@ -315,7 +302,7 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
//pclog("ess: Unknown mixer register WRITE: %02X\t%02X\n", mixer->index, mixer->regs[mixer->index]);
|
// pclog("ess: Unknown mixer register WRITE: %02X\t%02X\n", mixer->index, mixer->regs[mixer->index]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -375,21 +362,18 @@ ess_mixer_read(uint16_t addr, void *priv)
|
|||||||
|
|
||||||
case 0x40:
|
case 0x40:
|
||||||
|
|
||||||
if (ess->dsp.sb_subtype != SB_SUBTYPE_ESS_ES1688)
|
if (ess->dsp.sb_subtype != SB_SUBTYPE_ESS_ES1688) {
|
||||||
{
|
|
||||||
uint8_t val = mixer->ess_id_str[mixer->ess_id_str_pos];
|
uint8_t val = mixer->ess_id_str[mixer->ess_id_str_pos];
|
||||||
mixer->ess_id_str_pos++;
|
mixer->ess_id_str_pos++;
|
||||||
if (mixer->ess_id_str_pos >= 4)
|
if (mixer->ess_id_str_pos >= 4)
|
||||||
mixer->ess_id_str_pos = 0;
|
mixer->ess_id_str_pos = 0;
|
||||||
return val;
|
return val;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return mixer->regs[mixer->index];
|
return mixer->regs[mixer->index];
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
//pclog("ess: Unknown mixer register READ: %02X\t%02X\n", mixer->index, mixer->regs[mixer->index]);
|
// pclog("ess: Unknown mixer register READ: %02X\t%02X\n", mixer->index, mixer->regs[mixer->index]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,10 +390,10 @@ ess_mixer_reset(ess_t *ess)
|
|||||||
void
|
void
|
||||||
ess_get_buffer_sbpro(int32_t *buffer, int len, void *priv)
|
ess_get_buffer_sbpro(int32_t *buffer, int len, void *priv)
|
||||||
{
|
{
|
||||||
ess_t *ess = (ess_t *) priv;
|
ess_t *ess = (ess_t *) priv;
|
||||||
const ess_mixer_t *mixer = &ess->mixer_sbpro;
|
const ess_mixer_t *mixer = &ess->mixer_sbpro;
|
||||||
double out_l = 0.0;
|
double out_l = 0.0;
|
||||||
double out_r = 0.0;
|
double out_r = 0.0;
|
||||||
|
|
||||||
sb_dsp_update(&ess->dsp);
|
sb_dsp_update(&ess->dsp);
|
||||||
|
|
||||||
@@ -440,11 +424,11 @@ ess_get_buffer_sbpro(int32_t *buffer, int len, void *priv)
|
|||||||
void
|
void
|
||||||
ess_get_music_buffer_sbpro(int32_t *buffer, int len, void *priv)
|
ess_get_music_buffer_sbpro(int32_t *buffer, int len, void *priv)
|
||||||
{
|
{
|
||||||
ess_t *ess = (ess_t *) priv;
|
ess_t *ess = (ess_t *) priv;
|
||||||
const ess_mixer_t *mixer = &ess->mixer_sbpro;
|
const ess_mixer_t *mixer = &ess->mixer_sbpro;
|
||||||
double out_l = 0.0;
|
double out_l = 0.0;
|
||||||
double out_r = 0.0;
|
double out_r = 0.0;
|
||||||
const int32_t *opl_buf = NULL;
|
const int32_t *opl_buf = NULL;
|
||||||
|
|
||||||
opl_buf = ess->opl.update(ess->opl.priv);
|
opl_buf = ess->opl.update(ess->opl.priv);
|
||||||
|
|
||||||
@@ -473,13 +457,13 @@ ess_get_music_buffer_sbpro(int32_t *buffer, int len, void *priv)
|
|||||||
void
|
void
|
||||||
ess_filter_cd_audio(int channel, double *buffer, void *priv)
|
ess_filter_cd_audio(int channel, double *buffer, void *priv)
|
||||||
{
|
{
|
||||||
const ess_t *ess = (ess_t *) priv;
|
const ess_t *ess = (ess_t *) priv;
|
||||||
const ess_mixer_t *mixer = &ess->mixer_sbpro;
|
const ess_mixer_t *mixer = &ess->mixer_sbpro;
|
||||||
double c;
|
double c;
|
||||||
double cd = channel ? mixer->cd_r : mixer->cd_l;
|
double cd = channel ? mixer->cd_r : mixer->cd_l;
|
||||||
double master = channel ? mixer->master_r : mixer->master_l;
|
double master = channel ? mixer->master_r : mixer->master_l;
|
||||||
|
|
||||||
c = (*buffer * cd) / 3.0;
|
c = (*buffer * cd) / 3.0;
|
||||||
*buffer = c * master;
|
*buffer = c * master;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,8 +476,8 @@ ess_1688_init(UNUSED(const device_t *info))
|
|||||||
2x6, 2xA, 2xC, 2xE -> DSP chip
|
2x6, 2xA, 2xC, 2xE -> DSP chip
|
||||||
2x8, 2x9, 388 and 389 FM chip (9 voices)
|
2x8, 2x9, 388 and 389 FM chip (9 voices)
|
||||||
2x0+10 to 2x0+13 CDROM interface. */
|
2x0+10 to 2x0+13 CDROM interface. */
|
||||||
ess_t *ess = calloc(sizeof(ess_t), 1);
|
ess_t *ess = calloc(sizeof(ess_t), 1);
|
||||||
uint16_t addr = device_get_config_hex16("base");
|
uint16_t addr = device_get_config_hex16("base");
|
||||||
|
|
||||||
fm_driver_get(FM_ESFM, &ess->opl);
|
fm_driver_get(FM_ESFM, &ess->opl);
|
||||||
|
|
||||||
@@ -544,7 +528,7 @@ ess_1688_init(UNUSED(const device_t *info))
|
|||||||
mpu401_init(ess->mpu, 0, -1, M_UART, 1);
|
mpu401_init(ess->mpu, 0, -1, M_UART, 1);
|
||||||
sb_dsp_set_mpu(&ess->dsp, ess->mpu);
|
sb_dsp_set_mpu(&ess->dsp, ess->mpu);
|
||||||
|
|
||||||
ess->gameport = gameport_add(&gameport_pnp_device);
|
ess->gameport = gameport_add(&gameport_pnp_device);
|
||||||
ess->gameport_addr = 0x200;
|
ess->gameport_addr = 0x200;
|
||||||
gameport_remap(ess->gameport, ess->gameport_addr);
|
gameport_remap(ess->gameport, ess->gameport_addr);
|
||||||
|
|
||||||
@@ -568,95 +552,97 @@ ess_speed_changed(void *priv)
|
|||||||
sb_dsp_speed_changed(&ess->dsp);
|
sb_dsp_speed_changed(&ess->dsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
static const device_config_t ess_config[] = {
|
static const device_config_t ess_config[] = {
|
||||||
{
|
{
|
||||||
.name = "base",
|
.name = "base",
|
||||||
.description = "Address",
|
.description = "Address",
|
||||||
.type = CONFIG_HEX16,
|
.type = CONFIG_HEX16,
|
||||||
.default_string = "",
|
.default_string = "",
|
||||||
.default_int = 0x220,
|
.default_int = 0x220,
|
||||||
.file_filter = "",
|
.file_filter = "",
|
||||||
.spinner = { 0 },
|
.spinner = { 0 },
|
||||||
.selection = {
|
.selection = {
|
||||||
{
|
{
|
||||||
.description = "0x220",
|
.description = "0x220",
|
||||||
.value = 0x220
|
.value = 0x220
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.description = "0x240",
|
.description = "0x240",
|
||||||
.value = 0x240
|
.value = 0x240
|
||||||
},
|
},
|
||||||
{ .description = "" }
|
{ .description = "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "irq",
|
.name = "irq",
|
||||||
.description = "IRQ",
|
.description = "IRQ",
|
||||||
.type = CONFIG_SELECTION,
|
.type = CONFIG_SELECTION,
|
||||||
.default_string = "",
|
.default_string = "",
|
||||||
.default_int = 5,
|
.default_int = 5,
|
||||||
.file_filter = "",
|
.file_filter = "",
|
||||||
.spinner = { 0 },
|
.spinner = { 0 },
|
||||||
.selection = {
|
.selection = {
|
||||||
{
|
{
|
||||||
.description = "IRQ 2",
|
.description = "IRQ 2",
|
||||||
.value = 2
|
.value = 2
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.description = "IRQ 5",
|
.description = "IRQ 5",
|
||||||
.value = 5
|
.value = 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.description = "IRQ 7",
|
.description = "IRQ 7",
|
||||||
.value = 7
|
.value = 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.description = "IRQ 10",
|
.description = "IRQ 10",
|
||||||
.value = 10
|
.value = 10
|
||||||
},
|
},
|
||||||
{ .description = "" }
|
{ .description = "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "dma",
|
.name = "dma",
|
||||||
.description = "DMA",
|
.description = "DMA",
|
||||||
.type = CONFIG_SELECTION,
|
.type = CONFIG_SELECTION,
|
||||||
.default_string = "",
|
.default_string = "",
|
||||||
.default_int = 1,
|
.default_int = 1,
|
||||||
.file_filter = "",
|
.file_filter = "",
|
||||||
.spinner = { 0 },
|
.spinner = { 0 },
|
||||||
.selection = {
|
.selection = {
|
||||||
{
|
{
|
||||||
.description = "DMA 0",
|
.description = "DMA 0",
|
||||||
.value = 0
|
.value = 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.description = "DMA 1",
|
.description = "DMA 1",
|
||||||
.value = 1
|
.value = 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.description = "DMA 3",
|
.description = "DMA 3",
|
||||||
.value = 3
|
.value = 3
|
||||||
},
|
},
|
||||||
{ .description = "" }
|
{ .description = "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "opl",
|
.name = "opl",
|
||||||
.description = "Enable OPL",
|
.description = "Enable OPL",
|
||||||
.type = CONFIG_BINARY,
|
.type = CONFIG_BINARY,
|
||||||
.default_string = "",
|
.default_string = "",
|
||||||
.default_int = 1
|
.default_int = 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "receive_input",
|
.name = "receive_input",
|
||||||
.description = "Receive input (SB MIDI)",
|
.description = "Receive input (SB MIDI)",
|
||||||
.type = CONFIG_BINARY,
|
.type = CONFIG_BINARY,
|
||||||
.default_string = "",
|
.default_string = "",
|
||||||
.default_int = 1
|
.default_int = 1
|
||||||
},
|
},
|
||||||
{ .name = "", .description = "", .type = CONFIG_END }
|
{ .name = "", .description = "", .type = CONFIG_END }
|
||||||
};
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
const device_t ess_1688_device = {
|
const device_t ess_1688_device = {
|
||||||
.name = "ESS Technology ES1688",
|
.name = "ESS Technology ES1688",
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
* This file is part of the 86Box distribution.
|
* This file is part of the 86Box distribution.
|
||||||
*
|
*
|
||||||
* ESFMu ESFM emulator.
|
* ESFMu ESFM emulator.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
* Alexey Khokholov (Nuke.YKT)
|
* Alexey Khokholov (Nuke.YKT)
|
||||||
@@ -29,19 +29,18 @@
|
|||||||
#include "esfmu/esfm.h"
|
#include "esfmu/esfm.h"
|
||||||
|
|
||||||
#define HAVE_STDARG_H
|
#define HAVE_STDARG_H
|
||||||
#define NO_SOFTFLOAT_INCLUDE
|
|
||||||
#include <86box/86box.h>
|
#include <86box/86box.h>
|
||||||
#include <86box/sound.h>
|
#include <86box/sound.h>
|
||||||
#include <86box/device.h>
|
#include <86box/device.h>
|
||||||
#include <86box/timer.h>
|
#include <86box/timer.h>
|
||||||
#include <86box/snd_opl.h>
|
#include <86box/snd_opl.h>
|
||||||
|
|
||||||
#define RSM_FRAC 10
|
#define RSM_FRAC 10
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
esfm_chip opl;
|
esfm_chip opl;
|
||||||
int8_t flags;
|
int8_t flags;
|
||||||
int8_t pad;
|
int8_t pad;
|
||||||
|
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
@@ -180,7 +179,7 @@ static void *
|
|||||||
esfm_drv_init(const device_t *info)
|
esfm_drv_init(const device_t *info)
|
||||||
{
|
{
|
||||||
esfm_drv_t *dev = (esfm_drv_t *) calloc(1, sizeof(esfm_drv_t));
|
esfm_drv_t *dev = (esfm_drv_t *) calloc(1, sizeof(esfm_drv_t));
|
||||||
dev->flags = FLAG_CYCLES | FLAG_OPL3;
|
dev->flags = FLAG_CYCLES | FLAG_OPL3;
|
||||||
|
|
||||||
/* Initialize the ESFMu object. */
|
/* Initialize the ESFMu object. */
|
||||||
ESFM_init(&dev->opl);
|
ESFM_init(&dev->opl);
|
||||||
@@ -207,8 +206,8 @@ esfm_drv_update(void *priv)
|
|||||||
return dev->buffer;
|
return dev->buffer;
|
||||||
|
|
||||||
esfm_drv_generate_stream(dev,
|
esfm_drv_generate_stream(dev,
|
||||||
&dev->buffer[dev->pos * 2],
|
&dev->buffer[dev->pos * 2],
|
||||||
music_pos_global - dev->pos);
|
music_pos_global - dev->pos);
|
||||||
|
|
||||||
for (; dev->pos < music_pos_global; dev->pos++) {
|
for (; dev->pos < music_pos_global; dev->pos++) {
|
||||||
dev->buffer[dev->pos * 2] /= 2;
|
dev->buffer[dev->pos * 2] /= 2;
|
||||||
@@ -218,7 +217,6 @@ esfm_drv_update(void *priv)
|
|||||||
return dev->buffer;
|
return dev->buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
esfm_drv_reset_buffer(void *priv)
|
esfm_drv_reset_buffer(void *priv)
|
||||||
{
|
{
|
||||||
@@ -239,8 +237,7 @@ esfm_drv_read(uint16_t port, void *priv)
|
|||||||
|
|
||||||
uint8_t ret = 0xff;
|
uint8_t ret = 0xff;
|
||||||
|
|
||||||
switch (port & 0x0003)
|
switch (port & 0x0003) {
|
||||||
{
|
|
||||||
case 0x0000:
|
case 0x0000:
|
||||||
ret = dev->status;
|
ret = dev->status;
|
||||||
if (dev->status & STAT_TMR_OVER)
|
if (dev->status & STAT_TMR_OVER)
|
||||||
@@ -248,8 +245,7 @@ esfm_drv_read(uint16_t port, void *priv)
|
|||||||
break;
|
break;
|
||||||
case 0x0001:
|
case 0x0001:
|
||||||
ret = ESFM_read_port(&dev->opl, port & 3);
|
ret = ESFM_read_port(&dev->opl, port & 3);
|
||||||
switch (dev->opl.addr_latch & 0x5ff)
|
switch (dev->opl.addr_latch & 0x5ff) {
|
||||||
{
|
|
||||||
case 0x402:
|
case 0x402:
|
||||||
ret = dev->timer_count[0];
|
ret = dev->timer_count[0];
|
||||||
break;
|
break;
|
||||||
@@ -277,14 +273,12 @@ esfm_drv_write_buffered(esfm_drv_t *dev, uint8_t val)
|
|||||||
|
|
||||||
ESFM_write_reg_buffered_fast(&dev->opl, dev->opl.addr_latch, val);
|
ESFM_write_reg_buffered_fast(&dev->opl, dev->opl.addr_latch, val);
|
||||||
|
|
||||||
if (dev->opl.native_mode)
|
if (dev->opl.native_mode) {
|
||||||
{
|
|
||||||
p -= 0x400;
|
p -= 0x400;
|
||||||
p &= 0x1ff;
|
p &= 0x1ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (p)
|
switch (p) {
|
||||||
{
|
|
||||||
case 0x002: /* Timer 1 */
|
case 0x002: /* Timer 1 */
|
||||||
dev->timer_count[0] = val;
|
dev->timer_count[0] = val;
|
||||||
esfm_log("Timer 0 count now: %i\n", dev->timer_count[0]);
|
esfm_log("Timer 0 count now: %i\n", dev->timer_count[0]);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user