mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
scsp: improve handling of MIDI interrupts (#13521)
This commit is contained in:
parent
9fd89a456e
commit
d8f21c57f8
@ -166,6 +166,7 @@ scsp_device::scsp_device(const machine_config &mconfig, const char *tag, device_
|
||||
{
|
||||
std::fill(std::begin(m_RINGBUF), std::end(m_RINGBUF), 0);
|
||||
std::fill(std::begin(m_MidiStack), std::end(m_MidiStack), 0);
|
||||
std::fill(std::begin(m_MidiOutStack), std::end(m_MidiOutStack), 0);
|
||||
std::fill(std::begin(m_LPANTABLE), std::end(m_LPANTABLE), 0);
|
||||
std::fill(std::begin(m_RPANTABLE), std::end(m_RPANTABLE), 0);
|
||||
std::fill(std::begin(m_TimPris), std::end(m_TimPris), 0);
|
||||
@ -243,6 +244,7 @@ void scsp_device::device_start()
|
||||
save_item(NAME(m_IrqTimBC));
|
||||
save_item(NAME(m_IrqMidi));
|
||||
|
||||
save_item(NAME(m_MidiOutStack));
|
||||
save_item(NAME(m_MidiOutW));
|
||||
save_item(NAME(m_MidiOutR));
|
||||
save_item(NAME(m_MidiStack));
|
||||
@ -359,7 +361,6 @@ void scsp_device::CheckPendingIRQ()
|
||||
if (en & 8)
|
||||
{
|
||||
m_irq_cb(m_IrqMidi, ASSERT_LINE);
|
||||
m_udata.data[0x20/2] &= ~8;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -733,7 +734,7 @@ void scsp_device::UpdateReg(int reg)
|
||||
break;
|
||||
case 0x6:
|
||||
case 0x7:
|
||||
midi_in(m_udata.data[0x6/2] & 0xff);
|
||||
midi_out_w(m_udata.data[0x6/2] & 0xff);
|
||||
break;
|
||||
case 8:
|
||||
case 9:
|
||||
@ -899,13 +900,17 @@ void scsp_device::UpdateRegR(int reg)
|
||||
u16 v = m_udata.data[0x4/2];
|
||||
v &= 0xff00;
|
||||
v |= m_MidiStack[m_MidiR];
|
||||
m_irq_cb(m_IrqMidi, CLEAR_LINE); // cancel the IRQ
|
||||
logerror("Read %x from SCSP MIDI\n", v);
|
||||
if (m_MidiR != m_MidiW)
|
||||
{
|
||||
++m_MidiR;
|
||||
m_MidiR &= 31;
|
||||
}
|
||||
if (m_MidiR == m_MidiW) // if the input FIFO is empty, clear the IRQ
|
||||
{
|
||||
m_irq_cb(m_IrqMidi, CLEAR_LINE);
|
||||
m_udata.data[0x20 / 2] &= ~8;
|
||||
}
|
||||
m_udata.data[0x4/2] = v;
|
||||
}
|
||||
break;
|
||||
@ -1451,11 +1456,19 @@ void scsp_device::midi_in(u8 data)
|
||||
|
||||
u16 scsp_device::midi_out_r()
|
||||
{
|
||||
u8 val = m_MidiStack[m_MidiR++];
|
||||
m_MidiR &= 31;
|
||||
u8 val = m_MidiOutStack[m_MidiOutR++];
|
||||
m_MidiOutR &= 31;
|
||||
return val;
|
||||
}
|
||||
|
||||
void scsp_device::midi_out_w(u8 data)
|
||||
{
|
||||
m_MidiOutStack[m_MidiOutW++] = data;
|
||||
m_MidiOutW &= 31;
|
||||
|
||||
//CheckPendingIRQ();
|
||||
}
|
||||
|
||||
//LFO handling
|
||||
|
||||
#define LFIX(v) ((u32) ((float) (1 << LFO_SHIFT) * (v)))
|
||||
|
@ -37,6 +37,7 @@ public:
|
||||
// MIDI I/O access (used for comms on Model 2/3)
|
||||
void midi_in(u8 data);
|
||||
u16 midi_out_r();
|
||||
void midi_out_w(u8 data);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
@ -118,6 +119,7 @@ private:
|
||||
u32 m_IrqTimBC;
|
||||
u32 m_IrqMidi;
|
||||
|
||||
u8 m_MidiOutStack[32];
|
||||
u8 m_MidiOutW, m_MidiOutR;
|
||||
u8 m_MidiStack[32];
|
||||
u8 m_MidiW, m_MidiR;
|
||||
|
Loading…
Reference in New Issue
Block a user