summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/ymz770.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/ymz770.cpp')
-rw-r--r--src/devices/sound/ymz770.cpp16
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;
}
}