summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author MetalliC <0vetal0@gmail.com>2017-11-08 18:17:36 +0200
committer MetalliC <0vetal0@gmail.com>2017-11-08 18:18:19 +0200
commitaf2e507368da85210876e85fe0a40bce35b44439 (patch)
tree531d7ad760adc82f36575d0cf035b06e238d9364
parent67034f451303cf1e0f2bd64d28bb0d002484247b (diff)
few more YMZ774 (nw)
-rw-r--r--src/devices/sound/ymz770.cpp69
-rw-r--r--src/devices/sound/ymz770.h7
2 files changed, 61 insertions, 15 deletions
diff --git a/src/devices/sound/ymz770.cpp b/src/devices/sound/ymz770.cpp
index b836471a324..ae744d32ade 100644
--- a/src/devices/sound/ymz770.cpp
+++ b/src/devices/sound/ymz770.cpp
@@ -81,7 +81,10 @@ void ymz770_device::device_start()
{
save_item(NAME(m_channels[ch].phrase), ch);
save_item(NAME(m_channels[ch].pan), ch);
+ save_item(NAME(m_channels[ch].pan_delay), ch);
save_item(NAME(m_channels[ch].volume), ch);
+ save_item(NAME(m_channels[ch].volume_delay), ch);
+ save_item(NAME(m_channels[ch].volume2), ch);
save_item(NAME(m_channels[ch].loop), ch);
save_item(NAME(m_channels[ch].is_playing), ch);
save_item(NAME(m_channels[ch].last_block), ch);
@@ -110,8 +113,11 @@ void ymz770_device::device_reset()
for (auto & elem : m_channels)
{
elem.phrase = 0;
- elem.pan = 8;
+ elem.pan = 64;
+ elem.pan_delay = 0;
elem.volume = 0;
+ elem.volume_delay = 0;
+ elem.volume2 = 0;
elem.loop = 0;
elem.is_playing = false;
elem.output_remaining = 0;
@@ -337,7 +343,7 @@ void ymz770_device::internal_reg_write(uint8_t reg, uint8_t data)
break;
case 2:
- m_channels[ch].pan = (data & 0x1f) << 3;
+ m_channels[ch].pan = data << 3;
break;
case 3:
@@ -404,31 +410,56 @@ ymz774_device::ymz774_device(const machine_config &mconfig, const char *tag, dev
READ8_MEMBER(ymz774_device::read)
{
- // TODO status read ?
+ if (offset & 1)
+ {
+ if (m_cur_reg == 0xe3 || m_cur_reg == 0xe4)
+ {
+ m_stream->update();
+ uint8_t res = 0;
+ auto bank = (m_cur_reg == 0xe3) ? 8 : 0;
+ for (auto i = 0; i < 8; i++)
+ if (m_channels[i + bank].is_playing)
+ res |= 1 << i;
+ return res;
+ }
+ }
+ logerror("unimplemented read %02X\n", m_cur_reg);
return 0;
}
void ymz774_device::internal_reg_write(uint8_t reg, uint8_t data)
{
// playback registers
- if (reg < 0x60) {
+ if (reg < 0x10) // phrase num H and L
+ {
+ int ch = ((reg >> 1) & 7) + m_bank * 8;
+ if (reg & 1)
+ m_channels[ch].phrase = (m_channels[ch].phrase & 0xff00) | data;
+ else
+ m_channels[ch].phrase = (m_channels[ch].phrase & 0x00ff) | ((data & 7) << 8);
+ }
+ else if (reg < 0x60)
+ {
int ch = (reg & 7) + m_bank * 8;
switch (reg & 0xf8)
{
- case 0x00: // phrase# H and L
- case 0x08:
- ch = ((reg >> 1) & 7) + m_bank * 8;
- if (reg & 1)
- m_channels[ch].phrase = (m_channels[ch].phrase & 0xff00) | data;
- else
- m_channels[ch].phrase = (m_channels[ch].phrase & 0x00ff) | (data << 8);
- break;
case 0x10: // Volume 1
m_channels[ch].volume = data;
break;
+ case 0x18: // Volume 1 delayed transition
+ if (data) logerror("unimplemented write %02X %02X\n", reg, data);
+ m_channels[ch].volume_delay = data;
+ break;
+ case 0x20: // Volume 2
+ m_channels[ch].volume2 = data;
+ break;
case 0x28: // Pan L/R
m_channels[ch].pan = data;
break;
+ case 0x30: // Pan L/R delayed transition
+ if (data) logerror("unimplemented write %02X %02X\n", reg, data);
+ m_channels[ch].pan_delay = data;
+ break;
case 0x48: // Loop
m_channels[ch].loop = data;
break;
@@ -447,10 +478,21 @@ void ymz774_device::internal_reg_write(uint8_t reg, uint8_t data)
m_channels[ch].is_playing = false;
}
break;
+ case 0x58: // Pause / Resume
+ if (data) logerror("pause/resume unimplemented %02X %02X\n", reg, data);
+ break;
}
}
+ else if (reg < 0xd0)
+ {
+ if (m_bank == 0) // Sequencer, is it used in PGM2 ?
+ {
+ if (data) logerror("sequencer unimplemented %02X %02X\n", reg, data);
+ }
+ // else bank1 - Equalizer control
+ }
// global registers
- else if (reg >= 0xd0)
+ else
{
switch (reg) {
case 0xd0:
@@ -461,6 +503,7 @@ void ymz774_device::internal_reg_write(uint8_t reg, uint8_t data)
break;
case 0xf0:
m_bank = data & 1;
+ if (data > 1) logerror("Set bank %02X!\n", data);
break;
}
}
diff --git a/src/devices/sound/ymz770.h b/src/devices/sound/ymz770.h
index 5f38491c637..bdd3fcbee90 100644
--- a/src/devices/sound/ymz770.h
+++ b/src/devices/sound/ymz770.h
@@ -78,7 +78,10 @@ protected:
{
uint16_t phrase;
uint8_t pan;
+ uint8_t pan_delay;
uint8_t volume;
+ uint8_t volume_delay;
+ uint8_t volume2;
uint8_t loop;
bool is_playing, last_block;
@@ -115,8 +118,8 @@ public:
DECLARE_READ8_MEMBER(read);
protected:
virtual void internal_reg_write(uint8_t reg, uint8_t data) override;
- virtual uint32_t get_phrase_offs(int phrase) override { return (m_rom[(4 * phrase) + 1] << 16 | m_rom[(4 * phrase) + 2] << 8 | m_rom[(4 * phrase) + 3]) * 2; };
- virtual uint32_t get_seq_offs(int sqn) override { return (m_rom[(4 * sqn) + 1 + 0x2000] << 16 | m_rom[(4 * sqn) + 2 + 0x2000] << 8 | m_rom[(4 * sqn) + 3 + 0x2000]) * 2; };
+ virtual uint32_t get_phrase_offs(int phrase) override { int ph = phrase * 4; return ((m_rom[ph] & 0x0f) << 24 | m_rom[ph + 1] << 16 | m_rom[ph + 2] << 8 | m_rom[ph + 3]) * 2; };
+ virtual uint32_t get_seq_offs(int sqn) override { int sq = sqn * 4 + 0x2000; return ((m_rom[sq] & 0x0f) << 24 | m_rom[sq + 1] << 16 | m_rom[sq + 2] << 8 | m_rom[sq + 3]) * 2; };
virtual void sequencer() override {};
private:
int m_bank;