mirror of
https://github.com/holub/mame
synced 2025-10-10 01:56:53 +03:00
galivan.c: add buffered spriteram to fix MT 05465; cleanups [Alex Jackson]
This commit is contained in:
parent
57cfaa163e
commit
429c4b838a
@ -317,24 +317,22 @@ static INPUT_PORTS_START( ninjemak )
|
|||||||
INPUT_PORTS_END
|
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);
|
static const gfx_layout charlayout =
|
||||||
CHARLAYOUT(1024);
|
{
|
||||||
|
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 =
|
static const gfx_layout tilelayout =
|
||||||
{
|
{
|
||||||
16,16,
|
16,16,
|
||||||
1024,
|
RGN_FRAC(1,1),
|
||||||
4,
|
4,
|
||||||
{ 0, 1, 2, 3 },
|
{ 0, 1, 2, 3 },
|
||||||
{ 4,0,12,8,20,16,28,24,36,32,44,40,52,48,60,56 },
|
{ 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
|
16*16*4
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SPRITELAYOUT(NUM) static const gfx_layout spritelayout_##NUM = \
|
static const gfx_layout spritelayout =
|
||||||
{ \
|
{
|
||||||
16,16, /* 16*16 sprites */ \
|
16,16,
|
||||||
NUM, /* NUM sprites */ \
|
RGN_FRAC(1,2),
|
||||||
4, /* 4 bits per pixel */ \
|
4,
|
||||||
{ 0, 1, 2, 3 }, \
|
{ 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, \
|
{ 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, 5*4+NUM*64*8, 4*4+NUM*64*8, 7*4, 6*4, 7*4+NUM*64*8, 6*4+NUM*64*8 }, \
|
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, \
|
{ 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 }, \
|
8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
|
||||||
64*8 /* every sprite takes 64 consecutive bytes */ \
|
64*8
|
||||||
}
|
};
|
||||||
|
|
||||||
SPRITELAYOUT(512);
|
|
||||||
SPRITELAYOUT(1024);
|
|
||||||
|
|
||||||
|
|
||||||
static GFXDECODE_START( galivan )
|
static GFXDECODE_START( galivan )
|
||||||
GFXDECODE_ENTRY( "gfx1", 0, charlayout_512, 0, 8 )
|
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 8 )
|
||||||
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 8*16, 16 )
|
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 8*16, 16 )
|
||||||
GFXDECODE_ENTRY( "gfx3", 0, spritelayout_512, 8*16+16*16, 256 )
|
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 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_END
|
GFXDECODE_END
|
||||||
|
|
||||||
|
|
||||||
@ -384,7 +372,6 @@ MACHINE_START_MEMBER(galivan_state,galivan)
|
|||||||
/* register for saving */
|
/* register for saving */
|
||||||
save_item(NAME(m_scrollx));
|
save_item(NAME(m_scrollx));
|
||||||
save_item(NAME(m_scrolly));
|
save_item(NAME(m_scrolly));
|
||||||
save_item(NAME(m_flipscreen));
|
|
||||||
save_item(NAME(m_write_layers));
|
save_item(NAME(m_write_layers));
|
||||||
save_item(NAME(m_layers));
|
save_item(NAME(m_layers));
|
||||||
}
|
}
|
||||||
@ -399,7 +386,6 @@ MACHINE_START_MEMBER(galivan_state,ninjemak)
|
|||||||
/* register for saving */
|
/* register for saving */
|
||||||
save_item(NAME(m_scrollx));
|
save_item(NAME(m_scrollx));
|
||||||
save_item(NAME(m_scrolly));
|
save_item(NAME(m_scrolly));
|
||||||
save_item(NAME(m_flipscreen));
|
|
||||||
save_item(NAME(m_ninjemak_dispdisable));
|
save_item(NAME(m_ninjemak_dispdisable));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,7 +398,6 @@ MACHINE_RESET_MEMBER(galivan_state,galivan)
|
|||||||
m_write_layers = 0;
|
m_write_layers = 0;
|
||||||
m_galivan_scrollx[0] = m_galivan_scrollx[1] = 0;
|
m_galivan_scrollx[0] = m_galivan_scrollx[1] = 0;
|
||||||
m_galivan_scrolly[0] = m_galivan_scrolly[1] = 0;
|
m_galivan_scrolly[0] = m_galivan_scrolly[1] = 0;
|
||||||
m_flipscreen = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_RESET_MEMBER(galivan_state,ninjemak)
|
MACHINE_RESET_MEMBER(galivan_state,ninjemak)
|
||||||
@ -421,7 +406,6 @@ MACHINE_RESET_MEMBER(galivan_state,ninjemak)
|
|||||||
|
|
||||||
m_scrollx = 0;
|
m_scrollx = 0;
|
||||||
m_scrolly = 0;
|
m_scrolly = 0;
|
||||||
m_flipscreen = 0;
|
|
||||||
m_ninjemak_dispdisable = 0;
|
m_ninjemak_dispdisable = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,12 +426,15 @@ static MACHINE_CONFIG_START( galivan, galivan_state )
|
|||||||
MCFG_MACHINE_RESET_OVERRIDE(galivan_state,galivan)
|
MCFG_MACHINE_RESET_OVERRIDE(galivan_state,galivan)
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
|
MCFG_BUFFERED_SPRITERAM8_ADD("spriteram")
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_REFRESH_RATE(60)
|
MCFG_SCREEN_REFRESH_RATE(60)
|
||||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
||||||
MCFG_SCREEN_SIZE(32*8, 32*8)
|
MCFG_SCREEN_SIZE(32*8, 32*8)
|
||||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
|
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_UPDATE_DRIVER(galivan_state, screen_update_galivan)
|
||||||
|
MCFG_SCREEN_VBLANK_DEVICE("spriteram", buffered_spriteram8_device, vblank_copy_rising)
|
||||||
|
|
||||||
MCFG_GFXDECODE_ADD("gfxdecode", galivan)
|
MCFG_GFXDECODE_ADD("gfxdecode", galivan)
|
||||||
MCFG_PALETTE_LENGTH(8*16+16*16+256*16)
|
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)
|
MCFG_MACHINE_RESET_OVERRIDE(galivan_state,ninjemak)
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
|
MCFG_BUFFERED_SPRITERAM8_ADD("spriteram")
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_REFRESH_RATE(60)
|
MCFG_SCREEN_REFRESH_RATE(60)
|
||||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
||||||
MCFG_SCREEN_SIZE(32*8, 32*8)
|
MCFG_SCREEN_SIZE(32*8, 32*8)
|
||||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
|
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_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_PALETTE_LENGTH(8*16+16*16+256*16)
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(galivan_state,ninjemak)
|
MCFG_VIDEO_START_OVERRIDE(galivan_state,ninjemak)
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "video/bufsprite.h"
|
||||||
|
|
||||||
class galivan_state : public driver_device
|
class galivan_state : public driver_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -16,8 +18,7 @@ public:
|
|||||||
|
|
||||||
/* memory pointers */
|
/* memory pointers */
|
||||||
required_shared_ptr<UINT8> m_videoram;
|
required_shared_ptr<UINT8> m_videoram;
|
||||||
// UINT8 * m_colorram;
|
required_device<buffered_spriteram8_device> m_spriteram;
|
||||||
required_shared_ptr<UINT8> m_spriteram;
|
|
||||||
|
|
||||||
/* video-related */
|
/* video-related */
|
||||||
tilemap_t *m_bg_tilemap;
|
tilemap_t *m_bg_tilemap;
|
||||||
@ -25,7 +26,6 @@ public:
|
|||||||
UINT16 m_scrollx;
|
UINT16 m_scrollx;
|
||||||
UINT16 m_scrolly;
|
UINT16 m_scrolly;
|
||||||
UINT8 m_galivan_scrollx[2],m_galivan_scrolly[2];
|
UINT8 m_galivan_scrollx[2],m_galivan_scrolly[2];
|
||||||
UINT8 m_flipscreen;
|
|
||||||
UINT8 m_write_layers;
|
UINT8 m_write_layers;
|
||||||
UINT8 m_layers;
|
UINT8 m_layers;
|
||||||
UINT8 m_ninjemak_dispdisable;
|
UINT8 m_ninjemak_dispdisable;
|
||||||
|
@ -125,8 +125,7 @@ TILE_GET_INFO_MEMBER(galivan_state::get_bg_tile_info)
|
|||||||
UINT8 *BGROM = memregion("gfx4")->base();
|
UINT8 *BGROM = memregion("gfx4")->base();
|
||||||
int attr = BGROM[tile_index + 0x4000];
|
int attr = BGROM[tile_index + 0x4000];
|
||||||
int code = BGROM[tile_index] | ((attr & 0x03) << 8);
|
int code = BGROM[tile_index] | ((attr & 0x03) << 8);
|
||||||
SET_TILE_INFO_MEMBER(m_gfxdecode,
|
SET_TILE_INFO_MEMBER(m_gfxdecode, 1,
|
||||||
1,
|
|
||||||
code,
|
code,
|
||||||
(attr & 0x78) >> 3, /* seems correct */
|
(attr & 0x78) >> 3, /* seems correct */
|
||||||
0);
|
0);
|
||||||
@ -136,8 +135,7 @@ TILE_GET_INFO_MEMBER(galivan_state::get_tx_tile_info)
|
|||||||
{
|
{
|
||||||
int attr = m_videoram[tile_index + 0x400];
|
int attr = m_videoram[tile_index + 0x400];
|
||||||
int code = m_videoram[tile_index] | ((attr & 0x01) << 8);
|
int code = m_videoram[tile_index] | ((attr & 0x01) << 8);
|
||||||
SET_TILE_INFO_MEMBER(m_gfxdecode,
|
SET_TILE_INFO_MEMBER(m_gfxdecode, 0,
|
||||||
0,
|
|
||||||
code,
|
code,
|
||||||
(attr & 0xe0) >> 5, /* not sure */
|
(attr & 0xe0) >> 5, /* not sure */
|
||||||
0);
|
0);
|
||||||
@ -149,8 +147,7 @@ TILE_GET_INFO_MEMBER(galivan_state::ninjemak_get_bg_tile_info)
|
|||||||
UINT8 *BGROM = memregion("gfx4")->base();
|
UINT8 *BGROM = memregion("gfx4")->base();
|
||||||
int attr = BGROM[tile_index + 0x4000];
|
int attr = BGROM[tile_index + 0x4000];
|
||||||
int code = BGROM[tile_index] | ((attr & 0x03) << 8);
|
int code = BGROM[tile_index] | ((attr & 0x03) << 8);
|
||||||
SET_TILE_INFO_MEMBER(m_gfxdecode,
|
SET_TILE_INFO_MEMBER(m_gfxdecode, 1,
|
||||||
1,
|
|
||||||
code,
|
code,
|
||||||
((attr & 0x60) >> 3) | ((attr & 0x0c) >> 2), /* seems correct */
|
((attr & 0x60) >> 3) | ((attr & 0x0c) >> 2), /* seems correct */
|
||||||
0);
|
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 */
|
if(tile_index < 0x12) /* don't draw the NB1414M4 params! TODO: could be a better fix */
|
||||||
code = attr = 0x01;
|
code = attr = 0x01;
|
||||||
|
|
||||||
SET_TILE_INFO_MEMBER(m_gfxdecode,
|
SET_TILE_INFO_MEMBER(m_gfxdecode, 0,
|
||||||
0,
|
|
||||||
code,
|
code,
|
||||||
(attr & 0x1c) >> 2, /* seems correct ? */
|
(attr & 0x1c) >> 2, /* seems correct ? */
|
||||||
0);
|
0);
|
||||||
@ -217,9 +213,7 @@ WRITE8_MEMBER(galivan_state::galivan_gfxbank_w)
|
|||||||
coin_counter_w(machine(), 1,data & 2);
|
coin_counter_w(machine(), 1,data & 2);
|
||||||
|
|
||||||
/* bit 2 flip screen */
|
/* bit 2 flip screen */
|
||||||
m_flipscreen = data & 0x04;
|
flip_screen_set(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);
|
|
||||||
|
|
||||||
/* bit 7 selects one of two ROM banks for c000-dfff */
|
/* bit 7 selects one of two ROM banks for c000-dfff */
|
||||||
membank("bank1")->set_entry((data & 0x80) >> 7);
|
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);
|
coin_counter_w(machine(), 1,data & 2);
|
||||||
|
|
||||||
/* bit 2 flip screen */
|
/* bit 2 flip screen */
|
||||||
m_flipscreen = data & 0x04;
|
flip_screen_set(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);
|
|
||||||
|
|
||||||
/* bit 3 unknown */
|
/* 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 )
|
void galivan_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
|
||||||
{
|
{
|
||||||
const UINT8 *spritepalettebank = memregion("user1")->base();
|
const UINT8 *spritepalettebank = memregion("user1")->base();
|
||||||
UINT8 *spriteram = m_spriteram;
|
UINT8 *buffered_spriteram = m_spriteram->buffer();
|
||||||
int offs;
|
int length = m_spriteram->bytes();
|
||||||
|
int flip = flip_screen();
|
||||||
|
gfx_element *gfx = m_gfxdecode->gfx(2);
|
||||||
|
|
||||||
/* draw the sprites */
|
/* draw the sprites */
|
||||||
for (offs = 0; offs < m_spriteram.bytes(); offs += 4)
|
for (int offs = 0; offs < length; offs += 4)
|
||||||
{
|
{
|
||||||
int code;
|
int code;
|
||||||
int attr = spriteram[offs + 2];
|
int attr = buffered_spriteram[offs + 2];
|
||||||
int color = (attr & 0x3c) >> 2;
|
int color = (attr & 0x3c) >> 2;
|
||||||
int flipx = attr & 0x40;
|
int flipx = attr & 0x40;
|
||||||
int flipy = attr & 0x80;
|
int flipy = attr & 0x80;
|
||||||
int sx, sy;
|
int sx, sy;
|
||||||
|
|
||||||
sx = (spriteram[offs + 3] - 0x80) + 256 * (attr & 0x01);
|
sx = (buffered_spriteram[offs + 3] - 0x80) + 256 * (attr & 0x01);
|
||||||
sy = 240 - spriteram[offs];
|
sy = 240 - buffered_spriteram[offs];
|
||||||
if (m_flipscreen)
|
if (flip)
|
||||||
{
|
{
|
||||||
sx = 240 - sx;
|
sx = 240 - sx;
|
||||||
sy = 240 - sy;
|
sy = 240 - sy;
|
||||||
@ -320,10 +314,10 @@ void galivan_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
|
|||||||
flipy = !flipy;
|
flipy = !flipy;
|
||||||
}
|
}
|
||||||
|
|
||||||
// code = spriteram[offs + 1] + ((attr & 0x02) << 7);
|
// code = buffered_spriteram[offs + 1] + ((attr & 0x02) << 7);
|
||||||
code = spriteram[offs + 1] + ((attr & 0x06) << 7); // for ninjemak, not sure ?
|
code = buffered_spriteram[offs + 1] + ((attr & 0x06) << 7); // for ninjemak, not sure ?
|
||||||
|
|
||||||
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
|
gfx->transpen(bitmap,cliprect,
|
||||||
code,
|
code,
|
||||||
color + 16 * (spritepalettebank[code >> 2] & 0x0f),
|
color + 16 * (spritepalettebank[code >> 2] & 0x0f),
|
||||||
flipx,flipy,
|
flipx,flipy,
|
||||||
|
Loading…
Reference in New Issue
Block a user