diff --git a/.gitattributes b/.gitattributes index 3e0365d4043..1a27b7049be 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4788,6 +4788,8 @@ src/mame/video/kan_panb.h svneol=native#text/plain src/mame/video/kan_pand.c svneol=native#text/plain src/mame/video/kan_pand.h svneol=native#text/plain src/mame/video/kaneko16.c svneol=native#text/plain +src/mame/video/kaneko_spr.c svneol=native#text/plain +src/mame/video/kaneko_spr.h svneol=native#text/plain src/mame/video/kaneko_tmap.c svneol=native#text/plain src/mame/video/kaneko_tmap.h svneol=native#text/plain src/mame/video/kangaroo.c svneol=native#text/plain diff --git a/src/mame/drivers/expro02.c b/src/mame/drivers/expro02.c index 8c827da5f21..e6bde04e189 100644 --- a/src/mame/drivers/expro02.c +++ b/src/mame/drivers/expro02.c @@ -359,7 +359,7 @@ static ADDRESS_MAP_START( galsnew_map, AS_PROGRAM, 16, expro02_state ) AM_RANGE(0x700000, 0x700fff) AM_RAM AM_SHARE("spriteram") // sprites? 0x72f words tested - AM_RANGE(0x780000, 0x78001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // sprite regs? tileregs? + AM_RANGE(0x780000, 0x78001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x800000, 0x800001) AM_READ_PORT("DSW1") AM_RANGE(0x800002, 0x800003) AM_READ_PORT("DSW2") @@ -389,7 +389,7 @@ static ADDRESS_MAP_START( fantasia_map, AS_PROGRAM, 16, expro02_state ) AM_RANGE(0x600000, 0x600fff) AM_RAM_WRITE(galsnew_paletteram_w) AM_SHARE("paletteram") // palette? AM_RANGE(0x680000, 0x68001f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) AM_RANGE(0x700000, 0x700fff) AM_RAM AM_SHARE("spriteram") // sprites? 0x72f words tested - AM_RANGE(0x780000, 0x78001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // sprite regs? tileregs? + AM_RANGE(0x780000, 0x78001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x800000, 0x800001) AM_READ_PORT("DSW1") AM_RANGE(0x800002, 0x800003) AM_READ_PORT("DSW2") AM_RANGE(0x800004, 0x800005) AM_READ_PORT("DSW3") @@ -423,17 +423,7 @@ static TIMER_DEVICE_CALLBACK( expro02_scanline ) static MACHINE_RESET( galsnew ) { - expro02_state *state = machine.driver_data(); - state->m_sprite_type = 0; - - state->m_sprite_xoffs = 0; - state->m_sprite_yoffs = -1*0x40; // align testgrid with bitmap in service mode - - // priorities not verified - state->m_priority.sprite[0] = 8; // above all - state->m_priority.sprite[1] = 8; // above all - state->m_priority.sprite[2] = 8; // above all - state->m_priority.sprite[3] = 8; // above all +// expro02_state *state = machine.driver_data(); } /************************************* @@ -490,6 +480,12 @@ static MACHINE_CONFIG_START( galsnew, expro02_state ) kaneko_view2_tilemap_device::set_gfx_region(*device, 1); kaneko_view2_tilemap_device::set_offset(*device, 0x5b, 0x8, 256, 224); + MCFG_DEVICE_ADD_VU002_SPRITES + kaneko16_sprite_device::set_priorities(*device, 8,8,8,8); // above all (not verified) + kaneko16_sprite_device::set_offsets(*device, 0, -0x40); + + + MCFG_VIDEO_START(galsnew) MCFG_PALETTE_INIT(berlwall) diff --git a/src/mame/drivers/galpani2.c b/src/mame/drivers/galpani2.c index 2537928f32f..e020596ecad 100644 --- a/src/mame/drivers/galpani2.c +++ b/src/mame/drivers/galpani2.c @@ -73,13 +73,9 @@ WRITE16_MEMBER(galpani2_state::galpani2_eeprom_w) static MACHINE_RESET( galpani2 ) { - galpani2_state *state = machine.driver_data(); MACHINE_RESET_CALL(kaneko16); - state->m_sprite_type = 1; - state->m_sprite_xoffs = 0x10000 - 0x16c0 + 0xc00; - state->m_sprite_yoffs = 0x000; machine.scheduler().boost_interleave(attotime::zero, attotime::from_usec(50)); //initial mcu xchk } @@ -295,7 +291,7 @@ static ADDRESS_MAP_START( galpani2_mem1, AS_PROGRAM, 16, galpani2_state ) AM_RANGE(0x110000, 0x11000f) AM_RAM // ? corrupted? stack dumper on POST failure, pc+sr on gp2se AM_RANGE(0x300000, 0x301fff) AM_RAM // ? AM_RANGE(0x302000, 0x303fff) AM_RAM AM_SHARE("spriteram") // Sprites - AM_RANGE(0x304000, 0x30401f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x304000, 0x30401f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x308000, 0x308001) AM_WRITENOP // ? 0 at startup AM_RANGE(0x30c000, 0x30c001) AM_WRITENOP // ? hblank effect ? AM_RANGE(0x310000, 0x3101ff) AM_RAM_WRITE_LEGACY(galpani2_palette_0_w) AM_SHARE("palette.0") // ? @@ -611,6 +607,9 @@ static MACHINE_CONFIG_START( galpani2, galpani2_state ) MCFG_GFXDECODE(galpani2) MCFG_PALETTE_LENGTH(0x4000 + 0x200 + 0x8000) // sprites, bg8, bg15 + MCFG_DEVICE_ADD_KC002_SPRITES + kaneko16_sprite_device::set_offsets(*device, 0x10000 - 0x16c0 + 0xc00, 0); + MCFG_PALETTE_INIT(galpani2) MCFG_VIDEO_START(galpani2) diff --git a/src/mame/drivers/kaneko16.c b/src/mame/drivers/kaneko16.c index eba9028a3db..000baeb9303 100644 --- a/src/mame/drivers/kaneko16.c +++ b/src/mame/drivers/kaneko16.c @@ -104,71 +104,27 @@ Dip locations verified from manual for: MACHINE_RESET( kaneko16 ) { - kaneko16_state *state = machine.driver_data(); - state->m_sprite_type = 0; - state->m_sprite_xoffs = 0; - state->m_sprite_yoffs = 0; - state->m_sprite_fliptype = 0; -/* - Sx = Sprites with priority x, x = tiles with priority x, - Sprites - Tiles Order (bottom -> top): - - 0 S0 1 2 3 - 0 1 S1 2 3 - 0 1 2 S2 3 - 0 1 2 3 S3 -*/ - state->m_priority.sprite[0] = 1; // above tile[0], below the others - state->m_priority.sprite[1] = 2; // above tile[0-1], below the others - state->m_priority.sprite[2] = 3; // above tile[0-2], below the others - state->m_priority.sprite[3] = 8; // above all } static MACHINE_RESET( berlwall ) { - kaneko16_state *state = machine.driver_data(); MACHINE_RESET_CALL(kaneko16); - state->m_sprite_type = 2; // like type 0, but using 16 instead of 8 bytes } static MACHINE_RESET( blazeon ) { - kaneko16_state *state = machine.driver_data(); MACHINE_RESET_CALL(kaneko16); - - state->m_sprite_xoffs = 0x10000 - 0x680; - state->m_sprite_yoffs = 0x000; - -/* - Sx = Sprites with priority x, x = tiles with priority x, - Sprites - Tiles Order (bottom -> top): - - 0 S0 1 2 3 - 0 1 S1 2 3 - 0 1 2 3 S2 - 0 1 2 3 S3 -*/ - state->m_priority.sprite[0] = 1; // above tile[0], below the others - state->m_priority.sprite[1] = 2; // above tile[0-1], below the others - state->m_priority.sprite[2] = 8; // above all - state->m_priority.sprite[3] = 8; // "" } static MACHINE_RESET( bloodwar ) { kaneko16_state *state = machine.driver_data(); - state->m_priority.sprite[0] = 2; // ever used ? - state->m_priority.sprite[1] = 3; // character selection / vs. portraits - state->m_priority.sprite[2] = 5; // winning portrait - state->m_priority.sprite[3] = 7; - state->m_sprite_type = 1; - - state->m_priority.VIEW2_2_pri = 1; + state->VIEW2_2_pri = 1; state->m_toybox_mcu_run = bloodwar_mcu_run; toybox_mcu_init(machine); @@ -177,14 +133,9 @@ static MACHINE_RESET( bloodwar ) static MACHINE_RESET( bonkadv ) { kaneko16_state *state = machine.driver_data(); - state->m_priority.sprite[0] = 2; // ever used ? - state->m_priority.sprite[1] = 3; // volcano lava on level 2 - state->m_priority.sprite[2] = 5; // in-game player - state->m_priority.sprite[3] = 7; // demostration text - state->m_sprite_type = 1; - state->m_priority.VIEW2_2_pri = 1; + state->VIEW2_2_pri = 1; state->m_toybox_mcu_run = bonkadv_mcu_run; toybox_mcu_init(machine); @@ -195,12 +146,8 @@ static MACHINE_RESET( bakubrkr ) kaneko16_state *state = machine.driver_data(); MACHINE_RESET_CALL(kaneko16); - state->m_priority.sprite[0] = 8; // above all - state->m_priority.sprite[1] = 8; // above all - state->m_priority.sprite[2] = 8; // above all - state->m_priority.sprite[3] = 8; // above all - state->m_priority.VIEW2_2_pri = 1; + state->VIEW2_2_pri = 1; } static MACHINE_RESET( gtmr ) @@ -208,9 +155,8 @@ static MACHINE_RESET( gtmr ) kaneko16_state *state = machine.driver_data(); MACHINE_RESET_CALL(kaneko16); - state->m_sprite_type = 1; - state->m_priority.VIEW2_2_pri = 1; + state->VIEW2_2_pri = 1; state->m_toybox_mcu_run = gtmr_mcu_run; toybox_mcu_init(machine); @@ -220,28 +166,9 @@ static MACHINE_RESET( mgcrystl ) { kaneko16_state *state = machine.driver_data(); MACHINE_RESET_CALL(kaneko16); -/* - Sx = Sprites with priority x, x = tiles with priority x, - Sprites - Tiles Order: - S0: below 0 2 - S1: over 2 - below 0 - - S2: over 0 2 - - S3: over all - - tiles of the 2nd VIEW2 chip always behind sprites? - -*/ - state->m_priority.sprite[0] = 2; // below all - state->m_priority.sprite[1] = 3; // above tile[0], below the others - state->m_priority.sprite[2] = 5; // above all - state->m_priority.sprite[3] = 7; // "" - - state->m_priority.VIEW2_2_pri = 0; + state->VIEW2_2_pri = 0; } @@ -251,18 +178,9 @@ static MACHINE_RESET( shogwarr ) kaneko16_state *state = machine.driver_data(); MACHINE_RESET_CALL(kaneko16); - state->m_sprite_xoffs = 0xa00; - state->m_sprite_yoffs = -0x40; - - state->m_sprite_type = 0; - state->m_sprite_fliptype = 1; - - state->m_priority.sprite[0] = 1; // below all - state->m_priority.sprite[1] = 3; // above tile[0], below the others - state->m_priority.sprite[2] = 5; // above all - state->m_priority.sprite[3] = 7; // "" - state->m_priority.VIEW2_2_pri = 0; + + state->VIEW2_2_pri = 0; calc3_mcu_init(machine); } @@ -396,7 +314,7 @@ static ADDRESS_MAP_START( berlwall, AS_PROGRAM, 16, kaneko16_state ) // AM_RANGE(0x480000, 0x480001) AM_RAM // ? AM_RANGE(0x500000, 0x500001) AM_READWRITE(kaneko16_bg15_reg_r, kaneko16_bg15_reg_w) AM_SHARE("bg15_reg") // High Color Background AM_RANGE(0x580000, 0x580001) AM_READWRITE(kaneko16_bg15_select_r, kaneko16_bg15_select_w) AM_SHARE("bg15_select") - AM_RANGE(0x600000, 0x60003f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x600000, 0x60003f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x680000, 0x680001) AM_READ_PORT("P1") AM_RANGE(0x680002, 0x680003) AM_READ_PORT("P2") AM_RANGE(0x680004, 0x680005) AM_READ_PORT("SYSTEM") @@ -443,7 +361,7 @@ static ADDRESS_MAP_START( bakubrkr, AS_PROGRAM, 16, kaneko16_state ) AM_RANGE(0x600000, 0x601fff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0x700000, 0x700fff) AM_RAM_WRITE(paletteram_xGGGGGRRRRRBBBBB_word_w) AM_SHARE("paletteram") // Palette AM_RANGE(0x800000, 0x80001f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) - AM_RANGE(0x900000, 0x90001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x900000, 0x90001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0xa80000, 0xa80001) AM_READ(watchdog_reset16_r) // Watchdog AM_RANGE(0xb00000, 0xb0001f) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) AM_RANGE(0xd00000, 0xd00001) AM_WRITE(kaneko16_eeprom_w) // EEPROM @@ -465,7 +383,7 @@ static ADDRESS_MAP_START( blazeon, AS_PROGRAM, 16, kaneko16_state ) AM_RANGE(0x600000, 0x603fff) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_vram_r, kaneko_tmap_vram_w ) AM_RANGE(0x700000, 0x700fff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0x800000, 0x80001f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) - AM_RANGE(0x900000, 0x90001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs #1 + AM_RANGE(0x900000, 0x90001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x980000, 0x98001f) AM_RAM // Sprites Regs #2 AM_RANGE(0xc00000, 0xc00001) AM_READ_PORT("DSW2_P1") AM_RANGE(0xc00002, 0xc00003) AM_READ_PORT("DSW1_P2") @@ -530,7 +448,7 @@ static ADDRESS_MAP_START( bloodwar, AS_PROGRAM, 16, kaneko16_state ) AM_RANGE(0x580000, 0x583fff) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_vram_r, kaneko_tmap_vram_w ) AM_RANGE(0x600000, 0x60001f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) AM_RANGE(0x680000, 0x68001f) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) - AM_RANGE(0x700000, 0x70001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x700000, 0x70001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x800000, 0x800001) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x00ff) AM_RANGE(0x880000, 0x880001) AM_DEVREADWRITE8("oki2", okim6295_device, read, write, 0x00ff) AM_RANGE(0x900000, 0x900039) AM_READWRITE(bloodwar_calc_r, bloodwar_calc_w) @@ -588,7 +506,7 @@ static ADDRESS_MAP_START( bonkadv, AS_PROGRAM, 16, kaneko16_state ) AM_RANGE(0x580000, 0x583fff) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_vram_r, kaneko_tmap_vram_w ) AM_RANGE(0x600000, 0x60001f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) AM_RANGE(0x680000, 0x68001f) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) - AM_RANGE(0x700000, 0x70001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x700000, 0x70001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x800000, 0x800001) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x00ff) AM_RANGE(0x880000, 0x880001) AM_DEVREADWRITE8("oki2", okim6295_device, read, write, 0x00ff) AM_RANGE(0x900000, 0x900015) AM_READWRITE(galpanib_calc_r,galpanib_calc_w) @@ -668,7 +586,7 @@ static ADDRESS_MAP_START( gtmr_map, AS_PROGRAM, 16, kaneko16_state ) AM_RANGE(0x600000, 0x60000f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) AM_RANGE(0x680000, 0x68001f) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) - AM_RANGE(0x700000, 0x70001f) AM_READWRITE(kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x700000, 0x70001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x800000, 0x800001) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x00ff) // Samples AM_RANGE(0x880000, 0x880001) AM_DEVREADWRITE8("oki2", okim6295_device, read, write, 0x00ff) @@ -736,7 +654,7 @@ static ADDRESS_MAP_START( gtmr2_map, AS_PROGRAM, 16, kaneko16_state ) AM_RANGE(0x600000, 0x60000f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) AM_RANGE(0x680000, 0x68001f) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) - AM_RANGE(0x700000, 0x70001f) AM_READWRITE(kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x700000, 0x70001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0x800000, 0x800001) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x00ff) // Samples AM_RANGE(0x880000, 0x880001) AM_DEVREADWRITE8("oki2", okim6295_device, read, write, 0x00ff) @@ -772,7 +690,7 @@ static ADDRESS_MAP_START( mgcrystl, AS_PROGRAM, 16, kaneko16_state ) AM_RANGE(0x680000, 0x683fff) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_vram_r, kaneko_tmap_vram_w ) AM_RANGE(0x700000, 0x701fff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0x800000, 0x80001f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) - AM_RANGE(0x900000, 0x90001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x900000, 0x90001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0xb00000, 0xb0001f) AM_DEVREADWRITE("view2_1", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) AM_RANGE(0xa00000, 0xa00001) AM_READ(watchdog_reset16_r) // Watchdog AM_RANGE(0xc00000, 0xc00001) AM_READ_PORT("DSW_P1") @@ -835,7 +753,7 @@ static ADDRESS_MAP_START( shogwarr, AS_PROGRAM, 16, kaneko16_state ) AM_RANGE(0x580000, 0x581fff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0x600000, 0x603fff) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_vram_r, kaneko_tmap_vram_w ) AM_RANGE(0x800000, 0x80001f) AM_DEVREADWRITE("view2_0", kaneko_view2_tilemap_device, kaneko_tmap_regs_r, kaneko_tmap_regs_w) - AM_RANGE(0x900000, 0x90001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_SHARE("sprites_regs") // Sprites Regs + AM_RANGE(0x900000, 0x90001f) AM_DEVREADWRITE("kan_spr", kaneko16_sprite_device, kaneko16_sprites_regs_r, kaneko16_sprites_regs_w) AM_RANGE(0xa00000, 0xa0007f) AM_READWRITE(bloodwar_calc_r, bloodwar_calc_w) AM_RANGE(0xa80000, 0xa80001) AM_READWRITE(watchdog_reset16_r, watchdog_reset16_w) // Watchdog AM_RANGE(0xb80000, 0xb80001) AM_READ_PORT("P1") @@ -1820,6 +1738,10 @@ static MACHINE_CONFIG_START( berlwall, kaneko16_state ) kaneko_view2_tilemap_device::set_gfx_region(*device, 1); kaneko_view2_tilemap_device::set_offset(*device, 0x5b, -0x8, 256, 240); + MCFG_DEVICE_ADD_VU002_SPRITES + kaneko16_sprite_device::set_altspacing(*device, 1); + + MCFG_PALETTE_INIT(berlwall) MCFG_VIDEO_START(berlwall) @@ -1873,6 +1795,12 @@ static MACHINE_CONFIG_START( bakubrkr, kaneko16_state ) kaneko_view2_tilemap_device::set_gfx_region(*device, 2); kaneko_view2_tilemap_device::set_offset(*device, 0x5b, -0x8, 256, 240); + MCFG_DEVICE_ADD_VU002_SPRITES + kaneko16_sprite_device::set_priorities(*device, 8,8,8,8); // above all + + + + MCFG_VIDEO_START(kaneko16_2xVIEW2) @@ -1935,6 +1863,12 @@ static MACHINE_CONFIG_START( blazeon, kaneko16_state ) kaneko_view2_tilemap_device::set_gfx_region(*device, 1); kaneko_view2_tilemap_device::set_offset(*device, 0x33, 0x8, 320, 240); + MCFG_DEVICE_ADD_VU002_SPRITES + kaneko16_sprite_device::set_priorities(*device, 1 /* "above tile[0], below the others" */ ,2 /* "above tile[0-1], below the others" */ ,8 /* above all */,8 /* above all */); + kaneko16_sprite_device::set_offsets(*device, 0x10000 - 0x680, 0x000); + + // there is actually a 2nd sprite chip! looks like our device emulation handles both at once + MCFG_VIDEO_START(kaneko16_1xVIEW2) /* sound hardware */ @@ -1992,6 +1926,8 @@ static MACHINE_CONFIG_START( gtmr, kaneko16_state ) kaneko_view2_tilemap_device::set_gfx_region(*device, 2); kaneko_view2_tilemap_device::set_offset(*device, 0x33, 0x0, 320, 240); + MCFG_DEVICE_ADD_KC002_SPRITES + MCFG_VIDEO_START(kaneko16_2xVIEW2) /* sound hardware */ @@ -2015,6 +1951,10 @@ static MACHINE_CONFIG_DERIVED( bloodwar, gtmr ) MCFG_CPU_PROGRAM_MAP(bloodwar) MCFG_MACHINE_RESET( bloodwar ) + + MCFG_DEVICE_MODIFY("kan_spr") + kaneko16_sprite_device::set_priorities(*device, 2 /* never used? */ ,3 /* character selection / vs. portraits */ ,5 /* winning portrait*/ ,7 /* ? */); + MACHINE_CONFIG_END /*************************************************************************** @@ -2039,6 +1979,9 @@ static MACHINE_CONFIG_DERIVED( bonkadv, gtmr ) MCFG_CPU_PROGRAM_MAP(bonkadv) MCFG_MACHINE_RESET( bonkadv ) + + MCFG_DEVICE_MODIFY("kan_spr") + kaneko16_sprite_device::set_priorities(*device, 2 /* never used? */ ,3 /* volcano lava on level 2 */ ,5 /* in-game player */ ,7 /* demostration text */); MACHINE_CONFIG_END /*************************************************************************** @@ -2076,6 +2019,12 @@ static MACHINE_CONFIG_START( mgcrystl, kaneko16_state ) kaneko_view2_tilemap_device::set_gfx_region(*device, 2); kaneko_view2_tilemap_device::set_offset(*device, 0x5b, -0x8, 256, 240); + MCFG_DEVICE_ADD_VU002_SPRITES + kaneko16_sprite_device::set_priorities(*device, 2 /* below all */ ,3 /* above tile[0], below the other */ ,5 /* above all */ ,7 /* above all */); + + + + MCFG_VIDEO_START(kaneko16_2xVIEW2) /* sound hardware */ @@ -2194,6 +2143,11 @@ static MACHINE_CONFIG_START( shogwarr, kaneko16_state ) MCFG_VIDEO_START(kaneko16_1xVIEW2) + MCFG_DEVICE_ADD_VU002_SPRITES + kaneko16_sprite_device::set_priorities(*device, 1 /* below all */ ,3 /* above tile[0], below the others */ ,5 /* above all */ ,7 /* above all */); + kaneko16_sprite_device::set_offsets(*device, 0xa00, -0x40); + kaneko16_sprite_device::set_fliptype(*device, 1); + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/drivers/maygayep.c b/src/mame/drivers/maygayep.c index 2a0cd3590ec..fe927175cac 100644 --- a/src/mame/drivers/maygayep.c +++ b/src/mame/drivers/maygayep.c @@ -1,7 +1,8 @@ /************************************************************************************************************ Maygay EPOCH hardware - mechanical fruit machine HW + 'mechanical' fruit machine HW + primary use 1997 - 2003 HD6413002FN16 (H8-3002) CPU @@ -7142,15 +7143,16 @@ GAME( 199?, ep_crazyc, ep_crazy, maygayep, maygayep, maygayep_state, maygayep, GAME( 199?, ep_crazyd, ep_crazy, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Reel Crazy (Maygay) (EPOCH) (1.9, set 5)",GAME_IS_SKELETON_MECHANICAL ) GAME( 199?, ep_crazye, ep_crazy, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Reel Crazy (Maygay) (EPOCH) (1.9, set 6)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mario, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.5, set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_marioa, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.5, set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mariob, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.A, set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_marioc, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.A, set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mariod, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (2.A, set 5)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_marioe, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (2.A, set 6)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mariof, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.C, set 7)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mariog, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.C, set 8)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_marioh, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.B, set 9)",GAME_IS_SKELETON_MECHANICAL ) +// CA000527 SUPER MARIO - version number seems to jump backwards from 2.A after 1.A, with 2.A having the exact same build date as 1.A.. is the KJ / SM / CW bit significant? or is the 2.A revision a mistake, it comes after the 1.A in label tho, so 1.A isn't a correction. +GAME( 1997, ep_mario, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.5, set 1)",GAME_IS_SKELETON_MECHANICAL ) // SA970024 SA970018 11:40:00 DEC 02 1997 MAB, V1.5 EPOCH APOLLO AllCash +GAME( 1997, ep_marioa, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.5, set 2)",GAME_IS_SKELETON_MECHANICAL ) // SA970025 SA970019 11:40:00 DEC 02 1997 MAB, V1.5 EPOCH APOLLO AllCash +GAME( 1997, ep_mariob, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.A, set 3)",GAME_IS_SKELETON_MECHANICAL ) // SA970036 SA970024 11:15:00 DEC 23 1997 KJGio.x, 1.A EPOCH APOLLO +GAME( 1997, ep_marioc, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.A, set 4)",GAME_IS_SKELETON_MECHANICAL ) // SA970037 SA970025 11:15:00 DEC 23 1997 KJGio.x, 1.A EPOCH APOLLO +GAME( 1997, ep_mariod, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (2.A, set 5)",GAME_IS_SKELETON_MECHANICAL ) // SA970038 SA970026 11:15:00 DEC 23 1997 KJGio.x, 2.A EPOCH APOLLO +GAME( 1997, ep_marioe, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (2.A, set 6)",GAME_IS_SKELETON_MECHANICAL ) // SA970039 SA970027 11:15:00 DEC 23 1997 KJGio.x, 2.A EPOCH APOLLO +GAME( 1998, ep_marioh, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.B, set 9)",GAME_IS_SKELETON_MECHANICAL ) // SA980286 SA970037 10:05:00 AUG 26 1998 SJMio.x, 1.B EPOCH APOLLO +GAME( 1999, ep_mariof, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.C, set 7)",GAME_IS_SKELETON_MECHANICAL ) // SA990033 SA980286 14:05:00 FEB 26 1999 CWGio.x, 1.C EPOCH APOLLO +GAME( 1999, ep_mariog, ep_mario, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH) (1.C, set 8)",GAME_IS_SKELETON_MECHANICAL ) // SA990034 SA980287 14:05:00 FEB 26 1999 CWGio.x, 1.C EPOCH APOLLO GAME( 199?, ep_tincn, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Tin Can Alley (Maygay) (EPOCH) (1.5, set 1)",GAME_IS_SKELETON_MECHANICAL ) GAME( 199?, ep_tincna, ep_tincn, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Tin Can Alley (Maygay) (EPOCH) (1.5, set 2)",GAME_IS_SKELETON_MECHANICAL ) @@ -7529,129 +7531,57 @@ GAME( 199?, ep_pknid, ep_pkni, maygayep, maygayep, maygayep_state, maygayep, R GAME( 199?, ep_pknie, ep_pkni, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "The Phoenix Knights (Global) (EPOCH) (1.7, set 6)",GAME_IS_SKELETON_MECHANICAL ) GAME( 199?, ep_pknif, ep_pkni, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "The Phoenix Knights (Global) (EPOCH) (1.7, set 7)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_royrc, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Impulse", "Royal Roulette Club (Impulse) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_royrca, ep_royrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Impulse", "Royal Roulette Club (Impulse) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snbev, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (1.8, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snbeva, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (1.8, set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snbevb, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (1.9, set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snbevc, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (1.9, set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snbevd, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (2.1, set 5)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snbeve, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (2.1, set 6)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_snbev, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_snbeva, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_snbevb, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_snbevc, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_snbevd, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_snbeve, ep_snbev, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spook, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spooky Hollow (Global) (EPOCH) (1.3, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spooka, ep_spook, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spooky Hollow (Global) (EPOCH) (1.3, set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spookb, ep_spook, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spooky Hollow (Global) (EPOCH) (2.7, set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_spook, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spooky Hollow (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_spooka, ep_spook, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spooky Hollow (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_spookb, ep_spook, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spooky Hollow (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdcla, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclaa, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclab, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclac, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclad, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclae, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclaf, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 7)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclag, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 8)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhr, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (1.2, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhra, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (1.2, set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhrb, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (1.3, set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhrc, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (1.3, set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhrd, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (1.6, set 5)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhre, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (1.6, set 6)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhrf, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (1.9, set 7)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhrg, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (1.9, set 8)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclb, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_sdclba, ep_sdclb, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bbars, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH) (1.2, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bbarsa, ep_bbars, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH) (1.2, set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bbarsb, ep_bbars, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH) (2.0, set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bbarsc, ep_bbars, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH) (2.0, set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_stm, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_stma, ep_stm, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_stmb, ep_stm, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_stmc, ep_stm, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cslay, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Cash Slayer (Global) (EPOCH) (1.4, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cslaya, ep_cslay, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Cash Slayer (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) // incomplete pair -GAME( 199?, ep_stmcl, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_stmcla, ep_stmcl, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_monky, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Monkey Business (Global) (EPOCH) (1.4, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_monkya, ep_monky, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Monkey Business (Global) (EPOCH) (1.5, set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_snset, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Sunset Strip (Extreme) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_snseta, ep_snset, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Sunset Strip (Extreme) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 1999, ep_lug, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "London Underground (Maygay) (EPOCH) (2.4, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 1999, ep_luga, ep_lug, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "London Underground (Maygay) (EPOCH) (2.9, set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 2002, ep_lugb, ep_lug, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "London Underground (Maygay) (EPOCH) (3.1, set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 2002, ep_lugc, ep_lug, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "London Underground (Maygay) (EPOCH) (3.1, set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_twarp, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_twarpa, ep_twarp, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_twarpb, ep_twarp, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_twarpc, ep_twarp, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_crzbn, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH) (1.1, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_crzbna, ep_crzbn, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH) (1.1, set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_crzbnb, ep_crzbn, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH) (1.1 Gala, set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_crzbnc, ep_crzbn, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH) (1.1 Gala, set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_tod, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Truth Or Dare (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_toda, ep_tod, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Truth Or Dare (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +// Z0000024 CASINOCR AZ +GAME( 199?, ep_cascza, ep_cascz, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Casino Crazy (Global) (EPOCH) (2.1, set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_utnut, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_utnuta, ep_utnut, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_utnutb, ep_utnut, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_utnutc, ep_utnut, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wside, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildside (Global) (EPOCH) (1.2, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wsidea, ep_wside, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildside (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) // incomplete pair -GAME( 199?, ep_utncl, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_utncla, ep_utncl, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_imj, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "I'm A Jackpot (Global) (EPOCH) (1.5)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wleek, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Weakest Leek Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wleeka, ep_wleek, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Weakest Leek Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_wud, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wuda, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wudb, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wudc, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wudd, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wude, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_milhr, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_milhra, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_milhrb, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_milhrc, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_milhrd, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_milhre, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_milhrf, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (set 7)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_milhrg, ep_milhr, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Wants To Be A Millionhare? (Global) (EPOCH) (set 8)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_mlhrc, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mlhrca, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mlhrcb, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mlhrcc, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mlhrcd, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_mlhrce, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_wf, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wfa, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wfb, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wfc, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wfd, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wfe, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wff, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 7)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wfg, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 8)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_bbars, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_bbarsa, ep_bbars, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_bbarsb, ep_bbars, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_bbarsc, ep_bbars, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_cslay, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Cash Slayer (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_cslaya, ep_cslay, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Cash Slayer (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_monky, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Monkey Business (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_monkya, ep_monky, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Monkey Business (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_makmv, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Make Your Move (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_makmva, ep_makmv, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Make Your Move (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_lug, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "London Underground (Maygay) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_luga, ep_lug, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "London Underground (Maygay) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_lugb, ep_lug, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "London Underground (Maygay) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_lugc, ep_lug, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "London Underground (Maygay) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_crzbn, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_crzbna, ep_crzbn, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_crzbnb, ep_crzbn, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_crzbnc, ep_crzbn, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_cascz, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Casino Crazy (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_cascza, ep_cascz, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Casino Crazy (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_wside, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildside (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, ep_wsidea, ep_wside, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildside (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_goldf, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Impulse", "Gold Fever (Impulse) (EPOCH)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_imj, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "I'm A Jackpot (Global) (EPOCH)",GAME_IS_SKELETON_MECHANICAL ) - -GAME( 199?, ep_party, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Party Party (Global) (EPOCH)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 1998, ep_party, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Party Party (Global) (EPOCH) (1.1)",GAME_IS_SKELETON_MECHANICAL ) /* no header info */ @@ -8021,6 +7951,72 @@ GAME( 199?, ep_mummyf, ep_mummy, maygayep, maygayep, maygayep_state, maygayep, GAME( 199?, ep_rchik, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Rich Chics Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) GAME( 199?, ep_rchika, ep_rchik, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Rich Chics Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_royrc, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Impulse", "Royal Roulette Club (Impulse) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_royrca, ep_royrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Impulse", "Royal Roulette Club (Impulse) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_sdcla, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdclaa, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdclab, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdclac, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdclaf, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 7)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdclag, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 8)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdclad, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) // larger roms, header not cleared +GAME( 199?, ep_sdclae, ep_sdcla, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) // larger roms, header not cleared + +GAME( 199?, ep_sdclb, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdclba, ep_sdclb, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Spotted Dick Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_stm, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_stma, ep_stm, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_stmb, ep_stm, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_stmc, ep_stm, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_stmcl, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_stmcla, ep_stmcl, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Storm Force Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_tod, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Truth Or Dare (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_toda, ep_tod, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Truth Or Dare (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_utnut, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_utnuta, ep_utnut, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_utnutb, ep_utnut, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_utnutc, ep_utnut, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_utncl, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_utncla, ep_utncl, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Utter Nutter Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_wleek, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Weakest Leek Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wleeka, ep_wleek, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Weakest Leek Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_wud, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wuda, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wudb, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wudc, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wudd, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wude, ep_wud, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "What's Up Doc (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_mlhrc, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mlhrca, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mlhrcb, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mlhrcc, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mlhrcd, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mlhrce, ep_mlhrc, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_wf, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wfa, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wfb, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wfc, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 4)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wfd, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 5)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wfe, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 6)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wff, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 7)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wfg, ep_wf, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Wildfire (Global) (EPOCH) (set 8)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_makmv, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Make Your Move (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_makmva, ep_makmv, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Make Your Move (Global) (EPOCH) (set 2)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_cascz, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Global", "Casino Crazy (Global) (EPOCH) (set 1)",GAME_IS_SKELETON_MECHANICAL ) // check identity, other set has header + +GAME( 199?, ep_goldf, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Impulse", "Gold Fever (Impulse) (EPOCH)",GAME_IS_SKELETON_MECHANICAL ) /* minimal header info */ @@ -8092,3 +8088,10 @@ GAME( 199?, ep_lla, ep_ll, maygayep, maygayep, maygayep_state, maygayep, ROT GAME( 199?, ep_redl, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Red Line (Extreme) (EPOCH) (RELI 0.1, set 1)",GAME_IS_SKELETON_MECHANICAL ) GAME( 199?, ep_redla, ep_redl, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Red Line (Extreme) (EPOCH) (RELI 0.1, set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snset, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Sunset Strip (Extreme) (EPOCH) (SUST 0.1, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snseta, ep_snset, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Sunset Strip (Extreme) (EPOCH) (SUST 0.1, set 2)",GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_twarp, 0, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH) (TWRP 0.1, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_twarpa, ep_twarp, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH) (TWRP 0.1, set 2)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_twarpb, ep_twarp, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH) (TWRP 0.4, set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_twarpc, ep_twarp, maygayep, maygayep, maygayep_state, maygayep, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH) (TWRP 0.4, set 4)",GAME_IS_SKELETON_MECHANICAL ) diff --git a/src/mame/drivers/sandscrp.c b/src/mame/drivers/sandscrp.c index 6a48bdb42ed..7cee9bc52c5 100644 --- a/src/mame/drivers/sandscrp.c +++ b/src/mame/drivers/sandscrp.c @@ -107,17 +107,7 @@ public: static MACHINE_RESET( sandscrp ) { - sandscrp_state *state = machine.driver_data(); - state->m_sprite_type = 0; - - state->m_sprite_xoffs = 0; - state->m_sprite_yoffs = 0; - - state->m_priority.sprite[0] = 1; // above tile[0], below the others - state->m_priority.sprite[1] = 2; // above tile[0-1], below the others - state->m_priority.sprite[2] = 3; // above tile[0-2], below the others - state->m_priority.sprite[3] = 8; // above all - state->m_sprite_type = 3; // "different" sprites layout +// sandscrp_state *state = machine.driver_data(); } /* Sand Scorpion */ @@ -174,8 +164,8 @@ WRITE16_MEMBER(sandscrp_state::sandscrp_irq_cause_w) if (ACCESSING_BITS_0_7) { - m_sprite_flipx = data & 1; - m_sprite_flipy = data & 1; +// m_sprite_flipx = data & 1; +// m_sprite_flipy = data & 1; if (data & 0x08) m_sprite_irq = 0; if (data & 0x10) m_unknown_irq = 0; diff --git a/src/mame/includes/kaneko16.h b/src/mame/includes/kaneko16.h index 3d7145b9377..429167a89a8 100644 --- a/src/mame/includes/kaneko16.h +++ b/src/mame/includes/kaneko16.h @@ -9,12 +9,8 @@ #include "machine/nvram.h" #include "video/kaneko_tmap.h" +#include "video/kaneko_spr.h" -typedef struct -{ - int VIEW2_2_pri; - int sprite[4]; -} kaneko16_priority_t; typedef struct @@ -78,13 +74,13 @@ public: m_spriteram(*this, "spriteram"), m_bg15_reg(*this, "bg15_reg"), m_bg15_select(*this, "bg15_select"), - m_sprites_regs(*this, "sprites_regs"), m_mcu_ram(*this, "mcu_ram"), m_mainram(*this, "mainram"), m_galsnew_bg_pixram(*this, "galsnew_bgram"), m_galsnew_fg_pixram(*this, "galsnew_fgram"), m_view2_0(*this, "view2_0"), - m_view2_1(*this, "view2_1") + m_view2_1(*this, "view2_1"), + m_kaneko_spr(*this, "kan_spr") { } @@ -92,32 +88,26 @@ public: optional_shared_ptr m_spriteram; optional_shared_ptr m_bg15_reg; optional_shared_ptr m_bg15_select; - optional_shared_ptr m_sprites_regs; optional_shared_ptr m_mcu_ram; optional_shared_ptr m_mainram; optional_shared_ptr m_galsnew_bg_pixram; optional_shared_ptr m_galsnew_fg_pixram; optional_device m_view2_0; optional_device m_view2_1; + optional_device m_kaneko_spr; UINT8 m_nvram_save[128]; - int m_sprite_type; - int m_sprite_fliptype; - UINT16 m_sprite_xoffs; - UINT16 m_sprite_flipx; - UINT16 m_sprite_yoffs; - UINT16 m_sprite_flipy; - struct tempsprite *m_first_sprite; - kaneko16_priority_t m_priority; + calc1_hit_t m_hit; calc3_hit_t m_hit3; calc3_t m_calc3; void (*m_toybox_mcu_run)(running_machine &machine); UINT16 m_toybox_mcu_com[4]; UINT16 m_disp_enable; - int m_keep_sprites; + + int VIEW2_2_pri; + bitmap_ind16 m_bg15_bitmap; - bitmap_ind16 m_sprites_bitmap; DECLARE_READ16_MEMBER(kaneko16_rnd_r); DECLARE_WRITE16_MEMBER(kaneko16_coin_lockout_w); @@ -148,8 +138,7 @@ public: DECLARE_WRITE16_MEMBER(shogwarr_calc_w); DECLARE_READ16_MEMBER(shogwarr_calc_r); DECLARE_WRITE16_MEMBER(kaneko16_display_enable); - DECLARE_READ16_MEMBER(kaneko16_sprites_regs_r); - DECLARE_WRITE16_MEMBER(kaneko16_sprites_regs_w); + DECLARE_READ16_MEMBER(kaneko16_bg15_select_r); DECLARE_WRITE16_MEMBER(kaneko16_bg15_select_w); DECLARE_READ16_MEMBER(kaneko16_bg15_reg_r); diff --git a/src/mame/mame.mak b/src/mame/mame.mak index f050928843b..0a414a2e651 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -847,6 +847,7 @@ $(MAMEOBJ)/kaneko.a: \ $(DRIVERS)/jchan.o \ $(DRIVERS)/kaneko16.o $(MACHINE)/kaneko16.o $(VIDEO)/kaneko16.o \ $(VIDEO)/kaneko_tmap.o \ + $(VIDEO)/kaneko_spr.o \ $(DRIVERS)/sandscrp.o \ $(DRIVERS)/suprnova.o $(VIDEO)/suprnova.o \ $(VIDEO)/sknsspr.o \ diff --git a/src/mame/video/galpani2.c b/src/mame/video/galpani2.c index 471c78c86b1..d0235bc719a 100644 --- a/src/mame/video/galpani2.c +++ b/src/mame/video/galpani2.c @@ -194,6 +194,6 @@ if (screen.machine().input().code_pressed(KEYCODE_Z)) cliprect,0x4000 + 0); } - if (layers_ctrl & 0x8) kaneko16_draw_sprites(screen.machine(), bitmap, cliprect); + if (layers_ctrl & 0x8) state->m_kaneko_spr->kaneko16_draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram, state->m_spriteram.bytes()); return 0; } diff --git a/src/mame/video/kaneko16.c b/src/mame/video/kaneko16.c index 77310bdc569..ece52042292 100644 --- a/src/mame/video/kaneko16.c +++ b/src/mame/video/kaneko16.c @@ -4,18 +4,6 @@ driver by Luca Elia (l.elia@tin.it) - [ 1 High Color Layer ] - - In ROM (Optional) - - [ 1024 Sprites ] - - Sprites are 16 x 16 x 4 in the older games, 16 x 16 x 8 in - gtmr & gtmr2. - Sprites types 0 and 2 can also have a simple effect keeping - sprites on the screen - - **************************************************************************/ #include "emu.h" @@ -23,15 +11,6 @@ #include "kan_pand.h" -struct tempsprite -{ - int code,color; - int x,y; - int xoffs,yoffs; - int flipx,flipy; - int priority; -}; - WRITE16_MEMBER(kaneko16_state::kaneko16_display_enable) { @@ -42,18 +21,12 @@ VIDEO_START( kaneko16_sprites ) { kaneko16_state *state = machine.driver_data(); state->m_disp_enable = 1; // default enabled for games not using it - state->m_keep_sprites = 0; // default disabled for games not using it - - /* 0x400 sprites max */ - state->m_first_sprite = auto_alloc_array(machine, struct tempsprite, 0x400); } VIDEO_START( kaneko16_1xVIEW2_tilemaps ) { kaneko16_state *state = machine.driver_data(); state->m_disp_enable = 1; // default enabled for games not using it - state->m_keep_sprites = 0; // default disabled for games not using it - machine.primary_screen->register_screen_bitmap(state->m_sprites_bitmap); } @@ -137,445 +110,9 @@ VIDEO_START( berlwall ) VIDEO_START( galsnew ) { - kaneko16_state *state = machine.driver_data(); VIDEO_START_CALL(kaneko16_sprites); - - machine.primary_screen->register_screen_bitmap(state->m_sprites_bitmap); - } -/*************************************************************************** - - Sprites Drawing - - Sprite data is layed out in RAM in different ways for different games - (type 0,1,2,etc.). This basically involves the bits in the attribute - word to be shuffled around and/or the words being in different order. - - Each sprite is always stuffed in 4 words. There may be some extra - padding words though (e.g. type 2 sprites are like type 0 but the - data is held in the last 8 bytes of every 16). Examples are: - - Type 0: shogwarr, blazeon, bakubrkr. - Type 1: gtmr. - Type 2: berlwall - -Offset: Format: Value: - -0000.w Attribute (type 0 & 2) - - f--- ---- ---- ---- Multisprite: Use Latched Code + 1 - -e-- ---- ---- ---- Multisprite: Use Latched Color (And Flip?) - --d- ---- ---- ---- Multisprite: Use Latched X,Y As Offsets - ---c ba-- ---- ---- - ---- --9- ---- ---- High Priority (vs FG Tiles Of High Priority) - ---- ---8 ---- ---- High Priority (vs BG Tiles Of High Priority) - ---- ---- 7654 32-- Color - ---- ---- ---- --1- X Flip - ---- ---- ---- ---0 Y Flip - - Attribute (type 1) - - f--- ---- ---- ---- Multisprite: Use Latched Code + 1 - -e-- ---- ---- ---- Multisprite: Use Latched Color (And Flip?) - --d- ---- ---- ---- Multisprite: Use Latched X,Y As Offsets - ---c ba-- ---- ---- - ---- --9- ---- ---- X Flip - ---- ---8 ---- ---- Y Flip - ---- ---- 7--- ---- High Priority (vs FG Tiles Of High Priority) - ---- ---- -6-- ---- High Priority (vs BG Tiles Of High Priority) - ---- ---- --54 3210 Color - -0002.w Code -0004.w X Position << 6 -0006.w Y Position << 6 - -***************************************************************************/ - -#define USE_LATCHED_XY 1 -#define USE_LATCHED_CODE 2 -#define USE_LATCHED_COLOR 4 - -static int kaneko16_parse_sprite_type012(running_machine &machine, int i, struct tempsprite *s) -{ - kaneko16_state *state = machine.driver_data(); - UINT16 *spriteram16 = state->m_spriteram; - int attr, xoffs, offs; - - if (state->m_sprite_type == 2) offs = i * 16/2 + 0x8/2; - else offs = i * 8/2; - - if (offs >= (state->m_spriteram.bytes()/2)) return -1; - - attr = spriteram16[offs + 0]; - s->code = spriteram16[offs + 1]; - s->x = spriteram16[offs + 2]; - s->y = spriteram16[offs + 3]; - - if (state->m_sprite_type == 1) - { - s->color = (attr & 0x003f); - s->priority = (attr & 0x00c0) >> 6; - s->flipy = (attr & 0x0100); - s->flipx = (attr & 0x0200); - s->code += (s->y & 1) << 16; // bloodwar - } - else - { - s->flipy = (attr & 0x0001); - s->flipx = (attr & 0x0002); - s->color = (attr & 0x00fc) >> 2; - s->priority = (attr & 0x0300) >> 8; - } - xoffs = (attr & 0x1800) >> 11; - s->yoffs = state->m_sprites_regs[0x10/2 + xoffs*2 + 1]; - s->xoffs = state->m_sprites_regs[0x10/2 + xoffs*2 + 0]; - -if (state->m_sprite_flipy) -{ - s->yoffs -= state->m_sprites_regs[0x2/2]; - s->yoffs -= machine.primary_screen->visible_area().min_y<<6; -} -else -{ - s->yoffs -= state->m_sprites_regs[0x2/2]; - s->yoffs += machine.primary_screen->visible_area().min_y<<6; -} - - return ( (attr & 0x2000) ? USE_LATCHED_XY : 0 ) | - ( (attr & 0x4000) ? USE_LATCHED_COLOR : 0 ) | - ( (attr & 0x8000) ? USE_LATCHED_CODE : 0 ) ; -} - -// custom function to draw a single sprite. needed to keep correct sprites - sprites and sprites - tilemaps priorities -static void kaneko16_draw_sprites_custom(bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, - UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, - int priority) -{ - pen_t pen_base = gfx->color_base + gfx->color_granularity * (color % gfx->total_colors); - const UINT8 *source_base = gfx_element_get_data(gfx, code % gfx->total_elements); - bitmap_ind8 &priority_bitmap = gfx->machine().priority_bitmap; - int sprite_screen_height = ((1<<16)*gfx->height+0x8000)>>16; - int sprite_screen_width = ((1<<16)*gfx->width+0x8000)>>16; - - if (sprite_screen_width && sprite_screen_height) - { - /* compute sprite increment per screen pixel */ - int dx = (gfx->width<<16)/sprite_screen_width; - int dy = (gfx->height<<16)/sprite_screen_height; - - int ex = sx+sprite_screen_width; - int ey = sy+sprite_screen_height; - - int x_index_base; - int y_index; - - if( flipx ) - { - x_index_base = (sprite_screen_width-1)*dx; - dx = -dx; - } - else - { - x_index_base = 0; - } - - if( flipy ) - { - y_index = (sprite_screen_height-1)*dy; - dy = -dy; - } - else - { - y_index = 0; - } - - if( sx < clip.min_x) - { /* clip left */ - int pixels = clip.min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip.min_y ) - { /* clip top */ - int pixels = clip.min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip.max_x+1 ) - { /* clip right */ - int pixels = ex-clip.max_x-1; - ex -= pixels; - } - if( ey > clip.max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip.max_y-1; - ey -= pixels; - } - - if( ex>sx ) - { /* skip if inner loop doesn't draw anything */ - int y; - - for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = &dest_bmp.pix16(y); - UINT8 *pri = &priority_bitmap.pix8(y); - - int x, x_index = x_index_base; - for( x=sx; x>16]; - if( c != 0 ) - { - if (pri[x] < priority) - dest[x] = pen_base + c; - pri[x] = 0xff; // mark it "already drawn" - } - x_index += dx; - } - - y_index += dy; - } - } - } -} - -/* Build a list of sprites to display & draw them */ - -void kaneko16_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - kaneko16_state *state = machine.driver_data(); - /* Sprites *must* be parsed from the first in RAM to the last, - because of the multisprite feature. But they *must* be drawn - from the last in RAM (frontmost) to the first in order to - cope with priorities using pdrawgfx. - - Hence we parse them from first to last and put the result - in a temp buffer, then draw the buffer's contents from last - to first. */ - - int max = (machine.primary_screen->width() > 0x100) ? (0x200<<6) : (0x100<<6); - - int i = 0; - struct tempsprite *s = state->m_first_sprite; - - /* These values are latched from the last sprite. */ - int x = 0; - int y = 0; - int code = 0; - int color = 0; - int priority = 0; - int xoffs = 0; - int yoffs = 0; - int flipx = 0; - int flipy = 0; - - while (1) - { - int flags; - - switch( state->m_sprite_type ) - { - case 0: - case 1: - case 2: flags = kaneko16_parse_sprite_type012(machine, i,s); break; - default: flags = -1; - } - - if (flags == -1) // End of Sprites - break; - - if (flags & USE_LATCHED_CODE) - s->code = ++code; // Use the latched code + 1 .. - else - code = s->code; // .. or latch this value - - - if (flags & USE_LATCHED_COLOR) - { - s->color = color; - s->priority = priority; - s->xoffs = xoffs; - s->yoffs = yoffs; - - if (state->m_sprite_fliptype==0) - { - s->flipx = flipx; - s->flipy = flipy; - } - } - else - { - color = s->color; - priority = s->priority; - xoffs = s->xoffs; - yoffs = s->yoffs; - - if (state->m_sprite_fliptype==0) - { - flipx = s->flipx; - flipy = s->flipy; - } - } - - // brap boys explicitly doesn't want the flip to be latched, maybe there is a different bit to enable that behavior? - if (state->m_sprite_fliptype==1) - { - flipx = s->flipx; - flipy = s->flipy; - } - - if (flags & USE_LATCHED_XY) - { - s->x += x; - s->y += y; - } - // Always latch the latest result - x = s->x; - y = s->y; - - /* We can now buffer this sprite */ - - s->x = s->xoffs + s->x; - s->y = s->yoffs + s->y; - - s->x += state->m_sprite_xoffs; - s->y += state->m_sprite_yoffs; - - if (state->m_sprite_flipx) { s->x = max - s->x - (16<<6); s->flipx = !s->flipx; } - if (state->m_sprite_flipy) { s->y = max - s->y - (16<<6); s->flipy = !s->flipy; } - - s->x = ( (s->x & 0x7fc0) - (s->x & 0x8000) ) / 0x40; - s->y = ( (s->y & 0x7fc0) - (s->y & 0x8000) ) / 0x40; - - i++; - s++; - } - - - /* Let's finally draw the sprites we buffered, in reverse order - (for pdrawgfx) */ - - for (s--; s >= state->m_first_sprite; s--) - { - int curr_pri = s->priority; - - UINT32 primask = state->m_priority.sprite[curr_pri]; - - kaneko16_draw_sprites_custom( - bitmap,cliprect,machine.gfx[0], - s->code, - s->color, - s->flipx, s->flipy, - s->x, s->y, - primask ); - } -} - - - -/*************************************************************************** - - - Sprites Registers - - Offset: Format: Value: - - 0000.w f--- ---- ---- ---- Sprites Disable?? (see blazeon) - -edc ba98 7654 3--- - ---- ---- ---- -2-- Keep sprites on screen (only sprites types 0 and 2) - ---- ---- ---- --1- Flip X - ---- ---- ---- ---0 Flip Y - - 0002.w Y Offset << 6 (Global) - - - 0004..000e.w ? - - - 0010.w X Offset << 6 #0 - 0012.w Y Offset << 6 #0 - - 0014.w X Offset << 6 #1 - 0016.w Y Offset << 6 #1 - - 0018.w X Offset << 6 #2 - 001a.w Y Offset << 6 #2 - - 001c.w X Offset << 6 #3 - 001e.w Y Offset << 6 #3 - -***************************************************************************/ - -/* -[gtmr] - -Initial self test: -600000: 4BC0 94C0 4C40 94C0-0404 0002 0000 0000 (Layers 1 regs) -680000: 4BC0 94C0 4C40 94C0-1C1C 0002 0000 0000 (Layers 2 regs) -Race start: -600000: DC00 7D00 DC80 7D00-0404 0002 0000 0000 (Layers 1 regs) -680000: DC00 7D00 DC80 7D00-1C1C 0002 0000 0000 (Layers 2 regs) - -[gtmr] -700000: 0040 0000 0001 0180-0000 0000 0000 0000 (Sprites regs) -700010: 0040 0000 0040 0000-0040 0000 2840 1E00 ; 1,0 .. a1,78 - ; a0*2=screenx/2 - ; 78*2=screeny/2 -FLIP ON: -700000: 0043 FFC0 0001 0180-0000 0000 0000 0000 (Sprites regs) -700010: 2FC0 4400 2FC0 4400-2FC0 4400 57C0 6200 ; bf,110 .. 15f,188 - ; 15f-bf=a0! 188-110=78! - -[berlwall] -600000: 48CC 03C0 0001 0100-0000 0000 0000 0000 (Sprites regs) -600010: 0000 0000 0000 0000-0000 0000 0000 0000 -FLIP ON: -600000: 48CF FC00 0001 0100-0000 0000 0000 0000 (Sprites regs) -600010: 0000 0000 0000 0000-0000 0000 0000 0000 - -[mgcrystl] -900000: 4FCC 0000 0040 00C0-xxxx 0001 0001 0001 (Sprites regs) -900010: 0000 FC40 A000 9C40-1E00 1A40 0000 FC40 -FLIP ON: -900000: 4FCF 0000 0040 00C0-xxxx 0001 0001 0001 (Sprites regs) -900010: 0000 0400 A000 A400-1E00 2200 0000 0400 ; +1f<<6 on y -*/ - -READ16_MEMBER(kaneko16_state::kaneko16_sprites_regs_r) -{ - return m_sprites_regs[offset]; -} - -WRITE16_MEMBER(kaneko16_state::kaneko16_sprites_regs_w) -{ - UINT16 new_data; - - COMBINE_DATA(&m_sprites_regs[offset]); - new_data = m_sprites_regs[offset]; - - switch (offset) - { - case 0: - if (ACCESSING_BITS_0_7) - { - m_sprite_flipx = new_data & 2; - m_sprite_flipy = new_data & 1; - - if(m_sprite_type == 0 || m_sprite_type == 2) - m_keep_sprites = ~new_data & 4; - } - - break; - } - -// logerror("CPU #0 PC %06X : Warning, sprites reg %04X <- %04X\n",cpu_get_pc(&space.device()),offset*2,data); -} - - @@ -603,24 +140,6 @@ WRITE16_MEMBER(kaneko16_state::kaneko16_bg15_reg_w) -static void kaneko16_render_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - kaneko16_state *state = machine.driver_data(); - /* Sprites last (rendered with pdrawgfx, so they can slip - in between the layers) */ - - if(state->m_keep_sprites) - { - /* keep sprites on screen */ - kaneko16_draw_sprites(machine,state->m_sprites_bitmap,cliprect); - copybitmap_trans(bitmap,state->m_sprites_bitmap,0,0,0,0,cliprect,0); - } - else - { - state->m_sprites_bitmap.fill(0, cliprect); - kaneko16_draw_sprites(machine,bitmap,cliprect); - } -} static void kaneko16_render_15bpp_bitmap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { @@ -645,14 +164,22 @@ static void kaneko16_render_15bpp_bitmap(running_machine &machine, bitmap_ind16 static void kaneko16_fill_bitmap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { + kaneko16_state *state = machine.driver_data(); - if(state->m_sprite_type == 1) - bitmap.fill(0x7f00, cliprect); - else - /* Fill the bitmap with pen 0. This is wrong, but will work most of - the times. To do it right, each pixel should be drawn with pen 0 - of the bottomost tile that covers it (which is pretty tricky to do) */ - bitmap.fill(0, cliprect); + if (state->m_kaneko_spr) + if(state->m_kaneko_spr->get_sprite_type()== 1) + { + bitmap.fill(0x7f00, cliprect); + return; + } + + + + /* Fill the bitmap with pen 0. This is wrong, but will work most of + the times. To do it right, each pixel should be drawn with pen 0 + of the bottomost tile that covers it (which is pretty tricky to do) */ + bitmap.fill(0, cliprect); + } static SCREEN_UPDATE_IND16( common ) @@ -668,7 +195,7 @@ static SCREEN_UPDATE_IND16( common ) for ( i = 0; i < 8; i++ ) { if (state->m_view2_0) state->m_view2_0->render_tilemap_chip(bitmap,cliprect,i); - if (state->m_view2_1) state->m_view2_1->render_tilemap_chip_alt(bitmap,cliprect,i, state->m_priority.VIEW2_2_pri); + if (state->m_view2_1) state->m_view2_1->render_tilemap_chip_alt(bitmap,cliprect,i, state->VIEW2_2_pri); } return 0; @@ -684,7 +211,7 @@ SCREEN_UPDATE_IND16(berlwall) if (!state->m_disp_enable) return 0; SCREEN_UPDATE16_CALL(common); - kaneko16_render_sprites(screen.machine(),bitmap,cliprect); + state->m_kaneko_spr->kaneko16_render_sprites(screen.machine(),bitmap,cliprect, state->m_spriteram, state->m_spriteram.bytes()); return 0; } @@ -705,7 +232,7 @@ SCREEN_UPDATE_IND16( kaneko16 ) if (!state->m_disp_enable) return 0; SCREEN_UPDATE16_CALL(common); - kaneko16_render_sprites(screen.machine(),bitmap,cliprect); + state->m_kaneko_spr->kaneko16_render_sprites(screen.machine(),bitmap,cliprect, state->m_spriteram, state->m_spriteram.bytes()); return 0; } @@ -753,7 +280,7 @@ SCREEN_UPDATE_IND16( galsnew ) SCREEN_UPDATE16_CALL(common); - kaneko16_render_sprites(screen.machine(),bitmap,cliprect); + state->m_kaneko_spr->kaneko16_render_sprites(screen.machine(),bitmap,cliprect, state->m_spriteram, state->m_spriteram.bytes()); return 0; } diff --git a/src/mame/video/kaneko_spr.c b/src/mame/video/kaneko_spr.c new file mode 100644 index 00000000000..7daab9f86f1 --- /dev/null +++ b/src/mame/video/kaneko_spr.c @@ -0,0 +1,563 @@ +/* Kaneko Sprites */ + +/* + Kaneko 16-bit sprites + VU-002 052 151021 ('type 0') (blazeon, berlwall etc., confirmed) + KC-002 L0002 023 9321EK702 ('type 1') (gtmr, bloodwar etc., confirmed) + + + [ 1024 Sprites ] + + Sprites are 16 x 16 x 4 in the older games, 16 x 16 x 8 in + gtmr & gtmr2. + Sprites types 0 and 2 can also have a simple effect keeping + sprites on the screen + + + Notes: + - Blaze On has 2 sprite chips, with 2 sets of sprite registers, the + existing code here just handles it as one, ignoring the second + set of registers, we should really be producing 2 sprite bitmaps + and manually mixing them. + +*/ + +#include "emu.h" +#include "kaneko_spr.h" + +const device_type KANEKO16_SPRITE = &device_creator; + +kaneko16_sprite_device::kaneko16_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, KANEKO16_SPRITE, "kaneko16_sprite_device", tag, owner, clock) +{ + m_keep_sprites = 0; // default disabled for games not using it + + + m_sprite_xoffs = 0; + m_sprite_yoffs = 0; + + m_sprite_fliptype = 0; + m_sprite_type = 0; + + m_altspacing = 0; +/* + Sx = Sprites with priority x, x = tiles with priority x, + Sprites - Tiles Order (bottom -> top): + + 0 S0 1 2 3 + 0 1 S1 2 3 + 0 1 2 S2 3 + 0 1 2 3 S3 +*/ + m_priority.sprite[0] = 1; // above tile[0], below the others + m_priority.sprite[1] = 2; // above tile[0-1], below the others + m_priority.sprite[2] = 3; // above tile[0-2], below the others + m_priority.sprite[3] = 8; // above all +} + + +void kaneko16_sprite_device::device_start() +{ + m_first_sprite = auto_alloc_array(machine(), struct tempsprite, 0x400); + m_sprites_regs = auto_alloc_array_clear(machine(), UINT16, 0x20/2); + machine().primary_screen->register_screen_bitmap(m_sprites_bitmap); +} + + + +void kaneko16_sprite_device::device_reset() +{ + m_sprite_flipx = 0; + m_sprite_flipy = 0; +} + +void kaneko16_sprite_device::set_priorities(device_t &device, int pri0, int pri1, int pri2, int pri3) +{ + kaneko16_sprite_device &dev = downcast(device); + + dev.m_priority.sprite[0] = pri0; + dev.m_priority.sprite[1] = pri1; + dev.m_priority.sprite[2] = pri2; + dev.m_priority.sprite[3] = pri3; +} + +void kaneko16_sprite_device::set_type(device_t &device, int type) +{ + kaneko16_sprite_device &dev = downcast(device); + dev.m_sprite_type = type; +} + +void kaneko16_sprite_device::set_altspacing(device_t &device, int spacing) +{ + kaneko16_sprite_device &dev = downcast(device); + dev.m_altspacing = spacing; +} + +void kaneko16_sprite_device::set_fliptype(device_t &device, int fliptype) +{ + kaneko16_sprite_device &dev = downcast(device); + dev.m_sprite_fliptype = fliptype; + +} + +void kaneko16_sprite_device::set_offsets(device_t &device, int xoffs, int yoffs) +{ + kaneko16_sprite_device &dev = downcast(device); + dev.m_sprite_xoffs = xoffs; + dev.m_sprite_yoffs = yoffs; +} + + + + + + + + +/*************************************************************************** + + Sprites Drawing + + Sprite data is layed out in RAM in different ways for different games + (type 0,1,2,etc.). This basically involves the bits in the attribute + word to be shuffled around and/or the words being in different order. + + Each sprite is always stuffed in 4 words. There may be some extra + padding words though (e.g. type 2 sprites are like type 0 but the + data is held in the last 8 bytes of every 16). Examples are: + + Type 0: shogwarr, blazeon, bakubrkr. + Type 1: gtmr. + Type 2: berlwall + +Offset: Format: Value: + +0000.w Attribute (type 0 & 2) + + f--- ---- ---- ---- Multisprite: Use Latched Code + 1 + -e-- ---- ---- ---- Multisprite: Use Latched Color (And Flip?) + --d- ---- ---- ---- Multisprite: Use Latched X,Y As Offsets + ---c ba-- ---- ---- + ---- --9- ---- ---- High Priority (vs FG Tiles Of High Priority) + ---- ---8 ---- ---- High Priority (vs BG Tiles Of High Priority) + ---- ---- 7654 32-- Color + ---- ---- ---- --1- X Flip + ---- ---- ---- ---0 Y Flip + + Attribute (type 1) + + f--- ---- ---- ---- Multisprite: Use Latched Code + 1 + -e-- ---- ---- ---- Multisprite: Use Latched Color (And Flip?) + --d- ---- ---- ---- Multisprite: Use Latched X,Y As Offsets + ---c ba-- ---- ---- + ---- --9- ---- ---- X Flip + ---- ---8 ---- ---- Y Flip + ---- ---- 7--- ---- High Priority (vs FG Tiles Of High Priority) + ---- ---- -6-- ---- High Priority (vs BG Tiles Of High Priority) + ---- ---- --54 3210 Color + +0002.w Code +0004.w X Position << 6 +0006.w Y Position << 6 + +***************************************************************************/ + +#define USE_LATCHED_XY 1 +#define USE_LATCHED_CODE 2 +#define USE_LATCHED_COLOR 4 + +int kaneko16_sprite_device::kaneko16_parse_sprite_type012(running_machine &machine, int i, struct tempsprite *s, UINT16* spriteram16, int spriteram16_bytes) +{ + int attr, xoffs, offs; + + if (m_altspacing) offs = i * 16/2 + 0x8/2; + else offs = i * 8/2; + + if (offs >= (spriteram16_bytes/2)) return -1; + + attr = spriteram16[offs + 0]; + s->code = spriteram16[offs + 1]; + s->x = spriteram16[offs + 2]; + s->y = spriteram16[offs + 3]; + + if (m_sprite_type == 1) + { + s->color = (attr & 0x003f); + s->priority = (attr & 0x00c0) >> 6; + s->flipy = (attr & 0x0100); + s->flipx = (attr & 0x0200); + s->code += (s->y & 1) << 16; // bloodwar + } + else + { + s->flipy = (attr & 0x0001); + s->flipx = (attr & 0x0002); + s->color = (attr & 0x00fc) >> 2; + s->priority = (attr & 0x0300) >> 8; + } + + xoffs = (attr & 0x1800) >> 11; + s->yoffs = m_sprites_regs[0x10/2 + xoffs*2 + 1]; + s->xoffs = m_sprites_regs[0x10/2 + xoffs*2 + 0]; + + if (m_sprite_flipy) + { + s->yoffs -= m_sprites_regs[0x2/2]; + s->yoffs -= machine.primary_screen->visible_area().min_y<<6; + } + else + { + s->yoffs -= m_sprites_regs[0x2/2]; + s->yoffs += machine.primary_screen->visible_area().min_y<<6; + } + + return ( (attr & 0x2000) ? USE_LATCHED_XY : 0 ) | + ( (attr & 0x4000) ? USE_LATCHED_COLOR : 0 ) | + ( (attr & 0x8000) ? USE_LATCHED_CODE : 0 ) ; +} + +// custom function to draw a single sprite. needed to keep correct sprites - sprites and sprites - tilemaps priorities +void kaneko16_sprite_device::kaneko16_draw_sprites_custom(bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, + UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, + int priority) +{ + pen_t pen_base = gfx->color_base + gfx->color_granularity * (color % gfx->total_colors); + const UINT8 *source_base = gfx_element_get_data(gfx, code % gfx->total_elements); + bitmap_ind8 &priority_bitmap = gfx->machine().priority_bitmap; + int sprite_screen_height = ((1<<16)*gfx->height+0x8000)>>16; + int sprite_screen_width = ((1<<16)*gfx->width+0x8000)>>16; + + if (sprite_screen_width && sprite_screen_height) + { + /* compute sprite increment per screen pixel */ + int dx = (gfx->width<<16)/sprite_screen_width; + int dy = (gfx->height<<16)/sprite_screen_height; + + int ex = sx+sprite_screen_width; + int ey = sy+sprite_screen_height; + + int x_index_base; + int y_index; + + if( flipx ) + { + x_index_base = (sprite_screen_width-1)*dx; + dx = -dx; + } + else + { + x_index_base = 0; + } + + if( flipy ) + { + y_index = (sprite_screen_height-1)*dy; + dy = -dy; + } + else + { + y_index = 0; + } + + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; + } + + if( ex>sx ) + { /* skip if inner loop doesn't draw anything */ + int y; + + for( y=sy; y>16) * gfx->line_modulo; + UINT16 *dest = &dest_bmp.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); + + int x, x_index = x_index_base; + for( x=sx; x>16]; + if( c != 0 ) + { + if (pri[x] < priority) + dest[x] = pen_base + c; + pri[x] = 0xff; // mark it "already drawn" + } + x_index += dx; + } + + y_index += dy; + } + } + } +} + +/* Build a list of sprites to display & draw them */ + +void kaneko16_sprite_device::kaneko16_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram16, int spriteram16_bytes) +{ + /* Sprites *must* be parsed from the first in RAM to the last, + because of the multisprite feature. But they *must* be drawn + from the last in RAM (frontmost) to the first in order to + cope with priorities using pdrawgfx. + + Hence we parse them from first to last and put the result + in a temp buffer, then draw the buffer's contents from last + to first. */ + + int max = (machine.primary_screen->width() > 0x100) ? (0x200<<6) : (0x100<<6); + + int i = 0; + struct tempsprite *s = m_first_sprite; + + /* These values are latched from the last sprite. */ + int x = 0; + int y = 0; + int code = 0; + int color = 0; + int priority = 0; + int xoffs = 0; + int yoffs = 0; + int flipx = 0; + int flipy = 0; + + while (1) + { + int flags; + + switch( m_sprite_type ) + { + case 0: + case 1: flags = kaneko16_parse_sprite_type012(machine, i,s, spriteram16, spriteram16_bytes); break; + default: flags = -1; + } + + if (flags == -1) // End of Sprites + break; + + if (flags & USE_LATCHED_CODE) + s->code = ++code; // Use the latched code + 1 .. + else + code = s->code; // .. or latch this value + + + if (flags & USE_LATCHED_COLOR) + { + s->color = color; + s->priority = priority; + s->xoffs = xoffs; + s->yoffs = yoffs; + + if (m_sprite_fliptype==0) + { + s->flipx = flipx; + s->flipy = flipy; + } + } + else + { + color = s->color; + priority = s->priority; + xoffs = s->xoffs; + yoffs = s->yoffs; + + if (m_sprite_fliptype==0) + { + flipx = s->flipx; + flipy = s->flipy; + } + } + + // brap boys explicitly doesn't want the flip to be latched, maybe there is a different bit to enable that behavior? + if (m_sprite_fliptype==1) + { + flipx = s->flipx; + flipy = s->flipy; + } + + if (flags & USE_LATCHED_XY) + { + s->x += x; + s->y += y; + } + // Always latch the latest result + x = s->x; + y = s->y; + + /* We can now buffer this sprite */ + + s->x = s->xoffs + s->x; + s->y = s->yoffs + s->y; + + s->x += m_sprite_xoffs; + s->y += m_sprite_yoffs; + + if (m_sprite_flipx) { s->x = max - s->x - (16<<6); s->flipx = !s->flipx; } + if (m_sprite_flipy) { s->y = max - s->y - (16<<6); s->flipy = !s->flipy; } + + s->x = ( (s->x & 0x7fc0) - (s->x & 0x8000) ) / 0x40; + s->y = ( (s->y & 0x7fc0) - (s->y & 0x8000) ) / 0x40; + + i++; + s++; + } + + + /* Let's finally draw the sprites we buffered, in reverse order + (for pdrawgfx) */ + + for (s--; s >= m_first_sprite; s--) + { + int curr_pri = s->priority; + + UINT32 primask = m_priority.sprite[curr_pri]; + + kaneko16_draw_sprites_custom( + bitmap,cliprect,machine.gfx[0], + s->code, + s->color, + s->flipx, s->flipy, + s->x, s->y, + primask ); + } +} + + + +/*************************************************************************** + + + Sprites Registers + + Offset: Format: Value: + + 0000.w f--- ---- ---- ---- Sprites Disable?? (see blazeon) + -edc ba98 7654 3--- + ---- ---- ---- -2-- Keep sprites on screen (only sprites types 0 and 2) + ---- ---- ---- --1- Flip X + ---- ---- ---- ---0 Flip Y + + 0002.w Y Offset << 6 (Global) + + + 0004..000e.w ? + + + 0010.w X Offset << 6 #0 + 0012.w Y Offset << 6 #0 + + 0014.w X Offset << 6 #1 + 0016.w Y Offset << 6 #1 + + 0018.w X Offset << 6 #2 + 001a.w Y Offset << 6 #2 + + 001c.w X Offset << 6 #3 + 001e.w Y Offset << 6 #3 + +***************************************************************************/ + +/* +[gtmr] + +Initial self test: +600000: 4BC0 94C0 4C40 94C0-0404 0002 0000 0000 (Layers 1 regs) +680000: 4BC0 94C0 4C40 94C0-1C1C 0002 0000 0000 (Layers 2 regs) +Race start: +600000: DC00 7D00 DC80 7D00-0404 0002 0000 0000 (Layers 1 regs) +680000: DC00 7D00 DC80 7D00-1C1C 0002 0000 0000 (Layers 2 regs) + +[gtmr] +700000: 0040 0000 0001 0180-0000 0000 0000 0000 (Sprites regs) +700010: 0040 0000 0040 0000-0040 0000 2840 1E00 ; 1,0 .. a1,78 + ; a0*2=screenx/2 + ; 78*2=screeny/2 +FLIP ON: +700000: 0043 FFC0 0001 0180-0000 0000 0000 0000 (Sprites regs) +700010: 2FC0 4400 2FC0 4400-2FC0 4400 57C0 6200 ; bf,110 .. 15f,188 + ; 15f-bf=a0! 188-110=78! + +[berlwall] +600000: 48CC 03C0 0001 0100-0000 0000 0000 0000 (Sprites regs) +600010: 0000 0000 0000 0000-0000 0000 0000 0000 +FLIP ON: +600000: 48CF FC00 0001 0100-0000 0000 0000 0000 (Sprites regs) +600010: 0000 0000 0000 0000-0000 0000 0000 0000 + +[mgcrystl] +900000: 4FCC 0000 0040 00C0-xxxx 0001 0001 0001 (Sprites regs) +900010: 0000 FC40 A000 9C40-1E00 1A40 0000 FC40 +FLIP ON: +900000: 4FCF 0000 0040 00C0-xxxx 0001 0001 0001 (Sprites regs) +900010: 0000 0400 A000 A400-1E00 2200 0000 0400 ; +1f<<6 on y +*/ + +READ16_MEMBER(kaneko16_sprite_device::kaneko16_sprites_regs_r) +{ + return m_sprites_regs[offset]; +} + +WRITE16_MEMBER(kaneko16_sprite_device::kaneko16_sprites_regs_w) +{ + UINT16 new_data; + + COMBINE_DATA(&m_sprites_regs[offset]); + new_data = m_sprites_regs[offset]; + + switch (offset) + { + case 0: + if (ACCESSING_BITS_0_7) + { + m_sprite_flipx = new_data & 2; + m_sprite_flipy = new_data & 1; + + if(m_sprite_type == 0) + m_keep_sprites = ~new_data & 4; + } + + break; + } + +// logerror("CPU #0 PC %06X : Warning, sprites reg %04X <- %04X\n",cpu_get_pc(&space.device()),offset*2,data); +} + + + +void kaneko16_sprite_device::kaneko16_render_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram16, int spriteram16_bytes) +{ + /* Sprites last (rendered with pdrawgfx, so they can slip + in between the layers) */ + + if(m_keep_sprites) + { + /* keep sprites on screen */ + kaneko16_draw_sprites(machine,m_sprites_bitmap, cliprect, spriteram16, spriteram16_bytes); + copybitmap_trans(bitmap,m_sprites_bitmap,0,0,0,0,cliprect,0); + } + else + { + m_sprites_bitmap.fill(0, cliprect); + kaneko16_draw_sprites(machine,bitmap,cliprect, spriteram16, spriteram16_bytes); + } +} diff --git a/src/mame/video/kaneko_spr.h b/src/mame/video/kaneko_spr.h new file mode 100644 index 00000000000..f1543d145b3 --- /dev/null +++ b/src/mame/video/kaneko_spr.h @@ -0,0 +1,106 @@ +/* Kaneko Sprites */ + +/* berlwall, blazeon etc. */ +#define MCFG_DEVICE_ADD_VU002_SPRITES \ + MCFG_DEVICE_ADD("kan_spr", KANEKO16_SPRITE, 0) \ + kaneko16_sprite_device::set_type(*device, 0); \ + +/* gtmr, gtmr2, bloodwar etc. */ +#define MCFG_DEVICE_ADD_KC002_SPRITES \ + MCFG_DEVICE_ADD("kan_spr", KANEKO16_SPRITE, 0) \ + kaneko16_sprite_device::set_type(*device, 1); \ + + + +typedef struct +{ + int sprite[4]; +} kaneko16_priority_t; + +struct tempsprite +{ + int code,color; + int x,y; + int xoffs,yoffs; + int flipx,flipy; + int priority; +}; + + + +class kaneko16_sprite_device : public device_t +{ +public: + kaneko16_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + static void set_type(device_t &device, int type); + static void set_altspacing(device_t &device, int spacing); + static void set_fliptype(device_t &device, int fliptype); + static void set_offsets(device_t &device, int xoffs, int yoffs); + + static void set_priorities(device_t &device, int pri0, int pri1, int pri2, int pri3); + + + + // sprite type: todo, different class instead (set when declaring device in MCFG) + int m_sprite_type; + + // alt ram addressing (set when declaring device in MCFG) + // used on Berlin Wall.. it's the same sprite chip, so probably just a different RAM hookup on the PCB, maybe also + // related to the 'COPY BOARD' protection check on one set? investigate.. + int m_altspacing; + + // flip latching (set when declaring device in MCFG ) probably needs figuring out properly, only brapboys wants it? + int m_sprite_fliptype; + + // offsets (set when declaring device in MCFG ) + UINT16 m_sprite_xoffs; + UINT16 m_sprite_yoffs; + + // priority for mixing (set when declaring device in MCFG ) + kaneko16_priority_t m_priority; + + + + // used in the bitmap clear functions + int get_sprite_type(void) + { + return m_sprite_type; + } + + + + // registers + UINT16 m_sprite_flipx; + UINT16 m_sprite_flipy; + UINT16* m_sprites_regs; + + struct tempsprite *m_first_sprite; + int m_keep_sprites; + bitmap_ind16 m_sprites_bitmap; + + + void kaneko16_render_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram16, int spriteram16_bytes); + void kaneko16_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram16, int spriteram16_bytes); + + void kaneko16_draw_sprites_custom(bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, + UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, + int priority); + + int kaneko16_parse_sprite_type012(running_machine &machine, int i, struct tempsprite *s, UINT16* spriteram16, int spriteram16_bytes); + + + DECLARE_READ16_MEMBER(kaneko16_sprites_regs_r); + DECLARE_WRITE16_MEMBER(kaneko16_sprites_regs_w); + + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + +}; + +extern const device_type KANEKO16_SPRITE; +