gcpinbal: Load more music by sending interrupt when ES-8712 finishes playing sample

This commit is contained in:
AJR 2017-02-05 14:53:11 -05:00
parent 90c14be174
commit d1d84ebe18
2 changed files with 15 additions and 21 deletions

View File

@ -99,13 +99,6 @@ void gcpinbal_state::device_timer(emu_timer &timer, device_timer_id id, int para
case TIMER_GCPINBAL_INTERRUPT1:
m_maincpu->set_input_line(1, HOLD_LINE);
break;
case TIMER_GCPINBAL_INTERRUPT3:
// IRQ3 is from the M6585
//if (!ADPCM_playing(0))
{
m_maincpu->set_input_line(3, HOLD_LINE);
}
break;
default:
assert_always(false, "Unknown id in gcpinbal_state::device_timer");
}
@ -116,7 +109,6 @@ INTERRUPT_GEN_MEMBER(gcpinbal_state::gcpinbal_interrupt)
/* Unsure of actual sequence */
timer_set(downcast<cpu_device *>(&device)->cycles_to_attotime(500), TIMER_GCPINBAL_INTERRUPT1);
// timer_set(downcast<cpu_device *>(&device)->cycles_to_attotime(1000), TIMER_GCPINBAL_INTERRUPT3);
device.execute().set_input_line(4, HOLD_LINE);
}
@ -163,13 +155,17 @@ WRITE8_MEMBER(gcpinbal_state::eeprom_w)
m_eeprom->cs_write(BIT(data, 0));
}
WRITE8_MEMBER(gcpinbal_state::unknown_w)
WRITE8_MEMBER(gcpinbal_state::es8712_ack_w)
{
// This probably works by resetting the ES-8712
m_maincpu->set_input_line(3, CLEAR_LINE);
m_adpcm_idle = 1;
m_msm->reset_w(1);
}
WRITE8_MEMBER(gcpinbal_state::es8712_w)
{
// MSM6585 ADPCM - mini emulation
// MSM6585/ES-8712 ADPCM - mini emulation
switch (offset)
{
case 0:
@ -201,7 +197,6 @@ WRITE8_MEMBER(gcpinbal_state::es8712_w)
if (m_msm_start < m_msm_end)
{
/* data written here is adpcm param? */
//popmessage("%08x %08x", m_msm_start + m_msm_bank, m_msm_end);
m_adpcm_idle = 0;
m_msm->reset_w(0);
m_adpcm_start = m_msm_start + m_msm_bank;
@ -219,17 +214,17 @@ WRITE8_MEMBER(gcpinbal_state::es8712_w)
************************************************/
/* Controlled through ioc? */
// Controlled through ES-8712
WRITE_LINE_MEMBER(gcpinbal_state::gcp_adpcm_int)
{
if (!state)
if (!state || m_adpcm_idle)
return;
if (m_adpcm_idle)
m_msm->reset_w(1);
if (m_adpcm_start >= 0x200000 || m_adpcm_start > m_adpcm_end)
{
//m_msm->reset_w(1);
m_adpcm_start = m_msm_start + m_msm_bank;
m_adpcm_idle = 1;
m_msm->reset_w(1);
m_maincpu->set_input_line(3, ASSERT_LINE);
//m_adpcm_start = m_msm_start + m_msm_bank;
m_adpcm_trigger = 0;
}
else
@ -262,7 +257,7 @@ static ADDRESS_MAP_START( gcpinbal_map, AS_PROGRAM, 16, gcpinbal_state )
AM_RANGE(0xd80086, 0xd80087) AM_READ_PORT("IN1")
AM_RANGE(0xd80088, 0xd80089) AM_WRITE8(bank_w, 0xff00)
AM_RANGE(0xd8008a, 0xd8008b) AM_WRITE8(eeprom_w, 0xff00)
AM_RANGE(0xd8008e, 0xd8008f) AM_WRITE8(unknown_w, 0xff00)
AM_RANGE(0xd8008e, 0xd8008f) AM_WRITE8(es8712_ack_w, 0xff00)
AM_RANGE(0xd800a0, 0xd800a1) AM_MIRROR(0x2) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0xff00)
AM_RANGE(0xd800c0, 0xd800cd) AM_WRITE8(es8712_w, 0xff00)
AM_RANGE(0xff0000, 0xffffff) AM_RAM /* RAM */

View File

@ -12,8 +12,7 @@ class gcpinbal_state : public driver_device
public:
enum
{
TIMER_GCPINBAL_INTERRUPT1,
TIMER_GCPINBAL_INTERRUPT3
TIMER_GCPINBAL_INTERRUPT1
};
gcpinbal_state(const machine_config &mconfig, device_type type, const char *tag)
@ -70,7 +69,7 @@ public:
DECLARE_WRITE16_MEMBER(d80060_w);
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_WRITE8_MEMBER(eeprom_w);
DECLARE_WRITE8_MEMBER(unknown_w);
DECLARE_WRITE8_MEMBER(es8712_ack_w);
DECLARE_WRITE8_MEMBER(es8712_w);
DECLARE_READ16_MEMBER(gcpinbal_tilemaps_word_r);
DECLARE_WRITE16_MEMBER(gcpinbal_tilemaps_word_w);