diff options
author | MetalliC <0vetal0@gmail.com> | 2017-11-08 18:17:36 +0200 |
---|---|---|
committer | MetalliC <0vetal0@gmail.com> | 2017-11-08 18:18:19 +0200 |
commit | af2e507368da85210876e85fe0a40bce35b44439 (patch) | |
tree | 531d7ad760adc82f36575d0cf035b06e238d9364 | |
parent | 67034f451303cf1e0f2bd64d28bb0d002484247b (diff) |
few more YMZ774 (nw)
-rw-r--r-- | src/devices/sound/ymz770.cpp | 69 | ||||
-rw-r--r-- | src/devices/sound/ymz770.h | 7 |
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; |