From ca8edd4cd829766b72f0dde8f12c971d2319ae00 Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Sat, 26 Mar 2011 20:38:39 +0000 Subject: [PATCH] Haze: converted dark seal --- src/mame/drivers/darkseal.c | 56 ++++++++-- src/mame/video/darkseal.c | 201 +++--------------------------------- src/mame/video/deco16ic.c | 30 ++++-- 3 files changed, 81 insertions(+), 206 deletions(-) diff --git a/src/mame/drivers/darkseal.c b/src/mame/drivers/darkseal.c index 98a7258f515..a38af245eee 100644 --- a/src/mame/drivers/darkseal.c +++ b/src/mame/drivers/darkseal.c @@ -21,6 +21,7 @@ #include "sound/okim6295.h" #include "includes/darkseal.h" #include "video/decospr.h" +#include "video/deco16ic.h" /******************************************************************************/ @@ -65,14 +66,18 @@ static ADDRESS_MAP_START( darkseal_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x140000, 0x140fff) AM_RAM_WRITE(darkseal_palette_24bit_rg_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x141000, 0x141fff) AM_RAM_WRITE(darkseal_palette_24bit_b_w) AM_BASE_GENERIC(paletteram2) AM_RANGE(0x180000, 0x18000f) AM_READWRITE(darkseal_control_r, darkseal_control_w) - AM_RANGE(0x200000, 0x200fff) AM_WRITE(darkseal_pf3b_data_w) /* 2nd half of pf3, only used on last level */ - AM_RANGE(0x202000, 0x203fff) AM_WRITE(darkseal_pf3_data_w) AM_BASE_MEMBER(darkseal_state, pf3_data) - AM_RANGE(0x220000, 0x220fff) AM_RAM AM_BASE_MEMBER(darkseal_state, pf12_row) - AM_RANGE(0x222000, 0x222fff) AM_RAM AM_BASE_MEMBER(darkseal_state, pf34_row) - AM_RANGE(0x240000, 0x24000f) AM_WRITE(darkseal_control_0_w) - AM_RANGE(0x260000, 0x261fff) AM_WRITE(darkseal_pf2_data_w) AM_BASE_MEMBER(darkseal_state, pf2_data) - AM_RANGE(0x262000, 0x263fff) AM_WRITE(darkseal_pf1_data_w) AM_BASE_MEMBER(darkseal_state, pf1_data) - AM_RANGE(0x2a0000, 0x2a000f) AM_WRITE(darkseal_control_1_w) + + AM_RANGE(0x200000, 0x201fff) AM_DEVREADWRITE("tilegen2", deco16ic_pf1_data_r, deco16ic_pf1_data_w) + AM_RANGE(0x202000, 0x203fff) AM_DEVREADWRITE("tilegen2", deco16ic_pf2_data_r, deco16ic_pf2_data_w) + AM_RANGE(0x240000, 0x24000f) AM_DEVWRITE("tilegen2", deco16ic_pf_control_w) + + AM_RANGE(0x220000, 0x220fff) AM_RAM AM_BASE_MEMBER(darkseal_state, pf1_rowscroll) + // pf2 & 4 rowscrolls are where? (maybe don't exist?) + AM_RANGE(0x222000, 0x222fff) AM_RAM AM_BASE_MEMBER(darkseal_state, pf3_rowscroll) + + AM_RANGE(0x260000, 0x261fff) AM_DEVREADWRITE("tilegen1", deco16ic_pf1_data_r, deco16ic_pf1_data_w) + AM_RANGE(0x262000, 0x263fff) AM_DEVREADWRITE("tilegen1", deco16ic_pf2_data_r, deco16ic_pf2_data_w) + AM_RANGE(0x2a0000, 0x2a000f) AM_DEVWRITE("tilegen1", deco16ic_pf_control_w) ADDRESS_MAP_END /******************************************************************************/ @@ -210,6 +215,7 @@ static const gfx_layout seallayout2 = static GFXDECODE_START( darkseal ) GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 ) /* Characters 8x8 */ GFXDECODE_ENTRY( "gfx2", 0, seallayout, 768, 16 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 ) /* Characters 8x8 */ GFXDECODE_ENTRY( "gfx3", 0, seallayout, 1024, 16 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx4", 0, seallayout2, 256, 32 ) /* Sprites 16x16 */ GFXDECODE_END @@ -226,6 +232,32 @@ static const ym2151_interface ym2151_config = sound_irq }; +static const deco16ic_interface darkseal_deco16ic_tilegen1_intf = +{ + "screen", + 0, 3, // both these tilemaps need to be twice the y size of usual! + 0x0f, 0x0f, /* trans masks (default values) */ + 0x00, 0x00, /* color base */ + 0x0f, 0x0f, /* color masks (default values) */ + NULL, + NULL, + 0,1 +}; + + +static const deco16ic_interface darkseal_deco16ic_tilegen2_intf = +{ + "screen", + 0, 1, + 0x0f, 0x0f, /* trans masks (default values) */ + 0x00, 0x00, /* color base */ + 0x0f, 0x0f, /* color masks (default values) */ + NULL, + NULL, + 2,3 +}; + + static MACHINE_CONFIG_START( darkseal, darkseal_state ) /* basic machine hardware */ @@ -250,8 +282,14 @@ static MACHINE_CONFIG_START( darkseal, darkseal_state ) MCFG_GFXDECODE(darkseal) MCFG_PALETTE_LENGTH(2048) + MCFG_DECO16IC_ADD("tilegen1", darkseal_deco16ic_tilegen1_intf) + + MCFG_DECO16IC_ADD("tilegen2", darkseal_deco16ic_tilegen2_intf) + MCFG_DEVICE_ADD("spritegen", decospr_, 0) - decospr_device_config::set_gfx_region(device, 3); + decospr_device_config::set_gfx_region(device, 4); + + MCFG_VIDEO_START(darkseal) diff --git a/src/mame/video/darkseal.c b/src/mame/video/darkseal.c index c24946689fd..4b09caddb15 100644 --- a/src/mame/video/darkseal.c +++ b/src/mame/video/darkseal.c @@ -3,76 +3,12 @@ Dark Seal Video emulation - Bryan McPhail, mish@tendril.co.uk **************************************************************************** - -Data East custom chip 55: Generates two playfields, playfield 1 is underneath -playfield 2. Dark Seal uses two of these chips. 1 playfield is _always_ off -in this game. - - 16 bytes of control registers per chip. - - Word 0: - Mask 0x0080: Flip screen - Mask 0x007f: ? - Word 2: - Mask 0xffff: Playfield 2 X scroll (top playfield) - Word 4: - Mask 0xffff: Playfield 2 Y scroll (top playfield) - Word 6: - Mask 0xffff: Playfield 1 X scroll (bottom playfield) - Word 8: - Mask 0xffff: Playfield 1 Y scroll (bottom playfield) - Word 0xa: - Mask 0xc000: Playfield 1 shape?? - Mask 0x3000: Playfield 1 rowscroll style (maybe mask 0x3800??) - Mask 0x0300: Playfield 1 colscroll style (maybe mask 0x0700??)? - - Mask 0x00c0: Playfield 2 shape?? - Mask 0x0030: Playfield 2 rowscroll style (maybe mask 0x0038??) - Mask 0x0003: Playfield 2 colscroll style (maybe mask 0x0007??)? - Word 0xc: - Mask 0x8000: Playfield 1 is 8*8 tiles else 16*16 - Mask 0x4000: Playfield 1 rowscroll enabled - Mask 0x2000: Playfield 1 colscroll enabled - Mask 0x1f00: ? - - Mask 0x0080: Playfield 2 is 8*8 tiles else 16*16 - Mask 0x0040: Playfield 2 rowscroll enabled - Mask 0x0020: Playfield 2 colscroll enabled - Mask 0x001f: ? - Word 0xe: - ?? - -Locations 0 & 0xe are mostly unknown: - - 0 14 -Caveman Ninja (bottom): 0053 1100 (changes to 1111 later) -Caveman Ninja (top): 0010 0081 -Two Crude (bottom): 0053 0000 -Two Crude (top): 0010 0041 -Dark Seal (bottom): 0010 0000 -Dark Seal (top): 0053 4101 -Tumblepop: 0010 0000 -Super Burger Time: 0010 0000 - -Location 0xe looks like it could be a mirror of another byte.. + + uses 2x DECO55 tilemaps ************************************************************************** -Sprites - Data East custom chip 52 - - 8 bytes per sprite, unknowns bits seem unused. - - Word 0: - Mask 0x8000 - ? - Mask 0x4000 - Y flip - Mask 0x2000 - X flip - Mask 0x1000 - Sprite flash - Mask 0x0800 - ? - Mask 0x0600 - Sprite height (1x, 2x, 4x, 8x) - Mask 0x01ff - Y coordinate - - Word 2: - Mask 0xffff - Sprite number + Sprite/Tilemap Priority Note (is this implemented?) Word 4: Mask 0x8000 - ? @@ -80,66 +16,15 @@ Sprites - Data East custom chip 52 Mask 0x3e00 - Colour (32 palettes, most games only use 16) Mask 0x01ff - X coordinate - Word 6: - Always unused. - ***************************************************************************/ #include "emu.h" #include "includes/darkseal.h" #include "video/decospr.h" - +#include "video/deco16ic.h" /***************************************************************************/ -/* Function for all 16x16 1024x1024 layers */ -static TILEMAP_MAPPER( darkseal_scan ) -{ - /* logical (col,row) -> memory offset */ - return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5) + ((row & 0x20) << 6); -} - -INLINE void get_bg_tile_info(running_machine *machine,tile_data *tileinfo,int tile_index,int gfx_bank,UINT16 *gfx_base) -{ - int tile,color; - - tile=gfx_base[tile_index]; - color=tile >> 12; - tile=tile&0xfff; - - SET_TILE_INFO( - gfx_bank, - tile, - color, - 0); -} - -static TILE_GET_INFO( get_bg_tile_info2 ) -{ - darkseal_state *state = machine->driver_data(); - get_bg_tile_info(machine,tileinfo,tile_index,1,state->pf2_data); -} - -static TILE_GET_INFO( get_bg_tile_info3 ) -{ - darkseal_state *state = machine->driver_data(); - get_bg_tile_info(machine,tileinfo,tile_index,2,state->pf3_data); -} - -static TILE_GET_INFO( get_fg_tile_info ) -{ - darkseal_state *state = machine->driver_data(); - int tile=state->pf1_data[tile_index]; - int color=tile >> 12; - - tile=tile&0xfff; - SET_TILE_INFO( - 0, - tile, - color, - 0); -} - /******************************************************************************/ static void update_24bitcol(running_machine *machine, int offset) @@ -167,57 +52,9 @@ WRITE16_HANDLER( darkseal_palette_24bit_b_w ) /******************************************************************************/ -/******************************************************************************/ - -WRITE16_HANDLER( darkseal_pf1_data_w ) -{ - darkseal_state *state = space->machine->driver_data(); - COMBINE_DATA(&state->pf1_data[offset]); - tilemap_mark_tile_dirty(state->pf1_tilemap,offset); -} - -WRITE16_HANDLER( darkseal_pf2_data_w ) -{ - darkseal_state *state = space->machine->driver_data(); - COMBINE_DATA(&state->pf2_data[offset]); - tilemap_mark_tile_dirty(state->pf2_tilemap,offset); -} - -WRITE16_HANDLER( darkseal_pf3_data_w ) -{ - darkseal_state *state = space->machine->driver_data(); - COMBINE_DATA(&state->pf3_data[offset]); - tilemap_mark_tile_dirty(state->pf3_tilemap,offset); -} - -WRITE16_HANDLER( darkseal_pf3b_data_w ) /* Mirror */ -{ - darkseal_pf3_data_w(space,offset+0x800,data,mem_mask); -} - -WRITE16_HANDLER( darkseal_control_0_w ) -{ - darkseal_state *state = space->machine->driver_data(); - COMBINE_DATA(&state->control_0[offset]); -} - -WRITE16_HANDLER( darkseal_control_1_w ) -{ - darkseal_state *state = space->machine->driver_data(); - COMBINE_DATA(&state->control_1[offset]); -} - -/******************************************************************************/ - VIDEO_START( darkseal ) { - darkseal_state *state = machine->driver_data(); - state->pf1_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8,64,64); - state->pf2_tilemap = tilemap_create(machine, get_bg_tile_info2,darkseal_scan, 16,16,64,64); - state->pf3_tilemap = tilemap_create(machine, get_bg_tile_info3,darkseal_scan, 16,16,64,64); - tilemap_set_transparent_pen(state->pf1_tilemap,0); - tilemap_set_transparent_pen(state->pf2_tilemap,0); } /******************************************************************************/ @@ -225,34 +62,20 @@ VIDEO_START( darkseal ) SCREEN_UPDATE( darkseal ) { darkseal_state *state = screen->machine->driver_data(); - state->flipscreen=!(state->control_0[0]&0x80); tilemap_set_flip_all(screen->machine,state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - /* Update scroll registers */ - tilemap_set_scrollx( state->pf1_tilemap,0, state->control_1[3] ); - tilemap_set_scrolly( state->pf1_tilemap,0, state->control_1[4] ); - tilemap_set_scrollx( state->pf2_tilemap,0, state->control_1[1]); - tilemap_set_scrolly( state->pf2_tilemap,0, state->control_1[2] ); + bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine)); - if (state->control_0[6]&0x4000) { /* Rowscroll enable */ - int offs,scrollx=state->control_0[3]; - - tilemap_set_scroll_rows(state->pf3_tilemap,512); - for (offs = 0;offs < 512;offs++) - tilemap_set_scrollx( state->pf3_tilemap,offs, scrollx + state->pf34_row[offs+0x40] ); - } - else { - tilemap_set_scroll_rows(state->pf3_tilemap,1); - tilemap_set_scrollx( state->pf3_tilemap,0, state->control_0[3] ); - } - tilemap_set_scrolly( state->pf3_tilemap,0, state->control_0[4] ); - - tilemap_draw(bitmap,cliprect,state->pf3_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->pf2_tilemap,0,0); + deco16ic_pf_update(state->deco_tilegen1, state->pf1_rowscroll, state->pf1_rowscroll); + deco16ic_pf_update(state->deco_tilegen2, state->pf3_rowscroll, state->pf3_rowscroll); + deco16ic_tilemap_1_draw(state->deco_tilegen2, bitmap, cliprect, 0, 0); + deco16ic_tilemap_2_draw(state->deco_tilegen2, bitmap, cliprect, 0, 0); + + deco16ic_tilemap_1_draw(state->deco_tilegen1, bitmap, cliprect, 0, 0); screen->machine->device("spritegen")->draw_sprites(screen->machine, bitmap, cliprect, screen->machine->generic.buffered_spriteram.u16, 0x400); + deco16ic_tilemap_2_draw(state->deco_tilegen1, bitmap, cliprect, 0, 0); - tilemap_draw(bitmap,cliprect,state->pf1_tilemap,0,0); return 0; } diff --git a/src/mame/video/deco16ic.c b/src/mame/video/deco16ic.c index 9aad39571da..74690e6d550 100644 --- a/src/mame/video/deco16ic.c +++ b/src/mame/video/deco16ic.c @@ -150,6 +150,12 @@ Rowscroll style: - convert to c++ device - should the decryption functions for the tilemap chips be here too? + it seems overall height / width of the tilemaps can be configured somehow + darkseal clearly needs 64 rows, whereas other games need 32. + + width seems configurable in a similar way, with nitroball and lockload + needing narrower tilemaps. lockload/dragngun might be a good study case + as they run on the same harwdare, and both rely on different behavior. ***************************************************************************/ @@ -554,7 +560,7 @@ WRITE16_DEVICE_HANDLER( deco16ic_pf1_data_w ) COMBINE_DATA(&deco16ic->pf1_data[offset]); tilemap_mark_tile_dirty(deco16ic->pf1_tilemap_8x8, offset); - if (offset < 0x800) +// if (offset < 0x800) tilemap_mark_tile_dirty(deco16ic->pf1_tilemap_16x16, offset); } @@ -565,7 +571,7 @@ WRITE16_DEVICE_HANDLER( deco16ic_pf2_data_w ) COMBINE_DATA(&deco16ic->pf2_data[offset]); tilemap_mark_tile_dirty(deco16ic->pf2_tilemap_8x8, offset); - if (offset < 0x800) +// if (offset < 0x800) tilemap_mark_tile_dirty(deco16ic->pf2_tilemap_16x16, offset); } @@ -912,21 +918,29 @@ static DEVICE_START( deco16ic ) deco16ic->pf1_colourmask = intf->col_mask1; deco16ic->pf2_colourmask = intf->col_mask2; - deco16ic->pf1_tilemap_16x16 = tilemap_create_device(device, get_pf1_tile_info, deco16_scan_rows, 16, 16, intf->full_width12 ? 64 : 32, 32); + int fullheight = 0; + int fullwidth = 0; + + if (intf->full_width12&2) + fullheight = 1; + + if (intf->full_width12&1) + fullwidth = 1; + + deco16ic->pf1_tilemap_16x16 = tilemap_create_device(device, get_pf1_tile_info, deco16_scan_rows, 16, 16, fullwidth ? 64 : 32, fullheight ?64 : 32); // deco16ic->pf1_tilemap_8x8 = tilemap_create_device(device, get_pf1_tile_info_b, tilemap_scan_rows, 8, 8, intf->full_width12 ? 64 : 32, 32); deco16ic->pf1_tilemap_8x8 = tilemap_create_device(device, get_pf1_tile_info_b, tilemap_scan_rows, 8, 8, 64 , 32); // nitroball deco16ic->pf12_8x8_gfx_bank = intf->_8x8_gfxregion; deco16ic->pf12_16x16_gfx_bank = intf->_16x16_gfxregion; - if (intf->split) - deco16ic->pf2_tilemap_16x16 = tilemap_create_device(device, get_pf2_tile_info, deco16_scan_rows, 16, 16, intf->full_width12 ? 64 : 32, 32); + deco16ic->pf2_tilemap_16x16 = tilemap_create_device(device, get_pf2_tile_info, deco16_scan_rows, 16, 16, fullwidth ? 64 : 32, fullheight ? 64 : 32); else - deco16ic->pf2_tilemap_16x16 = tilemap_create_device(device, get_pf2_tile_info, deco16_scan_rows, 16, 16, intf->full_width12 ? 64 : 32, 32); - - deco16ic->pf2_tilemap_8x8 = tilemap_create_device(device, get_pf2_tile_info_b, tilemap_scan_rows, 8, 8, intf->full_width12 ? 64 : 32, 32); + deco16ic->pf2_tilemap_16x16 = tilemap_create_device(device, get_pf2_tile_info, deco16_scan_rows, 16, 16, fullwidth ? 64 : 32, fullheight ? 64 : 32); + deco16ic->pf2_tilemap_8x8 = tilemap_create_device(device, get_pf2_tile_info_b, tilemap_scan_rows, 8, 8, fullwidth ? 64 : 32, fullheight ? 64 : 32); + tilemap_set_transparent_pen(deco16ic->pf1_tilemap_8x8, 0); tilemap_set_transparent_pen(deco16ic->pf2_tilemap_8x8, 0); tilemap_set_transparent_pen(deco16ic->pf1_tilemap_16x16, 0);