mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
Improved SMPC timings
This commit is contained in:
parent
db2be28f99
commit
28454d8e38
@ -694,23 +694,20 @@ static void smpc_comreg_exec(address_space &space, UINT8 data, UINT8 is_stv)
|
||||
case 0x02:
|
||||
case 0x03:
|
||||
if(LOG_SMPC) printf ("SMPC: Slave %s %d %d\n",(data & 1) ? "off" : "on",space.machine().primary_screen->hpos(),space.machine().primary_screen->vpos());
|
||||
if((data & 1) != (state->m_smpc.slave_on & 1))
|
||||
space.machine().scheduler().timer_set(attotime::from_usec(100), FUNC(smpc_slave_enable),data & 1);
|
||||
else /* guess: if Slave state is equal to the previous one, just execute less code. ask Greatest Nine '97. Unless SMPC is really so fast ... */
|
||||
space.machine().scheduler().timer_set(attotime::from_usec(5), FUNC(smpc_slave_enable),data & 1);
|
||||
space.machine().scheduler().timer_set(attotime::from_usec(15), FUNC(smpc_slave_enable),data & 1);
|
||||
break;
|
||||
case 0x06:
|
||||
case 0x07:
|
||||
if(LOG_SMPC) printf ("SMPC: Sound %s\n",(data & 1) ? "off" : "on");
|
||||
|
||||
if(!is_stv)
|
||||
space.machine().scheduler().timer_set(attotime::from_usec(100), FUNC(smpc_sound_enable),data & 1);
|
||||
space.machine().scheduler().timer_set(attotime::from_usec(15), FUNC(smpc_sound_enable),data & 1);
|
||||
break;
|
||||
/*CD (SH-1) ON/OFF */
|
||||
case 0x08:
|
||||
case 0x09:
|
||||
printf ("SMPC: CD %s\n",(data & 1) ? "off" : "on");
|
||||
space.machine().scheduler().timer_set(attotime::from_usec(40), FUNC(smpc_cd_enable),data & 1);
|
||||
space.machine().scheduler().timer_set(attotime::from_usec(20), FUNC(smpc_cd_enable),data & 1);
|
||||
break;
|
||||
case 0x0d:
|
||||
if(LOG_SMPC) printf ("SMPC: System Reset\n");
|
||||
@ -742,11 +739,12 @@ static void smpc_comreg_exec(address_space &space, UINT8 data, UINT8 is_stv)
|
||||
|
||||
int timing;
|
||||
|
||||
timing = 100;
|
||||
timing = 8;
|
||||
|
||||
if(state->m_smpc.IREG[0] != 0) // non-peripheral data
|
||||
timing += 100;
|
||||
timing += 8;
|
||||
|
||||
/* TODO: At vblank-out actually ... */
|
||||
if(state->m_smpc.IREG[1] & 8) // peripheral data
|
||||
timing += 700;
|
||||
|
||||
@ -784,6 +782,7 @@ static void smpc_comreg_exec(address_space &space, UINT8 data, UINT8 is_stv)
|
||||
break;
|
||||
case 0x19:
|
||||
case 0x1a:
|
||||
/* TODO: timing */
|
||||
if(LOG_SMPC) printf ("SMPC: NMI %sable %d %d\n",data & 1 ? "Dis" : "En",space.machine().primary_screen->hpos(),space.machine().primary_screen->vpos());
|
||||
space.machine().scheduler().timer_set(attotime::from_usec(100), FUNC(smpc_nmi_set),data & 1);
|
||||
break;
|
||||
|
@ -2007,6 +2007,9 @@ bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09
|
||||
| -- | -- | -- | -- | -- | -- | -- | -- |
|
||||
\----------|----------|----------|----------|----------|----------|----------|---------*/
|
||||
|
||||
#define STV_VDP2_CCRLB (m_vdp2_regs[0x10e/2])
|
||||
|
||||
|
||||
/* 180110 - Colour Offset Enable
|
||||
bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
|
||||
| -- | -- | -- | -- | -- | -- | -- | -- |
|
||||
@ -6043,7 +6046,7 @@ int saturn_state::get_vcounter( void )
|
||||
return (vcount & ~1) | (machine().primary_screen->frame_number() & 1);
|
||||
|
||||
/* docs says << 1, but according to HW tests it's a typo. */
|
||||
return (vcount & 0x1ff); // Non-interlace
|
||||
return (true_vcount[vcount & 0x1ff][STV_VDP2_VRES]); // Non-interlace
|
||||
}
|
||||
|
||||
void saturn_state::stv_vdp2_state_save_postload( void )
|
||||
@ -6115,6 +6118,7 @@ int saturn_state::stv_vdp2_start ( void )
|
||||
/* maybe we should move this to video/stv.c */
|
||||
VIDEO_START_MEMBER(saturn_state,stv_vdp2)
|
||||
{
|
||||
int i;
|
||||
machine().primary_screen->register_screen_bitmap(m_tmpbitmap);
|
||||
stv_vdp2_start();
|
||||
stv_vdp1_start();
|
||||
@ -6123,6 +6127,29 @@ VIDEO_START_MEMBER(saturn_state,stv_vdp2)
|
||||
machine().gfx[1]->set_source(m_vdp2.gfx_decode);
|
||||
machine().gfx[2]->set_source(m_vdp2.gfx_decode);
|
||||
machine().gfx[3]->set_source(m_vdp2.gfx_decode);
|
||||
|
||||
/* calc V counter offsets */
|
||||
/* 224 mode */
|
||||
for(i=0;i<263;i++)
|
||||
{
|
||||
true_vcount[i][0] = i;
|
||||
if(i>0xec)
|
||||
true_vcount[i][0]+=0xf9;
|
||||
}
|
||||
|
||||
for(i=0;i<263;i++)
|
||||
{
|
||||
true_vcount[i][1] = i;
|
||||
if(i>0xf5)
|
||||
true_vcount[i][1]+=0xf9;
|
||||
}
|
||||
|
||||
/* 256 mode, todo */
|
||||
for(i=0;i<263;i++)
|
||||
{
|
||||
true_vcount[i][2] = i;
|
||||
true_vcount[i][3] = i;
|
||||
}
|
||||
}
|
||||
|
||||
void saturn_state::stv_vdp2_dynamic_res_change( void )
|
||||
|
@ -358,6 +358,7 @@ public:
|
||||
void stv_vdp2_draw_NBG3(bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
void stv_vdp2_draw_RBG0(bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 pri);
|
||||
int true_vcount[263][4];
|
||||
|
||||
void stv_vdp2_state_save_postload( void );
|
||||
void stv_vdp2_exit ( void );
|
||||
|
Loading…
Reference in New Issue
Block a user