Device-fied TC0090LVC for taito_l.cpp implementation (#6572)

* Device-fied TC0090LVC for taito_l.cpp implementation
taito_l.cpp : Use device for TC0090LVC, Reduce duplicates, Fix notes, Implement bitmap layer for cachat
tc009xlvc.cpp : Add TC0090LVC variation, Add notes, Use callback for tilemap offset and external bankswitching, Implement device_reset needs for taito_l.cpp driver, Restrict bitmap and sprite drawing behavior into cliprect
dfruit.cpp, lastbank.cpp : Reduce unnecessary trampolines
dfruit.cpp : Fix offset for gemcrush flipped screen

* use const values for internal getters
This commit is contained in:
cam900 2020-04-23 08:00:11 +09:00 committed by GitHub
parent da608ae1a6
commit 5f8108b3ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 422 additions and 650 deletions

View File

@ -8,6 +8,7 @@
TODO:
- non-video stuff needs to be ported there as well
- Verify difference between TC0090LVC and TC0091LVC
***************************************************************************/
@ -18,11 +19,12 @@
#include "screen.h"
DEFINE_DEVICE_TYPE(TC0091LVC, tc0091lvc_device, "tc009xlvc", "Taito TC0091LVC")
DEFINE_DEVICE_TYPE(TC0090LVC, tc0090lvc_device, "tc0090lvc", "Taito TC0090LVC")
DEFINE_DEVICE_TYPE(TC0091LVC, tc0091lvc_device, "tc0091lvc", "Taito TC0091LVC")
void tc0091lvc_device::vram_w(offs_t offset, u8 data)
void tc0090lvc_device::vram_w(offs_t offset, u8 data)
{
// TODO : offset 0x0000 - 0x3fff is not used?
// TODO: offset 0x0000 - 0x3fff is not used?
m_vram[offset] = data;
gfx(2)->mark_dirty(offset / 32);
@ -41,9 +43,10 @@ void tc0091lvc_device::vram_w(offs_t offset, u8 data)
offset -= 0xa000;
tx_tilemap->mark_tile_dirty(offset/2);
}
// 0xb000-0xb3ff sprites
}
void tc0091lvc_device::vregs_w(offs_t offset, u8 data)
void tc0090lvc_device::vregs_w(offs_t offset, u8 data)
{
if ((offset & 0xfc) == 0)
{
@ -54,7 +57,7 @@ void tc0091lvc_device::vregs_w(offs_t offset, u8 data)
m_vregs[offset] = data;
}
void tc0091lvc_device::ram_bank_w(offs_t offset, u8 data)
void tc0090lvc_device::ram_bank_w(offs_t offset, u8 data)
{
m_ram_bank[offset] = data;
m_bankdev[offset]->set_bank(m_ram_bank[offset]);
@ -82,16 +85,16 @@ static const gfx_layout layout_16x16 =
8*8*4*4
};
GFXDECODE_MEMBER(tc0091lvc_device::gfxinfo)
GFXDECODE_MEMBER(tc0090lvc_device::gfxinfo)
GFXDECODE_DEVICE("gfx", 0, layout_8x8, 0, 16)
GFXDECODE_DEVICE("gfx", 0, layout_16x16, 0, 16)
GFXDECODE_DEVICE_RAM("vram", 0, layout_8x8, 0, 16)
GFXDECODE_END
void tc0091lvc_device::cpu_map(address_map &map)
void tc0090lvc_device::cpu_map(address_map &map)
{
// 0x0000-0x7fff ROM (0x0000-0x5fff Fixed, 0x6000-0x7fff Bankswitched)
map(0x0000, 0x5fff).r(FUNC(tc0091lvc_device::rom_r));
map(0x0000, 0x5fff).r(FUNC(tc0090lvc_device::rom_r));
map(0x6000, 0x7fff).lr8(NAME([this] (offs_t offset) { return rom_r((m_rom_bank << 13) | (offset & 0x1fff)); }));
// 0x8000-0xbfff External mappable area
@ -105,35 +108,63 @@ void tc0091lvc_device::cpu_map(address_map &map)
// 0xfe00-0xffff Internal functions
}
void tc0091lvc_device::banked_map(address_map &map)
void tc0090lvc_device::banked_map(address_map &map)
{
map(0x010000, 0x01ffff).readonly().share("vram");
// note, the way tiles are addressed suggests that 0x0000-0x3fff of this might be usable,
// but we don't map it anywhere, so the first tiles are always blank at the moment.
map(0x014000, 0x01ffff).lw8(NAME([this] (offs_t offset, u8 data) { vram_w(offset + 0x4000, data); }));
map(0x040000, 0x05ffff).ram().share("bitmap_ram");
map(0x080000, 0x0801ff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
map(0x080000, 0x0801ff).ram().mirror(0x00e00).w("palette", FUNC(palette_device::write8)).share("palette");
}
tc0091lvc_device::tc0091lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, TC0091LVC, tag, owner, clock)
tc0090lvc_device::tc0090lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tc0090lvc_device(mconfig, TC0090LVC, tag, owner, clock)
{
}
tc0090lvc_device::tc0090lvc_device(const machine_config &mconfig, device_type &type, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, type, tag, owner, clock)
, device_gfx_interface(mconfig, *this, gfxinfo, "palette")
, m_tilemap_xoffs(0)
, m_tilemap_yoffs(0)
, m_tilemap_flipped_xoffs(0)
, m_tilemap_flipped_yoffs(0)
, m_irq_enable(0)
, m_bankdev(*this, "bankdev_%u", 0U)
, m_vram(*this, "vram")
, m_bitmap_ram(*this, "bitmap_ram")
, m_rom(*this, DEVICE_SELF)
, m_tile_cb(*this)
{
}
tc0091lvc_device::tc0091lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tc0090lvc_device(mconfig, TC0091LVC, tag, owner, clock)
{
}
/*
Scroll Tilemap format (2 bytes per tiles, 64x32 tilemap)
Offset Bits Description
76543210
00 xxxxxxxx Code (bit 0-7)
01 ------xx Code (bit 8-9)
----xx-- Bank select (0x400 code boundary)
xxxx---- Palette select (16 color boundary)
*/
template<unsigned Offset>
TILE_GET_INFO_MEMBER(tc0091lvc_device::get_tile_info)
TILE_GET_INFO_MEMBER(tc0090lvc_device::get_tile_info)
{
const u16 attr = m_vram[Offset + (2 * tile_index) + 1];
const u16 code = m_vram[Offset + (2 * tile_index)]
u32 code = m_vram[Offset + (2 * tile_index)]
| ((attr & 0x03) << 8)
| ((m_vregs[(attr & 0xc) >> 2]) << 10);
// | (state->m_horshoes_gfxbank << 12);
| ((tilebank((attr & 0xc) >> 2)) << 10);
if (!m_tile_cb.isnull())
m_tile_cb(code);
tileinfo.set(0,
code,
@ -141,7 +172,17 @@ TILE_GET_INFO_MEMBER(tc0091lvc_device::get_tile_info)
0);
}
TILE_GET_INFO_MEMBER(tc0091lvc_device::get_tx_tile_info)
/*
Fixed Tilemap format (2 bytes per tiles, 64x32 tilemap)
Offset Bits Description
76543210
00 xxxxxxxx Code (bit 0-7)
01 -----xxx Code (bit 8-10)
xxxx---- Palette select (16 color boundary)
*/
TILE_GET_INFO_MEMBER(tc0090lvc_device::get_tx_tile_info)
{
const u16 attr = m_vram[0xa000 + (2 * tile_index) + 1];
const u16 code = m_vram[0xa000 + (2 * tile_index)]
@ -154,47 +195,51 @@ TILE_GET_INFO_MEMBER(tc0091lvc_device::get_tx_tile_info)
}
void tc0091lvc_device::device_add_mconfig(machine_config &config)
void tc0090lvc_device::device_add_mconfig(machine_config &config)
{
for (int i = 0; i < 4; i++)
{
ADDRESS_MAP_BANK(config, m_bankdev[i]).set_map(&tc0091lvc_device::banked_map).set_options(ENDIANNESS_LITTLE, 8, 20, 0x1000);
ADDRESS_MAP_BANK(config, m_bankdev[i]).set_map(&tc0090lvc_device::banked_map).set_options(ENDIANNESS_LITTLE, 8, 20, 0x1000);
}
PALETTE(config, "palette", palette_device::BLACK).set_format(palette_device::xBGRBBBBGGGGRRRR_bit0, 0x100);
}
void tc0091lvc_device::device_post_load()
void tc0090lvc_device::device_post_load()
{
for (int i = 0; i < 4; i++)
m_bankdev[i]->set_bank(m_ram_bank[i]);
}
void tc0091lvc_device::device_start()
void tc0090lvc_device::device_start()
{
m_tile_cb.resolve();
std::fill_n(&m_vram[0], m_vram.bytes(), 0);
std::fill_n(&m_bitmap_ram[0], m_bitmap_ram.bytes(), 0);
std::fill(std::begin(m_ram_bank), std::end(m_ram_bank), 0);
for (int i = 0; i < 4; i++)
m_bankdev[i]->set_bank(m_ram_bank[i]);
m_rom_bank = 0;
m_vregs = make_unique_clear<u8[]>(0x100);
m_sprram_buffer = make_unique_clear<u8[]>(0x400);
tx_tilemap = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(tc0091lvc_device::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
bg_tilemap[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(tc0091lvc_device::get_tile_info<0x8000>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
bg_tilemap[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(tc0091lvc_device::get_tile_info<0x9000>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
tx_tilemap = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(tc0090lvc_device::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
bg_tilemap[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(tc0090lvc_device::get_tile_info<0x8000>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
bg_tilemap[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(tc0090lvc_device::get_tile_info<0x9000>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
tx_tilemap->set_transparent_pen(0);
bg_tilemap[0]->set_transparent_pen(0);
bg_tilemap[1]->set_transparent_pen(0);
tx_tilemap->set_scrolldx(-8, -8);
bg_tilemap[0]->set_scrolldx(28, -11);
bg_tilemap[1]->set_scrolldx(38, -21);
tx_tilemap->set_scrolldx((-8) + m_tilemap_xoffs, (-8) + m_tilemap_flipped_xoffs);
bg_tilemap[0]->set_scrolldx(28 + m_tilemap_xoffs, (-11) + m_tilemap_flipped_xoffs);
bg_tilemap[1]->set_scrolldx(38 + m_tilemap_xoffs, (-21) + m_tilemap_flipped_xoffs);
tx_tilemap->set_scrolldy(m_tilemap_yoffs, m_tilemap_flipped_yoffs);
bg_tilemap[0]->set_scrolldy(m_tilemap_yoffs, m_tilemap_flipped_yoffs);
bg_tilemap[1]->set_scrolldy(m_tilemap_yoffs, m_tilemap_flipped_yoffs);
save_item(NAME(m_irq_vector));
save_item(NAME(m_irq_enable));
@ -204,21 +249,74 @@ void tc0091lvc_device::device_start()
save_pointer(NAME(m_sprram_buffer), 0x400);
}
void tc0090lvc_device::device_reset()
{
// needs for taito_l.cpp
for (int i = 0; i < 3; i++)
m_irq_vector[i] = 0;
void tc0091lvc_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u8 global_flip)
m_irq_enable = 0;
for (int i = 0; i < 4; i++)
{
m_ram_bank[i] = 0x80;
m_bankdev[i]->set_bank(m_ram_bank[i]);
}
m_rom_bank = 0;
/* video related */
m_vregs[0] = m_vregs[1] = m_vregs[2] = m_vregs[3] = m_vregs[4] = 0;
}
void tc0090lvc_device::mark_all_layer_dirty()
{
tx_tilemap->mark_all_dirty();
bg_tilemap[0]->mark_all_dirty();
bg_tilemap[1]->mark_all_dirty();
}
/*
Sprite format (8 bytes per sprites, max 125 entries (0x3e8 bytes))
Offset Bits Description
76543210
00 xxxxxxxx Code (bit 0-7)
01 xxxxxxxx Code (bit 8-15)
02 ----xxxx Palette select (16 color boundary)
03 ------x- Flip Y
-------x Flip X
04 xxxxxxxx X position (bit 0-7)
05 -------x X position (bit 8, unsigned)
06 xxxxxxxx Y position (unsigned)
07 xxxxxxxx unknown / ignored? Seems just garbage in many cases, e.g
plgirs2 bullets and raimais big bosses.
*/
void tc0090lvc_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int count = 0; count < 0x3e7; count += 8)
{
const u32 code = m_sprram_buffer[count + 0] | (m_sprram_buffer[count + 1] << 8);
int x = m_sprram_buffer[count + 4] | (m_sprram_buffer[count + 5] << 8);
if (x >= 320)
u32 code = m_sprram_buffer[count + 0] | (m_sprram_buffer[count + 1] << 8);
int x = m_sprram_buffer[count + 4] | ((m_sprram_buffer[count + 5] & 1) << 8);
if (x >= cliprect.max_x)
x -= 512;
int y = m_sprram_buffer[count + 6];
const u32 col = (m_sprram_buffer[count + 2]) & 0x0f;
if (y >= cliprect.max_y)
y -= 256;
const u32 col = m_sprram_buffer[count + 2] & 0x0f;
int fx = m_sprram_buffer[count + 3] & 0x1;
int fy = m_sprram_buffer[count + 3] & 0x2;
if (global_flip)
if (!m_tile_cb.isnull())
{
// each sprite is 4 8x8 tile group, actually tile number for each tile is << 2 of real address
code <<= 2;
m_tile_cb(code);
code >>= 2;
}
if (global_flip())
{
x = 304 - x;
y = 240 - y;
@ -230,70 +328,125 @@ void tc0091lvc_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,
}
}
u32 tc0091lvc_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 tc0090lvc_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(palette().black_pen(), cliprect);
if ((m_vregs[4] & 0x20) == 0)
return 0;
const u8 global_flip = m_vregs[4] & 0x10;
if ((m_vregs[4] & 0x7) == 7) // 8bpp bitmap enabled
if (!screen_enable())
{
u32 count = 0;
for (int y = 0; y < 256; y++)
bitmap.fill(palette().black_pen(), cliprect);
return 0;
}
if (bitmap_mode()) // 8bpp bitmap enabled
{
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
for (int x = 0; x < 512; x++)
const int res_y = (global_flip()) ? 256 - y : y;
u32 count = (res_y & 0xff) * 512;
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
const int res_x = (global_flip) ? 320 - x : x;
const int res_y = (global_flip) ? 256 - y : y;
const int res_x = (global_flip()) ? 320 - x : x;
if (cliprect.contains(res_x, res_y))
bitmap.pix16(res_y, res_x) = palette().pen(m_bitmap_ram[count]);
count++;
bitmap.pix16(y, x) = palette().pen(m_bitmap_ram[count + (res_x & 0x1ff)]);
}
}
}
else
{
machine().tilemap().set_flip_all(global_flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
update_scroll(&m_vram[0xb000]); // TODO: not buffered?
machine().tilemap().set_flip_all(global_flip() ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
int dx = m_bg_scroll[0][0] | (m_bg_scroll[0][1] << 8);
if (global_flip) { dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; dx += 192; }
if (global_flip()) { dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; }
int dy = m_bg_scroll[0][2];
bg_tilemap[0]->set_scrollx(0, -dx);
bg_tilemap[0]->set_scrolly(0, -dy);
dx = m_bg_scroll[1][0] | (m_bg_scroll[1][1] << 8);
if (global_flip) { dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; dx += 192; }
if (global_flip()) { dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; }
dy = m_bg_scroll[1][2];
bg_tilemap[1]->set_scrollx(0, -dx);
bg_tilemap[1]->set_scrolly(0, -dy);
tx_tilemap->set_scrollx(0, (global_flip) ? -192 : 0);
screen.priority().fill(0, cliprect);
bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0);
bg_tilemap[0]->draw(screen, bitmap, cliprect, 0, (m_vregs[4] & 0x8) ? 0 : 1);
draw_sprites(screen, bitmap, cliprect, global_flip);
bg_tilemap[1]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); // TODO: opaque?
bg_tilemap[0]->draw(screen, bitmap, cliprect, 0, (bg0_pri()) ? 0 : 1);
draw_sprites(screen, bitmap, cliprect);
tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
}
return 0;
}
void tc0091lvc_device::screen_eof(void)
u32 tc0091lvc_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(palette().black_pen(), cliprect);
if (!screen_enable())
return 0;
if (bitmap_mode()) // 8bpp bitmap enabled
{
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
const int res_y = (global_flip()) ? 256 - y : y;
u32 count = (res_y & 0xff) * 512;
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
const int res_x = (global_flip()) ? 320 - x : x;
bitmap.pix16(y, x) = palette().pen(m_bitmap_ram[count + (res_x & 0x1ff)]);
}
}
}
else
{
machine().tilemap().set_flip_all(global_flip() ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
int dx = m_bg_scroll[0][0] | (m_bg_scroll[0][1] << 8);
if (global_flip()) { dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; }
int dy = m_bg_scroll[0][2];
bg_tilemap[0]->set_scrollx(0, -dx);
bg_tilemap[0]->set_scrolly(0, -dy);
dx = m_bg_scroll[1][0] | (m_bg_scroll[1][1] << 8);
if (global_flip()) { dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; }
dy = m_bg_scroll[1][2];
bg_tilemap[1]->set_scrollx(0, -dx);
bg_tilemap[1]->set_scrolly(0, -dy);
screen.priority().fill(0, cliprect);
bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); // not opaque?
bg_tilemap[0]->draw(screen, bitmap, cliprect, 0, (bg0_pri()) ? 0 : 1);
draw_sprites(screen, bitmap, cliprect);
tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
}
return 0;
}
void tc0090lvc_device::screen_eof()
{
std::copy_n(&m_vram[0xb000], 0x400, &m_sprram_buffer[0]);
m_bg_scroll[0][0] = m_sprram_buffer[0x3f4];
m_bg_scroll[0][1] = m_sprram_buffer[0x3f5];
m_bg_scroll[0][2] = m_sprram_buffer[0x3f6];
m_bg_scroll[1][0] = m_sprram_buffer[0x3fc];
m_bg_scroll[1][1] = m_sprram_buffer[0x3fd];
m_bg_scroll[1][2] = m_sprram_buffer[0x3fe];
}
void tc0091lvc_device::screen_eof()
{
tc0090lvc_device::screen_eof();
update_scroll(m_sprram_buffer.get()); // buffered in TC0091LVC?
}
void tc0090lvc_device::update_scroll(u8 *ram)
{
m_bg_scroll[0][0] = ram[0x3f4];
m_bg_scroll[0][1] = ram[0x3f5];
m_bg_scroll[0][2] = ram[0x3f6];
m_bg_scroll[1][0] = ram[0x3fc];
m_bg_scroll[1][1] = ram[0x3fd];
m_bg_scroll[1][2] = ram[0x3fe];
}

View File

@ -2,7 +2,7 @@
// copyright-holders:Angelo Salese
/***************************************************************************
TC0091LVC device
TC009xLVC device
***************************************************************************/
@ -14,10 +14,17 @@
#include "machine/bankdev.h"
#include "tilemap.h"
class tc0091lvc_device : public device_t, public device_gfx_interface
class tc0090lvc_device : public device_t, public device_gfx_interface
{
public:
tc0091lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
typedef device_delegate<void (u32 &code)> tc009xlvc_cb_delegate;
tc0090lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// configuration
template <typename... T> void set_tile_callback(T &&... args) { m_tile_cb.set(std::forward<T>(args)...); }
void set_tilemap_xoffs(int xoffs, int flipped_xoffs) { m_tilemap_xoffs = xoffs; m_tilemap_flipped_xoffs = flipped_xoffs; }
void set_tilemap_yoffs(int yoffs, int flipped_yoffs) { m_tilemap_yoffs = yoffs; m_tilemap_flipped_yoffs = flipped_yoffs; }
// memory handlers
u8 rom_r(offs_t offset) { return m_rom[offset & m_rom.mask()]; }
@ -38,18 +45,24 @@ public:
u8 irq_vector(offs_t offset) { return m_irq_vector[offset]; }
u8 irq_enable() { return m_irq_enable; }
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void screen_eof();
// tilemap handlers
void mark_all_layer_dirty();
virtual u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void screen_eof();
void cpu_map(address_map &map);
protected:
tc0090lvc_device(const machine_config &mconfig, device_type &type, const char *tag, device_t *owner, u32 clock);
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_post_load() override;
virtual void device_start() override;
virtual void device_reset() override;
private:
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u8 global_flip);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void update_scroll(u8 *ram);
void vram_w(offs_t offset, u8 data);
@ -65,6 +78,17 @@ private:
DECLARE_GFXDECODE_MEMBER(gfxinfo);
int m_tilemap_xoffs, m_tilemap_yoffs;
int m_tilemap_flipped_xoffs, m_tilemap_flipped_yoffs;
u32 tilebank(u8 slot) const { return m_vregs[slot & 3]; }
// other bits unknown
bool screen_enable() const { return BIT(m_vregs[4], 5); }
bool global_flip() const { return BIT(m_vregs[4], 4); }
bool bg0_pri() const { return BIT(m_vregs[4], 3); }
bool bitmap_mode() const { return (m_vregs[4] & 0x7) == 7; }
u8 m_irq_vector[3];
u8 m_irq_enable;
u8 m_ram_bank[4];
@ -76,8 +100,20 @@ private:
required_shared_ptr<u8> m_vram;
required_shared_ptr<u8> m_bitmap_ram;
required_region_ptr<u8> m_rom;
tc009xlvc_cb_delegate m_tile_cb;
};
class tc0091lvc_device : public tc0090lvc_device
{
public:
tc0091lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
virtual void screen_eof() override;
};
DECLARE_DEVICE_TYPE(TC0090LVC, tc0090lvc_device)
DECLARE_DEVICE_TYPE(TC0091LVC, tc0091lvc_device)
#endif // MAME_MACHINE_TC009XLVC_H

View File

@ -43,8 +43,6 @@ private:
required_device<cpu_device> m_maincpu;
required_device<tc0091lvc_device> m_vdp;
virtual void video_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
DECLARE_WRITE8_MEMBER(output_w);
@ -54,19 +52,6 @@ private:
void tc0091lvc_map(address_map &map);
};
void dfruit_state::video_start()
{
}
uint32_t dfruit_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(0, cliprect);
m_vdp->screen_update(screen, bitmap, cliprect);
return 0;
}
WRITE_LINE_MEMBER(dfruit_state::screen_vblank)
{
if (state)
@ -314,7 +299,7 @@ void dfruit_state::dfruit(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 32*8);
screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(dfruit_state::screen_update));
screen.set_screen_update("tc0091lvc", FUNC(tc0091lvc_device::screen_update));
screen.screen_vblank().set(FUNC(dfruit_state::screen_vblank));
screen.set_palette("tc0091lvc:palette");

View File

@ -54,7 +54,6 @@ private:
required_device<es8712_device> m_essnd;
virtual void machine_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
uint8_t m_mux_data;
@ -79,15 +78,6 @@ void lastbank_state::machine_start()
save_item(NAME(m_sound_flags));
}
uint32_t lastbank_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(0, cliprect);
m_vdp->screen_update(screen, bitmap, cliprect);
return 0;
}
WRITE_LINE_MEMBER(lastbank_state::screen_vblank)
{
if (state)
@ -424,11 +414,12 @@ void lastbank_state::lastbank(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
screen.set_size(64*8, 32*8);
screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(lastbank_state::screen_update));
screen.set_screen_update("tc0091lvc", FUNC(tc0091lvc_device::screen_update));
screen.screen_vblank().set(FUNC(lastbank_state::screen_vblank));
screen.set_palette("tc0091lvc:palette");
TC0091LVC(config, m_vdp, 0);
m_vdp->set_tilemap_xoffs(0,192); // TODO: correct?
// MCFG_VIDEO_START_OVERRIDE(lastbank_state,lastbank)

View File

@ -76,20 +76,8 @@ puzznici note
void taitol_state::state_register()
{
m_main_bnk->configure_entries(0, m_main_prg->bytes()/0x2000, m_main_prg->base(), 0x2000);
save_item(NAME(m_irq_adr_table));
save_item(NAME(m_irq_enable));
save_item(NAME(m_cur_rambank));
save_item(NAME(m_cur_rombank));
save_item(NAME(m_last_irq_level));
save_item(NAME(m_high));
save_item(NAME(m_bankc));
save_item(NAME(m_horshoes_gfxbank));
save_item(NAME(m_cur_ctrl));
save_item(NAME(m_flipscreen));
save_item(NAME(m_main_high));
}
void taitol_2cpu_state::state_register()
@ -105,8 +93,8 @@ void fhawk_state::state_register()
m_slave_bnk->configure_entries(0, m_slave_prg->bytes()/0x4000, m_slave_prg->base(), 0x4000);
taitol_2cpu_state::state_register();
save_item(NAME(m_cur_rombank2));
save_item(NAME(m_high2));
save_item(NAME(m_slave_rombank));
save_item(NAME(m_slave_high));
}
void champwr_state::state_register()
@ -130,28 +118,8 @@ MACHINE_START_MEMBER(taitol_state, taito_l)
void taitol_state::taito_machine_reset()
{
for (int i = 0; i < 3; i++)
m_irq_adr_table[i] = 0;
m_irq_enable = 0;
for (int i = 0; i < 4; i++)
{
m_cur_rambank[i] = 0x80;
m_ram_bnks[i]->set_bank(m_cur_rambank[i]);
}
m_cur_rombank = 0;
m_main_bnk->set_entry(0);
m_last_irq_level = 0;
m_high = 0;
/* video related */
m_bankc[0] = m_bankc[1] = m_bankc[2] = m_bankc[3] = 0;
m_horshoes_gfxbank = 0;
m_cur_ctrl = 0;
m_flipscreen = 0;
m_main_high = 0;
}
void taitol_2cpu_state::taito_machine_reset()
@ -163,10 +131,10 @@ void fhawk_state::taito_machine_reset()
{
taitol_2cpu_state::taito_machine_reset();
m_cur_rombank2 = 0;
m_slave_bnk->set_entry(m_cur_rombank2);
m_slave_rombank = 0;
m_slave_bnk->set_entry(m_slave_rombank);
m_high2 = 0;
m_slave_high = 0;
m_audio_bnk->set_entry(1);
}
@ -193,7 +161,7 @@ MACHINE_RESET_MEMBER(taitol_state, taito_l)
IRQ_CALLBACK_MEMBER(taitol_state::irq_callback)
{
m_main_cpu->set_input_line(0, CLEAR_LINE);
return m_irq_adr_table[m_last_irq_level];
return m_vdp->irq_vector(m_last_irq_level);
}
TIMER_DEVICE_CALLBACK_MEMBER(taitol_state::vbl_interrupt)
@ -206,107 +174,71 @@ TIMER_DEVICE_CALLBACK_MEMBER(taitol_state::vbl_interrupt)
// What is really generating interrupts 0 and 1 is still to be found
if (scanline == 120 && (m_irq_enable & 1))
if (scanline == 120 && (m_vdp->irq_enable() & 1))
{
m_last_irq_level = 0;
m_main_cpu->set_input_line(0, ASSERT_LINE);
}
else if (scanline == 0 && (m_irq_enable & 2))
else if (scanline == 0 && (m_vdp->irq_enable() & 2))
{
m_last_irq_level = 1;
m_main_cpu->set_input_line(0, ASSERT_LINE);
}
else if (scanline == 240 && (m_irq_enable & 4))
else if (scanline == 240 && (m_vdp->irq_enable() & 4))
{
m_last_irq_level = 2;
m_main_cpu->set_input_line(0, ASSERT_LINE);
}
}
WRITE8_MEMBER(taitol_state::irq_adr_w)
{
//logerror("irq_adr_table[%d] = %02x\n", offset, data);
m_irq_adr_table[offset] = data;
}
READ8_MEMBER(taitol_state::irq_adr_r)
{
return m_irq_adr_table[offset];
}
WRITE8_MEMBER(taitol_state::irq_enable_w)
{
//logerror("irq_enable = %02x\n",data);
m_irq_enable = data;
m_vdp->irq_enable_w(data);
// fix Plotting test mode
if ((m_irq_enable & (1 << m_last_irq_level)) == 0)
if ((m_vdp->irq_enable() & (1 << m_last_irq_level)) == 0)
m_main_cpu->set_input_line(0, CLEAR_LINE);
}
READ8_MEMBER(taitol_state::irq_enable_r)
{
return m_irq_enable;
}
WRITE8_MEMBER(taitol_state::rombankswitch_w)
{
if (m_cur_rombank != data)
if (m_vdp->rom_bank_r() != data)
{
if (data > m_high)
if (data > m_main_high)
{
m_high = data;
logerror("New rom size : %x\n", (m_high + 1) * 0x2000);
m_main_high = data;
logerror("New rom size : %x\n", (m_main_high + 1) * 0x2000);
}
//logerror("robs %d, %02x (%04x)\n", offset, data, m_main_cpu->pc());
m_cur_rombank = data;
m_main_bnk->set_entry(m_cur_rombank);
m_vdp->rom_bank_w(data);
}
}
WRITE8_MEMBER(fhawk_state::rombank2switch_w)
WRITE8_MEMBER(fhawk_state::slave_rombank_w)
{
data &= 0xf;
if (m_cur_rombank2 != data)
if (m_slave_rombank != data)
{
if (data > m_high2)
if (data > m_slave_high)
{
m_high2 = data;
logerror("New rom2 size : %x\n", (m_high2 + 1) * 0x4000);
m_slave_high = data;
logerror("New rom2 size : %x\n", (m_slave_high + 1) * 0x4000);
}
//logerror("robs2 %02x (%04x)\n", data, m_main_cpu->pc());
m_cur_rombank2 = data;
m_slave_bnk->set_entry(m_cur_rombank2);
m_slave_rombank = data;
m_slave_bnk->set_entry(m_slave_rombank);
}
}
READ8_MEMBER(taitol_state::rombankswitch_r)
READ8_MEMBER(fhawk_state::slave_rombank_r)
{
return m_cur_rombank;
}
READ8_MEMBER(fhawk_state::rombank2switch_r)
{
return m_cur_rombank2;
}
WRITE8_MEMBER(taitol_state::rambankswitch_w)
{
if (m_cur_rambank[offset] != data)
{
m_cur_rambank[offset] = data;
m_ram_bnks[offset]->set_bank(m_cur_rambank[offset]);
}
}
READ8_MEMBER(taitol_state::rambankswitch_r)
{
return m_cur_rambank[offset];
return m_slave_rombank;
}
WRITE8_MEMBER(taitol_state::coin_control_w)
@ -379,28 +311,14 @@ WRITE8_MEMBER(champwr_state::msm5205_volume_w)
void taitol_state::common_banks_map(address_map &map)
{
map(0x0000, 0x5fff).rom();
map(0x6000, 0x7fff).bankr("mainbank");
map(0xc000, 0xcfff).m("rambank1", FUNC(address_map_bank_device::amap8));
map(0xd000, 0xdfff).m("rambank2", FUNC(address_map_bank_device::amap8));
map(0xe000, 0xefff).m("rambank3", FUNC(address_map_bank_device::amap8));
map(0xf000, 0xfdff).m("rambank4", FUNC(address_map_bank_device::amap8));
map(0xfe00, 0xfe03).rw(FUNC(taitol_state::taitol_bankc_r), FUNC(taitol_state::taitol_bankc_w));
map(0xfe04, 0xfe04).rw(FUNC(taitol_state::taitol_control_r), FUNC(taitol_state::taitol_control_w));
map(0xff00, 0xff02).rw(FUNC(taitol_state::irq_adr_r), FUNC(taitol_state::irq_adr_w));
map(0xff03, 0xff03).rw(FUNC(taitol_state::irq_enable_r), FUNC(taitol_state::irq_enable_w));
map(0xff04, 0xff07).rw(FUNC(taitol_state::rambankswitch_r), FUNC(taitol_state::rambankswitch_w));
map(0xff08, 0xff08).rw(FUNC(taitol_state::rombankswitch_r), FUNC(taitol_state::rombankswitch_w));
map(0x0000, 0xfdff).m(m_vdp, FUNC(tc0090lvc_device::cpu_map));
map(0xfe00, 0xfeff).rw(m_vdp, FUNC(tc0090lvc_device::vregs_r), FUNC(tc0090lvc_device::vregs_w));
map(0xff00, 0xff02).rw(m_vdp, FUNC(tc0090lvc_device::irq_vector_r), FUNC(tc0090lvc_device::irq_vector_w));
map(0xff03, 0xff03).r(m_vdp, FUNC(tc0090lvc_device::irq_enable_r)).w(FUNC(taitol_state::irq_enable_w));
map(0xff04, 0xff07).rw(m_vdp, FUNC(tc0090lvc_device::ram_bank_r), FUNC(tc0090lvc_device::ram_bank_w));
map(0xff08, 0xff08).r(m_vdp, FUNC(tc0090lvc_device::rom_bank_r)).w(FUNC(taitol_state::rombankswitch_w));
}
void taitol_state::tc0090lvc_map(address_map &map)
{
map(0x10000, 0x1ffff).ram().w(FUNC(taitol_state::vram_w)).share("vram");
map(0x80000, 0x801ff).mirror(0x00e00).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
}
void fhawk_state::fhawk_map(address_map &map)
{
common_banks_map(map);
@ -412,7 +330,7 @@ void fhawk_state::fhawk_2_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("slavebank");
map(0xc000, 0xc000).w(FUNC(fhawk_state::rombank2switch_w));
map(0xc000, 0xc000).w(FUNC(fhawk_state::slave_rombank_w));
map(0xc800, 0xc800).nopr().w("ciu", FUNC(pc060ha_device::master_port_w));
map(0xc801, 0xc801).rw("ciu", FUNC(pc060ha_device::master_comm_r), FUNC(pc060ha_device::master_comm_w));
map(0xd000, 0xd007).rw("tc0220ioc", FUNC(tc0220ioc_device::read), FUNC(tc0220ioc_device::write));
@ -485,7 +403,7 @@ void champwr_state::champwr_2_map(address_map &map)
map(0xe008, 0xe00f).nopr();
map(0xe800, 0xe800).nopr().w("ciu", FUNC(pc060ha_device::master_port_w));
map(0xe801, 0xe801).rw("ciu", FUNC(pc060ha_device::master_comm_r), FUNC(pc060ha_device::master_comm_w));
map(0xf000, 0xf000).rw(FUNC(champwr_state::rombank2switch_r), FUNC(champwr_state::rombank2switch_w));
map(0xf000, 0xf000).rw(FUNC(champwr_state::slave_rombank_r), FUNC(champwr_state::slave_rombank_w));
}
void champwr_state::champwr_3_map(address_map &map)
@ -563,19 +481,14 @@ void taitol_1cpu_state::palamed_map(address_map &map)
map(0xa000, 0xa003).rw(m_ymsnd, FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0xa800, 0xa803).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xb000, 0xb000).nopw(); // Control register, function unknown (copy of 8822)
map(0xb001, 0xb001).nopr(); // Watchdog or interrupt ack
map(0xb001, 0xb001).nopr(); // Watchdog or interrupt ack (value ignored in cachat)
}
void taitol_1cpu_state::cachat_map(address_map &map)
{
common_banks_map(map);
map(0x8000, 0x9fff).ram();
map(0xa000, 0xa003).rw(m_ymsnd, FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0xa800, 0xa803).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xb000, 0xb000).nopw(); // Control register, function unknown
map(0xb001, 0xb001).nopr(); // Watchdog or interrupt ack (value ignored)
map(0xfff8, 0xfff8).rw(FUNC(taitol_1cpu_state::rombankswitch_r), FUNC(taitol_1cpu_state::rombankswitch_w));
palamed_map(map);
map(0xfff8, 0xfff8).r(m_vdp, FUNC(tc0090lvc_device::rom_bank_r)).w(FUNC(taitol_1cpu_state::rombankswitch_w));
}
@ -1397,55 +1310,6 @@ static INPUT_PORTS_START( evilston )
INPUT_PORTS_END
static const gfx_layout bg2_layout =
{
8, 8,
RGN_FRAC(1,1),
4,
{ 8, 12, 0, 4 },
{ 3, 2, 1, 0, 19, 18, 17, 16 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
8*8*4
};
#define O 8*8*4
#define O2 2*O
static const gfx_layout sp2_layout =
{
16, 16,
RGN_FRAC(1,1),
4,
{ 8, 12, 0, 4 },
{ 3, 2, 1, 0, 19, 18, 17, 16, O+3, O+2, O+1, O+0, O+19, O+18, O+17, O+16 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, O2+0*32, O2+1*32, O2+2*32, O2+3*32, O2+4*32, O2+5*32, O2+6*32, O2+7*32 },
8*8*4*4
};
#undef O
#undef O2
static const gfx_layout char_layout =
{
8, 8,
0x10000 / (8*4),
4,
{ 8, 12, 0, 4 },
{ 3, 2, 1, 0, 19, 18, 17, 16},
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
8*8*4
};
static GFXDECODE_START( taito_l )
GFXDECODE_ENTRY( "gfx1", 0, bg2_layout, 0, 16 )
GFXDECODE_ENTRY( "gfx1", 0, sp2_layout, 0, 16 )
GFXDECODE_RAM( "vram", 0, char_layout, 0, 16 ) // Ram-based
GFXDECODE_END
WRITE8_MEMBER(fhawk_state::portA_w)
{
m_audio_bnk->set_entry(data & 0x03);
@ -1454,22 +1318,16 @@ WRITE8_MEMBER(fhawk_state::portA_w)
void taitol_state::l_system_video(machine_config &config)
{
for (int bank = 0; bank < 4; bank++)
{
ADDRESS_MAP_BANK(config, m_ram_bnks[bank]).set_map(&taitol_state::tc0090lvc_map).set_options(ENDIANNESS_LITTLE, 8, 20, 0x1000);
}
TC0090LVC(config, m_vdp, 0);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(40*8, 32*8);
screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(taitol_state::screen_update_taitol));
screen.set_screen_update(m_vdp, FUNC(tc0090lvc_device::screen_update));
screen.screen_vblank().set(FUNC(taitol_state::screen_vblank_taitol));
screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, taito_l);
PALETTE(config, m_palette, palette_device::BLACK).set_format(palette_device::xBGRBBBBGGGGRRRR_bit0, 256);
screen.set_palette("tc0090lvc:palette");
TIMER(config, "scantimer").configure_scanline(FUNC(taitol_state::vbl_interrupt), "screen", 0, 1);
}
@ -1682,12 +1540,23 @@ void taitol_1cpu_state::puzznici(machine_config &config)
m_main_cpu->set_addrmap(AS_PROGRAM, &taitol_1cpu_state::puzznici_map);
}
void horshoes_state::machine_start()
{
save_item(NAME(m_horshoes_gfxbank));
}
void horshoes_state::machine_reset()
{
m_horshoes_gfxbank = 0;
}
void horshoes_state::horshoes(machine_config &config)
{
base(config);
add_muxes(config);
m_main_cpu->set_addrmap(AS_PROGRAM, &horshoes_state::horshoes_map);
m_vdp->set_tile_callback(FUNC(horshoes_state::horshoes_tile_cb));
UPD4701A(config, m_upd4701, 0);
m_upd4701->set_portx_tag("AN0");
@ -1714,18 +1583,12 @@ void taitol_1cpu_state::palamed(machine_config &config)
void taitol_1cpu_state::cachat(machine_config &config)
{
plotting(config);
palamed(config);
/* basic machine hardware */
m_main_cpu->set_addrmap(AS_PROGRAM, &taitol_1cpu_state::cachat_map);
i8255_device &ppi(I8255(config, "ppi", 0)); // NEC D70155C
ppi.in_pa_callback().set_ioport("IN0");
ppi.in_pb_callback().set_ioport("IN1");
ppi.in_pc_callback().set_ioport("IN2");
m_ymsnd->port_a_read_callback().set_ioport("DSWA");
m_ymsnd->port_b_read_callback().set_ioport("DSWB");
// NEC D70155C for inputs, instead TMP8255AP-5
}
void taitol_2cpu_state::evilston(machine_config &config)
@ -1770,7 +1633,7 @@ void taitol_2cpu_state::evilston(machine_config &config)
ROM_START( raimais )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "b36-11-1.bin", 0x00000, 0x20000, CRC(f19fb0d5) SHA1(ba7187dfa5b4a08cebf236913a80066dafbbc59f) )
ROM_LOAD( "b36-09.bin", 0x20000, 0x20000, CRC(9c466e43) SHA1(2466a3f1f8124323008c9925f90e9a1d2edf1564) )
@ -1780,7 +1643,7 @@ ROM_START( raimais )
ROM_REGION( 0x10000, "slave", 0 )
ROM_LOAD( "b36-07.bin", 0x00000, 0x10000, CRC(4f3737e6) SHA1(ff5f5d4ca5485441d03c8cb01a6a096941ab02eb) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b36-01.bin", 0x00000, 0x80000, CRC(89355cb2) SHA1(433e929fe8b488af84e88486d9679468a3d9677a) )
ROM_LOAD( "b36-02.bin", 0x80000, 0x80000, CRC(e71da5db) SHA1(aa47ae02c359264c0a1f09ecc583eefd1ef1dfa4) )
@ -1789,7 +1652,7 @@ ROM_START( raimais )
ROM_END
ROM_START( raimaisj )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "b36-08-1.bin", 0x00000, 0x20000, CRC(6cc8f79f) SHA1(17b4903f87e6d5447c8557c2baca1728f86245dc) )
ROM_LOAD( "b36-09.bin", 0x20000, 0x20000, CRC(9c466e43) SHA1(2466a3f1f8124323008c9925f90e9a1d2edf1564) )
@ -1799,7 +1662,7 @@ ROM_START( raimaisj )
ROM_REGION( 0x10000, "slave", 0 )
ROM_LOAD( "b36-07.bin", 0x00000, 0x10000, CRC(4f3737e6) SHA1(ff5f5d4ca5485441d03c8cb01a6a096941ab02eb) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b36-01.bin", 0x00000, 0x80000, CRC(89355cb2) SHA1(433e929fe8b488af84e88486d9679468a3d9677a) )
ROM_LOAD( "b36-02.bin", 0x80000, 0x80000, CRC(e71da5db) SHA1(aa47ae02c359264c0a1f09ecc583eefd1ef1dfa4) )
@ -1808,7 +1671,7 @@ ROM_START( raimaisj )
ROM_END
ROM_START( raimaisjo )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "b36-08.bin", 0x00000, 0x20000, CRC(f40b9178) SHA1(ccf5afcf08cac0d5b2d6ba74abd62d35412f0265) )
ROM_LOAD( "b36-09.bin", 0x20000, 0x20000, CRC(9c466e43) SHA1(2466a3f1f8124323008c9925f90e9a1d2edf1564) )
@ -1818,7 +1681,7 @@ ROM_START( raimaisjo )
ROM_REGION( 0x10000, "slave", 0 )
ROM_LOAD( "b36-07.bin", 0x00000, 0x10000, CRC(4f3737e6) SHA1(ff5f5d4ca5485441d03c8cb01a6a096941ab02eb) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b36-01.bin", 0x00000, 0x80000, CRC(89355cb2) SHA1(433e929fe8b488af84e88486d9679468a3d9677a) )
ROM_LOAD( "b36-02.bin", 0x80000, 0x80000, CRC(e71da5db) SHA1(aa47ae02c359264c0a1f09ecc583eefd1ef1dfa4) )
@ -1827,7 +1690,7 @@ ROM_START( raimaisjo )
ROM_END
ROM_START( fhawk )
ROM_REGION( 0xa0000, "maincpu", 0 )
ROM_REGION( 0xa0000, "tc0090lvc", 0 )
ROM_LOAD( "b70-11.ic3", 0x00000, 0x20000, CRC(7d9f7583) SHA1(d8fa7c66a81fb356fa9c72f377bfc31b1837eafb) )
ROM_LOAD( "b70-03.ic2", 0x20000, 0x80000, CRC(42d5a9b8) SHA1(10714fe95c372cec12376e615a9abe213aff12bc) )
@ -1837,13 +1700,13 @@ ROM_START( fhawk )
ROM_REGION( 0x20000, "slave", 0 )
ROM_LOAD( "b70-08.ic12", 0x00000, 0x20000, CRC(4d795f48) SHA1(58040d8ccbd0572cf6aef6ea9dd646b9338a03a0) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b70-01.ic1", 0x00000, 0x80000, CRC(fcdf67e2) SHA1(08a6a04a45c4adb4f5b4b0b83e90b2e5fe5cb0b1) )
ROM_LOAD( "b70-02.ic2", 0x80000, 0x80000, CRC(35f7172e) SHA1(f257e9db470bb6dcca491b89cb666ef6d2546887) )
ROM_END
ROM_START( fhawkj )
ROM_REGION( 0xa0000, "maincpu", 0 )
ROM_REGION( 0xa0000, "tc0090lvc", 0 )
ROM_LOAD( "b70-07.ic3", 0x00000, 0x20000, CRC(939114af) SHA1(66218536dcb3b34ffa01d3c9c2fee365d91cfe00) )
ROM_LOAD( "b70-03.ic2", 0x20000, 0x80000, CRC(42d5a9b8) SHA1(10714fe95c372cec12376e615a9abe213aff12bc) )
@ -1853,13 +1716,13 @@ ROM_START( fhawkj )
ROM_REGION( 0x20000, "slave", 0 )
ROM_LOAD( "b70-08.ic12", 0x00000, 0x20000, CRC(4d795f48) SHA1(58040d8ccbd0572cf6aef6ea9dd646b9338a03a0) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b70-01.ic1", 0x00000, 0x80000, CRC(fcdf67e2) SHA1(08a6a04a45c4adb4f5b4b0b83e90b2e5fe5cb0b1) )
ROM_LOAD( "b70-02.ic2", 0x80000, 0x80000, CRC(35f7172e) SHA1(f257e9db470bb6dcca491b89cb666ef6d2546887) )
ROM_END
ROM_START( champwr )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "c01-13.rom", 0x00000, 0x20000, CRC(7ef47525) SHA1(79789fa3bcaeb6666c108d2e4b69a1f9341b2f4a) )
ROM_LOAD( "c01-04.rom", 0x20000, 0x20000, CRC(358bd076) SHA1(beb20a09370d05de719dde596eadca8fecb14ce5) )
@ -1869,7 +1732,7 @@ ROM_START( champwr )
ROM_REGION( 0x20000, "slave", 0 )
ROM_LOAD( "c01-07.rom", 0x00000, 0x20000, CRC(5117c98f) SHA1(16b3a443eb113d2591833884a1b0ff297d8c00a4) )
ROM_REGION( 0x180000, "gfx1", 0 )
ROM_REGION( 0x180000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "c01-01.rom", 0x000000, 0x80000, CRC(f302e6e9) SHA1(456b046932c1ee29c890b8e87d417c4bb508c06a) )
ROM_LOAD( "c01-02.rom", 0x080000, 0x80000, CRC(1e0476c4) SHA1(b7922e5196990ad4382f367ec80b5c72e75f9d35) )
ROM_LOAD( "c01-03.rom", 0x100000, 0x80000, CRC(2a142dbc) SHA1(5d0e40ec266d3abcff4237c5c609355c65b4fa33) )
@ -1879,7 +1742,7 @@ ROM_START( champwr )
ROM_END
ROM_START( champwru )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "c01-12.rom", 0x00000, 0x20000, CRC(09f345b3) SHA1(f3f9a7dab0b3f87b6919a7b37cb52245e112cb08) )
ROM_LOAD( "c01-04.rom", 0x20000, 0x20000, CRC(358bd076) SHA1(beb20a09370d05de719dde596eadca8fecb14ce5) )
@ -1889,7 +1752,7 @@ ROM_START( champwru )
ROM_REGION( 0x20000, "slave", 0 )
ROM_LOAD( "c01-07.rom", 0x00000, 0x20000, CRC(5117c98f) SHA1(16b3a443eb113d2591833884a1b0ff297d8c00a4) )
ROM_REGION( 0x180000, "gfx1", 0 )
ROM_REGION( 0x180000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "c01-01.rom", 0x000000, 0x80000, CRC(f302e6e9) SHA1(456b046932c1ee29c890b8e87d417c4bb508c06a) )
ROM_LOAD( "c01-02.rom", 0x080000, 0x80000, CRC(1e0476c4) SHA1(b7922e5196990ad4382f367ec80b5c72e75f9d35) )
ROM_LOAD( "c01-03.rom", 0x100000, 0x80000, CRC(2a142dbc) SHA1(5d0e40ec266d3abcff4237c5c609355c65b4fa33) )
@ -1899,7 +1762,7 @@ ROM_START( champwru )
ROM_END
ROM_START( champwrj )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "c01-06.bin", 0x00000, 0x20000, CRC(90fa1409) SHA1(7904488d567ce5d8705b2d2c8a4b4aae310cc28b) )
ROM_LOAD( "c01-04.rom", 0x20000, 0x20000, CRC(358bd076) SHA1(beb20a09370d05de719dde596eadca8fecb14ce5) )
@ -1909,7 +1772,7 @@ ROM_START( champwrj )
ROM_REGION( 0x20000, "slave", 0 )
ROM_LOAD( "c01-07.rom", 0x00000, 0x20000, CRC(5117c98f) SHA1(16b3a443eb113d2591833884a1b0ff297d8c00a4) )
ROM_REGION( 0x180000, "gfx1", 0 )
ROM_REGION( 0x180000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "c01-01.rom", 0x000000, 0x80000, CRC(f302e6e9) SHA1(456b046932c1ee29c890b8e87d417c4bb508c06a) )
ROM_LOAD( "c01-02.rom", 0x080000, 0x80000, CRC(1e0476c4) SHA1(b7922e5196990ad4382f367ec80b5c72e75f9d35) )
ROM_LOAD( "c01-03.rom", 0x100000, 0x80000, CRC(2a142dbc) SHA1(5d0e40ec266d3abcff4237c5c609355c65b4fa33) )
@ -1920,14 +1783,14 @@ ROM_END
ROM_START( kurikint )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "b42-09.ic2", 0x00000, 0x20000, CRC(e97c4394) SHA1(fdeb15315166f7615d4039d5dc9c28d53cee86f2) )
ROM_LOAD( "b42-06.ic6", 0x20000, 0x20000, CRC(fa15fd65) SHA1(a810d7315878212e4e5344a24addf117ea6baeab) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "b42-07.ic22", 0x00000, 0x10000, CRC(0f2719c0) SHA1(f870335a75f236f0059522f9a577dee7ca3acb2f) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b42-01.ic1", 0x00000, 0x80000, CRC(7d1a1fec) SHA1(28311b07673686c18988400d0254533a454f07f4) )
ROM_LOAD( "b42-02.ic5", 0x80000, 0x80000, CRC(1a52e65c) SHA1(20a1fc4d02b5928fb01444079692e23d178c6297) )
@ -1937,14 +1800,14 @@ ROM_START( kurikint )
ROM_END
ROM_START( kurikintw )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "b42-10.ic2", 0x00000, 0x20000, CRC(87460109) SHA1(78d0726f5d344673828191bf2e56e9741e977350) )
ROM_LOAD( "b42-06.ic6", 0x20000, 0x20000, CRC(fa15fd65) SHA1(a810d7315878212e4e5344a24addf117ea6baeab) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "b42-07.ic22", 0x00000, 0x10000, CRC(0f2719c0) SHA1(f870335a75f236f0059522f9a577dee7ca3acb2f) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b42-01.ic1", 0x00000, 0x80000, CRC(7d1a1fec) SHA1(28311b07673686c18988400d0254533a454f07f4) )
ROM_LOAD( "b42-02.ic5", 0x80000, 0x80000, CRC(1a52e65c) SHA1(20a1fc4d02b5928fb01444079692e23d178c6297) )
@ -1954,14 +1817,14 @@ ROM_START( kurikintw )
ROM_END
ROM_START( kurikintu )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "b42-08.ic2", 0x00000, 0x20000, CRC(7075122e) SHA1(55f5f0cf3b91b7b408f9c05c91f9839c43b49c5f) )
ROM_LOAD( "b42-06.ic6", 0x20000, 0x20000, CRC(fa15fd65) SHA1(a810d7315878212e4e5344a24addf117ea6baeab) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "b42-07.ic22", 0x00000, 0x10000, CRC(0f2719c0) SHA1(f870335a75f236f0059522f9a577dee7ca3acb2f) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b42-01.ic1", 0x00000, 0x80000, CRC(7d1a1fec) SHA1(28311b07673686c18988400d0254533a454f07f4) )
ROM_LOAD( "b42-02.ic5", 0x80000, 0x80000, CRC(1a52e65c) SHA1(20a1fc4d02b5928fb01444079692e23d178c6297) )
@ -1971,14 +1834,14 @@ ROM_START( kurikintu )
ROM_END
ROM_START( kurikintj )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "b42-05.ic2", 0x00000, 0x20000, CRC(077222b8) SHA1(953fb3444f6bb0dbe0323a0fd8fc3067b106a4f6) )
ROM_LOAD( "b42-06.ic6", 0x20000, 0x20000, CRC(fa15fd65) SHA1(a810d7315878212e4e5344a24addf117ea6baeab) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "b42-07.ic22", 0x00000, 0x10000, CRC(0f2719c0) SHA1(f870335a75f236f0059522f9a577dee7ca3acb2f) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "b42-01.ic1", 0x00000, 0x80000, CRC(7d1a1fec) SHA1(28311b07673686c18988400d0254533a454f07f4) )
ROM_LOAD( "b42-02.ic5", 0x80000, 0x80000, CRC(1a52e65c) SHA1(20a1fc4d02b5928fb01444079692e23d178c6297) )
@ -1988,14 +1851,14 @@ ROM_START( kurikintj )
ROM_END
ROM_START( kurikinta )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "kk_ic2.ic2", 0x00000, 0x20000, CRC(908603f2) SHA1(f810f2501458224e9264a984f22547cc8ccc2b0e) )
ROM_LOAD( "kk_ic6.ic6", 0x20000, 0x20000, CRC(a4a957b1) SHA1(bbdb5b71ab613a8c89f7a0300abd85408951dc7e) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "b42-07.ic22", 0x00000, 0x10000, CRC(0f2719c0) SHA1(f870335a75f236f0059522f9a577dee7ca3acb2f) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "kk_1-1l.rom", 0x00000, 0x20000, CRC(df1d4fcd) SHA1(300cad3636ea9648595c3f4bba3ca737f95f7354) )
ROM_LOAD16_BYTE( "kk_2-2l.rom", 0x40000, 0x20000, CRC(fca7f647) SHA1(0571e8fc2eda9f139e81d6d191368fb99764f797) )
ROM_LOAD16_BYTE( "kk_5-3l.rom", 0x80000, 0x20000, CRC(d080fde1) SHA1(e5011cdf35bf5d39f4786e6d60d2b35a79560dfa) )
@ -2055,10 +1918,10 @@ CPU TC0090LVC (All in one Z80 & system controller??)
************************************************************************/
ROM_START( plotting ) /* Likely B96-10 or higher by Taito's rom numbering system, demo mode is 1 player */
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_REGION( 0x10000, "tc0090lvc", 0 )
ROM_LOAD( "ic10", 0x00000, 0x10000, CRC(be240921) SHA1(f29f3a49b563f24aa6e3187ac4da1a8100cb02b5) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "b96-07.ic9", 0x00000, 0x10000, CRC(0713a387) SHA1(0fc1242ce02a56279fa1d5270c905bba7cdcd072) )
ROM_LOAD16_BYTE( "b96-08.ic8", 0x00001, 0x10000, CRC(55b8e294) SHA1(14405638f751adfadb022bf7a0123a3972d4a617) )
@ -2068,10 +1931,10 @@ ROM_END
ROM_START( plottinga ) /* B96-09 or higher by Taito's rom numbering system, demo mode is 2 players */
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_REGION( 0x10000, "tc0090lvc", 0 )
ROM_LOAD( "plot01.ic10", 0x00000, 0x10000, CRC(5b30bc25) SHA1(df8839a90da9e5122d75b6faaf97f59499dbd316) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "b96-02.ic9", 0x00000, 0x10000, CRC(6e0bad2a) SHA1(73996688cd058a2f56f61ea60144b9c673919a58) )
ROM_LOAD16_BYTE( "b96-03.ic8", 0x00001, 0x10000, CRC(fb5f3ca4) SHA1(0c335acceea50133a6899f9e368cff5f61b55a96) )
@ -2080,10 +1943,10 @@ ROM_START( plottinga ) /* B96-09 or higher by Taito's rom numbering system, demo
ROM_END
ROM_START( plottingb ) /* The first (earliest) "World" version by Taito's rom numbering system, demo mode is 2 players */
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_REGION( 0x10000, "tc0090lvc", 0 )
ROM_LOAD( "b96-06.ic10",0x00000, 0x10000, CRC(f89a54b1) SHA1(19757b5fb61acdd6f5ae8e32a38ae54bfda0c522) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "b96-02.ic9", 0x00000, 0x10000, CRC(6e0bad2a) SHA1(73996688cd058a2f56f61ea60144b9c673919a58) )
ROM_LOAD16_BYTE( "b96-03.ic8", 0x00001, 0x10000, CRC(fb5f3ca4) SHA1(0c335acceea50133a6899f9e368cff5f61b55a96) )
@ -2092,10 +1955,10 @@ ROM_START( plottingb ) /* The first (earliest) "World" version by Taito's rom nu
ROM_END
ROM_START( plottingu ) /* The demo mode is 2 players */
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_REGION( 0x10000, "tc0090lvc", 0 )
ROM_LOAD( "b96-05.ic10",0x00000, 0x10000, CRC(afb99d1f) SHA1(a5cabc182d4f1d5709e6835d8b0a481dd0f9a563) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "b96-02.ic9", 0x00000, 0x10000, CRC(6e0bad2a) SHA1(73996688cd058a2f56f61ea60144b9c673919a58) )
ROM_LOAD16_BYTE( "b96-03.ic8", 0x00001, 0x10000, CRC(fb5f3ca4) SHA1(0c335acceea50133a6899f9e368cff5f61b55a96) )
@ -2104,10 +1967,10 @@ ROM_START( plottingu ) /* The demo mode is 2 players */
ROM_END
ROM_START( flipull ) /* The demo mode is 1 player */
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_REGION( 0x10000, "tc0090lvc", 0 )
ROM_LOAD( "b96-01.ic10",0x00000, 0x10000, CRC(65993978) SHA1(d14dc70f1b5e72b96ccc3fab61d7740f627bfea2) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "b96-07.ic9", 0x00000, 0x10000, CRC(0713a387) SHA1(0fc1242ce02a56279fa1d5270c905bba7cdcd072) )
ROM_LOAD16_BYTE( "b96-08.ic8", 0x00001, 0x10000, CRC(55b8e294) SHA1(14405638f751adfadb022bf7a0123a3972d4a617) )
@ -2116,13 +1979,13 @@ ROM_START( flipull ) /* The demo mode is 1 player */
ROM_END
ROM_START( puzznic )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "c20-09.ic11", 0x00000, 0x20000, CRC(156d6de1) SHA1(c247936b62ef354851c9bace76a7a0aa14194d5f) )
ROM_REGION( 0x0800, "mcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "c20-01.ic4", 0x0000, 0x0800, CRC(085f68b4) SHA1(2dbc7e2c015220dc59ee1f1208540744e5b9b7cc) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "c20-07.ic10", 0x00000, 0x10000, CRC(be12749a) SHA1(c67d1a434486843a6776d89e905362b7db595d8d) )
ROM_LOAD16_BYTE( "c20-06.ic9", 0x00001, 0x10000, CRC(ac85a9c5) SHA1(2d72dae86a191ccdac9648980aca832fb9886544) )
@ -2131,13 +1994,13 @@ ROM_START( puzznic )
ROM_END
ROM_START( puzznicu )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "c20-10.ic11", 0x00000, 0x20000, CRC(3522d2e5) SHA1(2428663d1d71f2920c69cd2cd907f0750c22af77) )
ROM_REGION( 0x0800, "mcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "c20-01.ic4", 0x0000, 0x0800, CRC(085f68b4) SHA1(2dbc7e2c015220dc59ee1f1208540744e5b9b7cc) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_REGION( 0x40000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "c20-03.ic10", 0x00000, 0x20000, CRC(4264056c) SHA1(d2d8a170ae0f361093a5384935238605a59e5938) )
ROM_LOAD16_BYTE( "c20-02.ic9", 0x00001, 0x20000, CRC(3c115f8b) SHA1(8d518be01b7c4d6d993d5d9b62aab719a5c8baca) )
@ -2146,13 +2009,13 @@ ROM_START( puzznicu )
ROM_END
ROM_START( puzznicj )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "c20-04.ic11", 0x00000, 0x20000, CRC(a4150b6c) SHA1(27719b8993735532cd59f4ed5693ff3143ee2336) )
ROM_REGION( 0x0800, "mcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "c20-01.ic4", 0x0000, 0x0800, CRC(085f68b4) SHA1(2dbc7e2c015220dc59ee1f1208540744e5b9b7cc) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_REGION( 0x40000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "c20-03.ic10", 0x00000, 0x20000, CRC(4264056c) SHA1(d2d8a170ae0f361093a5384935238605a59e5938) )
ROM_LOAD16_BYTE( "c20-02.ic9", 0x00001, 0x20000, CRC(3c115f8b) SHA1(8d518be01b7c4d6d993d5d9b62aab719a5c8baca) )
@ -2161,28 +2024,28 @@ ROM_START( puzznicj )
ROM_END
ROM_START( puzznici ) /* bootleg (original main board, bootleg sub-board without MCU) */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "1.ic11", 0x00000, 0x20000, CRC(4612f5e0) SHA1(dc07a365414666568537d31ef01b58f2362cadaf) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_REGION( 0x40000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "u10.ic10", 0x00000, 0x20000, CRC(4264056c) SHA1(d2d8a170ae0f361093a5384935238605a59e5938) )
ROM_LOAD16_BYTE( "3.ic9", 0x00001, 0x20000, CRC(2bf5232a) SHA1(a8fc06bb8bae2ca6bd21e3a96c9ed38bb356d5d7) )
ROM_END
ROM_START( puzznicb ) /* bootleg (original main board, bootleg sub-board without MCU) */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "ic11.bin", 0x00000, 0x20000, CRC(2510df4d) SHA1(534327e3d7f847b6c0effc5fd0fb9f5da9b0d3b1) )
ROM_REGION( 0x20000, "gfx1", 0 ) // this has the bad line in tile 1 fixed (unused I believe) are we sure the roms used in the original sets are a good dump?
ROM_REGION( 0x20000, "tc0090lvc:gfx", 0 ) // this has the bad line in tile 1 fixed (unused I believe) are we sure the roms used in the original sets are a good dump?
ROM_LOAD16_BYTE( "ic10.bin", 0x00000, 0x10000, CRC(be12749a) SHA1(c67d1a434486843a6776d89e905362b7db595d8d) )
ROM_LOAD16_BYTE( "ic9.bin", 0x00001, 0x10000, CRC(0f183340) SHA1(9eef7de801eb9763313f55a38e567b92fca3bfa6) )
ROM_END
ROM_START( puzznicba ) /* bootleg (original main board, bootleg sub-board without MCU) - marked PUZZNIC-2 008900 42 */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "18.ic10", 0x00000, 0x20000, CRC(8349eb3b) SHA1(589dc99a22b3d7623b1ea6c1053f3b3dfe520547) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_REGION( 0x40000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "19.ic9", 0x00000, 0x20000, CRC(4264056c) SHA1(d2d8a170ae0f361093a5384935238605a59e5938) )
ROM_LOAD16_BYTE( "20.ic8", 0x00001, 0x20000, CRC(3c115f8b) SHA1(8d518be01b7c4d6d993d5d9b62aab719a5c8baca) )
ROM_END
@ -2207,10 +2070,10 @@ SUB PCB (K9100282A / J9100220A)
*/
ROM_START( horshoes )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "c47-03.ic6", 0x00000, 0x20000, CRC(37e15b20) SHA1(85baa0ee553e4c9fed38294ba8912f18f519e62f) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "c47-02.ic5", 0x00000, 0x10000, CRC(35f96526) SHA1(e7f9b33d82b050aff49f991aa12db436421caa5b) ) /* silkscreened CH0-L */
ROM_CONTINUE ( 0x40000, 0x10000 )
ROM_LOAD16_BYTE( "c47-01.ic11", 0x20000, 0x10000, CRC(031c73d8) SHA1(deef972fbf226701f9a6469ae3934129dc52ce9c) ) /* silkscreened CH1-L */
@ -2226,28 +2089,28 @@ ROM_START( horshoes )
ROM_END
ROM_START( palamed ) /* Prototype or location test?? - Line 5 of notice screen says "Territory" later sets say "Territories" */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "palamedes_prg_ic6.ic6", 0x00000, 0x20000, CRC(ee957b0e) SHA1(cca9db673026f769776cb86734a6503692676fbe) ) /* hand labeled as PALAMEDEStm [PRG] IC6 */
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_REGION( 0x40000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "chr-l_ic9.ic9", 0x00000, 0x20000, CRC(c7bbe460) SHA1(1c1f186d0b0b2e383f82c53ae93b975a75f50f9c) ) /* hand labeled as CHR-L IC9 */
ROM_LOAD16_BYTE( "chr-h_ic7.ic7", 0x00001, 0x20000, CRC(fcd86e44) SHA1(bdd0750ed6e93cc49f09f4ccb05b0c4a44cb9c23) ) /* hand labeled as CHR-H IC7 */
ROM_END
ROM_START( palamedj )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "c63-02.ic6", 0x00000, 0x20000, CRC(55a82bb2) SHA1(f157ad770351d4b8d8f8c061c4e330d6391fc624) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_REGION( 0x40000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "c63-04.ic9", 0x00000, 0x20000, CRC(c7bbe460) SHA1(1c1f186d0b0b2e383f82c53ae93b975a75f50f9c) )
ROM_LOAD16_BYTE( "c63-03.ic7", 0x00001, 0x20000, CRC(fcd86e44) SHA1(bdd0750ed6e93cc49f09f4ccb05b0c4a44cb9c23) )
ROM_END
ROM_START( cachat )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "cac6", 0x00000, 0x20000, CRC(8105cf5f) SHA1(e6dd22165436c247db887a04c3e69c9e2505bb33) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "cac9", 0x00000, 0x20000, CRC(bc462914) SHA1(3eede8940cabadf563acb63059bfc2d13253b29f) )
ROM_LOAD16_BYTE( "cac10", 0x40000, 0x20000, CRC(ecc64b31) SHA1(04ce97cdcdbdbd38602011f5ed27fe9182fb500a) )
ROM_LOAD16_BYTE( "cac7", 0x00001, 0x20000, CRC(7fb71578) SHA1(34cfa1383ea1f3cbf45eaf6b989a1248cdef1bb9) )
@ -2258,10 +2121,10 @@ ROM_START( cachat )
ROM_END
ROM_START( tubeit ) /* Title changed. Year, copyright and manufacture removed */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x20000, "tc0090lvc", 0 )
ROM_LOAD( "t-i_02.6", 0x00000, 0x20000, CRC(54730669) SHA1(a44ebd31a8588a133a7552a39fa8d52ba1985e45) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "t-i_03.7", 0x00001, 0x40000, CRC(e1c3fed0) SHA1(cd68dbf61ed820f4aa50c630e7cb778aafb433c2) )
ROM_LOAD16_BYTE( "t-i_04.9", 0x00000, 0x40000, CRC(b4a6e31d) SHA1(e9abab8f19c78207f25a62104bcae1e391cbd2c0) )
@ -2270,10 +2133,10 @@ ROM_START( tubeit ) /* Title changed. Year, copyright and manufacture removed */
ROM_END
ROM_START( cubybop )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "cb06.6", 0x00000, 0x40000, CRC(66b89a85) SHA1(2ba26d71fd1aa8e64584a5908a1d797666718d49) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "cb09.9", 0x00000, 0x40000, CRC(5f831e59) SHA1(db319a6c1058200274d687163b4df2f78a2bf879) )
ROM_LOAD16_BYTE( "cb10.10", 0x80000, 0x40000, CRC(430510fc) SHA1(95c0a0ebd0485a15090f302e5d2f4da8204baf7c) )
ROM_LOAD16_BYTE( "cb07.7", 0x00001, 0x40000, CRC(3582de99) SHA1(51620cc9044aef8e5ed0335b7d5d6d67a7857005) )
@ -2281,28 +2144,28 @@ ROM_START( cubybop )
ROM_END
ROM_START( plgirls )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "pg03.ic6", 0x00000, 0x40000, CRC(6ca73092) SHA1(f5679f047a29b936046c0d3677489df553ad7b41) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "pg02.ic9", 0x00000, 0x40000, CRC(3cf05ca9) SHA1(502c45a5330dda1b2fbf7d3d0c9bc6e889ff07d8) )
ROM_LOAD16_BYTE( "pg01.ic7", 0x00001, 0x40000, CRC(79e41e74) SHA1(aa8efbeeee47f84e19b639821a89a7bcd67fe7a9) )
ROM_END
ROM_START( plgirls2 )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "pg2_1j.ic6", 0x00000, 0x40000, CRC(f924197a) SHA1(ecaaefd1b3715ba60608e05d58be67e3c71f653a) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD16_BYTE( "cho-l.ic9", 0x00000, 0x80000, CRC(956384ec) SHA1(94a2b95f340e96bdccbeafd373f0dea90b8328dd) )
ROM_LOAD16_BYTE( "cho-h.ic7", 0x00001, 0x80000, CRC(992f99b1) SHA1(c79f1014d73654740f7823812f92376d65d6b15d) )
ROM_END
ROM_START( plgirls2b )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "playgirls2b.d1", 0x00000, 0x40000, CRC(d58159fa) SHA1(541c6ca5f12c38b5a08f90048f52c31d27bb9233) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD32_BYTE( "playgirls2b.d8", 0x00003, 0x40000, CRC(22df48b5) SHA1(be51dbe55f84dd1b7c30da0e4d98c874b0803382) )
ROM_LOAD32_BYTE( "playgirls2b.d4", 0x00001, 0x40000, CRC(bc9e2192) SHA1(7bc7f46295166a84c849e9ea82428e653375d9d6) )
ROM_LOAD32_BYTE( "playgirls2b.b6", 0x00000, 0x40000, CRC(aac6c90b) SHA1(965cea2fb5f3aaabb4378fc24899af53de745ff3) )
@ -2311,14 +2174,14 @@ ROM_END
ROM_START( evilston )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "c67-03.ic2", 0x00000, 0x20000, CRC(53419982) SHA1(ecc338e2237d26c5ff25b756d371b26b23beed1e) )
ROM_LOAD( "c67-04.ic6", 0x20000, 0x20000, CRC(55d57e19) SHA1(8815bcaafe7ee056314b4131e3fb7963854dd6ba) )
ROM_REGION( 0x80000, "audiocpu", 0 )
ROM_LOAD( "c67-05.ic22", 0x00000, 0x20000, CRC(94d3a642) SHA1(af20aa5bb60a45c05eb1deba23ba30e6640ca235) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tc0090lvc:gfx", 0 )
ROM_LOAD( "c67-01.ic1", 0x00000, 0x80000, CRC(2f351bf4) SHA1(0fb37abf3413cd11baece1c9bbca5a51b0f28938) )
ROM_LOAD( "c67-02.ic5", 0x80000, 0x80000, CRC(eb4f895c) SHA1(2c902572fe5a5d4442e4dd29e8a85cb40c384140) )
ROM_END
@ -2361,10 +2224,10 @@ Notes:
*/
ROM_START( lagirl )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_REGION( 0x40000, "tc0090lvc", 0 )
ROM_LOAD( "rom1", 0x00000, 0x40000, CRC(ba1acfdb) SHA1(ff1093c2d0887287ce451417bd373e00f2881ce7) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tc0090lvc:gfx", 0 )
ROM_LOAD32_BYTE( "rom2", 0x00003, 0x20000, CRC(4c739a30) SHA1(4426f51aac9bb39f5d1a7616d183ff6c76749dc2) )
ROM_LOAD32_BYTE( "rom3", 0x00001, 0x20000, CRC(4cf22a4b) SHA1(1c933ccbb6a5b8a6795385d7970db5f7138e572e) )
ROM_LOAD32_BYTE( "rom4", 0x00002, 0x20000, CRC(7dcd6696) SHA1(8f3b1fe669520142668af6dc2d04f13767048989) )

View File

@ -7,6 +7,7 @@
#include "machine/74157.h"
#include "machine/bankdev.h"
#include "machine/tc009xlvc.h"
#include "machine/timer.h"
#include "machine/upd4701.h"
#include "sound/msm5205.h"
@ -21,13 +22,9 @@ public:
taitol_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_main_cpu(*this, "maincpu")
, m_vdp(*this, "tc0090lvc")
, m_upd4701(*this, "upd4701")
, m_main_prg(*this, "maincpu")
, m_main_bnk(*this, "mainbank")
, m_ram_bnks(*this, "rambank%u", 1)
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
, m_vram(*this, "vram")
, m_main_prg(*this, "tc0090lvc")
{
}
@ -38,69 +35,29 @@ public:
DECLARE_WRITE8_MEMBER(coin_control_w);
protected:
static constexpr size_t SPRITERAM_SIZE = 0x400;
/* memory pointers */
u8 * m_shared_ram;
/* video-related */
tilemap_t *m_bg_tilemap[2];
tilemap_t *m_tx_tilemap;
std::unique_ptr<u8[]> m_buff_spriteram;
int m_cur_ctrl;
int m_horshoes_gfxbank;
int m_bankc[4];
int m_flipscreen;
/* misc */
int m_cur_rombank;
int m_cur_rambank[4];
int m_irq_adr_table[3];
int m_irq_enable;
int m_last_irq_level;
int m_high;
int m_main_high;
DECLARE_WRITE8_MEMBER(irq_adr_w);
DECLARE_READ8_MEMBER(irq_adr_r);
DECLARE_WRITE8_MEMBER(irq_enable_w);
DECLARE_READ8_MEMBER(irq_enable_r);
DECLARE_WRITE8_MEMBER(rombankswitch_w);
DECLARE_READ8_MEMBER(rombankswitch_r);
DECLARE_WRITE8_MEMBER(rambankswitch_w);
DECLARE_READ8_MEMBER(rambankswitch_r);
DECLARE_WRITE8_MEMBER(mcu_control_w);
DECLARE_READ8_MEMBER(mcu_control_r);
DECLARE_WRITE8_MEMBER(taitol_bankc_w);
DECLARE_READ8_MEMBER(taitol_bankc_r);
DECLARE_WRITE8_MEMBER(taitol_control_w);
DECLARE_READ8_MEMBER(taitol_control_r);
DECLARE_WRITE8_MEMBER(vram_w);
template<int Offset> TILE_GET_INFO_MEMBER(get_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
virtual void video_start() override;
u32 screen_update_taitol(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank_taitol);
TIMER_DEVICE_CALLBACK_MEMBER(vbl_interrupt);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void l_system_video(machine_config &config);
void common_banks_map(address_map &map);
void tc0090lvc_map(address_map &map);
virtual void state_register();
virtual void taito_machine_reset();
required_device<cpu_device> m_main_cpu;
required_device<tc0090lvc_device> m_vdp;
optional_device<upd4701_device> m_upd4701;
required_memory_region m_main_prg;
required_memory_bank m_main_bnk;
required_device_array<address_map_bank_device, 4> m_ram_bnks;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<u8> m_vram;
};
@ -146,13 +103,13 @@ public:
: taitol_2cpu_state(mconfig, type, tag)
, m_slave_prg(*this, "slave")
, m_slave_bnk(*this, "slavebank")
, m_cur_rombank2(0)
, m_high2(0)
, m_slave_rombank(0)
, m_slave_high(0)
{
}
DECLARE_WRITE8_MEMBER(rombank2switch_w);
DECLARE_READ8_MEMBER(rombank2switch_r);
DECLARE_WRITE8_MEMBER(slave_rombank_w);
DECLARE_READ8_MEMBER(slave_rombank_r);
DECLARE_WRITE8_MEMBER(portA_w);
void fhawk(machine_config &config);
@ -168,8 +125,8 @@ protected:
required_memory_region m_slave_prg;
required_memory_bank m_slave_bnk;
u8 m_cur_rombank2;
u8 m_high2;
u8 m_slave_rombank;
u8 m_slave_high;
};
@ -261,10 +218,18 @@ public:
{
}
DECLARE_WRITE8_MEMBER(bankg_w);
DECLARE_MACHINE_RESET(horshoes);
void horshoes(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
void horshoes_tile_cb(u32 &code);
DECLARE_WRITE8_MEMBER(bankg_w);
int m_horshoes_gfxbank;
void horshoes_map(address_map &map);
};

View File

@ -6,259 +6,38 @@
#include <algorithm>
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
template<int Offset>
TILE_GET_INFO_MEMBER(taitol_state::get_tile_info)
{
int attr = m_vram[2 * tile_index + Offset + 1];
int code = m_vram[2 * tile_index + Offset]
| ((attr & 0x03) << 8)
| ((m_bankc[(attr & 0xc) >> 2]) << 10)
| (m_horshoes_gfxbank << 12);
tileinfo.set(0,
code,
(attr & 0xf0) >> 4,
0);
}
TILE_GET_INFO_MEMBER(taitol_state::get_tx_tile_info)
{
int attr = m_vram[2 * tile_index + 0xa000 + 1];
int code = m_vram[2 * tile_index + 0xa000] | ((attr & 0x07) << 8);
tileinfo.set(2,
code,
(attr & 0xf0) >> 4,
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void taitol_state::video_start()
{
m_buff_spriteram = make_unique_clear<u8[]>(SPRITERAM_SIZE);
m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(taitol_state::get_tile_info<0x8000>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(taitol_state::get_tile_info<0x9000>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(taitol_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_bg_tilemap[0]->set_transparent_pen(0);
m_tx_tilemap->set_transparent_pen(0);
m_tx_tilemap->set_scrolldx(-8, -8);
m_bg_tilemap[0]->set_scrolldx(28, -11);
m_bg_tilemap[1]->set_scrolldx(38, -21);
save_pointer(NAME(m_buff_spriteram), SPRITERAM_SIZE);
}
/***************************************************************************
Memory handlers
***************************************************************************/
void horshoes_state::horshoes_tile_cb(u32 &code)
{
code |= m_horshoes_gfxbank << 12;
}
WRITE8_MEMBER(horshoes_state::bankg_w)
{
if (m_horshoes_gfxbank != data)
{
m_horshoes_gfxbank = data;
for (int i = 0; i < 2; i++)
m_bg_tilemap[i]->mark_all_dirty();
m_vdp->mark_all_layer_dirty();
}
}
WRITE8_MEMBER(taitol_state::taitol_bankc_w)
{
if (m_bankc[offset] != data)
{
m_bankc[offset] = data;
// logerror("Bankc %d, %02x (%s)\n", offset, data, m_maincpu->pc());
for (int i = 0; i < 2; i++)
m_bg_tilemap[i]->mark_all_dirty();
}
}
READ8_MEMBER(taitol_state::taitol_bankc_r)
{
return m_bankc[offset];
}
WRITE8_MEMBER(taitol_state::taitol_control_w)
{
// logerror("Control Write %02x (%s)\n", data, m_maincpu->pc());
m_cur_ctrl = data;
//popmessage("%02x",data);
/* bit 0 unknown */
/* bit 1 unknown */
/* bit 3 controls sprite/tile priority - handled in vh_screenrefresh() */
/* bit 4 flip screen */
m_flipscreen = data & 0x10;
machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
/* bit 5 display enable - handled in vh_screenrefresh() */
}
READ8_MEMBER(taitol_state::taitol_control_r)
{
// logerror("Control Read %02x (%s)\n", cur_ctrl, m_maincpu->pc());
return m_cur_ctrl;
}
WRITE8_MEMBER(taitol_state::vram_w)
{
// TODO : 0x10000-0x13fff Unused?
if ((offset & 0xc000) == 0)
return;
if((m_vram[offset] & mem_mask) == (data & mem_mask))
return;
COMBINE_DATA(&m_vram[offset]);
m_gfxdecode->gfx(2)->mark_dirty(offset / 32);
switch (offset & 0xf000)
{
case 0x8000:
case 0x9000:
m_bg_tilemap[(offset >> 12) & 1]->mark_tile_dirty((offset & 0xfff) / 2);
break;
case 0xa000:
m_tx_tilemap->mark_tile_dirty((offset & 0xfff) / 2);
break;
}
}
/***************************************************************************
Display refresh
***************************************************************************/
/*
Sprite format:
00: xxxxxxxx tile number (low)
01: xxxxxxxx tile number (high)
02: ----xxxx color
----x--- priority
03: -------x flip x
------x- flip y
04: xxxxxxxx x position (low)
05: -------x x position (high)
06: xxxxxxxx y position
07: xxxxxxxx unknown / ignored? Seems just garbage in many cases, e.g
plgirs2 bullets and raimais big bosses.
*/
void taitol_state::draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
{
int offs;
/* at spriteram + 0x3f0 and 03f8 are the tilemap control registers; spriteram + 0x3e8 seems to be unused */
for (offs = 0; offs < SPRITERAM_SIZE - 3 * 8; offs += 8)
{
int code, color, sx, sy, flipx, flipy;
color = m_buff_spriteram[offs + 2] & 0x0f;
code = m_buff_spriteram[offs] | (m_buff_spriteram[offs + 1] << 8);
code |= (m_horshoes_gfxbank & 0x03) << 10;
sx = m_buff_spriteram[offs + 4] | ((m_buff_spriteram[offs + 5] & 1) << 8);
sy = m_buff_spriteram[offs + 6];
if (sx >= 320)
sx -= 512;
flipx = m_buff_spriteram[offs + 3] & 0x01;
flipy = m_buff_spriteram[offs + 3] & 0x02;
if (m_flipscreen)
{
sx = 304 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->prio_transpen(bitmap,cliprect,
code,
color,
flipx,flipy,
sx,sy,
screen.priority(),
(color & 0x08) ? 0xaa : 0x00,0);
}
}
uint32_t taitol_state::screen_update_taitol(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int dx, dy;
dx = m_vram[0xb3f4] | (m_vram[0xb3f5] << 8);
if (m_flipscreen)
dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf;
dy = m_vram[0xb3f6];
m_bg_tilemap[0]->set_scrollx(0, -dx);
m_bg_tilemap[0]->set_scrolly(0, -dy);
dx = m_vram[0xb3fc] | (m_vram[0xb3fd] << 8);
if (m_flipscreen)
dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf;
dy = m_vram[0xb3fe];
m_bg_tilemap[1]->set_scrollx(0, -dx);
m_bg_tilemap[1]->set_scrolly(0, -dy);
if (m_cur_ctrl & 0x20) /* display enable */
{
screen.priority().fill(0, cliprect);
m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0);
if (m_cur_ctrl & 0x08) /* sprites always over BG1 */
m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
else /* split priority */
m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,1);
draw_sprites(screen, bitmap, cliprect);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
}
else
bitmap.fill(m_palette->pen(0), cliprect);
return 0;
}
WRITE_LINE_MEMBER(taitol_state::screen_vblank_taitol)
{
// rising edge
if (state)
{
std::copy(&m_vram[0xb000], &m_vram[0xb000+SPRITERAM_SIZE], &m_buff_spriteram[0]);
m_vdp->screen_eof();
}
}