Skip to content

Commit 786c5b5

Browse files
authored
-xavix: Remove system timer disable hack, try some different logic (#14586) [David Haywood]
1 parent 7257bc4 commit 786c5b5

File tree

4 files changed

+52
-27
lines changed

4 files changed

+52
-27
lines changed

src/mame/tvgames/xavix.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ class xavix_state : public driver_device
100100

101101
void init_xavix();
102102
void init_xavix_slowenv();
103-
void init_no_timer() { init_xavix(); m_disable_timer_irq_hack = true; }
104103

105104
uint8_t sound_current_page() const;
106105

@@ -192,8 +191,6 @@ class xavix_state : public driver_device
192191
required_device<screen_device> m_screen;
193192
address_space* m_cpuspace = nullptr;
194193

195-
bool m_disable_timer_irq_hack = false; // hack for epo_mini which floods timer IRQs to the point it won't do anything else
196-
197194
virtual void xavix_extbus_map(address_map &map) ATTR_COLD;
198195

199196
void xavix_4mb_extbus_map(address_map &map) ATTR_COLD;
@@ -394,8 +391,10 @@ class xavix_state : public driver_device
394391
uint8_t timer_freq_r();
395392
void timer_freq_w(uint8_t data);
396393
uint8_t timer_curval_r();
394+
void timer_start();
397395
uint8_t m_timer_control = 0;
398396
uint8_t m_timer_freq = 0;
397+
uint8_t m_timer_currentval = 0;
399398
TIMER_CALLBACK_MEMBER(freq_timer_done);
400399
emu_timer *m_freq_timer = nullptr;
401400

src/mame/tvgames/xavix_2000.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -415,14 +415,14 @@ CONS( 2002, epo_bowl, 0, 0, xavix2000_i2c_24c04_2mb, epo_bowl, xavix_i2c_stat
415415

416416
// スーパーショット! エキサイトゴルフ
417417
// needs timer irq hack to boot, fails to draw main menu properly (buggy xavix2000 opcodes?) (2002 date on PCB, 2003 ingame)
418-
CONS( 2003, epo_golf, 0, 0, xavix2000_i2c_24c04_4mb, ttv_lotr, xavix_i2c_lotr_state, init_no_timer, "Epoch / SSD Company LTD", "Super Shot! Excite Golf (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
418+
CONS( 2003, epo_golf, 0, 0, xavix2000_i2c_24c04_4mb, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Epoch / SSD Company LTD", "Super Shot! Excite Golf (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
419419

420420
// とっとこハム太郎 ハムハム大サーカス!
421421
CONS( 2002, epo_hamc, 0, 0, xavix2000_4mb, epo_hamc, xavix_epo_hamc_state, init_xavix, "Epoch / SSD Company LTD", "Tottoko Hamtaro - Ham Ham Dai Circus! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
422422

423423
// ミニモニ。パーティ!リズムでぴょん!
424424
// needs timer irq hack to boot
425-
CONS( 2003, epo_mini, 0, 0, xavix2000_i2c_24c08_4mb, ttv_lotr, xavix_i2c_lotr_state, init_no_timer, "Epoch / SSD Company LTD", "mini-moni Party! Rhythm de Pyon! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
425+
CONS( 2003, epo_mini, 0, 0, xavix2000_i2c_24c08_4mb, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Epoch / SSD Company LTD", "mini-moni Party! Rhythm de Pyon! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
426426

427427
// カードスキャン! エキサイトステージ サッカー日本代表チーム
428428
CONS( 2006, epo_es2j, 0, 0, xavix2000_4mb, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Card Scan! Excite Stage Soccer Nippon Daihyou Team (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
@@ -456,7 +456,7 @@ CONS( 2004, ban_onep, 0, 0, xavix2000_i2c_24c04, ttv_lotr, xavix_i2c_lotr_sta
456456

457457
// Let’s!TV プレイ 闘印奥義  陰陽大戦記~目指せ最強闘神士~
458458
// stalls unless timers are disabled like epo_mini / epo_golf, 2004 date on PCB, 2005 ingame
459-
CONS( 2005, ban_omt, 0, 0, xavix2000_i2c_24c04_4mb, ttv_lotr, xavix_i2c_lotr_state, init_no_timer, "Bandai / SSD Company LTD", "Let's! TV Play Touin Ougi Onmyou Taisenki: Mezase Saikyou Toushinshi (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
459+
CONS( 2005, ban_omt, 0, 0, xavix2000_i2c_24c04_4mb, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Touin Ougi Onmyou Taisenki: Mezase Saikyou Toushinshi (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
460460

461461
// ディズニープリンセス キラキラ魔法のレッスン
462462
CONS( 2004, tom_dpgm, 0, 0, xavix2000_i2c_24c08_4mb, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tomy / SSD Company LTD", "Disney Princess Kirakira Mahou no Lesson (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )

src/mame/tvgames/xavix_2002.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,14 @@ static INPUT_PORTS_START( xavix_bowl )
306306
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", FUNC(i2cmem_device::read_sda))
307307
INPUT_PORTS_END
308308

309+
static INPUT_PORTS_START( xavix_box )
310+
PORT_INCLUDE(xavix)
311+
312+
PORT_MODIFY("IN1")
313+
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(superxavix_i2c_jmat_state::unknown_random_r))
314+
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(superxavix_i2c_jmat_state::unknown_random_r))
315+
INPUT_PORTS_END
316+
309317
static INPUT_PORTS_START( ban_ult )
310318
PORT_INCLUDE(xavix)
311319

@@ -1080,8 +1088,8 @@ CONS( 2005, xavgolf, 0, 0, superxavix_i2c_24c08, xavix_i2c, superxavix_i
10801088
CONS( 2005, xavgolfj, xavgolf, 0, superxavix_i2c_24c08, xavix_i2c, superxavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Golf (XaviXPORT, Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
10811089
CONS( 2004, xavbowl, 0, 0, superxavix_i2c_24c04, xavix_bowl, superxavix_i2c_bowl_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera'
10821090
CONS( 2005, xavbowlj, xavbowl, 0, superxavix_i2c_24c04, xavix_bowl, superxavix_i2c_bowl_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT, PT2-BWL-11, Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // ^^
1083-
CONS( 2004, xavbox, 0, 0, superxavix_i2c_jmat, xavix, superxavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Boxing / Jackie Chan PowerBoxing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera'
1084-
CONS( 2004, xavboxj, xavbox, 0, superxavix_i2c_jmat, xavix, superxavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Boxing / Jackie Chan PowerBoxing (XaviXPORT, Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera'
1091+
CONS( 2004, xavbox, 0, 0, superxavix_i2c_jmat, xavix_box, superxavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Boxing / Jackie Chan PowerBoxing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera'
1092+
CONS( 2004, xavboxj, xavbox, 0, superxavix_i2c_jmat, xavix_box, superxavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Boxing / Jackie Chan PowerBoxing (XaviXPORT, Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera'
10851093
// Bass Fishing PCB is just like Tennis except with an RF daughterboard.
10861094
CONS( 2004, xavbassf, 0, 0, superxavix_i2c_24c08, xavix_i2c, superxavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
10871095

@@ -1139,16 +1147,16 @@ CONS( 2006, ban_bkgj, 0, 0, superxavix_i2c_24c04_4mb,xavix_i2c, superxavix_i2c_
11391147
CONS( 2006, ban_utmj, 0, 0, superxavix_i2c_24c02, xavix_i2c, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Taikan Cast Off - Kamen Rider Kabuto Clock Up & Rider Kick!! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
11401148

11411149
// Let's!TVプレイ なりきりファイト ウルトラマン 撃て!必殺光線!!
1142-
CONS( 2006, ban_ult, 0, 0, superxavix_i2c_24c02, ban_ult, superxavix_i2c_bowl_state, init_no_timer, "Bandai / SSD Company LTD", "Let's! TV Play Narikiri Fight Ultraman - Ute! Hissatsu Kousen!! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
1150+
CONS( 2006, ban_ult, 0, 0, superxavix_i2c_24c02, ban_ult, superxavix_i2c_bowl_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Narikiri Fight Ultraman - Ute! Hissatsu Kousen!! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
11431151

11441152
// Let's!TVプレイ 体感大怪獣バトル あやつれ!ウルトラ大怪獣!
1145-
CONS( 2007, ban_um2j, 0, 0, superxavix_i2c_24c04, ban_gkr, superxavix_i2c_bowl_state, init_no_timer, "Bandai / SSD Company LTD", "Let's! TV Play Taikan Daikaijuu Battle: Ayatsure! Ultra Daikaijuu! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
1153+
CONS( 2007, ban_um2j, 0, 0, superxavix_i2c_24c04, ban_gkr, superxavix_i2c_bowl_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Taikan Daikaijuu Battle: Ayatsure! Ultra Daikaijuu! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
11461154

11471155
// Let’s!TVプレイ ゲキワザ習得 ゲキレンジャー スーパーゲキレンジャーへの道
1148-
CONS( 2007, ban_gkrj, 0, 0, superxavix_i2c_24c02_4mb, ban_gkr, superxavix_i2c_bowl_state, init_no_timer, "Bandai / SSD Company LTD", "Let's! TV Play Gekiwaza Shuutoku Gekiranger - Super Gekiranger e no Michi (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
1156+
CONS( 2007, ban_gkrj, 0, 0, superxavix_i2c_24c02_4mb, ban_gkr, superxavix_i2c_bowl_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Gekiwaza Shuutoku Gekiranger - Super Gekiranger e no Michi (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
11491157

11501158
// Yes!プリキュア5 いっしょに変身!メタモルフォーゼ!
1151-
CONS( 2007, ban_pr2j, 0, 0, superxavix_i2c_24c04, ban_gkr, superxavix_i2c_bowl_state, init_no_timer, "Bandai / SSD Company LTD", "Yes! PreCure 5: Issho to Henshin! Metamorphose! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
1159+
CONS( 2007, ban_pr2j, 0, 0, superxavix_i2c_24c04, ban_gkr, superxavix_i2c_bowl_state, init_xavix, "Bandai / SSD Company LTD", "Yes! PreCure 5: Issho to Henshin! Metamorphose! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
11521160

11531161
// それいけトーマス ソドー島のなかまたち
11541162
CONS( 2005, tmy_thom, 0, 0, superxavix_i2c_24c04, xavix_i2c, superxavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Soreike Thomas - Sodor Tou no Nakamatachi / Thomas & Friends on the Island of Sodor (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )

src/mame/tvgames/xavix_m.cpp

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,17 @@ uint8_t xavix_state::timer_status_r()
690690
return ret;
691691
}
692692

693+
void xavix_state::timer_start()
694+
{
695+
// TODO: the timer logic might still not be correct here
696+
697+
int divide = 1 << ((m_timer_freq&0x0f)+1);
698+
uint32_t freq = m_maincpu->unscaled_clock(); // should this use ~21Mhz even on SuperXaviX with the faster CPU?
699+
uint32_t freq_t_use = freq / divide;
700+
//LOG("freq is %dhz divide is %d frequency used is %dhz baseval %02x curval %02x\n", freq, divide, freq_t_use, m_timer_baseval, m_timer_currentval);
701+
m_freq_timer->adjust(attotime::from_hz(freq_t_use));
702+
}
703+
693704
void xavix_state::timer_control_w(uint8_t data)
694705
{
695706
/* timer is actively used by
@@ -719,12 +730,9 @@ void xavix_state::timer_control_w(uint8_t data)
719730
// rad_fb / rad_madf don't set bit 0x40 (and doesn't seem to have a valid interrupt handler for timer, so probably means it generates no IRQ?)
720731
if (data & 0x01) // timer start?
721732
{
722-
// TODO: work out the proper calculation here
723-
// int divide = 1 << ((m_timer_freq&0x0f)+1);
724-
// uint32_t freq = m_maincpu->unscaled_clock()/2;
725-
// m_freq_timer->adjust(attotime::from_hz(freq / divide) * m_timer_baseval*20);
726-
//m_freq_timer->adjust(attotime::from_usec(1000));
727-
m_freq_timer->adjust(attotime::from_usec(50));
733+
m_timer_currentval = m_timer_baseval;
734+
735+
timer_start();
728736
}
729737
else
730738
{
@@ -749,7 +757,7 @@ uint8_t xavix_state::timer_curval_r()
749757
{
750758
// TODO implement properly with timers etc. as rad_fb / rad_madfb rely on these values to calculate throw strength!
751759
LOG("%s: timer_curval_r\n", machine().describe_context());
752-
return machine().rand();
760+
return m_timer_currentval;
753761
}
754762

755763

@@ -786,16 +794,23 @@ void xavix_state::timer_freq_w(uint8_t data)
786794

787795
TIMER_CALLBACK_MEMBER(xavix_state::freq_timer_done)
788796
{
789-
if ((m_timer_control & 0x40) && (!m_disable_timer_irq_hack)) // Timer IRQ enable?
797+
// or should this count up? games seem to set 0xff as the base value
798+
// and reset the timer before it would ever have a chance to expire
799+
m_timer_currentval--;
800+
801+
if (m_timer_currentval == 0xff)
790802
{
791-
m_irqsource |= 0x10;
792-
m_timer_control |= 0x80;
793-
update_irqs();
803+
if ((m_timer_control & 0x40)) // Timer IRQ enable?
804+
{
805+
m_irqsource |= 0x10;
806+
m_timer_control |= 0x80;
807+
update_irqs();
808+
}
809+
}
810+
else
811+
{
812+
timer_start();
794813
}
795-
796-
//logerror("freq_timer_done\n");
797-
// reload
798-
//m_freq_timer->adjust(attotime::from_usec(50000));
799814
}
800815

801816

@@ -1114,6 +1129,7 @@ void xavix_state::machine_start()
11141129
save_item(NAME(m_sound_regbase));
11151130
save_item(NAME(m_timer_control));
11161131
save_item(NAME(m_timer_freq));
1132+
save_item(NAME(m_timer_currentval));
11171133
save_item(NAME(m_txarray));
11181134
save_item(NAME(m_irqsource));
11191135
save_item(NAME(m_vectorenable));
@@ -1205,6 +1221,8 @@ void xavix_state::machine_reset()
12051221
m_irqsource = 0x00;
12061222

12071223
m_timer_control = 0x00;
1224+
m_timer_freq = 0x00;
1225+
m_timer_currentval = 0x00;
12081226

12091227
m_ioevent_enable = 0x00;
12101228
m_ioevent_active = 0x00;

0 commit comments

Comments
 (0)