summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2017-08-21 22:34:21 -0400
committer AJR <ajrhacker@users.noreply.github.com>2017-08-21 22:37:56 -0400
commitdfffa3d1fc552872a89d7799f493e5475f95e0ef (patch)
tree425b97063dcb53967357369bd76468e0b6f48eb1
parent793fe7c9950c593c75fa04358cc071cfa43a502e (diff)
mastninj: Implement dual OPN + dual MSM5205 ADPCM sound system as in Automat
-rw-r--r--src/mame/drivers/gaiden.cpp85
-rw-r--r--src/mame/includes/gaiden.h17
2 files changed, 75 insertions, 27 deletions
diff --git a/src/mame/drivers/gaiden.cpp b/src/mame/drivers/gaiden.cpp
index ac8e1a98e17..6c09b4b3f9c 100644
--- a/src/mame/drivers/gaiden.cpp
+++ b/src/mame/drivers/gaiden.cpp
@@ -161,15 +161,6 @@ WRITE16_MEMBER(gaiden_state::gaiden_sound_command_w)
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
-WRITE16_MEMBER(gaiden_state::drgnbowl_sound_command_w)
-{
- if (ACCESSING_BITS_8_15)
- {
- m_soundlatch->write(space, 0, data >> 8);
- m_audiocpu->set_input_line(0, HOLD_LINE);
- }
-}
-
/* Wild Fang / Tecmo Knight has a simple protection. It writes codes to 0x07a804, */
@@ -431,7 +422,7 @@ static ADDRESS_MAP_START( drgnbowl_map, AS_PROGRAM, 16, gaiden_state )
AM_RANGE(0x07a000, 0x07a001) AM_READ_PORT("SYSTEM")
AM_RANGE(0x07a002, 0x07a003) AM_READ_PORT("P1_P2")
AM_RANGE(0x07a004, 0x07a005) AM_READ_PORT("DSW")
- AM_RANGE(0x07a00e, 0x07a00f) AM_WRITE(drgnbowl_sound_command_w)
+ AM_RANGE(0x07a00e, 0x07a00f) AM_DEVWRITE8("soundlatch", generic_latch_8_device, write, 0xff00)
AM_RANGE(0x07e000, 0x07e001) AM_WRITE8(drgnbowl_irq_ack_w, 0xff00)
AM_RANGE(0x07f000, 0x07f001) AM_WRITE(gaiden_bgscrolly_w)
AM_RANGE(0x07f002, 0x07f003) AM_WRITE(gaiden_bgscrollx_w)
@@ -859,6 +850,7 @@ static MACHINE_CONFIG_START( drgnbowl )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0))
MCFG_YM2151_ADD("ymsnd", 4000000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
@@ -914,16 +906,46 @@ Others
*/
static ADDRESS_MAP_START( mastninj_sound_map, AS_PROGRAM, 8, gaiden_state )
- AM_RANGE(0x0000, 0xdfff) AM_ROM
- AM_RANGE(0xc400, 0xc401) AM_DEVWRITE("ym1", ym2203_device, write)
- AM_RANGE(0xc800, 0xc801) AM_DEVWRITE("ym2", ym2203_device, write)
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("adpcm_bank")
+ AM_RANGE(0xc400, 0xc401) AM_DEVREADWRITE("ym1", ym2203_device, read, write)
+ AM_RANGE(0xc800, 0xc801) AM_DEVREADWRITE("ym2", ym2203_device, read, write)
AM_RANGE(0xcc00, 0xcc00) AM_DEVREAD("soundlatch", generic_latch_8_device, read)
- AM_RANGE(0xd000, 0xd000) AM_WRITENOP // ?
- AM_RANGE(0xd400, 0xd400) AM_WRITENOP // ?
- AM_RANGE(0xd800, 0xd800) AM_WRITENOP // ?
+ AM_RANGE(0xd000, 0xd000) AM_DEVWRITE("adpcm_select2", ls157_device, ba_w)
+ AM_RANGE(0xd400, 0xd400) AM_WRITE(adpcm_bankswitch_w)
+ AM_RANGE(0xd800, 0xd800) AM_DEVWRITE("adpcm_select1", ls157_device, ba_w)
AM_RANGE(0xf000, 0xf7ff) AM_RAM
ADDRESS_MAP_END
+WRITE_LINE_MEMBER(gaiden_state::vck_flipflop_w)
+{
+ if (!state)
+ return;
+
+ m_adpcm_toggle = !m_adpcm_toggle;
+ m_adpcm_select[0]->select_w(m_adpcm_toggle);
+ m_adpcm_select[1]->select_w(m_adpcm_toggle);
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, m_adpcm_toggle);
+}
+
+WRITE8_MEMBER(gaiden_state::adpcm_bankswitch_w)
+{
+ m_msm[0]->reset_w(BIT(data, 3));
+ m_msm[1]->reset_w(BIT(data, 4));
+ m_adpcm_bank->set_entry(data & 7);
+}
+
+MACHINE_START_MEMBER(gaiden_state,mastninj)
+{
+ MACHINE_START_CALL_MEMBER(raiga);
+
+ m_adpcm_bank->configure_entries(0, 8, memregion("audiocpu")->base(), 0x4000);
+ m_adpcm_bank->set_entry(0);
+
+ m_adpcm_toggle = 0;
+ save_item(NAME(m_adpcm_toggle));
+}
+
static ADDRESS_MAP_START( mastninj_map, AS_PROGRAM, 16, gaiden_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x060000, 0x063fff) AM_RAM
@@ -945,7 +967,7 @@ static ADDRESS_MAP_START( mastninj_map, AS_PROGRAM, 16, gaiden_state )
AM_RANGE(0x07a800, 0x07a801) AM_DEVWRITE("watchdog", watchdog_timer_device, reset16_w)
// AM_RANGE(0x07a806, 0x07a807) AM_WRITENOP
// AM_RANGE(0x07a808, 0x07a809) AM_WRITE(gaiden_flip_w)
- AM_RANGE(0x07a00e, 0x07a00f) AM_WRITE(drgnbowl_sound_command_w)
+ AM_RANGE(0x07a00e, 0x07a00f) AM_DEVWRITE8("soundlatch", generic_latch_8_device, write, 0xff00)
AM_RANGE(0x07e000, 0x07e001) AM_WRITE8(drgnbowl_irq_ack_w, 0xff00)
ADDRESS_MAP_END
@@ -958,9 +980,8 @@ static MACHINE_CONFIG_START( mastninj )
MCFG_CPU_ADD("audiocpu", Z80, 4000000) /* ?? MHz */
MCFG_CPU_PROGRAM_MAP(mastninj_sound_map)
- /* IRQs are triggered by the YM2203 */
- MCFG_MACHINE_START_OVERRIDE(gaiden_state,raiga)
+ MCFG_MACHINE_START_OVERRIDE(gaiden_state,mastninj)
MCFG_MACHINE_RESET_OVERRIDE(gaiden_state,raiga)
MCFG_WATCHDOG_ADD("watchdog")
@@ -986,22 +1007,36 @@ static MACHINE_CONFIG_START( mastninj )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0))
- MCFG_SOUND_ADD("ym1", YM2203, 4000000) /* ?? MHz */
+ // YM2203 clocks chosen by analogy with Automat; actual rate unknown, but 4 MHz is obviously too fast
+ MCFG_SOUND_ADD("ym1", YM2203, 1250000)
MCFG_SOUND_ROUTE(0, "mono", 0.15)
MCFG_SOUND_ROUTE(1, "mono", 0.15)
MCFG_SOUND_ROUTE(2, "mono", 0.15)
MCFG_SOUND_ROUTE(3, "mono", 0.60)
- MCFG_SOUND_ADD("ym2", YM2203, 4000000) /* ?? MHz */
+ MCFG_SOUND_ADD("ym2", YM2203, 1250000)
MCFG_SOUND_ROUTE(0, "mono", 0.15)
MCFG_SOUND_ROUTE(1, "mono", 0.15)
MCFG_SOUND_ROUTE(2, "mono", 0.15)
MCFG_SOUND_ROUTE(3, "mono", 0.60)
- /* no 6295 on the bootleg - does this use a pair of 5205 instead? */
-// MCFG_OKIM6295_ADD("oki", 1000000, PIN7_HIGH)
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
+ MCFG_DEVICE_ADD("adpcm_select1", LS157, 0)
+ MCFG_74157_OUT_CB(DEVWRITE8("msm1", msm5205_device, data_w))
+
+ MCFG_DEVICE_ADD("adpcm_select2", LS157, 0)
+ MCFG_74157_OUT_CB(DEVWRITE8("msm2", msm5205_device, data_w))
+
+ MCFG_SOUND_ADD("msm1", MSM5205, 384000)
+ MCFG_MSM5205_VCK_CALLBACK(DEVWRITELINE("msm2", msm5205_device, vclk_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(gaiden_state, vck_flipflop_w))
+ MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
+
+ MCFG_SOUND_ADD("msm2", MSM5205, 384000)
+ MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
MACHINE_CONFIG_END
/***************************************************************************
@@ -1226,7 +1261,7 @@ ROM_START( mastninj )
ROM_LOAD16_BYTE( "4.ic26", 0x20000, 0x10000, CRC(d375c5f6) SHA1(925e84d79f35595a344a417125d74dc46ebec310) ) // 1ST AND 2ND HALF IDENTICAL (but correct?)
ROM_LOAD16_BYTE( "2.ic29", 0x20001, 0x10000, CRC(6b53b8b1) SHA1(68bffc992fecae5e113592a9481c0cee80925135) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x20000, "audiocpu", 0 )
ROM_LOAD( "5.ic35", 0x000000, 0x10000, CRC(ba528424) SHA1(5ab93059e26483a756d80b8c18d9669d2a3416de) )
ROM_REGION( 0x010000, "gfx1", 0 )
diff --git a/src/mame/includes/gaiden.h b/src/mame/includes/gaiden.h
index c354d0f543d..2a49714bcdc 100644
--- a/src/mame/includes/gaiden.h
+++ b/src/mame/includes/gaiden.h
@@ -8,6 +8,8 @@
***************************************************************************/
#include "machine/gen_latch.h"
+#include "machine/74157.h"
+#include "sound/msm5205.h"
#include "video/tecmo_spr.h"
#include "video/tecmo_mix.h"
#include "screen.h"
@@ -21,6 +23,7 @@ public:
m_videoram2(*this, "videoram2"),
m_videoram3(*this, "videoram3"),
m_spriteram(*this, "spriteram"),
+ m_adpcm_bank(*this, "adpcm_bank"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
@@ -28,7 +31,9 @@ public:
m_palette(*this, "palette"),
m_sprgen(*this, "spritegen"),
m_mixer(*this, "mixer"),
- m_soundlatch(*this, "soundlatch")
+ m_soundlatch(*this, "soundlatch"),
+ m_msm(*this, "msm%u", 1),
+ m_adpcm_select(*this, "adpcm_select%u", 1)
{ }
/* memory pointers */
@@ -36,6 +41,7 @@ public:
required_shared_ptr<uint16_t> m_videoram2;
required_shared_ptr<uint16_t> m_videoram3;
required_shared_ptr<uint16_t> m_spriteram;
+ optional_memory_bank m_adpcm_bank;
/* video-related */
tilemap_t *m_text_layer;
@@ -60,6 +66,7 @@ public:
int m_prot;
int m_jumpcode;
const int *m_raiga_jumppoints;
+ bool m_adpcm_toggle;
/* devices */
required_device<cpu_device> m_maincpu;
@@ -70,11 +77,16 @@ public:
optional_device<tecmo_spr_device> m_sprgen;
optional_device<tecmo_mix_device> m_mixer;
required_device<generic_latch_8_device> m_soundlatch;
+ optional_device_array<msm5205_device, 2> m_msm;
+ optional_device_array<ls157_device, 2> m_adpcm_select;
+
+ // mastninja ADPCM control
+ DECLARE_WRITE_LINE_MEMBER(vck_flipflop_w);
+ DECLARE_WRITE8_MEMBER(adpcm_bankswitch_w);
DECLARE_WRITE16_MEMBER(irq_ack_w);
DECLARE_WRITE8_MEMBER(drgnbowl_irq_ack_w);
DECLARE_WRITE16_MEMBER(gaiden_sound_command_w);
- DECLARE_WRITE16_MEMBER(drgnbowl_sound_command_w);
DECLARE_WRITE16_MEMBER(wildfang_protection_w);
DECLARE_READ16_MEMBER(wildfang_protection_r);
DECLARE_WRITE16_MEMBER(raiga_protection_w);
@@ -104,6 +116,7 @@ public:
TILE_GET_INFO_MEMBER(get_fg_tile_info_raiga);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
DECLARE_MACHINE_START(raiga);
+ DECLARE_MACHINE_START(mastninj);
DECLARE_MACHINE_RESET(raiga);
DECLARE_VIDEO_START(gaiden);
DECLARE_VIDEO_START(drgnbowl);