cdi: CDIC vectors its own interrupt (nw)

This commit is contained in:
AJR 2019-04-17 17:07:04 -04:00
parent ae8aa35955
commit 185bbcad46
3 changed files with 21 additions and 15 deletions

View File

@ -824,7 +824,7 @@ void cdi_state::cdimono1_base(machine_config &config)
{
SCC68070(config, m_maincpu, CLOCK_A);
m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdimono1_mem);
m_maincpu->iack4_callback().set_constant(0x80);
m_maincpu->iack4_callback().set(m_cdic, FUNC(cdicdic_device::intack_r));
MCD212(config, m_mcd212, CLOCK_A);
m_mcd212->set_screen("screen");
@ -853,7 +853,7 @@ void cdi_state::cdimono1_base(machine_config &config)
// IMS66490 CDIC input clocks are 22.5792 MHz and 19.3536 MHz (latter is generated by PLL circuit incorporating 19.3575 MHz XTAL)
// DSP input clock is 7.5264 MHz
CDI_CDIC(config, m_cdic, 45.1584_MHz_XTAL / 2);
m_cdic->int_callback().set(m_maincpu, FUNC(scc68070_device::in4_w));
m_cdic->intreq_callback().set(m_maincpu, FUNC(scc68070_device::in4_w));
CDI_SLAVE(config, m_slave_hle, 0);
m_slave_hle->int_callback().set(m_maincpu, FUNC(scc68070_device::in2_w));

View File

@ -565,7 +565,7 @@ void cdicdic_device::sample_trigger()
// Set the CDIC interrupt line
verboselog(*this, 0, "%s", "Setting CDIC interrupt line for soundmap decode\n" );
m_int_callback(ASSERT_LINE);
m_intreq_callback(ASSERT_LINE);
}
else
{
@ -717,7 +717,7 @@ void cdicdic_device::process_delayed_command()
//printf( "Setting CDIC interrupt line\n" );
verboselog(*this, 0, "%s", "Setting CDIC interrupt line for audio sector\n" );
m_int_callback(ASSERT_LINE);
m_intreq_callback(ASSERT_LINE);
}
else if((buffer[CDIC_SECTOR_SUBMODE2] & (CDIC_SUBMODE_DATA | CDIC_SUBMODE_AUDIO | CDIC_SUBMODE_VIDEO)) == 0x00)
{
@ -735,7 +735,7 @@ void cdicdic_device::process_delayed_command()
{
//printf( "Setting CDIC interrupt line\n" );
verboselog(*this, 0, "%s", "Setting CDIC interrupt line for message sector\n" );
m_int_callback(ASSERT_LINE);
m_intreq_callback(ASSERT_LINE);
}
else
{
@ -754,7 +754,7 @@ void cdicdic_device::process_delayed_command()
//printf( "Setting CDIC interrupt line\n" );
verboselog(*this, 0, "%s", "Setting CDIC interrupt line for data sector\n" );
m_int_callback(ASSERT_LINE);
m_intreq_callback(ASSERT_LINE);
}
if((buffer[CDIC_SECTOR_SUBMODE2] & CDIC_SUBMODE_EOF) == 0 && m_command != 0x23)
@ -848,7 +848,7 @@ void cdicdic_device::process_delayed_command()
}
verboselog(*this, 0, "%s", "Setting CDIC interrupt line for CDDA sector\n" );
m_int_callback(ASSERT_LINE);
m_intreq_callback(ASSERT_LINE);
break;
}
case 0x2c: // Seek
@ -898,7 +898,7 @@ void cdicdic_device::process_delayed_command()
m_time = next_msf << 8;
verboselog(*this, 0, "%s", "Setting CDIC interrupt line for Seek sector\n" );
m_int_callback(ASSERT_LINE);
m_intreq_callback(ASSERT_LINE);
break;
}
}
@ -944,7 +944,7 @@ READ16_MEMBER( cdicdic_device::regs_r )
m_audio_buffer &= 0x7fff;
if(!((m_audio_buffer | m_x_buffer) & 0x8000))
{
m_int_callback(CLEAR_LINE);
m_intreq_callback(CLEAR_LINE);
verboselog(*this, 0, "%s", "Clearing CDIC interrupt line\n" );
////printf("Clearing CDIC interrupt line\n" );
}
@ -958,7 +958,7 @@ READ16_MEMBER( cdicdic_device::regs_r )
m_x_buffer &= 0x7fff;
if(!((m_audio_buffer | m_x_buffer) & 0x8000))
{
m_int_callback(CLEAR_LINE);
m_intreq_callback(CLEAR_LINE);
verboselog(*this, 0, "%s", "Clearing CDIC interrupt line\n" );
////printf("Clearing CDIC interrupt line\n" );
}
@ -1157,7 +1157,7 @@ WRITE16_MEMBER( cdicdic_device::regs_w )
cdicdic_device::cdicdic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, CDI_CDIC, tag, owner, clock)
, m_int_callback(*this)
, m_intreq_callback(*this)
, m_memory_space(*this, ":maincpu", AS_PROGRAM)
, m_dmadac(*this, ":dac%u", 1U)
, m_scc(*this, ":maincpu")
@ -1174,7 +1174,7 @@ cdicdic_device::cdicdic_device(const machine_config &mconfig, const char *tag, d
void cdicdic_device::device_resolve_objects()
{
m_int_callback.resolve_safe();
m_intreq_callback.resolve_safe();
}
//-------------------------------------------------
@ -1244,7 +1244,7 @@ void cdicdic_device::device_reset()
m_cdda->set_cdrom(m_cd);
}
m_int_callback(CLEAR_LINE);
m_intreq_callback(CLEAR_LINE);
}
WRITE16_MEMBER( cdicdic_device::ram_w )
@ -1256,3 +1256,8 @@ READ16_MEMBER( cdicdic_device::ram_r )
{
return m_ram[offset];
}
uint8_t cdicdic_device::intack_r()
{
return 0x80;
}

View File

@ -45,7 +45,7 @@ public:
// construction/destruction
cdicdic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
auto int_callback() { return m_int_callback.bind(); }
auto intreq_callback() { return m_intreq_callback.bind(); }
// non-static internal members
void sample_trigger();
@ -56,6 +56,7 @@ public:
DECLARE_READ16_MEMBER( ram_r );
DECLARE_WRITE16_MEMBER( ram_w );
uint8_t intack_r();
protected:
// device-level overrides
@ -68,7 +69,7 @@ protected:
TIMER_CALLBACK_MEMBER( trigger_readback_int );
private:
devcb_write_line m_int_callback;
devcb_write_line m_intreq_callback;
required_address_space m_memory_space;
required_device_array<dmadac_sound_device, 2> m_dmadac;