From 5b1c4664804a56e6749c11dad6aff54013aa395c Mon Sep 17 00:00:00 2001 From: smf- Date: Fri, 31 Aug 2018 02:20:14 +0100 Subject: 32x, Fix FIFO & number of dac bits. [smf] --- src/mame/machine/mega32x.cpp | 91 ++++++++++++++++++++++---------------------- src/mame/machine/mega32x.h | 7 +++- 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/src/mame/machine/mega32x.cpp b/src/mame/machine/mega32x.cpp index 5407ac939ba..435e8090c99 100644 --- a/src/mame/machine/mega32x.cpp +++ b/src/mame/machine/mega32x.cpp @@ -210,7 +210,6 @@ GFX check (these don't explicitly fails): #define _32X_COMMS_PORT_SYNC 0 #define MAX_HPOSITION 480 /* need to make some pwm stuff part of device */ -#define PWM_FIFO_SIZE m_pwm_tm_reg // guess, Marsch calls this register as FIFO width @@ -818,44 +817,56 @@ void sega_32x_device::calculate_pwm_timer() { m_pwm_timer_tick = 0; m_lch_fifo_state = m_rch_fifo_state = 0x4000; - m_lch_index_r = m_rch_index_r = 0; - m_lch_index_w = m_rch_index_w = 0; + m_lch_size = m_rch_size = 0; m_32x_pwm_timer->adjust(attotime::from_hz(clock() / (m_pwm_cycle - 1))); } } +void sega_32x_device::lch_pop() +{ + for (int i = 0; i < PWM_FIFO_SIZE - 1; i++) + m_cur_lch[i] = m_cur_lch[i + 1]; + m_lch_size--; +} + +void sega_32x_device::rch_pop() +{ + for (int i = 0; i < PWM_FIFO_SIZE - 1; i++) + m_cur_rch[i] = m_cur_rch[i + 1]; + m_rch_size--; +} TIMER_CALLBACK_MEMBER(sega_32x_device::handle_pwm_callback) { - if(m_lch_index_r < PWM_FIFO_SIZE) + if (m_lch_size > 0) { switch(m_pwm_ctrl & 3) { - case 0: m_lch_index_r++; /*Speaker OFF*/ break; - case 1: m_ldac->write(m_cur_lch[m_lch_index_r++]); break; - case 2: m_rdac->write(m_cur_lch[m_lch_index_r++]); break; + case 0: /*Speaker OFF*/ break; + case 1: m_ldac->write(m_cur_lch[0]); break; + case 2: m_rdac->write(m_cur_lch[0]); break; case 3: popmessage("Undefined PWM Lch value 3, contact MESSdev"); break; } - m_lch_index_w = 0; + lch_pop(); } - m_lch_fifo_state = (m_lch_index_r == PWM_FIFO_SIZE) ? 0x4000 : 0x0000; + m_lch_fifo_state = (m_lch_size == 0) ? 0x4000 : 0x0000; - if(m_rch_index_r < PWM_FIFO_SIZE) + if (m_rch_size > 0) { switch((m_pwm_ctrl & 0xc) >> 2) { - case 0: m_rch_index_r++; /*Speaker OFF*/ break; - case 1: m_rdac->write(m_cur_rch[m_rch_index_r++]); break; - case 2: m_ldac->write(m_cur_rch[m_rch_index_r++]); break; + case 0: /*Speaker OFF*/ break; + case 1: m_rdac->write(m_cur_rch[0]); break; + case 2: m_ldac->write(m_cur_rch[0]); break; case 3: popmessage("Undefined PWM Rch value 3, contact MESSdev"); break; } - m_rch_index_w = 0; + rch_pop(); } - m_rch_fifo_state = (m_rch_index_r == PWM_FIFO_SIZE) ? 0x4000 : 0x0000; + m_rch_fifo_state = (m_rch_size == 0) ? 0x4000 : 0x0000; m_pwm_timer_tick++; @@ -898,40 +909,30 @@ WRITE16_MEMBER( sega_32x_device::_32x_pwm_w ) calculate_pwm_timer(); break; case 0x04/2: - if(m_lch_index_w < PWM_FIFO_SIZE) - { - m_cur_lch[m_lch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf); - m_lch_index_r = 0; - } + if (m_lch_size == PWM_FIFO_SIZE) + lch_pop(); + m_cur_lch[m_lch_size++] = data; - m_lch_fifo_state = (m_lch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000; + m_lch_fifo_state = (m_lch_size == PWM_FIFO_SIZE) ? 0x8000 : 0x0000; break; case 0x06/2: - if(m_rch_index_w < PWM_FIFO_SIZE) - { - m_cur_rch[m_rch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf); - m_rch_index_r = 0; - } - - m_rch_fifo_state = (m_rch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000; + if (m_rch_size == PWM_FIFO_SIZE) + rch_pop(); + m_cur_rch[m_rch_size++] = data; + m_rch_fifo_state = (m_rch_size == PWM_FIFO_SIZE) ? 0x8000 : 0x0000; break; case 0x08/2: - if(m_lch_index_w < PWM_FIFO_SIZE) - { - m_cur_lch[m_lch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf); - m_lch_index_r = 0; - } - - if(m_rch_index_w < PWM_FIFO_SIZE) - { - m_cur_rch[m_rch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf); - m_rch_index_r = 0; - } + if (m_lch_size == PWM_FIFO_SIZE) + lch_pop(); + m_cur_lch[m_lch_size++] = data; - m_lch_fifo_state = (m_lch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000; - m_rch_fifo_state = (m_rch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000; + if (m_rch_size == PWM_FIFO_SIZE) + rch_pop(); + m_cur_rch[m_rch_size++] = data; + m_lch_fifo_state = (m_lch_size == PWM_FIFO_SIZE) ? 0x8000 : 0x0000; + m_rch_fifo_state = (m_rch_size == PWM_FIFO_SIZE) ? 0x8000 : 0x0000; break; default: printf("Write at undefined PWM register %02x %04x\n",offset,data); @@ -1782,8 +1783,8 @@ MACHINE_CONFIG_START(sega_32x_ntsc_device::device_add_mconfig) MCFG_SH2_FIFO_DATA_AVAIL_CB(sega_32x_device, _32x_fifo_available_callback) #endif - MCFG_DEVICE_ADD("ldac", DAC_16BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, ":lspeaker", 0.4) // unknown DAC - MCFG_DEVICE_ADD("rdac", DAC_16BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, ":rspeaker", 0.4) // unknown DAC + MCFG_DEVICE_ADD("ldac", DAC_12BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, ":lspeaker", 0.4) // unknown DAC + MCFG_DEVICE_ADD("rdac", DAC_12BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, ":rspeaker", 0.4) // unknown DAC MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT) MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT) @@ -1883,8 +1884,8 @@ void sega_32x_device::device_reset() m_pwm_ctrl = 0; calculate_pwm_timer(); - m_lch_index_w = 0; - m_rch_index_w = 0; + m_lch_size = 0; + m_rch_size = 0; m_total_scanlines = 262; diff --git a/src/mame/machine/mega32x.h b/src/mame/machine/mega32x.h index 0c5c45c156e..ed68d3e4d87 100644 --- a/src/mame/machine/mega32x.h +++ b/src/mame/machine/mega32x.h @@ -138,12 +138,15 @@ protected: TIMER_CALLBACK_MEMBER(handle_pwm_callback); void calculate_pwm_timer(); uint16_t m_pwm_ctrl, m_pwm_cycle, m_pwm_tm_reg; - uint16_t m_cur_lch[0x10],m_cur_rch[0x10]; + static constexpr int PWM_FIFO_SIZE = 3; + uint16_t m_cur_lch[PWM_FIFO_SIZE],m_cur_rch[PWM_FIFO_SIZE]; uint16_t m_pwm_cycle_reg; //used for latching uint8_t m_pwm_timer_tick; - uint8_t m_lch_index_r, m_rch_index_r, m_lch_index_w, m_rch_index_w; + uint8_t m_lch_size, m_rch_size; uint16_t m_lch_fifo_state, m_rch_fifo_state; + void lch_pop(); + void rch_pop(); uint16_t get_hposition(void); -- cgit v1.2.3