Skip to content

Commit

Permalink
shared/taitosnd.cpp: Use callbacks for interrupt and reset outputs. (m…
Browse files Browse the repository at this point in the history
…amedev#11860)

Also suppress read side effects for debugger accesses.
  • Loading branch information
cam900 authored and einstein95 committed Mar 2, 2024
1 parent f403485 commit d17892f
Show file tree
Hide file tree
Showing 30 changed files with 189 additions and 162 deletions.
75 changes: 51 additions & 24 deletions src/mame/shared/taitosnd.cpp
Expand Up @@ -53,8 +53,8 @@ tc0140syt_device::tc0140syt_device(const machine_config &mconfig, device_type ty
, m_submode(0)
, m_status(0)
, m_nmi_enabled(0)
, m_mastercpu(*this, finder_base::DUMMY_TAG)
, m_slavecpu(*this, finder_base::DUMMY_TAG)
, m_nmi_cb(*this)
, m_reset_cb(*this)
{
std::fill(std::begin(m_slavedata), std::end(m_slavedata), 0);
std::fill(std::begin(m_masterdata), std::end(m_masterdata), 0);
Expand Down Expand Up @@ -106,10 +106,8 @@ void tc0140syt_device::device_reset()

void tc0140syt_device::update_nmi()
{
u32 nmi_pending = m_status & (TC0140SYT_PORT23_FULL | TC0140SYT_PORT01_FULL);
u32 state = (nmi_pending && m_nmi_enabled) ? ASSERT_LINE : CLEAR_LINE;

m_slavecpu->set_input_line(INPUT_LINE_NMI, state);
u32 const nmi_pending = m_status & (TC0140SYT_PORT23_FULL | TC0140SYT_PORT01_FULL);
m_nmi_cb((nmi_pending && m_nmi_enabled) ? ASSERT_LINE : CLEAR_LINE);
}


Expand All @@ -130,8 +128,10 @@ void tc0140syt_device::master_port_w(u8 data)

void tc0140syt_device::master_comm_w(u8 data)
{
machine().scheduler().synchronize(); // let slavecpu catch up (after we return and the main cpu finishes what it's doing)
data &= 0x0f; /* this is important, otherwise ballbros won't work */
// let slavecpu catch up (after we return and the main cpu finishes what it's doing)
machine().scheduler().synchronize();

data &= 0x0f; // this is important, otherwise ballbros won't work

switch (m_mainmode)
{
Expand All @@ -157,7 +157,7 @@ void tc0140syt_device::master_comm_w(u8 data)

case 0x04: // port status
/* this does a hi-lo transition to reset the sound cpu */
m_slavecpu->set_input_line(INPUT_LINE_RESET, data ? ASSERT_LINE : CLEAR_LINE);
m_reset_cb(data ? ASSERT_LINE : CLEAR_LINE);
break;

default:
Expand All @@ -167,27 +167,42 @@ void tc0140syt_device::master_comm_w(u8 data)

u8 tc0140syt_device::master_comm_r()
{
machine().scheduler().synchronize(); // let slavecpu catch up (after we return and the main cpu finishes what it's doing)
// let slavecpu catch up (after we return and the main cpu finishes what it's doing)
if (!machine().side_effects_disabled())
machine().scheduler().synchronize();

u8 res = 0;

switch (m_mainmode)
{
case 0x00: // mode #0
res = m_masterdata[m_mainmode++];
res = m_masterdata[m_mainmode];
if (!machine().side_effects_disabled())
m_mainmode++;
break;

case 0x01: // mode #1
m_status &= ~TC0140SYT_PORT01_FULL_MASTER;
res = m_masterdata[m_mainmode++];
res = m_masterdata[m_mainmode];
if (!machine().side_effects_disabled())
{
m_status &= ~TC0140SYT_PORT01_FULL_MASTER;
m_mainmode++;
}
break;

case 0x02: // mode #2
res = m_masterdata[m_mainmode++];
res = m_masterdata[m_mainmode];
if (!machine().side_effects_disabled())
m_mainmode++;
break;

case 0x03: // mode #3
m_status &= ~TC0140SYT_PORT23_FULL_MASTER;
res = m_masterdata[m_mainmode++];
res = m_masterdata[m_mainmode];
if (!machine().side_effects_disabled())
{
m_status &= ~TC0140SYT_PORT23_FULL_MASTER;
m_mainmode++;
}
break;

case 0x04: // port status
Expand Down Expand Up @@ -267,23 +282,35 @@ u8 tc0140syt_device::slave_comm_r()
switch (m_submode)
{
case 0x00: // mode #0
res = m_slavedata[m_submode++];
res = m_slavedata[m_submode];
if (!machine().side_effects_disabled())
m_submode++;
break;

case 0x01: // mode #1
m_status &= ~TC0140SYT_PORT01_FULL;
res = m_slavedata[m_submode++];
update_nmi();
res = m_slavedata[m_submode];
if (!machine().side_effects_disabled())
{
m_status &= ~TC0140SYT_PORT01_FULL;
m_submode++;
update_nmi();
}
break;

case 0x02: // mode #2
res = m_slavedata[m_submode++];
res = m_slavedata[m_submode];
if (!machine().side_effects_disabled())
m_submode++;
break;

case 0x03: // mode #3
m_status &= ~TC0140SYT_PORT23_FULL;
res = m_slavedata[m_submode++];
update_nmi();
res = m_slavedata[m_submode];
if (!machine().side_effects_disabled())
{
m_status &= ~TC0140SYT_PORT23_FULL;
m_submode++;
update_nmi();
}
break;

case 0x04: // port status
Expand Down
8 changes: 4 additions & 4 deletions src/mame/shared/taitosnd.h
Expand Up @@ -15,8 +15,8 @@ class tc0140syt_device : public device_t
public:
tc0140syt_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);

template <typename T> void set_master_tag(T &&tag) { m_mastercpu.set_tag(std::forward<T>(tag)); }
template <typename T> void set_slave_tag(T &&tag) { m_slavecpu.set_tag(std::forward<T>(tag)); }
auto nmi_callback() { return m_nmi_cb.bind(); }
auto reset_callback() { return m_reset_cb.bind(); }

// MASTER (4-bit bus) control functions
void master_port_w(u8 data);
Expand Down Expand Up @@ -45,8 +45,8 @@ class tc0140syt_device : public device_t
u8 m_status; /* Status data */
u8 m_nmi_enabled; /* 1 if slave cpu has nmi's enabled */

required_device<cpu_device> m_mastercpu; /* this is the maincpu */
required_device<cpu_device> m_slavecpu; /* this is the audiocpu */
devcb_write_line m_nmi_cb;
devcb_write_line m_reset_cb;
};

// ======================> pc060ha_device
Expand Down
4 changes: 2 additions & 2 deletions src/mame/sony/zn.cpp
Expand Up @@ -901,8 +901,8 @@ void taito_fx1a_state::coh1000ta(machine_config &config)
MB3773(config, m_mb3773);

tc0140syt_device &tc0140syt(TC0140SYT(config, "tc0140syt", 0));
tc0140syt.set_master_tag(m_maincpu);
tc0140syt.set_slave_tag(m_audiocpu);
tc0140syt.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
tc0140syt.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}

void taito_fx1b_state::fram_w(offs_t offset, uint8_t data)
Expand Down
20 changes: 10 additions & 10 deletions src/mame/taito/asuka.cpp
Expand Up @@ -1131,8 +1131,8 @@ void bonzeadv_state::bonzeadv(machine_config &config)
ymsnd.add_route(2, "mono", 1.0);

tc0140syt_device &tc0140syt(TC0140SYT(config, "tc0140syt", 0));
tc0140syt.set_master_tag(m_maincpu);
tc0140syt.set_slave_tag(m_audiocpu);
tc0140syt.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
tc0140syt.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}

void msm_state::asuka(machine_config &config)
Expand Down Expand Up @@ -1194,8 +1194,8 @@ void msm_state::asuka(machine_config &config)
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
ciu.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ciu.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}

void cadash_state::cadash(machine_config &config)
Expand Down Expand Up @@ -1254,8 +1254,8 @@ void cadash_state::cadash(machine_config &config)
ymsnd.add_route(1, "mono", 0.50);

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
ciu.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ciu.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}

void msm_state::mofflott(machine_config &config)
Expand Down Expand Up @@ -1317,8 +1317,8 @@ void msm_state::mofflott(machine_config &config)
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
ciu.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ciu.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}

void base_state::eto(machine_config &config)
Expand Down Expand Up @@ -1372,8 +1372,8 @@ void base_state::eto(machine_config &config)
ymsnd.add_route(1, "mono", 0.50);

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
ciu.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ciu.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}


Expand Down
4 changes: 2 additions & 2 deletions src/mame/taito/bingowav.cpp
Expand Up @@ -135,8 +135,8 @@ void bingowav_state::bingowav(machine_config &config)
ymsnd.add_route(2, "mono", 1.0);

tc0140syt_device &tc0140syt(TC0140SYT(config, "tc0140syt", 0));
tc0140syt.set_master_tag(m_maincpu);
tc0140syt.set_slave_tag("audiocpu");
tc0140syt.nmi_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
tc0140syt.reset_callback().set_inputline("audiocpu", INPUT_LINE_RESET);

m68000_device &termcpu(TMP68303(config, "termcpu", 12000000)); // actually TMP63803F-16
termcpu.set_addrmap(AS_PROGRAM, &bingowav_state::bingowav_drive_map);
Expand Down
4 changes: 2 additions & 2 deletions src/mame/taito/cpzodiac.cpp
Expand Up @@ -201,8 +201,8 @@ void cpzodiac_state::cpzodiac(machine_config &config)
ymsnd.add_route(2, "rspeaker", 1.0);

tc0140syt_device &syt(TC0140SYT(config, "syt", 0));
syt.set_master_tag(m_maincpu);
syt.set_slave_tag(m_audiocpu);
syt.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
syt.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}


Expand Down
4 changes: 2 additions & 2 deletions src/mame/taito/cucaracha.cpp
Expand Up @@ -151,8 +151,8 @@ void cucaracha_state::cucaracha(machine_config &config)
soundcpu.set_addrmap(AS_PROGRAM, &cucaracha_state::sound_map);

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag("soundcpu");
ciu.nmi_callback().set_inputline("soundcpu", INPUT_LINE_NMI);
ciu.reset_callback().set_inputline("soundcpu", INPUT_LINE_RESET);

SPEAKER(config, "mono").front_center();

Expand Down
4 changes: 2 additions & 2 deletions src/mame/taito/darius.cpp
Expand Up @@ -1017,8 +1017,8 @@ void darius_state::darius(machine_config &config)
FILTER_VOLUME(config, m_msm5205_r).add_route(ALL_OUTPUTS, "rspeaker", 1.0);

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
ciu.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ciu.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}


Expand Down
4 changes: 2 additions & 2 deletions src/mame/taito/exzisus.cpp
Expand Up @@ -407,8 +407,8 @@ void exzisus_state::exzisus(machine_config &config)
ymsnd.add_route(1, "mono", 0.50);

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag("cpub");
ciu.set_slave_tag("audiocpu");
ciu.nmi_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
ciu.reset_callback().set_inputline("audiocpu", INPUT_LINE_RESET);
}


Expand Down
16 changes: 8 additions & 8 deletions src/mame/taito/heromem.cpp
Expand Up @@ -242,12 +242,12 @@ void heromem_state::heromem(machine_config &config)
rscreen.set_palette("tc0091lvc_r:palette");

pc060ha_device &ciu_l(PC060HA(config, "ciu_l", 0));
ciu_l.set_master_tag("maincpu");
ciu_l.set_slave_tag(m_tc0091lvc_l);
ciu_l.nmi_callback().set_inputline(m_tc0091lvc_l, INPUT_LINE_NMI);
ciu_l.reset_callback().set_inputline(m_tc0091lvc_l, INPUT_LINE_RESET);

pc060ha_device &ciu_r(PC060HA(config, "ciu_r", 0));
ciu_r.set_master_tag("maincpu");
ciu_r.set_slave_tag(m_tc0091lvc_r);
ciu_r.nmi_callback().set_inputline(m_tc0091lvc_r, INPUT_LINE_NMI);
ciu_r.reset_callback().set_inputline(m_tc0091lvc_r, INPUT_LINE_RESET);

tc0091lvc_device &vdp_l(TC0091LVC(config, m_tc0091lvc_l, 16000000 / 4));
vdp_l.set_addrmap(AS_PROGRAM, &heromem_state::tc0091lvc_l_prg_map);
Expand All @@ -261,12 +261,12 @@ void heromem_state::heromem(machine_config &config)
SPEAKER(config, "rspeaker").front_right();

tc0140syt_device &syt_l(TC0140SYT(config, "tc0140syt_l", 0));
syt_l.set_master_tag("maincpu");
syt_l.set_slave_tag("audiocpu_l");
syt_l.nmi_callback().set_inputline("audiocpu_l", INPUT_LINE_NMI);
syt_l.reset_callback().set_inputline("audiocpu_l", INPUT_LINE_RESET);

tc0140syt_device &syt_r(TC0140SYT(config, "tc0140syt_r", 0));
syt_r.set_master_tag("maincpu");
syt_r.set_slave_tag("audiocpu_r");
syt_r.nmi_callback().set_inputline("audiocpu_r", INPUT_LINE_NMI);
syt_r.reset_callback().set_inputline("audiocpu_r", INPUT_LINE_RESET);

ym2610b_device &ym_l(YM2610B(config, "ym_l", 16000000 / 2));
ym_l.irq_handler().set_inputline("audiocpu_l", 0);
Expand Down
4 changes: 2 additions & 2 deletions src/mame/taito/mlanding.cpp
Expand Up @@ -965,8 +965,8 @@ void mlanding_state::mlanding(machine_config &config)
m_ctc->zc_callback<0>().set(FUNC(mlanding_state::z80ctc_to0));

pc060ha_device& ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
ciu.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ciu.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);

config.set_maximum_quantum(attotime::from_hz(600));

Expand Down
8 changes: 4 additions & 4 deletions src/mame/taito/ninjaw.cpp
Expand Up @@ -994,8 +994,8 @@ void ninjaw_state::ninjaw(machine_config &config)
// SUBWOOFER(config, "subwoofer", 0);

TC0140SYT(config, m_tc0140syt, 0);
m_tc0140syt->set_master_tag(m_maincpu);
m_tc0140syt->set_slave_tag("audiocpu");
m_tc0140syt->nmi_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
m_tc0140syt->reset_callback().set_inputline("audiocpu", INPUT_LINE_RESET);
}


Expand Down Expand Up @@ -1100,8 +1100,8 @@ void ninjaw_state::darius2(machine_config &config)
// SUBWOOFER(config, "subwoofer", 0);

TC0140SYT(config, m_tc0140syt, 0);
m_tc0140syt->set_master_tag(m_maincpu);
m_tc0140syt->set_slave_tag("audiocpu");
m_tc0140syt->nmi_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
m_tc0140syt->reset_callback().set_inputline("audiocpu", INPUT_LINE_RESET);
}


Expand Down
8 changes: 4 additions & 4 deletions src/mame/taito/opwolf.cpp
Expand Up @@ -947,8 +947,8 @@ void opwolf_state::opwolf(machine_config &config)
m_msm[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
ciu.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ciu.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}

void opwolf_state::opwolfp(machine_config &config)
Expand Down Expand Up @@ -1021,8 +1021,8 @@ void opwolf_state::opwolfb(machine_config &config) /* OSC clocks unknown for the
m_msm[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
ciu.nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ciu.reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}


Expand Down
4 changes: 2 additions & 2 deletions src/mame/taito/othunder.cpp
Expand Up @@ -646,8 +646,8 @@ void othunder_state::othunder(machine_config &config)
FILTER_VOLUME(config, "2610.2r").add_route(ALL_OUTPUTS, "speaker", 1.0);

TC0140SYT(config, m_tc0140syt, 0);
m_tc0140syt->set_master_tag(m_maincpu);
m_tc0140syt->set_slave_tag(m_audiocpu);
m_tc0140syt->nmi_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
m_tc0140syt->reset_callback().set_inputline(m_audiocpu, INPUT_LINE_RESET);
}


Expand Down
4 changes: 2 additions & 2 deletions src/mame/taito/pkspirit.cpp
Expand Up @@ -334,8 +334,8 @@ void pkspirit_state::pkspirit(machine_config &config)
SPEAKER(config, "mono").front_center();

pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag("audiocpu");
ciu.nmi_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
ciu.reset_callback().set_inputline("audiocpu", INPUT_LINE_RESET);

ym2203_device &opn(YM2203(config, "opn", 36_MHz_XTAL / 9)); // divider not verified
opn.irq_handler().set_inputline("audiocpu", 0);
Expand Down

0 comments on commit d17892f

Please sign in to comment.