From 71646f871dcc45a6a0cb98dfa392b2aca12846ae Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Sat, 21 May 2011 18:48:23 +0000 Subject: [PATCH] Boosted m/sinit comms in Super Major League / Final Arch, fixing the dead locks in it [Angelo Salese] --- src/mame/drivers/saturn.c | 38 ++++++------ src/mame/drivers/stvinit.c | 118 +++++++++++++++++++++++++++---------- src/mame/includes/stv.h | 4 ++ 3 files changed, 112 insertions(+), 48 deletions(-) diff --git a/src/mame/drivers/saturn.c b/src/mame/drivers/saturn.c index c4dc413e5ba..6d253c6726b 100644 --- a/src/mame/drivers/saturn.c +++ b/src/mame/drivers/saturn.c @@ -213,8 +213,6 @@ static void scu_dma_direct(address_space *space, UINT8 dma_ch); /*DMA level 0 di static void scu_dma_indirect(address_space *space, UINT8 dma_ch); /*DMA level 0 indirect transfer function*/ -int minit_boost,sinit_boost; -attotime minit_boost_timeslice, sinit_boost_timeslice; //static int scanline; @@ -1734,9 +1732,9 @@ static void scu_dma_indirect(address_space *space,UINT8 dma_ch) } #endif - printf("DMA lv %d indirect mode transfer START\n" + if(LOG_SCU) printf("DMA lv %d indirect mode transfer START\n" "Start %08x End %08x Size %04x\n",dma_ch,state->m_scu_src[dma_ch],state->m_scu_dst[dma_ch],state->m_scu_size[dma_ch]); - printf("Start Add %04x Destination Add %04x\n",state->m_scu_src_add[dma_ch],state->m_scu_dst_add[dma_ch]); + if(LOG_SCU) printf("Start Add %04x Destination Add %04x\n",state->m_scu_src_add[dma_ch],state->m_scu_dst_add[dma_ch]); //guess,but I believe it's right. state->m_scu_src[dma_ch] &=0x07ffffff; @@ -1803,17 +1801,21 @@ static READ16_HANDLER( saturn_soundram_r ) /* communication,SLAVE CPU acquires data from the MASTER CPU and triggers an irq. */ static WRITE32_HANDLER( minit_w ) { + saturn_state *state = space->machine().driver_data(); + logerror("cpu %s (PC=%08X) MINIT write = %08x\n", space->device().tag(), cpu_get_pc(&space->device()),data); - space->machine().scheduler().boost_interleave(minit_boost_timeslice, attotime::from_usec(minit_boost)); + space->machine().scheduler().boost_interleave(state->m_minit_boost_timeslice, attotime::from_usec(state->m_minit_boost)); space->machine().scheduler().trigger(1000); - sh2_set_frt_input(space->machine().device("slave"), PULSE_LINE); + sh2_set_frt_input(state->m_slave, PULSE_LINE); } static WRITE32_HANDLER( sinit_w ) { + saturn_state *state = space->machine().driver_data(); + logerror("cpu %s (PC=%08X) SINIT write = %08x\n", space->device().tag(), cpu_get_pc(&space->device()),data); - space->machine().scheduler().boost_interleave(sinit_boost_timeslice, attotime::from_usec(sinit_boost)); - sh2_set_frt_input(space->machine().device("maincpu"), PULSE_LINE); + space->machine().scheduler().boost_interleave(state->m_sinit_boost_timeslice, attotime::from_usec(state->m_sinit_boost)); + sh2_set_frt_input(state->m_maincpu, PULSE_LINE); } static READ32_HANDLER(saturn_backupram_r) @@ -2330,10 +2332,10 @@ DRIVER_INIT ( stv ) machine.base_datetime(systime); /* amount of time to boost interleave for on MINIT / SINIT, needed for communication to work */ - minit_boost = 400; - sinit_boost = 400; - minit_boost_timeslice = attotime::zero; - sinit_boost_timeslice = attotime::zero; + state->m_minit_boost = 400; + state->m_sinit_boost = 400; + state->m_minit_boost_timeslice = attotime::zero; + state->m_sinit_boost_timeslice = attotime::zero; state->m_smpc_ram = auto_alloc_array(machine, UINT8, 0x80); state->m_scu_regs = auto_alloc_array(machine, UINT32, 0x100/4); @@ -3116,10 +3118,10 @@ static void saturn_init_driver(running_machine &machine, int rgn) machine.current_datetime(systime); /* amount of time to boost interleave for on MINIT / SINIT, needed for communication to work */ - minit_boost = 400; - sinit_boost = 400; - minit_boost_timeslice = attotime::zero; - sinit_boost_timeslice = attotime::zero; + state->m_minit_boost = 400; + state->m_sinit_boost = 400; + state->m_minit_boost_timeslice = attotime::zero; + state->m_sinit_boost_timeslice = attotime::zero; state->m_smpc_ram = auto_alloc_array(machine, UINT8, 0x80); state->m_scu_regs = auto_alloc_array(machine, UINT32, 0x100/4); @@ -4402,6 +4404,8 @@ GAME( 1998, sss, stvbios, stv, stv, sss, ROT0, "Capcom / Cave GAME( 1995, sandor, stvbios, stv, stv, sandor, ROT0, "Sega", "Puzzle & Action: Sando-R (J 951114 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAME( 1997, thunt, sandor, stv, stv, thunt, ROT0, "Sega", "Puzzle & Action: Treasure Hunt (JUET 970901 V2.00E)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAME( 1997, thuntk, sandor, stv, stv, sandor, ROT0, "Sega / Deniam", "Puzzle & Action: BoMulEul Chajara (JUET 970125 V2.00K)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAME( 1995, smleague, stvbios, stv, stv, smleague, ROT0, "Sega", "Super Major League (U 960108 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAME( 1995, finlarch, smleague,stv, stv, finlarch, ROT0, "Sega", "Final Arch (J 950714 V1.001)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAME( 1996, sokyugrt, stvbios, stv, stv, sokyugrt, ROT0, "Raizing / Eighting", "Soukyugurentai / Terra Diver (JUET 960821 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAME( 1995, suikoenb, stvbios, stv, stv, suikoenb, ROT0, "Data East", "Suikoenbu / Outlaws of the Lost Dynasty (JUETL 950314 V2.001)", GAME_IMPERFECT_SOUND ) GAME( 1996, vfkids, stvbios, stv, stv, stv, ROT0, "Sega", "Virtua Fighter Kids (JUET 960319 V0.000)", GAME_IMPERFECT_SOUND ) @@ -4411,8 +4415,6 @@ GAME( 1997, znpwfv, stvbios, stv, stv, znpwfv, ROT0, "Sega", /* Almost */ GAME( 1997, vmahjong, stvbios, stv, stvmp, stv, ROT0, "Micronet", "Virtual Mahjong (J 961214 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAME( 1998, twcup98, stvbios, stv, stv, twcup98, ROT0, "Tecmo", "Tecmo World Cup '98 (JUET 980410 V1.000)", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS|GAME_NOT_WORKING ) // player movement -GAME( 1995, smleague, stvbios, stv, stv, smleague, ROT0, "Sega", "Super Major League (U 960108 V1.000)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) -GAME( 1995, finlarch, smleague,stv, stv, finlarch, ROT0, "Sega", "Final Arch (J 950714 V1.001)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAME( 1998, elandore, stvbios, stv, stv, elandore, ROT0, "Sai-Mate", "Touryuu Densetsu Elan-Doree / Elan Doree - Legend of Dragoon (JUET 980922 V1.006)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) /* Unemulated printer device */ diff --git a/src/mame/drivers/stvinit.c b/src/mame/drivers/stvinit.c index 0af38136c61..c163c64b8e4 100644 --- a/src/mame/drivers/stvinit.c +++ b/src/mame/drivers/stvinit.c @@ -105,6 +105,8 @@ DRIVER_INIT(prikura) (loops for 263473 instructions) */ + saturn_state *state = machine.driver_data(); + // master sh2drc_add_pcflush(machine.device("maincpu"), 0x6018640); // slave @@ -112,8 +114,8 @@ DRIVER_INIT(prikura) DRIVER_INIT_CALL(stv); - minit_boost = sinit_boost = 0; - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost = state->m_sinit_boost = 0; + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(hanagumi) @@ -161,14 +163,16 @@ CPU0: Aids Screen DRIVER_INIT(puyosun) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6021cf0); sh2drc_add_pcflush(machine.device("slave"), 0x60236fe); DRIVER_INIT_CALL(stv); - minit_boost = sinit_boost = 0; - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost = state->m_sinit_boost = 0; + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } /* mausuke @@ -183,32 +187,38 @@ CPU0 Data East Logo: DRIVER_INIT(mausuke) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x60461A0); DRIVER_INIT_CALL(stv); - minit_boost = sinit_boost = 0; - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost = state->m_sinit_boost = 0; + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(cottonbm) { + saturn_state *state = machine.driver_data(); + // sh2drc_add_pcflush(machine.device("maincpu"), 0x6030ee2); // sh2drc_add_pcflush(machine.device("slave"), 0x6032b52); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(10); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(10); } DRIVER_INIT(cotton2) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6031c7a); sh2drc_add_pcflush(machine.device("slave"), 0x60338ea); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(dnmtdeka) @@ -250,6 +260,8 @@ DRIVER_INIT(fhboxers) DRIVER_INIT( groovef ) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6005e7c); sh2drc_add_pcflush(machine.device("maincpu"), 0x6005e86); sh2drc_add_pcflush(machine.device("maincpu"), 0x60a4970); @@ -258,19 +270,21 @@ DRIVER_INIT( groovef ) DRIVER_INIT_CALL(stv); - minit_boost = sinit_boost = 0; - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost = state->m_sinit_boost = 0; + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT( danchih ) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6028b28); sh2drc_add_pcflush(machine.device("maincpu"), 0x6028c8e); sh2drc_add_pcflush(machine.device("slave"), 0x602ae26); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(5); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(5); } /* @@ -319,87 +333,105 @@ DRIVER_INIT( astrass ) DRIVER_INIT(thunt) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x602A024); sh2drc_add_pcflush(machine.device("maincpu"), 0x6013EEA); sh2drc_add_pcflush(machine.device("slave"), 0x602AAF8); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(1); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(1); } DRIVER_INIT(sandor) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x602a0f8); sh2drc_add_pcflush(machine.device("maincpu"), 0x6013fbe); sh2drc_add_pcflush(machine.device("slave"), 0x602abcc); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(1); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(1); } DRIVER_INIT(grdforce) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6041e32); sh2drc_add_pcflush(machine.device("slave"), 0x6043aa2); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(batmanfr) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x60121c0); sh2drc_add_pcflush(machine.device("slave"), 0x60125bc); DRIVER_INIT_CALL(stv); - minit_boost = sinit_boost = 0; - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost = state->m_sinit_boost = 0; + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(colmns97) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("slave"), 0x60298a2); DRIVER_INIT_CALL(stv); - minit_boost = sinit_boost = 0; + state->m_minit_boost = state->m_sinit_boost = 0; } DRIVER_INIT(winterht) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6098aea); sh2drc_add_pcflush(machine.device("slave"), 0x609ae4e); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(2); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(2); } DRIVER_INIT(seabass) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x602cbfa); sh2drc_add_pcflush(machine.device("slave"), 0x60321ee); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(5); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(5); } DRIVER_INIT(vfremix) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x602c30c); sh2drc_add_pcflush(machine.device("slave"), 0x604c332); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(20); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(20); } DRIVER_INIT(sss) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6026398); sh2drc_add_pcflush(machine.device("slave"), 0x6028cd6); @@ -407,26 +439,30 @@ DRIVER_INIT(sss) DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(othellos) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x602bcbe); sh2drc_add_pcflush(machine.device("slave"), 0x602d92e); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(sasissu) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("slave"), 0x60710be); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(2); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(2); } DRIVER_INIT(gaxeduel) @@ -446,56 +482,74 @@ DRIVER_INIT(suikoenb) DRIVER_INIT(sokyugrt) { + saturn_state *state = machine.driver_data(); + DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(znpwfv) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6012ec2); sh2drc_add_pcflush(machine.device("slave"), 0x60175a6); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_nsec(500); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_nsec(500); } DRIVER_INIT(twcup98) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x605edde); sh2drc_add_pcflush(machine.device("slave"), 0x6062bca); DRIVER_INIT_CALL(stv); install_twcup98_protection(machine); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(5); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(5); } DRIVER_INIT(smleague) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6063bf4); sh2drc_add_pcflush(machine.device("slave"), 0x6062bca); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + /* tight sync to avoid dead locks */ + state->m_minit_boost = state->m_sinit_boost = 0; + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(5000); } DRIVER_INIT(finlarch) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6064d60); DRIVER_INIT_CALL(stv); + + /* tight sync to avoid dead locks */ + state->m_minit_boost = state->m_sinit_boost = 0; + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(5000); } DRIVER_INIT(maruchan) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x601ba46); sh2drc_add_pcflush(machine.device("slave"), 0x601ba46); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(50); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(50); } DRIVER_INIT(pblbeach) @@ -514,17 +568,21 @@ DRIVER_INIT(shanhigw) DRIVER_INIT(elandore) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x604eac0); sh2drc_add_pcflush(machine.device("slave"), 0x605340a); install_elandore_protection(machine); DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(0); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(0); } DRIVER_INIT(rsgun) { + saturn_state *state = machine.driver_data(); + sh2drc_add_pcflush(machine.device("maincpu"), 0x6034d04); sh2drc_add_pcflush(machine.device("slave"), 0x6036152); @@ -532,7 +590,7 @@ DRIVER_INIT(rsgun) DRIVER_INIT_CALL(stv); - minit_boost_timeslice = sinit_boost_timeslice = attotime::from_usec(20); + state->m_minit_boost_timeslice = state->m_sinit_boost_timeslice = attotime::from_usec(20); } DRIVER_INIT(ffreveng) diff --git a/src/mame/includes/stv.h b/src/mame/includes/stv.h index e1c545e69f4..9e36e2b8582 100644 --- a/src/mame/includes/stv.h +++ b/src/mame/includes/stv.h @@ -23,6 +23,10 @@ public: UINT32 m_scu_index[3]; UINT8 m_stv_multi_bank; UINT8 m_prev_bankswitch; + int m_minit_boost; + int m_sinit_boost; + attotime m_minit_boost_timeslice; + attotime m_sinit_boost_timeslice; legacy_cpu_device* m_maincpu; legacy_cpu_device* m_slave;