diff options
Diffstat (limited to 'src/devices/sound/ymz770.cpp')
-rw-r--r-- | src/devices/sound/ymz770.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/devices/sound/ymz770.cpp b/src/devices/sound/ymz770.cpp index 86f2710f2fa..ae7a995ce21 100644 --- a/src/devices/sound/ymz770.cpp +++ b/src/devices/sound/ymz770.cpp @@ -107,6 +107,7 @@ void ymz770_device::device_start() save_item(NAME(m_sequences[ch].timer), ch); save_item(NAME(m_sequences[ch].stopchan), ch); save_item(NAME(m_sequences[ch].loop), ch); + save_item(NAME(m_sequences[ch].bank), ch); save_item(NAME(m_sequences[ch].is_playing), ch); } } @@ -140,6 +141,7 @@ void ymz770_device::device_reset() sequence.timer = 0; sequence.stopchan = 0; sequence.loop = 0; + sequence.bank = 0; sequence.is_playing = false; } } @@ -517,7 +519,7 @@ void ymz774_device::internal_reg_write(uint8_t reg, uint8_t data) case 0x60: // sequence num H and L case 0x68: sq = (reg >> 1) & 7; - if (sq & 1) + if (reg & 1) m_sequences[sq].sequence = (m_sequences[sq].sequence & 0xff00) | data; else m_sequences[sq].sequence = (m_sequences[sq].sequence & 0x00ff) | ((data & 0x0f) << 8); // TODO check if total number really upto 0x1000 @@ -544,7 +546,7 @@ void ymz774_device::internal_reg_write(uint8_t reg, uint8_t data) case 0x88: // timer H and L case 0x90: sq = (reg >> 1) & 7; - if (sq & 1) + if (reg & 1) m_sequences[sq].timer = (m_sequences[sq].timer & 0xff00) | data; else m_sequences[sq].timer = (m_sequences[sq].timer & 0x00ff) | (data << 8); @@ -555,7 +557,7 @@ void ymz774_device::internal_reg_write(uint8_t reg, uint8_t data) case 0xa0: // stop channel mask H and L, what it for ? stop chanels immediatelly or when sequence ends (so far assuming later) ? case 0xa8: sq = (reg >> 1) & 7; - if (sq & 1) + if (reg & 1) m_sequences[sq].stopchan = (m_sequences[sq].stopchan & 0xff00) | data; else m_sequences[sq].stopchan = (m_sequences[sq].stopchan & 0x00ff) | (data << 8); @@ -626,7 +628,13 @@ void ymz774_device::sequencer() case 0xfe: // timer delay sequence.delay = sequence.timer * 32; // possible needed -1 or +(32-1) break; + case 0xf0: + sequence.bank = data & 1; + break; default: + { + uint8_t temp = m_bank; + m_bank = sequence.bank; if (m_bank == 0 && reg >= 0x60 && reg < 0xb0) // if we hit SEQ registers need to add this sequence offset { int sqn = i; @@ -636,6 +644,8 @@ void ymz774_device::sequencer() } else internal_reg_write(reg, data); + m_bank = temp; + } break; } } |