From 74f9d7d10fa4b2ffaf2eaab4ea758788aa589004 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 28 Mar 2019 22:28:37 -0400 Subject: tumbleb: Drive ADPCM sound through PIC (sound communications not hooked up yet) --- src/mame/drivers/tumbleb.cpp | 81 +++++++++++++++++++++++++++++++++++++++----- src/mame/includes/tumbleb.h | 29 ++++++++++++++-- 2 files changed, 99 insertions(+), 11 deletions(-) diff --git a/src/mame/drivers/tumbleb.cpp b/src/mame/drivers/tumbleb.cpp index 413fc8a7781..8716bc0c83d 100644 --- a/src/mame/drivers/tumbleb.cpp +++ b/src/mame/drivers/tumbleb.cpp @@ -304,6 +304,7 @@ Stephh's notes (based on the games M68000 code and some tests) : #include "cpu/m68000/m68000.h" #include "cpu/h6280/h6280.h" #include "cpu/mcs51/mcs51.h" // for semicom mcu +#include "cpu/pic16c5x/pic16c5x.h" #include "machine/decocrpt.h" #include "sound/ym2151.h" #include "sound/3812intf.h" @@ -667,7 +668,7 @@ void tumbleb_state::tumblepopba_main_map(address_map &map) map(0x322000, 0x322fff).w(FUNC(tumbleb_state::tumblepb_pf2_data_w)).share("pf2_data"); } -void tumbleb_state::funkyjetb_map(address_map &map) +void tumbleb_pic_state::funkyjetb_map(address_map &map) { map(0x000000, 0x07ffff).rom(); map(0x120000, 0x1207ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); @@ -676,13 +677,19 @@ void tumbleb_state::funkyjetb_map(address_map &map) map(0x1d0382, 0x1d0383).portr("DSW"); map(0x242102, 0x242103).portr("SYSTEM"); map(0x200000, 0x2007ff).ram(); // writes 0x180 - map(0x300000, 0x30000f).w(FUNC(tumbleb_state::tumblepb_control_0_w)); - map(0x320000, 0x320fff).w(FUNC(tumbleb_state::tumblepb_pf1_data_w)).share("pf1_data"); - map(0x322000, 0x322fff).w(FUNC(tumbleb_state::tumblepb_pf2_data_w)).share("pf2_data"); - //map(0x340000, 0x340bff).ram().share("pf1_rowscroll"); + map(0x300000, 0x30000f).w(FUNC(tumbleb_pic_state::tumblepb_control_0_w)); + map(0x320000, 0x320fff).ram().w(FUNC(tumbleb_pic_state::tumblepb_pf1_data_w)).share("pf1_data"); + map(0x322000, 0x322fff).ram().w(FUNC(tumbleb_pic_state::tumblepb_pf2_data_w)).share("pf2_data"); + map(0x340000, 0x340bff).ram().share("pf1_rowscroll"); //map(0x342000, 0x342bff).ram().share("pf2_rowscroll"); } +void tumbleb_pic_state::funkyjetb_oki_map(address_map &map) +{ + map(0x00000, 0x37fff).rom().region("oki", 0); + map(0x38000, 0x3ffff).bankr("okibank"); +} + void tumbleb_state::unico_base_map(address_map &map) { map(0x100000, 0x100003).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff); @@ -784,6 +791,50 @@ void tumbleb_state::pangpang_main_map(address_map &map) } +/******************************************************************************/ + +void tumbleb_pic_state::oki_bank_w(uint8_t data) +{ + m_okibank->set_entry(data & 0x0f); +} + +uint8_t tumbleb_pic_state::pic_data_r() +{ + return m_pic_data; +} + +void tumbleb_pic_state::pic_data_w(uint8_t data) +{ + m_pic_data = data; +} + +void tumbleb_pic_state::pic_ctrl_w(uint8_t data) +{ + if (!BIT(data, 2)) + { + if (!BIT(data, 0)) + m_pic_data = m_oki->read(); + else if (!BIT(data, 1)) + { + logerror("OKI write: %02X\n", m_pic_data); + m_oki->write(m_pic_data); + } + } + + if (!BIT(data, 4)) + m_pic_data = m_soundlatch->read(machine().dummy_space(), 0); + if (!BIT(data, 5)) + m_soundlatch->acknowledge_w(machine().dummy_space(), 0, 0); +} + +void tumbleb_pic_state::driver_start() +{ + m_pic_data = 0xff; + save_item(NAME(m_pic_data)); + + m_okibank->configure_entries(0, 16, memregion("oki")->base(), 0x8000); +} + /******************************************************************************/ WRITE16_MEMBER(tumbleb_state::semicom_soundcmd_w) @@ -2141,12 +2192,24 @@ void tumbleb_state::tumbleb2(machine_config &config) OKIM6295(config, m_oki, 8000000/10, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.70); } -void tumbleb_state::funkyjetb(machine_config &config) +void tumbleb_pic_state::funkyjetb(machine_config &config) { tumbleb2(config); - m_maincpu->set_addrmap(AS_PROGRAM, &tumbleb_state::funkyjetb_map); - m_maincpu->set_vblank_int("screen", FUNC(tumbleb_state::irq6_line_hold)); + m_maincpu->set_addrmap(AS_PROGRAM, &tumbleb_pic_state::funkyjetb_map); + m_maincpu->set_vblank_int("screen", FUNC(tumbleb_pic_state::irq6_line_hold)); + + GENERIC_LATCH_8(config, m_soundlatch); + m_soundlatch->set_separate_acknowledge(true); + + pic16c57_device &pic(PIC16C57(config, "pic", 4'000'000)); // unknown clock + pic.write_a().set(FUNC(tumbleb_pic_state::oki_bank_w)); + pic.read_b().set(FUNC(tumbleb_pic_state::pic_data_r)); + pic.write_b().set(FUNC(tumbleb_pic_state::pic_data_w)); + pic.read_c().set(m_soundlatch, FUNC(generic_latch_8_device::pending_r)).bit(6); + pic.write_c().set(FUNC(tumbleb_pic_state::pic_ctrl_w)); + + m_oki->set_addrmap(0, &tumbleb_pic_state::funkyjetb_oki_map); } void tumbleb_state::jumpkids(machine_config &config) @@ -3756,7 +3819,7 @@ GAME( 1991, tumbleb, tumblep, tumblepb, tumblepb, tumbleb_state, init_tumble GAME( 1991, tumbleb2, tumblep, tumbleb2, tumblepb, tumbleb_state, init_tumbleb2, ROT0, "bootleg", "Tumble Pop (bootleg with PIC)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // PIC is protected, sound simulation not 100% GAME( 1991, tumblepba,tumblep, tumblepba, tumblepb, tumbleb_state, init_tumblepba,ROT0, "bootleg (Playmark)", "Tumble Pop (Playmark bootleg)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) // Playmark stickers on ROMs, offset pf1_alt tilemap, OKI not hooked up -GAME( 1992, funkyjetb,funkyjet,funkyjetb, tumblepb, tumbleb_state, init_tumblepb, ROT0, "bootleg", "Funky Jet (bootleg)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // wrong palette, inputs not working, undumped PIC driving an OKI +GAME( 1992, funkyjetb,funkyjet,funkyjetb, tumblepb, tumbleb_pic_state, init_tumblepb, ROT0, "bootleg", "Funky Jet (bootleg)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // wrong palette, inputs not working, undumped PIC driving an OKI GAME( 1993, jumpkids, 0, jumpkids, tumblepb, tumbleb_state, init_jumpkids, ROT0, "Comad", "Jump Kids", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/tumbleb.h b/src/mame/includes/tumbleb.h index 54263124dae..cc4f15aee52 100644 --- a/src/mame/includes/tumbleb.h +++ b/src/mame/includes/tumbleb.h @@ -47,7 +47,6 @@ public: void chokchok(machine_config &config); void cookbib_mcu(machine_config &config); void jumpkids(machine_config &config); - void funkyjetb(machine_config &config); void init_dquizgo(); void init_jumpkids(); @@ -64,7 +63,7 @@ public: void init_magipur(); void init_carket(); -private: +protected: /* memory pointers */ optional_shared_ptr m_mainram; required_shared_ptr m_spriteram; @@ -177,7 +176,33 @@ private: void suprtrio_sound_map(address_map &map); void tumblepopb_main_map(address_map &map); void tumblepopba_main_map(address_map &map); +}; + +class tumbleb_pic_state : public tumbleb_state +{ +public: + tumbleb_pic_state(const machine_config &mconfig, device_type type, const char *tag) : + tumbleb_state(mconfig, type, tag), + m_okibank(*this, "okibank") + { } + + void funkyjetb(machine_config &config); + +protected: + virtual void driver_start() override; + +private: + void oki_bank_w(uint8_t data); + uint8_t pic_data_r(); + void pic_data_w(uint8_t data); + void pic_ctrl_w(uint8_t data); + void funkyjetb_map(address_map &map); + void funkyjetb_oki_map(address_map &map); + + required_memory_bank m_okibank; + + uint8_t m_pic_data; }; #endif // MAME_INCLUDES_TUMBLEB_H -- cgit v1.2.3