diff --git a/src/mame/drivers/galivan.c b/src/mame/drivers/galivan.c index a63c220fc35..a7b1b14c328 100644 --- a/src/mame/drivers/galivan.c +++ b/src/mame/drivers/galivan.c @@ -317,24 +317,22 @@ static INPUT_PORTS_START( ninjemak ) INPUT_PORTS_END -#define CHARLAYOUT(NUM) static const gfx_layout charlayout_##NUM = \ -{ \ - 8,8, /* 8*8 characters */ \ - NUM, /* NUM characters */ \ - 4, /* 4 bits per pixel */ \ - { 0, 1, 2, 3 }, \ - { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 }, \ - { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, \ - 32*8 /* every char takes 32 consecutive bytes */ \ -} -CHARLAYOUT(512); -CHARLAYOUT(1024); +static const gfx_layout charlayout = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { 0, 1, 2, 3 }, + { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, + 32*8 +}; static const gfx_layout tilelayout = { 16,16, - 1024, + RGN_FRAC(1,1), 4, { 0, 1, 2, 3 }, { 4,0,12,8,20,16,28,24,36,32,44,40,52,48,60,56 }, @@ -343,33 +341,23 @@ static const gfx_layout tilelayout = 16*16*4 }; -#define SPRITELAYOUT(NUM) static const gfx_layout spritelayout_##NUM = \ -{ \ - 16,16, /* 16*16 sprites */ \ - NUM, /* NUM sprites */ \ - 4, /* 4 bits per pixel */ \ - { 0, 1, 2, 3 }, \ - { 1*4, 0*4, 1*4+NUM*64*8, 0*4+NUM*64*8, 3*4, 2*4, 3*4+NUM*64*8, 2*4+NUM*64*8, \ - 5*4, 4*4, 5*4+NUM*64*8, 4*4+NUM*64*8, 7*4, 6*4, 7*4+NUM*64*8, 6*4+NUM*64*8 }, \ - { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, \ - 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 }, \ - 64*8 /* every sprite takes 64 consecutive bytes */ \ -} - -SPRITELAYOUT(512); -SPRITELAYOUT(1024); - +static const gfx_layout spritelayout = +{ + 16,16, + RGN_FRAC(1,2), + 4, + { 0, 1, 2, 3 }, + { 1*4, 0*4, RGN_FRAC(1,2)+1*4, RGN_FRAC(1,2)+0*4, 3*4, 2*4, RGN_FRAC(1,2)+3*4, RGN_FRAC(1,2)+2*4, + 5*4, 4*4, RGN_FRAC(1,2)+5*4, RGN_FRAC(1,2)+4*4, 7*4, 6*4, RGN_FRAC(1,2)+7*4, RGN_FRAC(1,2)+6*4}, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, + 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 }, + 64*8 +}; static GFXDECODE_START( galivan ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout_512, 0, 8 ) - GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 8*16, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, spritelayout_512, 8*16+16*16, 256 ) -GFXDECODE_END - -static GFXDECODE_START( ninjemak ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout_1024, 0, 8 ) - GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 8*16, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, spritelayout_1024, 8*16+16*16, 256 ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 8 ) + GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 8*16, 16 ) + GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 8*16+16*16, 256 ) GFXDECODE_END @@ -384,7 +372,6 @@ MACHINE_START_MEMBER(galivan_state,galivan) /* register for saving */ save_item(NAME(m_scrollx)); save_item(NAME(m_scrolly)); - save_item(NAME(m_flipscreen)); save_item(NAME(m_write_layers)); save_item(NAME(m_layers)); } @@ -399,7 +386,6 @@ MACHINE_START_MEMBER(galivan_state,ninjemak) /* register for saving */ save_item(NAME(m_scrollx)); save_item(NAME(m_scrolly)); - save_item(NAME(m_flipscreen)); save_item(NAME(m_ninjemak_dispdisable)); } @@ -412,7 +398,6 @@ MACHINE_RESET_MEMBER(galivan_state,galivan) m_write_layers = 0; m_galivan_scrollx[0] = m_galivan_scrollx[1] = 0; m_galivan_scrolly[0] = m_galivan_scrolly[1] = 0; - m_flipscreen = 0; } MACHINE_RESET_MEMBER(galivan_state,ninjemak) @@ -421,7 +406,6 @@ MACHINE_RESET_MEMBER(galivan_state,ninjemak) m_scrollx = 0; m_scrolly = 0; - m_flipscreen = 0; m_ninjemak_dispdisable = 0; } @@ -442,12 +426,15 @@ static MACHINE_CONFIG_START( galivan, galivan_state ) MCFG_MACHINE_RESET_OVERRIDE(galivan_state,galivan) /* video hardware */ + MCFG_BUFFERED_SPRITERAM8_ADD("spriteram") + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(galivan_state, screen_update_galivan) + MCFG_SCREEN_VBLANK_DEVICE("spriteram", buffered_spriteram8_device, vblank_copy_rising) MCFG_GFXDECODE_ADD("gfxdecode", galivan) MCFG_PALETTE_LENGTH(8*16+16*16+256*16) @@ -484,14 +471,17 @@ static MACHINE_CONFIG_START( ninjemak, galivan_state ) MCFG_MACHINE_RESET_OVERRIDE(galivan_state,ninjemak) /* video hardware */ + MCFG_BUFFERED_SPRITERAM8_ADD("spriteram") + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(galivan_state, screen_update_ninjemak) + MCFG_SCREEN_VBLANK_DEVICE("spriteram", buffered_spriteram8_device, vblank_copy_rising) - MCFG_GFXDECODE_ADD("gfxdecode", ninjemak) + MCFG_GFXDECODE_ADD("gfxdecode", galivan) MCFG_PALETTE_LENGTH(8*16+16*16+256*16) MCFG_VIDEO_START_OVERRIDE(galivan_state,ninjemak) diff --git a/src/mame/includes/galivan.h b/src/mame/includes/galivan.h index bfab4a0a937..a92f480a651 100644 --- a/src/mame/includes/galivan.h +++ b/src/mame/includes/galivan.h @@ -4,6 +4,8 @@ ***************************************************************************/ +#include "video/bufsprite.h" + class galivan_state : public driver_device { public: @@ -16,8 +18,7 @@ public: /* memory pointers */ required_shared_ptr m_videoram; -// UINT8 * m_colorram; - required_shared_ptr m_spriteram; + required_device m_spriteram; /* video-related */ tilemap_t *m_bg_tilemap; @@ -25,7 +26,6 @@ public: UINT16 m_scrollx; UINT16 m_scrolly; UINT8 m_galivan_scrollx[2],m_galivan_scrolly[2]; - UINT8 m_flipscreen; UINT8 m_write_layers; UINT8 m_layers; UINT8 m_ninjemak_dispdisable; diff --git a/src/mame/video/galivan.c b/src/mame/video/galivan.c index b5a1b5655dc..357f9590cc9 100644 --- a/src/mame/video/galivan.c +++ b/src/mame/video/galivan.c @@ -125,8 +125,7 @@ TILE_GET_INFO_MEMBER(galivan_state::get_bg_tile_info) UINT8 *BGROM = memregion("gfx4")->base(); int attr = BGROM[tile_index + 0x4000]; int code = BGROM[tile_index] | ((attr & 0x03) << 8); - SET_TILE_INFO_MEMBER(m_gfxdecode, - 1, + SET_TILE_INFO_MEMBER(m_gfxdecode, 1, code, (attr & 0x78) >> 3, /* seems correct */ 0); @@ -136,8 +135,7 @@ TILE_GET_INFO_MEMBER(galivan_state::get_tx_tile_info) { int attr = m_videoram[tile_index + 0x400]; int code = m_videoram[tile_index] | ((attr & 0x01) << 8); - SET_TILE_INFO_MEMBER(m_gfxdecode, - 0, + SET_TILE_INFO_MEMBER(m_gfxdecode, 0, code, (attr & 0xe0) >> 5, /* not sure */ 0); @@ -149,8 +147,7 @@ TILE_GET_INFO_MEMBER(galivan_state::ninjemak_get_bg_tile_info) UINT8 *BGROM = memregion("gfx4")->base(); int attr = BGROM[tile_index + 0x4000]; int code = BGROM[tile_index] | ((attr & 0x03) << 8); - SET_TILE_INFO_MEMBER(m_gfxdecode, - 1, + SET_TILE_INFO_MEMBER(m_gfxdecode, 1, code, ((attr & 0x60) >> 3) | ((attr & 0x0c) >> 2), /* seems correct */ 0); @@ -164,8 +161,7 @@ TILE_GET_INFO_MEMBER(galivan_state::ninjemak_get_tx_tile_info) if(tile_index < 0x12) /* don't draw the NB1414M4 params! TODO: could be a better fix */ code = attr = 0x01; - SET_TILE_INFO_MEMBER(m_gfxdecode, - 0, + SET_TILE_INFO_MEMBER(m_gfxdecode, 0, code, (attr & 0x1c) >> 2, /* seems correct ? */ 0); @@ -217,9 +213,7 @@ WRITE8_MEMBER(galivan_state::galivan_gfxbank_w) coin_counter_w(machine(), 1,data & 2); /* bit 2 flip screen */ - m_flipscreen = data & 0x04; - m_bg_tilemap->set_flip(m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - m_tx_tilemap->set_flip(m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + flip_screen_set(data & 0x04); /* bit 7 selects one of two ROM banks for c000-dfff */ membank("bank1")->set_entry((data & 0x80) >> 7); @@ -234,9 +228,7 @@ WRITE8_MEMBER(galivan_state::ninjemak_gfxbank_w) coin_counter_w(machine(), 1,data & 2); /* bit 2 flip screen */ - m_flipscreen = data & 0x04; - m_bg_tilemap->set_flip(m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - m_tx_tilemap->set_flip(m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + flip_screen_set(data & 0x04); /* bit 3 unknown */ @@ -297,22 +289,24 @@ WRITE8_MEMBER(galivan_state::galivan_scrolly_w) void galivan_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) { const UINT8 *spritepalettebank = memregion("user1")->base(); - UINT8 *spriteram = m_spriteram; - int offs; + UINT8 *buffered_spriteram = m_spriteram->buffer(); + int length = m_spriteram->bytes(); + int flip = flip_screen(); + gfx_element *gfx = m_gfxdecode->gfx(2); /* draw the sprites */ - for (offs = 0; offs < m_spriteram.bytes(); offs += 4) + for (int offs = 0; offs < length; offs += 4) { int code; - int attr = spriteram[offs + 2]; + int attr = buffered_spriteram[offs + 2]; int color = (attr & 0x3c) >> 2; int flipx = attr & 0x40; int flipy = attr & 0x80; int sx, sy; - sx = (spriteram[offs + 3] - 0x80) + 256 * (attr & 0x01); - sy = 240 - spriteram[offs]; - if (m_flipscreen) + sx = (buffered_spriteram[offs + 3] - 0x80) + 256 * (attr & 0x01); + sy = 240 - buffered_spriteram[offs]; + if (flip) { sx = 240 - sx; sy = 240 - sy; @@ -320,10 +314,10 @@ void galivan_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec flipy = !flipy; } -// code = spriteram[offs + 1] + ((attr & 0x02) << 7); - code = spriteram[offs + 1] + ((attr & 0x06) << 7); // for ninjemak, not sure ? +// code = buffered_spriteram[offs + 1] + ((attr & 0x02) << 7); + code = buffered_spriteram[offs + 1] + ((attr & 0x06) << 7); // for ninjemak, not sure ? - m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, + gfx->transpen(bitmap,cliprect, code, color + 16 * (spritepalettebank[code >> 2] & 0x0f), flipx,flipy,