mirror of
https://github.com/holub/mame
synced 2025-07-03 17:08:39 +03:00
315_5124.c: Improvement to timing for calculating flags. Fixes random hangs in gamegear 'roboterm' and flickering in gamegear 'evander'. [Enik Land]
This commit is contained in:
parent
df7075c189
commit
e51f93187c
@ -70,12 +70,10 @@ PAL frame timing
|
|||||||
#define SPROVR_HPOS 23
|
#define SPROVR_HPOS 23
|
||||||
#define SPRCOL_BASEHPOS 59
|
#define SPRCOL_BASEHPOS 59
|
||||||
#define X_SCROLL_HPOS 21
|
#define X_SCROLL_HPOS 21
|
||||||
|
#define DISPLAY_DISABLED_HPOS 17 /* fixes 'fantdizzy' (SMS PAL game) flicker */
|
||||||
|
#define DISPLAY_CB_HPOS 0
|
||||||
|
|
||||||
/* Display callback delay that fixes a flicker issue at top of screen when
|
#define DRAW_TIME_GG 86 /* 1 + 2 + 14 + 8 + 122/2 */
|
||||||
playing 'fantdizzy' (SMS PAL game), due to time when display is disabled. */
|
|
||||||
#define DISPLAY_CB_HPOS 6
|
|
||||||
|
|
||||||
#define DRAW_TIME_GG 86 /* 1 + 2 + 14 + 8 + 96/2 */
|
|
||||||
#define DRAW_TIME_SMS 25 /* 1 + 2 + 14 + 8 */
|
#define DRAW_TIME_SMS 25 /* 1 + 2 + 14 + 8 */
|
||||||
|
|
||||||
#define PRIORITY_BIT 0x1000
|
#define PRIORITY_BIT 0x1000
|
||||||
@ -368,9 +366,6 @@ void sega315_5124_device::process_line_timer()
|
|||||||
|
|
||||||
m_display_disabled = !(m_reg[0x01] & 0x40);
|
m_display_disabled = !(m_reg[0x01] & 0x40);
|
||||||
|
|
||||||
/* Activate flags that were pending until the end of previous line. */
|
|
||||||
check_pending_flags(m_screen->width());
|
|
||||||
|
|
||||||
/* Check if we're on the last line of a frame */
|
/* Check if we're on the last line of a frame */
|
||||||
if (vpos == vpos_limit - 1)
|
if (vpos == vpos_limit - 1)
|
||||||
{
|
{
|
||||||
@ -546,8 +541,21 @@ READ8_MEMBER( sega315_5124_device::vram_read )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sega315_5124_device::check_pending_flags( int hpos )
|
void sega315_5124_device::check_pending_flags()
|
||||||
{
|
{
|
||||||
|
const attotime current_time = machine().time();
|
||||||
|
int hpos;
|
||||||
|
|
||||||
|
if (current_time < m_line_end_time)
|
||||||
|
{
|
||||||
|
hpos = m_screen->hpos();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hpos = m_screen->width();
|
||||||
|
m_line_end_time = current_time + m_screen->time_until_pos(m_screen->vpos(), hpos);
|
||||||
|
}
|
||||||
|
|
||||||
if ((m_pending_status & STATUS_HINT) && hpos >= HINT_HPOS)
|
if ((m_pending_status & STATUS_HINT) && hpos >= HINT_HPOS)
|
||||||
{
|
{
|
||||||
m_pending_status &= ~STATUS_HINT;
|
m_pending_status &= ~STATUS_HINT;
|
||||||
@ -576,7 +584,7 @@ READ8_MEMBER( sega315_5124_device::register_read )
|
|||||||
{
|
{
|
||||||
UINT8 temp;
|
UINT8 temp;
|
||||||
|
|
||||||
check_pending_flags(m_screen->hpos());
|
check_pending_flags();
|
||||||
temp = m_status;
|
temp = m_status;
|
||||||
|
|
||||||
if ( !space.debugger_access() )
|
if ( !space.debugger_access() )
|
||||||
@ -631,7 +639,7 @@ WRITE8_MEMBER( sega315_5124_device::register_write )
|
|||||||
int reg_num;
|
int reg_num;
|
||||||
int hpos = m_screen->hpos();
|
int hpos = m_screen->hpos();
|
||||||
|
|
||||||
check_pending_flags(hpos);
|
check_pending_flags();
|
||||||
|
|
||||||
if (m_pending_reg_write == 0)
|
if (m_pending_reg_write == 0)
|
||||||
{
|
{
|
||||||
@ -665,6 +673,9 @@ WRITE8_MEMBER( sega315_5124_device::register_write )
|
|||||||
if (reg_num == 0 || reg_num == 1)
|
if (reg_num == 0 || reg_num == 1)
|
||||||
set_display_settings();
|
set_display_settings();
|
||||||
|
|
||||||
|
if (reg_num == 1 && hpos <= DISPLAY_DISABLED_HPOS)
|
||||||
|
m_display_disabled = !(m_reg[0x01] & 0x40);
|
||||||
|
|
||||||
if (reg_num == 8 && hpos <= X_SCROLL_HPOS)
|
if (reg_num == 8 && hpos <= X_SCROLL_HPOS)
|
||||||
m_reg8copy = m_reg[0x08];
|
m_reg8copy = m_reg[0x08];
|
||||||
|
|
||||||
@ -1815,6 +1826,7 @@ void sega315_5124_device::device_start()
|
|||||||
save_item(NAME(m_tmpbitmap));
|
save_item(NAME(m_tmpbitmap));
|
||||||
save_item(NAME(m_y1_bitmap));
|
save_item(NAME(m_y1_bitmap));
|
||||||
save_item(NAME(m_draw_time));
|
save_item(NAME(m_draw_time));
|
||||||
|
save_item(NAME(m_line_end_time));
|
||||||
save_item(NAME(m_sprite_base));
|
save_item(NAME(m_sprite_base));
|
||||||
save_item(NAME(m_selected_sprite));
|
save_item(NAME(m_selected_sprite));
|
||||||
save_item(NAME(m_sprite_count));
|
save_item(NAME(m_sprite_count));
|
||||||
@ -1853,6 +1865,7 @@ void sega315_5124_device::device_reset()
|
|||||||
m_line_counter = 0;
|
m_line_counter = 0;
|
||||||
m_hcounter = 0;
|
m_hcounter = 0;
|
||||||
m_draw_time = DRAW_TIME_SMS;
|
m_draw_time = DRAW_TIME_SMS;
|
||||||
|
m_line_end_time = machine().time() + m_screen->time_until_pos(m_screen->vpos(), m_screen->width());
|
||||||
|
|
||||||
for (i = 0; i < 0x20; i++)
|
for (i = 0; i < 0x20; i++)
|
||||||
m_current_palette[i] = 0;
|
m_current_palette[i] = 0;
|
||||||
|
@ -99,7 +99,7 @@ protected:
|
|||||||
void draw_scanline_mode2( int *line_buffer, int line );
|
void draw_scanline_mode2( int *line_buffer, int line );
|
||||||
void draw_scanline_mode0( int *line_buffer, int line );
|
void draw_scanline_mode0( int *line_buffer, int line );
|
||||||
void select_sprites( int line );
|
void select_sprites( int line );
|
||||||
void check_pending_flags( int hpos );
|
void check_pending_flags();
|
||||||
|
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
virtual void device_start();
|
virtual void device_start();
|
||||||
@ -129,6 +129,7 @@ protected:
|
|||||||
int m_vdp_mode; /* Current mode of the VDP: 0,1,2,3,4 */
|
int m_vdp_mode; /* Current mode of the VDP: 0,1,2,3,4 */
|
||||||
int m_y_pixels; /* 192, 224, 240 */
|
int m_y_pixels; /* 192, 224, 240 */
|
||||||
int m_draw_time;
|
int m_draw_time;
|
||||||
|
attotime m_line_end_time;
|
||||||
UINT8 m_line_counter;
|
UINT8 m_line_counter;
|
||||||
UINT8 m_hcounter;
|
UINT8 m_hcounter;
|
||||||
memory_region *m_CRAM; /* Pointer to CRAM */
|
memory_region *m_CRAM; /* Pointer to CRAM */
|
||||||
|
Loading…
Reference in New Issue
Block a user