mirror of
https://github.com/holub/mame
synced 2025-04-24 01:11:11 +03:00
isa_gus: Enabled 6850 MIDI interface with a hopefully accurate clock, and
fixed a silly error with MIDI IRQs, and passes the MIDI transmit IRQ test. [Barry Rodewald] Out of whatsnew: It still slows the drivers down a bit, but now only by about 20-25%, might be a bit more manageable now. Also, is there any way to tell if the 6850 triggers an IRQ on recieve or transmit, as the GUS has separate flags for each case. Otherwise, it can't pass the MIDI recieve IRQ test.
This commit is contained in:
parent
45705b1082
commit
0909ab8305
@ -489,7 +489,7 @@ READ8_MEMBER(gf1_device::global_reg_data_r)
|
||||
* bit 6 - 1 if addresses are decreasing, can change when looping is enabled
|
||||
* bit 7 - 1 if Wavetable IRQ is pending */
|
||||
if(offset == 1)
|
||||
return m_voice[m_current_voice].voice_ctrl;
|
||||
return m_voice[m_current_voice].voice_ctrl & 0xff;
|
||||
case 0x81: // Frequency Control
|
||||
ret = m_voice[m_current_voice].freq_ctrl;
|
||||
if(offset == 0)
|
||||
@ -591,12 +591,10 @@ WRITE8_MEMBER(gf1_device::global_reg_data_w)
|
||||
* bit 5 - set to 1 to enable wavetable IRQ when end address is reached */
|
||||
if(offset == 1)
|
||||
{
|
||||
m_voice[m_current_voice].voice_ctrl = data & 0x7f;
|
||||
m_voice[m_current_voice].voice_ctrl = data & 0xff;
|
||||
m_voice[m_current_voice].rollover = false;
|
||||
if(data & 0x02)
|
||||
{
|
||||
m_voice[m_current_voice].voice_ctrl |= 0x01;
|
||||
}
|
||||
}
|
||||
logerror("GUS: Ch%i Voice control write %02x\n", m_current_voice,data);
|
||||
break;
|
||||
@ -1129,6 +1127,7 @@ void gf1_device::set_irq(UINT8 source, UINT8 voice)
|
||||
m_wave_irq_func(1);
|
||||
m_voice_irq_fifo[m_voice_irq_ptr % 32] = m_irq_source;
|
||||
m_voice_irq_ptr++;
|
||||
m_voice[voice].voice_ctrl |= 0x80;
|
||||
}
|
||||
if(source & IRQ_VOLUME_RAMP)
|
||||
{
|
||||
@ -1199,8 +1198,8 @@ void gf1_device::eop_w(int state)
|
||||
|
||||
static const acia6850_interface gus_midi_interface =
|
||||
{
|
||||
GF1_CLOCK,
|
||||
GF1_CLOCK, // a guess for now
|
||||
31250 * 16,
|
||||
31250 * 16,
|
||||
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
@ -1209,8 +1208,7 @@ static const acia6850_interface gus_midi_interface =
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
|
||||
DEVCB_NULL
|
||||
//DEVCB_LINE_MEMBER(isa16_gus_device,midi_irq)
|
||||
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,midi_irq)
|
||||
};
|
||||
|
||||
static const gf1_interface gus_gf1_config =
|
||||
@ -1232,7 +1230,7 @@ static MACHINE_CONFIG_FRAGMENT( gus_config )
|
||||
MCFG_SOUND_CONFIG(gus_gf1_config)
|
||||
MCFG_SOUND_ROUTE(0,"lspeaker",0.50)
|
||||
MCFG_SOUND_ROUTE(1,"rspeaker",0.50)
|
||||
// MCFG_ACIA6850_ADD("midi",gus_midi_interface)
|
||||
MCFG_ACIA6850_ADD("midi",gus_midi_interface)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static INPUT_PORTS_START( gus_joy )
|
||||
@ -1275,7 +1273,7 @@ isa16_gus_device::isa16_gus_device(const machine_config &mconfig, const char *ta
|
||||
void isa16_gus_device::device_start()
|
||||
{
|
||||
m_gf1 = subdevice<gf1_device>("gf1");
|
||||
//m_midi = subdevice<acia6850_device>("midi");
|
||||
m_midi = subdevice<acia6850_device>("midi");
|
||||
set_isa_device();
|
||||
m_isa->install_device(0x0200, 0x0201, 0, 0, read8_delegate(FUNC(isa16_gus_device::joy_r),this), write8_delegate(FUNC(isa16_gus_device::joy_w),this) );
|
||||
m_isa->install_device(0x0220, 0x022f, 0, 0, read8_delegate(FUNC(isa16_gus_device::board_r),this), write8_delegate(FUNC(isa16_gus_device::board_w),this) );
|
||||
@ -1355,6 +1353,7 @@ WRITE8_MEMBER(isa16_gus_device::board_w)
|
||||
break;
|
||||
case 0x0f:
|
||||
m_gf1->stat_w(space,offset-15,data);
|
||||
break;
|
||||
default:
|
||||
logerror("GUS: Invalid or unimplemented register write %02x of port 0x2X%01x\n",data,offset);
|
||||
}
|
||||
@ -1364,10 +1363,10 @@ READ8_MEMBER(isa16_gus_device::synth_r)
|
||||
{
|
||||
switch(offset)
|
||||
{
|
||||
// case 0x00:
|
||||
// return m_midi->status_read(space,0);
|
||||
// case 0x01:
|
||||
// return m_midi->data_read(space,0);
|
||||
case 0x00:
|
||||
return m_midi->status_read(space,0);
|
||||
case 0x01:
|
||||
return m_midi->data_read(space,0);
|
||||
case 0x02:
|
||||
case 0x03:
|
||||
return m_gf1->global_reg_select_r(space,offset-2);
|
||||
@ -1389,10 +1388,10 @@ WRITE8_MEMBER(isa16_gus_device::synth_w)
|
||||
switch(offset)
|
||||
{
|
||||
case 0x00:
|
||||
// m_midi->control_write(space,0,data);
|
||||
m_midi->control_write(space,0,data);
|
||||
break;
|
||||
case 0x01:
|
||||
// m_midi->data_write(space,0,data);
|
||||
m_midi->data_write(space,0,data);
|
||||
break;
|
||||
case 0x02:
|
||||
case 0x03:
|
||||
@ -1674,9 +1673,9 @@ void isa16_gus_device::reset_midi_irq(UINT8 source)
|
||||
WRITE_LINE_MEMBER( isa16_gus_device::midi_irq )
|
||||
{
|
||||
if(state)
|
||||
set_irq(IRQ_MIDI_TRANSMIT);
|
||||
set_midi_irq(IRQ_MIDI_TRANSMIT);
|
||||
else
|
||||
reset_irq(IRQ_MIDI_TRANSMIT);
|
||||
reset_midi_irq(IRQ_MIDI_TRANSMIT);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( isa16_gus_device::nmi_w)
|
||||
|
Loading…
Reference in New Issue
Block a user