Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

shared/taitosnd.cpp: Use callback for interrupt/reset handler, Fix side effect for debugging #11860

Merged
merged 2 commits into from Dec 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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