galivan.c: add buffered spriteram to fix MT 05465; cleanups [Alex Jackson]

This commit is contained in:
Alex W. Jackson 2014-02-19 06:22:11 +00:00
parent 57cfaa163e
commit 429c4b838a
3 changed files with 54 additions and 70 deletions

View File

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

View File

@ -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<UINT8> m_videoram;
// UINT8 * m_colorram;
required_shared_ptr<UINT8> m_spriteram;
required_device<buffered_spriteram8_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;

View File

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