Cave cleanup

This commit is contained in:
Aaron Giles 2013-08-06 04:31:30 +00:00
parent cb513fef5b
commit bcd4b2f20a
2 changed files with 280 additions and 288 deletions

View File

@ -62,8 +62,8 @@ public:
} m_blit; } m_blit;
void (*m_get_sprite_info)(running_machine &machine); void (cave_state::*m_get_sprite_info)();
void (*m_sprite_draw)(running_machine &machine, int priority); void (cave_state::*m_sprite_draw)(int priority);
tilemap_t *m_tilemap[4]; tilemap_t *m_tilemap[4];
int m_tiledim[4]; int m_tiledim[4];
@ -213,4 +213,20 @@ public:
private: private:
inline void get_tile_info( tile_data &tileinfo, int tile_index, int GFX ); 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 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 );
}; };

View File

@ -57,11 +57,6 @@ Note: if MAME_DEBUG is defined, pressing:
#define SWAP(X,Y) { int temp = X; X = Y; Y = temp; } #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; 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)); 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 = m_vram[GFX];
UINT16 *VRAM = state->m_vram[GFX]; tilemap_t *TILEMAP = m_tilemap[GFX];
tilemap_t *TILEMAP = state->m_tilemap[GFX];
if ((VRAM[offset] & mem_mask) == (data & mem_mask)) if ((VRAM[offset] & mem_mask) == (data & mem_mask))
return; 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 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 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. */ 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 = m_vram[GFX];
UINT16 *VRAM = state->m_vram[GFX]; tilemap_t *TILEMAP = m_tilemap[GFX];
tilemap_t *TILEMAP = state->m_tilemap[GFX];
offset %= 0x4000 / 2; offset %= 0x4000 / 2;
if ((VRAM[offset] & mem_mask) == (data & mem_mask)) 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; m_tiledim[0] = 0;
state->m_tilemap[1] = 0; m_tiledim[1] = 0;
state->m_tilemap[2] = 0; m_tiledim[2] = 0;
state->m_tilemap[3] = 0; m_tiledim[3] = 0;
state->m_tiledim[0] = 0; m_old_tiledim[0] = 0;
state->m_tiledim[1] = 0; m_old_tiledim[1] = 0;
state->m_tiledim[2] = 0; m_old_tiledim[2] = 0;
state->m_tiledim[3] = 0; m_old_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;
assert((num >= 1) && (num <= 4)); assert((num >= 1) && (num <= 4));
switch (num) switch (num)
{ {
case 4: 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); 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);
state->m_tilemap[3]->set_transparent_pen(0); m_tilemap[3]->set_transparent_pen(0);
state->m_tilemap[3]->set_scroll_rows(1); m_tilemap[3]->set_scroll_rows(1);
state->m_tilemap[3]->set_scroll_cols(1); m_tilemap[3]->set_scroll_cols(1);
state->save_item(NAME(state->m_tiledim[3])); save_item(NAME(m_tiledim[3]));
state->save_item(NAME(state->m_old_tiledim[3])); save_item(NAME(m_old_tiledim[3]));
case 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); 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);
state->m_tilemap[2]->set_transparent_pen(0); m_tilemap[2]->set_transparent_pen(0);
state->m_tilemap[2]->set_scroll_rows(1); m_tilemap[2]->set_scroll_rows(1);
state->m_tilemap[2]->set_scroll_cols(1); m_tilemap[2]->set_scroll_cols(1);
state->save_item(NAME(state->m_tiledim[2])); save_item(NAME(m_tiledim[2]));
state->save_item(NAME(state->m_old_tiledim[2])); save_item(NAME(m_old_tiledim[2]));
case 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); 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);
state->m_tilemap[1]->set_transparent_pen(0); m_tilemap[1]->set_transparent_pen(0);
state->m_tilemap[1]->set_scroll_rows(1); m_tilemap[1]->set_scroll_rows(1);
state->m_tilemap[1]->set_scroll_cols(1); m_tilemap[1]->set_scroll_cols(1);
state->save_item(NAME(state->m_tiledim[1])); save_item(NAME(m_tiledim[1]));
state->save_item(NAME(state->m_old_tiledim[1])); save_item(NAME(m_old_tiledim[1]));
case 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); 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);
state->m_tilemap[0]->set_transparent_pen(0); m_tilemap[0]->set_transparent_pen(0);
state->m_tilemap[0]->set_scroll_rows(1); m_tilemap[0]->set_scroll_rows(1);
state->m_tilemap[0]->set_scroll_cols(1); m_tilemap[0]->set_scroll_cols(1);
state->save_item(NAME(state->m_tiledim[0])); save_item(NAME(m_tiledim[0]));
state->save_item(NAME(state->m_old_tiledim[0])); save_item(NAME(m_old_tiledim[0]));
break; break;
} }
sprite_init_cave(machine); sprite_init_cave();
state->m_layers_offs_x = 0x13; m_layers_offs_x = 0x13;
state->m_layers_offs_y = -0x12; m_layers_offs_y = -0x12;
state->m_row_effect_offs_n = -1; m_row_effect_offs_n = -1;
state->m_row_effect_offs_f = 1; m_row_effect_offs_f = 1;
state->m_background_color = machine.config().m_gfxdecodeinfo[0].color_codes_start + m_background_color = machine().config().m_gfxdecodeinfo[0].color_codes_start +
(machine.config().m_gfxdecodeinfo[0].total_color_codes - 1) * (machine().config().m_gfxdecodeinfo[0].total_color_codes - 1) *
machine.gfx[0]->granularity(); machine().gfx[0]->granularity();
switch (state->m_kludge) switch (m_kludge)
{ {
case 1: /* sailormn */ case 1: /* sailormn */
state->m_row_effect_offs_n = -1; m_row_effect_offs_n = -1;
state->m_row_effect_offs_f = -1; m_row_effect_offs_f = -1;
break; break;
case 2: /* uopoko dfeveron */ case 2: /* uopoko dfeveron */
state->m_background_color = 0x3f00; m_background_color = 0x3f00;
break; break;
case 4: /* pwrinst2 */ case 4: /* pwrinst2 */
state->m_background_color = 0x7f00; m_background_color = 0x7f00;
state->m_layers_offs_y++; m_layers_offs_y++;
break; break;
} }
} }
VIDEO_START_MEMBER(cave_state,cave_1_layer){ cave_vh_start(machine(), 1); } VIDEO_START_MEMBER(cave_state,cave_1_layer){ cave_vh_start(1); }
VIDEO_START_MEMBER(cave_state,cave_2_layers){ cave_vh_start(machine(), 2); } VIDEO_START_MEMBER(cave_state,cave_2_layers){ cave_vh_start(2); }
VIDEO_START_MEMBER(cave_state,cave_3_layers){ cave_vh_start(machine(), 3); } VIDEO_START_MEMBER(cave_state,cave_3_layers){ cave_vh_start(3); }
VIDEO_START_MEMBER(cave_state,cave_4_layers){ cave_vh_start(machine(), 4); } VIDEO_START_MEMBER(cave_state,cave_4_layers){ cave_vh_start(4); }
VIDEO_START_MEMBER(cave_state,sailormn_3_layers) 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 */ /* 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 ); 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; pen_t base_pal = 0;
const UINT8 *base_gfx = state->memregion("sprites")->base(); const UINT8 *base_gfx = memregion("sprites")->base();
int code_max = state->memregion("sprites")->bytes() / (16*16); int code_max = memregion("sprites")->bytes() / (16*16);
UINT16 *source; UINT16 *source;
UINT16 *finish; 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_flipx = m_videoregs[0] & 0x8000;
int glob_flipy = state->m_videoregs[1] & 0x8000; int glob_flipy = m_videoregs[1] & 0x8000;
int max_x = machine.primary_screen->width(); int max_x = m_screen->width();
int max_y = machine.primary_screen->height(); 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 (m_videoregs[4] & 0x02)
if (state->m_spriteram_2) if (m_spriteram_2)
source = state->m_spriteram_2 + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank; 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) 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 x, y, attr, code, zoomx, zoomy, size, flipx, flipy;
int total_width_f, total_height_f; 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; x = (source[0] & 0x3ff) << 8;
y = (source[1] & 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; sprite->ycount0 = sprite->zoomy_re - 1;
} }
if (state->m_spritetype[0] == 2) if (m_spritetype[0] == 2)
{ {
x >>= 8; x >>= 8;
y >>= 8; y >>= 8;
@ -626,34 +615,33 @@ static void get_sprite_info_cave( running_machine &machine )
sprite++; 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; pen_t base_pal = 0;
const UINT8 *base_gfx = state->memregion("sprites")->base(); const UINT8 *base_gfx = memregion("sprites")->base();
int code_max = state->memregion("sprites")->bytes() / (16*16); int code_max = memregion("sprites")->bytes() / (16*16);
UINT16 *source; UINT16 *source;
UINT16 *finish; 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_flipx = m_videoregs[0] & 0x8000;
int glob_flipy = state->m_videoregs[1] & 0x8000; int glob_flipy = m_videoregs[1] & 0x8000;
int max_x = machine.primary_screen->width(); int max_x = m_screen->width();
int max_y = machine.primary_screen->height(); 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 (m_videoregs[4] & 0x02)
if (state->m_spriteram_2) if (m_spriteram_2)
source = state->m_spriteram_2 + ((state->m_spriteram.bytes() / 2) / 2) * state->m_spriteram_bank; 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) for (; source < finish; source += 8)
{ {
@ -663,7 +651,7 @@ static void get_sprite_info_donpachi( running_machine &machine )
code = source[1] + ((attr & 3) << 16); code = source[1] + ((attr & 3) << 16);
x = source[2] & 0x3ff; x = source[2] & 0x3ff;
if (state->m_spritetype[0] == 3) /* pwrinst2 */ if (m_spritetype[0] == 3) /* pwrinst2 */
y = (source[3] + 1) & 0x3ff; y = (source[3] + 1) & 0x3ff;
else else
y = source[3] & 0x3ff; y = source[3] & 0x3ff;
@ -687,7 +675,7 @@ static void get_sprite_info_donpachi( running_machine &machine )
flipx = attr & 0x0008; flipx = attr & 0x0008;
flipy = attr & 0x0004; flipy = attr & 0x0004;
if (state->m_spritetype[0] == 3) /* pwrinst2 */ if (m_spritetype[0] == 3) /* pwrinst2 */
{ {
sprite->priority = ((attr & 0x0010) >> 4) + 2; sprite->priority = ((attr & 0x0010) >> 4) + 2;
sprite->base_pen = base_pal + (attr & 0x3f00) + 0x4000 * ((attr & 0x0020) >> 5); 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++; 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 (m_spritetype[0] == 0 || m_spritetype[0] == 2) // most of the games
if (state->m_spritetype[0] == 0 || state->m_spritetype[0] == 2) // most of the games
{ {
state->m_get_sprite_info = get_sprite_info_cave; m_get_sprite_info = &cave_state::get_sprite_info_cave;
state->m_spritetype[1] = CAVE_SPRITETYPE_ZOOM; m_spritetype[1] = CAVE_SPRITETYPE_ZOOM;
} }
else // donpachi ddonpach else // donpachi ddonpach
{ {
state->m_get_sprite_info = get_sprite_info_donpachi; m_get_sprite_info = &cave_state::get_sprite_info_donpachi;
state->m_spritetype[1] = 0; m_spritetype[1] = 0;
} }
state->m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM; m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM;
machine.primary_screen->register_screen_bitmap(state->m_sprite_zbuf); m_screen->register_screen_bitmap(m_sprite_zbuf);
state->m_num_sprites = state->m_spriteram.bytes() / 0x10 / 2; m_num_sprites = m_spriteram.bytes() / 0x10 / 2;
state->m_sprite = auto_alloc_array_clear(machine, struct sprite_cave, state->m_num_sprites); m_sprite = auto_alloc_array_clear(machine(), struct sprite_cave, m_num_sprites);
memset(state->m_sprite_table, 0, sizeof(state->m_sprite_table)); memset(m_sprite_table, 0, sizeof(m_sprite_table));
state->m_sprite_draw = sprite_draw_donpachi; m_sprite_draw = &cave_state::sprite_draw_donpachi;
state->save_item(NAME(state->m_sprite_zbuf)); save_item(NAME(m_sprite_zbuf));
state->save_item(NAME(state->m_sprite_zbuf_baseval)); save_item(NAME(m_sprite_zbuf_baseval));
state->save_item(NAME(state->m_num_sprites)); save_item(NAME(m_num_sprites));
state->save_item(NAME(state->m_spriteram_bank)); save_item(NAME(m_spriteram_bank));
state->save_item(NAME(state->m_spriteram_bank_delay)); save_item(NAME(m_spriteram_bank_delay));
state->save_item(NAME(state->m_blit.clip_left)); save_item(NAME(m_blit.clip_left));
state->save_item(NAME(state->m_blit.clip_right)); save_item(NAME(m_blit.clip_right));
state->save_item(NAME(state->m_blit.clip_top)); save_item(NAME(m_blit.clip_top));
state->save_item(NAME(state->m_blit.clip_bottom)); 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 */ { /* set clip */
int left = clip.min_x; int left = clip.min_x;
int top = clip.min_y; int top = clip.min_y;
int right = clip.max_x + 1; int right = clip.max_x + 1;
int bottom = clip.max_y + 1; int bottom = clip.max_y + 1;
state->m_blit.clip_left = left; m_blit.clip_left = left;
state->m_blit.clip_top = top; m_blit.clip_top = top;
state->m_blit.clip_right = right; m_blit.clip_right = right;
state->m_blit.clip_bottom = bottom; m_blit.clip_bottom = bottom;
} }
{ /* check priority & sprite type */ { /* check priority & sprite type */
struct sprite_cave *sprite = state->m_sprite; struct sprite_cave *sprite = m_sprite;
const struct sprite_cave *finish = &sprite[state->m_num_sprites]; const struct sprite_cave *finish = &sprite[m_num_sprites];
int i[4] = {0,0,0,0}; int i[4] = {0,0,0,0};
int priority_check = 0; int priority_check = 0;
int spritetype = state->m_spritetype[1]; int spritetype = m_spritetype[1];
const rectangle &visarea = screen.visible_area(); const rectangle &visarea = screen.visible_area();
while (sprite < finish) while (sprite < finish)
{ {
if (sprite->x + sprite->total_width > state->m_blit.clip_left && sprite->x < state->m_blit.clip_right && if (sprite->x + sprite->total_width > m_blit.clip_left && sprite->x < m_blit.clip_right &&
sprite->y + sprite->total_height > state->m_blit.clip_top && sprite->y < state->m_blit.clip_bottom ) 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)) if(!(spritetype & CAVE_SPRITETYPE_ZBUF))
{ {
@ -796,46 +780,45 @@ static void cave_sprite_check( screen_device &screen, const rectangle &clip )
sprite++; sprite++;
} }
state->m_sprite_table[0][i[0]] = 0; m_sprite_table[0][i[0]] = 0;
state->m_sprite_table[1][i[1]] = 0; m_sprite_table[1][i[1]] = 0;
state->m_sprite_table[2][i[2]] = 0; m_sprite_table[2][i[2]] = 0;
state->m_sprite_table[3][i[3]] = 0; m_sprite_table[3][i[3]] = 0;
switch (spritetype) switch (spritetype)
{ {
case CAVE_SPRITETYPE_ZOOM: case CAVE_SPRITETYPE_ZOOM:
state->m_sprite_draw = sprite_draw_cave; m_sprite_draw = &cave_state::sprite_draw_cave;
break; break;
case CAVE_SPRITETYPE_ZOOM | CAVE_SPRITETYPE_ZBUF: 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 (clip.min_y == visarea.min_y)
{ {
if(!(state->m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) if(!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
state->m_sprite_zbuf.fill(0, visarea); m_sprite_zbuf.fill(0, visarea);
} }
break; break;
case CAVE_SPRITETYPE_ZBUF: 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 (clip.min_y == visarea.min_y)
{ {
if(!(state->m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) if(!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
state->m_sprite_zbuf.fill(0, visarea); m_sprite_zbuf.fill(0, visarea);
} }
break; break;
default: default:
case 0: 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 */ /* assumes SPRITE_LIST_RAW_DATA flag is set */
cave_state *state = machine.driver_data<cave_state>();
int x1, x2, y1, y2, dx, dy; int x1, x2, y1, y2, dx, dy;
int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0; 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; x2 = sprite->x;
x1 = x2 + sprite->total_width; x1 = x2 + sprite->total_width;
dx = -1; dx = -1;
if (x2 < state->m_blit.clip_left) if (x2 < m_blit.clip_left)
x2 = state->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; xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re;
x1 = state->m_blit.clip_right; x1 = m_blit.clip_right;
while ((xcount0 & 0xffff) >= sprite->zoomx_re) while ((xcount0 & 0xffff) >= sprite->zoomx_re)
{ {
xcount0 += 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; x1 = sprite->x;
x2 = x1 + sprite->total_width; x2 = x1 + sprite->total_width;
dx = 1; 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; xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re;
x1 = state->m_blit.clip_left; x1 = m_blit.clip_left;
while ((xcount0 & 0xffff) >= sprite->zoomx_re) while ((xcount0 & 0xffff) >= sprite->zoomx_re)
{ {
xcount0 += sprite->zoomx_re; xcount0 += sprite->zoomx_re;
x1++; x1++;
} }
} }
if (x2 > state->m_blit.clip_right) if (x2 > m_blit.clip_right)
x2 = state->m_blit.clip_right; x2 = m_blit.clip_right;
if (x1 >= x2) if (x1 >= x2)
return; return;
} }
@ -888,12 +871,12 @@ static void do_blit_zoom16_cave( running_machine &machine, const struct sprite_c
y2 = sprite->y; y2 = sprite->y;
y1 = y2 + sprite->total_height; y1 = y2 + sprite->total_height;
dy = -1; dy = -1;
if (y2 < state->m_blit.clip_top) if (y2 < m_blit.clip_top)
y2 = state->m_blit.clip_top; y2 = m_blit.clip_top;
if (y1 > state->m_blit.clip_bottom) if (y1 > m_blit.clip_bottom)
{ {
ycount0 += (y1 - state->m_blit.clip_bottom) * sprite->zoomy_re; ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re;
y1 = state->m_blit.clip_bottom; y1 = m_blit.clip_bottom;
while ((ycount0 & 0xffff) >= sprite->zoomy_re) while ((ycount0 & 0xffff) >= sprite->zoomy_re)
{ {
ycount0 += 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; y1 = sprite->y;
y2 = y1 + sprite->total_height; y2 = y1 + sprite->total_height;
dy = 1; 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; ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re;
y1 = state->m_blit.clip_top; y1 = m_blit.clip_top;
while ((ycount0 & 0xffff) >= sprite->zoomy_re) while ((ycount0 & 0xffff) >= sprite->zoomy_re)
{ {
ycount0 += sprite->zoomy_re; ycount0 += sprite->zoomy_re;
y1++; y1++;
} }
} }
if (y2 > state->m_blit.clip_bottom ) if (y2 > m_blit.clip_bottom )
y2 = state->m_blit.clip_bottom; y2 = m_blit.clip_bottom;
if (y1 >= y2) if (y1 >= y2)
return; 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; pen_t base_pen = sprite->base_pen;
int x, y; int x, y;
UINT8 pen; UINT8 pen;
int pitch = state->m_blit.line_offset * dy / 2; int pitch = m_blit.line_offset * dy / 2;
UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1); UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1);
int ycount = ycount0; int ycount = ycount0;
for (y = y1; y != y2; y += dy) 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 */ /* assumes SPRITE_LIST_RAW_DATA flag is set */
cave_state *state = machine.driver_data<cave_state>();
int x1, x2, y1, y2, dx, dy; int x1, x2, y1, y2, dx, dy;
int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0; 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; x2 = sprite->x;
x1 = x2 + sprite->total_width; x1 = x2 + sprite->total_width;
dx = -1; dx = -1;
if (x2 < state->m_blit.clip_left) if (x2 < m_blit.clip_left)
x2 = state->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; xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re;
x1 = state->m_blit.clip_right; x1 = m_blit.clip_right;
while ((xcount0 & 0xffff) >= sprite->zoomx_re) while ((xcount0 & 0xffff) >= sprite->zoomx_re)
{ {
xcount0 += 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; x1 = sprite->x;
x2 = x1 + sprite->total_width; x2 = x1 + sprite->total_width;
dx = 1; 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; xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re;
x1 = state->m_blit.clip_left; x1 = m_blit.clip_left;
while ((xcount0 & 0xffff) >= sprite->zoomx_re) while ((xcount0 & 0xffff) >= sprite->zoomx_re)
{ {
xcount0 += sprite->zoomx_re; xcount0 += sprite->zoomx_re;
x1++; x1++;
} }
} }
if (x2 > state->m_blit.clip_right) if (x2 > m_blit.clip_right)
x2 = state->m_blit.clip_right; x2 = m_blit.clip_right;
if (x1 >= x2) if (x1 >= x2)
return; return;
} }
@ -1018,12 +1000,12 @@ static void do_blit_zoom16_cave_zb( running_machine &machine, const struct sprit
y2 = sprite->y; y2 = sprite->y;
y1 = y2 + sprite->total_height; y1 = y2 + sprite->total_height;
dy = -1; dy = -1;
if (y2 < state->m_blit.clip_top) if (y2 < m_blit.clip_top)
y2 = state->m_blit.clip_top; y2 = m_blit.clip_top;
if (y1 > state->m_blit.clip_bottom) if (y1 > m_blit.clip_bottom)
{ {
ycount0 += (y1 - state->m_blit.clip_bottom) * sprite->zoomy_re; ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re;
y1 = state->m_blit.clip_bottom; y1 = m_blit.clip_bottom;
while ((ycount0 & 0xffff) >= sprite->zoomy_re) while ((ycount0 & 0xffff) >= sprite->zoomy_re)
{ {
ycount0 += 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; y1 = sprite->y;
y2 = y1 + sprite->total_height; y2 = y1 + sprite->total_height;
dy = 1; 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; ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re;
y1 = state->m_blit.clip_top; y1 = m_blit.clip_top;
while ((ycount0 & 0xffff) >= sprite->zoomy_re) while ((ycount0 & 0xffff) >= sprite->zoomy_re)
{ {
ycount0 += sprite->zoomy_re; ycount0 += sprite->zoomy_re;
y1++; y1++;
} }
} }
if (y2 > state->m_blit.clip_bottom) if (y2 > m_blit.clip_bottom)
y2 = state->m_blit.clip_bottom; y2 = m_blit.clip_bottom;
if (y1 >= y2) if (y1 >= y2)
return; 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; pen_t base_pen = sprite->base_pen;
int x, y; int x, y;
UINT8 pen; UINT8 pen;
int pitch = state->m_blit.line_offset * dy / 2; int pitch = m_blit.line_offset * dy / 2;
UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1); UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1);
int pitchz = state->m_blit.line_offset_zbuf * dy / 2; int pitchz = m_blit.line_offset_zbuf * dy / 2;
UINT16 *zbf = (UINT16 *)(state->m_blit.baseaddr_zbuf + state->m_blit.line_offset_zbuf * y1); UINT16 *zbf = (UINT16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
UINT16 pri_sp = (UINT16)(sprite - state->m_sprite) + state->m_sprite_zbuf_baseval; UINT16 pri_sp = (UINT16)(sprite - m_sprite) + m_sprite_zbuf_baseval;
int ycount = ycount0; int ycount = ycount0;
for (y = y1; y != y2; y += dy) 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 */ /* assumes SPRITE_LIST_RAW_DATA flag is set */
cave_state *state = machine.driver_data<cave_state>();
int x1, x2, y1, y2, dx, dy; int x1, x2, y1, y2, dx, dy;
int xcount0 = 0, ycount0 = 0; 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; x2 = sprite->x;
x1 = x2 + sprite->total_width; x1 = x2 + sprite->total_width;
dx = -1; dx = -1;
if (x2 < state->m_blit.clip_left) if (x2 < m_blit.clip_left)
x2 = state->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; xcount0 = x1 - m_blit.clip_right;
x1 = state->m_blit.clip_right; x1 = m_blit.clip_right;
} }
if (x2 >= x1) if (x2 >= x1)
return; return;
@ -1129,13 +1110,13 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
x1 = sprite->x; x1 = sprite->x;
x2 = x1 + sprite->total_width; x2 = x1 + sprite->total_width;
dx = 1; dx = 1;
if (x1 < state->m_blit.clip_left) if (x1 < m_blit.clip_left)
{ {
xcount0 = state->m_blit.clip_left - x1; xcount0 = m_blit.clip_left - x1;
x1 = state->m_blit.clip_left; x1 = m_blit.clip_left;
} }
if (x2 > state->m_blit.clip_right) if (x2 > m_blit.clip_right)
x2 = state->m_blit.clip_right; x2 = m_blit.clip_right;
if (x1 >= x2) if (x1 >= x2)
return; return;
} }
@ -1144,12 +1125,12 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
y2 = sprite->y; y2 = sprite->y;
y1 = y2 + sprite->total_height; y1 = y2 + sprite->total_height;
dy = -1; dy = -1;
if (y2 < state->m_blit.clip_top) if (y2 < m_blit.clip_top)
y2 = state->m_blit.clip_top; y2 = m_blit.clip_top;
if (y1 > state->m_blit.clip_bottom) if (y1 > m_blit.clip_bottom)
{ {
ycount0 = y1 - state->m_blit.clip_bottom; ycount0 = y1 - m_blit.clip_bottom;
y1 = state->m_blit.clip_bottom; y1 = m_blit.clip_bottom;
} }
if (y2 >= y1) if (y2 >= y1)
return; return;
@ -1159,13 +1140,13 @@ static void do_blit_16_cave( running_machine &machine, const struct sprite_cave
y1 = sprite->y; y1 = sprite->y;
y2 = y1 + sprite->total_height; y2 = y1 + sprite->total_height;
dy = 1; dy = 1;
if (y1 < state->m_blit.clip_top ) if (y1 < m_blit.clip_top )
{ {
ycount0 = state->m_blit.clip_top - y1; ycount0 = m_blit.clip_top - y1;
y1 = state->m_blit.clip_top; y1 = m_blit.clip_top;
} }
if (y2 > state->m_blit.clip_bottom) if (y2 > m_blit.clip_bottom)
y2 = state->m_blit.clip_bottom; y2 = m_blit.clip_bottom;
if (y1 >= y2) if (y1 >= y2)
return; 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; pen_t base_pen = sprite->base_pen;
int x, y; int x, y;
UINT8 pen; UINT8 pen;
int pitch = state->m_blit.line_offset * dy / 2; int pitch = m_blit.line_offset * dy / 2;
UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1); UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1);
pen_data += sprite->line_offset * ycount0 + xcount0; pen_data += sprite->line_offset * ycount0 + xcount0;
for (y = y1; y != y2; y += dy) 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 */ /* assumes SPRITE_LIST_RAW_DATA flag is set */
cave_state *state = machine.driver_data<cave_state>();
int x1, x2, y1, y2, dx, dy; int x1, x2, y1, y2, dx, dy;
int xcount0 = 0, ycount0 = 0; 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; x2 = sprite->x;
x1 = x2 + sprite->total_width; x1 = x2 + sprite->total_width;
dx = -1; dx = -1;
if (x2 < state->m_blit.clip_left) if (x2 < m_blit.clip_left)
x2 = state->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; xcount0 = x1 - m_blit.clip_right;
x1 = state->m_blit.clip_right; x1 = m_blit.clip_right;
} }
if (x2 >= x1) if (x2 >= x1)
return; return;
@ -1225,13 +1205,13 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
x1 = sprite->x; x1 = sprite->x;
x2 = x1 + sprite->total_width; x2 = x1 + sprite->total_width;
dx = 1; dx = 1;
if (x1 < state->m_blit.clip_left) if (x1 < m_blit.clip_left)
{ {
xcount0 = state->m_blit.clip_left - x1; xcount0 = m_blit.clip_left - x1;
x1 = state->m_blit.clip_left; x1 = m_blit.clip_left;
} }
if (x2 > state->m_blit.clip_right) if (x2 > m_blit.clip_right)
x2 = state->m_blit.clip_right; x2 = m_blit.clip_right;
if (x1 >= x2) if (x1 >= x2)
return; return;
} }
@ -1240,12 +1220,12 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
y2 = sprite->y; y2 = sprite->y;
y1 = y2 + sprite->total_height; y1 = y2 + sprite->total_height;
dy = -1; dy = -1;
if (y2 < state->m_blit.clip_top) if (y2 < m_blit.clip_top)
y2 = state->m_blit.clip_top; y2 = m_blit.clip_top;
if (y1 > state->m_blit.clip_bottom) if (y1 > m_blit.clip_bottom)
{ {
ycount0 = y1 - state->m_blit.clip_bottom; ycount0 = y1 - m_blit.clip_bottom;
y1 = state->m_blit.clip_bottom; y1 = m_blit.clip_bottom;
} }
if (y2 >= y1) if (y2 >= y1)
return; return;
@ -1256,13 +1236,13 @@ static void do_blit_16_cave_zb( running_machine &machine, const struct sprite_c
y1 = sprite->y; y1 = sprite->y;
y2 = y1 + sprite->total_height; y2 = y1 + sprite->total_height;
dy = 1; dy = 1;
if (y1 < state->m_blit.clip_top) if (y1 < m_blit.clip_top)
{ {
ycount0 = state->m_blit.clip_top - y1; ycount0 = m_blit.clip_top - y1;
y1 = state->m_blit.clip_top; y1 = m_blit.clip_top;
} }
if (y2 > state->m_blit.clip_bottom) if (y2 > m_blit.clip_bottom)
y2 = state->m_blit.clip_bottom; y2 = m_blit.clip_bottom;
if (y1 >= y2) if (y1 >= y2)
return; 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; pen_t base_pen = sprite->base_pen;
int x, y; int x, y;
UINT8 pen; UINT8 pen;
int pitch = state->m_blit.line_offset * dy / 2; int pitch = m_blit.line_offset * dy / 2;
UINT16 *dest = (UINT16 *)(state->m_blit.baseaddr + state->m_blit.line_offset * y1); UINT16 *dest = (UINT16 *)(m_blit.baseaddr + m_blit.line_offset * y1);
int pitchz = state->m_blit.line_offset_zbuf * dy / 2; int pitchz = m_blit.line_offset_zbuf * dy / 2;
UINT16 *zbf = (UINT16 *)(state->m_blit.baseaddr_zbuf + state->m_blit.line_offset_zbuf * y1); UINT16 *zbf = (UINT16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
UINT16 pri_sp = (UINT16)(sprite - state->m_sprite) + state->m_sprite_zbuf_baseval; UINT16 pri_sp = (UINT16)(sprite - m_sprite) + m_sprite_zbuf_baseval;
pen_data += sprite->line_offset * ycount0 + xcount0; pen_data += sprite->line_offset * ycount0 + xcount0;
for (y = y1; y != y2; y += dy) 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; 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)) 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 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; 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)) 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 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; int i = 0;
while (state->m_sprite_table[priority][i]) while (m_sprite_table[priority][i])
do_blit_16_cave(machine, state->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; int i = 0;
while (state->m_sprite_table[priority][i]) while (m_sprite_table[priority][i])
do_blit_16_cave_zb(machine, state->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 pri, pri2, GFX;
int layers_ctrl = -1; int layers_ctrl = -1;
set_pens(machine()); set_pens();
m_blit.baseaddr = reinterpret_cast<UINT8 *>(bitmap.raw_pixptr(0)); m_blit.baseaddr = reinterpret_cast<UINT8 *>(bitmap.raw_pixptr(0));
m_blit.line_offset = bitmap.rowbytes(); 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 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 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) if (machine().video().skip_this_frame() == 0)
{ {
m_spriteram_bank = m_spriteram_bank_delay; 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; 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) if (machine().video().skip_this_frame() == 0)
{ {
m_spriteram_bank = m_videoregs[4] & 1; m_spriteram_bank = m_videoregs[4] & 1;
(*m_get_sprite_info)(machine()); (this->*m_get_sprite_info)();
} }
} }
} }