lviv, gaplus: machine().device cleanup, other cleanup, nw

This commit is contained in:
mooglyguy 2018-06-12 07:04:57 +02:00
parent 62fc2e8f06
commit 108c36547c
8 changed files with 379 additions and 381 deletions

View File

@ -161,7 +161,7 @@ TODO:
#include "speaker.h"
WRITE8_MEMBER(gaplus_state::irq_1_ctrl_w)
WRITE8_MEMBER(gaplus_base_state::irq_1_ctrl_w)
{
int bit = !BIT(offset, 11);
m_main_irq_mask = bit & 1;
@ -169,7 +169,7 @@ WRITE8_MEMBER(gaplus_state::irq_1_ctrl_w)
m_maincpu->set_input_line(0, CLEAR_LINE);
}
WRITE8_MEMBER(gaplus_state::irq_2_ctrl_w)
WRITE8_MEMBER(gaplus_base_state::irq_2_ctrl_w)
{
int bit = offset & 1;
m_sub_irq_mask = bit & 1;
@ -177,7 +177,7 @@ WRITE8_MEMBER(gaplus_state::irq_2_ctrl_w)
m_subcpu->set_input_line(0, CLEAR_LINE);
}
WRITE8_MEMBER(gaplus_state::irq_3_ctrl_w)
WRITE8_MEMBER(gaplus_base_state::irq_3_ctrl_w)
{
int bit = !BIT(offset, 13);
m_sub2_irq_mask = bit & 1;
@ -185,7 +185,7 @@ WRITE8_MEMBER(gaplus_state::irq_3_ctrl_w)
m_subcpu2->set_input_line(0, CLEAR_LINE);
}
WRITE8_MEMBER(gaplus_state::sreset_w)
WRITE8_MEMBER(gaplus_base_state::sreset_w)
{
int bit = !BIT(offset, 11);
m_subcpu->set_input_line(INPUT_LINE_RESET, bit ? CLEAR_LINE : ASSERT_LINE);
@ -193,7 +193,7 @@ WRITE8_MEMBER(gaplus_state::sreset_w)
m_namco_15xx->sound_enable_w(bit);
}
WRITE8_MEMBER(gaplus_state::freset_w)
WRITE8_MEMBER(gaplus_base_state::freset_w)
{
int bit = !BIT(offset, 11);
@ -203,14 +203,14 @@ WRITE8_MEMBER(gaplus_state::freset_w)
m_namco56xx->set_reset_line(bit ? CLEAR_LINE : ASSERT_LINE);
}
void gaplus_state::machine_reset()
void gaplus_base_state::machine_reset()
{
/* on reset, VINTON is reset, while the other flags don't seem to be affected */
m_sub_irq_mask = 0;
m_subcpu->set_input_line(0, CLEAR_LINE);
}
void gaplus_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
void gaplus_base_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch (id)
{
@ -221,21 +221,21 @@ void gaplus_state::device_timer(emu_timer &timer, device_timer_id id, int param,
namcoio1_run(ptr, param);
break;
default:
assert_always(false, "Unknown id in gaplus_state::device_timer");
assert_always(false, "Unknown id in gaplus_base_state::device_timer");
}
}
TIMER_CALLBACK_MEMBER(gaplus_state::namcoio0_run)
TIMER_CALLBACK_MEMBER(gaplus_base_state::namcoio0_run)
{
m_namco58xx->customio_run();
}
TIMER_CALLBACK_MEMBER(gaplus_state::namcoio1_run)
TIMER_CALLBACK_MEMBER(gaplus_base_state::namcoio1_run)
{
m_namco56xx->customio_run();
}
WRITE_LINE_MEMBER(gaplus_state::vblank_irq)
WRITE_LINE_MEMBER(gaplus_base_state::vblank_irq)
{
if (!state)
return;
@ -256,7 +256,7 @@ WRITE_LINE_MEMBER(gaplus_state::vblank_irq)
m_subcpu2->set_input_line(0, ASSERT_LINE);
}
WRITE_LINE_MEMBER(gaplus_state::gapluso_vblank_irq)
WRITE_LINE_MEMBER(gapluso_state::vblank_irq)
{
if (!state)
return;
@ -278,36 +278,36 @@ WRITE_LINE_MEMBER(gaplus_state::gapluso_vblank_irq)
}
void gaplus_state::cpu1_map(address_map &map)
void gaplus_base_state::cpu1_map(address_map &map)
{
map(0x0000, 0x07ff).ram().w(FUNC(gaplus_state::videoram_w)).share("videoram"); /* tilemap RAM (shared with CPU #2) */
map(0x0000, 0x07ff).ram().w(FUNC(gaplus_base_state::videoram_w)).share("videoram"); /* tilemap RAM (shared with CPU #2) */
map(0x0800, 0x1fff).ram().share("spriteram"); /* shared RAM with CPU #2 (includes sprite RAM) */
map(0x6000, 0x63ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); /* shared RAM with CPU #3 */
map(0x6800, 0x680f).rw("namcoio_1", FUNC(namcoio_device::read), FUNC(namcoio_device::write)); /* custom I/O chips interface */
map(0x6810, 0x681f).rw("namcoio_2", FUNC(namcoio_device::read), FUNC(namcoio_device::write)); /* custom I/O chips interface */
map(0x6820, 0x682f).rw(FUNC(gaplus_state::customio_3_r), FUNC(gaplus_state::customio_3_w)).share("customio_3"); /* custom I/O chip #3 interface */
map(0x7000, 0x7fff).w(FUNC(gaplus_state::irq_1_ctrl_w)); /* main CPU irq control */
map(0x6820, 0x682f).rw(FUNC(gaplus_base_state::customio_3_r), FUNC(gaplus_base_state::customio_3_w)).share("customio_3"); /* custom I/O chip #3 interface */
map(0x7000, 0x7fff).w(FUNC(gaplus_base_state::irq_1_ctrl_w)); /* main CPU irq control */
map(0x7800, 0x7fff).r("watchdog", FUNC(watchdog_timer_device::reset_r));
map(0x8000, 0x8fff).w(FUNC(gaplus_state::sreset_w)); /* reset CPU #2 & #3, enable sound */
map(0x9000, 0x9fff).w(FUNC(gaplus_state::freset_w)); /* reset I/O chips */
map(0xa000, 0xa7ff).w(FUNC(gaplus_state::starfield_control_w)); /* starfield control */
map(0x8000, 0x8fff).w(FUNC(gaplus_base_state::sreset_w)); /* reset CPU #2 & #3, enable sound */
map(0x9000, 0x9fff).w(FUNC(gaplus_base_state::freset_w)); /* reset I/O chips */
map(0xa000, 0xa7ff).w(FUNC(gaplus_base_state::starfield_control_w)); /* starfield control */
map(0xa000, 0xffff).rom(); /* ROM */
}
void gaplus_state::cpu2_map(address_map &map)
void gaplus_base_state::cpu2_map(address_map &map)
{
map(0x0000, 0x07ff).ram().w(FUNC(gaplus_state::videoram_w)).share("videoram"); /* tilemap RAM (shared with CPU #1) */
map(0x0000, 0x07ff).ram().w(FUNC(gaplus_base_state::videoram_w)).share("videoram"); /* tilemap RAM (shared with CPU #1) */
map(0x0800, 0x1fff).ram().share("spriteram"); /* shared RAM with CPU #1 */
// AM_RANGE(0x500f, 0x500f) AM_WRITENOP /* ??? written 256 times on startup */
map(0x6000, 0x6fff).w(FUNC(gaplus_state::irq_2_ctrl_w)); /* IRQ 2 control */
map(0x6000, 0x6fff).w(FUNC(gaplus_base_state::irq_2_ctrl_w)); /* IRQ 2 control */
map(0xa000, 0xffff).rom(); /* ROM */
}
void gaplus_state::cpu3_map(address_map &map)
void gaplus_base_state::cpu3_map(address_map &map)
{
map(0x0000, 0x03ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); /* shared RAM with the main CPU + sound registers */
map(0x2000, 0x3fff).rw("watchdog", FUNC(watchdog_timer_device::reset_r), FUNC(watchdog_timer_device::reset_w)); /* watchdog? */
map(0x4000, 0x7fff).w(FUNC(gaplus_state::irq_3_ctrl_w)); /* interrupt enable/disable */
map(0x4000, 0x7fff).w(FUNC(gaplus_base_state::irq_3_ctrl_w)); /* interrupt enable/disable */
map(0xe000, 0xffff).rom(); /* ROM */
}
@ -497,35 +497,26 @@ WRITE8_MEMBER(gaplus_state::out_lamps1)
machine().bookkeeping().coin_counter_w(1, ~data & 1);
}
void gaplus_state::machine_start()
void gaplus_base_state::machine_start()
{
m_lamps.resolve();
m_namcoio0_run_timer = timer_alloc(TIMER_NAMCOIO0_RUN);
m_namcoio1_run_timer = timer_alloc(TIMER_NAMCOIO1_RUN);
switch (m_type)
{
case GAME_GALAGA3:
case GAME_GAPLUS:
m_namco56xx = machine().device<namco56xx_device>("namcoio_1");
m_namco58xx = machine().device<namco58xx_device>("namcoio_2");
break;
case GAME_GAPLUSD:
m_namco58xx = machine().device<namco58xx_device>("namcoio_1");
m_namco56xx = machine().device<namco56xx_device>("namcoio_2");
break;
}
save_item(NAME(m_main_irq_mask));
save_item(NAME(m_sub_irq_mask));
save_item(NAME(m_sub2_irq_mask));
}
void gaplus_state::machine_start()
{
gaplus_base_state::machine_start();
MACHINE_CONFIG_START(gaplus_state::gaplus)
m_lamps.resolve();
}
MACHINE_CONFIG_START(gaplus_base_state::gaplus_base)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(24'576'000)/16) /* 1.536 MHz */
MCFG_DEVICE_ADD(m_maincpu, MC6809E, XTAL(24'576'000) / 16) /* 1.536 MHz */
MCFG_DEVICE_PROGRAM_MAP(cpu1_map)
MCFG_DEVICE_ADD("sub", MC6809E, XTAL(24'576'000) / 16) /* 1.536 MHz */
@ -538,27 +529,13 @@ MACHINE_CONFIG_START(gaplus_state::gaplus)
MCFG_WATCHDOG_ADD("watchdog")
MCFG_DEVICE_ADD("namcoio_1", NAMCO_56XX, 0)
MCFG_NAMCO56XX_IN_0_CB(IOPORT("COINS"))
MCFG_NAMCO56XX_IN_1_CB(IOPORT("P1"))
MCFG_NAMCO56XX_IN_2_CB(IOPORT("P2"))
MCFG_NAMCO56XX_IN_3_CB(IOPORT("BUTTONS"))
MCFG_NAMCO56XX_OUT_0_CB(WRITE8(*this, gaplus_state, out_lamps0))
MCFG_NAMCO56XX_OUT_1_CB(WRITE8(*this, gaplus_state, out_lamps1))
MCFG_DEVICE_ADD("namcoio_2", NAMCO_58XX, 0)
MCFG_NAMCO58XX_IN_0_CB(IOPORT("DSWA_HIGH"))
MCFG_NAMCO58XX_IN_1_CB(IOPORT("DSWB_LOW"))
MCFG_NAMCO58XX_IN_2_CB(IOPORT("DSWB_HIGH"))
MCFG_NAMCO58XX_IN_3_CB(IOPORT("DSWA_LOW"))
MCFG_NAMCO_62XX_ADD("62xx", 24576000 / 6 / 2) /* totally made up - TODO: fix */
//MCFG_NAMCO_62XX_INPUT_0_CB(IOPORT("IN0L"))
//MCFG_NAMCO_62XX_INPUT_1_CB(IOPORT("IN0H"))
//MCFG_NAMCO_62XX_INPUT_2_CB(IOPORT("IN1L"))
//MCFG_NAMCO_62XX_INPUT_3_CB(IOPORT("IN1H"))
//MCFG_NAMCO_62XX_OUTPUT_0_CB(WRITE8(*this, gaplus_state,out_0))
//MCFG_NAMCO_62XX_OUTPUT_1_CB(WRITE8(*this, gaplus_state,out_1))
//MCFG_NAMCO_62XX_OUTPUT_0_CB(WRITE8(*this, gaplus_base_state,out_0))
//MCFG_NAMCO_62XX_OUTPUT_1_CB(WRITE8(*this, gaplus_base_state,out_1))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -566,15 +543,15 @@ MACHINE_CONFIG_START(gaplus_state::gaplus)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(36 * 8, 28 * 8)
MCFG_SCREEN_VISIBLE_AREA(0 * 8, 36 * 8 - 1, 0 * 8, 28 * 8 - 1)
MCFG_SCREEN_UPDATE_DRIVER(gaplus_state, screen_update)
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, gaplus_state, screen_vblank))
MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(*this, gaplus_state, vblank_irq))
MCFG_SCREEN_UPDATE_DRIVER(gaplus_base_state, screen_update)
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, gaplus_base_state, screen_vblank))
MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(*this, gaplus_base_state, vblank_irq))
MCFG_SCREEN_PALETTE("palette")
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_gaplus)
MCFG_PALETTE_ADD("palette", 64 * 4 + 64 * 8)
MCFG_PALETTE_INDIRECT_ENTRIES(256)
MCFG_PALETTE_INIT_OWNER(gaplus_state, gaplus)
MCFG_PALETTE_INIT_OWNER(gaplus_base_state, gaplus)
/* sound hardware */
SPEAKER(config, "mono").front_center();
@ -589,37 +566,55 @@ MACHINE_CONFIG_START(gaplus_state::gaplus)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(gaplus_state::gaplusd)
gaplus(config);
MACHINE_CONFIG_START(gaplus_state::gaplus)
gaplus_base(config);
MCFG_DEVICE_REPLACE("namcoio_1", NAMCO_58XX, 0)
MCFG_DEVICE_ADD("namcoio_1", NAMCO_56XX, 0)
MCFG_NAMCO56XX_IN_0_CB(IOPORT("COINS"))
MCFG_NAMCO56XX_IN_1_CB(IOPORT("P1"))
MCFG_NAMCO56XX_IN_2_CB(IOPORT("P2"))
MCFG_NAMCO56XX_IN_3_CB(IOPORT("BUTTONS"))
MCFG_NAMCO56XX_OUT_0_CB(WRITE8(*this, gaplus_state, out_lamps0))
MCFG_NAMCO56XX_OUT_1_CB(WRITE8(*this, gaplus_state, out_lamps1))
MCFG_DEVICE_ADD("namcoio_2", NAMCO_58XX, 0)
MCFG_NAMCO58XX_IN_0_CB(IOPORT("DSWA_HIGH"))
MCFG_NAMCO58XX_IN_1_CB(IOPORT("DSWB_LOW"))
MCFG_NAMCO58XX_IN_2_CB(IOPORT("DSWB_HIGH"))
MCFG_NAMCO58XX_IN_3_CB(IOPORT("DSWA_LOW"))
MACHINE_CONFIG_END
MACHINE_CONFIG_START(gaplusd_state::gaplusd)
gaplus_base(config);
MCFG_DEVICE_ADD("namcoio_1", NAMCO_58XX, 0)
MCFG_NAMCO58XX_IN_0_CB(IOPORT("COINS"))
MCFG_NAMCO58XX_IN_1_CB(IOPORT("P1"))
MCFG_NAMCO58XX_IN_2_CB(IOPORT("P2"))
MCFG_NAMCO58XX_IN_3_CB(IOPORT("BUTTONS"))
MCFG_DEVICE_REPLACE("namcoio_2", NAMCO_56XX, 0)
MCFG_DEVICE_ADD("namcoio_2", NAMCO_56XX, 0)
MCFG_NAMCO56XX_IN_0_CB(IOPORT("DSWA_HIGH"))
MCFG_NAMCO56XX_IN_1_CB(IOPORT("DSWB_LOW"))
MCFG_NAMCO56XX_IN_2_CB(IOPORT("DSWB_HIGH"))
MCFG_NAMCO56XX_IN_3_CB(IOPORT("DSWA_LOW"))
MACHINE_CONFIG_END
MACHINE_CONFIG_START(gaplus_state::gapluso)
gaplusd(config);
MACHINE_CONFIG_START(gapluso_state::gapluso)
gaplus_base(config);
/* basic machine hardware */
MCFG_DEVICE_MODIFY("screen")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, gaplus_state, screen_vblank))
MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(*this, gaplus_state, gapluso_vblank_irq))
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, gaplus_base_state, screen_vblank))
MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(*this, gapluso_state, vblank_irq))
MCFG_DEVICE_REPLACE("namcoio_1", NAMCO_56XX, 0)
MCFG_DEVICE_ADD("namcoio_1", NAMCO_56XX, 0)
MCFG_NAMCO56XX_IN_0_CB(IOPORT("COINS"))
MCFG_NAMCO56XX_IN_1_CB(IOPORT("P1"))
MCFG_NAMCO56XX_IN_2_CB(IOPORT("P2"))
MCFG_NAMCO56XX_IN_3_CB(IOPORT("BUTTONS"))
MCFG_DEVICE_REPLACE("namcoio_2", NAMCO_58XX, 0)
MCFG_DEVICE_ADD("namcoio_2", NAMCO_58XX, 0)
MCFG_NAMCO58XX_IN_0_CB(IOPORT("DSWA_HIGH"))
MCFG_NAMCO58XX_IN_1_CB(IOPORT("DSWB_LOW"))
MCFG_NAMCO58XX_IN_2_CB(IOPORT("DSWB_HIGH"))
@ -993,44 +988,29 @@ ROM_START( galaga3m ) /* Version (AKA Midway) 1 PCB */
ROM_END
void gaplus_state::init_gaplus()
void gaplus_base_state::driver_init()
{
uint8_t *rom = memregion("gfx1")->base();
uint8_t *rom = m_gfx1_region->base();
for (int i = 0;i < 0x2000;i++)
rom[i + 0x2000] = rom[i] >> 4;
rom = memregion("gfx2")->base() + 0x6000;
rom = m_gfx2_region->base() + 0x6000;
for (int i = 0;i < 0x2000;i++)
rom[i + 0x2000] = rom[i] << 4;
m_type = GAME_GAPLUS;
}
void gaplus_state::init_gaplusd()
{
init_gaplus();
m_type = GAME_GAPLUSD;
}
void gaplus_state::init_galaga3()
{
init_gaplus();
m_type = GAME_GALAGA3;
}
/* These sets are on revision 2 or 3 PCBs AKA "Namco" PCBs */
GAME( 1984, gaplus, 0, gapluso, gapluso, gaplus_state, init_gaplus, ROT90, "Namco", "Gaplus (GP2 rev. B)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, gaplusa, gaplus, gapluso, gapluso, gaplus_state, init_gaplus, ROT90, "Namco", "Gaplus (GP2)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, gaplusd, gaplus, gaplusd, gapluso, gaplus_state, init_gaplusd, ROT90, "Namco", "Gaplus (GP2 rev D, alternate hardware)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3, gaplus, gaplus, gaplus, gaplus_state, init_galaga3, ROT90, "Namco", "Galaga 3 (GP3 rev. D)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3a, gaplus, gaplus, gaplus, gaplus_state, init_galaga3, ROT90, "Namco", "Galaga 3 (GP3 rev. C)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3b, gaplus, gaplus, gaplus, gaplus_state, init_galaga3, ROT90, "Namco", "Galaga 3 (GP3)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, gaplus, 0, gapluso, gapluso, gapluso_state, driver_init, ROT90, "Namco", "Gaplus (GP2 rev. B)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, gaplusa, gaplus, gapluso, gapluso, gapluso_state, driver_init, ROT90, "Namco", "Gaplus (GP2)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, gaplusd, gaplus, gaplusd, gapluso, gaplusd_state, driver_init, ROT90, "Namco", "Gaplus (GP2 rev D, alternate hardware)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3, gaplus, gaplus, gaplus, gaplus_state, driver_init, ROT90, "Namco", "Galaga 3 (GP3 rev. D)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3a, gaplus, gaplus, gaplus, gaplus_state, driver_init, ROT90, "Namco", "Galaga 3 (GP3 rev. C)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3b, gaplus, gaplus, gaplus, gaplus_state, driver_init, ROT90, "Namco", "Galaga 3 (GP3)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
/* These sets are on older revision (AKA Midway) 1 PCBs */
GAME( 1984, galaga3c, gaplus, gaplus, galaga3a, gaplus_state, init_galaga3, ROT90, "Namco", "Galaga 3 (set 4)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3m, gaplus, gaplus, galaga3m, gaplus_state, init_galaga3, ROT90, "Namco", "Galaga 3 (set 5)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3c, gaplus, gaplus, galaga3a, gaplus_state, driver_init, ROT90, "Namco", "Galaga 3 (set 4)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1984, galaga3m, gaplus, gaplus, galaga3m, gaplus_state, driver_init, ROT90, "Namco", "Galaga 3 (set 5)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
/* This is an odd mix of Galaga3 and Gaplus, main code seems closest to galaga3m but still has significant changes, copyright is modified to 1992, has Galaga 3 style high scores, PARSEF spelling error on high score table */
GAME( 1992, gaplust, gaplus, gaplus, galaga3m, gaplus_state, init_galaga3, ROT90, "bootleg (Tecfri)", "Gaplus (Tecfri PCB)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1992, gaplust, gaplus, gaplus, galaga3m, gaplus_state, driver_init, ROT90, "bootleg (Tecfri)", "Gaplus (Tecfri PCB)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )

View File

@ -298,12 +298,12 @@ Timings:
void lviv_state::io_map(address_map &map)
{
map(0x00, 0xff).rw(FUNC(lviv_state::lviv_io_r), FUNC(lviv_state::lviv_io_w));
map(0x00, 0xff).rw(FUNC(lviv_state::io_r), FUNC(lviv_state::io_w));
}
/* memory w/r functions */
void lviv_state::lviv_mem(address_map &map)
void lviv_state::mem_map(address_map &map)
{
map(0x0000, 0x3fff).bankrw(m_bank[0]);
map(0x4000, 0x7fff).bankrw(m_bank[1]);
@ -407,7 +407,7 @@ static INPUT_PORTS_START (lviv)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
PORT_START("RESET") /* CPU */
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_CHANGED_MEMBER(DEVICE_SELF, lviv_state, lviv_reset, 0)
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_CHANGED_MEMBER(DEVICE_SELF, lviv_state, reset_button, 0)
PORT_START("JOY") /* Joystick */
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN)
@ -424,25 +424,25 @@ INPUT_PORTS_END
MACHINE_CONFIG_START(lviv_state::lviv)
/* basic machine hardware */
MCFG_DEVICE_ADD(m_maincpu, I8080, 2500000)
MCFG_DEVICE_PROGRAM_MAP(lviv_mem)
MCFG_DEVICE_PROGRAM_MAP(mem_map)
MCFG_DEVICE_IO_MAP(io_map)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
MCFG_DEVICE_ADD(m_ppi[0], I8255, 0)
MCFG_I8255_IN_PORTA_CB(READ8(*this, lviv_state, lviv_ppi_0_porta_r))
MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, lviv_state, lviv_ppi_0_porta_w))
MCFG_I8255_IN_PORTB_CB(READ8(*this, lviv_state, lviv_ppi_0_portb_r))
MCFG_I8255_OUT_PORTB_CB(WRITE8(*this, lviv_state, lviv_ppi_0_portb_w))
MCFG_I8255_IN_PORTC_CB(READ8(*this, lviv_state, lviv_ppi_0_portc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(*this, lviv_state, lviv_ppi_0_portc_w))
MCFG_I8255_IN_PORTA_CB(READ8(*this, lviv_state, ppi_0_porta_r))
MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, lviv_state, ppi_0_porta_w))
MCFG_I8255_IN_PORTB_CB(READ8(*this, lviv_state, ppi_0_portb_r))
MCFG_I8255_OUT_PORTB_CB(WRITE8(*this, lviv_state, ppi_0_portb_w))
MCFG_I8255_IN_PORTC_CB(READ8(*this, lviv_state, ppi_0_portc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(*this, lviv_state, ppi_0_portc_w))
MCFG_DEVICE_ADD(m_ppi[1], I8255, 0)
MCFG_I8255_IN_PORTA_CB(READ8(*this, lviv_state, lviv_ppi_1_porta_r))
MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, lviv_state, lviv_ppi_1_porta_w))
MCFG_I8255_IN_PORTB_CB(READ8(*this, lviv_state, lviv_ppi_1_portb_r))
MCFG_I8255_OUT_PORTB_CB(WRITE8(*this, lviv_state, lviv_ppi_1_portb_w))
MCFG_I8255_IN_PORTC_CB(READ8(*this, lviv_state, lviv_ppi_1_portc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(*this, lviv_state, lviv_ppi_1_portc_w))
MCFG_I8255_IN_PORTA_CB(READ8(*this, lviv_state, ppi_1_porta_r))
MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, lviv_state, ppi_1_porta_w))
MCFG_I8255_IN_PORTB_CB(READ8(*this, lviv_state, ppi_1_portb_r))
MCFG_I8255_OUT_PORTB_CB(WRITE8(*this, lviv_state, ppi_1_portb_w))
MCFG_I8255_IN_PORTC_CB(READ8(*this, lviv_state, ppi_1_portc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(*this, lviv_state, ppi_1_portc_w))
MCFG_SCREEN_ADD(m_screen, RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
@ -451,10 +451,10 @@ MACHINE_CONFIG_START(lviv_state::lviv)
/* video hardware */
MCFG_SCREEN_SIZE(256, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
MCFG_SCREEN_UPDATE_DRIVER(lviv_state, screen_update_lviv)
MCFG_SCREEN_UPDATE_DRIVER(lviv_state, screen_update)
MCFG_SCREEN_PALETTE(m_palette)
MCFG_PALETTE_ADD(m_palette, sizeof (lviv_palette) / 3)
MCFG_PALETTE_ADD(m_palette, sizeof (s_palette) / 3)
MCFG_PALETTE_INIT_OWNER(lviv_state, lviv)
/* sound hardware */

View File

@ -13,7 +13,7 @@ struct star {
};
class gaplus_state : public driver_device
class gaplus_base_state : public driver_device
{
public:
enum
@ -22,27 +22,24 @@ public:
TIMER_NAMCOIO1_RUN
};
enum
{
GAME_GAPLUS = 0,
GAME_GAPLUSD,
GAME_GALAGA3
};
gaplus_state(const machine_config &mconfig, device_type type, const char *tag)
gaplus_base_state(const machine_config &mconfig, device_type type, const char *tag, const char *namco56xx_tag, const char *namco58xx_tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_subcpu(*this, "sub")
, m_subcpu2(*this, "sub2")
, m_namco56xx(*this, namco56xx_tag)
, m_namco58xx(*this, namco58xx_tag)
, m_namco_15xx(*this, "namco")
, m_samples(*this, "samples")
, m_gfxdecode(*this, "gfxdecode")
, m_screen(*this, "screen")
, m_palette(*this, "palette")
, m_proms_region(*this, "proms")
, m_customio_3(*this, "customio_3")
, m_videoram(*this, "videoram")
, m_spriteram(*this, "spriteram")
, m_lamps(*this, "lamp%u", 0U)
, m_gfx1_region(*this, "gfx1")
, m_gfx2_region(*this, "gfx2")
{ }
DECLARE_WRITE8_MEMBER(irq_1_ctrl_w);
@ -54,19 +51,13 @@ public:
DECLARE_READ8_MEMBER(customio_3_r);
DECLARE_WRITE8_MEMBER(videoram_w);
DECLARE_WRITE8_MEMBER(starfield_control_w);
DECLARE_WRITE8_MEMBER(out_lamps0);
DECLARE_WRITE8_MEMBER(out_lamps1);
void init_gaplus();
void init_gaplusd();
void init_galaga3();
DECLARE_PALETTE_INIT(gaplus);
TILEMAP_MAPPER_MEMBER(tilemap_scan);
TILE_GET_INFO_MEMBER(get_tile_info);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
DECLARE_WRITE_LINE_MEMBER(gapluso_vblank_irq);
TIMER_CALLBACK_MEMBER(namcoio0_run);
TIMER_CALLBACK_MEMBER(namcoio1_run);
@ -74,14 +65,15 @@ public:
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
void starfield_init();
void starfield_render(bitmap_ind16 &bitmap);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect ) const;
void gapluso(machine_config &config);
void gaplusd(machine_config &config);
void gaplus(machine_config &config);
void gaplus_base(machine_config &config);
void cpu1_map(address_map &map);
void cpu2_map(address_map &map);
void cpu3_map(address_map &map);
virtual void driver_init() override;
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
virtual void machine_start() override;
@ -91,18 +83,20 @@ protected:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
required_device<cpu_device> m_subcpu2;
required_device<namco56xx_device> m_namco56xx;
required_device<namco58xx_device> m_namco58xx;
required_device<namco_15xx_device> m_namco_15xx;
required_device<samples_device> m_samples;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
namco58xx_device *m_namco58xx;
namco56xx_device *m_namco56xx;
required_memory_region m_proms_region;
required_shared_ptr<uint8_t> m_customio_3;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
output_finder<2> m_lamps;
required_memory_region m_gfx1_region;
required_memory_region m_gfx2_region;
int m_type;
@ -116,3 +110,45 @@ protected:
emu_timer *m_namcoio0_run_timer;
emu_timer *m_namcoio1_run_timer;
};
class gaplusd_state : public gaplus_base_state
{
public:
gaplusd_state(const machine_config &mconfig, device_type type, const char *tag)
: gaplus_base_state(mconfig, type, tag, "namcoio_2", "namcoio_1")
{
}
void gaplusd(machine_config &config);
};
class gapluso_state : public gaplus_base_state {
public:
gapluso_state(const machine_config &mconfig, device_type type, const char *tag)
: gaplus_base_state(mconfig, type, tag, "namcoio_1", "namcoio_2") {
}
void gapluso(machine_config &config);
protected:
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
};
class gaplus_state : public gaplus_base_state {
public:
gaplus_state(const machine_config &mconfig, device_type type, const char *tag)
: gaplus_base_state(mconfig, type, tag, "namcoio_1", "namcoio_2")
, m_lamps(*this, "lamp%u", 0U)
{
}
void gaplus(machine_config &config);
protected:
virtual void machine_start() override;
DECLARE_WRITE8_MEMBER(out_lamps0);
DECLARE_WRITE8_MEMBER(out_lamps1);
output_finder<2> m_lamps;
};

View File

@ -20,42 +20,59 @@ class lviv_state : public driver_device
{
public:
lviv_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ram(*this, RAM_TAG),
m_ppi(*this, "ppi8255_%u", 0U),
m_speaker(*this, "speaker"),
m_cassette(*this, "cassette"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_maincpu_region(*this, "maincpu"),
m_bank(*this, "bank%u", 1U),
m_key(*this, "KEY%u", 0U),
m_joy_port(*this, "JOY")
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_ram(*this, RAM_TAG)
, m_ppi(*this, "ppi8255_%u", 0U)
, m_speaker(*this, "speaker")
, m_cassette(*this, "cassette")
, m_screen(*this, "screen")
, m_palette(*this, "palette")
, m_maincpu_region(*this, "maincpu")
, m_bank(*this, "bank%u", 1U)
, m_key(*this, "KEY%u", 0U)
, m_joy_port(*this, "JOY")
{ }
unsigned char * m_video_ram;
unsigned short m_colortable[1][4];
uint8_t m_ppi_port_outputs[2][3];
uint8_t m_startup_mem_map;
DECLARE_READ8_MEMBER(lviv_io_r);
DECLARE_WRITE8_MEMBER(lviv_io_w);
void lviv(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
protected:
virtual void machine_reset() override;
virtual void video_start() override;
DECLARE_PALETTE_INIT(lviv);
uint32_t screen_update_lviv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_READ8_MEMBER(lviv_ppi_0_porta_r);
DECLARE_READ8_MEMBER(lviv_ppi_0_portb_r);
DECLARE_READ8_MEMBER(lviv_ppi_0_portc_r);
DECLARE_WRITE8_MEMBER(lviv_ppi_0_porta_w);
DECLARE_WRITE8_MEMBER(lviv_ppi_0_portb_w);
DECLARE_WRITE8_MEMBER(lviv_ppi_0_portc_w);
DECLARE_READ8_MEMBER(lviv_ppi_1_porta_r);
DECLARE_READ8_MEMBER(lviv_ppi_1_portb_r);
DECLARE_READ8_MEMBER(lviv_ppi_1_portc_r);
DECLARE_WRITE8_MEMBER(lviv_ppi_1_porta_w);
DECLARE_WRITE8_MEMBER(lviv_ppi_1_portb_w);
DECLARE_WRITE8_MEMBER(lviv_ppi_1_portc_w);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_READ8_MEMBER(io_r);
DECLARE_WRITE8_MEMBER(io_w);
DECLARE_READ8_MEMBER(ppi_0_porta_r);
DECLARE_READ8_MEMBER(ppi_0_portb_r);
DECLARE_READ8_MEMBER(ppi_0_portc_r);
DECLARE_READ8_MEMBER(ppi_1_porta_r);
DECLARE_READ8_MEMBER(ppi_1_portb_r);
DECLARE_READ8_MEMBER(ppi_1_portc_r);
DECLARE_WRITE8_MEMBER(ppi_0_porta_w);
DECLARE_WRITE8_MEMBER(ppi_0_portb_w);
DECLARE_WRITE8_MEMBER(ppi_0_portc_w);
DECLARE_WRITE8_MEMBER(ppi_1_porta_w);
DECLARE_WRITE8_MEMBER(ppi_1_portb_w);
DECLARE_WRITE8_MEMBER(ppi_1_portc_w);
DECLARE_SNAPSHOT_LOAD_MEMBER(lviv);
void update_palette(uint8_t pal);
void update_memory();
void setup_snapshot(uint8_t * data);
void dump_registers();
image_verify_result verify_snapshot(uint8_t * data, uint32_t size);
void io_map(address_map &map);
void mem_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
required_device_array<i8255_device, 2> m_ppi;
@ -68,21 +85,13 @@ public:
required_ioport_array<12> m_key;
required_ioport m_joy_port;
void lviv_update_palette(uint8_t pal);
void lviv_update_memory ();
void lviv_setup_snapshot (uint8_t * data);
void dump_registers();
image_verify_result lviv_verify_snapshot(uint8_t * data, uint32_t size);
DECLARE_SNAPSHOT_LOAD_MEMBER( lviv );
DECLARE_INPUT_CHANGED_MEMBER(lviv_reset);
void lviv(machine_config &config);
void io_map(address_map &map);
void lviv_mem(address_map &map);
};
uint8_t* m_video_ram;
uint16_t m_colortable[1][4];
uint8_t m_ppi_port_outputs[2][3];
uint8_t m_startup_mem_map;
/*----------- defined in video/lviv.c -----------*/
extern const unsigned char lviv_palette[8*3];
static const uint8_t s_palette[8*3];
};
#endif // MAME_INCLUDES_LVIV_H

View File

@ -20,7 +20,7 @@
* *
************************************************************************************/
WRITE8_MEMBER(gaplus_state::customio_3_w)
WRITE8_MEMBER(gaplus_base_state::customio_3_w)
{
if ((offset == 0x09) && (data >= 0x0f))
m_samples->start(0,0);
@ -29,7 +29,7 @@ WRITE8_MEMBER(gaplus_state::customio_3_w)
}
READ8_MEMBER(gaplus_state::customio_3_r)
READ8_MEMBER(gaplus_base_state::customio_3_r)
{
int mode = m_customio_3[8];

View File

@ -20,7 +20,7 @@
#define LVIV_SNAPSHOT_SIZE 82219
void lviv_state::lviv_update_memory()
void lviv_state::update_memory()
{
uint8_t *ram = m_ram->pointer();
@ -36,22 +36,22 @@ void lviv_state::lviv_update_memory()
}
}
INPUT_CHANGED_MEMBER(lviv_state::lviv_reset)
INPUT_CHANGED_MEMBER(lviv_state::reset_button)
{
machine().schedule_soft_reset();
}
READ8_MEMBER(lviv_state::lviv_ppi_0_porta_r)
READ8_MEMBER(lviv_state::ppi_0_porta_r)
{
return 0xff;
}
READ8_MEMBER(lviv_state::lviv_ppi_0_portb_r)
READ8_MEMBER(lviv_state::ppi_0_portb_r)
{
return 0xff;
}
READ8_MEMBER(lviv_state::lviv_ppi_0_portc_r)
READ8_MEMBER(lviv_state::ppi_0_portc_r)
{
uint8_t data = m_ppi_port_outputs[0][2] & 0x0f;
if (m_cassette->input() > 0.038)
@ -61,32 +61,32 @@ READ8_MEMBER(lviv_state::lviv_ppi_0_portc_r)
return data;
}
WRITE8_MEMBER(lviv_state::lviv_ppi_0_porta_w)
WRITE8_MEMBER(lviv_state::ppi_0_porta_w)
{
m_ppi_port_outputs[0][0] = data;
}
WRITE8_MEMBER(lviv_state::lviv_ppi_0_portb_w)
WRITE8_MEMBER(lviv_state::ppi_0_portb_w)
{
m_ppi_port_outputs[0][1] = data;
lviv_update_palette(data&0x7f);
update_palette(data&0x7f);
}
WRITE8_MEMBER(lviv_state::lviv_ppi_0_portc_w)/* tape in/out, video memory on/off */
WRITE8_MEMBER(lviv_state::ppi_0_portc_w)/* tape in/out, video memory on/off */
{
m_ppi_port_outputs[0][2] = data;
if (m_ppi_port_outputs[0][1]&0x80)
m_speaker->level_w(data & 0x01);
m_cassette->output((data & 0x01) ? -1.0 : 1.0);
lviv_update_memory();
update_memory();
}
READ8_MEMBER(lviv_state::lviv_ppi_1_porta_r)
READ8_MEMBER(lviv_state::ppi_1_porta_r)
{
return 0xff;
}
READ8_MEMBER(lviv_state::lviv_ppi_1_portb_r)/* keyboard reading */
READ8_MEMBER(lviv_state::ppi_1_portb_r)/* keyboard reading */
{
return ((m_ppi_port_outputs[1][0] & 0x01) ? 0xff : m_key[0]->read()) &
((m_ppi_port_outputs[1][0] & 0x02) ? 0xff : m_key[1]->read()) &
@ -98,7 +98,7 @@ READ8_MEMBER(lviv_state::lviv_ppi_1_portb_r)/* keyboard reading */
((m_ppi_port_outputs[1][0] & 0x80) ? 0xff : m_key[7]->read());
}
READ8_MEMBER(lviv_state::lviv_ppi_1_portc_r)/* keyboard reading */
READ8_MEMBER(lviv_state::ppi_1_portc_r)/* keyboard reading */
{
return ((m_ppi_port_outputs[1][2] & 0x01) ? 0xff : m_key[ 8]->read()) &
((m_ppi_port_outputs[1][2] & 0x02) ? 0xff : m_key[ 9]->read()) &
@ -106,24 +106,24 @@ READ8_MEMBER(lviv_state::lviv_ppi_1_portc_r)/* keyboard reading */
((m_ppi_port_outputs[1][2] & 0x08) ? 0xff : m_key[11]->read());
}
WRITE8_MEMBER(lviv_state::lviv_ppi_1_porta_w)/* kayboard scaning */
WRITE8_MEMBER(lviv_state::ppi_1_porta_w)/* kayboard scaning */
{
m_ppi_port_outputs[1][0] = data;
}
WRITE8_MEMBER(lviv_state::lviv_ppi_1_portb_w)
WRITE8_MEMBER(lviv_state::ppi_1_portb_w)
{
m_ppi_port_outputs[1][1] = data;
}
WRITE8_MEMBER(lviv_state::lviv_ppi_1_portc_w)/* kayboard scaning */
WRITE8_MEMBER(lviv_state::ppi_1_portc_w)/* kayboard scaning */
{
m_ppi_port_outputs[1][2] = data;
}
/* I/O */
READ8_MEMBER(lviv_state::lviv_io_r)
READ8_MEMBER(lviv_state::io_r)
{
if (m_startup_mem_map)
{
@ -147,7 +147,7 @@ READ8_MEMBER(lviv_state::lviv_io_r)
}
}
WRITE8_MEMBER(lviv_state::lviv_io_w)
WRITE8_MEMBER(lviv_state::io_w)
{
address_space &cpuspace = m_maincpu->space(AS_PROGRAM);
if (m_startup_mem_map)
@ -223,13 +223,11 @@ Lviv snapshot files (SAV)
1411D - 1412A: ??? (something additional)
*******************************************************************************/
void lviv_state::lviv_setup_snapshot(uint8_t * data)
void lviv_state::setup_snapshot(uint8_t * data)
{
unsigned char lo,hi;
/* Set registers */
lo = data[0x14112] & 0x0ff;
hi = data[0x14111] & 0x0ff;
uint8_t lo = data[0x14112] & 0x0ff;
uint8_t hi = data[0x14111] & 0x0ff;
m_maincpu->set_state_int(i8080_cpu_device::I8085_BC, (hi << 8) | lo);
lo = data[0x14114] & 0x0ff;
hi = data[0x14113] & 0x0ff;
@ -254,9 +252,9 @@ void lviv_state::lviv_setup_snapshot(uint8_t * data)
/* Ports */
m_ppi_port_outputs[0][0] = data[0x14011+0xc0];
m_ppi_port_outputs[0][1] = data[0x14011+0xc1];
lviv_update_palette(m_ppi_port_outputs[0][1]&0x7f);
update_palette(m_ppi_port_outputs[0][1]&0x7f);
m_ppi_port_outputs[0][2] = data[0x14011+0xc2];
lviv_update_memory();
update_memory();
}
void lviv_state::dump_registers()
@ -269,7 +267,7 @@ void lviv_state::dump_registers()
logerror("HL = %04x\n", (unsigned) m_maincpu->state_int(i8080_cpu_device::I8085_HL));
}
image_verify_result lviv_state::lviv_verify_snapshot(uint8_t * data, uint32_t size)
image_verify_result lviv_state::verify_snapshot(uint8_t * data, uint32_t size)
{
const char* tag = "LVOV/DUMP/2.0/";
@ -291,16 +289,16 @@ image_verify_result lviv_state::lviv_verify_snapshot(uint8_t * data, uint32_t si
SNAPSHOT_LOAD_MEMBER(lviv_state, lviv)
{
std::vector<uint8_t> lviv_snapshot_data(LVIV_SNAPSHOT_SIZE);
std::vector<uint8_t> snapshot_data(LVIV_SNAPSHOT_SIZE);
image.fread( &lviv_snapshot_data[0], LVIV_SNAPSHOT_SIZE);
image.fread(&snapshot_data[0], LVIV_SNAPSHOT_SIZE);
if (lviv_verify_snapshot(&lviv_snapshot_data[0], snapshot_size) != image_verify_result::PASS)
if (verify_snapshot(&snapshot_data[0], snapshot_size) != image_verify_result::PASS)
{
return image_init_result::FAIL;
}
lviv_setup_snapshot (&lviv_snapshot_data[0]);
setup_snapshot(&snapshot_data[0]);
dump_registers();

View File

@ -25,33 +25,30 @@
***************************************************************************/
PALETTE_INIT_MEMBER(gaplus_state, gaplus)
PALETTE_INIT_MEMBER(gaplus_base_state, gaplus)
{
const uint8_t *color_prom = memregion("proms")->base();
int i;
for (i = 0;i < 256;i++)
const uint8_t *color_prom = m_proms_region->base();
for (int i = 0; i < 256; i++)
{
int bit0,bit1,bit2,bit3,r,g,b;
/* red component */
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
bit3 = (color_prom[i] >> 3) & 0x01;
r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
int bit0 = BIT(color_prom[i], 0);
int bit1 = BIT(color_prom[i], 1);
int bit2 = BIT(color_prom[i], 2);
int bit3 = BIT(color_prom[i], 3);
int r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
/* green component */
bit0 = (color_prom[i + 0x100] >> 0) & 0x01;
bit1 = (color_prom[i + 0x100] >> 1) & 0x01;
bit2 = (color_prom[i + 0x100] >> 2) & 0x01;
bit3 = (color_prom[i + 0x100] >> 3) & 0x01;
g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
bit0 = BIT(color_prom[i + 0x100], 0);
bit1 = BIT(color_prom[i + 0x100], 1);
bit2 = BIT(color_prom[i + 0x100], 2);
bit3 = BIT(color_prom[i + 0x100], 3);
int g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
/* blue component */
bit0 = (color_prom[i + 0x200] >> 0) & 0x01;
bit1 = (color_prom[i + 0x200] >> 1) & 0x01;
bit2 = (color_prom[i + 0x200] >> 2) & 0x01;
bit3 = (color_prom[i + 0x200] >> 3) & 0x01;
b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
bit0 = BIT(color_prom[i + 0x200], 0);
bit1 = BIT(color_prom[i + 0x200], 1);
bit2 = BIT(color_prom[i + 0x200], 2);
bit3 = BIT(color_prom[i + 0x200], 3);
int b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
@ -60,11 +57,11 @@ PALETTE_INIT_MEMBER(gaplus_state, gaplus)
/* color_prom now points to the beginning of the lookup table */
/* characters use colors 0xf0-0xff */
for (i = 0;i < m_gfxdecode->gfx(0)->colors() * m_gfxdecode->gfx(0)->granularity();i++)
for (int i = 0; i < m_gfxdecode->gfx(0)->colors() * m_gfxdecode->gfx(0)->granularity(); i++)
palette.set_pen_indirect(m_gfxdecode->gfx(0)->colorbase() + i, 0xf0 + (*color_prom++ & 0x0f));
/* sprites */
for (i = 0;i < m_gfxdecode->gfx(1)->colors() * m_gfxdecode->gfx(1)->granularity();i++)
for (int i = 0; i < m_gfxdecode->gfx(1)->colors() * m_gfxdecode->gfx(1)->granularity(); i++)
{
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + i, (color_prom[0] & 0x0f) + ((color_prom[0x200] & 0x0f) << 4));
color_prom++;
@ -80,23 +77,18 @@ PALETTE_INIT_MEMBER(gaplus_state, gaplus)
***************************************************************************/
/* convert from 32x32 to 36x28 */
TILEMAP_MAPPER_MEMBER(gaplus_state::tilemap_scan)
TILEMAP_MAPPER_MEMBER(gaplus_base_state::tilemap_scan)
{
int offs;
row += 2;
col -= 2;
if (col & 0x20)
offs = row + ((col & 0x1f) << 5);
else
offs = col + (row << 5);
return offs;
return row + ((col & 0x1f) << 5);
return col + (row << 5);
}
TILE_GET_INFO_MEMBER(gaplus_state::get_tile_info)
TILE_GET_INFO_MEMBER(gaplus_base_state::get_tile_info)
{
uint8_t attr = m_videoram[tile_index + 0x400];
const uint8_t attr = m_videoram[tile_index + 0x400];
tileinfo.category = (attr & 0x40) >> 6;
tileinfo.group = attr & 0x3f;
SET_TILE_INFO_MEMBER(0,
@ -123,40 +115,38 @@ TILE_GET_INFO_MEMBER(gaplus_state::get_tile_info)
#define SPEED_2 1.0f
#define SPEED_3 2.0f
void gaplus_state::starfield_init()
void gaplus_base_state::starfield_init()
{
struct star *stars = m_stars;
int generator = 0;
int x,y;
int set = 0;
int width = m_screen->width();
int height = m_screen->height();
const int width = m_screen->width();
const int height = m_screen->height();
m_total_stars = 0;
/* precalculate the star background */
/* this comes from the Galaxian hardware, Gaplus is probably different */
for ( y = 0;y < height; y++ ) {
for ( x = width*2 - 1; x >= 0; x--) {
int bit1,bit2;
for (int y = 0; y < height; y++)
{
for (int x = width * 2 - 1; x >= 0; x--)
{
generator <<= 1;
bit1 = (~generator >> 17) & 1;
bit2 = (generator >> 5) & 1;
const int bit1 = (~generator >> 17) & 1;
const int bit2 = (generator >> 5) & 1;
if (bit1 ^ bit2) generator |= 1;
if ( ((~generator >> 16) & 1) && (generator & 0xff) == 0xff) {
int color;
color = (~(generator >> 8)) & 0x3f;
if ( color && m_total_stars < MAX_STARS ) {
stars[m_total_stars].x = x;
stars[m_total_stars].y = y;
stars[m_total_stars].col = color;
stars[m_total_stars].set = set++;
if (BIT(~generator, 16) && (generator & 0xff) == 0xff)
{
const int color = ~(generator >> 8) & 0x3f;
if (color && m_total_stars < MAX_STARS)
{
m_stars[m_total_stars].x = x;
m_stars[m_total_stars].y = y;
m_stars[m_total_stars].col = color;
m_stars[m_total_stars].set = set++;
if (set == 3)
set = 0;
@ -176,7 +166,7 @@ void gaplus_state::starfield_init()
***************************************************************************/
void gaplus_state::video_start()
void gaplus_base_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaplus_state::get_tile_info),this),tilemap_mapper_delegate(FUNC(gaplus_state::tilemap_scan),this),8,8,36,28);
@ -202,16 +192,15 @@ void gaplus_state::video_start()
***************************************************************************/
WRITE8_MEMBER(gaplus_state::videoram_w)
WRITE8_MEMBER(gaplus_base_state::videoram_w)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x3ff);
}
WRITE8_MEMBER(gaplus_state::starfield_control_w)
WRITE8_MEMBER(gaplus_base_state::starfield_control_w)
{
offset &= 3;
m_starfield_control[offset] = data;
m_starfield_control[offset & 3] = data;
}
@ -222,41 +211,35 @@ WRITE8_MEMBER(gaplus_state::starfield_control_w)
***************************************************************************/
void gaplus_state::starfield_render(bitmap_ind16 &bitmap)
void gaplus_base_state::starfield_render(bitmap_ind16 &bitmap)
{
struct star *stars = m_stars;
int i;
int width = m_screen->width();
int height = m_screen->height();
/* check if we're running */
if ((m_starfield_control[0] & 1) == 0)
return;
/* draw the starfields */
for ( i = 0; i < m_total_stars; i++ )
{
int x, y;
const int width = m_screen->width();
const int height = m_screen->height();
x = stars[i].x;
y = stars[i].y;
/* draw the starfields */
for (int i = 0; i < m_total_stars; i++)
{
int x = m_stars[i].x;
int y = m_stars[i].y;
if (x >= 0 && x < width && y >= 0 && y < height)
{
bitmap.pix16(y, x) = stars[i].col;
bitmap.pix16(y, x) = m_stars[i].col;
}
}
}
void gaplus_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect )
void gaplus_base_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect ) const
{
uint8_t *spriteram = m_spriteram + 0x780;
uint8_t *spriteram_2 = spriteram + 0x800;
uint8_t *spriteram_3 = spriteram_2 + 0x800;
int offs;
for (offs = 0;offs < 0x80;offs += 2)
for (int offs = 0;offs < 0x80;offs += 2)
{
/* is it on? */
if ((spriteram_3[offs+1] & 2) == 0)
@ -266,16 +249,15 @@ void gaplus_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
{ 0, 1 },
{ 2, 3 }
};
int sprite = spriteram[offs] | ((spriteram_3[offs] & 0x40) << 2);
int color = spriteram[offs+1] & 0x3f;
int sx = spriteram_2[offs+1] + 0x100 * (spriteram_3[offs+1] & 1) - 71;
const int sprite = spriteram[offs] | ((spriteram_3[offs] & 0x40) << 2);
const int color = spriteram[offs+1] & 0x3f;
const int sx = spriteram_2[offs+1] + 0x100 * (spriteram_3[offs+1] & 1) - 71;
int sy = 256 - spriteram_2[offs] - 8;
int flipx = (spriteram_3[offs] & 0x01);
int flipy = (spriteram_3[offs] & 0x02) >> 1;
int sizex = (spriteram_3[offs] & 0x08) >> 3;
int sizey = (spriteram_3[offs] & 0x20) >> 5;
int duplicate = spriteram_3[offs] & 0x80;
int x,y;
int flipx = BIT(spriteram_3[offs], 0);
int flipy = BIT(spriteram_3[offs], 1);
const int sizex = BIT(spriteram_3[offs], 3);
const int sizey = BIT(spriteram_3[offs], 5);
const int duplicate = spriteram_3[offs] & 0x80;
if (flip_screen())
{
@ -286,9 +268,9 @@ void gaplus_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
sy -= 16 * sizey;
sy = (sy & 0xff) - 32; // fix wraparound
for (y = 0;y <= sizey;y++)
for (int y = 0;y <= sizey; y++)
{
for (x = 0;x <= sizex;x++)
for (int x = 0; x <= sizex; x++)
{
m_gfxdecode->gfx(1)->transmask(bitmap, cliprect,
sprite + (duplicate ? 0 : (gfx_offs[y ^ (sizey * flipy)][x ^ (sizex * flipx)])),
@ -302,7 +284,7 @@ void gaplus_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
}
}
uint32_t gaplus_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t gaplus_base_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
/* flip screen control is embedded in RAM */
flip_screen_set(m_spriteram[0x1f7f - 0x800] & 1);
@ -323,7 +305,7 @@ uint32_t gaplus_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
}
WRITE_LINE_MEMBER(gaplus_state::screen_vblank)/* update starfields */
WRITE_LINE_MEMBER(gaplus_base_state::screen_vblank)/* update starfields */
{
// falling edge
if (!state)

View File

@ -13,7 +13,7 @@
#include "emu.h"
#include "includes/lviv.h"
const unsigned char lviv_palette[8*3] =
const uint8_t lviv_state::s_palette[8*3] =
{
0x00, 0x00, 0x00,
0x00, 0x00, 0xa4,
@ -28,54 +28,46 @@ const unsigned char lviv_palette[8*3] =
PALETTE_INIT_MEMBER(lviv_state, lviv)
{
int i;
for ( i = 0; i < sizeof(lviv_palette) / 3; i++ ) {
m_palette->set_pen_color(i, lviv_palette[i*3], lviv_palette[i*3+1], lviv_palette[i*3+2]);
for (int i = 0; i < sizeof(s_palette) / 3; i++)
{
m_palette->set_pen_color(i, s_palette[i*3], s_palette[i*3+1], s_palette[i*3+2]);
}
}
void lviv_state::lviv_update_palette(uint8_t pal)
void lviv_state::update_palette(uint8_t pal)
{
m_colortable[0][0] = 0;
m_colortable[0][1] = 0;
m_colortable[0][2] = 0;
m_colortable[0][3] = 0;
m_colortable[0][0] |= (((pal>>3)&0x01) == ((pal>>4)&0x01)) ? 0x04 : 0x00;
m_colortable[0][0] |= ((pal>>5)&0x01) ? 0x02 : 0x00;
m_colortable[0][0] |= (((pal>>2)&0x01) == ((pal>>6)&0x01)) ? 0x01 : 0x00;
m_colortable[0][0] |= (BIT(pal, 3) == BIT(pal, 4)) ? 0x04 : 0x00;
m_colortable[0][0] |= BIT(pal, 5) ? 0x02 : 0x00;
m_colortable[0][0] |= (BIT(pal, 2) == BIT(pal, 6)) ? 0x01 : 0x00;
m_colortable[0][1] |= ((pal&0x01) == ((pal>>4)&0x01)) ? 0x04 : 0x00;
m_colortable[0][1] |= ((pal>>5)&0x01) ? 0x02 : 0x00;
m_colortable[0][1] |= ((pal>>6)&0x01) ? 0x00 : 0x01;
m_colortable[0][1] |= (BIT(pal, 0) == BIT(pal, 4)) ? 0x04 : 0x00;
m_colortable[0][1] |= BIT(pal, 5) ? 0x02 : 0x00;
m_colortable[0][1] |= BIT(pal, 6) ? 0x00 : 0x01;
m_colortable[0][2] |= ((pal>>4)&0x01) ? 0x04 : 0x00;
m_colortable[0][2] |= ((pal>>5)&0x01) ? 0x00 : 0x02;
m_colortable[0][2] |= ((pal>>6)&0x01) ? 0x01 : 0x00;
m_colortable[0][2] |= BIT(pal, 4) ? 0x04 : 0x00;
m_colortable[0][2] |= BIT(pal, 5) ? 0x00 : 0x02;
m_colortable[0][2] |= BIT(pal, 6) ? 0x01 : 0x00;
m_colortable[0][3] |= ((pal>>4)&0x01) ? 0x00 : 0x04;
m_colortable[0][3] |= (((pal>>1)&0x01) == ((pal>>5)&0x01)) ? 0x02 : 0x00;
m_colortable[0][3] |= ((pal>>6)&0x01) ? 0x01 : 0x00;
m_colortable[0][3] |= BIT(pal, 4) ? 0x00 : 0x04;
m_colortable[0][3] |= (BIT(pal, 1) == BIT(pal, 5)) ? 0x02 : 0x00;
m_colortable[0][3] |= BIT(pal, 6) ? 0x01 : 0x00;
}
void lviv_state::video_start()
uint32_t lviv_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
}
uint32_t lviv_state::screen_update_lviv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
for (int y = 0; y < 256; y++)
{
int x,y;
int pen;
uint8_t data;
for (y=0; y<256; y++)
for (x=0; x<256; x+=4)
for (int x = 0; x < 256; x += 4)
{
data = m_video_ram[y*64+x/4];
const uint8_t data = m_video_ram[(y << 6) | (x >> 2)];
pen = m_colortable[0][((data & 0x08) >> 3) | ((data & 0x80) >> (3+3))];
int pen = m_colortable[0][((data & 0x08) >> 3) | ((data & 0x80) >> (3+3))];
bitmap.pix16(y, x + 0) = pen;
pen = m_colortable[0][((data & 0x04) >> 2) | ((data & 0x40) >> (2+3))];
@ -87,5 +79,6 @@ uint32_t lviv_state::screen_update_lviv(screen_device &screen, bitmap_ind16 &bit
pen = m_colortable[0][((data & 0x01) >> 0) | ((data & 0x10) >> (0+3))];
bitmap.pix16(y, x + 3) = pen;
}
}
return 0;
}