summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author smf- <smf-@users.noreply.github.com>2018-08-31 02:20:14 +0100
committer smf- <smf-@users.noreply.github.com>2018-08-31 02:32:43 +0100
commit5b1c4664804a56e6749c11dad6aff54013aa395c (patch)
tree0d8b1dfe46c838a10b6c2a670d7c54ac03e8c1a9
parentbb32d72c7e68d4b34a94e1250f1440394d473f7d (diff)
32x, Fix FIFO & number of dac bits. [smf]
-rw-r--r--src/mame/machine/mega32x.cpp91
-rw-r--r--src/mame/machine/mega32x.h7
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);