mirror of
https://github.com/holub/mame
synced 2025-07-04 01:18:59 +03:00
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:
parent
85f717190c
commit
7507ca4ea2
File diff suppressed because it is too large
Load Diff
@ -27,7 +27,9 @@ public:
|
||||
, m_vram(*this, "vram.%u", 0)
|
||||
, m_vctrl(*this, "vctrl.%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_tileregion(*this, "layer%u", 0)
|
||||
, m_okiregion(*this, "oki%u", 1)
|
||||
@ -42,9 +44,9 @@ public:
|
||||
, m_int_timer_left(*this, "int_timer_left")
|
||||
, m_int_timer_right(*this, "int_timer_right")
|
||||
, m_eeprom(*this, "eeprom")
|
||||
, m_gfxdecode(*this, "gfxdecode")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
, m_gfxdecode(*this, "gfxdecode.%u", 0U)
|
||||
, m_screen(*this, "screen.%u", 0U)
|
||||
, m_palette(*this, "palette.%u", 0U)
|
||||
, m_soundlatch(*this, "soundlatch")
|
||||
, m_startup(*this, "startup")
|
||||
, m_led_outputs(*this, "led%u", 0U)
|
||||
@ -105,46 +107,47 @@ private:
|
||||
|
||||
u16 irq_cause_r(offs_t offset);
|
||||
u8 soundflags_r();
|
||||
DECLARE_READ16_MEMBER(soundflags_ack_r);
|
||||
DECLARE_WRITE16_MEMBER(sound_cmd_w);
|
||||
DECLARE_READ8_MEMBER(soundlatch_lo_r);
|
||||
DECLARE_READ8_MEMBER(soundlatch_hi_r);
|
||||
DECLARE_READ16_MEMBER(soundlatch_ack_r);
|
||||
DECLARE_WRITE8_MEMBER(soundlatch_ack_w);
|
||||
u16 soundflags_ack_r();
|
||||
void sound_cmd_w(u16 data);
|
||||
u8 soundlatch_lo_r();
|
||||
u8 soundlatch_hi_r();
|
||||
u16 soundlatch_ack_r();
|
||||
void soundlatch_ack_w(u8 data);
|
||||
void gaia_coin_w(u8 data);
|
||||
DECLARE_READ16_MEMBER(donpachi_videoregs_r);
|
||||
DECLARE_WRITE16_MEMBER(korokoro_leds_w);
|
||||
template<int Chip> DECLARE_WRITE16_MEMBER(pwrinst2_vctrl_w);
|
||||
DECLARE_READ16_MEMBER(sailormn_input0_r);
|
||||
u16 donpachi_videoregs_r(offs_t offset);
|
||||
void korokoro_leds_w(offs_t offset, u16 data, u16 mem_mask);
|
||||
template<int Chip> void pwrinst2_vctrl_w(offs_t offset, u16 data, u16 mem_mask);
|
||||
u16 sailormn_input0_r();
|
||||
void tjumpman_leds_w(u8 data);
|
||||
void pacslot_leds_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 oki2_bank_w(u8 data);
|
||||
template<int Chip> DECLARE_WRITE16_MEMBER(vram_w);
|
||||
template<int Chip> DECLARE_WRITE16_MEMBER(vram_8x8_w);
|
||||
template<int Chip> void vram_w(offs_t offset, u16 data, u16 mem_mask);
|
||||
template<int Chip> void vram_8x8_w(offs_t offset, u16 data, u16 mem_mask);
|
||||
void eeprom_w(u8 data);
|
||||
void sailormn_eeprom_w(u8 data);
|
||||
void hotdogst_eeprom_w(u8 data);
|
||||
void guwange_eeprom_w(u8 data);
|
||||
void metmqstr_eeprom_w(u8 data);
|
||||
void korokoro_eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask);
|
||||
DECLARE_READ16_MEMBER(pwrinst2_eeprom_r);
|
||||
void korokoro_eeprom_w(offs_t offset, u16 data, u16 mem_mask);
|
||||
u16 pwrinst2_eeprom_r();
|
||||
void tjumpman_eeprom_w(u8 data);
|
||||
void ppsatan_eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask);
|
||||
DECLARE_WRITE16_MEMBER(ppsatan_io_mux_w);
|
||||
DECLARE_READ16_MEMBER(ppsatan_touch1_r);
|
||||
DECLARE_READ16_MEMBER(ppsatan_touch2_r);
|
||||
DECLARE_WRITE16_MEMBER(ppsatan_out_w);
|
||||
uint16_t ppsatan_touch_r(int player);
|
||||
void ppsatan_eeprom_w(offs_t offset, u16 data, u16 mem_mask);
|
||||
void ppsatan_io_mux_w(offs_t offset, u16 data, u16 mem_mask);
|
||||
template<int Player> u16 ppsatan_touch_r();
|
||||
void ppsatan_out_w(offs_t offset, u16 data, u16 mem_mask);
|
||||
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_VIDEO_START(cave_1_layer);
|
||||
DECLARE_VIDEO_START(cave_2_layers);
|
||||
DECLARE_VIDEO_START(cave_3_layers);
|
||||
DECLARE_VIDEO_START(cave_4_layers);
|
||||
DECLARE_VIDEO_START(sailormn_3_layers);
|
||||
DECLARE_VIDEO_START(ddonpach);
|
||||
DECLARE_VIDEO_START(dfeveron);
|
||||
DECLARE_VIDEO_START(donpachi);
|
||||
DECLARE_VIDEO_START(korokoro);
|
||||
DECLARE_VIDEO_START(ppsatan);
|
||||
DECLARE_VIDEO_START(pwrinst2);
|
||||
DECLARE_VIDEO_START(sailormn);
|
||||
DECLARE_VIDEO_START(uopoko);
|
||||
void cave_palette(palette_device &palette);
|
||||
void dfeveron_palette(palette_device &palette);
|
||||
void korokoro_palette(palette_device &palette);
|
||||
@ -152,11 +155,11 @@ private:
|
||||
void pwrinst2_palette(palette_device &palette);
|
||||
void sailormn_palette(palette_device &palette);
|
||||
void ppsatan_palette(palette_device &palette);
|
||||
uint32_t 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);
|
||||
uint32_t 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);
|
||||
uint32_t screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
u32 screen_update_ppsatan_core (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip);
|
||||
u32 screen_update_ppsatan_top (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
u32 screen_update_ppsatan_left (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_ppsatan);
|
||||
TIMER_CALLBACK_MEMBER(vblank_end);
|
||||
@ -178,11 +181,14 @@ private:
|
||||
virtual void machine_reset() override;
|
||||
|
||||
/* memory pointers */
|
||||
optional_shared_ptr_array<uint16_t, 4> m_videoregs;
|
||||
optional_shared_ptr_array<uint16_t, 4> m_vram;
|
||||
optional_shared_ptr_array<uint16_t, 4> m_vctrl;
|
||||
optional_shared_ptr_array<uint16_t, 4> m_spriteram;
|
||||
optional_shared_ptr_array<uint16_t, 4> m_paletteram;
|
||||
optional_shared_ptr_array<u16, 4> m_videoregs;
|
||||
optional_shared_ptr_array<u16, 4> m_vram;
|
||||
optional_shared_ptr_array<u16, 4> m_vctrl;
|
||||
optional_shared_ptr_array<u16, 4> m_spriteram;
|
||||
|
||||
optional_ioport m_io_in0;
|
||||
optional_ioport_array<2> m_touch_x;
|
||||
optional_ioport_array<2> m_touch_y;
|
||||
|
||||
/* memory regions */
|
||||
optional_memory_region_array<4> m_spriteregion;
|
||||
@ -206,7 +212,7 @@ private:
|
||||
|
||||
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;
|
||||
|
||||
pen_t base_pen = 0;
|
||||
@ -219,9 +225,9 @@ private:
|
||||
struct
|
||||
{
|
||||
int clip_left, clip_right, clip_top, clip_bottom;
|
||||
uint8_t *baseaddr;
|
||||
u8 *baseaddr;
|
||||
int line_offset;
|
||||
uint8_t *baseaddr_zbuf;
|
||||
u8 *baseaddr_zbuf;
|
||||
int line_offset_zbuf;
|
||||
} m_blit;
|
||||
|
||||
@ -229,53 +235,53 @@ private:
|
||||
sprite_cave *m_sprite_table[4][MAX_PRIORITY][MAX_SPRITE_NUM + 1];
|
||||
|
||||
tilemap_t *m_tilemap[4];
|
||||
int m_tiledim[4];
|
||||
int m_old_tiledim[4];
|
||||
bool m_tiledim[4];
|
||||
bool m_old_tiledim[4];
|
||||
|
||||
bitmap_ind16 m_sprite_zbuf;
|
||||
uint16_t m_sprite_zbuf_baseval;
|
||||
bitmap_ind16 m_sprite_zbuf[4];
|
||||
u16 m_sprite_zbuf_baseval;
|
||||
|
||||
int m_num_sprites[4];
|
||||
|
||||
int m_spriteram_bank[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_y;
|
||||
int m_row_effect_offs_n;
|
||||
int m_row_effect_offs_f;
|
||||
int m_background_pen;
|
||||
u16 m_background_pen[4];
|
||||
|
||||
int m_spritetype[2];
|
||||
int m_kludge;
|
||||
emu_timer *m_vblank_end_timer;
|
||||
|
||||
u16 m_sprite_base_pal;
|
||||
u16 m_sprite_granularity;
|
||||
|
||||
/* misc */
|
||||
int m_time_vblank_irq;
|
||||
uint8_t m_irq_level;
|
||||
uint8_t m_vblank_irq;
|
||||
uint8_t m_sound_irq;
|
||||
uint8_t m_unknown_irq;
|
||||
uint8_t m_agallet_vblank_irq;
|
||||
u8 m_irq_level;
|
||||
u8 m_vblank_irq;
|
||||
u8 m_sound_irq;
|
||||
u8 m_unknown_irq;
|
||||
u8 m_agallet_vblank_irq;
|
||||
|
||||
/* sound related */
|
||||
int m_soundbuf_wptr;
|
||||
int m_soundbuf_rptr;
|
||||
uint8_t m_soundbuf_data[32];
|
||||
u8 m_soundbuf_data[32];
|
||||
bool m_soundbuf_empty;
|
||||
//uint8_t m_sound_flag[2];
|
||||
//u8 m_sound_flag[2];
|
||||
|
||||
/* game specific */
|
||||
// sailormn
|
||||
int m_sailormn_tilebank;
|
||||
// korokoro
|
||||
uint16_t m_leds[2];
|
||||
u16 m_leds[2];
|
||||
int m_hopper;
|
||||
// ppsatan
|
||||
uint16_t m_ppsatan_io_mux;
|
||||
u16 m_ppsatan_io_mux;
|
||||
|
||||
/* devices */
|
||||
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_right;
|
||||
optional_device<eeprom_serial_93cxx_device> m_eeprom;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
optional_device_array<gfxdecode_device, 4> m_gfxdecode;
|
||||
optional_device_array<screen_device, 4> m_screen;
|
||||
optional_device_array<palette_device, 4> m_palette;
|
||||
optional_device<generic_latch_16_device> m_soundlatch;
|
||||
optional_device<timer_device> m_startup;
|
||||
output_finder<9> m_led_outputs;
|
||||
@ -295,12 +301,12 @@ private:
|
||||
int m_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 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_donpachi(int chip);
|
||||
void sprite_init();
|
||||
void sprite_init(int chip);
|
||||
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_zb(int chip, const sprite_cave *sprite);
|
||||
|
@ -59,110 +59,6 @@ Note: if MAME_DEBUG is defined, pressing:
|
||||
#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
|
||||
@ -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)
|
||||
{
|
||||
uint16_t *VRAM = m_vram[Chip];
|
||||
int TDIM = m_tiledim[Chip];
|
||||
uint32_t code, color, pri, tile;
|
||||
u16 *VRAM = m_vram[Chip];
|
||||
const bool TDIM = m_tiledim[Chip];
|
||||
u32 code, color, pri, tile;
|
||||
|
||||
if (TDIM)
|
||||
{
|
||||
@ -214,7 +110,7 @@ TILE_GET_INFO_MEMBER(cave_state::get_tile_info)
|
||||
code = (code & 0x00ffffff);
|
||||
}
|
||||
|
||||
SET_TILE_INFO_MEMBER(Chip, code, color, 0 );
|
||||
SET_TILE_INFO_MEMBER(Gfx, code, color, 0);
|
||||
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)
|
||||
{
|
||||
uint32_t code, color, pri;
|
||||
u32 code, color, pri;
|
||||
|
||||
if (m_tiledim[2])
|
||||
{
|
||||
uint32_t tile;
|
||||
u32 tile;
|
||||
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];
|
||||
|
||||
@ -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[1] = nullptr;
|
||||
m_tilemap[2] = nullptr;
|
||||
m_tilemap[3] = nullptr;
|
||||
|
||||
m_tiledim[0] = 0;
|
||||
m_tiledim[1] = 0;
|
||||
m_tiledim[2] = 0;
|
||||
m_tiledim[3] = 0;
|
||||
m_tiledim[0] = false;
|
||||
m_tiledim[1] = false;
|
||||
m_tiledim[2] = false;
|
||||
m_tiledim[3] = false;
|
||||
|
||||
m_old_tiledim[0] = 0;
|
||||
m_old_tiledim[1] = 0;
|
||||
m_old_tiledim[2] = 0;
|
||||
m_old_tiledim[3] = 0;
|
||||
m_old_tiledim[0] = false;
|
||||
m_old_tiledim[1] = false;
|
||||
m_old_tiledim[2] = false;
|
||||
m_old_tiledim[3] = false;
|
||||
|
||||
assert((num >= 1) && (num <= 4));
|
||||
|
||||
switch (num)
|
||||
{
|
||||
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_scroll_rows(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]));
|
||||
|
||||
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_scroll_rows(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]));
|
||||
|
||||
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_scroll_rows(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]));
|
||||
|
||||
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_scroll_rows(1);
|
||||
m_tilemap[0]->set_scroll_cols(1);
|
||||
@ -330,7 +227,7 @@ void cave_state::vh_start( int num )
|
||||
break;
|
||||
}
|
||||
|
||||
sprite_init();
|
||||
sprite_init(0);
|
||||
|
||||
m_layers_offs_x = 0x13;
|
||||
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_f = 1;
|
||||
|
||||
m_background_pen = m_gfxdecode->gfx(0)->colorbase() +
|
||||
(m_gfxdecode->gfx(0)->colors() - 1) *
|
||||
m_gfxdecode->gfx(0)->granularity();
|
||||
m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() +
|
||||
(m_gfxdecode[0]->gfx(0)->colors() - 1) *
|
||||
m_gfxdecode[0]->gfx(0)->granularity();
|
||||
|
||||
switch (m_kludge)
|
||||
{
|
||||
@ -349,31 +246,98 @@ void cave_state::vh_start( int num )
|
||||
m_row_effect_offs_f = -1;
|
||||
break;
|
||||
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;
|
||||
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++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(cave_state,cave_1_layer){ vh_start(1); }
|
||||
VIDEO_START_MEMBER(cave_state,cave_2_layers){ vh_start(2); }
|
||||
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)
|
||||
// ddonpach esprade gaia guwange (8bpp tilemap)
|
||||
VIDEO_START_MEMBER(cave_state,ddonpach)
|
||||
{
|
||||
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 */
|
||||
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_scroll_rows(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)
|
||||
{
|
||||
chip %= 4;
|
||||
pen_t base_pal = 0;
|
||||
const uint8_t *base_gfx = m_spriteregion[chip]->base();
|
||||
int code_max = m_spriteregion[chip]->bytes() / (16*16);
|
||||
const u8 *base_gfx = m_spriteregion[chip]->base();
|
||||
const int code_max = m_spriteregion[chip]->bytes() / (16*16);
|
||||
|
||||
uint16_t *source;
|
||||
uint16_t *finish;
|
||||
sprite_cave *sprite = m_sprite[chip].get();
|
||||
|
||||
int glob_flipx = m_videoregs[chip][0] & 0x8000;
|
||||
int glob_flipy = m_videoregs[chip][1] & 0x8000;
|
||||
const int glob_flipx = m_videoregs[chip][0] & 0x8000;
|
||||
const int glob_flipy = m_videoregs[chip][1] & 0x8000;
|
||||
|
||||
int max_x = m_screen->width();
|
||||
int max_y = m_screen->height();
|
||||
|
||||
source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip];
|
||||
|
||||
finish = source + (0x4000 / 2);
|
||||
const int max_x = m_screen[chip]->width();
|
||||
const int max_y = m_screen[chip]->height();
|
||||
|
||||
const u16 *source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip];
|
||||
const u16 *finish = source + (0x4000 / 2);
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
y = source[1] << 2;
|
||||
}
|
||||
attr = source[2];
|
||||
code = source[3] + ((attr & 3) << 16);
|
||||
zoomx = source[4];
|
||||
zoomy = source[5];
|
||||
size = source[6];
|
||||
const u16 attr = source[2];
|
||||
u32 code = source[3] + ((attr & 3) << 16);
|
||||
int zoomx = source[4];
|
||||
int zoomy = source[5];
|
||||
const u16 size = source[6];
|
||||
|
||||
sprite->tile_width = ((size >> 8) & 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;
|
||||
sprite->pen_data = base_gfx + (16 * 16) * code;
|
||||
|
||||
flipx = attr & 0x0008;
|
||||
flipy = attr & 0x0004;
|
||||
int flipx = attr & 0x0008;
|
||||
int flipy = attr & 0x0004;
|
||||
|
||||
sprite->total_width = (total_width_f = sprite->tile_width * zoomx) / 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->flags = SPRITE_VISIBLE_CAVE;
|
||||
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_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)
|
||||
{
|
||||
chip %= 4;
|
||||
pen_t base_pal = 0;
|
||||
const uint8_t *base_gfx = m_spriteregion[chip]->base();
|
||||
int code_max = m_spriteregion[chip]->bytes() / (16*16);
|
||||
|
||||
uint16_t *source;
|
||||
uint16_t *finish;
|
||||
const u8 *base_gfx = m_spriteregion[chip]->base();
|
||||
const int code_max = m_spriteregion[chip]->bytes() / (16*16);
|
||||
|
||||
sprite_cave *sprite = m_sprite[chip].get();
|
||||
|
||||
int glob_flipx = m_videoregs[chip][0] & 0x8000;
|
||||
int glob_flipy = m_videoregs[chip][1] & 0x8000;
|
||||
const int glob_flipx = m_videoregs[chip][0] & 0x8000;
|
||||
const int glob_flipy = m_videoregs[chip][1] & 0x8000;
|
||||
|
||||
int max_x = m_screen->width();
|
||||
int max_y = m_screen->height();
|
||||
const int max_x = m_screen[chip]->width();
|
||||
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)
|
||||
{
|
||||
int x, y, attr, code, size, flipx, flipy;
|
||||
int y;
|
||||
|
||||
attr = source[0];
|
||||
code = source[1] + ((attr & 3) << 16);
|
||||
x = source[2] & 0x3ff;
|
||||
const u16 attr = source[0];
|
||||
u32 code = source[1] + ((attr & 3) << 16);
|
||||
int x = source[2] & 0x3ff;
|
||||
|
||||
if (m_spritetype[0] == 3) /* pwrinst2 */
|
||||
y = (source[3] + 1) & 0x3ff;
|
||||
else
|
||||
y = source[3] & 0x3ff;
|
||||
|
||||
size = source[4];
|
||||
const u16 size = source[4];
|
||||
|
||||
sprite->tile_width = sprite->total_width = ((size >> 8) & 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)
|
||||
{continue;}
|
||||
|
||||
flipx = attr & 0x0008;
|
||||
flipy = attr & 0x0004;
|
||||
int flipx = attr & 0x0008;
|
||||
int flipy = attr & 0x0004;
|
||||
|
||||
if (m_spritetype[0] == 3) /* pwrinst2 */
|
||||
{
|
||||
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
|
||||
{
|
||||
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;
|
||||
@ -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
|
||||
{
|
||||
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_screen->register_screen_bitmap(m_sprite_zbuf);
|
||||
|
||||
for (int chip = 0; chip < 4; chip++)
|
||||
{
|
||||
@ -644,7 +604,6 @@ void cave_state::sprite_init()
|
||||
|
||||
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_num_sprites));
|
||||
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)
|
||||
{
|
||||
{ /* set clip */
|
||||
int left = clip.min_x;
|
||||
int top = clip.min_y;
|
||||
int right = clip.max_x + 1;
|
||||
int bottom = clip.max_y + 1;
|
||||
const int left = clip.min_x;
|
||||
const int top = clip.min_y;
|
||||
const int right = clip.max_x + 1;
|
||||
const int bottom = clip.max_y + 1;
|
||||
|
||||
m_blit.clip_left = left;
|
||||
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 (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
|
||||
m_sprite_zbuf.fill(0, visarea);
|
||||
m_sprite_zbuf[chip].fill(0, visarea);
|
||||
}
|
||||
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 (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM))
|
||||
m_sprite_zbuf.fill(0, visarea);
|
||||
m_sprite_zbuf[chip].fill(0, visarea);
|
||||
}
|
||||
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;
|
||||
pen_t base_pen = sprite->base_pen;
|
||||
int x, y;
|
||||
uint8_t pen;
|
||||
int pitch = m_blit.line_offset * dy / 4;
|
||||
uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
const u8 *pen_data = sprite->pen_data -1 -sprite->line_offset;
|
||||
const pen_t base_pen = sprite->base_pen;
|
||||
const int pitch = m_blit.line_offset * dy / 4;
|
||||
u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
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)
|
||||
{
|
||||
xcount = xcount0;
|
||||
int xcount = xcount0;
|
||||
pen_data += sprite->line_offset * (ycount >> 16);
|
||||
ycount &= 0xffff;
|
||||
source = pen_data;
|
||||
for (x = x1; x != x2; x += dx)
|
||||
const u8 *source = pen_data;
|
||||
for (int x = x1; x != x2; x += dx)
|
||||
{
|
||||
if (xcount & 0xffff0000)
|
||||
{
|
||||
source += xcount >> 16;
|
||||
xcount &= 0xffff;
|
||||
pen = *source;
|
||||
const u8 pen = *source;
|
||||
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;
|
||||
}
|
||||
@ -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;
|
||||
pen_t base_pen = sprite->base_pen;
|
||||
int x, y;
|
||||
uint8_t pen;
|
||||
int pitch = m_blit.line_offset * dy / 4;
|
||||
uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
int pitchz = m_blit.line_offset_zbuf * dy / 2;
|
||||
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;
|
||||
const u8 *pen_data = sprite->pen_data - 1 - sprite->line_offset;
|
||||
const pen_t base_pen = sprite->base_pen;
|
||||
const int pitch = m_blit.line_offset * dy / 4;
|
||||
u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
const int pitchz = m_blit.line_offset_zbuf * dy / 2;
|
||||
u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
|
||||
const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval;
|
||||
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)
|
||||
{
|
||||
xcount = xcount0;
|
||||
int xcount = xcount0;
|
||||
pen_data += sprite->line_offset * (ycount >> 16);
|
||||
ycount &= 0xffff;
|
||||
source = pen_data;
|
||||
for (x = x1; x != x2; x += dx)
|
||||
const u8 *source = pen_data;
|
||||
for (int x = x1; x != x2; x += dx)
|
||||
{
|
||||
if (xcount & 0xffff0000)
|
||||
{
|
||||
source += xcount >> 16;
|
||||
xcount &= 0xffff;
|
||||
pen = *source;
|
||||
const u8 pen = *source;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -1068,23 +1017,20 @@ void cave_state::do_blit_32( int chip, const sprite_cave *sprite )
|
||||
}
|
||||
|
||||
{
|
||||
const uint8_t *pen_data = sprite->pen_data;
|
||||
pen_t base_pen = sprite->base_pen;
|
||||
int x, y;
|
||||
uint8_t pen;
|
||||
int pitch = m_blit.line_offset * dy / 4;
|
||||
uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
const u8 *pen_data = sprite->pen_data;
|
||||
const pen_t base_pen = sprite->base_pen;
|
||||
const int pitch = m_blit.line_offset * dy / 4;
|
||||
u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
|
||||
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;
|
||||
source = pen_data;
|
||||
for (x = x1; x != x2; x += dx)
|
||||
const u8 *source = pen_data;
|
||||
for (int x = x1; x != x2; x += dx)
|
||||
{
|
||||
pen = *source;
|
||||
const u8 pen = *source;
|
||||
if (pen)
|
||||
dest[x] = m_palette->pen_color(base_pen + pen);
|
||||
dest[x] = m_palette[chip]->pen_color(base_pen + pen);
|
||||
source++;
|
||||
}
|
||||
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;
|
||||
pen_t base_pen = sprite->base_pen;
|
||||
int x, y;
|
||||
uint8_t pen;
|
||||
int pitch = m_blit.line_offset * dy / 4;
|
||||
uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
int pitchz = m_blit.line_offset_zbuf * dy / 2;
|
||||
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;
|
||||
const u8 *pen_data = sprite->pen_data;
|
||||
const pen_t base_pen = sprite->base_pen;
|
||||
const int pitch = m_blit.line_offset * dy / 4;
|
||||
u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1);
|
||||
const int pitchz = m_blit.line_offset_zbuf * dy / 2;
|
||||
u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1);
|
||||
const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval;
|
||||
|
||||
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;
|
||||
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))
|
||||
{
|
||||
dest[x] = m_palette->pen_color(base_pen + pen);
|
||||
dest[x] = m_palette[chip]->pen_color(base_pen + pen);
|
||||
zbf[x] = pri_sp;
|
||||
}
|
||||
source++;
|
||||
@ -1296,12 +1240,11 @@ void cave_state::sprite_draw_donpachi_zbuf( int chip, int priority )
|
||||
|
||||
inline void cave_state::tilemap_draw(int chip,
|
||||
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];
|
||||
uint16_t *VRAM = m_vram[GFX];
|
||||
uint16_t *VCTRL = m_vctrl[GFX];
|
||||
int sx, sy, flipx, flipy, offs_x, offs_y, offs_row;
|
||||
const u16 *VRAM = m_vram[GFX];
|
||||
const u16 *VCTRL = m_vctrl[GFX];
|
||||
|
||||
/* Bail out if ... */
|
||||
|
||||
@ -1310,14 +1253,14 @@ inline void cave_state::tilemap_draw( int chip,
|
||||
((VCTRL[2] & 0x0010))) /* tilemap's disabled. */
|
||||
return;
|
||||
|
||||
flipx = ~VCTRL[0] & 0x8000;
|
||||
flipy = ~VCTRL[1] & 0x8000;
|
||||
const bool flipx = ~VCTRL[0] & 0x8000;
|
||||
const bool flipy = ~VCTRL[1] & 0x8000;
|
||||
TILEMAP->set_flip((flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0));
|
||||
|
||||
offs_x = m_layers_offs_x;
|
||||
offs_y = m_layers_offs_y;
|
||||
int offs_x = m_layers_offs_x;
|
||||
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
|
||||
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[3]) offs_x -= (m_tiledim[3] ? 4 : (4 + 8));
|
||||
|
||||
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 sx = VCTRL[0] - m_videoregs[chip][0] + (flipx ? (offs_x + 2) : -offs_x);
|
||||
const int sy = VCTRL[1] - m_videoregs[chip][1] + (flipy ? (offs_y + 2) : -offs_y);
|
||||
|
||||
if (VCTRL[1] & 0x4000) // row-select
|
||||
{
|
||||
rectangle clip;
|
||||
int startline, endline, vramdata0, vramdata1;
|
||||
int endline, vramdata0, vramdata1;
|
||||
|
||||
/*
|
||||
Row-select:
|
||||
@ -1346,7 +1289,7 @@ inline void cave_state::tilemap_draw( int chip,
|
||||
clip.min_x = cliprect.min_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 */
|
||||
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
|
||||
{
|
||||
int line;
|
||||
|
||||
/*
|
||||
Row-scroll:
|
||||
|
||||
@ -1368,7 +1309,7 @@ inline void cave_state::tilemap_draw( int chip,
|
||||
*/
|
||||
|
||||
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,
|
||||
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
|
||||
{
|
||||
int line;
|
||||
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,
|
||||
sx + VRAM[(0x1000+(((sy + offs_row + line) * 4) & 0x7ff)) / 2]);
|
||||
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;
|
||||
|
||||
set_pens(0);
|
||||
|
||||
m_blit.baseaddr = reinterpret_cast<uint8_t *>(bitmap.raw_pixptr(0));
|
||||
m_blit.baseaddr = reinterpret_cast<u8 *>(bitmap.raw_pixptr(0));
|
||||
m_blit.line_offset = bitmap.rowbytes();
|
||||
m_blit.baseaddr_zbuf = reinterpret_cast<uint8_t *>(m_sprite_zbuf.raw_pixptr(0));
|
||||
m_blit.line_offset_zbuf = m_sprite_zbuf.rowbytes();
|
||||
m_blit.baseaddr_zbuf = reinterpret_cast<u8 *>(m_sprite_zbuf[0].raw_pixptr(0));
|
||||
m_blit.line_offset_zbuf = m_sprite_zbuf[0].rowbytes();
|
||||
|
||||
/* 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])
|
||||
{
|
||||
@ -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 */
|
||||
m_rasflag = 0;
|
||||
for (GFX = 0; GFX < 4; GFX++)
|
||||
for (int GFX = 0; GFX < 4; 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);
|
||||
|
||||
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
|
||||
@ -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
|
||||
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);
|
||||
|
||||
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 + 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)
|
||||
return;
|
||||
|
||||
int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000;
|
||||
const int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000;
|
||||
|
||||
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)
|
||||
|
||||
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);
|
||||
|
||||
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.baseaddr = reinterpret_cast<u8 *>(bitmap.raw_pixptr(0));
|
||||
m_blit.line_offset = bitmap.rowbytes();
|
||||
m_blit.baseaddr_zbuf = reinterpret_cast<uint8_t *>(m_sprite_zbuf.raw_pixptr(0));
|
||||
m_blit.line_offset_zbuf = m_sprite_zbuf.rowbytes();
|
||||
m_blit.baseaddr_zbuf = reinterpret_cast<u8 *>(m_sprite_zbuf[chip].raw_pixptr(0));
|
||||
m_blit.line_offset_zbuf = m_sprite_zbuf[chip].rowbytes();
|
||||
|
||||
m_tiledim[chip] = m_vctrl[chip][1] & 0x2000;
|
||||
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);
|
||||
|
||||
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
|
||||
{
|
||||
@ -1612,16 +1529,16 @@ uint32_t cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rg
|
||||
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);
|
||||
}
|
||||
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);
|
||||
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);
|
||||
return screen_update_ppsatan_core(screen, bitmap, cliprect, 2);
|
||||
|
Loading…
Reference in New Issue
Block a user