mirror of
https://github.com/holub/mame
synced 2025-10-06 09:00:04 +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
|
||||
|
||||
|
||||
#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)
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user