From 6ce6c2a92bbcc4071c83da48b28055428621f481 Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 9 Jan 2017 22:01:59 -0500 Subject: [PATCH] kchamp.cpp: All IRQs/NMIs acknowledged; add 74LS157 for kchampvs (nw) --- src/mame/drivers/kchamp.cpp | 61 ++++++++++++++++--------------------- src/mame/includes/kchamp.h | 12 ++++---- 2 files changed, 32 insertions(+), 41 deletions(-) diff --git a/src/mame/drivers/kchamp.cpp b/src/mame/drivers/kchamp.cpp index 8403d9ac9a6..b2e93fd1571 100644 --- a/src/mame/drivers/kchamp.cpp +++ b/src/mame/drivers/kchamp.cpp @@ -78,6 +78,8 @@ IO ports and memory map changes. Dip switches differ too. WRITE8_MEMBER(kchamp_state::control_w) { m_nmi_enable = data & 1; + if (!m_nmi_enable) + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } WRITE8_MEMBER(kchamp_state::sound_reset_w) @@ -90,18 +92,8 @@ WRITE8_MEMBER(kchamp_state::sound_control_w) { m_msm->reset_w(!(data & 1)); m_sound_nmi_enable = ((data >> 1) & 1); -} - -WRITE8_MEMBER(kchamp_state::sound_command_w) -{ - m_soundlatch->write(space, 0, data); - m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); -} - -WRITE8_MEMBER(kchamp_state::sound_msm_w) -{ - m_msm_data = data; - m_msm_play_lo_nibble = 1; + if (!m_sound_nmi_enable) + m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } static ADDRESS_MAP_START( kchampvs_map, AS_PROGRAM, 8, kchamp_state ) @@ -123,7 +115,7 @@ static ADDRESS_MAP_START( kchampvs_io_map, AS_IO, 8, kchamp_state ) AM_RANGE(0x00, 0x00) AM_READ_PORT("P1") AM_WRITE(kchamp_flipscreen_w) AM_RANGE(0x01, 0x01) AM_WRITE(control_w) AM_RANGE(0x02, 0x02) AM_WRITE(sound_reset_w) - AM_RANGE(0x40, 0x40) AM_READ_PORT("P2") AM_WRITE(sound_command_w) + AM_RANGE(0x40, 0x40) AM_READ_PORT("P2") AM_DEVWRITE("soundlatch", generic_latch_8_device, write) AM_RANGE(0x80, 0x80) AM_READ_PORT("SYSTEM") AM_RANGE(0xc0, 0xc0) AM_READ_PORT("DSW") ADDRESS_MAP_END @@ -138,7 +130,7 @@ static ADDRESS_MAP_START( kchampvs_sound_io_map, AS_IO, 8, kchamp_state ) AM_RANGE(0x00, 0x01) AM_DEVWRITE("ay1", ay8910_device, data_address_w) AM_RANGE(0x01, 0x01) AM_DEVREAD("soundlatch", generic_latch_8_device, read) AM_RANGE(0x02, 0x03) AM_DEVWRITE("ay2", ay8910_device, data_address_w) - AM_RANGE(0x04, 0x04) AM_WRITE(sound_msm_w) + AM_RANGE(0x04, 0x04) AM_DEVWRITE("adpcm_select", ls157_device, ab_w) AM_RANGE(0x05, 0x05) AM_WRITE(sound_control_w) ADDRESS_MAP_END @@ -155,7 +147,11 @@ READ8_MEMBER(kchamp_state::sound_reset_r) WRITE8_MEMBER(kchamp_state::kc_sound_control_w) { if (offset == 0) + { m_sound_nmi_enable = ((data >> 7) & 1); + if (!m_sound_nmi_enable) + m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + } else m_dac->set_output_gain(0, BIT(data,0) ? 1.0 : 0); } @@ -176,7 +172,7 @@ static ADDRESS_MAP_START( kchamp_io_map, AS_IO, 8, kchamp_state ) AM_RANGE(0x90, 0x90) AM_READ_PORT("P1") AM_RANGE(0x98, 0x98) AM_READ_PORT("P2") AM_RANGE(0xa0, 0xa0) AM_READ_PORT("SYSTEM") - AM_RANGE(0xa8, 0xa8) AM_READWRITE(sound_reset_r, sound_command_w) + AM_RANGE(0xa8, 0xa8) AM_READ(sound_reset_r) AM_DEVWRITE("soundlatch", generic_latch_8_device, write) ADDRESS_MAP_END static ADDRESS_MAP_START( kchamp_sound_map, AS_PROGRAM, 8, kchamp_state ) @@ -346,23 +342,19 @@ GFXDECODE_END INTERRUPT_GEN_MEMBER(kchamp_state::kc_interrupt) { if (m_nmi_enable) - device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); + device.execute().set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } WRITE_LINE_MEMBER(kchamp_state::msmint) { - if (m_msm_play_lo_nibble) - m_msm->data_w(m_msm_data & 0x0f); - else - m_msm->data_w((m_msm_data >> 4) & 0x0f); + if (!state) + return; - m_msm_play_lo_nibble ^= 1; + m_msm_play_lo_nibble = !m_msm_play_lo_nibble; + m_adpcm_select->select_w(m_msm_play_lo_nibble); - if (!(m_counter ^= 1)) - { - if (m_sound_nmi_enable) - m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); - } + if (m_msm_play_lo_nibble && m_sound_nmi_enable) + m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } /******************** @@ -372,7 +364,7 @@ WRITE_LINE_MEMBER(kchamp_state::msmint) INTERRUPT_GEN_MEMBER(kchamp_state::sound_int) { if (m_sound_nmi_enable) - device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); + device.execute().set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } @@ -386,9 +378,7 @@ MACHINE_START_MEMBER(kchamp_state,kchampvs) { MACHINE_START_CALL_MEMBER(kchamp); - save_item(NAME(m_msm_data)); save_item(NAME(m_msm_play_lo_nibble)); - save_item(NAME(m_counter)); } void kchamp_state::machine_reset() @@ -431,6 +421,7 @@ static MACHINE_CONFIG_START( kchampvs, kchamp_state ) MCFG_SPEAKER_STANDARD_MONO("speaker") MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0)) MCFG_SOUND_ADD("ay1", AY8910, XTAL_12MHz/8) /* verified on pcb */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) @@ -438,6 +429,9 @@ static MACHINE_CONFIG_START( kchampvs, kchamp_state ) MCFG_SOUND_ADD("ay2", AY8910, XTAL_12MHz/8) /* verified on pcb */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) + MCFG_DEVICE_ADD("adpcm_select", LS157, 0) // at 4C + MCFG_74157_OUT_CB(DEVWRITE8("msm", msm5205_device, data_w)) + MCFG_SOUND_ADD("msm", MSM5205, 375000) /* verified on pcb, discrete circuit clock */ MCFG_MSM5205_VCLK_CB(WRITELINE(kchamp_state, msmint)) /* interrupt function */ MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S96_4B) /* 1 / 96 = 3906.25Hz playback */ @@ -483,6 +477,7 @@ static MACHINE_CONFIG_START( kchamp, kchamp_state ) MCFG_SPEAKER_STANDARD_MONO("speaker") MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0)) MCFG_SOUND_ADD("ay1", AY8910, XTAL_12MHz/12) /* Guess based on actual pcb recordings of karatedo */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) @@ -744,18 +739,14 @@ DRIVER_INIT_MEMBER(kchamp_state,kchampvs) m_decrypted_opcodes[A] = rom[A]; /* fix fourth opcode (ld ($xxxx),a */ /* and from here on, opcodes are encrypted */ - m_counter = 0; - m_msm_data = 0; - m_msm_play_lo_nibble = 0; + m_msm_play_lo_nibble = true; } DRIVER_INIT_MEMBER(kchamp_state,kchampvs2) { decrypt_code(); - m_counter = 0; - m_msm_data = 0; - m_msm_play_lo_nibble = 1; + m_msm_play_lo_nibble = true; } diff --git a/src/mame/includes/kchamp.h b/src/mame/includes/kchamp.h index cb1425ebd90..f3a1b7cb39a 100644 --- a/src/mame/includes/kchamp.h +++ b/src/mame/includes/kchamp.h @@ -6,6 +6,7 @@ *************************************************************************/ +#include "machine/74157.h" #include "machine/gen_latch.h" #include "sound/msm5205.h" #include "sound/dac.h" @@ -21,6 +22,7 @@ public: m_decrypted_opcodes(*this, "decrypted_opcodes"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), + m_adpcm_select(*this, "adpcm_select"), m_msm(*this, "msm"), m_dac(*this, "dac"), m_gfxdecode(*this, "gfxdecode"), @@ -37,15 +39,14 @@ public: tilemap_t *m_bg_tilemap; /* misc */ - int m_nmi_enable; - int m_sound_nmi_enable; - int m_msm_data; - int m_msm_play_lo_nibble; - int m_counter; + bool m_nmi_enable; + bool m_sound_nmi_enable; + bool m_msm_play_lo_nibble; /* devices */ required_device m_maincpu; required_device m_audiocpu; + optional_device m_adpcm_select; optional_device m_msm; optional_device m_dac; required_device m_gfxdecode; @@ -54,7 +55,6 @@ public: DECLARE_WRITE8_MEMBER(control_w); DECLARE_WRITE8_MEMBER(sound_reset_w); - DECLARE_WRITE8_MEMBER(sound_command_w); DECLARE_WRITE8_MEMBER(sound_msm_w); DECLARE_READ8_MEMBER(sound_reset_r); DECLARE_WRITE8_MEMBER(kc_sound_control_w);