From 1f899f4559815cf1a3f0c8e8192c0bb4bc604570 Mon Sep 17 00:00:00 2001 From: Scott Stone Date: Fri, 25 Mar 2011 00:40:43 +0000 Subject: [PATCH] Converted Tattoo Assassins (and Night Slashers) to use deco16ic.c, fixing some corrupt graphics in Tattoo Assassins (which have been there since it was first added) [David Haywood] --- src/mame/drivers/deco32.c | 119 +++++++++++++++------------ src/mame/includes/deco32.h | 10 ++- src/mame/video/deco16ic.c | 34 +++++--- src/mame/video/deco16ic.h | 2 +- src/mame/video/deco32.c | 159 ++++--------------------------------- 5 files changed, 116 insertions(+), 208 deletions(-) diff --git a/src/mame/drivers/deco32.c b/src/mame/drivers/deco32.c index 5a2034231c6..a4e19abac03 100644 --- a/src/mame/drivers/deco32.c +++ b/src/mame/drivers/deco32.c @@ -264,6 +264,7 @@ static const deco16ic_interface fghthist_deco16ic_intf = }; +#if 0 static WRITE32_HANDLER( deco32_pf12_control_w ) { deco32_state *state = space->machine->driver_data(); @@ -278,7 +279,7 @@ static WRITE32_HANDLER( deco32_pf34_control_w ) COMBINE_DATA(&state->pf34_control[offset]); space->machine->primary_screen->update_partial(space->machine->primary_screen->vpos()); } - +#endif static TIMER_DEVICE_CALLBACK( interrupt_gen ) @@ -729,16 +730,11 @@ static WRITE32_HANDLER( deco32_buffer_spriteram2_w ) } - - -static READ32_HANDLER( deco32_pf1_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf1_rowscroll[offset] ^ 0xffff0000; } -static READ32_HANDLER( deco32_pf2_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf2_rowscroll[offset] ^ 0xffff0000; } -static READ32_HANDLER( deco32_pf3_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf3_rowscroll[offset] ^ 0xffff0000; } -static READ32_HANDLER( deco32_pf4_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf4_rowscroll[offset] ^ 0xffff0000; } -static WRITE32_HANDLER( deco32_pf1_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf1_rowscroll[offset]); } -static WRITE32_HANDLER( deco32_pf2_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf2_rowscroll[offset]); } -static WRITE32_HANDLER( deco32_pf3_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf3_rowscroll[offset]); } -static WRITE32_HANDLER( deco32_pf4_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf4_rowscroll[offset]); } +// tattass tests these as 32-bit ram, even if only 16-bits are hooked up to the tilemap chip - does it mirror parts of the dword? +static WRITE32_HANDLER( deco32_pf1_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); COMBINE_DATA(&state->pf1_rowscroll32[offset]); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf1_rowscroll[offset]); } +static WRITE32_HANDLER( deco32_pf2_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); COMBINE_DATA(&state->pf2_rowscroll32[offset]); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf2_rowscroll[offset]); } +static WRITE32_HANDLER( deco32_pf3_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); COMBINE_DATA(&state->pf3_rowscroll32[offset]); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf3_rowscroll[offset]); } +static WRITE32_HANDLER( deco32_pf4_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); COMBINE_DATA(&state->pf4_rowscroll32[offset]); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf4_rowscroll[offset]); } static ADDRESS_MAP_START( captaven_map, ADDRESS_SPACE_PROGRAM, 32 ) @@ -763,14 +759,14 @@ static ADDRESS_MAP_START( captaven_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x190000, 0x191fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) AM_RANGE(0x192000, 0x193fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) /* Mirror address - bug in program code */ AM_RANGE(0x194000, 0x195fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w) - AM_RANGE(0x1a0000, 0x1a1fff) AM_READWRITE(deco32_pf1_rowscroll_r, deco32_pf1_rowscroll_w) - AM_RANGE(0x1a4000, 0x1a5fff) AM_READWRITE(deco32_pf2_rowscroll_r, deco32_pf2_rowscroll_w) + AM_RANGE(0x1a0000, 0x1a3fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) + AM_RANGE(0x1a4000, 0x1a5fff) AM_RAM_WRITE(deco32_pf2_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) AM_RANGE(0x1c0000, 0x1c001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf34_control_dword_r, deco16ic_pf34_control_dword_w) AM_RANGE(0x1d0000, 0x1d1fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf3_data_dword_r, deco16ic_pf3_data_dword_w) AM_RANGE(0x1d4000, 0x1d5fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf4_data_dword_r, deco16ic_pf4_data_dword_w) // unused - AM_RANGE(0x1e0000, 0x1e1fff) AM_READWRITE(deco32_pf3_rowscroll_r, deco32_pf3_rowscroll_w) - AM_RANGE(0x1e4000, 0x1e5fff) AM_READWRITE(deco32_pf4_rowscroll_r, deco32_pf4_rowscroll_w) // unused + AM_RANGE(0x1e0000, 0x1e3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) + AM_RANGE(0x1e4000, 0x1e5fff) AM_RAM_WRITE(deco32_pf4_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) // unused ADDRESS_MAP_END @@ -792,14 +788,14 @@ static ADDRESS_MAP_START( fghthist_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x182000, 0x183fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) AM_RANGE(0x184000, 0x185fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w) - AM_RANGE(0x192000, 0x192fff) AM_READWRITE(deco32_pf1_rowscroll_r, deco32_pf1_rowscroll_w) - AM_RANGE(0x194000, 0x194fff) AM_READWRITE(deco32_pf2_rowscroll_r, deco32_pf2_rowscroll_w) + AM_RANGE(0x192000, 0x193fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) + AM_RANGE(0x194000, 0x195fff) AM_RAM_WRITE(deco32_pf2_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) AM_RANGE(0x1a0000, 0x1a001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf12_control_dword_r, deco16ic_pf12_control_dword_w) AM_RANGE(0x1c2000, 0x1c3fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf3_data_dword_r, deco16ic_pf3_data_dword_w) AM_RANGE(0x1c4000, 0x1c5fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf4_data_dword_r, deco16ic_pf4_data_dword_w) - AM_RANGE(0x1d2000, 0x1d2fff) AM_READWRITE(deco32_pf3_rowscroll_r, deco32_pf3_rowscroll_w) - AM_RANGE(0x1d4000, 0x1d4fff) AM_READWRITE(deco32_pf4_rowscroll_r, deco32_pf4_rowscroll_w) + AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) + AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM_WRITE(deco32_pf4_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) AM_RANGE(0x1e0000, 0x1e001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf34_control_dword_r, deco16ic_pf34_control_dword_w) AM_RANGE(0x16c000, 0x16c01f) AM_READNOP @@ -825,14 +821,14 @@ static ADDRESS_MAP_START( fghthsta_memmap, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x182000, 0x183fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) AM_RANGE(0x184000, 0x185fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w) - AM_RANGE(0x192000, 0x192fff) AM_READWRITE(deco32_pf1_rowscroll_r, deco32_pf1_rowscroll_w) - AM_RANGE(0x194000, 0x194fff) AM_READWRITE(deco32_pf2_rowscroll_r, deco32_pf2_rowscroll_w) + AM_RANGE(0x192000, 0x193fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) + AM_RANGE(0x194000, 0x195fff) AM_RAM_WRITE(deco32_pf2_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) AM_RANGE(0x1a0000, 0x1a001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf12_control_dword_r, deco16ic_pf12_control_dword_w) AM_RANGE(0x1c2000, 0x1c3fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf3_data_dword_r, deco16ic_pf3_data_dword_w) AM_RANGE(0x1c4000, 0x1c5fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf4_data_dword_r, deco16ic_pf4_data_dword_w) - AM_RANGE(0x1d2000, 0x1d2fff) AM_READWRITE(deco32_pf3_rowscroll_r, deco32_pf3_rowscroll_w) - AM_RANGE(0x1d4000, 0x1d4fff) AM_READWRITE(deco32_pf4_rowscroll_r, deco32_pf4_rowscroll_w) + AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) + AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM_WRITE(deco32_pf4_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) AM_RANGE(0x1e0000, 0x1e001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf34_control_dword_r, deco16ic_pf34_control_dword_w) AM_RANGE(0x200000, 0x200fff) AM_READWRITE(deco16_146_fghthist_prot_r, deco16_146_fghthist_prot_w) AM_BASE(&deco32_prot_ram) @@ -967,17 +963,17 @@ static ADDRESS_MAP_START( tattass_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x17c010, 0x17c013) AM_WRITE(deco32_buffer_spriteram2_w) AM_RANGE(0x17c018, 0x17c01b) AM_WRITENOP /* Sprite 'CPU' (unused) */ - AM_RANGE(0x182000, 0x183fff) AM_RAM_WRITE(deco32_pf1_data_w) AM_BASE_MEMBER(deco32_state, pf1_data) - AM_RANGE(0x184000, 0x185fff) AM_RAM_WRITE(deco32_pf2_data_w) AM_BASE_MEMBER(deco32_state, pf2_data) - AM_RANGE(0x192000, 0x193fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) - AM_RANGE(0x194000, 0x195fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) - AM_RANGE(0x1a0000, 0x1a001f) AM_RAM_WRITE(deco32_pf12_control_w) AM_BASE_MEMBER(deco32_state, pf12_control) + AM_RANGE(0x182000, 0x183fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) + AM_RANGE(0x184000, 0x185fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w) + AM_RANGE(0x192000, 0x193fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) + AM_RANGE(0x194000, 0x195fff) AM_RAM_WRITE(deco32_pf2_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) + AM_RANGE(0x1a0000, 0x1a001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf12_control_dword_r, deco16ic_pf12_control_dword_w) - AM_RANGE(0x1c2000, 0x1c3fff) AM_RAM_WRITE(deco32_pf3_data_w) AM_BASE_MEMBER(deco32_state, pf3_data) - AM_RANGE(0x1c4000, 0x1c5fff) AM_RAM_WRITE(deco32_pf4_data_w) AM_BASE_MEMBER(deco32_state, pf4_data) - AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) - AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) - AM_RANGE(0x1e0000, 0x1e001f) AM_RAM_WRITE(deco32_pf34_control_w) AM_BASE_MEMBER(deco32_state, pf34_control) + AM_RANGE(0x1c2000, 0x1c3fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf3_data_dword_r, deco16ic_pf3_data_dword_w) + AM_RANGE(0x1c4000, 0x1c5fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf4_data_dword_r, deco16ic_pf4_data_dword_w) + AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) + AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM_WRITE(deco32_pf4_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) + AM_RANGE(0x1e0000, 0x1e001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf34_control_dword_r, deco16ic_pf34_control_dword_w) AM_RANGE(0x200000, 0x200fff) AM_READWRITE(tattass_prot_r, tattass_prot_w) AM_BASE(&deco32_prot_ram) ADDRESS_MAP_END @@ -1008,17 +1004,17 @@ static ADDRESS_MAP_START( nslasher_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x17c010, 0x17c013) AM_WRITE(deco32_buffer_spriteram2_w) AM_RANGE(0x17c018, 0x17c01b) AM_WRITENOP /* Sprite 'CPU' (unused) */ - AM_RANGE(0x182000, 0x183fff) AM_RAM_WRITE(deco32_pf1_data_w) AM_BASE_MEMBER(deco32_state, pf1_data) - AM_RANGE(0x184000, 0x185fff) AM_RAM_WRITE(deco32_pf2_data_w) AM_BASE_MEMBER(deco32_state, pf2_data) - AM_RANGE(0x192000, 0x193fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) - AM_RANGE(0x194000, 0x195fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) - AM_RANGE(0x1a0000, 0x1a001f) AM_RAM_WRITE(deco32_pf12_control_w) AM_BASE_MEMBER(deco32_state, pf12_control) + AM_RANGE(0x182000, 0x183fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) + AM_RANGE(0x184000, 0x185fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w) + AM_RANGE(0x192000, 0x193fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) + AM_RANGE(0x194000, 0x195fff) AM_RAM_WRITE(deco32_pf2_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) + AM_RANGE(0x1a0000, 0x1a001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf12_control_dword_r, deco16ic_pf12_control_dword_w) - AM_RANGE(0x1c2000, 0x1c3fff) AM_RAM_WRITE(deco32_pf3_data_w) AM_BASE_MEMBER(deco32_state, pf3_data) - AM_RANGE(0x1c4000, 0x1c5fff) AM_RAM_WRITE(deco32_pf4_data_w) AM_BASE_MEMBER(deco32_state, pf4_data) - AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) - AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) - AM_RANGE(0x1e0000, 0x1e001f) AM_RAM_WRITE(deco32_pf34_control_w) AM_BASE_MEMBER(deco32_state, pf34_control) + AM_RANGE(0x1c2000, 0x1c3fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf3_data_dword_r, deco16ic_pf3_data_dword_w) + AM_RANGE(0x1c4000, 0x1c5fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf4_data_dword_r, deco16ic_pf4_data_dword_w) + AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) + AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM_WRITE(deco32_pf4_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) + AM_RANGE(0x1e0000, 0x1e001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf34_control_dword_r, deco16ic_pf34_control_dword_w) AM_RANGE(0x200000, 0x200fff) AM_READWRITE(nslasher_prot_r, nslasher_prot_w) AM_BASE(&deco32_prot_ram) ADDRESS_MAP_END @@ -1666,17 +1662,17 @@ static GFXDECODE_START( dragngun ) GFXDECODE_END static GFXDECODE_START( tattass ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 32 ) /* Characters 8x8 */ - GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 32 ) /* Tiles 16x16 */ - GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 512, 32 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 128 ) /* Characters 8x8 */ + GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx3", 0, spritelayout_5bpp_alt, 1536, 16 ) /* Sprites 16x16 */ GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 1024+256, 32 ) /* Sprites 16x16 */ GFXDECODE_END static GFXDECODE_START( nslasher ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 32 ) /* Characters 8x8 */ - GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 32 ) /* Tiles 16x16 */ - GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 512, 32 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 128 ) /* Characters 8x8 */ + GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx3", 0, spritelayout_5bpp,1024, 16 ) /* Sprites 16x16 */ GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 1536, 32 ) /* Sprites 16x16 */ GFXDECODE_END @@ -2036,6 +2032,27 @@ static MACHINE_CONFIG_START( lockload, deco32_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) MACHINE_CONFIG_END + +static int tattass_bank_callback( int bank ) +{ + bank = bank >> 4; + return bank * 0x1000; +} + +static const deco16ic_interface tattass_deco16ic_intf = +{ + "screen", + 0, 0, 1, 1, + 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ + 0x00, 0x10, 0x20, 0x30, /* color base */ + 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ + tattass_bank_callback, + tattass_bank_callback, + tattass_bank_callback, + tattass_bank_callback +}; + + static MACHINE_CONFIG_START( tattass, deco32_state ) /* basic machine hardware */ @@ -2057,6 +2074,8 @@ static MACHINE_CONFIG_START( tattass, deco32_state ) MCFG_SCREEN_UPDATE(nslasher) + MCFG_DECO16IC_ADD("deco_custom", tattass_deco16ic_intf) + MCFG_DEVICE_ADD("spritegen1", decospr_, 0) decospr_device_config::set_gfx_region(device, 3); @@ -2100,6 +2119,8 @@ static MACHINE_CONFIG_START( nslasher, deco32_state ) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) MCFG_SCREEN_UPDATE(nslasher) + MCFG_DECO16IC_ADD("deco_custom", tattass_deco16ic_intf) + MCFG_DEVICE_ADD("spritegen1", decospr_, 0) decospr_device_config::set_gfx_region(device, 3); diff --git a/src/mame/includes/deco32.h b/src/mame/includes/deco32.h index 1004b18f252..566fb798579 100644 --- a/src/mame/includes/deco32.h +++ b/src/mame/includes/deco32.h @@ -63,10 +63,12 @@ public: UINT16 spriteram16_buffered[0x1000]; UINT16 spriteram16_2[0x1000]; UINT16 spriteram16_2_buffered[0x1000]; - UINT16 pf1_rowscroll[0x0800/2]; - UINT16 pf2_rowscroll[0x0800/2]; - UINT16 pf3_rowscroll[0x0800/2]; - UINT16 pf4_rowscroll[0x0800/2]; + UINT16 pf1_rowscroll[0x1000]; + UINT16 pf2_rowscroll[0x1000]; + UINT16 pf3_rowscroll[0x1000]; + UINT16 pf4_rowscroll[0x1000]; + + device_t *deco16ic; }; diff --git a/src/mame/video/deco16ic.c b/src/mame/video/deco16ic.c index 4d9544e1f3f..e9304365141 100644 --- a/src/mame/video/deco16ic.c +++ b/src/mame/video/deco16ic.c @@ -496,7 +496,9 @@ static void custom_tilemap_draw( int combine_shift, int trans_mask, int flags, - UINT32 priority) + UINT32 priority, + int is_tattoo + ) { running_machine *machine = device->machine; tilemap_t *tilemap0 = BIT(control1, 7) ? tilemap0_8x8 : tilemap0_16x16; @@ -544,7 +546,9 @@ static void custom_tilemap_draw( p = *BITMAP_ADDR16(src_bitmap0, (src_y + column_offset) & height_mask, src_x); if (src_bitmap1) - p |= (*BITMAP_ADDR16(src_bitmap1, (src_y + column_offset) & height_mask, src_x) & combine_mask) << combine_shift; + { + p |= (*BITMAP_ADDR16(src_bitmap1, (src_y + column_offset) & height_mask, src_x) & combine_mask) << combine_shift; + } src_x = (src_x + 1) & width_mask; @@ -572,8 +576,18 @@ static void custom_tilemap_draw( p = *BITMAP_ADDR16(src_bitmap0, (src_y + column_offset) & height_mask, src_x); if (src_bitmap1) - p |= (*BITMAP_ADDR16(src_bitmap1, (src_y + column_offset) & height_mask, src_x) & combine_mask) << combine_shift; - + { + if (!is_tattoo) + { + // does boogie wings actually use this, or is the tattoo assassing code correct in this mode? + p |= (*BITMAP_ADDR16(src_bitmap1, (src_y + column_offset) & height_mask, src_x) & combine_mask) << combine_shift; + } + else + { + UINT16 p2 = *BITMAP_ADDR16(src_bitmap1, (src_y + column_offset) & height_mask, src_x); + p = 0x200+( ((p&0x30)<<4) | (p&0x0f) | ((p2 & 0x0f)<<4)); + } + } src_x = (src_x + 1) & width_mask; if ((flags & TILEMAP_DRAW_OPAQUE) || (p & trans_mask)) @@ -1171,7 +1185,7 @@ void deco16ic_tilemap_1_draw( device_t *device, bitmap_t *bitmap, const rectangl if (deco16ic->use_custom_pf1) { - custom_tilemap_draw(device, bitmap, cliprect, deco16ic->pf1_tilemap_8x8, deco16ic->pf1_tilemap_16x16, 0, 0, deco16ic->pf1_rowscroll_ptr, deco16ic->pf12_control[1], deco16ic->pf12_control[2], deco16ic->pf12_control[5] & 0xff, deco16ic->pf12_control[6] & 0xff, 0, 0, deco16ic->pf1_trans_mask, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, deco16ic->pf1_tilemap_8x8, deco16ic->pf1_tilemap_16x16, 0, 0, deco16ic->pf1_rowscroll_ptr, deco16ic->pf12_control[1], deco16ic->pf12_control[2], deco16ic->pf12_control[5] & 0xff, deco16ic->pf12_control[6] & 0xff, 0, 0, deco16ic->pf1_trans_mask, flags, priority, 0); } else { @@ -1188,7 +1202,7 @@ void deco16ic_tilemap_2_draw(device_t *device, bitmap_t *bitmap, const rectangle if (deco16ic->use_custom_pf2) { - custom_tilemap_draw(device, bitmap, cliprect, deco16ic->pf2_tilemap_8x8, deco16ic->pf2_tilemap_16x16, 0, 0, deco16ic->pf2_rowscroll_ptr, deco16ic->pf12_control[3], deco16ic->pf12_control[4], deco16ic->pf12_control[5] >> 8, deco16ic->pf12_control[6] >> 8, 0, 0, deco16ic->pf2_trans_mask, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, deco16ic->pf2_tilemap_8x8, deco16ic->pf2_tilemap_16x16, 0, 0, deco16ic->pf2_rowscroll_ptr, deco16ic->pf12_control[3], deco16ic->pf12_control[4], deco16ic->pf12_control[5] >> 8, deco16ic->pf12_control[6] >> 8, 0, 0, deco16ic->pf2_trans_mask, flags, priority, 0); } else { @@ -1204,7 +1218,7 @@ void deco16ic_tilemap_3_draw(device_t *device, bitmap_t *bitmap, const rectangle deco16ic_state *deco16ic = get_safe_token(device); if (deco16ic->use_custom_pf3) - custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf3_tilemap_16x16, 0, 0, deco16ic->pf3_rowscroll_ptr, deco16ic->pf34_control[1], deco16ic->pf34_control[2], deco16ic->pf34_control[5] & 0xff, deco16ic->pf34_control[6] & 0xff, 0, 0, deco16ic->pf3_trans_mask, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf3_tilemap_16x16, 0, 0, deco16ic->pf3_rowscroll_ptr, deco16ic->pf34_control[1], deco16ic->pf34_control[2], deco16ic->pf34_control[5] & 0xff, deco16ic->pf34_control[6] & 0xff, 0, 0, deco16ic->pf3_trans_mask, flags, priority, 0); else if (deco16ic->pf3_tilemap_16x16) tilemap_draw(bitmap, cliprect, deco16ic->pf3_tilemap_16x16, flags, priority); } @@ -1214,7 +1228,7 @@ void deco16ic_tilemap_4_draw(device_t *device, bitmap_t *bitmap, const rectangle deco16ic_state *deco16ic = get_safe_token(device); if (deco16ic->use_custom_pf4) - custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf4_tilemap_16x16, 0, 0, deco16ic->pf4_rowscroll_ptr, deco16ic->pf34_control[3], deco16ic->pf34_control[4], deco16ic->pf34_control[5] >> 8, deco16ic->pf34_control[6] >> 8, 0, 0, deco16ic->pf4_trans_mask, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf4_tilemap_16x16, 0, 0, deco16ic->pf4_rowscroll_ptr, deco16ic->pf34_control[3], deco16ic->pf34_control[4], deco16ic->pf34_control[5] >> 8, deco16ic->pf34_control[6] >> 8, 0, 0, deco16ic->pf4_trans_mask, flags, priority, 0); else if (deco16ic->pf4_tilemap_16x16) tilemap_draw(bitmap, cliprect, deco16ic->pf4_tilemap_16x16, flags, priority); } @@ -1222,10 +1236,10 @@ void deco16ic_tilemap_4_draw(device_t *device, bitmap_t *bitmap, const rectangle /*****************************************************************************************/ // Combines the output of two 4BPP tilemaps into an 8BPP tilemap -void deco16ic_tilemap_34_combine_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority) +void deco16ic_tilemap_34_combine_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority, int is_tattoo) { deco16ic_state *deco16ic = get_safe_token(device); - custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf3_tilemap_16x16, 0, deco16ic->pf4_tilemap_16x16, deco16ic->pf3_rowscroll_ptr, deco16ic->pf34_control[1], deco16ic->pf34_control[2], deco16ic->pf34_control[5] & 0xff, deco16ic->pf34_control[6] & 0xff, 0xf, 4, 0xff, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf3_tilemap_16x16, 0, deco16ic->pf4_tilemap_16x16, deco16ic->pf3_rowscroll_ptr, deco16ic->pf34_control[1], deco16ic->pf34_control[2], deco16ic->pf34_control[5] & 0xff, deco16ic->pf34_control[6] & 0xff, 0xf, 4, 0xff, flags, priority, is_tattoo); } diff --git a/src/mame/video/deco16ic.h b/src/mame/video/deco16ic.h index cc76808c613..aef71e34145 100644 --- a/src/mame/video/deco16ic.h +++ b/src/mame/video/deco16ic.h @@ -104,7 +104,7 @@ void deco16ic_tilemap_3_draw(device_t *device, bitmap_t *bitmap, const rectangle void deco16ic_tilemap_4_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority); /* used by boogwing, nitrobal */ -void deco16ic_tilemap_34_combine_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority); +void deco16ic_tilemap_34_combine_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority, int is_tattoo = false); /* used by boogwing, dassault, nitrobal */ diff --git a/src/mame/video/deco32.c b/src/mame/video/deco32.c index 7134c296ba4..c6e962c9a25 100644 --- a/src/mame/video/deco32.c +++ b/src/mame/video/deco32.c @@ -605,49 +605,6 @@ static TILE_GET_INFO( get_pf2_tile_info ) SET_TILE_INFO(1,(tile&0xfff)|state->pf2_bank,colour+state->pf2_colourbank,flags); } -static TILE_GET_INFO( get_pf3_tile_info ) -{ - deco32_state *state = machine->driver_data(); - UINT32 tile=state->pf3_data[tile_index]; - UINT8 colour=(tile>>12)&0xf; - UINT8 flags=0; - - if (tile&0x8000) { - if ((state->pf34_control[6]>>0)&0x01) { - flags|=TILE_FLIPX; - colour&=0x7; - } - if ((state->pf34_control[6]>>0)&0x02) { - flags|=TILE_FLIPY; - colour&=0x7; - } - } - - SET_TILE_INFO(2,(tile&0xfff)|state->pf3_bank,colour,flags); -} - -static TILE_GET_INFO( get_pf4_tile_info ) -{ - deco32_state *state = machine->driver_data(); - UINT32 tile=state->pf4_data[tile_index]; - UINT8 colour=(tile>>12)&0xf; - UINT8 flags=0; - - if (tile&0x8000) { - if ((state->pf34_control[6]>>8)&0x01) { - flags|=TILE_FLIPX; - colour&=0x7; - } - if ((state->pf34_control[6]>>8)&0x02) { - flags|=TILE_FLIPY; - colour&=0x7; - } - } - - SET_TILE_INFO(2,(tile&0xfff)|state->pf4_bank,colour+state->pf4_colourbank,flags); -} - - static TILE_GET_INFO( get_ll_pf3_tile_info ) { deco32_state *state = machine->driver_data(); @@ -745,28 +702,13 @@ VIDEO_START( nslasher ) { deco32_state *state = machine->driver_data(); int width, height; - - state->pf1_tilemap = tilemap_create(machine, get_pf1_tile_info, tilemap_scan_rows, 8, 8,64,32); - state->pf2_tilemap = tilemap_create(machine, get_pf2_tile_info, deco16_scan_rows,16,16,64,32); - state->pf3_tilemap = tilemap_create(machine, get_pf3_tile_info, deco16_scan_rows,16,16,64,32); - state->pf4_tilemap = tilemap_create(machine, get_pf4_tile_info, deco16_scan_rows, 16,16,64,32); - state->pf1a_tilemap =0; state->dirty_palette = auto_alloc_array(machine, UINT8, 4096); - width = machine->primary_screen->width(); height = machine->primary_screen->height(); state->tilemap_alpha_bitmap=auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16 ); - machine->device("spritegen1")->alloc_sprite_bitmap(machine); machine->device("spritegen2")->alloc_sprite_bitmap(machine); - - tilemap_set_transparent_pen(state->pf1_tilemap,0); - tilemap_set_transparent_pen(state->pf2_tilemap,0); - tilemap_set_transparent_pen(state->pf3_tilemap,0); memset(state->dirty_palette,0,4096); - - state->pf2_colourbank=16; - state->pf4_colourbank=16; state_save_register_global(machine, state->pri); state->has_ace_ram=1; } @@ -847,48 +789,6 @@ static void deco32_setup_scroll(tilemap_t *pf_tilemap, UINT16 height, UINT8 cont } -static void combined_tilemap_draw(running_machine* machine, bitmap_t *bitmap, const rectangle *cliprect) -{ - deco32_state *state = machine->driver_data(); - const bitmap_t *bitmap0 = tilemap_get_pixmap(state->pf3_tilemap); - const bitmap_t *bitmap1 = tilemap_get_pixmap(state->pf4_tilemap); - int x,y,p; - - const UINT16 width_mask=0x3ff; - const UINT16 height_mask=0x1ff; - const UINT16 y_src=state->pf34_control[2]; -// const UINT32 *rows=state->pf3_rowscroll32; - - const UINT16 *bitmap0_y; - const UINT16 *bitmap1_y; - UINT32 *bitmap2_y; - - UINT16 x_src; - - for (y=8; y<248; y++) { - const int py=(y_src+y)&height_mask; - - bitmap0_y=BITMAP_ADDR16(bitmap0, py, 0); - bitmap1_y=BITMAP_ADDR16(bitmap1, py, 0); - bitmap2_y=BITMAP_ADDR32(bitmap, y, 0); - - /* Todo: Should add row enable, and col scroll, but never used as far as I can see */ - x_src=(state->pf34_control[1] + state->pf3_rowscroll32[py])&width_mask; - - for (x=0; x<320; x++) { - - /* 0x200 is palette base for this tilemap */ - p = 0x200 +((bitmap0_y[x_src]&0xf) | ((bitmap0_y[x_src]&0x30)<<4) | ((bitmap1_y[x_src]&0xf)<<4)); - - bitmap2_y[x]=machine->pens[p]; - - x_src=(x_src+1)&width_mask; - } - } -} - - - /******************************************************************************/ SCREEN_UPDATE( captaven ) @@ -1194,38 +1094,10 @@ SCREEN_UPDATE( nslasher ) { deco32_state *state = screen->machine->driver_data(); int alphaTilemap=0; + state->deco16ic = screen->machine->device("deco_custom"); - /* Dirty tilemaps if any globals change */ - if (state->pf1_flip!=((state->pf12_control[6]>>0)&0x3)) - tilemap_mark_all_tiles_dirty(state->pf1_tilemap); - if (state->pf2_flip!=((state->pf12_control[6]>>8)&0x3)) - tilemap_mark_all_tiles_dirty(state->pf2_tilemap); - if ((((state->pf12_control[7]>>12)&0x7)<<12)!=state->pf2_bank || state->pf2_flip!=((state->pf12_control[6]>>8)&0x3)) - tilemap_mark_all_tiles_dirty(state->pf2_tilemap); - if ((((state->pf34_control[7]>> 4)&0x3)<<12)!=state->pf3_bank || state->pf3_flip!=((state->pf34_control[6]>>0)&0x3)) - tilemap_mark_all_tiles_dirty(state->pf3_tilemap); - if ((((state->pf34_control[7]>>12)&0x3)<<12)!=state->pf4_bank || state->pf4_flip!=((state->pf34_control[6]>>8)&0x3)) - tilemap_mark_all_tiles_dirty(state->pf4_tilemap); - - state->pf2_bank=((state->pf12_control[7]>>12)&0x3)<<12; - state->pf3_bank=((state->pf34_control[7]>> 4)&0x3)<<12; - state->pf4_bank=((state->pf34_control[7]>>12)&0x3)<<12; - state->pf1_flip=(state->pf12_control[6]>>0)&0x3; - state->pf2_flip=(state->pf12_control[6]>>8)&0x3; - state->pf3_flip=(state->pf34_control[6]>>0)&0x3; - state->pf4_flip=(state->pf34_control[6]>>8)&0x3; - - /* Setup scroll registers */ - deco32_setup_scroll(state->pf1_tilemap, 256,(state->pf12_control[5]>>0)&0xff,(state->pf12_control[6]>>0)&0xff,state->pf12_control[2],state->pf12_control[1],state->pf1_rowscroll32,state->pf1_rowscroll32+0x200); - deco32_setup_scroll(state->pf2_tilemap, 512,(state->pf12_control[5]>>8)&0xff,(state->pf12_control[6]>>8)&0xff,state->pf12_control[4],state->pf12_control[3],state->pf2_rowscroll32,state->pf2_rowscroll32+0x200); - deco32_setup_scroll(state->pf3_tilemap, 512,(state->pf34_control[5]>>0)&0xff,(state->pf34_control[6]>>0)&0xff,state->pf34_control[2],state->pf34_control[1],state->pf3_rowscroll32,state->pf3_rowscroll32+0x200); - deco32_setup_scroll(state->pf4_tilemap, 512,(state->pf34_control[5]>>8)&0xff,(state->pf34_control[6]>>8)&0xff,state->pf34_control[4],state->pf34_control[3],state->pf4_rowscroll32,state->pf4_rowscroll32+0x200); - - /* Enable registers */ - tilemap_set_enable(state->pf1_tilemap, state->pf12_control[5]&0x0080); - tilemap_set_enable(state->pf2_tilemap, state->pf12_control[5]&0x8000); - tilemap_set_enable(state->pf3_tilemap, state->pf34_control[5]&0x0080); - tilemap_set_enable(state->pf4_tilemap, state->pf34_control[5]&0x8000); + deco16ic_pf12_update(state->deco16ic, state->pf1_rowscroll, state->pf2_rowscroll); + deco16ic_pf34_update(state->deco16ic, state->pf3_rowscroll, state->pf4_rowscroll); /* This is not a conclusive test for deciding if tilemap needs alpha blending */ if (state->ace_ram[0x17]!=0x0 && state->pri) @@ -1234,10 +1106,9 @@ SCREEN_UPDATE( nslasher ) if (state->ace_ram_dirty) updateAceRam(screen->machine); - bitmap_fill(screen->machine->priority_bitmap,cliprect,0); - if ((state->pf34_control[5]&0x8000)==0) - bitmap_fill(bitmap,cliprect,screen->machine->pens[0x200]); + + bitmap_fill(bitmap,cliprect,screen->machine->pens[0x200]); /* Draw sprites to temporary bitmaps, saving alpha & priority info for later mixing */ screen->machine->device("spritegen1")->set_pix_raw_shift(8); @@ -1253,32 +1124,32 @@ SCREEN_UPDATE( nslasher ) /* Draw playfields & sprites */ if (state->pri&2) { - combined_tilemap_draw(screen->machine,bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->pf2_tilemap,0,4); + deco16ic_tilemap_34_combine_draw(state->deco16ic, bitmap, cliprect, 0, 1, 1); + deco16ic_tilemap_2_draw(state->deco16ic, bitmap, cliprect, 0, 4); } else { - tilemap_draw(bitmap,cliprect,state->pf4_tilemap,0,1); + deco16ic_tilemap_4_draw(state->deco16ic, bitmap, cliprect, 0, 1); if (state->pri&1) { - tilemap_draw(bitmap,cliprect,state->pf2_tilemap,0,2); + deco16ic_tilemap_2_draw(state->deco16ic, bitmap, cliprect, 0, 2); if (alphaTilemap) - tilemap_draw(state->tilemap_alpha_bitmap,cliprect,state->pf3_tilemap,0,4); + deco16ic_tilemap_3_draw(state->deco16ic, state->tilemap_alpha_bitmap, cliprect, 0, 4); else - tilemap_draw(bitmap,cliprect,state->pf3_tilemap,0,4); + deco16ic_tilemap_3_draw(state->deco16ic, bitmap, cliprect, 0, 4); } else { - tilemap_draw(bitmap,cliprect,state->pf3_tilemap,0,2); + deco16ic_tilemap_3_draw(state->deco16ic, bitmap, cliprect, 0, 2); if (alphaTilemap) - tilemap_draw(state->tilemap_alpha_bitmap,cliprect,state->pf2_tilemap,0,4); + deco16ic_tilemap_2_draw(state->deco16ic, state->tilemap_alpha_bitmap, cliprect, 0, 4); else - tilemap_draw(bitmap,cliprect,state->pf2_tilemap,0,4); + deco16ic_tilemap_2_draw(state->deco16ic, bitmap, cliprect, 0, 4); } } mixDualAlphaSprites(bitmap, cliprect, screen->machine->gfx[3], screen->machine->gfx[4], alphaTilemap); - tilemap_draw(bitmap,cliprect,state->pf1_tilemap,0,0); + deco16ic_tilemap_1_draw(state->deco16ic, bitmap, cliprect, 0, 0); return 0; }