From d46e2ef7c8a3d3fc0bc87598bf25efa5b1624160 Mon Sep 17 00:00:00 2001 From: Kagamiin~ Date: Fri, 22 Mar 2024 11:56:01 -0300 Subject: [PATCH] Refactored ESFM timers; removed 16-bit clipping from ESFMu Co-authored-by: OBattler --- src/sound/esfmu/esfm.c | 15 +++++-- src/sound/esfmu/esfm.h | 2 +- src/sound/snd_opl_esfm.c | 88 +++++++++++++--------------------------- 3 files changed, 40 insertions(+), 65 deletions(-) diff --git a/src/sound/esfmu/esfm.c b/src/sound/esfmu/esfm.c index 08beadb5a..274afd277 100644 --- a/src/sound/esfmu/esfm.c +++ b/src/sound/esfmu/esfm.c @@ -1741,6 +1741,10 @@ ESFM_slot_generate_emu(esfm_slot *slot) } /* ------------------------------------------------------------------------- */ +#pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wunused-variable" +#pragma clang diagnostic ignored "-Wunknown-pragmas" static void ESFM_process_feedback(esfm_chip *chip) { @@ -2226,7 +2230,7 @@ ESFM_update_write_buffer(esfm_chip *chip) /* ------------------------------------------------------------------------- */ void -ESFM_generate(esfm_chip *chip, int16_t *buf) +ESFM_generate(esfm_chip *chip, int32_t *buf) { int channel_idx; @@ -2259,8 +2263,8 @@ ESFM_generate(esfm_chip *chip, int16_t *buf) chip->output_accm[1] += channel->output[1]; } - buf[0] = ESFM_clip_sample(chip->output_accm[0]); - buf[1] = ESFM_clip_sample(chip->output_accm[1]); + buf[0] = chip->output_accm[0]; + buf[1] = chip->output_accm[1]; ESFM_update_timers(chip); ESFM_update_write_buffer(chip); @@ -2308,10 +2312,13 @@ void ESFM_generate_stream(esfm_chip *chip, int16_t *sndptr, uint32_t num_samples) { uint32_t i; + int32_t buf[2] = { 0 }; for (i = 0; i < num_samples; i++) { - ESFM_generate(chip, sndptr); + ESFM_generate(chip, buf); + sndptr[0] = ESFM_clip_sample(buf[0]); + sndptr[1] = ESFM_clip_sample(buf[1]); sndptr += 2; } } diff --git a/src/sound/esfmu/esfm.h b/src/sound/esfmu/esfm.h index 41ac6983f..eda8bcbb3 100644 --- a/src/sound/esfmu/esfm.h +++ b/src/sound/esfmu/esfm.h @@ -67,7 +67,7 @@ void ESFM_write_reg_buffered_fast (esfm_chip *chip, uint16_t address, uint8_t da void ESFM_write_port (esfm_chip *chip, uint8_t offset, uint8_t data); uint8_t ESFM_readback_reg (esfm_chip *chip, uint16_t address); uint8_t ESFM_read_port (esfm_chip *chip, uint8_t offset); -void ESFM_generate(esfm_chip *chip, int16_t *buf); +void ESFM_generate(esfm_chip *chip, int32_t *buf); void ESFM_generate_stream(esfm_chip *chip, int16_t *sndptr, uint32_t num_samples); int16_t ESFM_get_channel_output_native(esfm_chip *chip, int channel_idx); diff --git a/src/sound/snd_opl_esfm.c b/src/sound/snd_opl_esfm.c index cf4e94cb1..174830523 100644 --- a/src/sound/snd_opl_esfm.c +++ b/src/sound/snd_opl_esfm.c @@ -99,10 +99,7 @@ esfm_log(const char *fmt, ...) void esfm_generate_raw(esfm_drv_t *dev, int32_t *bufp) { - ESFM_generate(&dev->opl, &dev->samples[0]); - - bufp[0] = dev->samples[0]; - bufp[1] = dev->samples[1]; + ESFM_generate(&dev->opl, bufp); } void @@ -270,75 +267,48 @@ esfm_drv_read(uint16_t port, void *priv) break; } - esfm_log("esfm: [%04X:%08X] [R] %04X = %02X\n", CS, cpu_state.pc, port, ret); - return ret; } static void esfm_drv_write_buffered(esfm_drv_t *dev, uint8_t val) { + uint16_t p = dev->port; + ESFM_write_reg_buffered_fast(&dev->opl, dev->opl.addr_latch, val); if (dev->opl.native_mode) { - switch (dev->port & 0x5ff) - { - case 0x402: /* Timer 1 */ - dev->timer_count[0] = val; - esfm_log("Timer 0 count now: %i\n", dev->timer_count[0]); - break; - - case 0x403: /* Timer 2 */ - dev->timer_count[1] = val; - esfm_log("Timer 1 count now: %i\n", dev->timer_count[1]); - break; - - case 0x404: /* Timer control */ - if (val & CTRL_RESET) { - esfm_log("Resetting timer status...\n"); - dev->status &= ~STAT_TMR_OVER; - } else { - dev->timer_ctrl = val; - esfm_timer_control(dev, 0, val & CTRL_TMR1_START); - esfm_timer_control(dev, 1, val & CTRL_TMR2_START); - esfm_log("Status mask now %02X (val = %02X)\n", (val & ~CTRL_TMR_MASK) & CTRL_TMR_MASK, val); - } - break; - - default: - break; - } + p -= 0x400; + p &= 0x1ff; } - else + + switch (p) { - switch (dev->port & 0x1ff) - { - case 0x002: /* Timer 1 */ - dev->timer_count[0] = val; - esfm_log("Timer 0 count now: %i\n", dev->timer_count[0]); - break; + case 0x002: /* Timer 1 */ + dev->timer_count[0] = val; + esfm_log("Timer 0 count now: %i\n", dev->timer_count[0]); + break; - case 0x003: /* Timer 2 */ - dev->timer_count[1] = val; - esfm_log("Timer 1 count now: %i\n", dev->timer_count[1]); - break; + case 0x003: /* Timer 2 */ + dev->timer_count[1] = val; + esfm_log("Timer 1 count now: %i\n", dev->timer_count[1]); + break; - case 0x004: /* Timer control */ - if (val & CTRL_RESET) { - esfm_log("Resetting timer status...\n"); - dev->status &= ~STAT_TMR_OVER; - } else { - dev->timer_ctrl = val; - esfm_timer_control(dev, 0, val & CTRL_TMR1_START); - esfm_timer_control(dev, 1, val & CTRL_TMR2_START); - esfm_log("Status mask now %02X (val = %02X)\n", (val & ~CTRL_TMR_MASK) & CTRL_TMR_MASK, val); - } - break; + case 0x004: /* Timer control */ + if (val & CTRL_RESET) { + esfm_log("Resetting timer status...\n"); + dev->status &= ~STAT_TMR_OVER; + } else { + dev->timer_ctrl = val; + esfm_timer_control(dev, 0, val & CTRL_TMR1_START); + esfm_timer_control(dev, 1, val & CTRL_TMR2_START); + esfm_log("Status mask now %02X (val = %02X)\n", (val & ~CTRL_TMR_MASK) & CTRL_TMR_MASK, val); + } + break; - default: - break; - } + default: + break; } } @@ -347,8 +317,6 @@ esfm_drv_write(uint16_t port, uint8_t val, void *priv) { esfm_drv_t *dev = (esfm_drv_t *) priv; - esfm_log("esfm: [%04X:%08X] [W] %04X = %02X\n", CS, cpu_state.pc, port, val); - if (dev->flags & FLAG_CYCLES) cycles -= ((int) (isa_timing * 8));