diff --git a/src/emu/machine/smpc.c b/src/emu/machine/smpc.c index c1633353fe7..ff0713a73a6 100644 --- a/src/emu/machine/smpc.c +++ b/src/emu/machine/smpc.c @@ -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; diff --git a/src/emu/video/stvvdp2.c b/src/emu/video/stvvdp2.c index 1c6d1526593..f63dae4eabd 100644 --- a/src/emu/video/stvvdp2.c +++ b/src/emu/video/stvvdp2.c @@ -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 ) diff --git a/src/mame/includes/stv.h b/src/mame/includes/stv.h index dbc01d0a770..d50f4a86b20 100644 --- a/src/mame/includes/stv.h +++ b/src/mame/includes/stv.h @@ -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 );