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]

This commit is contained in:
Scott Stone 2011-03-25 00:40:43 +00:00
parent 719bac990c
commit 1f899f4559
5 changed files with 116 additions and 208 deletions

View File

@ -264,6 +264,7 @@ static const deco16ic_interface fghthist_deco16ic_intf =
}; };
#if 0
static WRITE32_HANDLER( deco32_pf12_control_w ) static WRITE32_HANDLER( deco32_pf12_control_w )
{ {
deco32_state *state = space->machine->driver_data<deco32_state>(); deco32_state *state = space->machine->driver_data<deco32_state>();
@ -278,7 +279,7 @@ static WRITE32_HANDLER( deco32_pf34_control_w )
COMBINE_DATA(&state->pf34_control[offset]); COMBINE_DATA(&state->pf34_control[offset]);
space->machine->primary_screen->update_partial(space->machine->primary_screen->vpos()); space->machine->primary_screen->update_partial(space->machine->primary_screen->vpos());
} }
#endif
static TIMER_DEVICE_CALLBACK( interrupt_gen ) static TIMER_DEVICE_CALLBACK( interrupt_gen )
@ -729,16 +730,11 @@ static WRITE32_HANDLER( deco32_buffer_spriteram2_w )
} }
// 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<deco32_state>(); COMBINE_DATA(&state->pf1_rowscroll32[offset]); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf1_rowscroll[offset]); }
static READ32_HANDLER( deco32_pf1_rowscroll_r ) { deco32_state *state = space->machine->driver_data<deco32_state>(); return state->pf1_rowscroll[offset] ^ 0xffff0000; } static WRITE32_HANDLER( deco32_pf2_rowscroll_w ) { deco32_state *state = space->machine->driver_data<deco32_state>(); COMBINE_DATA(&state->pf2_rowscroll32[offset]); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf2_rowscroll[offset]); }
static READ32_HANDLER( deco32_pf2_rowscroll_r ) { deco32_state *state = space->machine->driver_data<deco32_state>(); return state->pf2_rowscroll[offset] ^ 0xffff0000; } static WRITE32_HANDLER( deco32_pf3_rowscroll_w ) { deco32_state *state = space->machine->driver_data<deco32_state>(); COMBINE_DATA(&state->pf3_rowscroll32[offset]); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf3_rowscroll[offset]); }
static READ32_HANDLER( deco32_pf3_rowscroll_r ) { deco32_state *state = space->machine->driver_data<deco32_state>(); return state->pf3_rowscroll[offset] ^ 0xffff0000; } static WRITE32_HANDLER( deco32_pf4_rowscroll_w ) { deco32_state *state = space->machine->driver_data<deco32_state>(); COMBINE_DATA(&state->pf4_rowscroll32[offset]); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf4_rowscroll[offset]); }
static READ32_HANDLER( deco32_pf4_rowscroll_r ) { deco32_state *state = space->machine->driver_data<deco32_state>(); return state->pf4_rowscroll[offset] ^ 0xffff0000; }
static WRITE32_HANDLER( deco32_pf1_rowscroll_w ) { deco32_state *state = space->machine->driver_data<deco32_state>(); 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<deco32_state>(); 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<deco32_state>(); 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<deco32_state>(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf4_rowscroll[offset]); }
static ADDRESS_MAP_START( captaven_map, ADDRESS_SPACE_PROGRAM, 32 ) 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(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(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(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(0x1a0000, 0x1a3fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32)
AM_RANGE(0x1a4000, 0x1a5fff) AM_READWRITE(deco32_pf2_rowscroll_r, deco32_pf2_rowscroll_w) 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(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(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(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(0x1e0000, 0x1e3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32)
AM_RANGE(0x1e4000, 0x1e5fff) AM_READWRITE(deco32_pf4_rowscroll_r, deco32_pf4_rowscroll_w) // unused AM_RANGE(0x1e4000, 0x1e5fff) AM_RAM_WRITE(deco32_pf4_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) // unused
ADDRESS_MAP_END 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(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(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(0x192000, 0x193fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32)
AM_RANGE(0x194000, 0x194fff) AM_READWRITE(deco32_pf2_rowscroll_r, deco32_pf2_rowscroll_w) 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(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(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(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(0x1d2000, 0x1d3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32)
AM_RANGE(0x1d4000, 0x1d4fff) AM_READWRITE(deco32_pf4_rowscroll_r, deco32_pf4_rowscroll_w) 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(0x1e0000, 0x1e001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf34_control_dword_r, deco16ic_pf34_control_dword_w)
AM_RANGE(0x16c000, 0x16c01f) AM_READNOP 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(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(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(0x192000, 0x193fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32)
AM_RANGE(0x194000, 0x194fff) AM_READWRITE(deco32_pf2_rowscroll_r, deco32_pf2_rowscroll_w) 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(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(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(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(0x1d2000, 0x1d3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32)
AM_RANGE(0x1d4000, 0x1d4fff) AM_READWRITE(deco32_pf4_rowscroll_r, deco32_pf4_rowscroll_w) 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(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) 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(0x17c010, 0x17c013) AM_WRITE(deco32_buffer_spriteram2_w)
AM_RANGE(0x17c018, 0x17c01b) AM_WRITENOP /* Sprite 'CPU' (unused) */ 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(0x182000, 0x183fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w)
AM_RANGE(0x184000, 0x185fff) AM_RAM_WRITE(deco32_pf2_data_w) AM_BASE_MEMBER(deco32_state, pf2_data) AM_RANGE(0x184000, 0x185fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w)
AM_RANGE(0x192000, 0x193fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) AM_RANGE(0x192000, 0x193fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32)
AM_RANGE(0x194000, 0x195fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) AM_RANGE(0x194000, 0x195fff) AM_RAM_WRITE(deco32_pf2_rowscroll_w) 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(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(0x1c2000, 0x1c3fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf3_data_dword_r, deco16ic_pf3_data_dword_w)
AM_RANGE(0x1c4000, 0x1c5fff) AM_RAM_WRITE(deco32_pf4_data_w) AM_BASE_MEMBER(deco32_state, pf4_data) AM_RANGE(0x1c4000, 0x1c5fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf4_data_dword_r, deco16ic_pf4_data_dword_w)
AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32)
AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM_WRITE(deco32_pf4_rowscroll_w) 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(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) AM_RANGE(0x200000, 0x200fff) AM_READWRITE(tattass_prot_r, tattass_prot_w) AM_BASE(&deco32_prot_ram)
ADDRESS_MAP_END 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(0x17c010, 0x17c013) AM_WRITE(deco32_buffer_spriteram2_w)
AM_RANGE(0x17c018, 0x17c01b) AM_WRITENOP /* Sprite 'CPU' (unused) */ 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(0x182000, 0x183fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w)
AM_RANGE(0x184000, 0x185fff) AM_RAM_WRITE(deco32_pf2_data_w) AM_BASE_MEMBER(deco32_state, pf2_data) AM_RANGE(0x184000, 0x185fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w)
AM_RANGE(0x192000, 0x193fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) AM_RANGE(0x192000, 0x193fff) AM_RAM_WRITE(deco32_pf1_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf1_rowscroll32)
AM_RANGE(0x194000, 0x195fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) AM_RANGE(0x194000, 0x195fff) AM_RAM_WRITE(deco32_pf2_rowscroll_w) 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(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(0x1c2000, 0x1c3fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf3_data_dword_r, deco16ic_pf3_data_dword_w)
AM_RANGE(0x1c4000, 0x1c5fff) AM_RAM_WRITE(deco32_pf4_data_w) AM_BASE_MEMBER(deco32_state, pf4_data) AM_RANGE(0x1c4000, 0x1c5fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf4_data_dword_r, deco16ic_pf4_data_dword_w)
AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) AM_RANGE(0x1d2000, 0x1d3fff) AM_RAM_WRITE(deco32_pf3_rowscroll_w) AM_BASE_MEMBER(deco32_state, pf3_rowscroll32)
AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf4_rowscroll32) AM_RANGE(0x1d4000, 0x1d5fff) AM_RAM_WRITE(deco32_pf4_rowscroll_w) 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(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) AM_RANGE(0x200000, 0x200fff) AM_READWRITE(nslasher_prot_r, nslasher_prot_w) AM_BASE(&deco32_prot_ram)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -1666,17 +1662,17 @@ static GFXDECODE_START( dragngun )
GFXDECODE_END GFXDECODE_END
static GFXDECODE_START( tattass ) static GFXDECODE_START( tattass )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 32 ) /* Characters 8x8 */ GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 128 ) /* Characters 8x8 */
GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 32 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 512, 32 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */
GFXDECODE_ENTRY( "gfx3", 0, spritelayout_5bpp_alt, 1536, 16 ) /* Sprites 16x16 */ GFXDECODE_ENTRY( "gfx3", 0, spritelayout_5bpp_alt, 1536, 16 ) /* Sprites 16x16 */
GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 1024+256, 32 ) /* Sprites 16x16 */ GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 1024+256, 32 ) /* Sprites 16x16 */
GFXDECODE_END GFXDECODE_END
static GFXDECODE_START( nslasher ) static GFXDECODE_START( nslasher )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 32 ) /* Characters 8x8 */ GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 128 ) /* Characters 8x8 */
GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 32 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 512, 32 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */
GFXDECODE_ENTRY( "gfx3", 0, spritelayout_5bpp,1024, 16 ) /* Sprites 16x16 */ GFXDECODE_ENTRY( "gfx3", 0, spritelayout_5bpp,1024, 16 ) /* Sprites 16x16 */
GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 1536, 32 ) /* Sprites 16x16 */ GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 1536, 32 ) /* Sprites 16x16 */
GFXDECODE_END GFXDECODE_END
@ -2036,6 +2032,27 @@ static MACHINE_CONFIG_START( lockload, deco32_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
MACHINE_CONFIG_END 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 ) static MACHINE_CONFIG_START( tattass, deco32_state )
/* basic machine hardware */ /* basic machine hardware */
@ -2057,6 +2074,8 @@ static MACHINE_CONFIG_START( tattass, deco32_state )
MCFG_SCREEN_UPDATE(nslasher) MCFG_SCREEN_UPDATE(nslasher)
MCFG_DECO16IC_ADD("deco_custom", tattass_deco16ic_intf)
MCFG_DEVICE_ADD("spritegen1", decospr_, 0) MCFG_DEVICE_ADD("spritegen1", decospr_, 0)
decospr_device_config::set_gfx_region(device, 3); 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_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
MCFG_SCREEN_UPDATE(nslasher) MCFG_SCREEN_UPDATE(nslasher)
MCFG_DECO16IC_ADD("deco_custom", tattass_deco16ic_intf)
MCFG_DEVICE_ADD("spritegen1", decospr_, 0) MCFG_DEVICE_ADD("spritegen1", decospr_, 0)
decospr_device_config::set_gfx_region(device, 3); decospr_device_config::set_gfx_region(device, 3);

View File

@ -63,10 +63,12 @@ public:
UINT16 spriteram16_buffered[0x1000]; UINT16 spriteram16_buffered[0x1000];
UINT16 spriteram16_2[0x1000]; UINT16 spriteram16_2[0x1000];
UINT16 spriteram16_2_buffered[0x1000]; UINT16 spriteram16_2_buffered[0x1000];
UINT16 pf1_rowscroll[0x0800/2]; UINT16 pf1_rowscroll[0x1000];
UINT16 pf2_rowscroll[0x0800/2]; UINT16 pf2_rowscroll[0x1000];
UINT16 pf3_rowscroll[0x0800/2]; UINT16 pf3_rowscroll[0x1000];
UINT16 pf4_rowscroll[0x0800/2]; UINT16 pf4_rowscroll[0x1000];
device_t *deco16ic; device_t *deco16ic;
}; };

View File

@ -496,7 +496,9 @@ static void custom_tilemap_draw(
int combine_shift, int combine_shift,
int trans_mask, int trans_mask,
int flags, int flags,
UINT32 priority) UINT32 priority,
int is_tattoo
)
{ {
running_machine *machine = device->machine; running_machine *machine = device->machine;
tilemap_t *tilemap0 = BIT(control1, 7) ? tilemap0_8x8 : tilemap0_16x16; 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); p = *BITMAP_ADDR16(src_bitmap0, (src_y + column_offset) & height_mask, src_x);
if (src_bitmap1) 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; 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); p = *BITMAP_ADDR16(src_bitmap0, (src_y + column_offset) & height_mask, src_x);
if (src_bitmap1) 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; src_x = (src_x + 1) & width_mask;
if ((flags & TILEMAP_DRAW_OPAQUE) || (p & trans_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) 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 else
{ {
@ -1188,7 +1202,7 @@ void deco16ic_tilemap_2_draw(device_t *device, bitmap_t *bitmap, const rectangle
if (deco16ic->use_custom_pf2) 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 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); deco16ic_state *deco16ic = get_safe_token(device);
if (deco16ic->use_custom_pf3) 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) else if (deco16ic->pf3_tilemap_16x16)
tilemap_draw(bitmap, cliprect, deco16ic->pf3_tilemap_16x16, flags, priority); 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); deco16ic_state *deco16ic = get_safe_token(device);
if (deco16ic->use_custom_pf4) 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) else if (deco16ic->pf4_tilemap_16x16)
tilemap_draw(bitmap, cliprect, deco16ic->pf4_tilemap_16x16, flags, priority); 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 // 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); 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);
} }

View File

@ -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); void deco16ic_tilemap_4_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority);
/* used by boogwing, nitrobal */ /* 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 */ /* used by boogwing, dassault, nitrobal */

View File

@ -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); 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<deco32_state>();
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<deco32_state>();
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 ) static TILE_GET_INFO( get_ll_pf3_tile_info )
{ {
deco32_state *state = machine->driver_data<deco32_state>(); deco32_state *state = machine->driver_data<deco32_state>();
@ -745,28 +702,13 @@ VIDEO_START( nslasher )
{ {
deco32_state *state = machine->driver_data<deco32_state>(); deco32_state *state = machine->driver_data<deco32_state>();
int width, height; 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); state->dirty_palette = auto_alloc_array(machine, UINT8, 4096);
width = machine->primary_screen->width(); width = machine->primary_screen->width();
height = machine->primary_screen->height(); height = machine->primary_screen->height();
state->tilemap_alpha_bitmap=auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16 ); state->tilemap_alpha_bitmap=auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16 );
machine->device<decospr_device>("spritegen1")->alloc_sprite_bitmap(machine); machine->device<decospr_device>("spritegen1")->alloc_sprite_bitmap(machine);
machine->device<decospr_device>("spritegen2")->alloc_sprite_bitmap(machine); machine->device<decospr_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); memset(state->dirty_palette,0,4096);
state->pf2_colourbank=16;
state->pf4_colourbank=16;
state_save_register_global(machine, state->pri); state_save_register_global(machine, state->pri);
state->has_ace_ram=1; 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<deco32_state>();
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 ) SCREEN_UPDATE( captaven )
@ -1194,38 +1094,10 @@ SCREEN_UPDATE( nslasher )
{ {
deco32_state *state = screen->machine->driver_data<deco32_state>(); deco32_state *state = screen->machine->driver_data<deco32_state>();
int alphaTilemap=0; int alphaTilemap=0;
state->deco16ic = screen->machine->device("deco_custom");
/* Dirty tilemaps if any globals change */ deco16ic_pf12_update(state->deco16ic, state->pf1_rowscroll, state->pf2_rowscroll);
if (state->pf1_flip!=((state->pf12_control[6]>>0)&0x3)) deco16ic_pf34_update(state->deco16ic, state->pf3_rowscroll, state->pf4_rowscroll);
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);
/* This is not a conclusive test for deciding if tilemap needs alpha blending */ /* This is not a conclusive test for deciding if tilemap needs alpha blending */
if (state->ace_ram[0x17]!=0x0 && state->pri) if (state->ace_ram[0x17]!=0x0 && state->pri)
@ -1234,10 +1106,9 @@ SCREEN_UPDATE( nslasher )
if (state->ace_ram_dirty) if (state->ace_ram_dirty)
updateAceRam(screen->machine); updateAceRam(screen->machine);
bitmap_fill(screen->machine->priority_bitmap,cliprect,0); 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 */ /* Draw sprites to temporary bitmaps, saving alpha & priority info for later mixing */
screen->machine->device<decospr_device>("spritegen1")->set_pix_raw_shift(8); screen->machine->device<decospr_device>("spritegen1")->set_pix_raw_shift(8);
@ -1253,32 +1124,32 @@ SCREEN_UPDATE( nslasher )
/* Draw playfields & sprites */ /* Draw playfields & sprites */
if (state->pri&2) if (state->pri&2)
{ {
combined_tilemap_draw(screen->machine,bitmap,cliprect); deco16ic_tilemap_34_combine_draw(state->deco16ic, bitmap, cliprect, 0, 1, 1);
tilemap_draw(bitmap,cliprect,state->pf2_tilemap,0,4); deco16ic_tilemap_2_draw(state->deco16ic, bitmap, cliprect, 0, 4);
} }
else else
{ {
tilemap_draw(bitmap,cliprect,state->pf4_tilemap,0,1); deco16ic_tilemap_4_draw(state->deco16ic, bitmap, cliprect, 0, 1);
if (state->pri&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) 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 else
tilemap_draw(bitmap,cliprect,state->pf3_tilemap,0,4); deco16ic_tilemap_3_draw(state->deco16ic, bitmap, cliprect, 0, 4);
} }
else else
{ {
tilemap_draw(bitmap,cliprect,state->pf3_tilemap,0,2); deco16ic_tilemap_3_draw(state->deco16ic, bitmap, cliprect, 0, 2);
if (alphaTilemap) 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 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); 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; return 0;
} }