mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
Cave cleanup
This commit is contained in:
parent
cb513fef5b
commit
bcd4b2f20a
@ -62,8 +62,8 @@ public:
|
||||
} m_blit;
|
||||
|
||||
|
||||
void (*m_get_sprite_info)(running_machine &machine);
|
||||
void (*m_sprite_draw)(running_machine &machine, int priority);
|
||||
void (cave_state::*m_get_sprite_info)();
|
||||
void (cave_state::*m_sprite_draw)(int priority);
|
||||
|
||||
tilemap_t *m_tilemap[4];
|
||||
int m_tiledim[4];
|
||||
@ -213,4 +213,20 @@ public:
|
||||
private:
|
||||
inline void get_tile_info( tile_data &tileinfo, int tile_index, int GFX );
|
||||
inline void tilemap_draw( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 flags, UINT32 priority, UINT32 priority2, int GFX );
|
||||
inline void vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX );
|
||||
inline void vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX );
|
||||
void set_pens();
|
||||
void cave_vh_start( int num );
|
||||
void get_sprite_info_cave();
|
||||
void get_sprite_info_donpachi();
|
||||
void sprite_init_cave();
|
||||
void cave_sprite_check(screen_device &screen, const rectangle &clip);
|
||||
void do_blit_zoom16_cave(const struct sprite_cave *sprite);
|
||||
void do_blit_zoom16_cave_zb( const struct sprite_cave *sprite );
|
||||
void do_blit_16_cave( const struct sprite_cave *sprite );
|
||||
void do_blit_16_cave_zb( const struct sprite_cave *sprite );
|
||||
void sprite_draw_cave( int priority );
|
||||
void sprite_draw_cave_zbuf( int priority );
|
||||
void sprite_draw_donpachi( int priority );
|
||||
void sprite_draw_donpachi_zbuf( int priority );
|
||||
};
|
||||
|
@ -57,11 +57,6 @@ Note: if MAME_DEBUG is defined, pressing:
|
||||
|
||||
#define SWAP(X,Y) { int temp = X; X = Y; Y = temp; }
|
||||
|
||||
static void sprite_init_cave(running_machine &machine);
|
||||
static void sprite_draw_cave(running_machine &machine, int priority);
|
||||
static void sprite_draw_cave_zbuf(running_machine &machine, int priority);
|
||||
static void sprite_draw_donpachi(running_machine &machine, int priority);
|
||||
static void sprite_draw_donpachi_zbuf(running_machine &machine, int priority);
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -178,18 +173,17 @@ PALETTE_INIT_MEMBER(cave_state,korokoro)
|
||||
}
|
||||
|
||||
|
||||
static void set_pens( running_machine &machine )
|
||||
void cave_state::set_pens()
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int pen;
|
||||
|
||||
for (pen = 0; pen < machine.total_colors(); pen++)
|
||||
for (pen = 0; pen < machine().total_colors(); pen++)
|
||||
{
|
||||
UINT16 data = state->m_paletteram[state->m_palette_map[pen]];
|
||||
UINT16 data = m_paletteram[m_palette_map[pen]];
|
||||
|
||||
rgb_t color = MAKE_RGB(pal5bit(data >> 5), pal5bit(data >> 10), pal5bit(data >> 0));
|
||||
|
||||
palette_set_color(machine, pen, color);
|
||||
palette_set_color(machine(), pen, color);
|
||||
}
|
||||
}
|
||||
|
||||
@ -293,11 +287,10 @@ TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2)
|
||||
}
|
||||
|
||||
|
||||
INLINE void vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX )
|
||||
inline void cave_state::vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX )
|
||||
{
|
||||
cave_state *state = space.machine().driver_data<cave_state>();
|
||||
UINT16 *VRAM = state->m_vram[GFX];
|
||||
tilemap_t *TILEMAP = state->m_tilemap[GFX];
|
||||
UINT16 *VRAM = m_vram[GFX];
|
||||
tilemap_t *TILEMAP = m_tilemap[GFX];
|
||||
|
||||
if ((VRAM[offset] & mem_mask) == (data & mem_mask))
|
||||
return;
|
||||
@ -321,11 +314,10 @@ INLINE void vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED
|
||||
and 408000-407fff both go to the 8x8 tilemap ram. Use this function
|
||||
in this cases. Note that the get_tile_info function looks in the
|
||||
4000-7fff range for tiles, so we have to write the data there. */
|
||||
INLINE void vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX )
|
||||
inline void cave_state::vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX )
|
||||
{
|
||||
cave_state *state = space.machine().driver_data<cave_state>();
|
||||
UINT16 *VRAM = state->m_vram[GFX];
|
||||
tilemap_t *TILEMAP = state->m_tilemap[GFX];
|
||||
UINT16 *VRAM = m_vram[GFX];
|
||||
tilemap_t *TILEMAP = m_tilemap[GFX];
|
||||
|
||||
offset %= 0x4000 / 2;
|
||||
if ((VRAM[offset] & mem_mask) == (data & mem_mask))
|
||||
@ -362,103 +354,101 @@ WRITE16_MEMBER(cave_state::cave_vram_3_8x8_w){ vram_8x8_w(space, offset, data, m
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static void cave_vh_start( running_machine &machine, int num )
|
||||
void cave_state::cave_vh_start( int num )
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
assert(m_palette_map != NULL);
|
||||
|
||||
assert(state->m_palette_map != NULL);
|
||||
m_tilemap[0] = 0;
|
||||
m_tilemap[1] = 0;
|
||||
m_tilemap[2] = 0;
|
||||
m_tilemap[3] = 0;
|
||||
|
||||
state->m_tilemap[0] = 0;
|
||||
state->m_tilemap[1] = 0;
|
||||
state->m_tilemap[2] = 0;
|
||||
state->m_tilemap[3] = 0;
|
||||
m_tiledim[0] = 0;
|
||||
m_tiledim[1] = 0;
|
||||
m_tiledim[2] = 0;
|
||||
m_tiledim[3] = 0;
|
||||
|
||||
state->m_tiledim[0] = 0;
|
||||
state->m_tiledim[1] = 0;
|
||||
state->m_tiledim[2] = 0;
|
||||
state->m_tiledim[3] = 0;
|
||||
|
||||
state->m_old_tiledim[0] = 0;
|
||||
state->m_old_tiledim[1] = 0;
|
||||
state->m_old_tiledim[2] = 0;
|
||||
state->m_old_tiledim[3] = 0;
|
||||
m_old_tiledim[0] = 0;
|
||||
m_old_tiledim[1] = 0;
|
||||
m_old_tiledim[2] = 0;
|
||||
m_old_tiledim[3] = 0;
|
||||
|
||||
assert((num >= 1) && (num <= 4));
|
||||
|
||||
switch (num)
|
||||
{
|
||||
case 4:
|
||||
state->m_tilemap[3] = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_3),state), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
|
||||
state->m_tilemap[3]->set_transparent_pen(0);
|
||||
state->m_tilemap[3]->set_scroll_rows(1);
|
||||
state->m_tilemap[3]->set_scroll_cols(1);
|
||||
state->save_item(NAME(state->m_tiledim[3]));
|
||||
state->save_item(NAME(state->m_old_tiledim[3]));
|
||||
m_tilemap[3] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_3),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
|
||||
m_tilemap[3]->set_transparent_pen(0);
|
||||
m_tilemap[3]->set_scroll_rows(1);
|
||||
m_tilemap[3]->set_scroll_cols(1);
|
||||
save_item(NAME(m_tiledim[3]));
|
||||
save_item(NAME(m_old_tiledim[3]));
|
||||
|
||||
case 3:
|
||||
state->m_tilemap[2] = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_2),state), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
|
||||
state->m_tilemap[2]->set_transparent_pen(0);
|
||||
state->m_tilemap[2]->set_scroll_rows(1);
|
||||
state->m_tilemap[2]->set_scroll_cols(1);
|
||||
state->save_item(NAME(state->m_tiledim[2]));
|
||||
state->save_item(NAME(state->m_old_tiledim[2]));
|
||||
m_tilemap[2] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_2),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
|
||||
m_tilemap[2]->set_transparent_pen(0);
|
||||
m_tilemap[2]->set_scroll_rows(1);
|
||||
m_tilemap[2]->set_scroll_cols(1);
|
||||
save_item(NAME(m_tiledim[2]));
|
||||
save_item(NAME(m_old_tiledim[2]));
|
||||
|
||||
case 2:
|
||||
state->m_tilemap[1] = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_1),state), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
|
||||
state->m_tilemap[1]->set_transparent_pen(0);
|
||||
state->m_tilemap[1]->set_scroll_rows(1);
|
||||
state->m_tilemap[1]->set_scroll_cols(1);
|
||||
state->save_item(NAME(state->m_tiledim[1]));
|
||||
state->save_item(NAME(state->m_old_tiledim[1]));
|
||||
m_tilemap[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_1),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
|
||||
m_tilemap[1]->set_transparent_pen(0);
|
||||
m_tilemap[1]->set_scroll_rows(1);
|
||||
m_tilemap[1]->set_scroll_cols(1);
|
||||
save_item(NAME(m_tiledim[1]));
|
||||
save_item(NAME(m_old_tiledim[1]));
|
||||
|
||||
case 1:
|
||||
state->m_tilemap[0] = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_0),state), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
|
||||
state->m_tilemap[0]->set_transparent_pen(0);
|
||||
state->m_tilemap[0]->set_scroll_rows(1);
|
||||
state->m_tilemap[0]->set_scroll_cols(1);
|
||||
state->save_item(NAME(state->m_tiledim[0]));
|
||||
state->save_item(NAME(state->m_old_tiledim[0]));
|
||||
m_tilemap[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_0),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
|
||||
m_tilemap[0]->set_transparent_pen(0);
|
||||
m_tilemap[0]->set_scroll_rows(1);
|
||||
m_tilemap[0]->set_scroll_cols(1);
|
||||
save_item(NAME(m_tiledim[0]));
|
||||
save_item(NAME(m_old_tiledim[0]));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
sprite_init_cave(machine);
|
||||
sprite_init_cave();
|
||||
|
||||
state->m_layers_offs_x = 0x13;
|
||||
state->m_layers_offs_y = -0x12;
|
||||
m_layers_offs_x = 0x13;
|
||||
m_layers_offs_y = -0x12;
|
||||
|
||||
state->m_row_effect_offs_n = -1;
|
||||
state->m_row_effect_offs_f = 1;
|
||||
m_row_effect_offs_n = -1;
|
||||
m_row_effect_offs_f = 1;
|
||||
|
||||
state->m_background_color = machine.config().m_gfxdecodeinfo[0].color_codes_start +
|
||||
(machine.config().m_gfxdecodeinfo[0].total_color_codes - 1) *
|
||||
machine.gfx[0]->granularity();
|
||||
m_background_color = machine().config().m_gfxdecodeinfo[0].color_codes_start +
|
||||
(machine().config().m_gfxdecodeinfo[0].total_color_codes - 1) *
|
||||
machine().gfx[0]->granularity();
|
||||
|
||||
switch (state->m_kludge)
|
||||
switch (m_kludge)
|
||||
{
|
||||
case 1: /* sailormn */
|
||||
state->m_row_effect_offs_n = -1;
|
||||
state->m_row_effect_offs_f = -1;
|
||||
m_row_effect_offs_n = -1;
|
||||
m_row_effect_offs_f = -1;
|
||||
break;
|
||||
case 2: /* uopoko dfeveron */
|
||||
state->m_background_color = 0x3f00;
|
||||
m_background_color = 0x3f00;
|
||||
break;
|
||||
case 4: /* pwrinst2 */
|
||||
state->m_background_color = 0x7f00;
|
||||
state->m_layers_offs_y++;
|
||||
m_background_color = 0x7f00;
|
||||
m_layers_offs_y++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(cave_state,cave_1_layer){ cave_vh_start(machine(), 1); }
|
||||
VIDEO_START_MEMBER(cave_state,cave_2_layers){ cave_vh_start(machine(), 2); }
|
||||
VIDEO_START_MEMBER(cave_state,cave_3_layers){ cave_vh_start(machine(), 3); }
|
||||
VIDEO_START_MEMBER(cave_state,cave_4_layers){ cave_vh_start(machine(), 4); }
|
||||
VIDEO_START_MEMBER(cave_state,cave_1_layer){ cave_vh_start(1); }
|
||||
VIDEO_START_MEMBER(cave_state,cave_2_layers){ cave_vh_start(2); }
|
||||
VIDEO_START_MEMBER(cave_state,cave_3_layers){ cave_vh_start(3); }
|
||||
VIDEO_START_MEMBER(cave_state,cave_4_layers){ cave_vh_start(4); }
|
||||
|
||||
|
||||
VIDEO_START_MEMBER(cave_state,sailormn_3_layers)
|
||||
{
|
||||
cave_vh_start(machine(), 2);
|
||||
cave_vh_start(2);
|
||||
|
||||
/* Layer 2 (8x8) needs to be handled differently */
|
||||
m_tilemap[2] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(cave_state::sailormn_get_tile_info_2),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8 );
|
||||
@ -500,30 +490,29 @@ VIDEO_START_MEMBER(cave_state,sailormn_3_layers)
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static void get_sprite_info_cave( running_machine &machine )
|
||||
void cave_state::get_sprite_info_cave()
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
pen_t base_pal = 0;
|
||||
const UINT8 *base_gfx = state->memregion("sprites")->base();
|
||||
int code_max = state->memregion("sprites")->bytes() / (16*16);
|
||||
const UINT8 *base_gfx = memregion("sprites")->base();
|
||||
int code_max = memregion("sprites")->bytes() / (16*16);
|
||||
|
||||
UINT16 *source;
|
||||
UINT16 *finish;
|
||||
struct sprite_cave *sprite = state->m_sprite;
|
||||
struct sprite_cave *sprite = m_sprite;
|
||||
|
||||
int glob_flipx = state->m_videoregs[0] & 0x8000;
|
||||
int glob_flipy = state->m_videoregs[1] & 0x8000;
|
||||
int glob_flipx = m_videoregs[0] & 0x8000;
|
||||
int glob_flipy = m_videoregs[1] & 0x8000;
|
||||
|
||||
int max_x = machine.primary_screen->width();
|
||||
int max_y = machine.primary_screen->height();
|
||||
int max_x = m_screen->width();
|
||||
int max_y = m_screen->height();
|
||||
|
||||
source = state->m_spriteram + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank;
|
||||
source = m_spriteram + ((m_spriteram.bytes() / 2) / 2) * m_spriteram_bank;
|
||||
|
||||
if (state->m_videoregs[4] & 0x02)
|
||||
if (state->m_spriteram_2)
|
||||
source = state->m_spriteram_2 + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank;
|
||||
if (m_videoregs[4] & 0x02)
|
||||
if (m_spriteram_2)
|
||||
source = m_spriteram_2 + ((m_spriteram.bytes() / 2) / 2) * m_spriteram_bank;
|
||||
|
||||
finish = source + ((state->m_spriteram.bytes() / 2) / 2);
|
||||
finish = source + ((m_spriteram.bytes() / 2) / 2);
|
||||
|
||||
|
||||
for (; source < finish; source += 8)
|
||||
@ -531,7 +520,7 @@ static void get_sprite_info_cave( running_machine &machine )
|
||||
int x, y, attr, code, zoomx, zoomy, size, flipx, flipy;
|
||||
int total_width_f, total_height_f;
|
||||
|
||||
if (state->m_spritetype[0] == 2) /* Hot Dog Storm */
|
||||
if (m_spritetype[0] == 2) /* Hot Dog Storm */
|
||||
{
|
||||
x = (source[0] & 0x3ff) << 8;
|
||||
y = (source[1] & 0x3ff) << 8;
|
||||
@ -589,7 +578,7 @@ static void get_sprite_info_cave( running_machine &machine )
|
||||
sprite->ycount0 = sprite->zoomy_re - 1;
|
||||
}
|
||||
|
||||
if (state->m_spritetype[0] == 2)
|
||||
if (m_spritetype[0] == 2)
|
||||
{
|
||||
x >>= 8;
|
||||
y >>= 8;
|
||||
@ -626,34 +615,33 @@ static void get_sprite_info_cave( running_machine &machine )
|
||||
|
||||
sprite++;
|
||||
}
|
||||
state->m_num_sprites = sprite - state->m_sprite;
|
||||
m_num_sprites = sprite - m_sprite;
|
||||
}
|
||||
|
||||
static void get_sprite_info_donpachi( running_machine &machine )
|
||||
void cave_state::get_sprite_info_donpachi()
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
pen_t base_pal = 0;
|
||||
const UINT8 *base_gfx = state->memregion("sprites")->base();
|
||||
int code_max = state->memregion("sprites")->bytes() / (16*16);
|
||||
const UINT8 *base_gfx = memregion("sprites")->base();
|
||||
int code_max = memregion("sprites")->bytes() / (16*16);
|
||||
|
||||
UINT16 *source;
|
||||
UINT16 *finish;
|
||||
|
||||
struct sprite_cave *sprite = state->m_sprite;
|
||||
struct sprite_cave *sprite = m_sprite;
|
||||
|
||||
int glob_flipx = state->m_videoregs[0] & 0x8000;
|
||||
int glob_flipy = state->m_videoregs[1] & 0x8000;
|
||||
int glob_flipx = m_videoregs[0] & 0x8000;
|
||||
int glob_flipy = m_videoregs[1] & 0x8000;
|
||||
|
||||
int max_x = machine.primary_screen->width();
|
||||
int max_y = machine.primary_screen->height();
|
||||
int max_x = m_screen->width();
|
||||
int max_y = m_screen->height();
|
||||
|
||||
source = state->m_spriteram + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank;
|
||||
source = m_spriteram + ((m_spriteram.bytes() / 2) / 2) * m_spriteram_bank;
|
||||
|
||||
if (state->m_videoregs[4] & 0x02)
|
||||
if (state->m_spriteram_2)
|
||||
source = state->m_spriteram_2 + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank;
|
||||
if (m_videoregs[4] & 0x02)
|
||||
if (m_spriteram_2)
|
||||
source = m_spriteram_2 + ((m_spriteram.bytes() / 2) / 2) * m_spriteram_bank;
|
||||
|
||||
finish = source + ((state->m_spriteram.bytes() / 2) / 2);
|
||||
finish = source + ((m_spriteram.bytes() / 2) / 2);
|
||||
|
||||
for (; source < finish; source += 8)
|
||||
{
|
||||
@ -663,7 +651,7 @@ static void get_sprite_info_donpachi( running_machine &machine )
|
||||
code = source[1] + ((attr & 3) << 16);
|
||||
x = source[2] & 0x3ff;
|
||||
|
||||
if (state->m_spritetype[0] == 3) /* pwrinst2 */
|
||||
if (m_spritetype[0] == 3) /* pwrinst2 */
|
||||
y = (source[3] + 1) & 0x3ff;
|
||||
else
|
||||
y = source[3] & 0x3ff;
|
||||
@ -687,7 +675,7 @@ static void get_sprite_info_donpachi( running_machine &machine )
|
||||
flipx = attr & 0x0008;
|
||||
flipy = attr & 0x0004;
|
||||
|
||||
if (state->m_spritetype[0] == 3) /* pwrinst2 */
|
||||
if (m_spritetype[0] == 3) /* pwrinst2 */
|
||||
{
|
||||
sprite->priority = ((attr & 0x0010) >> 4) + 2;
|
||||
sprite->base_pen = base_pal + (attr & 0x3f00) + 0x4000 * ((attr & 0x0020) >> 5);
|
||||
@ -712,78 +700,74 @@ static void get_sprite_info_donpachi( running_machine &machine )
|
||||
|
||||
sprite++;
|
||||
}
|
||||
state->m_num_sprites = sprite - state->m_sprite;
|
||||
m_num_sprites = sprite - m_sprite;
|
||||
}
|
||||
|
||||
|
||||
static void sprite_init_cave( running_machine &machine )
|
||||
void cave_state::sprite_init_cave()
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
|
||||
if (state->m_spritetype[0] == 0 || state->m_spritetype[0] == 2) // most of the games
|
||||
if (m_spritetype[0] == 0 || m_spritetype[0] == 2) // most of the games
|
||||
{
|
||||
state->m_get_sprite_info = get_sprite_info_cave;
|
||||
state->m_spritetype[1] = CAVE_SPRITETYPE_ZOOM;
|
||||
m_get_sprite_info = &cave_state::get_sprite_info_cave;
|
||||
m_spritetype[1] = CAVE_SPRITETYPE_ZOOM;
|
||||
}
|
||||
else // donpachi ddonpach
|
||||
{
|
||||
state->m_get_sprite_info = get_sprite_info_donpachi;
|
||||
state->m_spritetype[1] = 0;
|
||||
m_get_sprite_info = &cave_state::get_sprite_info_donpachi;
|
||||
m_spritetype[1] = 0;
|
||||
}
|
||||
|
||||
state->m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM;
|
||||
machine.primary_screen->register_screen_bitmap(state->m_sprite_zbuf);
|
||||
m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM;
|
||||
m_screen->register_screen_bitmap(m_sprite_zbuf);
|
||||
|
||||
state->m_num_sprites = state->m_spriteram.bytes() / 0x10 / 2;
|
||||
state->m_sprite = auto_alloc_array_clear(machine, struct sprite_cave, state->m_num_sprites);
|
||||
m_num_sprites = m_spriteram.bytes() / 0x10 / 2;
|
||||
m_sprite = auto_alloc_array_clear(machine(), struct sprite_cave, m_num_sprites);
|
||||
|
||||
memset(state->m_sprite_table, 0, sizeof(state->m_sprite_table));
|
||||
state->m_sprite_draw = sprite_draw_donpachi;
|
||||
memset(m_sprite_table, 0, sizeof(m_sprite_table));
|
||||
m_sprite_draw = &cave_state::sprite_draw_donpachi;
|
||||
|
||||
state->save_item(NAME(state->m_sprite_zbuf));
|
||||
state->save_item(NAME(state->m_sprite_zbuf_baseval));
|
||||
state->save_item(NAME(state->m_num_sprites));
|
||||
state->save_item(NAME(state->m_spriteram_bank));
|
||||
state->save_item(NAME(state->m_spriteram_bank_delay));
|
||||
save_item(NAME(m_sprite_zbuf));
|
||||
save_item(NAME(m_sprite_zbuf_baseval));
|
||||
save_item(NAME(m_num_sprites));
|
||||
save_item(NAME(m_spriteram_bank));
|
||||
save_item(NAME(m_spriteram_bank_delay));
|
||||
|
||||
state->save_item(NAME(state->m_blit.clip_left));
|
||||
state->save_item(NAME(state->m_blit.clip_right));
|
||||
state->save_item(NAME(state->m_blit.clip_top));
|
||||
state->save_item(NAME(state->m_blit.clip_bottom));
|
||||
save_item(NAME(m_blit.clip_left));
|
||||
save_item(NAME(m_blit.clip_right));
|
||||
save_item(NAME(m_blit.clip_top));
|
||||
save_item(NAME(m_blit.clip_bottom));
|
||||
|
||||
machine.save().register_postload(save_prepost_delegate(FUNC(cave_state::cave_get_sprite_info), state));
|
||||
machine().save().register_postload(save_prepost_delegate(FUNC(cave_state::cave_get_sprite_info), this));
|
||||
}
|
||||
|
||||
static void cave_sprite_check( screen_device &screen, const rectangle &clip )
|
||||
void cave_state::cave_sprite_check(screen_device &screen, const rectangle &clip)
|
||||
{
|
||||
cave_state *state = screen.machine().driver_data<cave_state>();
|
||||
|
||||
{ /* set clip */
|
||||
int left = clip.min_x;
|
||||
int top = clip.min_y;
|
||||
int right = clip.max_x + 1;
|
||||
int bottom = clip.max_y + 1;
|
||||
|
||||
state->m_blit.clip_left = left;
|
||||
state->m_blit.clip_top = top;
|
||||
state->m_blit.clip_right = right;
|
||||
state->m_blit.clip_bottom = bottom;
|
||||
m_blit.clip_left = left;
|
||||
m_blit.clip_top = top;
|
||||
m_blit.clip_right = right;
|
||||
m_blit.clip_bottom = bottom;
|
||||
}
|
||||
|
||||
{ /* check priority & sprite type */
|
||||
struct sprite_cave *sprite = state->m_sprite;
|
||||
const struct sprite_cave *finish = &sprite[state->m_num_sprites];
|
||||
struct sprite_cave *sprite = m_sprite;
|
||||
const struct sprite_cave *finish = &sprite[m_num_sprites];
|
||||
int i[4] = {0,0,0,0};
|
||||
int priority_check = 0;
|
||||
int spritetype = state->m_spritetype[1];
|
||||
int spritetype = m_spritetype[1];
|
||||
const rectangle &visarea = screen.visible_area();
|
||||
|
||||
while (sprite < finish)
|
||||
{
|
||||
if (sprite->x + sprite->total_width > state->m_blit.clip_left && sprite->x < state->m_blit.clip_right &&
|
||||
sprite->y + sprite->total_height > state->m_blit.clip_top && sprite->y < state->m_blit.clip_bottom )
|
||||
if (sprite->x + sprite->total_width > m_blit.clip_left && sprite->x < m_blit.clip_right &&
|
||||
sprite->y + sprite->total_height > m_blit.clip_top && sprite->y < m_blit.clip_bottom )
|
||||
{
|
||||
state->m_sprite_table[sprite->priority][i[sprite->priority]++] = sprite;
|
||||
m_sprite_table[sprite->priority][i[sprite->priority]++] = sprite;
|
||||
|
||||
if(!(spritetype & CAVE_SPRITETYPE_ZBUF))
|
||||
{
|
||||
@ -796,46 +780,45 @@ static void cave_sprite_check( screen_device &screen, const rectangle &clip )
|
||||
sprite++;
|
||||
}
|
||||
|
||||
state->m_sprite_table[0][i[0]] = 0;
|
||||
state->m_sprite_table[1][i[1]] = 0;
|
||||
state->m_sprite_table[2][i[2]] = 0;
|
||||
state->m_sprite_table[3][i[3]] = 0;
|
||||
m_sprite_table[0][i[0]] = 0;
|
||||
m_sprite_table[1][i[1]] = 0;
|
||||
m_sprite_table[2][i[2]] = 0;
|
||||
m_sprite_table[3][i[3]] = 0;
|
||||
|
||||
switch (spritetype)
|
||||
{
|
||||
case CAVE_SPRITETYPE_ZOOM:
|
||||
state->m_sprite_draw = sprite_draw_cave;
|
||||
m_sprite_draw = &cave_state::sprite_draw_cave;
|
||||
break;
|
||||
|
||||
case CAVE_SPRITETYPE_ZOOM | CAVE_SPRITETYPE_ZBUF:
|
||||
state->m_sprite_draw = sprite_draw_cave_zbuf;
|
||||
m_sprite_draw = &cave_state::sprite_draw_cave_zbuf;
|
||||
if (clip.min_y == visarea.min_y)
|
||||
{
|
||||
if(!(state->m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
|
||||
state->m_sprite_zbuf.fill(0, visarea);
|
||||
if(!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
|
||||
m_sprite_zbuf.fill(0, visarea);
|
||||
}
|
||||
break;
|
||||
|
||||
case CAVE_SPRITETYPE_ZBUF:
|
||||
state->m_sprite_draw = sprite_draw_donpachi_zbuf;
|
||||
m_sprite_draw = &cave_state::sprite_draw_donpachi_zbuf;
|
||||
if (clip.min_y == visarea.min_y)
|
||||
{
|
||||
if(!(state->m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
|
||||
state->m_sprite_zbuf.fill(0, visarea);
|
||||
if(!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
|
||||
m_sprite_zbuf.fill(0, visarea);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
case 0:
|
||||
state->m_sprite_draw = sprite_draw_donpachi;
|
||||
m_sprite_draw = &cave_state::sprite_draw_donpachi;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_cave *sprite )
|
||||
void cave_state::do_blit_zoom16_cave(const struct sprite_cave *sprite)
|
||||
{
|
||||
/* assumes SPRITE_LIST_RAW_DATA flag is set */
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int x1, x2, y1, y2, dx, dy;
|
||||
int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0;
|
||||
|
||||
@ -844,13 +827,13 @@ static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_c
|
||||
x2 = sprite->x;
|
||||
x1 = x2 + sprite->total_width;
|
||||
dx = -1;
|
||||
if (x2 < state->m_blit.clip_left)
|
||||
x2 = state->m_blit.clip_left;
|
||||
if (x2 < m_blit.clip_left)
|
||||
x2 = m_blit.clip_left;
|
||||
|
||||
if (x1 > state->m_blit.clip_right)
|
||||
if (x1 > m_blit.clip_right)
|
||||
{
|
||||
xcount0 += (x1 - state->m_blit.clip_right) * sprite->zoomx_re;
|
||||
x1 = state->m_blit.clip_right;
|
||||
xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re;
|
||||
x1 = m_blit.clip_right;
|
||||
while ((xcount0 & 0xffff) >= sprite->zoomx_re)
|
||||
{
|
||||
xcount0 += sprite->zoomx_re;
|
||||
@ -867,18 +850,18 @@ static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_c
|
||||
x1 = sprite->x;
|
||||
x2 = x1 + sprite->total_width;
|
||||
dx = 1;
|
||||
if (x1 < state->m_blit.clip_left)
|
||||
if (x1 < m_blit.clip_left)
|
||||
{
|
||||
xcount0 += (state->m_blit.clip_left - x1) * sprite->zoomx_re;
|
||||
x1 = state->m_blit.clip_left;
|
||||
xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re;
|
||||
x1 = m_blit.clip_left;
|
||||
while ((xcount0 & 0xffff) >= sprite->zoomx_re)
|
||||
{
|
||||
xcount0 += sprite->zoomx_re;
|
||||
x1++;
|
||||
}
|
||||
}
|
||||
if (x2 > state->m_blit.clip_right)
|
||||
x2 = state->m_blit.clip_right;
|
||||
if (x2 > m_blit.clip_right)
|
||||
x2 = m_blit.clip_right;
|
||||
if (x1 >= x2)
|
||||
return;
|
||||
}
|
||||
@ -888,12 +871,12 @@ static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_c
|
||||
y2 = sprite->y;
|
||||
y1 = y2 + sprite->total_height;
|
||||
dy = -1;
|
||||
if (y2 < state->m_blit.clip_top)
|
||||
y2 = state->m_blit.clip_top;
|
||||
if (y1 > state->m_blit.clip_bottom)
|
||||
if (y2 < m_blit.clip_top)
|
||||
y2 = m_blit.clip_top;
|
||||
if (y1 > m_blit.clip_bottom)
|
||||
{
|
||||
ycount0 += (y1 - state->m_blit.clip_bottom) * sprite->zoomy_re;
|
||||
y1 = state->m_blit.clip_bottom;
|
||||
ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re;
|
||||
y1 = m_blit.clip_bottom;
|
||||
while ((ycount0 & 0xffff) >= sprite->zoomy_re)
|
||||
{
|
||||
ycount0 += sprite->zoomy_re;
|
||||
@ -909,18 +892,18 @@ static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_c
|
||||
y1 = sprite->y;
|
||||
y2 = y1 + sprite->total_height;
|
||||
dy = 1;
|
||||
if (y1 < state->m_blit.clip_top)
|
||||
if (y1 < m_blit.clip_top)
|
||||
{
|
||||
ycount0 += (state->m_blit.clip_top - y1) * sprite->zoomy_re;
|
||||
y1 = state->m_blit.clip_top;
|
||||
ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re;
|
||||
y1 = m_blit.clip_top;
|
||||
while ((ycount0 & 0xffff) >= sprite->zoomy_re)
|
||||
{
|
||||
ycount0 += sprite->zoomy_re;
|
||||
y1++;
|
||||
}
|
||||
}
|
||||
if (y2 > state->m_blit.clip_bottom )
|
||||
y2 = state->m_blit.clip_bottom;
|
||||
if (y2 > m_blit.clip_bottom )
|
||||
y2 = m_blit.clip_bottom;
|
||||
if (y1 >= y2)
|
||||
return;
|
||||
}
|
||||
@ -930,8 +913,8 @@ static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_c
|
||||
pen_t base_pen = sprite->base_pen;
|
||||
int x, y;
|
||||
UINT8 pen;
|
||||
int pitch = state->m_blit.line_offset * dy / 2;
|
||||
UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1);
|
||||
int pitch = m_blit.line_offset * dy / 2;
|
||||
UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
int ycount = ycount0;
|
||||
|
||||
for (y = y1; y != y2; y += dy)
|
||||
@ -965,10 +948,9 @@ static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_c
|
||||
}
|
||||
|
||||
|
||||
static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprite_cave *sprite )
|
||||
void cave_state::do_blit_zoom16_cave_zb( const struct sprite_cave *sprite )
|
||||
{
|
||||
/* assumes SPRITE_LIST_RAW_DATA flag is set */
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int x1, x2, y1, y2, dx, dy;
|
||||
int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0;
|
||||
|
||||
@ -977,12 +959,12 @@ static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprit
|
||||
x2 = sprite->x;
|
||||
x1 = x2 + sprite->total_width;
|
||||
dx = -1;
|
||||
if (x2 < state->m_blit.clip_left)
|
||||
x2 = state->m_blit.clip_left;
|
||||
if (x1 > state->m_blit.clip_right)
|
||||
if (x2 < m_blit.clip_left)
|
||||
x2 = m_blit.clip_left;
|
||||
if (x1 > m_blit.clip_right)
|
||||
{
|
||||
xcount0 += (x1 - state->m_blit.clip_right) * sprite->zoomx_re;
|
||||
x1 = state->m_blit.clip_right;
|
||||
xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re;
|
||||
x1 = m_blit.clip_right;
|
||||
while ((xcount0 & 0xffff) >= sprite->zoomx_re)
|
||||
{
|
||||
xcount0 += sprite->zoomx_re;
|
||||
@ -998,18 +980,18 @@ static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprit
|
||||
x1 = sprite->x;
|
||||
x2 = x1 + sprite->total_width;
|
||||
dx = 1;
|
||||
if (x1 < state->m_blit.clip_left)
|
||||
if (x1 < m_blit.clip_left)
|
||||
{
|
||||
xcount0 += (state->m_blit.clip_left - x1) * sprite->zoomx_re;
|
||||
x1 = state->m_blit.clip_left;
|
||||
xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re;
|
||||
x1 = m_blit.clip_left;
|
||||
while ((xcount0 & 0xffff) >= sprite->zoomx_re)
|
||||
{
|
||||
xcount0 += sprite->zoomx_re;
|
||||
x1++;
|
||||
}
|
||||
}
|
||||
if (x2 > state->m_blit.clip_right)
|
||||
x2 = state->m_blit.clip_right;
|
||||
if (x2 > m_blit.clip_right)
|
||||
x2 = m_blit.clip_right;
|
||||
if (x1 >= x2)
|
||||
return;
|
||||
}
|
||||
@ -1018,12 +1000,12 @@ static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprit
|
||||
y2 = sprite->y;
|
||||
y1 = y2 + sprite->total_height;
|
||||
dy = -1;
|
||||
if (y2 < state->m_blit.clip_top)
|
||||
y2 = state->m_blit.clip_top;
|
||||
if (y1 > state->m_blit.clip_bottom)
|
||||
if (y2 < m_blit.clip_top)
|
||||
y2 = m_blit.clip_top;
|
||||
if (y1 > m_blit.clip_bottom)
|
||||
{
|
||||
ycount0 += (y1 - state->m_blit.clip_bottom) * sprite->zoomy_re;
|
||||
y1 = state->m_blit.clip_bottom;
|
||||
ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re;
|
||||
y1 = m_blit.clip_bottom;
|
||||
while ((ycount0 & 0xffff) >= sprite->zoomy_re)
|
||||
{
|
||||
ycount0 += sprite->zoomy_re;
|
||||
@ -1039,18 +1021,18 @@ static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprit
|
||||
y1 = sprite->y;
|
||||
y2 = y1 + sprite->total_height;
|
||||
dy = 1;
|
||||
if (y1 < state->m_blit.clip_top)
|
||||
if (y1 < m_blit.clip_top)
|
||||
{
|
||||
ycount0 += (state->m_blit.clip_top - y1) * sprite->zoomy_re;
|
||||
y1 = state->m_blit.clip_top;
|
||||
ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re;
|
||||
y1 = m_blit.clip_top;
|
||||
while ((ycount0 & 0xffff) >= sprite->zoomy_re)
|
||||
{
|
||||
ycount0 += sprite->zoomy_re;
|
||||
y1++;
|
||||
}
|
||||
}
|
||||
if (y2 > state->m_blit.clip_bottom)
|
||||
y2 = state->m_blit.clip_bottom;
|
||||
if (y2 > m_blit.clip_bottom)
|
||||
y2 = m_blit.clip_bottom;
|
||||
if (y1 >= y2)
|
||||
return;
|
||||
}
|
||||
@ -1060,11 +1042,11 @@ static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprit
|
||||
pen_t base_pen = sprite->base_pen;
|
||||
int x, y;
|
||||
UINT8 pen;
|
||||
int pitch = state->m_blit.line_offset * dy / 2;
|
||||
UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1);
|
||||
int pitchz = state->m_blit.line_offset_zbuf * dy / 2;
|
||||
UINT16 *zbf = (UINT16 *)(state->m_blit.baseaddr_zbuf + state->m_blit.line_offset_zbuf * y1);
|
||||
UINT16 pri_sp = (UINT16)(sprite - state->m_sprite) + state->m_sprite_zbuf_baseval;
|
||||
int pitch = m_blit.line_offset * dy / 2;
|
||||
UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
int pitchz = m_blit.line_offset_zbuf * dy / 2;
|
||||
UINT16 *zbf = (UINT16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
|
||||
UINT16 pri_sp = (UINT16)(sprite - m_sprite) + m_sprite_zbuf_baseval;
|
||||
int ycount = ycount0;
|
||||
|
||||
for (y = y1; y != y2; y += dy)
|
||||
@ -1101,10 +1083,9 @@ static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprit
|
||||
}
|
||||
}
|
||||
|
||||
static void do_blit_16_cave( running_machine &machine, const struct sprite_cave *sprite )
|
||||
void cave_state::do_blit_16_cave( const struct sprite_cave *sprite )
|
||||
{
|
||||
/* assumes SPRITE_LIST_RAW_DATA flag is set */
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int x1, x2, y1, y2, dx, dy;
|
||||
int xcount0 = 0, ycount0 = 0;
|
||||
|
||||
@ -1113,12 +1094,12 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
|
||||
x2 = sprite->x;
|
||||
x1 = x2 + sprite->total_width;
|
||||
dx = -1;
|
||||
if (x2 < state->m_blit.clip_left)
|
||||
x2 = state->m_blit.clip_left;
|
||||
if (x1 > state->m_blit.clip_right)
|
||||
if (x2 < m_blit.clip_left)
|
||||
x2 = m_blit.clip_left;
|
||||
if (x1 > m_blit.clip_right)
|
||||
{
|
||||
xcount0 = x1 - state->m_blit.clip_right;
|
||||
x1 = state->m_blit.clip_right;
|
||||
xcount0 = x1 - m_blit.clip_right;
|
||||
x1 = m_blit.clip_right;
|
||||
}
|
||||
if (x2 >= x1)
|
||||
return;
|
||||
@ -1129,13 +1110,13 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
|
||||
x1 = sprite->x;
|
||||
x2 = x1 + sprite->total_width;
|
||||
dx = 1;
|
||||
if (x1 < state->m_blit.clip_left)
|
||||
if (x1 < m_blit.clip_left)
|
||||
{
|
||||
xcount0 = state->m_blit.clip_left - x1;
|
||||
x1 = state->m_blit.clip_left;
|
||||
xcount0 = m_blit.clip_left - x1;
|
||||
x1 = m_blit.clip_left;
|
||||
}
|
||||
if (x2 > state->m_blit.clip_right)
|
||||
x2 = state->m_blit.clip_right;
|
||||
if (x2 > m_blit.clip_right)
|
||||
x2 = m_blit.clip_right;
|
||||
if (x1 >= x2)
|
||||
return;
|
||||
}
|
||||
@ -1144,12 +1125,12 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
|
||||
y2 = sprite->y;
|
||||
y1 = y2 + sprite->total_height;
|
||||
dy = -1;
|
||||
if (y2 < state->m_blit.clip_top)
|
||||
y2 = state->m_blit.clip_top;
|
||||
if (y1 > state->m_blit.clip_bottom)
|
||||
if (y2 < m_blit.clip_top)
|
||||
y2 = m_blit.clip_top;
|
||||
if (y1 > m_blit.clip_bottom)
|
||||
{
|
||||
ycount0 = y1 - state->m_blit.clip_bottom;
|
||||
y1 = state->m_blit.clip_bottom;
|
||||
ycount0 = y1 - m_blit.clip_bottom;
|
||||
y1 = m_blit.clip_bottom;
|
||||
}
|
||||
if (y2 >= y1)
|
||||
return;
|
||||
@ -1159,13 +1140,13 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
|
||||
y1 = sprite->y;
|
||||
y2 = y1 + sprite->total_height;
|
||||
dy = 1;
|
||||
if (y1 < state->m_blit.clip_top )
|
||||
if (y1 < m_blit.clip_top )
|
||||
{
|
||||
ycount0 = state->m_blit.clip_top - y1;
|
||||
y1 = state->m_blit.clip_top;
|
||||
ycount0 = m_blit.clip_top - y1;
|
||||
y1 = m_blit.clip_top;
|
||||
}
|
||||
if (y2 > state->m_blit.clip_bottom)
|
||||
y2 = state->m_blit.clip_bottom;
|
||||
if (y2 > m_blit.clip_bottom)
|
||||
y2 = m_blit.clip_bottom;
|
||||
if (y1 >= y2)
|
||||
return;
|
||||
}
|
||||
@ -1175,8 +1156,8 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
|
||||
pen_t base_pen = sprite->base_pen;
|
||||
int x, y;
|
||||
UINT8 pen;
|
||||
int pitch = state->m_blit.line_offset * dy / 2;
|
||||
UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1);
|
||||
int pitch = m_blit.line_offset * dy / 2;
|
||||
UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
|
||||
pen_data += sprite->line_offset * ycount0 + xcount0;
|
||||
for (y = y1; y != y2; y += dy)
|
||||
@ -1197,10 +1178,9 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
|
||||
}
|
||||
|
||||
|
||||
static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_cave *sprite )
|
||||
void cave_state::do_blit_16_cave_zb( const struct sprite_cave *sprite )
|
||||
{
|
||||
/* assumes SPRITE_LIST_RAW_DATA flag is set */
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int x1, x2, y1, y2, dx, dy;
|
||||
int xcount0 = 0, ycount0 = 0;
|
||||
|
||||
@ -1209,12 +1189,12 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
|
||||
x2 = sprite->x;
|
||||
x1 = x2 + sprite->total_width;
|
||||
dx = -1;
|
||||
if (x2 < state->m_blit.clip_left)
|
||||
x2 = state->m_blit.clip_left;
|
||||
if (x1 > state->m_blit.clip_right)
|
||||
if (x2 < m_blit.clip_left)
|
||||
x2 = m_blit.clip_left;
|
||||
if (x1 > m_blit.clip_right)
|
||||
{
|
||||
xcount0 = x1 - state->m_blit.clip_right;
|
||||
x1 = state->m_blit.clip_right;
|
||||
xcount0 = x1 - m_blit.clip_right;
|
||||
x1 = m_blit.clip_right;
|
||||
}
|
||||
if (x2 >= x1)
|
||||
return;
|
||||
@ -1225,13 +1205,13 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
|
||||
x1 = sprite->x;
|
||||
x2 = x1 + sprite->total_width;
|
||||
dx = 1;
|
||||
if (x1 < state->m_blit.clip_left)
|
||||
if (x1 < m_blit.clip_left)
|
||||
{
|
||||
xcount0 = state->m_blit.clip_left - x1;
|
||||
x1 = state->m_blit.clip_left;
|
||||
xcount0 = m_blit.clip_left - x1;
|
||||
x1 = m_blit.clip_left;
|
||||
}
|
||||
if (x2 > state->m_blit.clip_right)
|
||||
x2 = state->m_blit.clip_right;
|
||||
if (x2 > m_blit.clip_right)
|
||||
x2 = m_blit.clip_right;
|
||||
if (x1 >= x2)
|
||||
return;
|
||||
}
|
||||
@ -1240,12 +1220,12 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
|
||||
y2 = sprite->y;
|
||||
y1 = y2 + sprite->total_height;
|
||||
dy = -1;
|
||||
if (y2 < state->m_blit.clip_top)
|
||||
y2 = state->m_blit.clip_top;
|
||||
if (y1 > state->m_blit.clip_bottom)
|
||||
if (y2 < m_blit.clip_top)
|
||||
y2 = m_blit.clip_top;
|
||||
if (y1 > m_blit.clip_bottom)
|
||||
{
|
||||
ycount0 = y1 - state->m_blit.clip_bottom;
|
||||
y1 = state->m_blit.clip_bottom;
|
||||
ycount0 = y1 - m_blit.clip_bottom;
|
||||
y1 = m_blit.clip_bottom;
|
||||
}
|
||||
if (y2 >= y1)
|
||||
return;
|
||||
@ -1256,13 +1236,13 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
|
||||
y1 = sprite->y;
|
||||
y2 = y1 + sprite->total_height;
|
||||
dy = 1;
|
||||
if (y1 < state->m_blit.clip_top)
|
||||
if (y1 < m_blit.clip_top)
|
||||
{
|
||||
ycount0 = state->m_blit.clip_top - y1;
|
||||
y1 = state->m_blit.clip_top;
|
||||
ycount0 = m_blit.clip_top - y1;
|
||||
y1 = m_blit.clip_top;
|
||||
}
|
||||
if (y2 > state->m_blit.clip_bottom)
|
||||
y2 = state->m_blit.clip_bottom;
|
||||
if (y2 > m_blit.clip_bottom)
|
||||
y2 = m_blit.clip_bottom;
|
||||
if (y1 >= y2)
|
||||
return;
|
||||
}
|
||||
@ -1272,11 +1252,11 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
|
||||
pen_t base_pen = sprite->base_pen;
|
||||
int x, y;
|
||||
UINT8 pen;
|
||||
int pitch = state->m_blit.line_offset * dy / 2;
|
||||
UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1);
|
||||
int pitchz = state->m_blit.line_offset_zbuf * dy / 2;
|
||||
UINT16 *zbf = (UINT16 *)(state->m_blit.baseaddr_zbuf + state->m_blit.line_offset_zbuf * y1);
|
||||
UINT16 pri_sp = (UINT16)(sprite - state->m_sprite) + state->m_sprite_zbuf_baseval;
|
||||
int pitch = m_blit.line_offset * dy / 2;
|
||||
UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
int pitchz = m_blit.line_offset_zbuf * dy / 2;
|
||||
UINT16 *zbf = (UINT16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
|
||||
UINT16 pri_sp = (UINT16)(sprite - m_sprite) + m_sprite_zbuf_baseval;
|
||||
|
||||
pen_data += sprite->line_offset * ycount0 + xcount0;
|
||||
for (y = y1; y != y2; y += dy)
|
||||
@ -1301,48 +1281,44 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
|
||||
}
|
||||
|
||||
|
||||
static void sprite_draw_cave( running_machine &machine, int priority )
|
||||
void cave_state::sprite_draw_cave( int priority )
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int i = 0;
|
||||
while (state->m_sprite_table[priority][i])
|
||||
while (m_sprite_table[priority][i])
|
||||
{
|
||||
const struct sprite_cave *sprite = state->m_sprite_table[priority][i++];
|
||||
const struct sprite_cave *sprite = m_sprite_table[priority][i++];
|
||||
if ((sprite->tile_width == sprite->total_width) && (sprite->tile_height == sprite->total_height))
|
||||
do_blit_16_cave(machine, sprite);
|
||||
do_blit_16_cave(sprite);
|
||||
else
|
||||
do_blit_zoom16_cave(machine, sprite);
|
||||
do_blit_zoom16_cave(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sprite_draw_cave_zbuf( running_machine &machine, int priority )
|
||||
void cave_state::sprite_draw_cave_zbuf( int priority )
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int i = 0;
|
||||
while (state->m_sprite_table[priority][i])
|
||||
while (m_sprite_table[priority][i])
|
||||
{
|
||||
const struct sprite_cave *sprite = state->m_sprite_table[priority][i++];
|
||||
const struct sprite_cave *sprite = m_sprite_table[priority][i++];
|
||||
if ((sprite->tile_width == sprite->total_width) && (sprite->tile_height == sprite->total_height))
|
||||
do_blit_16_cave_zb(machine, sprite);
|
||||
do_blit_16_cave_zb(sprite);
|
||||
else
|
||||
do_blit_zoom16_cave_zb(machine, sprite);
|
||||
do_blit_zoom16_cave_zb(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sprite_draw_donpachi( running_machine &machine, int priority )
|
||||
void cave_state::sprite_draw_donpachi( int priority )
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int i = 0;
|
||||
while (state->m_sprite_table[priority][i])
|
||||
do_blit_16_cave(machine, state->m_sprite_table[priority][i++]);
|
||||
while (m_sprite_table[priority][i])
|
||||
do_blit_16_cave(m_sprite_table[priority][i++]);
|
||||
}
|
||||
|
||||
static void sprite_draw_donpachi_zbuf( running_machine &machine, int priority )
|
||||
void cave_state::sprite_draw_donpachi_zbuf( int priority )
|
||||
{
|
||||
cave_state *state = machine.driver_data<cave_state>();
|
||||
int i = 0;
|
||||
while (state->m_sprite_table[priority][i])
|
||||
do_blit_16_cave_zb(machine, state->m_sprite_table[priority][i++]);
|
||||
while (m_sprite_table[priority][i])
|
||||
do_blit_16_cave_zb(m_sprite_table[priority][i++]);
|
||||
}
|
||||
|
||||
|
||||
@ -1529,7 +1505,7 @@ UINT32 cave_state::screen_update_cave(screen_device &screen, bitmap_ind16 &bitma
|
||||
int pri, pri2, GFX;
|
||||
int layers_ctrl = -1;
|
||||
|
||||
set_pens(machine());
|
||||
set_pens();
|
||||
|
||||
m_blit.baseaddr = reinterpret_cast<UINT8 *>(bitmap.raw_pixptr(0));
|
||||
m_blit.line_offset = bitmap.rowbytes();
|
||||
@ -1622,7 +1598,7 @@ UINT32 cave_state::screen_update_cave(screen_device &screen, bitmap_ind16 &bitma
|
||||
*/
|
||||
for (pri = 0; pri <= 3; pri++) // tile / sprite priority
|
||||
{
|
||||
if (layers_ctrl & (1 << (pri + 16))) (*m_sprite_draw)(screen.machine(), pri);
|
||||
if (layers_ctrl & (1 << (pri + 16))) (this->*m_sprite_draw)(pri);
|
||||
|
||||
for (pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer
|
||||
{
|
||||
@ -1646,7 +1622,7 @@ void cave_state::cave_get_sprite_info()
|
||||
if (machine().video().skip_this_frame() == 0)
|
||||
{
|
||||
m_spriteram_bank = m_spriteram_bank_delay;
|
||||
(*m_get_sprite_info)(machine());
|
||||
(this->*m_get_sprite_info)();
|
||||
}
|
||||
m_spriteram_bank_delay = m_videoregs[4] & 1;
|
||||
}
|
||||
@ -1655,7 +1631,7 @@ void cave_state::cave_get_sprite_info()
|
||||
if (machine().video().skip_this_frame() == 0)
|
||||
{
|
||||
m_spriteram_bank = m_videoregs[4] & 1;
|
||||
(*m_get_sprite_info)(machine());
|
||||
(this->*m_get_sprite_info)();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user