tumbleb: Drive ADPCM sound through PIC (sound communications not hooked up yet)

This commit is contained in:
AJR 2019-03-28 22:28:37 -04:00
parent b07f4ede48
commit 74f9d7d10f
2 changed files with 99 additions and 11 deletions

View File

@ -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 )

View File

@ -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<uint16_t> m_mainram;
required_shared_ptr<uint16_t> 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