summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio/micro3d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/audio/micro3d.cpp')
-rw-r--r--src/mame/audio/micro3d.cpp181
1 files changed, 55 insertions, 126 deletions
diff --git a/src/mame/audio/micro3d.cpp b/src/mame/audio/micro3d.cpp
index eebed7887a7..8e117894a9a 100644
--- a/src/mame/audio/micro3d.cpp
+++ b/src/mame/audio/micro3d.cpp
@@ -9,7 +9,7 @@
***************************************************************************/
#include "emu.h"
-#include "includes/micro3d.h"
+#include "audio/micro3d.h"
#define MM5837_CLOCK 100000
@@ -22,23 +22,23 @@
*************************************/
/* Borrowed from segasnd.c */
-static inline void configure_filter(m3d_filter_state *state, double r, double c)
+inline void micro3d_sound_device::m3d_filter_state::configure(double r, double c)
{
- state->capval = 0;
- state->exponent = 1.0 - exp(-1.0 / (r * c * 2000000/8));
+ capval = 0;
+ exponent = 1.0 - exp(-1.0 / (r * c * 2000000/8));
}
#if 0
-static inline double step_rc_filter(m3d_filter_state *state, double input)
+inline double micro3d_sound_device::m3d_filter_state::step_rc_filter(double input)
{
- state->capval += (input - state->capval) * state->exponent;
- return state->capval;
+ capval += (input - capval) * exponent;
+ return capval;
}
-static inline double step_cr_filter(m3d_filter_state *state, double input)
+inline double micro3d_sound_device::m3d_filter_state::step_cr_filter(double input)
{
- double result = (input - state->capval);
- state->capval += (input - state->capval) * state->exponent;
+ double const result = input - capval;
+ capval += result * exponent;
return result;
}
#endif
@@ -50,27 +50,27 @@ static inline double step_cr_filter(m3d_filter_state *state, double input)
*
*************************************/
-static void filter_init(running_machine &machine, lp_filter *iir, double fs)
+void micro3d_sound_device::lp_filter::init(double fsval)
{
/* Section 1 */
- iir->ProtoCoef[0].a0 = 1.0;
- iir->ProtoCoef[0].a1 = 0;
- iir->ProtoCoef[0].a2 = 0;
- iir->ProtoCoef[0].b0 = 1.0;
- iir->ProtoCoef[0].b1 = 0.765367;
- iir->ProtoCoef[0].b2 = 1.0;
+ proto_coef[0].a0 = 1.0;
+ proto_coef[0].a1 = 0;
+ proto_coef[0].a2 = 0;
+ proto_coef[0].b0 = 1.0;
+ proto_coef[0].b1 = 0.765367;
+ proto_coef[0].b2 = 1.0;
/* Section 2 */
- iir->ProtoCoef[1].a0 = 1.0;
- iir->ProtoCoef[1].a1 = 0;
- iir->ProtoCoef[1].a2 = 0;
- iir->ProtoCoef[1].b0 = 1.0;
- iir->ProtoCoef[1].b1 = 1.847759;
- iir->ProtoCoef[1].b2 = 1.0;
-
- iir->coef = make_unique_clear<float[]>(4 * 2 + 1);
- iir->fs = fs;
- iir->history = make_unique_clear<float[]>(2 * 2);
+ proto_coef[1].a0 = 1.0;
+ proto_coef[1].a1 = 0;
+ proto_coef[1].a2 = 0;
+ proto_coef[1].b0 = 1.0;
+ proto_coef[1].b1 = 1.847759;
+ proto_coef[1].b2 = 1.0;
+
+ coef = make_unique_clear<float[]>(4 * 2 + 1);
+ fs = fsval;
+ history = make_unique_clear<float[]>(2 * 2);
}
static void prewarp(double *a0, double *a1, double *a2,double fc, double fs)
@@ -102,47 +102,42 @@ static void bilinear(double a0, double a1, double a2,
*coef = (4. * a2 * fs * fs - 2. * a1 * fs + a0) / ad;
}
-static void recompute_filter(lp_filter *iir, double k, double q, double fc)
+void micro3d_sound_device::lp_filter::recompute(double k, double q, double fc)
{
- int nInd;
- double a0, a1, a2, b0, b1, b2;
+ float *c = coef.get() + 1;
- float *coef = iir->coef.get() + 1;
-
- for (nInd = 0; nInd < 2; nInd++)
+ for (int nInd = 0; nInd < 2; nInd++)
{
- a0 = iir->ProtoCoef[nInd].a0;
- a1 = iir->ProtoCoef[nInd].a1;
- a2 = iir->ProtoCoef[nInd].a2;
+ double a0 = proto_coef[nInd].a0;
+ double a1 = proto_coef[nInd].a1;
+ double a2 = proto_coef[nInd].a2;
- b0 = iir->ProtoCoef[nInd].b0;
- b1 = iir->ProtoCoef[nInd].b1 / q;
- b2 = iir->ProtoCoef[nInd].b2;
+ double b0 = proto_coef[nInd].b0;
+ double b1 = proto_coef[nInd].b1 / q;
+ double b2 = proto_coef[nInd].b2;
- prewarp(&a0, &a1, &a2, fc, iir->fs);
- prewarp(&b0, &b1, &b2, fc, iir->fs);
- bilinear(a0, a1, a2, b0, b1, b2, &k, iir->fs, coef);
+ prewarp(&a0, &a1, &a2, fc, fs);
+ prewarp(&b0, &b1, &b2, fc, fs);
+ bilinear(a0, a1, a2, b0, b1, b2, &k, fs, c);
- coef += 4;
+ c += 4;
}
- iir->coef[0] = k;
+ coef[0] = k;
}
-void micro3d_sound_device::noise_sh_w(uint8_t data)
+void micro3d_sound_device::noise_sh_w(u8 data)
{
- micro3d_state *state = machine().driver_data<micro3d_state>();
-
if (~data & 8)
{
- if (state->m_dac_data != m_dac[data & 3])
+ if (m_dac_data != m_dac[data & 3])
{
double q;
double fc;
m_stream->update();
- m_dac[data & 3] = state->m_dac_data;
+ m_dac[data & 3] = m_dac_data;
if (m_dac[VCA] == 255)
m_gain = 0;
@@ -152,7 +147,7 @@ void micro3d_sound_device::noise_sh_w(uint8_t data)
q = 0.75/255 * (255 - m_dac[VCQ]) + 0.1;
fc = 4500.0/255 * (255 - m_dac[VCF]) + 100;
- recompute_filter(&m_filter, m_gain, q, fc);
+ m_filter.recompute(m_gain, q, fc);
}
}
}
@@ -165,10 +160,10 @@ void micro3d_sound_device::noise_sh_w(uint8_t data)
*************************************/
-const device_type MICRO3D = device_creator<micro3d_sound_device>;
+DEFINE_DEVICE_TYPE(MICRO3D, micro3d_sound_device, "micro3d_sound", "Microprose Audio Custom")
-micro3d_sound_device::micro3d_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, MICRO3D, "Microprose Audio Custom", tag, owner, clock, "micro3d_sound", __FILE__),
+micro3d_sound_device::micro3d_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, MICRO3D, tag, owner, clock),
device_sound_interface(mconfig, *this),
m_gain(0),
m_noise_shift(0),
@@ -177,7 +172,7 @@ micro3d_sound_device::micro3d_sound_device(const machine_config &mconfig, const
m_stream(nullptr)
{
- memset(m_dac, 0, sizeof(uint8_t)*4);
+ memset(m_dac, 0, sizeof(u8)*4);
}
//-------------------------------------------------
@@ -188,13 +183,13 @@ void micro3d_sound_device::device_start()
{
/* Allocate the stream */
m_stream = machine().sound().stream_alloc(*this, 0, 2, machine().sample_rate());
- filter_init(machine(), &m_filter, machine().sample_rate());
+ m_filter.init(machine().sample_rate());
- configure_filter(&m_noise_filters[0], 2.7e3 + 2.7e3, 1.0e-6);
- configure_filter(&m_noise_filters[1], 2.7e3 + 1e3, 0.30e-6);
- configure_filter(&m_noise_filters[2], 2.7e3 + 270, 0.15e-6);
- configure_filter(&m_noise_filters[3], 2.7e3 + 0, 0.082e-6);
-// configure_filter(&m_noise_filters[4], 33e3, 0.1e-6);
+ m_noise_filters[0].configure(2.7e3 + 2.7e3, 1.0e-6);
+ m_noise_filters[1].configure(2.7e3 + 1e3, 0.30e-6);
+ m_noise_filters[2].configure(2.7e3 + 270, 0.15e-6);
+ m_noise_filters[3].configure(2.7e3 + 0, 0.082e-6);
+// m_noise_filters[4].configure(33e3, 0.1e-6);
}
//-------------------------------------------------
@@ -296,69 +291,3 @@ void micro3d_sound_device::sound_stream_update(sound_stream &stream, stream_samp
*fr++ = output * pan_r;
}
}
-
-/***************************************************************************
-
- 8031 port mappings:
-
- Port 1 Port 2
- ======= ======
- 0: S/H sel A (O) 0:
- 1: S/H sel B (O) 1:
- 2: S/H sel C (O) 2: uPD bank select (O)
- 3: S/H en (O) 3: /uPD busy (I)
- 4: DS1267 data (O) 4: /uPD reset (O)
- 5: DS1267 clock (O) 5: Watchdog reset (O)
- 6: /DS1267 reset (O) 6:
- 7: Test SW (I) 7:
-
-***************************************************************************/
-
-
-WRITE8_MEMBER(micro3d_state::micro3d_snd_dac_a)
-{
- m_dac_data = data;
-}
-
-WRITE8_MEMBER(micro3d_state::micro3d_snd_dac_b)
-{
- /* TODO: This controls upd7759 volume */
-}
-
-WRITE8_MEMBER(micro3d_state::micro3d_sound_io_w)
-{
- m_sound_port_latch[offset] = data;
-
- switch (offset)
- {
- case 0x01:
- {
- micro3d_sound_device *noise = (data & 4) ? m_noise_2 : m_noise_1;
- noise->noise_sh_w(data);
- break;
- }
- case 0x03:
- {
- m_upd7759->set_bank_base((data & 0x4) ? 0x20000 : 0);
- m_upd7759->reset_w((data & 0x10) ? 0 : 1);
- break;
- }
- }
-}
-
-READ8_MEMBER(micro3d_state::micro3d_sound_io_r)
-{
- switch (offset)
- {
- case 0x01: return (m_sound_port_latch[offset] & 0x7f) | m_sound_sw->read();
- case 0x03: return (m_sound_port_latch[offset] & 0xf7) | (m_upd7759->busy_r() ? 0x08 : 0);
- default: return 0;
- }
-}
-
-WRITE8_MEMBER(micro3d_state::micro3d_upd7759_w)
-{
- m_upd7759->port_w(space, 0, data);
- m_upd7759->start_w(0);
- m_upd7759->start_w(1);
-}