cave.cpp : Updates

Simplify handlers, Use common interface for palette, Use seperated gfxdecode, palette, screen finder, bitmap for ppsatan each screen, Move sprite granularity into video_start, Allow save state for sailormn 3th tilemap, Reduce runtime tag lookups, Unnecessary lines, Fix debugger issue, Fix spacings, Use shorter / correct type values, Add notes
This commit is contained in:
cam900 2019-05-15 19:06:57 +09:00
parent 85f717190c
commit 7507ca4ea2
3 changed files with 776 additions and 873 deletions

File diff suppressed because it is too large Load Diff

View File

@ -27,7 +27,9 @@ public:
, m_vram(*this, "vram.%u", 0) , m_vram(*this, "vram.%u", 0)
, m_vctrl(*this, "vctrl.%u", 0) , m_vctrl(*this, "vctrl.%u", 0)
, m_spriteram(*this, "spriteram.%u", 0) , m_spriteram(*this, "spriteram.%u", 0)
, m_paletteram(*this, "paletteram.%u", 0) , m_io_in0(*this, "IN0")
, m_touch_x(*this, "TOUCH%u_X", 1U)
, m_touch_y(*this, "TOUCH%u_Y", 1U)
, m_spriteregion(*this, "sprites%u", 0) , m_spriteregion(*this, "sprites%u", 0)
, m_tileregion(*this, "layer%u", 0) , m_tileregion(*this, "layer%u", 0)
, m_okiregion(*this, "oki%u", 1) , m_okiregion(*this, "oki%u", 1)
@ -42,9 +44,9 @@ public:
, m_int_timer_left(*this, "int_timer_left") , m_int_timer_left(*this, "int_timer_left")
, m_int_timer_right(*this, "int_timer_right") , m_int_timer_right(*this, "int_timer_right")
, m_eeprom(*this, "eeprom") , m_eeprom(*this, "eeprom")
, m_gfxdecode(*this, "gfxdecode") , m_gfxdecode(*this, "gfxdecode.%u", 0U)
, m_screen(*this, "screen") , m_screen(*this, "screen.%u", 0U)
, m_palette(*this, "palette") , m_palette(*this, "palette.%u", 0U)
, m_soundlatch(*this, "soundlatch") , m_soundlatch(*this, "soundlatch")
, m_startup(*this, "startup") , m_startup(*this, "startup")
, m_led_outputs(*this, "led%u", 0U) , m_led_outputs(*this, "led%u", 0U)
@ -105,46 +107,47 @@ private:
u16 irq_cause_r(offs_t offset); u16 irq_cause_r(offs_t offset);
u8 soundflags_r(); u8 soundflags_r();
DECLARE_READ16_MEMBER(soundflags_ack_r); u16 soundflags_ack_r();
DECLARE_WRITE16_MEMBER(sound_cmd_w); void sound_cmd_w(u16 data);
DECLARE_READ8_MEMBER(soundlatch_lo_r); u8 soundlatch_lo_r();
DECLARE_READ8_MEMBER(soundlatch_hi_r); u8 soundlatch_hi_r();
DECLARE_READ16_MEMBER(soundlatch_ack_r); u16 soundlatch_ack_r();
DECLARE_WRITE8_MEMBER(soundlatch_ack_w); void soundlatch_ack_w(u8 data);
void gaia_coin_w(u8 data); void gaia_coin_w(u8 data);
DECLARE_READ16_MEMBER(donpachi_videoregs_r); u16 donpachi_videoregs_r(offs_t offset);
DECLARE_WRITE16_MEMBER(korokoro_leds_w); void korokoro_leds_w(offs_t offset, u16 data, u16 mem_mask);
template<int Chip> DECLARE_WRITE16_MEMBER(pwrinst2_vctrl_w); template<int Chip> void pwrinst2_vctrl_w(offs_t offset, u16 data, u16 mem_mask);
DECLARE_READ16_MEMBER(sailormn_input0_r); u16 sailormn_input0_r();
void tjumpman_leds_w(u8 data); void tjumpman_leds_w(u8 data);
void pacslot_leds_w(u8 data); void pacslot_leds_w(u8 data);
template<int Mask> void z80_rombank_w(u8 data); template<int Mask> void z80_rombank_w(u8 data);
template<int Mask> void oki1_bank_w(u8 data); template<int Mask> void oki1_bank_w(u8 data);
template<int Mask> void oki2_bank_w(u8 data); template<int Mask> void oki2_bank_w(u8 data);
template<int Chip> DECLARE_WRITE16_MEMBER(vram_w); template<int Chip> void vram_w(offs_t offset, u16 data, u16 mem_mask);
template<int Chip> DECLARE_WRITE16_MEMBER(vram_8x8_w); template<int Chip> void vram_8x8_w(offs_t offset, u16 data, u16 mem_mask);
void eeprom_w(u8 data); void eeprom_w(u8 data);
void sailormn_eeprom_w(u8 data); void sailormn_eeprom_w(u8 data);
void hotdogst_eeprom_w(u8 data); void hotdogst_eeprom_w(u8 data);
void guwange_eeprom_w(u8 data); void guwange_eeprom_w(u8 data);
void metmqstr_eeprom_w(u8 data); void metmqstr_eeprom_w(u8 data);
void korokoro_eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask); void korokoro_eeprom_w(offs_t offset, u16 data, u16 mem_mask);
DECLARE_READ16_MEMBER(pwrinst2_eeprom_r); u16 pwrinst2_eeprom_r();
void tjumpman_eeprom_w(u8 data); void tjumpman_eeprom_w(u8 data);
void ppsatan_eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask); void ppsatan_eeprom_w(offs_t offset, u16 data, u16 mem_mask);
DECLARE_WRITE16_MEMBER(ppsatan_io_mux_w); void ppsatan_io_mux_w(offs_t offset, u16 data, u16 mem_mask);
DECLARE_READ16_MEMBER(ppsatan_touch1_r); template<int Player> u16 ppsatan_touch_r();
DECLARE_READ16_MEMBER(ppsatan_touch2_r); void ppsatan_out_w(offs_t offset, u16 data, u16 mem_mask);
DECLARE_WRITE16_MEMBER(ppsatan_out_w);
uint16_t ppsatan_touch_r(int player);
TILE_GET_INFO_MEMBER(sailormn_get_tile_info_2); TILE_GET_INFO_MEMBER(sailormn_get_tile_info_2);
template<int Chip> TILE_GET_INFO_MEMBER(get_tile_info); template<int Chip, int Gfx> TILE_GET_INFO_MEMBER(get_tile_info);
DECLARE_MACHINE_RESET(sailormn); DECLARE_MACHINE_RESET(sailormn);
DECLARE_VIDEO_START(cave_1_layer); DECLARE_VIDEO_START(ddonpach);
DECLARE_VIDEO_START(cave_2_layers); DECLARE_VIDEO_START(dfeveron);
DECLARE_VIDEO_START(cave_3_layers); DECLARE_VIDEO_START(donpachi);
DECLARE_VIDEO_START(cave_4_layers); DECLARE_VIDEO_START(korokoro);
DECLARE_VIDEO_START(sailormn_3_layers); DECLARE_VIDEO_START(ppsatan);
DECLARE_VIDEO_START(pwrinst2);
DECLARE_VIDEO_START(sailormn);
DECLARE_VIDEO_START(uopoko);
void cave_palette(palette_device &palette); void cave_palette(palette_device &palette);
void dfeveron_palette(palette_device &palette); void dfeveron_palette(palette_device &palette);
void korokoro_palette(palette_device &palette); void korokoro_palette(palette_device &palette);
@ -152,11 +155,11 @@ private:
void pwrinst2_palette(palette_device &palette); void pwrinst2_palette(palette_device &palette);
void sailormn_palette(palette_device &palette); void sailormn_palette(palette_device &palette);
void ppsatan_palette(palette_device &palette); void ppsatan_palette(palette_device &palette);
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_ppsatan_core (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip); u32 screen_update_ppsatan_core (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip);
uint32_t screen_update_ppsatan_top (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); u32 screen_update_ppsatan_top (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_ppsatan_left (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); u32 screen_update_ppsatan_left (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); u32 screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(interrupt); INTERRUPT_GEN_MEMBER(interrupt);
INTERRUPT_GEN_MEMBER(interrupt_ppsatan); INTERRUPT_GEN_MEMBER(interrupt_ppsatan);
TIMER_CALLBACK_MEMBER(vblank_end); TIMER_CALLBACK_MEMBER(vblank_end);
@ -178,11 +181,14 @@ private:
virtual void machine_reset() override; virtual void machine_reset() override;
/* memory pointers */ /* memory pointers */
optional_shared_ptr_array<uint16_t, 4> m_videoregs; optional_shared_ptr_array<u16, 4> m_videoregs;
optional_shared_ptr_array<uint16_t, 4> m_vram; optional_shared_ptr_array<u16, 4> m_vram;
optional_shared_ptr_array<uint16_t, 4> m_vctrl; optional_shared_ptr_array<u16, 4> m_vctrl;
optional_shared_ptr_array<uint16_t, 4> m_spriteram; optional_shared_ptr_array<u16, 4> m_spriteram;
optional_shared_ptr_array<uint16_t, 4> m_paletteram;
optional_ioport m_io_in0;
optional_ioport_array<2> m_touch_x;
optional_ioport_array<2> m_touch_y;
/* memory regions */ /* memory regions */
optional_memory_region_array<4> m_spriteregion; optional_memory_region_array<4> m_spriteregion;
@ -206,7 +212,7 @@ private:
int priority = 0, flags = 0; int priority = 0, flags = 0;
const uint8_t *pen_data = nullptr; /* points to top left corner of tile data */ const u8 *pen_data = nullptr; /* points to top left corner of tile data */
int line_offset = 0; int line_offset = 0;
pen_t base_pen = 0; pen_t base_pen = 0;
@ -219,9 +225,9 @@ private:
struct struct
{ {
int clip_left, clip_right, clip_top, clip_bottom; int clip_left, clip_right, clip_top, clip_bottom;
uint8_t *baseaddr; u8 *baseaddr;
int line_offset; int line_offset;
uint8_t *baseaddr_zbuf; u8 *baseaddr_zbuf;
int line_offset_zbuf; int line_offset_zbuf;
} m_blit; } m_blit;
@ -229,53 +235,53 @@ private:
sprite_cave *m_sprite_table[4][MAX_PRIORITY][MAX_SPRITE_NUM + 1]; sprite_cave *m_sprite_table[4][MAX_PRIORITY][MAX_SPRITE_NUM + 1];
tilemap_t *m_tilemap[4]; tilemap_t *m_tilemap[4];
int m_tiledim[4]; bool m_tiledim[4];
int m_old_tiledim[4]; bool m_old_tiledim[4];
bitmap_ind16 m_sprite_zbuf; bitmap_ind16 m_sprite_zbuf[4];
uint16_t m_sprite_zbuf_baseval; u16 m_sprite_zbuf_baseval;
int m_num_sprites[4]; int m_num_sprites[4];
int m_spriteram_bank[4]; int m_spriteram_bank[4];
int m_spriteram_bank_delay[4]; int m_spriteram_bank_delay[4];
std::unique_ptr<uint16_t[]> m_palette_map[4];
int m_layers_offs_x; int m_layers_offs_x;
int m_layers_offs_y; int m_layers_offs_y;
int m_row_effect_offs_n; int m_row_effect_offs_n;
int m_row_effect_offs_f; int m_row_effect_offs_f;
int m_background_pen; u16 m_background_pen[4];
int m_spritetype[2]; int m_spritetype[2];
int m_kludge; int m_kludge;
emu_timer *m_vblank_end_timer; emu_timer *m_vblank_end_timer;
u16 m_sprite_base_pal;
u16 m_sprite_granularity;
/* misc */ /* misc */
int m_time_vblank_irq; int m_time_vblank_irq;
uint8_t m_irq_level; u8 m_irq_level;
uint8_t m_vblank_irq; u8 m_vblank_irq;
uint8_t m_sound_irq; u8 m_sound_irq;
uint8_t m_unknown_irq; u8 m_unknown_irq;
uint8_t m_agallet_vblank_irq; u8 m_agallet_vblank_irq;
/* sound related */ /* sound related */
int m_soundbuf_wptr; int m_soundbuf_wptr;
int m_soundbuf_rptr; int m_soundbuf_rptr;
uint8_t m_soundbuf_data[32]; u8 m_soundbuf_data[32];
bool m_soundbuf_empty; bool m_soundbuf_empty;
//uint8_t m_sound_flag[2]; //u8 m_sound_flag[2];
/* game specific */ /* game specific */
// sailormn // sailormn
int m_sailormn_tilebank; int m_sailormn_tilebank;
// korokoro // korokoro
uint16_t m_leds[2]; u16 m_leds[2];
int m_hopper; int m_hopper;
// ppsatan // ppsatan
uint16_t m_ppsatan_io_mux; u16 m_ppsatan_io_mux;
/* devices */ /* devices */
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
@ -285,9 +291,9 @@ private:
optional_device<timer_device> m_int_timer_left; optional_device<timer_device> m_int_timer_left;
optional_device<timer_device> m_int_timer_right; optional_device<timer_device> m_int_timer_right;
optional_device<eeprom_serial_93cxx_device> m_eeprom; optional_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<gfxdecode_device> m_gfxdecode; optional_device_array<gfxdecode_device, 4> m_gfxdecode;
required_device<screen_device> m_screen; optional_device_array<screen_device, 4> m_screen;
required_device<palette_device> m_palette; optional_device_array<palette_device, 4> m_palette;
optional_device<generic_latch_16_device> m_soundlatch; optional_device<generic_latch_16_device> m_soundlatch;
optional_device<timer_device> m_startup; optional_device<timer_device> m_startup;
output_finder<9> m_led_outputs; output_finder<9> m_led_outputs;
@ -295,12 +301,12 @@ private:
int m_rasflag; int m_rasflag;
int m_old_rasflag; int m_old_rasflag;
inline void tilemap_draw( int chip, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, uint32_t flags, uint32_t priority, uint32_t priority2, int GFX ); inline void tilemap_draw(int chip, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 flags, u32 priority, u32 priority2, int GFX);
void set_pens(int chip); void set_pens(int chip);
void vh_start( int num ); void vh_start(int num, u16 sprcol_base, u16 sprcol_granularity);
void get_sprite_info_cave(int chip); void get_sprite_info_cave(int chip);
void get_sprite_info_donpachi(int chip); void get_sprite_info_donpachi(int chip);
void sprite_init(); void sprite_init(int chip);
void sprite_check(int chip, screen_device &screen, const rectangle &clip); void sprite_check(int chip, screen_device &screen, const rectangle &clip);
void do_blit_zoom32(int chip, const sprite_cave *sprite); void do_blit_zoom32(int chip, const sprite_cave *sprite);
void do_blit_zoom32_zb(int chip, const sprite_cave *sprite); void do_blit_zoom32_zb(int chip, const sprite_cave *sprite);

View File

@ -59,110 +59,6 @@ Note: if MAME_DEBUG is defined, pressing:
#define SPRITE_VISIBLE_CAVE 0x04 #define SPRITE_VISIBLE_CAVE 0x04
/***************************************************************************
Palette Init Routines
Function needed for games with 4 bit sprites, rather than 8 bit,
or games with an odd colors mapping for the layers.
***************************************************************************/
void cave_state::cave_palette(palette_device &palette)
{
for (int chip = 0; chip < 4; chip++)
{
// create a 1:1 palette map covering everything
m_palette_map[chip] = std::make_unique<uint16_t[]>(palette.entries());
int const maxpens = m_paletteram[chip].bytes() / 2;
if (maxpens)
{
for (int pen = 0; pen < palette.entries(); pen++)
m_palette_map[chip][pen] = pen % maxpens;
}
}
}
void cave_state::dfeveron_palette(palette_device &palette)
{
/* Fill the 0-3fff range, used by sprites ($40 color codes * $100 pens)
Here sprites have 16 pens, but the sprite drawing routine always
multiplies the color code by $100 (for consistency).
That's why we need this function. */
cave_palette(palette);
for (int color = 0; color < 0x40; color++)
for (int pen = 0; pen < 0x10; pen++)
m_palette_map[0][(color << 8) | pen] = (color << 4) | pen;
}
void cave_state::mazinger_palette(palette_device &palette)
{
cave_palette(palette);
// sprites (encrypted) are 4 bit deep
for (int color = 0; color < 0x40; color++)
for (int pen = 0; pen < 0x100; pen++)
m_palette_map[0][(color << 8) | pen] = (color << 4) + pen; // yes, PLUS, not OR
// layer 0 is 6 bit deep, there are 64 color codes but only $400 colors are actually addressable
for (int color = 0; color < 0x40; color++)
for (int pen = 0; pen < 0x40; pen++)
m_palette_map[0][0x4400 + ((color << 6) | pen)] = 0x400 | ((color & 0x0f) << 6) | pen;
}
void cave_state::sailormn_palette(palette_device &palette)
{
cave_palette(palette);
// sprites (encrypted) are 4 bit deep
for (int color = 0; color < 0x40; color++)
for (int pen = 0; pen < 0x100; pen++)
m_palette_map[0][(color << 8) | pen] = (color << 4) + pen; // yes, PLUS, not OR
// layer 2 is 6 bit deep, there are 64 color codes but only $400 colors are actually addressable
for (int color = 0; color < 0x40; color++)
for (int pen = 0; pen < 0x40; pen++)
m_palette_map[0][0x4c00 + ((color << 6) | pen)] = 0xc00 | ((color & 0x0f) << 6) | pen;
}
void cave_state::pwrinst2_palette(palette_device &palette)
{
cave_palette(palette);
for (int color = 0; color < 0x80; color++)
for (int pen = 0; pen < 0x10; pen++)
m_palette_map[0][(color << 8) | pen] = (color << 4) | pen;
for (int pen = 0x8000; pen < 0xa800; pen++)
m_palette_map[0][pen] = pen - 0x8000;
}
void cave_state::korokoro_palette(palette_device &palette)
{
cave_palette(palette);
for (int color = 0; color < 0x40; color++)
for (int pen = 0; pen < 0x10; pen++)
m_palette_map[0][(color << 8) | pen] = 0x3c00 | (color << 4) | pen;
}
void cave_state::set_pens(int chip)
{
for (int pen = 0; pen < m_palette->entries(); pen++)
{
uint16_t const data = m_paletteram[chip][m_palette_map[chip][pen]];
rgb_t const color(pal5bit(data >> 5), pal5bit(data >> 10), pal5bit(data >> 0));
m_palette->set_pen_color(pen, color);
}
}
/*************************************************************************** /***************************************************************************
Tiles Format Tiles Format
@ -186,12 +82,12 @@ void cave_state::set_pens(int chip)
***************************************************************************/ ***************************************************************************/
template<int Chip> template<int Chip, int Gfx>
TILE_GET_INFO_MEMBER(cave_state::get_tile_info) TILE_GET_INFO_MEMBER(cave_state::get_tile_info)
{ {
uint16_t *VRAM = m_vram[Chip]; u16 *VRAM = m_vram[Chip];
int TDIM = m_tiledim[Chip]; const bool TDIM = m_tiledim[Chip];
uint32_t code, color, pri, tile; u32 code, color, pri, tile;
if (TDIM) if (TDIM)
{ {
@ -214,7 +110,7 @@ TILE_GET_INFO_MEMBER(cave_state::get_tile_info)
code = (code & 0x00ffffff); code = (code & 0x00ffffff);
} }
SET_TILE_INFO_MEMBER(Chip, code, color, 0 ); SET_TILE_INFO_MEMBER(Gfx, code, color, 0);
tileinfo.category = pri; tileinfo.category = pri;
} }
@ -232,11 +128,11 @@ void cave_state::sailormn_tilebank_w(int bank)
TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2) TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2)
{ {
uint32_t code, color, pri; u32 code, color, pri;
if (m_tiledim[2]) if (m_tiledim[2])
{ {
uint32_t tile; u32 tile;
tile = (tile_index % (512 / 8)) / 2 + ((tile_index / (512 / 8)) / 2) * (512 / 16); tile = (tile_index % (512 / 8)) / 2 + ((tile_index / (512 / 8)) / 2) * (512 / 16);
code = (m_vram[2][tile * 2 + 0x0000 / 2] << 16) + m_vram[2][tile * 2 + 0x0002 / 2]; code = (m_vram[2][tile * 2 + 0x0000 / 2] << 16) + m_vram[2][tile * 2 + 0x0002 / 2];
@ -272,31 +168,32 @@ TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2)
***************************************************************************/ ***************************************************************************/
void cave_state::vh_start( int num ) void cave_state::vh_start(int num, u16 sprcol_base, u16 sprcol_granularity)
{ {
assert(m_palette_map != nullptr); m_sprite_base_pal = sprcol_base;
m_sprite_granularity = sprcol_granularity;
m_tilemap[0] = nullptr; m_tilemap[0] = nullptr;
m_tilemap[1] = nullptr; m_tilemap[1] = nullptr;
m_tilemap[2] = nullptr; m_tilemap[2] = nullptr;
m_tilemap[3] = nullptr; m_tilemap[3] = nullptr;
m_tiledim[0] = 0; m_tiledim[0] = false;
m_tiledim[1] = 0; m_tiledim[1] = false;
m_tiledim[2] = 0; m_tiledim[2] = false;
m_tiledim[3] = 0; m_tiledim[3] = false;
m_old_tiledim[0] = 0; m_old_tiledim[0] = false;
m_old_tiledim[1] = 0; m_old_tiledim[1] = false;
m_old_tiledim[2] = 0; m_old_tiledim[2] = false;
m_old_tiledim[3] = 0; m_old_tiledim[3] = false;
assert((num >= 1) && (num <= 4)); assert((num >= 1) && (num <= 4));
switch (num) switch (num)
{ {
case 4: case 4:
m_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<3>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[3] = &machine().tilemap().create(*m_gfxdecode[0], tilemap_get_info_delegate(&cave_state::get_tile_info<3, 3>, "screen0_layer3",this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
m_tilemap[3]->set_transparent_pen(0); m_tilemap[3]->set_transparent_pen(0);
m_tilemap[3]->set_scroll_rows(1); m_tilemap[3]->set_scroll_rows(1);
m_tilemap[3]->set_scroll_cols(1); m_tilemap[3]->set_scroll_cols(1);
@ -304,7 +201,7 @@ void cave_state::vh_start( int num )
save_item(NAME(m_old_tiledim[3])); save_item(NAME(m_old_tiledim[3]));
case 3: case 3:
m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<2>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode[0], tilemap_get_info_delegate(&cave_state::get_tile_info<2, 2>, "screen0_layer2",this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
m_tilemap[2]->set_transparent_pen(0); m_tilemap[2]->set_transparent_pen(0);
m_tilemap[2]->set_scroll_rows(1); m_tilemap[2]->set_scroll_rows(1);
m_tilemap[2]->set_scroll_cols(1); m_tilemap[2]->set_scroll_cols(1);
@ -312,7 +209,7 @@ void cave_state::vh_start( int num )
save_item(NAME(m_old_tiledim[2])); save_item(NAME(m_old_tiledim[2]));
case 2: case 2:
m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<1>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode[0], tilemap_get_info_delegate(&cave_state::get_tile_info<1, 1>, "screen0_layer1",this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
m_tilemap[1]->set_transparent_pen(0); m_tilemap[1]->set_transparent_pen(0);
m_tilemap[1]->set_scroll_rows(1); m_tilemap[1]->set_scroll_rows(1);
m_tilemap[1]->set_scroll_cols(1); m_tilemap[1]->set_scroll_cols(1);
@ -320,7 +217,7 @@ void cave_state::vh_start( int num )
save_item(NAME(m_old_tiledim[1])); save_item(NAME(m_old_tiledim[1]));
case 1: case 1:
m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<0>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode[0], tilemap_get_info_delegate(&cave_state::get_tile_info<0, 0>, "screen0_layer0",this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8);
m_tilemap[0]->set_transparent_pen(0); m_tilemap[0]->set_transparent_pen(0);
m_tilemap[0]->set_scroll_rows(1); m_tilemap[0]->set_scroll_rows(1);
m_tilemap[0]->set_scroll_cols(1); m_tilemap[0]->set_scroll_cols(1);
@ -330,7 +227,7 @@ void cave_state::vh_start( int num )
break; break;
} }
sprite_init(); sprite_init(0);
m_layers_offs_x = 0x13; m_layers_offs_x = 0x13;
m_layers_offs_y = -0x12; m_layers_offs_y = -0x12;
@ -338,9 +235,9 @@ void cave_state::vh_start( int num )
m_row_effect_offs_n = -1; m_row_effect_offs_n = -1;
m_row_effect_offs_f = 1; m_row_effect_offs_f = 1;
m_background_pen = m_gfxdecode->gfx(0)->colorbase() + m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() +
(m_gfxdecode->gfx(0)->colors() - 1) * (m_gfxdecode[0]->gfx(0)->colors() - 1) *
m_gfxdecode->gfx(0)->granularity(); m_gfxdecode[0]->gfx(0)->granularity();
switch (m_kludge) switch (m_kludge)
{ {
@ -349,31 +246,98 @@ void cave_state::vh_start( int num )
m_row_effect_offs_f = -1; m_row_effect_offs_f = -1;
break; break;
case 2: /* uopoko dfeveron */ case 2: /* uopoko dfeveron */
m_background_pen = 0x3f00; m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() - m_gfxdecode[0]->gfx(0)->granularity();
break; break;
case 4: /* pwrinst2 */ case 4: /* pwrinst2 */
m_background_pen = 0x7f00; m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() - m_gfxdecode[0]->gfx(0)->granularity();
m_layers_offs_y++; m_layers_offs_y++;
break; break;
} }
} }
VIDEO_START_MEMBER(cave_state,cave_1_layer){ vh_start(1); } // ddonpach esprade gaia guwange (8bpp tilemap)
VIDEO_START_MEMBER(cave_state,cave_2_layers){ vh_start(2); } VIDEO_START_MEMBER(cave_state,ddonpach)
VIDEO_START_MEMBER(cave_state,cave_3_layers){ vh_start(3); }
VIDEO_START_MEMBER(cave_state,cave_4_layers){ vh_start(4); }
VIDEO_START_MEMBER(cave_state,sailormn_3_layers)
{ {
vh_start(2); vh_start(3, 0, 256);
}
// dfeveron mazinger
VIDEO_START_MEMBER(cave_state,dfeveron)
{
vh_start(2, 0, 16);
}
// donpachi hotdogst metmqstr
VIDEO_START_MEMBER(cave_state,donpachi)
{
vh_start(3, 0, 16);
}
// korokoro (different sprite base palette)
VIDEO_START_MEMBER(cave_state,korokoro)
{
vh_start(1, 0x3c00, 16);
}
// ppsatan (3 screen)
VIDEO_START_MEMBER(cave_state,ppsatan)
{
vh_start(1, 0x3c00, 16);
m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode[2], tilemap_get_info_delegate(&cave_state::get_tile_info<2, 0>, "screen2_layer0",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]));
m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode[1], tilemap_get_info_delegate(&cave_state::get_tile_info<1, 0>, "screen1_layer0",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]));
for (int chip = 1; chip < 3; chip++)
{
m_background_pen[chip] = m_gfxdecode[chip]->gfx(0)->colorbase() +
(m_gfxdecode[chip]->gfx(0)->colors() - 1) *
m_gfxdecode[chip]->gfx(0)->granularity();
switch (m_kludge)
{
case 2: /* uopoko dfeveron */
case 4: /* pwrinst2 */
m_background_pen[chip] = m_gfxdecode[chip]->gfx(0)->colorbase() - m_gfxdecode[chip]->gfx(0)->granularity();
break;
}
}
}
// pwrinst2
VIDEO_START_MEMBER(cave_state,pwrinst2)
{
vh_start(4, 0, 16);
}
// sailormn agallet
VIDEO_START_MEMBER(cave_state,sailormn)
{
vh_start(2, 0, 16);
/* Layer 2 (8x8) needs to be handled differently */ /* Layer 2 (8x8) needs to be handled differently */
m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, 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(*m_gfxdecode[0], 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]->set_transparent_pen(0); m_tilemap[2]->set_transparent_pen(0);
m_tilemap[2]->set_scroll_rows(1); m_tilemap[2]->set_scroll_rows(1);
m_tilemap[2]->set_scroll_cols(1); m_tilemap[2]->set_scroll_cols(1);
save_item(NAME(m_tiledim[2]));
save_item(NAME(m_old_tiledim[2]));
}
// uopoko tjumpman (8bpp tilemap, but single tilemap layer)
VIDEO_START_MEMBER(cave_state,uopoko)
{
vh_start(1, 0, 256);
} }
/*************************************************************************** /***************************************************************************
@ -411,28 +375,23 @@ VIDEO_START_MEMBER(cave_state,sailormn_3_layers)
void cave_state::get_sprite_info_cave(int chip) void cave_state::get_sprite_info_cave(int chip)
{ {
chip %= 4; chip %= 4;
pen_t base_pal = 0; const u8 *base_gfx = m_spriteregion[chip]->base();
const uint8_t *base_gfx = m_spriteregion[chip]->base(); const int code_max = m_spriteregion[chip]->bytes() / (16*16);
int code_max = m_spriteregion[chip]->bytes() / (16*16);
uint16_t *source;
uint16_t *finish;
sprite_cave *sprite = m_sprite[chip].get(); sprite_cave *sprite = m_sprite[chip].get();
int glob_flipx = m_videoregs[chip][0] & 0x8000; const int glob_flipx = m_videoregs[chip][0] & 0x8000;
int glob_flipy = m_videoregs[chip][1] & 0x8000; const int glob_flipy = m_videoregs[chip][1] & 0x8000;
int max_x = m_screen->width(); const int max_x = m_screen[chip]->width();
int max_y = m_screen->height(); const int max_y = m_screen[chip]->height();
source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip];
finish = source + (0x4000 / 2);
const u16 *source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip];
const u16 *finish = source + (0x4000 / 2);
for (; source < finish; source += 8) for (; source < finish; source += 8)
{ {
int x, y, attr, code, zoomx, zoomy, size, flipx, flipy; int x, y;
int total_width_f, total_height_f; int total_width_f, total_height_f;
if (m_spritetype[0] == 2) /* Hot Dog Storm */ if (m_spritetype[0] == 2) /* Hot Dog Storm */
@ -445,11 +404,11 @@ void cave_state::get_sprite_info_cave(int chip)
x = source[0] << 2; x = source[0] << 2;
y = source[1] << 2; y = source[1] << 2;
} }
attr = source[2]; const u16 attr = source[2];
code = source[3] + ((attr & 3) << 16); u32 code = source[3] + ((attr & 3) << 16);
zoomx = source[4]; int zoomx = source[4];
zoomy = source[5]; int zoomy = source[5];
size = source[6]; const u16 size = source[6];
sprite->tile_width = ((size >> 8) & 0x1f) * 16; sprite->tile_width = ((size >> 8) & 0x1f) * 16;
sprite->tile_height = ((size >> 0) & 0x1f) * 16; sprite->tile_height = ((size >> 0) & 0x1f) * 16;
@ -461,8 +420,8 @@ void cave_state::get_sprite_info_cave(int chip)
code %= code_max; code %= code_max;
sprite->pen_data = base_gfx + (16 * 16) * code; sprite->pen_data = base_gfx + (16 * 16) * code;
flipx = attr & 0x0008; int flipx = attr & 0x0008;
flipy = attr & 0x0004; int flipy = attr & 0x0004;
sprite->total_width = (total_width_f = sprite->tile_width * zoomx) / 0x100; sprite->total_width = (total_width_f = sprite->tile_width * zoomx) / 0x100;
sprite->total_height = (total_height_f = sprite->tile_height * zoomy) / 0x100; sprite->total_height = (total_height_f = sprite->tile_height * zoomy) / 0x100;
@ -517,7 +476,7 @@ void cave_state::get_sprite_info_cave(int chip)
sprite->priority = (attr & 0x0030) >> 4; sprite->priority = (attr & 0x0030) >> 4;
sprite->flags = SPRITE_VISIBLE_CAVE; sprite->flags = SPRITE_VISIBLE_CAVE;
sprite->line_offset = sprite->tile_width; sprite->line_offset = sprite->tile_width;
sprite->base_pen = base_pal + (attr & 0x3f00); // first 0x4000 colors sprite->base_pen = m_sprite_base_pal + (((attr & 0x3f00) >> 8) * m_sprite_granularity); // first 0x4000 colors
if (glob_flipx) { x = max_x - x - sprite->total_width; flipx = !flipx; } if (glob_flipx) { x = max_x - x - sprite->total_width; flipx = !flipx; }
if (glob_flipy) { y = max_y - y - sprite->total_height; flipy = !flipy; } if (glob_flipy) { y = max_y - y - sprite->total_height; flipy = !flipy; }
@ -536,39 +495,34 @@ void cave_state::get_sprite_info_cave(int chip)
void cave_state::get_sprite_info_donpachi(int chip) void cave_state::get_sprite_info_donpachi(int chip)
{ {
chip %= 4; chip %= 4;
pen_t base_pal = 0; const u8 *base_gfx = m_spriteregion[chip]->base();
const uint8_t *base_gfx = m_spriteregion[chip]->base(); const int code_max = m_spriteregion[chip]->bytes() / (16*16);
int code_max = m_spriteregion[chip]->bytes() / (16*16);
uint16_t *source;
uint16_t *finish;
sprite_cave *sprite = m_sprite[chip].get(); sprite_cave *sprite = m_sprite[chip].get();
int glob_flipx = m_videoregs[chip][0] & 0x8000; const int glob_flipx = m_videoregs[chip][0] & 0x8000;
int glob_flipy = m_videoregs[chip][1] & 0x8000; const int glob_flipy = m_videoregs[chip][1] & 0x8000;
int max_x = m_screen->width(); const int max_x = m_screen[chip]->width();
int max_y = m_screen->height(); const int max_y = m_screen[chip]->height();
source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; const u16 *source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip];
const u16 *finish = source + (0x4000 / 2);
finish = source + (0x4000 / 2);
for (; source < finish; source += 8) for (; source < finish; source += 8)
{ {
int x, y, attr, code, size, flipx, flipy; int y;
attr = source[0]; const u16 attr = source[0];
code = source[1] + ((attr & 3) << 16); u32 code = source[1] + ((attr & 3) << 16);
x = source[2] & 0x3ff; int x = source[2] & 0x3ff;
if (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;
size = source[4]; const u16 size = source[4];
sprite->tile_width = sprite->total_width = ((size >> 8) & 0x1f) * 16; sprite->tile_width = sprite->total_width = ((size >> 8) & 0x1f) * 16;
sprite->tile_height = sprite->total_height = ((size >> 0) & 0x1f) * 16; sprite->tile_height = sprite->total_height = ((size >> 0) & 0x1f) * 16;
@ -584,18 +538,18 @@ void cave_state::get_sprite_info_donpachi(int chip)
x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y) x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y)
{continue;} {continue;}
flipx = attr & 0x0008; int flipx = attr & 0x0008;
flipy = attr & 0x0004; int flipy = attr & 0x0004;
if (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 = m_sprite_base_pal + ((((attr & 0x3f00) >> 8) + ((attr & 0x0020) << 1)) * m_sprite_granularity);
} }
else else
{ {
sprite->priority = (attr & 0x0030) >> 4; sprite->priority = (attr & 0x0030) >> 4;
sprite->base_pen = base_pal + (attr & 0x3f00); // first 0x4000 colors sprite->base_pen = m_sprite_base_pal + (((attr & 0x3f00) >> 8) * m_sprite_granularity); // first 0x4000 colors
} }
sprite->flags = SPRITE_VISIBLE_CAVE; sprite->flags = SPRITE_VISIBLE_CAVE;
@ -616,8 +570,15 @@ void cave_state::get_sprite_info_donpachi(int chip)
} }
void cave_state::sprite_init() void cave_state::sprite_init(int chip)
{ {
m_screen[chip]->register_screen_bitmap(m_sprite_zbuf[chip]);
save_item(NAME(m_sprite_zbuf[chip]), chip);
if (chip != 0)
return;
if (m_spritetype[0] == 0 || m_spritetype[0] == 2) // most of the games if (m_spritetype[0] == 0 || m_spritetype[0] == 2) // most of the games
{ {
m_get_sprite_info = &cave_state::get_sprite_info_cave; m_get_sprite_info = &cave_state::get_sprite_info_cave;
@ -630,7 +591,6 @@ void cave_state::sprite_init()
} }
m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM; m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM;
m_screen->register_screen_bitmap(m_sprite_zbuf);
for (int chip = 0; chip < 4; chip++) for (int chip = 0; chip < 4; chip++)
{ {
@ -644,7 +604,6 @@ void cave_state::sprite_init()
m_sprite_draw = &cave_state::sprite_draw_donpachi; m_sprite_draw = &cave_state::sprite_draw_donpachi;
save_item(NAME(m_sprite_zbuf));
save_item(NAME(m_sprite_zbuf_baseval)); save_item(NAME(m_sprite_zbuf_baseval));
save_item(NAME(m_num_sprites)); save_item(NAME(m_num_sprites));
save_item(NAME(m_spriteram_bank)); save_item(NAME(m_spriteram_bank));
@ -659,10 +618,10 @@ void cave_state::sprite_init()
void cave_state::sprite_check(int chip, screen_device &screen, const rectangle &clip) void cave_state::sprite_check(int chip, screen_device &screen, const rectangle &clip)
{ {
{ /* set clip */ { /* set clip */
int left = clip.min_x; const int left = clip.min_x;
int top = clip.min_y; const int top = clip.min_y;
int right = clip.max_x + 1; const int right = clip.max_x + 1;
int bottom = clip.max_y + 1; const int bottom = clip.max_y + 1;
m_blit.clip_left = left; m_blit.clip_left = left;
m_blit.clip_top = top; m_blit.clip_top = top;
@ -712,7 +671,7 @@ void cave_state::sprite_check(int chip, screen_device &screen, const rectangle &
if (clip.min_y == visarea.min_y) if (clip.min_y == visarea.min_y)
{ {
if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
m_sprite_zbuf.fill(0, visarea); m_sprite_zbuf[chip].fill(0, visarea);
} }
break; break;
@ -721,7 +680,7 @@ void cave_state::sprite_check(int chip, screen_device &screen, const rectangle &
if (clip.min_y == visarea.min_y) if (clip.min_y == visarea.min_y)
{ {
if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
m_sprite_zbuf.fill(0, visarea); m_sprite_zbuf[chip].fill(0, visarea);
} }
break; break;
@ -825,34 +784,29 @@ void cave_state::do_blit_zoom32( int chip, const sprite_cave *sprite )
} }
{ {
const uint8_t *pen_data = sprite->pen_data -1 -sprite->line_offset; const u8 *pen_data = sprite->pen_data -1 -sprite->line_offset;
pen_t base_pen = sprite->base_pen; const pen_t base_pen = sprite->base_pen;
int x, y; const int pitch = m_blit.line_offset * dy / 4;
uint8_t pen; u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1);
int pitch = m_blit.line_offset * dy / 4;
uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1);
int ycount = ycount0; int ycount = ycount0;
for (y = y1; y != y2; y += dy) for (int y = y1; y != y2; y += dy)
{ {
int xcount;
const uint8_t *source;
if (ycount & 0xffff0000) if (ycount & 0xffff0000)
{ {
xcount = xcount0; int xcount = xcount0;
pen_data += sprite->line_offset * (ycount >> 16); pen_data += sprite->line_offset * (ycount >> 16);
ycount &= 0xffff; ycount &= 0xffff;
source = pen_data; const u8 *source = pen_data;
for (x = x1; x != x2; x += dx) for (int x = x1; x != x2; x += dx)
{ {
if (xcount & 0xffff0000) if (xcount & 0xffff0000)
{ {
source += xcount >> 16; source += xcount >> 16;
xcount &= 0xffff; xcount &= 0xffff;
pen = *source; const u8 pen = *source;
if (pen) if (pen)
dest[x] = m_palette->pen_color(base_pen + pen); dest[x] = m_palette[chip]->pen_color(base_pen + pen);
} }
xcount += sprite->zoomx_re; xcount += sprite->zoomx_re;
} }
@ -954,38 +908,33 @@ void cave_state::do_blit_zoom32_zb( int chip, const sprite_cave *sprite )
} }
{ {
const uint8_t *pen_data = sprite->pen_data - 1 - sprite->line_offset; const u8 *pen_data = sprite->pen_data - 1 - sprite->line_offset;
pen_t base_pen = sprite->base_pen; const pen_t base_pen = sprite->base_pen;
int x, y; const int pitch = m_blit.line_offset * dy / 4;
uint8_t pen; u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1);
int pitch = m_blit.line_offset * dy / 4; const int pitchz = m_blit.line_offset_zbuf * dy / 2;
uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1); u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
int pitchz = m_blit.line_offset_zbuf * dy / 2; const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval;
uint16_t *zbf = (uint16_t *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
uint16_t pri_sp = (uint16_t)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval;
int ycount = ycount0; int ycount = ycount0;
for (y = y1; y != y2; y += dy) for (int y = y1; y != y2; y += dy)
{ {
int xcount;
const uint8_t *source;
if (ycount & 0xffff0000) if (ycount & 0xffff0000)
{ {
xcount = xcount0; int xcount = xcount0;
pen_data += sprite->line_offset * (ycount >> 16); pen_data += sprite->line_offset * (ycount >> 16);
ycount &= 0xffff; ycount &= 0xffff;
source = pen_data; const u8 *source = pen_data;
for (x = x1; x != x2; x += dx) for (int x = x1; x != x2; x += dx)
{ {
if (xcount & 0xffff0000) if (xcount & 0xffff0000)
{ {
source += xcount >> 16; source += xcount >> 16;
xcount &= 0xffff; xcount &= 0xffff;
pen = *source; const u8 pen = *source;
if (pen && (zbf[x] <= pri_sp)) if (pen && (zbf[x] <= pri_sp))
{ {
dest[x] = m_palette->pen_color(base_pen + pen); dest[x] = m_palette[chip]->pen_color(base_pen + pen);
zbf[x] = pri_sp; zbf[x] = pri_sp;
} }
} }
@ -1068,23 +1017,20 @@ void cave_state::do_blit_32( int chip, const sprite_cave *sprite )
} }
{ {
const uint8_t *pen_data = sprite->pen_data; const u8 *pen_data = sprite->pen_data;
pen_t base_pen = sprite->base_pen; const pen_t base_pen = sprite->base_pen;
int x, y; const int pitch = m_blit.line_offset * dy / 4;
uint8_t pen; u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1);
int pitch = m_blit.line_offset * dy / 4;
uint32_t *dest = (uint32_t *)(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 (int y = y1; y != y2; y += dy)
{ {
const uint8_t *source; const u8 *source = pen_data;
source = pen_data; for (int x = x1; x != x2; x += dx)
for (x = x1; x != x2; x += dx)
{ {
pen = *source; const u8 pen = *source;
if (pen) if (pen)
dest[x] = m_palette->pen_color(base_pen + pen); dest[x] = m_palette[chip]->pen_color(base_pen + pen);
source++; source++;
} }
pen_data += sprite->line_offset; pen_data += sprite->line_offset;
@ -1164,27 +1110,25 @@ void cave_state::do_blit_32_zb( int chip, const sprite_cave *sprite )
} }
{ {
const uint8_t *pen_data = sprite->pen_data; const u8 *pen_data = sprite->pen_data;
pen_t base_pen = sprite->base_pen; const pen_t base_pen = sprite->base_pen;
int x, y; const int pitch = m_blit.line_offset * dy / 4;
uint8_t pen; u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1);
int pitch = m_blit.line_offset * dy / 4; const int pitchz = m_blit.line_offset_zbuf * dy / 2;
uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1); u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
int pitchz = m_blit.line_offset_zbuf * dy / 2; const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval;
uint16_t *zbf = (uint16_t *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
uint16_t pri_sp = (uint16_t)(sprite - m_sprite[chip].get()) + 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 (int y = y1; y != y2; y += dy)
{ {
const uint8_t *source; const u8 *source;
source = pen_data; source = pen_data;
for (x = x1; x != x2; x += dx) for (int x = x1; x != x2; x += dx)
{ {
pen = *source; const u8 pen = *source;
if (pen && (zbf[x] <= pri_sp)) if (pen && (zbf[x] <= pri_sp))
{ {
dest[x] = m_palette->pen_color(base_pen + pen); dest[x] = m_palette[chip]->pen_color(base_pen + pen);
zbf[x] = pri_sp; zbf[x] = pri_sp;
} }
source++; source++;
@ -1296,12 +1240,11 @@ void cave_state::sprite_draw_donpachi_zbuf( int chip, int priority )
inline void cave_state::tilemap_draw(int chip, inline void cave_state::tilemap_draw(int chip,
screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect,
uint32_t flags, uint32_t priority, uint32_t priority2, int GFX ) u32 flags, u32 priority, u32 priority2, int GFX)
{ {
tilemap_t *TILEMAP = m_tilemap[GFX]; tilemap_t *TILEMAP = m_tilemap[GFX];
uint16_t *VRAM = m_vram[GFX]; const u16 *VRAM = m_vram[GFX];
uint16_t *VCTRL = m_vctrl[GFX]; const u16 *VCTRL = m_vctrl[GFX];
int sx, sy, flipx, flipy, offs_x, offs_y, offs_row;
/* Bail out if ... */ /* Bail out if ... */
@ -1310,14 +1253,14 @@ inline void cave_state::tilemap_draw( int chip,
((VCTRL[2] & 0x0010))) /* tilemap's disabled. */ ((VCTRL[2] & 0x0010))) /* tilemap's disabled. */
return; return;
flipx = ~VCTRL[0] & 0x8000; const bool flipx = ~VCTRL[0] & 0x8000;
flipy = ~VCTRL[1] & 0x8000; const bool flipy = ~VCTRL[1] & 0x8000;
TILEMAP->set_flip((flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0)); TILEMAP->set_flip((flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0));
offs_x = m_layers_offs_x; int offs_x = m_layers_offs_x;
offs_y = m_layers_offs_y; const int offs_y = m_layers_offs_y;
offs_row = flipy ? m_row_effect_offs_f : m_row_effect_offs_n; const int offs_row = flipy ? m_row_effect_offs_f : m_row_effect_offs_n;
/* An additional 8 pixel offset for layers with 8x8 tiles. Plus /* An additional 8 pixel offset for layers with 8x8 tiles. Plus
Layer 0 is displaced by 1 pixel wrt Layer 1, so is Layer 2 wrt Layer 0 is displaced by 1 pixel wrt Layer 1, so is Layer 2 wrt
@ -1327,13 +1270,13 @@ inline void cave_state::tilemap_draw( int chip,
else if (TILEMAP == m_tilemap[2]) offs_x -= (m_tiledim[2] ? 3 : (3 + 8)); else if (TILEMAP == m_tilemap[2]) offs_x -= (m_tiledim[2] ? 3 : (3 + 8));
else if (TILEMAP == m_tilemap[3]) offs_x -= (m_tiledim[3] ? 4 : (4 + 8)); else if (TILEMAP == m_tilemap[3]) offs_x -= (m_tiledim[3] ? 4 : (4 + 8));
sx = VCTRL[0] - m_videoregs[chip][0] + (flipx ? (offs_x + 2) : -offs_x); const int sx = VCTRL[0] - m_videoregs[chip][0] + (flipx ? (offs_x + 2) : -offs_x);
sy = VCTRL[1] - m_videoregs[chip][1] + (flipy ? (offs_y + 2) : -offs_y); const int sy = VCTRL[1] - m_videoregs[chip][1] + (flipy ? (offs_y + 2) : -offs_y);
if (VCTRL[1] & 0x4000) // row-select if (VCTRL[1] & 0x4000) // row-select
{ {
rectangle clip; rectangle clip;
int startline, endline, vramdata0, vramdata1; int endline, vramdata0, vramdata1;
/* /*
Row-select: Row-select:
@ -1346,7 +1289,7 @@ inline void cave_state::tilemap_draw( int chip,
clip.min_x = cliprect.min_x; clip.min_x = cliprect.min_x;
clip.max_x = cliprect.max_x; clip.max_x = cliprect.max_x;
for (startline = cliprect.min_y; startline <= cliprect.max_y;) for (int startline = cliprect.min_y; startline <= cliprect.max_y;)
{ {
/* Find the largest slice */ /* Find the largest slice */
vramdata0 = (vramdata1 = VRAM[(0x1002 + (((sy + offs_row + startline) * 4) & 0x7ff)) / 2]); vramdata0 = (vramdata1 = VRAM[(0x1002 + (((sy + offs_row + startline) * 4) & 0x7ff)) / 2]);
@ -1357,8 +1300,6 @@ inline void cave_state::tilemap_draw( int chip,
if (VCTRL[0] & 0x4000) // row-scroll, row-select if (VCTRL[0] & 0x4000) // row-scroll, row-select
{ {
int line;
/* /*
Row-scroll: Row-scroll:
@ -1368,7 +1309,7 @@ inline void cave_state::tilemap_draw( int chip,
*/ */
TILEMAP->set_scroll_rows(512); TILEMAP->set_scroll_rows(512);
for(line = startline; line < endline; line++) for (int line = startline; line < endline; line++)
TILEMAP->set_scrollx((vramdata0 - startline + line) & 511, TILEMAP->set_scrollx((vramdata0 - startline + line) & 511,
sx + VRAM[(0x1000 + (((sy + offs_row + line) * 4) & 0x7ff)) / 2]); sx + VRAM[(0x1000 + (((sy + offs_row + line) * 4) & 0x7ff)) / 2]);
} }
@ -1396,9 +1337,8 @@ inline void cave_state::tilemap_draw( int chip,
} }
else if (VCTRL[0] & 0x4000) // row-scroll, no row-select else if (VCTRL[0] & 0x4000) // row-scroll, no row-select
{ {
int line;
TILEMAP->set_scroll_rows(512); TILEMAP->set_scroll_rows(512);
for(line = cliprect.min_y; line <= cliprect.max_y; line++) for (int line = cliprect.min_y; line <= cliprect.max_y; line++)
TILEMAP->set_scrollx((line + sy) & 511, TILEMAP->set_scrollx((line + sy) & 511,
sx + VRAM[(0x1000+(((sy + offs_row + line) * 4) & 0x7ff)) / 2]); sx + VRAM[(0x1000+(((sy + offs_row + line) * 4) & 0x7ff)) / 2]);
TILEMAP->set_scrolly(0, sy); TILEMAP->set_scrolly(0, sy);
@ -1416,20 +1356,17 @@ inline void cave_state::tilemap_draw( int chip,
} }
uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) u32 cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
int pri, pri2, GFX;
int layers_ctrl = -1; int layers_ctrl = -1;
set_pens(0); m_blit.baseaddr = reinterpret_cast<u8 *>(bitmap.raw_pixptr(0));
m_blit.baseaddr = reinterpret_cast<uint8_t *>(bitmap.raw_pixptr(0));
m_blit.line_offset = bitmap.rowbytes(); m_blit.line_offset = bitmap.rowbytes();
m_blit.baseaddr_zbuf = reinterpret_cast<uint8_t *>(m_sprite_zbuf.raw_pixptr(0)); m_blit.baseaddr_zbuf = reinterpret_cast<u8 *>(m_sprite_zbuf[0].raw_pixptr(0));
m_blit.line_offset_zbuf = m_sprite_zbuf.rowbytes(); m_blit.line_offset_zbuf = m_sprite_zbuf[0].rowbytes();
/* Choose the tilemap to display (8x8 tiles or 16x16 tiles) */ /* Choose the tilemap to display (8x8 tiles or 16x16 tiles) */
for (GFX = 0; GFX < 4; GFX++) for (int GFX = 0; GFX < 4; GFX++)
{ {
if (m_tilemap[GFX]) if (m_tilemap[GFX])
{ {
@ -1475,7 +1412,7 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
/* Show the row / "column" scroll enable flags, when they change state */ /* Show the row / "column" scroll enable flags, when they change state */
m_rasflag = 0; m_rasflag = 0;
for (GFX = 0; GFX < 4; GFX++) for (int GFX = 0; GFX < 4; GFX++)
{ {
if (m_tilemap[GFX]) if (m_tilemap[GFX])
{ {
@ -1498,7 +1435,7 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
sprite_check(0, screen, cliprect); sprite_check(0, screen, cliprect);
bitmap.fill(m_palette->pen_color(m_background_pen), cliprect); bitmap.fill(m_palette[0]->pen_color(m_background_pen[0]), cliprect);
/* /*
Tiles and sprites are ordered by priority (0 back, 3 front) with Tiles and sprites are ordered by priority (0 back, 3 front) with
@ -1512,11 +1449,11 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
Tiles with the same priority *and* the same priority of their layer Tiles with the same priority *and* the same priority of their layer
are ordered by layer (0 back, 2 front) are ordered by layer (0 back, 2 front)
*/ */
for (pri = 0; pri <= 3; pri++) // tile / sprite priority for (int pri = 0; pri <= 3; pri++) // tile / sprite priority
{ {
if (layers_ctrl & (1 << (pri + 16))) (this->*m_sprite_draw)(0, pri); if (layers_ctrl & (1 << (pri + 16))) (this->*m_sprite_draw)(0, pri);
for (pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer for (int pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer
{ {
if (layers_ctrl & (1 << (pri + 0))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 0); if (layers_ctrl & (1 << (pri + 0))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 0);
if (layers_ctrl & (1 << (pri + 4))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 1); if (layers_ctrl & (1 << (pri + 4))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 1);
@ -1536,7 +1473,7 @@ void cave_state::get_sprite_info(int chip)
if (m_videoregs[chip] == nullptr) if (m_videoregs[chip] == nullptr)
return; return;
int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000; const int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000;
if (m_kludge == 3) /* mazinger metmqstr */ if (m_kludge == 3) /* mazinger metmqstr */
{ {
@ -1565,32 +1502,12 @@ void cave_state::device_post_load()
// Poka Poka Satan: 3 screens * (1 Sprite chip + 1 Tilemap chip) // Poka Poka Satan: 3 screens * (1 Sprite chip + 1 Tilemap chip)
void cave_state::ppsatan_palette(palette_device &palette) u32 cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip)
{ {
cave_palette(palette); m_blit.baseaddr = reinterpret_cast<u8 *>(bitmap.raw_pixptr(0));
for (int chip = 0; chip < 3; chip++)
{
// Sprites: 0x987800 - 0x988fff
for (int color = 0; color < 0x40; color++)
for (int pen = 0; pen < 0x10; pen++)
m_palette_map[chip][(color << 8) | pen] = 0x7800/2 + ((color << 4) | pen);
// Tiles: 0x980000 - 0x9803ff
for (int color = 0; color < 0x40; color++)
for (int pen = 0; pen < 0x10; pen++)
m_palette_map[chip][0x4000 + ((color << 4) | pen)] = ((color << 4) | pen);
}
}
uint32_t cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip)
{
set_pens(chip);
m_blit.baseaddr = reinterpret_cast<uint8_t *>(bitmap.raw_pixptr(0));
m_blit.line_offset = bitmap.rowbytes(); m_blit.line_offset = bitmap.rowbytes();
m_blit.baseaddr_zbuf = reinterpret_cast<uint8_t *>(m_sprite_zbuf.raw_pixptr(0)); m_blit.baseaddr_zbuf = reinterpret_cast<u8 *>(m_sprite_zbuf[chip].raw_pixptr(0));
m_blit.line_offset_zbuf = m_sprite_zbuf.rowbytes(); m_blit.line_offset_zbuf = m_sprite_zbuf[chip].rowbytes();
m_tiledim[chip] = m_vctrl[chip][1] & 0x2000; m_tiledim[chip] = m_vctrl[chip][1] & 0x2000;
if (m_tiledim[chip] != m_old_tiledim[chip]) if (m_tiledim[chip] != m_old_tiledim[chip])
@ -1599,7 +1516,7 @@ uint32_t cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rg
sprite_check(chip, screen, cliprect); sprite_check(chip, screen, cliprect);
bitmap.fill(m_palette->pen_color(m_background_pen), cliprect); bitmap.fill(m_palette[chip]->pen_color(m_background_pen[chip]), cliprect);
for (int pri = 0; pri <= 3; pri++) // tile / sprite priority for (int pri = 0; pri <= 3; pri++) // tile / sprite priority
{ {
@ -1612,16 +1529,16 @@ uint32_t cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rg
return 0; return 0;
} }
uint32_t cave_state::screen_update_ppsatan_top(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) u32 cave_state::screen_update_ppsatan_top(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
return screen_update_ppsatan_core(screen, bitmap, cliprect, 0); return screen_update_ppsatan_core(screen, bitmap, cliprect, 0);
} }
uint32_t cave_state::screen_update_ppsatan_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) u32 cave_state::screen_update_ppsatan_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
machine().crosshair().get_crosshair(1).set_screen(&screen); machine().crosshair().get_crosshair(1).set_screen(&screen);
return screen_update_ppsatan_core(screen, bitmap, cliprect, 1); return screen_update_ppsatan_core(screen, bitmap, cliprect, 1);
} }
uint32_t cave_state::screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) u32 cave_state::screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
machine().crosshair().get_crosshair(0).set_screen(&screen); machine().crosshair().get_crosshair(0).set_screen(&screen);
return screen_update_ppsatan_core(screen, bitmap, cliprect, 2); return screen_update_ppsatan_core(screen, bitmap, cliprect, 2);