summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2019-08-12 14:47:35 +0200
committer Dirk Best <mail@dirk-best.de>2019-08-12 15:07:36 +0200
commita8e73236516e9059c40b944cb14a3de5f6e266ee (patch)
tree8ebd20051f78fe8bc6c0f59e4aaf3f33b7ce09c1
parent45f9e0caa9f2b830ebb7f3371a3a3748f63cf147 (diff)
birdtry: Hook up newly dumped MCU, remove simulation
Promoted to working as result.
-rw-r--r--src/mame/drivers/dec0.cpp12
-rw-r--r--src/mame/includes/dec0.h5
-rw-r--r--src/mame/machine/dec0.cpp84
3 files changed, 15 insertions, 86 deletions
diff --git a/src/mame/drivers/dec0.cpp b/src/mame/drivers/dec0.cpp
index 33e8e3e6d0b..7d4f73a021c 100644
--- a/src/mame/drivers/dec0.cpp
+++ b/src/mame/drivers/dec0.cpp
@@ -2080,6 +2080,16 @@ void dec0_state::birdtry(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &dec0_state::dec0_tb_map);
+ // needs a tight sync with the mcu
+ config.m_perfect_cpu_quantum = subtag("maincpu");
+
+ i8751_device &mcu(I8751(config, m_mcu, XTAL(8'000'000)));
+ mcu.port_in_cb<0>().set(FUNC(dec0_state::dec0_mcu_port0_r));
+ mcu.port_out_cb<0>().set(FUNC(dec0_state::dec0_mcu_port0_w));
+ mcu.port_out_cb<1>().set(FUNC(dec0_state::dec0_mcu_port1_w));
+ mcu.port_out_cb<2>().set(FUNC(dec0_state::dec0_mcu_port2_w));
+ mcu.port_out_cb<3>().set(FUNC(dec0_state::dec0_mcu_port3_w));
+
upd4701_device &tb0(UPD4701A(config, "tb0"));
tb0.set_portx_tag("track_0");
tb0.set_porty_tag("track_1");
@@ -4033,7 +4043,7 @@ GAME( 1987, hbarrel, 0, hbarrel, hbarrel, dec0_state, init_hbarr
GAME( 1987, hbarrelw, hbarrel, hbarrel, hbarrel, dec0_state, init_hbarrel, ROT270, "Data East Corporation", "Heavy Barrel (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, baddudes, 0, baddudes, baddudes, dec0_state, init_hbarrel, ROT0, "Data East USA", "Bad Dudes vs. Dragonninja (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, drgninja, baddudes, baddudes, drgninja, dec0_state, init_hbarrel, ROT0, "Data East Corporation", "Dragonninja (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1988, birdtry, 0, birdtry, birdtry, dec0_state, init_birdtry, ROT270, "Data East Corporation", "Birdie Try (Japan)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // protection controls game related data, impossible to emulate without a working PCB
+GAME( 1988, birdtry, 0, birdtry, birdtry, dec0_state, init_hbarrel, ROT270, "Data East Corporation", "Birdie Try (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocop, 0, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (World revision 4)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopw, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (World revision 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopj, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (Japan)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/dec0.h b/src/mame/includes/dec0.h
index 43a600f0387..68683356f5f 100644
--- a/src/mame/includes/dec0.h
+++ b/src/mame/includes/dec0.h
@@ -61,7 +61,6 @@ public:
void init_hippodrm();
void init_hbarrel();
void init_slyspy();
- void init_birdtry();
void init_drgninja();
void init_midresb();
void init_ffantasybl();
@@ -94,8 +93,7 @@ protected:
private:
enum class mcu_type {
EMULATED,
- BADDUDES_SIM,
- BIRDTRY_SIM
+ BADDUDES_SIM
};
optional_device<h6280_device> m_subcpu;
@@ -156,7 +154,6 @@ private:
void midres_colpri_cb(u32 &colour, u32 &pri_mask);
void baddudes_i8751_write(int data);
- void birdtry_i8751_write(int data);
void dec0_i8751_write(int data);
void dec0_i8751_reset();
void h6280_decrypt(const char *cputag);
diff --git a/src/mame/machine/dec0.cpp b/src/mame/machine/dec0.cpp
index 8e4c153d468..9b5a396dc14 100644
--- a/src/mame/machine/dec0.cpp
+++ b/src/mame/machine/dec0.cpp
@@ -38,7 +38,7 @@ READ16_MEMBER(dec0_state::dec0_controls_r)
case 4: /* Byte 4: Dipswitch bank 2, Byte 5: Dipswitch Bank 1 */
return ioport("DSW")->read();
- case 8: /* Intel 8751 mc, Bad Dudes & Heavy Barrel only */
+ case 8: /* Intel 8751 mc, Bad Dudes, Heavy Barrel & Birdie Try only */
//logerror("CPU #0 PC %06x: warning - read i8751 %06x - %04x\n", m_maincpu->pc(), 0x30c000+offset, m_i8751_return);
return m_i8751_return;
}
@@ -171,6 +171,7 @@ WRITE8_MEMBER(dec0_state::dec0_mcu_port0_w)
WRITE8_MEMBER(dec0_state::dec0_mcu_port1_w)
{
+ logerror("dec0_mcu_port1_w: %02x\n", data);
m_i8751_ports[1] = data;
}
@@ -190,6 +191,7 @@ WRITE8_MEMBER(dec0_state::dec0_mcu_port2_w)
WRITE8_MEMBER(dec0_state::dec0_mcu_port3_w)
{
+ logerror("dec0_mcu_port3_w: %02x\n", data);
m_i8751_ports[3] = data;
}
@@ -221,78 +223,6 @@ void dec0_state::baddudes_i8751_write(int data)
m_maincpu->set_input_line(5, HOLD_LINE);
}
-void dec0_state::birdtry_i8751_write(int data)
-{
- static int pwr,
- hgt;
-
- m_i8751_return = 0;
-
- switch (data & 0xffff)
- {
- /*"Sprite control"*/
- case 0x22a: m_i8751_return = 0x200; break;
-
- /* velocity of the ball, controlled by power and height formula? */
- case 0x3c7: m_i8751_return = 0x2fff; break;
-
- /*Enables shot checks*/
- case 0x33c: m_i8751_return = 0x200; break;
-
- /*Used on the title screen only(???)*/
- case 0x31e: m_i8751_return = 0x200; break;
-
-/* 0x100-0x10d values are for club power meters(1W=0x100<<-->>PT=0x10d). *
- * Returned value to i8751 doesn't matter,but send the result to 0x481. *
- * Lower the value,stronger is the power. */
- case 0x100: pwr = 0x30; break; /*1W*/
- case 0x101: pwr = 0x34; break; /*3W*/
- case 0x102: pwr = 0x38; break; /*4W*/
- case 0x103: pwr = 0x3c; break; /*1I*/
- case 0x104: pwr = 0x40; break; /*3I*/
- case 0x105: pwr = 0x44; break; /*4I*/
- case 0x106: pwr = 0x48; break; /*5I*/
- case 0x107: pwr = 0x4c; break; /*6I*/
- case 0x108: pwr = 0x50; break; /*7I*/
- case 0x109: pwr = 0x54; break; /*8I*/
- case 0x10a: pwr = 0x58; break; /*9I*/
- case 0x10b: pwr = 0x5c; break; /*PW*/
- case 0x10c: pwr = 0x60; break; /*SW*/
- case 0x10d: pwr = 0x80; break; /*PT*/
- case 0x481: m_i8751_return = pwr*9; break; /*Power meter*/
-
-/* 0x200-0x20f values are for shot height(STRONG=0x200<<-->>WEAK=0x20f). *
- * Returned value to i8751 doesn't matter,but send the result to 0x534. *
- * Higher the value,stronger is the height. */
- case 0x200: hgt = 0x5c0; break; /*H*/
- case 0x201: hgt = 0x580; break; /*|*/
- case 0x202: hgt = 0x540; break; /*|*/
- case 0x203: hgt = 0x500; break; /*|*/
- case 0x204: hgt = 0x4c0; break; /*|*/
- case 0x205: hgt = 0x480; break; /*|*/
- case 0x206: hgt = 0x440; break; /*|*/
- case 0x207: hgt = 0x400; break; /*M*/
- case 0x208: hgt = 0x3c0; break; /*|*/
- case 0x209: hgt = 0x380; break; /*|*/
- case 0x20a: hgt = 0x340; break; /*|*/
- case 0x20b: hgt = 0x300; break; /*|*/
- case 0x20c: hgt = 0x2c0; break; /*|*/
- case 0x20d: hgt = 0x280; break; /*|*/
- case 0x20e: hgt = 0x240; break; /*|*/
- case 0x20f: hgt = 0x200; break; /*L*/
- case 0x534: m_i8751_return = hgt; break; /*Shot height*/
-
- /*At the ending screen(???)*/
- //case 0x3b4: m_i8751_return = 0; break;
-
- /*These are activated after a shot (???)*/
- case 0x6ca: m_i8751_return = 0xff; break;
- case 0x7ff: m_i8751_return = 0x200; break;
- default: logerror("%s: warning - write unknown command %02x to 8571\n",machine().describe_context(),data);
- }
- m_maincpu->set_input_line(5, HOLD_LINE);
-}
-
void dec0_state::dec0_i8751_write(int data)
{
m_i8751_command = data;
@@ -307,9 +237,6 @@ void dec0_state::dec0_i8751_write(int data)
case mcu_type::BADDUDES_SIM:
baddudes_i8751_write(data);
break;
- case mcu_type::BIRDTRY_SIM:
- birdtry_i8751_write(data);
- break;
}
//logerror("%s: warning - write %02x to i8751\n",machine().describe_context(),data);
@@ -391,8 +318,3 @@ void dec0_state::init_hbarrel()
{
m_game = mcu_type::EMULATED;
}
-
-void dec0_state::init_birdtry()
-{
- m_game = mcu_type::BIRDTRY_SIM;
-}