Kaneko sprites are now a device. This should facilitate cleaning up video related files as well (sprites and tilemaps). [David Haywood]

Cleanup and notes for maygayep.c - From Haze (nw)
This commit is contained in:
Scott Stone 2012-08-08 23:47:57 +00:00
parent 8d8f2056a3
commit 57c5cd82e9
12 changed files with 893 additions and 763 deletions

2
.gitattributes vendored
View File

@ -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

View File

@ -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<expro02_state>();
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<expro02_state>();
}
/*************************************
@ -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)

View File

@ -73,13 +73,9 @@ WRITE16_MEMBER(galpani2_state::galpani2_eeprom_w)
static MACHINE_RESET( galpani2 )
{
galpani2_state *state = machine.driver_data<galpani2_state>();
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)

View File

@ -104,71 +104,27 @@ Dip locations verified from manual for:
MACHINE_RESET( kaneko16 )
{
kaneko16_state *state = machine.driver_data<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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")

View File

@ -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 )

View File

@ -107,17 +107,7 @@ public:
static MACHINE_RESET( sandscrp )
{
sandscrp_state *state = machine.driver_data<sandscrp_state>();
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<sandscrp_state>();
}
/* 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;

View File

@ -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<UINT16> m_spriteram;
optional_shared_ptr<UINT16> m_bg15_reg;
optional_shared_ptr<UINT16> m_bg15_select;
optional_shared_ptr<UINT16> m_sprites_regs;
optional_shared_ptr<UINT16> m_mcu_ram;
optional_shared_ptr<UINT16> m_mainram;
optional_shared_ptr<UINT16> m_galsnew_bg_pixram;
optional_shared_ptr<UINT16> m_galsnew_fg_pixram;
optional_device<kaneko_view2_tilemap_device> m_view2_0;
optional_device<kaneko_view2_tilemap_device> m_view2_1;
optional_device<kaneko16_sprite_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);

View File

@ -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 \

View File

@ -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;
}

View File

@ -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<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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<kaneko16_state>();
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<ey; y++ )
{
const UINT8 *source = source_base + (y_index>>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<ex; x++ )
{
int c = source[x_index>>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<kaneko16_state>();
/* 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<kaneko16_state>();
/* 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<kaneko16_state>();
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;
}

563
src/mame/video/kaneko_spr.c Normal file
View File

@ -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::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<kaneko16_sprite_device &>(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<kaneko16_sprite_device &>(device);
dev.m_sprite_type = type;
}
void kaneko16_sprite_device::set_altspacing(device_t &device, int spacing)
{
kaneko16_sprite_device &dev = downcast<kaneko16_sprite_device &>(device);
dev.m_altspacing = spacing;
}
void kaneko16_sprite_device::set_fliptype(device_t &device, int fliptype)
{
kaneko16_sprite_device &dev = downcast<kaneko16_sprite_device &>(device);
dev.m_sprite_fliptype = fliptype;
}
void kaneko16_sprite_device::set_offsets(device_t &device, int xoffs, int yoffs)
{
kaneko16_sprite_device &dev = downcast<kaneko16_sprite_device &>(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<ey; y++ )
{
const UINT8 *source = source_base + (y_index>>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<ex; x++ )
{
int c = source[x_index>>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);
}
}

106
src/mame/video/kaneko_spr.h Normal file
View File

@ -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;