summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/x1_010.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/x1_010.cpp')
-rw-r--r--src/devices/sound/x1_010.cpp63
1 files changed, 44 insertions, 19 deletions
diff --git a/src/devices/sound/x1_010.cpp b/src/devices/sound/x1_010.cpp
index 226d956c268..b94851c0510 100644
--- a/src/devices/sound/x1_010.cpp
+++ b/src/devices/sound/x1_010.cpp
@@ -87,17 +87,17 @@ struct X1_010_CHANNEL {
DEFINE_DEVICE_TYPE(X1_010, x1_010_device, "x1_010", "Seta X1-010")
x1_010_device::x1_010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, X1_010, tag, owner, clock),
- device_sound_interface(mconfig, *this),
- m_region(*this, DEVICE_SELF),
- m_rate(0),
- m_xor(0),
- m_stream(nullptr),
- m_sound_enable(0),
- m_base_clock(0)
+ : device_t(mconfig, X1_010, tag, owner, clock)
+ , device_sound_interface(mconfig, *this)
+ , device_rom_interface(mconfig, *this, 20)
+ , m_rate(0)
+ , m_xor(0)
+ , m_stream(nullptr)
+ , m_sound_enable(0)
+ , m_reg(nullptr)
+ , m_HI_WORD_BUF(nullptr)
+ , m_base_clock(0)
{
- std::fill(std::begin(m_reg), std::end(m_reg), 0);
- std::fill(std::begin(m_HI_WORD_BUF), std::end(m_HI_WORD_BUF), 0);
std::fill(std::begin(m_smp_offset), std::end(m_smp_offset), 0);
std::fill(std::begin(m_env_offset), std::end(m_env_offset), 0);
}
@@ -123,15 +123,40 @@ void x1_010_device::device_start()
/* get stream channels */
m_stream = machine().sound().stream_alloc(*this, 0, 2, m_rate);
+ m_reg = make_unique_clear<uint8_t[]>(0x2000);
+ m_HI_WORD_BUF = make_unique_clear<uint8_t[]>(0x2000);
+
save_item(NAME(m_rate));
save_item(NAME(m_sound_enable));
- save_item(NAME(m_reg));
- save_item(NAME(m_HI_WORD_BUF));
+ save_pointer(NAME(m_reg), 0x2000);
+ save_pointer(NAME(m_HI_WORD_BUF), 0x2000);
save_item(NAME(m_smp_offset));
save_item(NAME(m_env_offset));
save_item(NAME(m_base_clock));
}
+//-------------------------------------------------
+// device_clock_changed - called if the clock
+// changes
+//-------------------------------------------------
+
+void x1_010_device::device_clock_changed()
+{
+ m_base_clock = clock();
+ m_rate = clock() / 512;
+
+ m_stream->set_sample_rate(m_rate);
+}
+
+//-------------------------------------------------
+// rom_bank_updated - the rom bank has changed
+//-------------------------------------------------
+
+void x1_010_device::rom_bank_updated()
+{
+ m_stream->update();
+}
+
void x1_010_device::enable_w(int data)
{
@@ -193,9 +218,9 @@ void x1_010_device::sound_stream_update(sound_stream &stream, stream_sample_t **
{
X1_010_CHANNEL *reg;
int ch, i, volL, volR, freq, div;
- int8_t *start, *end, data;
+ int8_t data;
uint8_t *env;
- uint32_t smp_offs, smp_step, env_offs, env_step, delta;
+ uint32_t start, end, smp_offs, smp_step, env_offs, env_step, delta;
// mixer buffer zero clear
memset( outputs[0], 0, samples*sizeof(*outputs[0]) );
@@ -210,8 +235,8 @@ void x1_010_device::sound_stream_update(sound_stream &stream, stream_sample_t **
stream_sample_t *bufR = outputs[1];
div = (reg->status&0x80) ? 1 : 0;
if( (reg->status&2) == 0 ) { // PCM sampling
- start = m_region + reg->start*0x1000;
- end = m_region + (0x100-reg->end)*0x1000;
+ start = reg->start*0x1000;
+ end = (0x100-reg->end)*0x1000;
volL = ((reg->volume>>4)&0xf)*VOL_BASE;
volR = ((reg->volume>>0)&0xf)*VOL_BASE;
smp_offs = m_smp_offset[ch];
@@ -232,14 +257,14 @@ void x1_010_device::sound_stream_update(sound_stream &stream, stream_sample_t **
reg->status &= 0xfe; // Key off
break;
}
- data = *(start+delta);
+ data = (int8_t)(read_byte(start+delta));
*bufL++ += (data*volL/256);
*bufR++ += (data*volR/256);
smp_offs += smp_step;
}
m_smp_offset[ch] = smp_offs;
} else { // Wave form
- start = (int8_t *)&(m_reg[reg->volume*128+0x1000]);
+ start = (reg->volume*128+0x1000);
smp_offs = m_smp_offset[ch];
freq = ((reg->pitch_hi<<8)+reg->frequency)>>div;
smp_step = (uint32_t)((float)m_base_clock/128.0f/1024.0f/4.0f*freq*(1<<FREQ_BASE_BITS)/(float)m_rate);
@@ -263,7 +288,7 @@ void x1_010_device::sound_stream_update(sound_stream &stream, stream_sample_t **
vol = *(env+(delta&0x7f));
volL = ((vol>>4)&0xf)*VOL_BASE;
volR = ((vol>>0)&0xf)*VOL_BASE;
- data = *(start+((smp_offs>>FREQ_BASE_BITS)&0x7f));
+ data = (int8_t)(m_reg[start+((smp_offs>>FREQ_BASE_BITS)&0x7f)]);
*bufL++ += (data*volL/256);
*bufR++ += (data*volR/256);
smp_offs += smp_step;