From 8c91bdc05e73ac1df2e1e5e07ec76dafdc78f723 Mon Sep 17 00:00:00 2001 From: EkeEke Date: Sun, 6 Jul 2014 21:04:33 +0200 Subject: [PATCH] [Core/VDP] improved Mode 5 sprite parsing accuracy (verified on real hardware) --- core/vdp_render.c | 64 ++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/core/vdp_render.c b/core/vdp_render.c index 04b4288..67bdb08 100644 --- a/core/vdp_render.c +++ b/core/vdp_render.c @@ -3812,44 +3812,50 @@ void parse_satb_m5(int line) do { - /* Read Y position & size from internal SAT */ + /* Read Y position from internal SAT cache */ ypos = (q[link] >> im2_flag) & 0x1FF; - size = q[link + 1] >> 8; - /* Sprite height */ - height = 8 + ((size & 3) << 3); - - /* Y range */ - ypos = line - ypos; - - /* Sprite is visble on this line ? */ - if ((ypos >= 0) && (ypos < height)) + /* Check if sprite Y position has been reached */ + if (line >= ypos) { - /* Sprite overflow */ - if (count == max) + /* Read sprite size from internal SAT cache */ + size = q[link + 1] >> 8; + + /* Sprite height */ + height = 8 + ((size & 3) << 3); + + /* Y range */ + ypos = line - ypos; + + /* Check if sprite is visible on current line */ + if (ypos < height) { - status |= 0x40; - break; + /* Sprite overflow */ + if (count == max) + { + status |= 0x40; + break; + } + + /* Update sprite list (only name, attribute & xpos are parsed from VRAM) */ + object_info->attr = p[link + 2]; + object_info->xpos = p[link + 3] & 0x1ff; + object_info->ypos = ypos; + object_info->size = size & 0x0f; + + /* Increment Sprite count */ + ++count; + + /* Next sprite entry */ + object_info++; } - - /* Update sprite list (only name, attribute & xpos are parsed from VRAM) */ - object_info->attr = p[link + 2]; - object_info->xpos = p[link + 3] & 0x1ff; - object_info->ypos = ypos; - object_info->size = size & 0x0f; - - /* Increment Sprite count */ - ++count; - - /* Next sprite entry */ - object_info++; } - /* Read link data from internal SAT */ + /* Read link data from internal SAT cache */ link = (q[link + 1] & 0x7F) << 2; - /* Last sprite */ - if (link == 0) break; + /* Stop parsing if link data points to first entry (#0) or after the last entry (#64 in H32 mode, #80 in H40 mode) */ + if ((link == 0) || (link >= bitmap.viewport.w)) break; } while (--total);