mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
Merge pull request #6487 from cam900/cave_limit
cave.cpp : Implement hardware sprite limitation, Add notes
This commit is contained in:
commit
0ade8b8230
@ -255,6 +255,7 @@ private:
|
||||
|
||||
u16 m_sprite_base_pal;
|
||||
u16 m_sprite_granularity;
|
||||
u32 m_max_sprite_clk[4]; // max usable clock for sprites
|
||||
|
||||
/* misc */
|
||||
int m_time_vblank_irq;
|
||||
|
@ -162,15 +162,15 @@ VIDEO_START_MEMBER(cave_state,ppsatan)
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Sprites Drawing
|
||||
Zoomed Sprites Drawing
|
||||
|
||||
Sprite format with zoom, 16 bytes per each sprites
|
||||
|
||||
Offset: Bits: Value:
|
||||
|
||||
00.w fedc ba98 76-- ---- X Position
|
||||
---- ---- --54 3210
|
||||
00.w X Position*
|
||||
|
||||
02.w fedc ba98 76-- ---- Y Position
|
||||
---- ---- --54 3210
|
||||
02.w Y Position*
|
||||
|
||||
04.w fe-- ---- ---- ----
|
||||
--dc ba98 ---- ---- Color
|
||||
@ -189,6 +189,42 @@ VIDEO_START_MEMBER(cave_state,ppsatan)
|
||||
|
||||
0E.w Unused
|
||||
|
||||
* S.9.6 Fixed point or 10 bit signed integer,
|
||||
Configured from videoregs
|
||||
|
||||
|
||||
Sprites Drawing
|
||||
|
||||
Sprite format without zoom, 16 bytes per each sprites
|
||||
|
||||
Offset: Bits: Value:
|
||||
|
||||
00.w fe-- ---- ---- ----
|
||||
--dc ba98 ---- ---- Color
|
||||
---- ---- 76-- ----
|
||||
---- ---- --54 ---- Priority
|
||||
---- ---- ---- 3--- Flip X
|
||||
---- ---- ---- -2-- Flip Y
|
||||
---- ---- ---- --10 Code High Bit(s?)
|
||||
|
||||
02.w Code Low Bits
|
||||
|
||||
04.w fedc ba-- ---- ----
|
||||
---- --98 7654 3210 X Position**
|
||||
|
||||
06.w fedc ba-- ---- ----
|
||||
---- --98 7654 3210 Y Position**
|
||||
|
||||
08.w fedc ba98 ---- ---- Tile Size X
|
||||
---- ---- 7654 3210 Tile Size Y
|
||||
|
||||
0A.w Unused
|
||||
|
||||
0C.w Unused
|
||||
|
||||
0E.w Unused
|
||||
|
||||
** 10 bit signed only? need verifications.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
@ -211,9 +247,14 @@ void cave_state::get_sprite_info_cave(int chip)
|
||||
|
||||
const u16 *source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip];
|
||||
const u16 *finish = source + (0x4000 / 2);
|
||||
u32 clk = 0; // used clock cycle for sprites
|
||||
|
||||
for (; source < finish; source += 8)
|
||||
{
|
||||
clk += 32; // 32 clock per each sprites
|
||||
if (clk > m_max_sprite_clk[chip])
|
||||
break;
|
||||
|
||||
int x, y;
|
||||
int total_width_f, total_height_f;
|
||||
|
||||
@ -239,6 +280,10 @@ void cave_state::get_sprite_info_cave(int chip)
|
||||
if (!sprite->tile_width || !sprite->tile_height)
|
||||
continue;
|
||||
|
||||
clk += sprite->tile_width * sprite->tile_height; // 256 clock per each sprite blocks
|
||||
if (clk > m_max_sprite_clk[chip])
|
||||
break;
|
||||
|
||||
/* Bound checking */
|
||||
code %= code_max;
|
||||
sprite->pen_data = base_gfx + (16 * 16) * code;
|
||||
@ -334,9 +379,14 @@ void cave_state::get_sprite_info_donpachi(int chip)
|
||||
|
||||
const u16 *source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip];
|
||||
const u16 *finish = source + (0x4000 / 2);
|
||||
u32 clk = 0; // used clock cycle for sprites
|
||||
|
||||
for (; source < finish; source += 8)
|
||||
{
|
||||
clk += 32; // 32 clock per each sprites
|
||||
if (clk > m_max_sprite_clk[chip])
|
||||
break;
|
||||
|
||||
int y;
|
||||
|
||||
const u16 attr = source[0];
|
||||
@ -364,6 +414,10 @@ 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;}
|
||||
|
||||
clk += sprite->tile_width * sprite->tile_height; // 256 clock per each sprite blocks
|
||||
if (clk > m_max_sprite_clk[chip])
|
||||
break;
|
||||
|
||||
int flipx = attr & 0x0008;
|
||||
int flipy = attr & 0x0004;
|
||||
|
||||
@ -422,8 +476,20 @@ void cave_state::sprite_init()
|
||||
|
||||
for (int chip = 0; chip < 4; chip++)
|
||||
{
|
||||
m_max_sprite_clk[chip] = 0;
|
||||
if (m_videoregs[chip])
|
||||
{
|
||||
for (int screen = 0; screen < 4; screen++)
|
||||
{
|
||||
if (m_screen[screen])
|
||||
{
|
||||
const u32 new_clk = (m_screen[screen]->visible_area().width() > 360 ? 512 : 448) * 272 * 2; // whole screen size related?
|
||||
if (m_max_sprite_clk[chip] < new_clk)
|
||||
{
|
||||
m_max_sprite_clk[chip] = new_clk;
|
||||
}
|
||||
}
|
||||
}
|
||||
m_num_sprites[chip] = m_spriteram[chip].bytes() / 0x10 / 2;
|
||||
m_sprite[chip] = std::make_unique<sprite_cave []>(m_num_sprites[chip]);
|
||||
}
|
||||
@ -840,7 +906,8 @@ void cave_state::do_blit_32(int chip, const sprite_cave *sprite)
|
||||
return;
|
||||
y1--; y2--;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
y1 = sprite->y;
|
||||
y2 = y1 + sprite->total_height;
|
||||
dy = 1;
|
||||
@ -1038,7 +1105,7 @@ void cave_state::sprite_draw_donpachi_zbuf(int chip, int priority)
|
||||
Screen Drawing
|
||||
|
||||
|
||||
Layers Control Registers (cave_vctrl_0..2)
|
||||
Layers Control Registers (vctrl_0..3)
|
||||
|
||||
|
||||
Offset: Bits: Value:
|
||||
@ -1069,7 +1136,7 @@ void cave_state::sprite_draw_donpachi_zbuf(int chip, int priority)
|
||||
Row-scroll: a different scroll value is specified for each scan line.
|
||||
|
||||
|
||||
Sprites Registers (cave_videoregs)
|
||||
Sprites Registers (videoregs)
|
||||
|
||||
|
||||
Offset: Bits: Value:
|
||||
@ -1338,6 +1405,7 @@ void cave_state::get_sprite_info(int chip)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cave_state::device_post_load()
|
||||
{
|
||||
for (int chip = 0; chip < 4; chip++)
|
||||
|
Loading…
Reference in New Issue
Block a user