mirror of
https://github.com/holub/mame
synced 2025-04-16 13:34:55 +03:00
inufuku.cpp: Merged */inufuku.* into drivers/inufuku.cpp, minor cleanups. (#8172)
* Removed unnecessary VRAM read trampolines. * Use buffered_spriteram16_device for buffered sprite RAM. * Derive clocks from crystals. * Reduced runtime tag lookups, unnecessary region size. * Fix naming, spacing. * Use generic graphics layouts, fix color usage of gfxdecode related to palette size. * Restrict rowscroll to screen clipping rectangle.
This commit is contained in:
parent
c8814942ee
commit
838da5bea9
@ -4563,8 +4563,6 @@ files {
|
||||
MAME_DIR .. "src/mame/video/vs920a.cpp",
|
||||
MAME_DIR .. "src/mame/video/vs920a.h",
|
||||
MAME_DIR .. "src/mame/drivers/inufuku.cpp",
|
||||
MAME_DIR .. "src/mame/includes/inufuku.h",
|
||||
MAME_DIR .. "src/mame/video/inufuku.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/ojankohs.cpp",
|
||||
MAME_DIR .. "src/mame/includes/ojankohs.h",
|
||||
MAME_DIR .. "src/mame/video/ojankohs.cpp",
|
||||
|
@ -73,14 +73,245 @@ TODO:
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "includes/inufuku.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/eepromser.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "sound/ymopn.h"
|
||||
#include "video/bufsprite.h"
|
||||
#include "video/vsystem_spr.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class inufuku_state : public driver_device
|
||||
{
|
||||
public:
|
||||
inufuku_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_bg_videoram(*this, "bg_videoram")
|
||||
, m_bg_rasterram(*this, "bg_rasterram")
|
||||
, m_tx_videoram(*this, "tx_videoram")
|
||||
, m_sprtileram(*this, "sprtileram")
|
||||
, m_audiobank(*this, "audiobank")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_gfxdecode(*this, "gfxdecode")
|
||||
, m_palette(*this, "palette")
|
||||
, m_spr(*this, "vsystem_spr")
|
||||
, m_soundlatch(*this, "soundlatch")
|
||||
, m_sprattrram(*this, "sprattrram")
|
||||
{ }
|
||||
|
||||
void inufuku(machine_config &config);
|
||||
void _3on3dunk(machine_config &config);
|
||||
|
||||
DECLARE_READ_LINE_MEMBER(soundflag_r);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
private:
|
||||
// memory pointers
|
||||
required_shared_ptr<u16> m_bg_videoram;
|
||||
required_shared_ptr<u16> m_bg_rasterram;
|
||||
required_shared_ptr<u16> m_tx_videoram;
|
||||
required_shared_ptr<u16> m_sprtileram;
|
||||
|
||||
required_memory_bank m_audiobank;
|
||||
|
||||
// video-related
|
||||
tilemap_t *m_bg_tilemap;
|
||||
tilemap_t *m_tx_tilemap;
|
||||
int m_bg_scrollx = 0;
|
||||
int m_bg_scrolly = 0;
|
||||
int m_tx_scrollx = 0;
|
||||
int m_tx_scrolly = 0;
|
||||
bool m_bg_raster = false;
|
||||
u8 m_bg_palettebank = 0;
|
||||
u8 m_tx_palettebank = 0;
|
||||
u32 tile_callback( u32 code );
|
||||
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device<vsystem_spr_device> m_spr;
|
||||
required_device<generic_latch_8_device> m_soundlatch;
|
||||
required_device<buffered_spriteram16_device> m_sprattrram;
|
||||
|
||||
void soundrombank_w(u8 data);
|
||||
void palettereg_w(offs_t offset, u16 data);
|
||||
void scrollreg_w(offs_t offset, u16 data);
|
||||
void bg_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void tx_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_tx_tile_info);
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void main_map(address_map &map);
|
||||
void sound_io_map(address_map &map);
|
||||
void sound_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Memory handlers
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
void inufuku_state::palettereg_w(offs_t offset, u16 data)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0x02:
|
||||
m_bg_palettebank = (data & 0xf000) >> 12;
|
||||
m_bg_tilemap->mark_all_dirty();
|
||||
/*
|
||||
if (data & ~0xf000)
|
||||
logerror("%s: palettereg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
|
||||
*/
|
||||
break;
|
||||
case 0x03:
|
||||
m_tx_palettebank = (data & 0xf000) >> 12;
|
||||
m_tx_tilemap->mark_all_dirty();
|
||||
/*
|
||||
if (data & ~0xf000)
|
||||
logerror("%s: palettereg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
//logerror("%s: palettereg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void inufuku_state::scrollreg_w(offs_t offset, u16 data)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00: m_bg_scrollx = data + 1; break;
|
||||
case 0x01: m_bg_scrolly = data + 0; break;
|
||||
case 0x02: m_tx_scrollx = data - 3; break;
|
||||
case 0x03: m_tx_scrolly = data + 1; break;
|
||||
case 0x04:
|
||||
m_bg_raster = BIT(~data, 9);
|
||||
/*
|
||||
if (data & ~0x0200)
|
||||
logerror("%s: palettereg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
//logerror("%s: scrollreg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Tilemap callbacks
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
TILE_GET_INFO_MEMBER(inufuku_state::get_bg_tile_info)
|
||||
{
|
||||
tileinfo.set(0,
|
||||
m_bg_videoram[tile_index],
|
||||
m_bg_palettebank,
|
||||
0);
|
||||
}
|
||||
|
||||
|
||||
TILE_GET_INFO_MEMBER(inufuku_state::get_tx_tile_info)
|
||||
{
|
||||
tileinfo.set(1,
|
||||
m_tx_videoram[tile_index],
|
||||
m_tx_palettebank,
|
||||
0);
|
||||
}
|
||||
|
||||
|
||||
void inufuku_state::bg_videoram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
COMBINE_DATA(&m_bg_videoram[offset]);
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
|
||||
void inufuku_state::tx_videoram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_videoram[offset]);
|
||||
m_tx_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
|
||||
u32 inufuku_state::tile_callback( u32 code )
|
||||
{
|
||||
return ((m_sprtileram[code * 2] & 0x0007) << 16) + m_sprtileram[(code * 2) + 1];
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Start the video hardware emulation
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
void inufuku_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(inufuku_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
|
||||
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(inufuku_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
|
||||
|
||||
m_bg_tilemap->set_transparent_pen(255);
|
||||
m_tx_tilemap->set_transparent_pen(255);
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Display refresh
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
u32 inufuku_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(m_palette->black_pen(), cliprect);
|
||||
screen.priority().fill(0);
|
||||
|
||||
if (m_bg_raster)
|
||||
{
|
||||
m_bg_tilemap->set_scroll_rows(512);
|
||||
for (int i = cliprect.min_y; i <= cliprect.max_y; i++)
|
||||
m_bg_tilemap->set_scrollx((m_bg_scrolly + i) & 0x1ff, m_bg_scrollx + m_bg_rasterram[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bg_tilemap->set_scroll_rows(1);
|
||||
m_bg_tilemap->set_scrollx(0, m_bg_scrollx);
|
||||
}
|
||||
m_bg_tilemap->set_scrolly(0, m_bg_scrolly);
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
|
||||
m_tx_tilemap->set_scrollx(0, m_tx_scrollx);
|
||||
m_tx_tilemap->set_scrolly(0, m_tx_scrolly);
|
||||
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
|
||||
|
||||
m_spr->draw_sprites( m_sprattrram->buffer(), m_sprattrram->bytes(), screen, bitmap, cliprect );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@ -89,11 +320,12 @@ TODO:
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
void inufuku_state::inufuku_soundrombank_w(uint8_t data)
|
||||
void inufuku_state::soundrombank_w(u8 data)
|
||||
{
|
||||
membank("bank1")->set_entry(data & 0x03);
|
||||
m_audiobank->set_entry(data & 0x03);
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Input/Output port interface
|
||||
@ -105,17 +337,18 @@ READ_LINE_MEMBER(inufuku_state::soundflag_r)
|
||||
return m_soundlatch->pending_r() ? 0 : 1;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Main CPU memory handlers
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
void inufuku_state::inufuku_map(address_map &map)
|
||||
void inufuku_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x0fffff).rom(); // main rom
|
||||
map(0x000000, 0x0fffff).rom().region("maincpu", 0x000000); // main rom
|
||||
|
||||
// map(0x100000, 0x100007).nopw(); // ?
|
||||
// map(0x100000, 0x100007).nopw(); // ?
|
||||
|
||||
map(0x180000, 0x180001).portr("P1");
|
||||
map(0x180002, 0x180003).portr("P2");
|
||||
@ -125,22 +358,22 @@ void inufuku_state::inufuku_map(address_map &map)
|
||||
map(0x18000a, 0x18000b).portr("P3");
|
||||
|
||||
map(0x200000, 0x200001).portw("EEPROMOUT");
|
||||
map(0x280001, 0x280001).w(m_soundlatch, FUNC(generic_latch_8_device::write)); // sound command
|
||||
map(0x280001, 0x280001).w(m_soundlatch, FUNC(generic_latch_8_device::write)); // sound command
|
||||
|
||||
map(0x300000, 0x301fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // palette ram
|
||||
map(0x380000, 0x3801ff).writeonly().share("bg_rasterram"); // bg raster ram
|
||||
map(0x400000, 0x401fff).rw(FUNC(inufuku_state::inufuku_bg_videoram_r), FUNC(inufuku_state::inufuku_bg_videoram_w)).share("bg_videoram"); // bg ram
|
||||
map(0x402000, 0x403fff).rw(FUNC(inufuku_state::inufuku_tx_videoram_r), FUNC(inufuku_state::inufuku_tx_videoram_w)).share("tx_videoram"); // text ram
|
||||
map(0x300000, 0x301fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // palette ram
|
||||
map(0x380000, 0x3801ff).writeonly().share(m_bg_rasterram); // bg raster ram
|
||||
map(0x400000, 0x401fff).ram().w(FUNC(inufuku_state::bg_videoram_w)).share(m_bg_videoram); // bg ram
|
||||
map(0x402000, 0x403fff).ram().w(FUNC(inufuku_state::tx_videoram_w)).share(m_tx_videoram); // text ram
|
||||
map(0x404000, 0x40ffff).ram(); // ?? mirror (3on3dunk)
|
||||
map(0x580000, 0x581fff).ram().share("spriteram1"); // sprite table + sprite attribute
|
||||
map(0x600000, 0x61ffff).ram().share("spriteram2"); // cell table
|
||||
map(0x580000, 0x581fff).ram().share("sprattrram"); // sprite table + sprite attribute
|
||||
map(0x600000, 0x61ffff).ram().share(m_sprtileram); // cell table
|
||||
|
||||
map(0x780000, 0x780013).w(FUNC(inufuku_state::inufuku_palettereg_w)); // bg & text palettebank register
|
||||
map(0x7a0000, 0x7a0023).w(FUNC(inufuku_state::inufuku_scrollreg_w)); // bg & text scroll register
|
||||
// map(0x7e0000, 0x7e0001).nopw(); // ?
|
||||
map(0x780000, 0x780013).w(FUNC(inufuku_state::palettereg_w)); // bg & text palettebank register
|
||||
map(0x7a0000, 0x7a0023).w(FUNC(inufuku_state::scrollreg_w)); // bg & text scroll register
|
||||
// map(0x7e0000, 0x7e0001).nopw(); // ?
|
||||
|
||||
map(0x800000, 0xbfffff).rom(); // data rom
|
||||
map(0xfd0000, 0xfdffff).ram(); // work ram
|
||||
map(0x800000, 0xbfffff).rom().region("maincpu", 0x100000); // data rom
|
||||
map(0xfd0000, 0xfdffff).ram(); // work ram
|
||||
}
|
||||
|
||||
|
||||
@ -150,21 +383,23 @@ void inufuku_state::inufuku_map(address_map &map)
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
void inufuku_state::inufuku_sound_map(address_map &map)
|
||||
void inufuku_state::sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x77ff).rom();
|
||||
map(0x7800, 0x7fff).ram();
|
||||
map(0x8000, 0xffff).bankr("bank1");
|
||||
map(0x8000, 0xffff).bankr(m_audiobank);
|
||||
}
|
||||
|
||||
void inufuku_state::inufuku_sound_io_map(address_map &map)
|
||||
|
||||
void inufuku_state::sound_io_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map(0x00, 0x00).w(FUNC(inufuku_state::inufuku_soundrombank_w));
|
||||
map(0x00, 0x00).w(FUNC(inufuku_state::soundrombank_w));
|
||||
map(0x04, 0x04).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::acknowledge_w));
|
||||
map(0x08, 0x0b).rw("ymsnd", FUNC(ym2610_device::read), FUNC(ym2610_device::write));
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Port definitions
|
||||
@ -242,61 +477,23 @@ static INPUT_PORTS_START( inufuku )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Graphics definitions
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
static const gfx_layout tilelayout =
|
||||
{
|
||||
8, 8,
|
||||
RGN_FRAC(1, 1),
|
||||
8,
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7 },
|
||||
{ 1*8, 0*8, 3*8, 2*8, 5*8, 4*8, 7*8, 6*8 },
|
||||
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64 },
|
||||
64*8
|
||||
};
|
||||
|
||||
static const gfx_layout spritelayout =
|
||||
{
|
||||
16, 16,
|
||||
RGN_FRAC(1, 1),
|
||||
4,
|
||||
{ 0, 1, 2, 3 },
|
||||
{ 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4,
|
||||
10*4, 11*4, 8*4, 9*4, 14*4, 15*4, 12*4, 13*4 },
|
||||
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
|
||||
8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
|
||||
128*8
|
||||
};
|
||||
|
||||
static const gfx_layout spritelayout_alt =
|
||||
{
|
||||
16, 16,
|
||||
RGN_FRAC(1, 1),
|
||||
4,
|
||||
{ 0, 1, 2, 3 },
|
||||
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4,
|
||||
9*4, 8*4, 11*4, 10*4, 13*4, 12*4, 15*4, 14*4 },
|
||||
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
|
||||
8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
|
||||
128*8
|
||||
};
|
||||
|
||||
static GFXDECODE_START( gfx_inufuku )
|
||||
GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 256*16 ) // bg
|
||||
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 256*16 ) // text
|
||||
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0, 256*16 ) // sprite
|
||||
GFXDECODE_ENTRY( "bgtile", 0, gfx_8x8x8_raw, 0, 4096/256 ) // bg
|
||||
GFXDECODE_ENTRY( "txtile", 0, gfx_8x8x8_raw, 0, 4096/256 ) // text
|
||||
GFXDECODE_ENTRY( "sprtile", 0, gfx_16x16x4_packed_msb, 0, 4096/16 ) // sprite
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
static GFXDECODE_START( gfx_3on3dunk )
|
||||
GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 256*16 ) // bg
|
||||
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 256*16 ) // text
|
||||
GFXDECODE_ENTRY( "gfx3", 0, spritelayout_alt, 0, 256*16 ) // sprite
|
||||
GFXDECODE_ENTRY( "bgtile", 0, gfx_8x8x8_raw, 0, 4096/256 ) // bg
|
||||
GFXDECODE_ENTRY( "txtile", 0, gfx_8x8x8_raw, 0, 4096/256 ) // text
|
||||
GFXDECODE_ENTRY( "sprtile", 0, gfx_16x16x4_packed_lsb, 0, 4096/16 ) // sprite
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
@ -308,10 +505,8 @@ GFXDECODE_END
|
||||
|
||||
void inufuku_state::machine_start()
|
||||
{
|
||||
uint8_t *ROM = memregion("audiocpu")->base();
|
||||
|
||||
membank("bank1")->configure_entries(0, 4, &ROM[0x00000], 0x8000);
|
||||
membank("bank1")->set_entry(0);
|
||||
m_audiobank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x8000);
|
||||
m_audiobank->set_entry(0);
|
||||
|
||||
save_item(NAME(m_bg_scrollx));
|
||||
save_item(NAME(m_bg_scrolly));
|
||||
@ -322,64 +517,69 @@ void inufuku_state::machine_start()
|
||||
save_item(NAME(m_tx_palettebank));
|
||||
}
|
||||
|
||||
|
||||
void inufuku_state::machine_reset()
|
||||
{
|
||||
m_bg_scrollx = 0;
|
||||
m_bg_scrolly = 0;
|
||||
m_tx_scrollx = 0;
|
||||
m_tx_scrolly = 0;
|
||||
m_bg_raster = 0;
|
||||
m_bg_raster = false;
|
||||
m_bg_palettebank = 0;
|
||||
m_tx_palettebank = 0;
|
||||
}
|
||||
|
||||
|
||||
void inufuku_state::inufuku(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 32000000/2); /* 16.00 MHz */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &inufuku_state::inufuku_map);
|
||||
// basic machine hardware */
|
||||
M68000(config, m_maincpu, XTAL(32'000'000)/2); // 16.00 MHz
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &inufuku_state::main_map);
|
||||
m_maincpu->set_vblank_int("screen", FUNC(inufuku_state::irq1_line_hold));
|
||||
|
||||
Z80(config, m_audiocpu, 32000000/4); /* 8.00 MHz */
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &inufuku_state::inufuku_sound_map);
|
||||
m_audiocpu->set_addrmap(AS_IO, &inufuku_state::inufuku_sound_io_map); /* IRQs are triggered by the YM2610 */
|
||||
Z80(config, m_audiocpu, XTAL(32'000'000)/4); // 8.00 MHz
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &inufuku_state::sound_map);
|
||||
m_audiocpu->set_addrmap(AS_IO, &inufuku_state::sound_io_map); // IRQs are triggered by the YM2610
|
||||
|
||||
EEPROM_93C46_16BIT(config, "eeprom");
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||
screen.set_refresh_hz(60);
|
||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2300));
|
||||
screen.set_size(2048, 256);
|
||||
screen.set_visarea(0, 319, 0, 223);
|
||||
screen.set_screen_update(FUNC(inufuku_state::screen_update_inufuku));
|
||||
screen.screen_vblank().set(FUNC(inufuku_state::screen_vblank_inufuku));
|
||||
screen.set_screen_update(FUNC(inufuku_state::screen_update));
|
||||
screen.screen_vblank().set(m_sprattrram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
||||
screen.set_palette(m_palette);
|
||||
|
||||
VSYSTEM_SPR(config, m_spr, 0);
|
||||
m_spr->set_offsets(0, 1); // reference videos confirm at least the +1 against tilemaps in 3on3dunk (the highscore header text and black box are meant to be 1 pixel misaligned, although there is currently a priority bug there too)
|
||||
m_spr->set_pdraw(true);
|
||||
m_spr->set_tile_indirect_cb(FUNC(inufuku_state::inufuku_tile_callback));
|
||||
m_spr->set_tile_indirect_cb(FUNC(inufuku_state::tile_callback));
|
||||
m_spr->set_gfx_region(2);
|
||||
m_spr->set_gfxdecode_tag(m_gfxdecode);
|
||||
|
||||
BUFFERED_SPRITERAM16(config, m_sprattrram);
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_inufuku);
|
||||
PALETTE(config, m_palette).set_format(palette_device::xGBR_555, 4096);
|
||||
|
||||
/* sound hardware */
|
||||
// sound hardware
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
GENERIC_LATCH_8(config, m_soundlatch);
|
||||
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
|
||||
m_soundlatch->set_separate_acknowledge(true);
|
||||
|
||||
ym2610_device &ymsnd(YM2610(config, "ymsnd", 32000000/4));
|
||||
ym2610_device &ymsnd(YM2610(config, "ymsnd", XTAL(32'000'000)/4));
|
||||
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
|
||||
ymsnd.add_route(0, "mono", 0.50);
|
||||
ymsnd.add_route(1, "mono", 0.75);
|
||||
ymsnd.add_route(2, "mono", 0.75);
|
||||
}
|
||||
|
||||
|
||||
void inufuku_state::_3on3dunk(machine_config &config)
|
||||
{
|
||||
inufuku(config);
|
||||
@ -387,9 +587,6 @@ void inufuku_state::_3on3dunk(machine_config &config)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
ROM definitions
|
||||
@ -397,59 +594,61 @@ void inufuku_state::_3on3dunk(machine_config &config)
|
||||
******************************************************************************/
|
||||
|
||||
ROM_START( inufuku )
|
||||
ROM_REGION( 0x1000000, "maincpu", 0 ) // main cpu + data
|
||||
ROM_REGION( 0x0500000, "maincpu", 0 ) // main cpu + data
|
||||
ROM_LOAD16_WORD_SWAP( "u147.bin", 0x0000000, 0x080000, CRC(ab72398c) SHA1(f5dc266ffa936ea6528b46a34113f5e2f8141d71) )
|
||||
ROM_LOAD16_WORD_SWAP( "u146.bin", 0x0080000, 0x080000, CRC(e05e9bd4) SHA1(af0fdf31c2bdf851bf15c9de725dcbbb58464d54) )
|
||||
ROM_LOAD16_WORD_SWAP( "lhmn5l28.148", 0x0800000, 0x400000, CRC(802d17e7) SHA1(43b26efea65fd051c094d19784cb977ced39a1a0) )
|
||||
ROM_LOAD16_WORD_SWAP( "lhmn5l28.148", 0x0100000, 0x400000, CRC(802d17e7) SHA1(43b26efea65fd051c094d19784cb977ced39a1a0) )
|
||||
|
||||
ROM_REGION( 0x0020000, "audiocpu", 0 ) // sound cpu
|
||||
ROM_LOAD( "u107.bin", 0x0000000, 0x020000, CRC(1744ef90) SHA1(e019f4ca83e21aa25710cc0ca40ffe765c7486c9) )
|
||||
|
||||
ROM_REGION( 0x0400000, "gfx1", 0 ) // bg
|
||||
ROM_LOAD16_WORD_SWAP( "lhmn5ku8.u40", 0x0000000, 0x400000, CRC(8cbca80a) SHA1(063e9be97f5a1f021f8326f2994b51f9af5e1eaf) )
|
||||
ROM_REGION( 0x0400000, "bgtile", 0 ) // bg
|
||||
ROM_LOAD( "lhmn5ku8.u40", 0x0000000, 0x400000, CRC(8cbca80a) SHA1(063e9be97f5a1f021f8326f2994b51f9af5e1eaf) )
|
||||
|
||||
ROM_REGION( 0x0400000, "gfx2", 0 ) // text
|
||||
ROM_LOAD16_WORD_SWAP( "lhmn5ku7.u8", 0x0000000, 0x400000, CRC(a6c0f07f) SHA1(971803d1933d8296767d8766ea9f04dcd6ab065c) )
|
||||
ROM_REGION( 0x0400000, "txtile", 0 ) // text
|
||||
ROM_LOAD( "lhmn5ku7.u8", 0x0000000, 0x400000, CRC(a6c0f07f) SHA1(971803d1933d8296767d8766ea9f04dcd6ab065c) )
|
||||
|
||||
ROM_REGION( 0x0c00000, "gfx3", 0 ) // sprite
|
||||
ROM_LOAD16_WORD_SWAP( "lhmn5kub.u34", 0x0000000, 0x400000, CRC(7753a7b6) SHA1(a2e8747ce83ea5a57e2fe62f2452de355d7f48b6) )
|
||||
ROM_LOAD16_WORD_SWAP( "lhmn5kua.u36", 0x0400000, 0x400000, CRC(1ac4402a) SHA1(c15acc6fce4fe0b54e92d14c31a1bd78acf2c8fc) )
|
||||
ROM_LOAD16_WORD_SWAP( "lhmn5ku9.u38", 0x0800000, 0x400000, CRC(e4e9b1b6) SHA1(4d4ad85fbe6a442d4f8cafad748bcae4af6245b7) )
|
||||
ROM_REGION( 0x0c00000, "sprtile", 0 ) // sprite
|
||||
ROM_LOAD( "lhmn5kub.u34", 0x0000000, 0x400000, CRC(7753a7b6) SHA1(a2e8747ce83ea5a57e2fe62f2452de355d7f48b6) )
|
||||
ROM_LOAD( "lhmn5kua.u36", 0x0400000, 0x400000, CRC(1ac4402a) SHA1(c15acc6fce4fe0b54e92d14c31a1bd78acf2c8fc) )
|
||||
ROM_LOAD( "lhmn5ku9.u38", 0x0800000, 0x400000, CRC(e4e9b1b6) SHA1(4d4ad85fbe6a442d4f8cafad748bcae4af6245b7) )
|
||||
|
||||
ROM_REGION( 0x0400000, "ymsnd:adpcma", 0 ) // adpcm data
|
||||
ROM_LOAD( "lhmn5ku6.u53", 0x0000000, 0x400000, CRC(b320c5c9) SHA1(7c99da2d85597a3c008ed61a3aa5f47ad36186ec) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( 3on3dunk )
|
||||
ROM_REGION( 0x1000000, "maincpu", 0 ) // main cpu + data
|
||||
ROM_LOAD16_WORD_SWAP( "prog0_2_4_usa.u147", 0x0000000, 0x080000, CRC(957924ab) SHA1(6fe8ca711d11239310d58188e9d6d28cd27bc5af) )
|
||||
ROM_LOAD16_WORD_SWAP( "prog1_2_4_usa.u146", 0x0080000, 0x080000, CRC(2479e236) SHA1(729e6c85d34d6925c8d6557b138e2bed43e1de6a) )
|
||||
ROM_LOAD16_WORD_SWAP( "lh535l5y.u148", 0x0800000, 0x400000, CRC(aa33e02a) SHA1(86381ecf18fba9065cbc02112751c435bbf8b8b4) )
|
||||
ROM_REGION( 0x0500000, "maincpu", 0 ) // main cpu + data
|
||||
ROM_LOAD16_WORD_SWAP( "prog0_2_4_usa.u147", 0x0000000, 0x080000, CRC(957924ab) SHA1(6fe8ca711d11239310d58188e9d6d28cd27bc5af) )
|
||||
ROM_LOAD16_WORD_SWAP( "prog1_2_4_usa.u146", 0x0080000, 0x080000, CRC(2479e236) SHA1(729e6c85d34d6925c8d6557b138e2bed43e1de6a) )
|
||||
ROM_LOAD16_WORD_SWAP( "lh535l5y.u148", 0x0100000, 0x400000, CRC(aa33e02a) SHA1(86381ecf18fba9065cbc02112751c435bbf8b8b4) )
|
||||
|
||||
ROM_REGION( 0x0020000, "audiocpu", 0 ) // sound cpu
|
||||
ROM_LOAD( "sound_prog_97_1_13.u107", 0x0000000, 0x020000, CRC(d9d42805) SHA1(ab5cb7c141d9c9ed5121ba4dbc1d0fa187bd9f68) )
|
||||
|
||||
ROM_REGION( 0x0400000, "gfx1", 0 ) // bg
|
||||
ROM_LOAD16_WORD_SWAP( "lh525kwy.u40", 0x0000000, 0x400000, CRC(aaa426d1) SHA1(2f9a2981f336caf3188baec9a34f61452dee2203) )
|
||||
ROM_REGION( 0x0400000, "bgtile", 0 ) // bg
|
||||
ROM_LOAD( "lh525kwy.u40", 0x0000000, 0x400000, CRC(aaa426d1) SHA1(2f9a2981f336caf3188baec9a34f61452dee2203) )
|
||||
|
||||
ROM_REGION( 0x0400000, "gfx2", 0 ) // text
|
||||
ROM_LOAD16_WORD_SWAP( "lh537nn4.u8", 0x0000000, 0x200000, CRC(2b7be1d8) SHA1(aac274a8f4028db7429478601a1761e61ab4f9a2) )
|
||||
ROM_REGION( 0x0400000, "txtile", 0 ) // text
|
||||
ROM_LOAD( "lh537nn4.u8", 0x0000000, 0x200000, CRC(2b7be1d8) SHA1(aac274a8f4028db7429478601a1761e61ab4f9a2) )
|
||||
|
||||
ROM_REGION( 0x2000000, "gfx3", 0 ) // sprite
|
||||
ROM_REGION( 0x2000000, "sprtile", 0 ) // sprite
|
||||
ROM_LOAD( "lh535kwz.u34", 0x0000000, 0x400000, CRC(7372ce78) SHA1(ed2a861986357fad7ef983750cd906c3d722b862) )
|
||||
ROM_LOAD( "lh535kv0.u36", 0x0400000, 0x400000, CRC(247e5741) SHA1(8d71d964791fb4b86e390bcdf7744f616d6357b1) )
|
||||
ROM_LOAD( "lh535kv2.u38", 0x0800000, 0x400000, CRC(76449b1e) SHA1(b63d50c6f0dc91dc94dbcdda9842598529c1c26e) )
|
||||
ROM_LOAD( "lh537nn5.u20", 0x0c00000, 0x200000, CRC(f457cd3b) SHA1(cc13f5dc44e4675c1074a365b10f34e684817d81) )
|
||||
/* 0x0e00000, 0x200000 empty */
|
||||
// 0x0e00000, 0x200000 empty
|
||||
ROM_LOAD( "lh536pnm.u32", 0x1000000, 0x400000, CRC(bc39e449) SHA1(5aea90b66ee03c70797ddc42dbcb064d83ce8cc7) )
|
||||
|
||||
ROM_REGION( 0x0400000, "ymsnd:adpcma", 0 ) // ADPCM data
|
||||
ROM_LOAD( "lh5388r1.u53", 0x0000000, 0x100000, CRC(765d892f) SHA1(9b078c879d0437d1669bf4301fd52a768aa4d293) )
|
||||
|
||||
ROM_REGION( 0x400000, "ymsnd:adpcmb", 0 ) // speech
|
||||
ROM_REGION( 0x0400000, "ymsnd:adpcmb", 0 ) // speech
|
||||
ROM_LOAD( "lh536pkl.u51", 0x0000000, 0x300000, CRC(e4919abf) SHA1(d6af4b9c6ff62f92216c9927027d3b2376416bae) )
|
||||
ROM_END
|
||||
|
||||
} // Anonymous namespace
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
@ -1,81 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Takahiro Nogi
|
||||
#ifndef MAME_INCLUDES_INUFUKU_H
|
||||
#define MAME_INCLUDES_INUFUKU_H
|
||||
|
||||
#include "video/vsystem_spr.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "emupal.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class inufuku_state : public driver_device
|
||||
{
|
||||
public:
|
||||
inufuku_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_bg_videoram(*this, "bg_videoram"),
|
||||
m_bg_rasterram(*this, "bg_rasterram"),
|
||||
m_tx_videoram(*this, "tx_videoram"),
|
||||
m_spriteram1(*this, "spriteram1"),
|
||||
m_spriteram2(*this, "spriteram2"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette"),
|
||||
m_spr(*this, "vsystem_spr"),
|
||||
m_soundlatch(*this, "soundlatch") { }
|
||||
|
||||
void inufuku(machine_config &config);
|
||||
void _3on3dunk(machine_config &config);
|
||||
|
||||
DECLARE_READ_LINE_MEMBER(soundflag_r);
|
||||
|
||||
private:
|
||||
/* memory pointers */
|
||||
required_shared_ptr<uint16_t> m_bg_videoram;
|
||||
required_shared_ptr<uint16_t> m_bg_rasterram;
|
||||
required_shared_ptr<uint16_t> m_tx_videoram;
|
||||
required_shared_ptr<uint16_t> m_spriteram1;
|
||||
required_shared_ptr<uint16_t> m_spriteram2;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *m_bg_tilemap;
|
||||
tilemap_t *m_tx_tilemap;
|
||||
int m_bg_scrollx;
|
||||
int m_bg_scrolly;
|
||||
int m_tx_scrollx;
|
||||
int m_tx_scrolly;
|
||||
int m_bg_raster;
|
||||
int m_bg_palettebank;
|
||||
int m_tx_palettebank;
|
||||
std::unique_ptr<uint16_t[]> m_spriteram1_old;
|
||||
uint32_t inufuku_tile_callback( uint32_t code );
|
||||
|
||||
/* devices */
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device<vsystem_spr_device> m_spr;
|
||||
required_device<generic_latch_8_device> m_soundlatch;
|
||||
|
||||
void inufuku_soundrombank_w(uint8_t data);
|
||||
void inufuku_palettereg_w(offs_t offset, uint16_t data);
|
||||
void inufuku_scrollreg_w(offs_t offset, uint16_t data);
|
||||
uint16_t inufuku_bg_videoram_r(offs_t offset);
|
||||
void inufuku_bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
||||
uint16_t inufuku_tx_videoram_r(offs_t offset);
|
||||
void inufuku_tx_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
||||
TILE_GET_INFO_MEMBER(get_inufuku_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_inufuku_tx_tile_info);
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
uint32_t screen_update_inufuku(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(screen_vblank_inufuku);
|
||||
void inufuku_map(address_map &map);
|
||||
void inufuku_sound_io_map(address_map &map);
|
||||
void inufuku_sound_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_INUFUKU_H
|
@ -1,173 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Takahiro Nogi
|
||||
/******************************************************************************
|
||||
|
||||
Video Hardware for Video System Games.
|
||||
|
||||
Quiz & Variety Sukusuku Inufuku
|
||||
(c)1998 Video System Co.,Ltd.
|
||||
|
||||
Driver by Takahiro Nogi <nogi@kt.rim.or.jp> 2003/08/09 -
|
||||
|
||||
based on other Video System drivers
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "includes/inufuku.h"
|
||||
#include "screen.h"
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Memory handlers
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
void inufuku_state::inufuku_palettereg_w(offs_t offset, uint16_t data)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0x02: m_bg_palettebank = (data & 0xf000) >> 12;
|
||||
m_bg_tilemap->mark_all_dirty();
|
||||
break;
|
||||
case 0x03: m_tx_palettebank = (data & 0xf000) >> 12;
|
||||
m_tx_tilemap->mark_all_dirty();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void inufuku_state::inufuku_scrollreg_w(offs_t offset, uint16_t data)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00: m_bg_scrollx = data + 1; break;
|
||||
case 0x01: m_bg_scrolly = data + 0; break;
|
||||
case 0x02: m_tx_scrollx = data - 3; break;
|
||||
case 0x03: m_tx_scrolly = data + 1; break;
|
||||
case 0x04: m_bg_raster = (data & 0x0200) ? 0 : 1; break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Sprite routines
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Tilemap callbacks
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
TILE_GET_INFO_MEMBER(inufuku_state::get_inufuku_bg_tile_info)
|
||||
{
|
||||
tileinfo.set(0,
|
||||
m_bg_videoram[tile_index],
|
||||
m_bg_palettebank,
|
||||
0);
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(inufuku_state::get_inufuku_tx_tile_info)
|
||||
{
|
||||
tileinfo.set(1,
|
||||
m_tx_videoram[tile_index],
|
||||
m_tx_palettebank,
|
||||
0);
|
||||
}
|
||||
|
||||
uint16_t inufuku_state::inufuku_bg_videoram_r(offs_t offset)
|
||||
{
|
||||
return m_bg_videoram[offset];
|
||||
}
|
||||
|
||||
void inufuku_state::inufuku_bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||
{
|
||||
COMBINE_DATA(&m_bg_videoram[offset]);
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
uint16_t inufuku_state::inufuku_tx_videoram_r(offs_t offset)
|
||||
{
|
||||
return m_tx_videoram[offset];
|
||||
}
|
||||
|
||||
void inufuku_state::inufuku_tx_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_videoram[offset]);
|
||||
m_tx_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
|
||||
uint32_t inufuku_state::inufuku_tile_callback( uint32_t code )
|
||||
{
|
||||
return ((m_spriteram2[code*2] & 0x0007) << 16) + m_spriteram2[(code*2)+ 1];
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Start the video hardware emulation
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
void inufuku_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(inufuku_state::get_inufuku_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
|
||||
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(inufuku_state::get_inufuku_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
|
||||
|
||||
m_bg_tilemap->set_transparent_pen(255);
|
||||
m_tx_tilemap->set_transparent_pen(255);
|
||||
|
||||
m_spriteram1_old = make_unique_clear<uint16_t[]>(m_spriteram1.bytes()/2);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
Display refresh
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
uint32_t inufuku_state::screen_update_inufuku(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
int i;
|
||||
|
||||
bitmap.fill(m_palette->black_pen(), cliprect);
|
||||
screen.priority().fill(0);
|
||||
|
||||
if (m_bg_raster)
|
||||
{
|
||||
m_bg_tilemap->set_scroll_rows(512);
|
||||
for (i = 0; i < 256; i++)
|
||||
m_bg_tilemap->set_scrollx((m_bg_scrolly + i) & 0x1ff, m_bg_scrollx+m_bg_rasterram[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bg_tilemap->set_scroll_rows(1);
|
||||
m_bg_tilemap->set_scrollx(0, m_bg_scrollx);
|
||||
}
|
||||
m_bg_tilemap->set_scrolly(0, m_bg_scrolly);
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
|
||||
m_tx_tilemap->set_scrollx(0, m_tx_scrollx);
|
||||
m_tx_tilemap->set_scrolly(0, m_tx_scrolly);
|
||||
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
|
||||
|
||||
m_spr->draw_sprites( m_spriteram1_old.get(), m_spriteram1.bytes(), screen, bitmap, cliprect );
|
||||
return 0;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(inufuku_state::screen_vblank_inufuku)
|
||||
{
|
||||
// rising edge
|
||||
if (state)
|
||||
{
|
||||
memcpy(m_spriteram1_old.get(),m_spriteram1,m_spriteram1.bytes());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user