summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/devices/sound/c352.cpp140
-rw-r--r--src/devices/sound/c352.h42
2 files changed, 89 insertions, 93 deletions
diff --git a/src/devices/sound/c352.cpp b/src/devices/sound/c352.cpp
index 142c82349bb..73fe655522d 100644
--- a/src/devices/sound/c352.cpp
+++ b/src/devices/sound/c352.cpp
@@ -27,7 +27,7 @@
#if C352_LOG_PCM
#include <map>
-static std::map<uint32_t, bool> s_found_pcm;
+static std::map<u32, bool> s_found_pcm;
#endif
// device type definition
@@ -41,7 +41,7 @@ DEFINE_DEVICE_TYPE(C352, c352_device, "c352", "Namco C352")
// c352_device - constructor
//-------------------------------------------------
-c352_device::c352_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+c352_device::c352_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, C352, tag, owner, clock)
, device_sound_interface(mconfig, *this)
, device_rom_interface(mconfig, *this, 24)
@@ -69,14 +69,14 @@ void c352_device::fetch_sample(c352_voice_t& v)
}
else
{
- int8_t s = (int8_t)read_byte(v.pos);
+ s8 s = (s8)read_byte(v.pos);
if (v.flags & C352_FLG_MULAW)
v.sample = m_mulawtab[s & 0xff];
else
v.sample = s << 8;
- uint16_t pos = v.pos & 0xffff;
+ u16 pos = v.pos & 0xffff;
if ((v.flags & C352_FLG_LOOP) && v.flags & C352_FLG_REVERSE)
{
@@ -115,9 +115,9 @@ void c352_device::fetch_sample(c352_voice_t& v)
}
}
-void c352_device::ramp_volume(c352_voice_t &v, int ch, uint8_t val)
+void c352_device::ramp_volume(c352_voice_t &v, int ch, u8 val)
{
- int16_t vol_delta = v.curr_vol[ch] - val;
+ s16 vol_delta = v.curr_vol[ch] - val;
if (vol_delta != 0)
v.curr_vol[ch] += (vol_delta > 0) ? -1 : 1;
}
@@ -131,16 +131,16 @@ void c352_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
for (int i = 0; i < samples; i++)
{
- long out[4] = { 0, 0, 0, 0 };
+ int out[4] = { 0, 0, 0, 0 };
for (int j = 0; j < 32; j++)
{
c352_voice_t &v = m_c352_v[j];
- int16_t s = 0;
+ s16 s = 0;
if (v.flags & C352_FLG_BUSY)
{
- int32_t next_counter = v.counter + v.freq;
+ s32 next_counter = v.counter + v.freq;
if (next_counter & 0x10000)
{
@@ -173,32 +173,32 @@ void c352_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
out[3] += (((v.flags & C352_FLG_PHASEFR) ? -s : s) * v.curr_vol[3]) >> 8;
}
- *buffer_fl++ = (int16_t)(out[0] >> 3);
- *buffer_fr++ = (int16_t)(out[1] >> 3);
- *buffer_rl++ = (int16_t)(out[2] >> 3);
- *buffer_rr++ = (int16_t)(out[3] >> 3);
+ *buffer_fl++ = (s16)(out[0] >> 3);
+ *buffer_fr++ = (s16)(out[1] >> 3);
+ *buffer_rl++ = (s16)(out[2] >> 3);
+ *buffer_rr++ = (s16)(out[3] >> 3);
}
}
-uint16_t c352_device::read_reg16(unsigned long address)
+u16 c352_device::read_reg16(offs_t offset)
{
m_stream->update();
const int reg_map[8] =
{
- offsetof(c352_voice_t, vol_f) / sizeof(uint16_t),
- offsetof(c352_voice_t, vol_r) / sizeof(uint16_t),
- offsetof(c352_voice_t, freq) / sizeof(uint16_t),
- offsetof(c352_voice_t, flags) / sizeof(uint16_t),
- offsetof(c352_voice_t, wave_bank) / sizeof(uint16_t),
- offsetof(c352_voice_t, wave_start) / sizeof(uint16_t),
- offsetof(c352_voice_t, wave_end) / sizeof(uint16_t),
- offsetof(c352_voice_t, wave_loop) / sizeof(uint16_t),
+ offsetof(c352_voice_t, vol_f) / sizeof(u16),
+ offsetof(c352_voice_t, vol_r) / sizeof(u16),
+ offsetof(c352_voice_t, freq) / sizeof(u16),
+ offsetof(c352_voice_t, flags) / sizeof(u16),
+ offsetof(c352_voice_t, wave_bank) / sizeof(u16),
+ offsetof(c352_voice_t, wave_start) / sizeof(u16),
+ offsetof(c352_voice_t, wave_end) / sizeof(u16),
+ offsetof(c352_voice_t, wave_loop) / sizeof(u16),
};
- if (address < 0x100)
- return *((uint16_t*)&m_c352_v[address / 8] + reg_map[address % 8]);
- else if (address == 0x200)
+ if (offset < 0x100)
+ return *((u16*)&m_c352_v[offset / 8] + reg_map[offset % 8]);
+ else if (offset == 0x200)
return m_control;
else
return 0;
@@ -206,33 +206,38 @@ uint16_t c352_device::read_reg16(unsigned long address)
return 0;
}
-void c352_device::write_reg16(unsigned long address, unsigned short val)
+void c352_device::write_reg16(offs_t offset, u16 data, u16 mem_mask)
{
m_stream->update();
const int reg_map[8] =
{
- offsetof(c352_voice_t, vol_f) / sizeof(uint16_t),
- offsetof(c352_voice_t, vol_r) / sizeof(uint16_t),
- offsetof(c352_voice_t, freq) / sizeof(uint16_t),
- offsetof(c352_voice_t, flags) / sizeof(uint16_t),
- offsetof(c352_voice_t, wave_bank) / sizeof(uint16_t),
- offsetof(c352_voice_t, wave_start) / sizeof(uint16_t),
- offsetof(c352_voice_t, wave_end) / sizeof(uint16_t),
- offsetof(c352_voice_t, wave_loop) / sizeof(uint16_t),
+ offsetof(c352_voice_t, vol_f) / sizeof(u16),
+ offsetof(c352_voice_t, vol_r) / sizeof(u16),
+ offsetof(c352_voice_t, freq) / sizeof(u16),
+ offsetof(c352_voice_t, flags) / sizeof(u16),
+ offsetof(c352_voice_t, wave_bank) / sizeof(u16),
+ offsetof(c352_voice_t, wave_start) / sizeof(u16),
+ offsetof(c352_voice_t, wave_end) / sizeof(u16),
+ offsetof(c352_voice_t, wave_loop) / sizeof(u16),
};
- if (address < 0x100)
+ if (offset < 0x100)
{
- *((uint16_t*)&m_c352_v[address / 8] + reg_map[address % 8]) = val;
+ u16 newval = read_reg16(offset);
+ COMBINE_DATA(&newval);
+ *((u16*)&m_c352_v[offset / 8] + reg_map[offset % 8]) = newval;
}
- else if (address == 0x200)
+ else if (offset == 0x200)
{
- m_control = val;
- logerror("C352 control register write: %04x\n",val);
+ COMBINE_DATA(&m_control);
+ logerror("C352 control register write: %04x & %04x\n", data, mem_mask);
}
- else if (address == 0x202) // execute keyons/keyoffs
+ else if (offset == 0x202) // execute keyons/keyoffs
{
+ if (mem_mask != 0xffff) // 16 bit only?
+ return;
+
for (int i = 0; i < 32; i++)
{
if (m_c352_v[i].flags & C352_FLG_KEYON)
@@ -252,7 +257,7 @@ void c352_device::write_reg16(unsigned long address, unsigned short val)
#if C352_LOG_PCM
if (!(m_c352_v[i].flags & C352_FLG_NOISE))
{
- std::map<uint32_t, bool>::iterator iter = s_found_pcm.find(m_c352_v[i].pos);
+ std::map<u32, bool>::iterator iter = s_found_pcm.find(m_c352_v[i].pos);
if (iter != s_found_pcm.end())
{
return;
@@ -266,27 +271,27 @@ void c352_device::write_reg16(unsigned long address, unsigned short val)
if (file != nullptr)
{
c352_voice_t &v = m_c352_v[i];
- uint32_t pos = v.pos;
- uint32_t flags = v.flags;
- uint32_t counter = v.counter;
- int16_t sample = 0;
+ u32 pos = v.pos;
+ u32 flags = v.flags;
+ u32 counter = v.counter;
+ s16 sample = 0;
while (pos != v.wave_end && !(flags & C352_FLG_KEYOFF))
{
- int32_t next_counter = counter + v.freq;
+ s32 next_counter = counter + v.freq;
if (next_counter & 0x10000)
{
counter = next_counter & 0xffff;
- int8_t s = (int8_t)read_byte(pos);
+ s8 s = (s8)read_byte(pos);
if (v.flags & C352_FLG_MULAW)
sample = m_mulawtab[s & 0xff];
else
sample = s << 8;
- uint16_t subpos = pos & 0xffff;
+ u16 subpos = pos & 0xffff;
if ((flags & C352_FLG_LOOP) && flags & C352_FLG_REVERSE)
{
@@ -382,22 +387,20 @@ void c352_device::device_start()
m_mulawtab[i + 128] = (~m_mulawtab[i]) & 0xffe0;
// register save state info
- for (int i = 0; i < 32; i++)
- {
- save_item(NAME(m_c352_v[i].pos), i);
- save_item(NAME(m_c352_v[i].counter), i);
- save_item(NAME(m_c352_v[i].sample), i);
- save_item(NAME(m_c352_v[i].last_sample), i);
- save_item(NAME(m_c352_v[i].vol_f), i);
- save_item(NAME(m_c352_v[i].vol_r), i);
- save_item(NAME(m_c352_v[i].curr_vol), i);
- save_item(NAME(m_c352_v[i].freq), i);
- save_item(NAME(m_c352_v[i].flags), i);
- save_item(NAME(m_c352_v[i].wave_bank), i);
- save_item(NAME(m_c352_v[i].wave_start), i);
- save_item(NAME(m_c352_v[i].wave_end), i);
- save_item(NAME(m_c352_v[i].wave_loop), i);
- }
+ save_item(STRUCT_MEMBER(m_c352_v, pos));
+ save_item(STRUCT_MEMBER(m_c352_v, counter));
+ save_item(STRUCT_MEMBER(m_c352_v, sample));
+ save_item(STRUCT_MEMBER(m_c352_v, last_sample));
+ save_item(STRUCT_MEMBER(m_c352_v, vol_f));
+ save_item(STRUCT_MEMBER(m_c352_v, vol_r));
+ save_item(STRUCT_MEMBER(m_c352_v, curr_vol));
+ save_item(STRUCT_MEMBER(m_c352_v, freq));
+ save_item(STRUCT_MEMBER(m_c352_v, flags));
+ save_item(STRUCT_MEMBER(m_c352_v, wave_bank));
+ save_item(STRUCT_MEMBER(m_c352_v, wave_start));
+ save_item(STRUCT_MEMBER(m_c352_v, wave_end));
+ save_item(STRUCT_MEMBER(m_c352_v, wave_loop));
+
save_item(NAME(m_random));
save_item(NAME(m_control));
}
@@ -419,12 +422,5 @@ READ16_MEMBER( c352_device::read )
WRITE16_MEMBER( c352_device::write )
{
- if (mem_mask == 0xffff)
- {
- write_reg16(offset, data);
- }
- else
- {
- logerror("C352: byte-wide write unsupported at this time!\n");
- }
+ write_reg16(offset, data, mem_mask);
}
diff --git a/src/devices/sound/c352.h b/src/devices/sound/c352.h
index 9a97dd78622..e5cc155dae5 100644
--- a/src/devices/sound/c352.h
+++ b/src/devices/sound/c352.h
@@ -18,13 +18,13 @@ class c352_device : public device_t,
{
public:
// construction/destruction
- c352_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, int divider)
+ c352_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, int divider)
: c352_device(mconfig, tag, owner, clock)
{
set_divider(divider);
}
- c352_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ c352_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
void set_divider(int divider) { m_divider = divider; }
@@ -67,31 +67,31 @@ private:
struct c352_voice_t
{
- uint32_t pos;
- uint32_t counter;
+ u32 pos;
+ u32 counter;
- int16_t sample;
- int16_t last_sample;
+ s16 sample;
+ s16 last_sample;
- uint16_t vol_f;
- uint16_t vol_r;
- uint8_t curr_vol[4];
+ u16 vol_f;
+ u16 vol_r;
+ u8 curr_vol[4];
- uint16_t freq;
- uint16_t flags;
+ u16 freq;
+ u16 flags;
- uint16_t wave_bank;
- uint16_t wave_start;
- uint16_t wave_end;
- uint16_t wave_loop;
+ u16 wave_bank;
+ u16 wave_start;
+ u16 wave_end;
+ u16 wave_loop;
};
void fetch_sample(c352_voice_t &v);
- void ramp_volume(c352_voice_t &v, int ch, uint8_t val);
+ void ramp_volume(c352_voice_t &v, int ch, u8 val);
- unsigned short read_reg16(unsigned long address);
- void write_reg16(unsigned long address, unsigned short val);
+ u16 read_reg16(offs_t offset);
+ void write_reg16(offs_t offset, u16 data, u16 mem_mask = 0);
sound_stream *m_stream;
@@ -100,10 +100,10 @@ private:
c352_voice_t m_c352_v[32];
- int16_t m_mulawtab[256];
+ s16 m_mulawtab[256];
- uint16_t m_random;
- uint16_t m_control; // control flags, purpose unknown.
+ u16 m_random;
+ u16 m_control; // control flags, purpose unknown.
};