taito/flstory.cpp: Use single-pass sprite drawing, and moved games with MCU to a derived class. (#11858)

This commit is contained in:
cam900 2023-12-21 01:31:54 +09:00 committed by GitHub
parent 27aa4f6409
commit 273cb34436
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -43,7 +43,6 @@ public:
m_workram(*this, "workram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_bmcu(*this, "bmcu"),
m_msm(*this, "msm"),
m_ay(*this, "aysnd"),
m_ta7630(*this, "ta7630"),
@ -55,17 +54,12 @@ public:
m_extraio1(*this, "EXTRA_P1")
{ }
void flstory(machine_config &config) ATTR_COLD;
void rumba(machine_config &config) ATTR_COLD;
void onna34ro(machine_config &config) ATTR_COLD;
void victnine(machine_config &config) ATTR_COLD;
void onna34ro_mcu(machine_config &config) ATTR_COLD;
protected:
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
private:
// memory pointers
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
@ -75,7 +69,6 @@ private:
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
optional_device<taito68705_mcu_device> m_bmcu;
required_device<msm5232_device> m_msm;
required_device<ay8910_device> m_ay;
required_device<ta7630_device> m_ta7630;
@ -103,39 +96,62 @@ private:
uint8_t snd_flag_r();
void snd_reset_w(uint8_t data);
uint8_t flstory_mcu_status_r();
uint8_t victnine_mcu_status_r();
void flstory_videoram_w(offs_t offset, uint8_t data);
void flstory_palette_w(offs_t offset, uint8_t data);
uint8_t flstory_palette_r(offs_t offset);
void flstory_gfxctrl_w(uint8_t data);
uint8_t victnine_gfxctrl_r();
void victnine_gfxctrl_w(uint8_t data);
void flstory_scrlram_w(offs_t offset, uint8_t data);
void sound_control_0_w(uint8_t data);
void sound_control_1_w(uint8_t data);
void sound_control_2_w(uint8_t data);
void sound_control_3_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_tile_info);
TILE_GET_INFO_MEMBER(victnine_get_tile_info);
TILE_GET_INFO_MEMBER(get_rumba_tile_info);
DECLARE_VIDEO_START(flstory);
DECLARE_VIDEO_START(victnine);
DECLARE_VIDEO_START(rumba);
uint32_t screen_update_flstory(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_victnine(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_rumba(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void flstory_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri);
void victnine_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void flstory_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void common(machine_config &config) ATTR_COLD;
void base_map(address_map &map) ATTR_COLD;
void flstory_map(address_map &map) ATTR_COLD;
void onna34ro_map(address_map &map) ATTR_COLD;
void sound_map(address_map &map) ATTR_COLD;
};
class flstory_mcu_state : public flstory_state
{
public:
flstory_mcu_state(const machine_config &mconfig, device_type type, const char *tag) :
flstory_state(mconfig, type, tag),
m_bmcu(*this, "bmcu")
{ }
void flstory(machine_config &config) ATTR_COLD;
void rumba(machine_config &config) ATTR_COLD;
void victnine(machine_config &config) ATTR_COLD;
void onna34ro_mcu(machine_config &config) ATTR_COLD;
private:
// memory pointers
// devices
required_device<taito68705_mcu_device> m_bmcu;
uint8_t flstory_mcu_status_r();
uint8_t victnine_mcu_status_r();
uint8_t victnine_gfxctrl_r();
void victnine_gfxctrl_w(uint8_t data);
TILE_GET_INFO_MEMBER(victnine_get_tile_info);
TILE_GET_INFO_MEMBER(get_rumba_tile_info);
DECLARE_VIDEO_START(victnine);
DECLARE_VIDEO_START(rumba);
uint32_t screen_update_victnine(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_rumba(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void victnine_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void flstory_map(address_map &map) ATTR_COLD;
void onna34ro_mcu_map(address_map &map) ATTR_COLD;
void rumba_map(address_map &map) ATTR_COLD;
void sound_map(address_map &map) ATTR_COLD;
void victnine_map(address_map &map) ATTR_COLD;
};
@ -146,32 +162,32 @@ private:
TILE_GET_INFO_MEMBER(flstory_state::get_tile_info)
{
int const code = m_videoram[tile_index * 2];
int const attr = m_videoram[tile_index * 2 + 1];
int const tile_number = code + ((attr & 0xc0) << 2) + 0x400 + 0x800 * m_char_bank;
int const flags = TILE_FLIPYX((attr & 0x18) >> 3);
uint8_t const code = m_videoram[tile_index * 2];
uint8_t const attr = m_videoram[tile_index * 2 + 1];
uint32_t const tile_number = code + ((attr & 0xc0) << 2) + 0x400 + 0x800 * m_char_bank;
uint8_t const flags = TILE_FLIPYX((attr & 0x18) >> 3);
tileinfo.category = BIT(attr, 5);
tileinfo.group = BIT(attr, 5);
tileinfo.set(0, tile_number, attr & 0x0f, flags);
}
TILE_GET_INFO_MEMBER(flstory_state::victnine_get_tile_info)
TILE_GET_INFO_MEMBER(flstory_mcu_state::victnine_get_tile_info)
{
int const code = m_videoram[tile_index * 2];
int const attr = m_videoram[tile_index * 2 + 1];
int const tile_number = ((attr & 0x38) << 5) + code;
int const flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0);
uint8_t const code = m_videoram[tile_index * 2];
uint8_t const attr = m_videoram[tile_index * 2 + 1];
uint32_t const tile_number = ((attr & 0x38) << 5) + code;
uint8_t const flags = (BIT(attr, 6) ? TILE_FLIPX : 0) | (BIT(attr, 7) ? TILE_FLIPY : 0);
tileinfo.set(0, tile_number, attr & 0x07, flags);
}
TILE_GET_INFO_MEMBER(flstory_state::get_rumba_tile_info)
TILE_GET_INFO_MEMBER(flstory_mcu_state::get_rumba_tile_info)
{
int const code = m_videoram[tile_index * 2];
int const attr = m_videoram[tile_index * 2 + 1];
int const tile_number = code + ((attr & 0xc0) << 2) + 0x400 + 0x800 * m_char_bank;
int const col = (attr & 0x0f);
uint8_t const code = m_videoram[tile_index * 2];
uint8_t const attr = m_videoram[tile_index * 2 + 1];
uint32_t const tile_number = code + ((attr & 0xc0) << 2) + 0x400 + 0x800 * m_char_bank;
uint32_t const col = (attr & 0x0f);
tileinfo.category = BIT(attr, 5);
tileinfo.group = BIT(attr, 5);
@ -195,9 +211,9 @@ VIDEO_START_MEMBER(flstory_state,flstory)
save_pointer(NAME(m_paletteram_ext), m_palette->entries());
}
VIDEO_START_MEMBER(flstory_state,rumba)
VIDEO_START_MEMBER(flstory_mcu_state,rumba)
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(flstory_state::get_rumba_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(flstory_mcu_state::get_rumba_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
// m_bg_tilemap->set_transparent_pen(15);
m_bg_tilemap->set_transmask(0, 0x3fff, 0xc000); /* split type 0 has pens 0-13 transparent in front half */
m_bg_tilemap->set_transmask(1, 0x8000, 0x7fff); /* split type 1 has pen 15 transparent in front half */
@ -212,9 +228,9 @@ VIDEO_START_MEMBER(flstory_state,rumba)
save_pointer(NAME(m_paletteram_ext), m_palette->entries());
}
VIDEO_START_MEMBER(flstory_state,victnine)
VIDEO_START_MEMBER(flstory_mcu_state,victnine)
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(flstory_state::victnine_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(flstory_mcu_state::victnine_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scroll_cols(32);
m_paletteram = make_unique_clear<uint8_t []>(m_palette->entries());
@ -252,7 +268,7 @@ void flstory_state::flstory_gfxctrl_w(uint8_t data)
{
m_gfxctrl = data;
flip_screen_set(~data & 0x01);
flip_screen_set(BIT(~data, 0));
if (m_char_bank != ((data & 0x10) >> 4))
{
m_char_bank = (data & 0x10) >> 4;
@ -261,19 +277,19 @@ void flstory_state::flstory_gfxctrl_w(uint8_t data)
m_palette_bank = (data & 0x20) >> 5;
}
uint8_t flstory_state::victnine_gfxctrl_r()
uint8_t flstory_mcu_state::victnine_gfxctrl_r()
{
return m_gfxctrl;
}
void flstory_state::victnine_gfxctrl_w(uint8_t data)
void flstory_mcu_state::victnine_gfxctrl_w(uint8_t data)
{
m_gfxctrl = data;
m_palette_bank = (data & 0x20) >> 5;
if (data & 0x04)
flip_screen_set(data & 0x01);
if (BIT(data, 2))
flip_screen_set(BIT(data, 0));
}
void flstory_state::flstory_scrlram_w(offs_t offset, uint8_t data)
@ -283,117 +299,116 @@ void flstory_state::flstory_scrlram_w(offs_t offset, uint8_t data)
}
void flstory_state::flstory_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, int pri )
void flstory_state::flstory_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int flip = flip_screen();
bool const flip = flip_screen();
for (int i = 0; i < 0x20; i++)
for (int i = 0x1f; i >= 0; i--)
{
int pr = m_spriteram[m_spriteram.bytes() - 1 - i];
int offs = (pr & 0x1f) * 4;
uint8_t const pr = m_spriteram[m_spriteram.bytes() - 1 - i];
uint32_t const offs = (pr & 0x1f) * 4;
if ((pr & 0x80) == pri)
uint32_t const pri_mask = BIT(pr, 7) ? GFX_PMASK_8 : (GFX_PMASK_8 | GFX_PMASK_4);
uint32_t const code = m_spriteram[offs + 2] + ((m_spriteram[offs + 1] & 0x30) << 4);
int sx = m_spriteram[offs + 3];
int sy = m_spriteram[offs + 0];
bool flipx = BIT(m_spriteram[offs + 1], 6);
bool flipy = BIT(m_spriteram[offs + 1], 7);
if (flip)
{
int code, sx, sy, flipx, flipy;
sx = (240 - sx) & 0xff;
sy = sy - 1;
flipx = !flipx;
flipy = !flipy;
}
else
sy = 240 - sy - 1;
code = m_spriteram[offs + 2] + ((m_spriteram[offs + 1] & 0x30) << 4);
sx = m_spriteram[offs + 3];
sy = m_spriteram[offs + 0];
flipx = ((m_spriteram[offs + 1] & 0x40) >> 6);
flipy = ((m_spriteram[offs + 1] & 0x80) >> 7);
if (flip)
{
sx = (240 - sx) & 0xff ;
sy = sy - 1 ;
flipx = !flipx;
flipy = !flipy;
}
else
sy = 240 - sy - 1 ;
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect,
code,
m_spriteram[offs + 1] & 0x0f,
flipx, flipy,
sx, sy,
screen.priority(), pri_mask, 15);
/* wrap around */
if (sx > 240)
m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect,
code,
m_spriteram[offs + 1] & 0x0f,
flipx,flipy,
sx,sy,15);
/* wrap around */
if (sx > 240)
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code,
m_spriteram[offs + 1] & 0x0f,
flipx,flipy,
sx-256,sy,15);
}
flipx, flipy,
sx-256, sy,
screen.priority(), pri_mask, 15);
}
}
uint32_t flstory_state::screen_update_flstory(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER1, 0);
m_bg_tilemap->draw(screen, bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER1, 0);
flstory_draw_sprites(bitmap, cliprect, 0x00);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER0, 0);
flstory_draw_sprites(bitmap, cliprect, 0x80);
m_bg_tilemap->draw(screen, bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER0, 0);
screen.priority().fill(0, cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER1, 1);
m_bg_tilemap->draw(screen, bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER1, 2);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER0, 4);
m_bg_tilemap->draw(screen, bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER0, 8);
flstory_draw_sprites(screen, bitmap, cliprect);
return 0;
}
void flstory_state::victnine_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
void flstory_mcu_state::victnine_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int flip = flip_screen();
bool const flip = flip_screen();
for (int i = 0; i < 0x20; i++)
{
int pr = m_spriteram[m_spriteram.bytes() - 1 - i];
int offs = (pr & 0x1f) * 4;
uint8_t const pr = m_spriteram[m_spriteram.bytes() - 1 - i];
uint32_t const offs = (pr & 0x1f) * 4;
//if ((pr & 0x80) == pri)
{
int code, sx, sy, flipx, flipy;
uint32_t const code = m_spriteram[offs + 2] + ((m_spriteram[offs + 1] & 0x20) << 3);
int sx = m_spriteram[offs + 3];
int sy = m_spriteram[offs + 0];
code = m_spriteram[offs + 2] + ((m_spriteram[offs + 1] & 0x20) << 3);
sx = m_spriteram[offs + 3];
sy = m_spriteram[offs + 0];
flipx = ((m_spriteram[offs + 1] & 0x40) >> 6);
flipy = ((m_spriteram[offs + 1] & 0x80) >> 7);
bool flipx = BIT(m_spriteram[offs + 1], 6);
bool flipy = BIT(m_spriteram[offs + 1], 7);
if (flip)
{
sx = (240 - sx + 1) & 0xff ;
sy = sy + 1 ;
sx = (240 - sx + 1) & 0xff;
sy = sy + 1;
flipx = !flipx;
flipy = !flipy;
}
else
sy = 240 - sy + 1 ;
sy = 240 - sy + 1;
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect,
code,
m_spriteram[offs + 1] & 0x0f,
flipx,flipy,
sx,sy,15);
flipx, flipy,
sx, sy, 15);
/* wrap around */
if (sx > 240)
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect,
code,
m_spriteram[offs + 1] & 0x0f,
flipx,flipy,
sx-256,sy,15);
flipx, flipy,
sx - 256, sy, 15);
}
}
}
uint32_t flstory_state::screen_update_victnine(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t flstory_mcu_state::screen_update_victnine(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
victnine_draw_sprites(bitmap, cliprect);
return 0;
}
uint32_t flstory_state::screen_update_rumba(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t flstory_mcu_state::screen_update_rumba(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER1, 0);
m_bg_tilemap->draw(screen, bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER1, 0);
@ -415,7 +430,7 @@ void flstory_state::snd_reset_w(uint8_t data)
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 1 ) ? ASSERT_LINE : CLEAR_LINE);
}
uint8_t flstory_state::flstory_mcu_status_r()
uint8_t flstory_mcu_state::flstory_mcu_status_r()
{
// bit 0 = when 1, MCU is ready to receive data from main CPU
// bit 1 = when 1, MCU has sent data to the main CPU
@ -425,7 +440,7 @@ uint8_t flstory_state::flstory_mcu_status_r()
}
uint8_t flstory_state::victnine_mcu_status_r()
uint8_t flstory_mcu_state::victnine_mcu_status_r()
{
uint8_t ret = flstory_mcu_status_r() & 0x03;
ret |= m_extraio1->read() & 0xfc;
@ -464,15 +479,15 @@ void flstory_state::base_map(address_map &map)
map(0xe000, 0xe7ff).mirror(0x1800).ram().share(m_workram);
}
void flstory_state::flstory_map(address_map &map)
void flstory_mcu_state::flstory_map(address_map &map)
{
base_map(map);
map(0xd000, 0xd000).rw(m_bmcu, FUNC(taito68705_mcu_device::data_r), FUNC(taito68705_mcu_device::data_w));
map(0xd805, 0xd805).r(FUNC(flstory_state::flstory_mcu_status_r));
map(0xd805, 0xd805).r(FUNC(flstory_mcu_state::flstory_mcu_status_r));
// map(0xda00, 0xda00).writeonly();
map(0xdcc0, 0xdcff).ram(); // unknown
map(0xdf03, 0xdf03).w(FUNC(flstory_state::flstory_gfxctrl_w));
map(0xdf03, 0xdf03).w(FUNC(flstory_mcu_state::flstory_gfxctrl_w));
}
void flstory_state::onna34ro_map(address_map &map)
@ -485,34 +500,34 @@ void flstory_state::onna34ro_map(address_map &map)
map(0xdf03, 0xdf03).w(FUNC(flstory_state::flstory_gfxctrl_w));
}
void flstory_state::onna34ro_mcu_map(address_map &map)
void flstory_mcu_state::onna34ro_mcu_map(address_map &map)
{
onna34ro_map(map);
map(0xd000, 0xd000).rw(m_bmcu, FUNC(taito68705_mcu_device::data_r), FUNC(taito68705_mcu_device::data_w));
map(0xd805, 0xd805).r(FUNC(flstory_state::flstory_mcu_status_r));
map(0xd805, 0xd805).r(FUNC(flstory_mcu_state::flstory_mcu_status_r));
}
void flstory_state::victnine_map(address_map &map)
void flstory_mcu_state::victnine_map(address_map &map)
{
base_map(map);
map(0xd000, 0xd000).rw(m_bmcu, FUNC(taito68705_mcu_device::data_r), FUNC(taito68705_mcu_device::data_w));
map(0xd805, 0xd805).r(FUNC(flstory_state::victnine_mcu_status_r));
map(0xd805, 0xd805).r(FUNC(flstory_mcu_state::victnine_mcu_status_r));
map(0xd807, 0xd807).portr("EXTRA_P2");
// map(0xda00, 0xda00).writeonly();
map(0xdce0, 0xdce0).rw(FUNC(flstory_state::victnine_gfxctrl_r), FUNC(flstory_state::victnine_gfxctrl_w));
map(0xdce0, 0xdce0).rw(FUNC(flstory_mcu_state::victnine_gfxctrl_r), FUNC(flstory_mcu_state::victnine_gfxctrl_w));
map(0xdce1, 0xdce1).nopw(); // unknown
}
void flstory_state::rumba_map(address_map &map)
void flstory_mcu_state::rumba_map(address_map &map)
{
base_map(map);
map(0xd000, 0xd000).rw(m_bmcu, FUNC(taito68705_mcu_device::data_r), FUNC(taito68705_mcu_device::data_w));
map(0xd805, 0xd805).r(FUNC(flstory_state::flstory_mcu_status_r));
map(0xd805, 0xd805).r(FUNC(flstory_mcu_state::flstory_mcu_status_r));
map(0xd807, 0xd807).portr("EXTRA_P2");
// map(0xda00, 0xda00).writeonly();
map(0xdce0, 0xdce0).rw(FUNC(flstory_state::victnine_gfxctrl_r), FUNC(flstory_state::victnine_gfxctrl_w));
map(0xdce0, 0xdce0).rw(FUNC(flstory_mcu_state::victnine_gfxctrl_r), FUNC(flstory_mcu_state::victnine_gfxctrl_w));
// map(0xdce1, 0xdce1).nopw(); // unknown
}
@ -1083,8 +1098,8 @@ static const gfx_layout spritelayout =
};
static GFXDECODE_START( gfx_flstory )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 )
GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 256, 16 )
GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 16 )
GFXDECODE_ENTRY( "tiles", 0, spritelayout, 256, 16 )
GFXDECODE_END
@ -1147,9 +1162,9 @@ void flstory_state::common(machine_config &config)
SPEAKER(config, "speaker").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set("soundnmi", FUNC(input_merger_device::in_w<0>));
m_soundlatch->data_pending_callback().set(m_soundnmi, FUNC(input_merger_device::in_w<0>));
INPUT_MERGER_ALL_HIGH(config, "soundnmi").output_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
INPUT_MERGER_ALL_HIGH(config, m_soundnmi).output_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
GENERIC_LATCH_8(config, m_soundlatch2);
TA7630(config, m_ta7630);
@ -1176,15 +1191,15 @@ void flstory_state::common(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
}
void flstory_state::flstory(machine_config &config)
void flstory_mcu_state::flstory(machine_config &config)
{
common(config);
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_state::flstory_map);
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_mcu_state::flstory_map);
TAITO68705_MCU(config, m_bmcu, XTAL(18'432'000)/6); // verified on PCB
MCFG_VIDEO_START_OVERRIDE(flstory_state,flstory)
MCFG_VIDEO_START_OVERRIDE(flstory_mcu_state,flstory)
}
void flstory_state::onna34ro(machine_config &config)
@ -1196,46 +1211,46 @@ void flstory_state::onna34ro(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(flstory_state,flstory)
}
void flstory_state::onna34ro_mcu(machine_config &config)
void flstory_mcu_state::onna34ro_mcu(machine_config &config)
{
onna34ro(config);
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_state::onna34ro_mcu_map);
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_mcu_state::onna34ro_mcu_map);
TAITO68705_MCU(config, m_bmcu, XTAL(18'432'000)/6); // ?
}
void flstory_state::victnine(machine_config &config)
void flstory_mcu_state::victnine(machine_config &config)
{
common(config);
// basic machine hardware
m_maincpu->set_clock(XTAL(8'000'000)/2); // 4 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_state::victnine_map);
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_mcu_state::victnine_map);
TAITO68705_MCU(config, m_bmcu, XTAL(18'432'000)/6);
// video hardware
subdevice<screen_device>("screen")->set_screen_update(FUNC(flstory_state::screen_update_victnine));
MCFG_VIDEO_START_OVERRIDE(flstory_state,victnine)
subdevice<screen_device>("screen")->set_screen_update(FUNC(flstory_mcu_state::screen_update_victnine));
MCFG_VIDEO_START_OVERRIDE(flstory_mcu_state,victnine)
// sound hardware
m_ay->reset_routes();
m_ay->add_route(ALL_OUTPUTS, "speaker", 0.5);
}
void flstory_state::rumba(machine_config &config)
void flstory_mcu_state::rumba(machine_config &config)
{
common(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_state::rumba_map);
m_maincpu->set_addrmap(AS_PROGRAM, &flstory_mcu_state::rumba_map);
m_maincpu->set_clock(XTAL(8'000'000) / 2); // verified on PCB
TAITO68705_MCU(config, m_bmcu, XTAL(18'432'000)/6); // ?
// video hardware
subdevice<screen_device>("screen")->set_screen_update(FUNC(flstory_state::screen_update_rumba));
MCFG_VIDEO_START_OVERRIDE(flstory_state,rumba)
subdevice<screen_device>("screen")->set_screen_update(FUNC(flstory_mcu_state::screen_update_rumba));
MCFG_VIDEO_START_OVERRIDE(flstory_mcu_state,rumba)
}
/***************************************************************************
@ -1257,7 +1272,7 @@ ROM_START( flstory )
ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a45-20.mcu", 0x0000, 0x0800, CRC(7d2cdd9b) SHA1(b9a7b4c7d9d58b4b7cab1304beaa9d17f9559419) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
ROM_REGION( 0x20000, "tiles", ROMREGION_INVERT )
ROM_LOAD( "vid-a45.18", 0x00000, 0x4000, CRC(6f08f69e) SHA1(8f1b7e63a38f855cf26d57aed678da7cf1378fdf) )
ROM_LOAD( "vid-a45.06", 0x04000, 0x4000, CRC(dc856a75) SHA1(6eedbf6b027c884502b6e7329f13829787138165) )
ROM_LOAD( "vid-a45.08", 0x08000, 0x4000, CRC(d0b028ca) SHA1(c8bd9136ad3180002961ecfe600fc91a3c891539) )
@ -1281,7 +1296,7 @@ ROM_START( flstoryo )
ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a45-20.mcu", 0x0000, 0x0800, CRC(7d2cdd9b) SHA1(b9a7b4c7d9d58b4b7cab1304beaa9d17f9559419) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
ROM_REGION( 0x20000, "tiles", ROMREGION_INVERT )
ROM_LOAD( "vid-a45.18", 0x00000, 0x4000, CRC(6f08f69e) SHA1(8f1b7e63a38f855cf26d57aed678da7cf1378fdf) )
ROM_LOAD( "vid-a45.06", 0x04000, 0x4000, CRC(dc856a75) SHA1(6eedbf6b027c884502b6e7329f13829787138165) )
ROM_LOAD( "vid-a45.08", 0x08000, 0x4000, CRC(d0b028ca) SHA1(c8bd9136ad3180002961ecfe600fc91a3c891539) )
@ -1313,7 +1328,7 @@ ROM_START( onna34ro )
ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a52_17.54c", 0x0000, 0x0800, CRC(0ab2612e) SHA1(2bc74e9ef5b9dd51d733dc62902d92c269f7d6a7) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
ROM_REGION( 0x20000, "tiles", ROMREGION_INVERT )
ROM_LOAD( "a52-04.11v", 0x00000, 0x4000, CRC(5b126294) SHA1(fc31e062e665f7313f923e84d6497716f0658ac0) )
ROM_LOAD( "a52-06.10v", 0x04000, 0x4000, CRC(78114721) SHA1(d0e52544e05ab4fd1b131ed49beb252048bcbe31) )
ROM_LOAD( "a52-08.09v", 0x08000, 0x4000, CRC(4a293745) SHA1(a54c1cfced63306db0ba7ee635dce41134c91dc8) )
@ -1337,7 +1352,7 @@ ROM_START( onna34roa )
ROM_LOAD( "a52-15.37s", 0x6000, 0x2000, CRC(5afc21d0) SHA1(317d5fb3a48ce5e13e02c5c6431fa08ada115d27) )
ROM_LOAD( "a52-16.38s", 0x8000, 0x2000, CRC(ccf42aee) SHA1(a6eb01c5384724999631b55700dade430b71ca95) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
ROM_REGION( 0x20000, "tiles", ROMREGION_INVERT )
ROM_LOAD( "a52-04.11v", 0x00000, 0x4000, CRC(5b126294) SHA1(fc31e062e665f7313f923e84d6497716f0658ac0) )
ROM_LOAD( "a52-06.10v", 0x04000, 0x4000, CRC(78114721) SHA1(d0e52544e05ab4fd1b131ed49beb252048bcbe31) )
ROM_LOAD( "a52-08.09v", 0x08000, 0x4000, CRC(4a293745) SHA1(a54c1cfced63306db0ba7ee635dce41134c91dc8) )
@ -1452,7 +1467,7 @@ ROM_START( victnine )
ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a16-18.54", 0x0000, 0x0800, BAD_DUMP CRC(5198ef59) SHA1(05bde731ff580984dcf5a66e8465377c6dc03ec0) ) // dumped via m68705 dumper and hand-verified. Might still be imperfect but confirmed working on real PCB.
ROM_REGION( 0x10000, "gfx1", ROMREGION_INVERT )
ROM_REGION( 0x10000, "tiles", ROMREGION_INVERT )
ROM_LOAD( "a16-06-1.7", 0x00000, 0x2000, CRC(b708134d) SHA1(9732be463cfbbe81ea0ad06da5a48b660ca429d0) )
ROM_LOAD( "a16-07-2.8", 0x02000, 0x2000, CRC(cdaf7f83) SHA1(cf83af1655cb3ffce26c1b015b1e2249f7b12e3f) )
ROM_LOAD( "a16-10.90", 0x04000, 0x2000, CRC(e8e42454) SHA1(c4923d4adfc0a48cf5a7d0145de5c9389495cac2) )
@ -1522,7 +1537,7 @@ ROM_START( rumba )
ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a23_11.bin", 0x0000, 0x0800, CRC(fddc99ce) SHA1(a9c7f76752ce74a780ca74004106c969d78ba931) )
ROM_REGION( 0x8000, "gfx1", ROMREGION_INVERT )
ROM_REGION( 0x8000, "tiles", ROMREGION_INVERT )
ROM_LOAD( "a23_07.bin", 0x02000, 0x2000, CRC(c98fbea6) SHA1(edd1e0b2551f726018ca6e0b2cf629046a482711) )
ROM_LOAD( "a23_06.bin", 0x00000, 0x2000, CRC(bf1e3a7f) SHA1(1258be10739cee6e6a8b2ce4d39f89bff1ea7f16) ) // should be a good read
ROM_LOAD( "a23_05.bin", 0x06000, 0x2000, CRC(b40db231) SHA1(85204efc05e95334576807e4dab866f4f40081e6) )
@ -1532,9 +1547,9 @@ ROM_END
} // anonymous namespace
GAME( 1985, flstory, 0, flstory, flstory, flstory_state, empty_init, ROT180, "Taito", "The FairyLand Story", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1985, flstoryo, flstory, flstory, flstory, flstory_state, empty_init, ROT180, "Taito", "The FairyLand Story (earlier)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1985, onna34ro, 0, onna34ro_mcu, onna34ro, flstory_state, empty_init, ROT0, "Taito", "Onna Sanshirou - Typhoon Gal", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1985, onna34roa, onna34ro, onna34ro, onna34ro, flstory_state, empty_init, ROT0, "Taito", "Onna Sanshirou - Typhoon Gal (bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1984, victnine, 0, victnine, victnine, flstory_state, empty_init, ROT0, "Taito", "Victorious Nine", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1984, rumba, 0, rumba, rumba, flstory_state, empty_init, ROT270, "Taito", "Rumba Lumber", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1985, flstory, 0, flstory, flstory, flstory_mcu_state, empty_init, ROT180, "Taito", "The FairyLand Story", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1985, flstoryo, flstory, flstory, flstory, flstory_mcu_state, empty_init, ROT180, "Taito", "The FairyLand Story (earlier)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1985, onna34ro, 0, onna34ro_mcu, onna34ro, flstory_mcu_state, empty_init, ROT0, "Taito", "Onna Sanshirou - Typhoon Gal", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1985, onna34roa, onna34ro, onna34ro, onna34ro, flstory_state, empty_init, ROT0, "Taito", "Onna Sanshirou - Typhoon Gal (bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1984, victnine, 0, victnine, victnine, flstory_mcu_state, empty_init, ROT0, "Taito", "Victorious Nine", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1984, rumba, 0, rumba, rumba, flstory_mcu_state, empty_init, ROT270, "Taito", "Rumba Lumber", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )