combatscb: Hook up a second MSM5205 and improve interrupt handling

This commit is contained in:
AJR 2017-08-21 00:29:10 -04:00
parent 43ca93c6a9
commit b3ba94ace1
2 changed files with 33 additions and 20 deletions

View File

@ -149,12 +149,6 @@ WRITE8_MEMBER(combatsc_state::combatsc_vreg_w)
}
}
WRITE8_MEMBER(combatsc_state::combatscb_sh_irqtrigger_w)
{
m_soundlatch->write(space, offset, data);
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
READ8_MEMBER(combatsc_state::combatscb_io_r)
{
static const char *const portnames[] = { "IN0", "IN1", "DSW1", "DSW2" };
@ -208,7 +202,7 @@ WRITE8_MEMBER(combatsc_state::combatscb_io_w)
switch (offset)
{
case 0x400: combatscb_priority_w(space, 0, data); break;
case 0x800: combatscb_sh_irqtrigger_w(space, 0, data); break;
case 0x800: m_soundlatch->write(space, offset, data); break;
case 0xc00: combatsc_vreg_w(space, 0, data); break;
default: m_io_ram[offset] = data; break;
}
@ -403,17 +397,27 @@ static ADDRESS_MAP_START( combatsc_sound_map, AS_PROGRAM, 8, combatsc_state )
AM_RANGE(0xe000, 0xe001) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write) /* YM 2203 intercepted */
ADDRESS_MAP_END
WRITE8_MEMBER(combatsc_state::combatscb_dac_w)
WRITE8_MEMBER(combatsc_state::combatscb_msm1_w)
{
if(data & 0x60)
printf("%02x\n",data);
membank("bl_abank")->set_entry((data & 0x80) >> 7);
//m_msm5205->reset_w(BIT(data, 4));
m_msm5205->data_w(data & 0x0f);
m_msm5205->vclk_w(1);
m_msm5205->vclk_w(0);
m_msm[0]->reset_w(BIT(data, 4));
m_msm[0]->data_w(data & 0x0f);
}
WRITE8_MEMBER(combatsc_state::combatscb_msm2_w)
{
m_msm[1]->reset_w(BIT(data, 4));
m_msm[1]->data_w(data & 0x0f);
}
IRQ_CALLBACK_MEMBER(combatsc_state::combatscb_sound_irq_ack)
{
m_audiocpu->set_input_line(0, CLEAR_LINE);
return 0xff;
}
static ADDRESS_MAP_START( combatscb_sound_map, AS_PROGRAM, 8, combatsc_state )
@ -421,8 +425,9 @@ static ADDRESS_MAP_START( combatscb_sound_map, AS_PROGRAM, 8, combatsc_state )
AM_RANGE(0x8000, 0x87ff) AM_RAM /* RAM */
AM_RANGE(0x9000, 0x9001) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write) /* YM 2203 */
AM_RANGE(0x9008, 0x9009) AM_DEVREAD("ymsnd", ym2203_device, read) /* ??? */
AM_RANGE(0x9800, 0x9800) AM_WRITE(combatscb_dac_w)
AM_RANGE(0x9800, 0x9800) AM_WRITE(combatscb_msm1_w)
AM_RANGE(0xa000, 0xa000) AM_DEVREAD("soundlatch", generic_latch_8_device, read) /* soundlatch read? */
AM_RANGE(0xa800, 0xa800) AM_WRITE(combatscb_msm2_w)
AM_RANGE(0xc000, 0xffff) AM_ROMBANK("bl_abank")
ADDRESS_MAP_END
@ -760,7 +765,7 @@ static MACHINE_CONFIG_START( combatscb )
MCFG_CPU_ADD("audiocpu", Z80,3579545) /* 3.579545 MHz */
MCFG_CPU_PROGRAM_MAP(combatscb_sound_map)
MCFG_CPU_PERIODIC_INT_DRIVER(combatsc_state, irq0_line_hold, 3800) // controls BGM tempo
MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(combatsc_state, combatscb_sound_irq_ack)
MCFG_QUANTUM_TIME(attotime::from_hz(1200))
@ -786,12 +791,19 @@ static MACHINE_CONFIG_START( combatscb )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI))
MCFG_SOUND_ADD("ymsnd", YM2203, 3000000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
MCFG_SOUND_ADD("msm5205", MSM5205, 384000)
MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) /* 8KHz playback ? */
MCFG_SOUND_ADD("msm1", MSM5205, 384000)
MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
MCFG_MSM5205_VCK_CALLBACK(ASSERTLINE("audiocpu", 0))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("msm2", msm5205_device, vclk_w))
MCFG_SOUND_ADD("msm2", MSM5205, 384000)
MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
MACHINE_CONFIG_END

View File

@ -22,7 +22,7 @@ public:
m_k007121_1(*this, "k007121_1"),
m_k007121_2(*this, "k007121_2"),
m_upd7759(*this, "upd"),
m_msm5205(*this, "msm5205"),
m_msm(*this, "msm%u", 1),
m_screen(*this, "screen"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
@ -64,7 +64,7 @@ public:
optional_device<k007121_device> m_k007121_1;
optional_device<k007121_device> m_k007121_2;
optional_device<upd7759_device> m_upd7759;
optional_device<msm5205_device> m_msm5205;
optional_device_array<msm5205_device, 2> m_msm;
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
@ -73,7 +73,6 @@ public:
optional_ioport_array<4> m_track_ports;
DECLARE_WRITE8_MEMBER(combatsc_vreg_w);
DECLARE_WRITE8_MEMBER(combatscb_sh_irqtrigger_w);
DECLARE_READ8_MEMBER(combatscb_io_r);
DECLARE_WRITE8_MEMBER(combatscb_priority_w);
DECLARE_WRITE8_MEMBER(combatsc_bankselect_w);
@ -95,7 +94,9 @@ public:
DECLARE_WRITE8_MEMBER(combatsc_play_w);
DECLARE_WRITE8_MEMBER(combatsc_voice_reset_w);
DECLARE_WRITE8_MEMBER(combatsc_portA_w);
DECLARE_WRITE8_MEMBER(combatscb_dac_w);
DECLARE_WRITE8_MEMBER(combatscb_msm1_w);
DECLARE_WRITE8_MEMBER(combatscb_msm2_w);
IRQ_CALLBACK_MEMBER(combatscb_sound_irq_ack);
DECLARE_DRIVER_INIT(combatsc);
TILE_GET_INFO_MEMBER(get_tile_info0);
TILE_GET_INFO_MEMBER(get_tile_info1);