summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2019-05-28 09:48:47 +0200
committer Dirk Best <mail@dirk-best.de>2019-05-28 09:48:59 +0200
commit87d548d20590944336a0843c2741795bda04d6cc (patch)
tree18be213f832cfa1f69de04474904c5a054019748
parent244b03bb52f14a7cca45c20e66c1d4352be4bda2 (diff)
bbusters: Update gun handling, fixes MT07333
- Use UPD7004 device - Adjust gun limits to the factory defaults - Remove no longer needed default eeproms Calibration in service mode now also works and doesn't cause the game to refuse to boot.
-rw-r--r--src/mame/drivers/bbusters.cpp88
-rw-r--r--src/mame/includes/bbusters.h5
2 files changed, 32 insertions, 61 deletions
diff --git a/src/mame/drivers/bbusters.cpp b/src/mame/drivers/bbusters.cpp
index 5ac78c1c7a1..ea7de447ee3 100644
--- a/src/mame/drivers/bbusters.cpp
+++ b/src/mame/drivers/bbusters.cpp
@@ -182,9 +182,15 @@ If you calibrate the guns correctly the game runs as expected:
2) Using P2 controls fire at the indicated spots.
3) Using P3 controls fire at the indicated spots.
+ The locations of the shots fired in attract mode are defined by a table
+ starting at $65000. The value taken from there is combined with data from
+ the gun calibration to calculate the final position of the shots.
+ Unexpected calibration values will therefore cause the game to show the
+ shots in weird positions (see MT07333).
-TODO: MT07333 - once the guns are calibrated, attract mode shows the 3 players only shooting at the bottom right
-of the screen.
+ The EEPROM data starts with the 16 bit calibration values for all six axes
+ in the order: Minimum axis 0, middle axis 0, maximum axis 0 (repeat for
+ the other 5 axes).
***************************************************************************/
@@ -194,6 +200,7 @@ of the screen.
#include "cpu/z80/z80.h"
#include "cpu/m68000/m68000.h"
#include "machine/nvram.h"
+#include "machine/upd7004.h"
#include "sound/2608intf.h"
#include "sound/2610intf.h"
#include "emupal.h"
@@ -240,8 +247,6 @@ void bbusters_state_base::machine_start()
void bbusters_state::machine_start()
{
bbusters_state_base::machine_start();
-
- save_item(NAME(m_gun_select));
}
WRITE8_MEMBER(bbusters_state_base::sound_cpu_w)
@@ -256,36 +261,12 @@ READ16_MEMBER(bbusters_state::eprom_r)
return (m_eprom_data[offset]&0xff) | 0xff00;
}
-READ16_MEMBER(bbusters_state::control_3_r)
-{
- uint16_t retdata = m_gun_io[m_gun_select]->read();
-
- retdata >>=1; // by lowering the precision of the gun reading hardware the game seems to work better
-
- return retdata;
-}
-
-WRITE16_MEMBER(bbusters_state::gun_select_w)
-{
- //logerror("%08x: gun r\n",m_maincpu->pc());
-
- m_maincpu->set_input_line(2, HOLD_LINE);
-
- m_gun_select = data & 0xff;
-}
-
WRITE16_MEMBER(bbusters_state::three_gun_output_w)
{
for (int i = 0; i < 3; i++)
m_gun_recoil[i] = BIT(data, i);
}
-READ16_MEMBER(bbusters_state::kludge_r)
-{
- // might latch the gun value?
- return 0x0000;
-}
-
template<int Layer>
WRITE16_MEMBER(bbusters_state_base::pf_w)
{
@@ -322,8 +303,7 @@ void bbusters_state::bbusters_map(address_map &map)
map(0x0e0008, 0x0e0009).portr("DSW1"); /* Dip 1 */
map(0x0e000a, 0x0e000b).portr("DSW2"); /* Dip 2 */
map(0x0e0019, 0x0e0019).r(m_soundlatch[1], FUNC(generic_latch_8_device::read));
- map(0x0e8000, 0x0e8001).rw(FUNC(bbusters_state::kludge_r), FUNC(bbusters_state::gun_select_w));
- map(0x0e8002, 0x0e8003).r(FUNC(bbusters_state::control_3_r));
+ map(0x0e8000, 0x0e8003).rw("adc", FUNC(upd7004_device::read), FUNC(upd7004_device::write)).umask16(0x00ff);
map(0x0f0000, 0x0f0001).w(FUNC(bbusters_state::coin_counter_w));
map(0x0f0008, 0x0f0009).w(FUNC(bbusters_state::three_gun_output_w));
map(0x0f0019, 0x0f0019).w(FUNC(bbusters_state::sound_cpu_w));
@@ -481,20 +461,23 @@ static INPUT_PORTS_START( bbusters )
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW2:7" ) /* Listed as "Unused" */
PORT_SERVICE_DIPLOC(0x80, IP_ACTIVE_LOW, "SW2:8" )
- PORT_START("GUNX1")
- PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(1)
PORT_START("GUNY1")
- PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(1)
+ PORT_BIT(0x3ff, 0x1a6, IPT_LIGHTGUN_Y) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_MINMAX(0x0e6, 0x272) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(1)
+
+ PORT_START("GUNX1")
+ PORT_BIT(0x3ff, 0x23a, IPT_LIGHTGUN_X) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_MINMAX(0x136, 0x36a) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(1)
- PORT_START("GUNX2")
- PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(2)
PORT_START("GUNY2")
- PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(2)
+ PORT_BIT(0x3ff, 0x1f6, IPT_LIGHTGUN_Y) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_MINMAX(0x146, 0x2aa) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(2)
+
+ PORT_START("GUNX2")
+ PORT_BIT(0x3ff, 0x1de, IPT_LIGHTGUN_X) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_MINMAX(0x10e, 0x2e2) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(2)
- PORT_START("GUNX3")
- PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(3)
PORT_START("GUNY3")
- PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(3)
+ PORT_BIT(0x3ff, 0x21e, IPT_LIGHTGUN_Y) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_MINMAX(0x16e, 0x2f6) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(3)
+
+ PORT_START("GUNX3")
+ PORT_BIT(0x3ff, 0x212, IPT_LIGHTGUN_X) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_MINMAX(0x14e, 0x33e) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(3)
INPUT_PORTS_END
static INPUT_PORTS_START( mechatt )
@@ -652,7 +635,16 @@ void bbusters_state::bbusters(machine_config &config)
m_audiocpu->set_addrmap(AS_PROGRAM, &bbusters_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &bbusters_state::sound_portmap);
- NVRAM(config, "eeprom", nvram_device::DEFAULT_ALL_0); // actually 28C04 parallel EEPROM
+ NVRAM(config, "eeprom", nvram_device::DEFAULT_ALL_1); // actually 28C04 parallel EEPROM
+
+ upd7004_device &adc(UPD7004(config, "adc", 8_MHz_XTAL / 2));
+ adc.eoc_ff_callback().set_inputline(m_maincpu, 2);
+ adc.in_callback<0>().set_ioport("GUNY1");
+ adc.in_callback<1>().set_ioport("GUNX1");
+ adc.in_callback<2>().set_ioport("GUNY2");
+ adc.in_callback<3>().set_ioport("GUNX2");
+ adc.in_callback<4>().set_ioport("GUNY3");
+ adc.in_callback<5>().set_ioport("GUNX3");
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -770,9 +762,6 @@ ROM_START( bbusters )
ROM_REGION( 0x80000, "ymsnd.deltat", 0 )
ROM_LOAD( "bb-pcmb.l3", 0x000000, 0x80000, CRC(c8d5dd53) SHA1(0f7e94532cc14852ca12c1b792e5479667af899e) )
-
- ROM_REGION( 0x100, "eeprom", 0 )
- ROM_LOAD( "bbusters-eeprom.bin", 0x00, 0x100, CRC(a52ebd66) SHA1(de04db6f1510700c61bf152799452a80220ae87c) )
ROM_END
ROM_START( bbustersu )
@@ -818,9 +807,6 @@ ROM_START( bbustersu )
ROM_REGION( 0x80000, "ymsnd.deltat", 0 )
ROM_LOAD( "bb-pcma.l5", 0x000000, 0x80000, CRC(44cd5bfe) SHA1(26a612191a0aa614c090203485aba17c99c763ee) )
-
- ROM_REGION( 0x100, "eeprom", 0 )
- ROM_LOAD( "bbusters-eeprom.bin", 0x00, 0x100, CRC(a52ebd66) SHA1(de04db6f1510700c61bf152799452a80220ae87c) )
ROM_END
ROM_START( bbustersua )
@@ -866,9 +852,6 @@ ROM_START( bbustersua )
ROM_REGION( 0x80000, "ymsnd.deltat", 0 )
ROM_LOAD( "bb-pcma.l5", 0x000000, 0x80000, CRC(44cd5bfe) SHA1(26a612191a0aa614c090203485aba17c99c763ee) )
-
- ROM_REGION( 0x100, "eeprom", 0 )
- ROM_LOAD( "bbusters-eeprom.bin", 0x00, 0x100, CRC(a52ebd66) SHA1(de04db6f1510700c61bf152799452a80220ae87c) )
ROM_END
ROM_START( bbustersj )
@@ -914,9 +897,6 @@ ROM_START( bbustersj )
ROM_REGION( 0x80000, "ymsnd.deltat", 0 )
ROM_LOAD( "bb-pcmb.l3", 0x000000, 0x80000, CRC(c8d5dd53) SHA1(0f7e94532cc14852ca12c1b792e5479667af899e) )
-
- ROM_REGION( 0x100, "eeprom", 0 )
- ROM_LOAD( "bbusters-eeprom.bin", 0x00, 0x100, CRC(a52ebd66) SHA1(de04db6f1510700c61bf152799452a80220ae87c) )
ROM_END
ROM_START( bbustersja )
@@ -962,9 +942,6 @@ ROM_START( bbustersja )
ROM_REGION( 0x80000, "ymsnd.deltat", 0 )
ROM_LOAD( "bb-pcmb.l3", 0x000000, 0x80000, CRC(c8d5dd53) SHA1(0f7e94532cc14852ca12c1b792e5479667af899e) )
-
- ROM_REGION( 0x100, "eeprom", 0 )
- ROM_LOAD( "bbusters-eeprom.bin", 0x00, 0x100, CRC(a52ebd66) SHA1(de04db6f1510700c61bf152799452a80220ae87c) )
ROM_END
@@ -1140,7 +1117,6 @@ ROM_END
/******************************************************************************/
-// as soon as you calibrate the guns in test mode the game refuses to boot
GAME( 1989, bbusters, 0, bbusters, bbusters, bbusters_state, empty_init, ROT0, "SNK", "Beast Busters (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, bbustersu, bbusters, bbusters, bbusters, bbusters_state, empty_init, ROT0, "SNK", "Beast Busters (US, Version 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, bbustersua, bbusters, bbusters, bbusters, bbusters_state, empty_init, ROT0, "SNK", "Beast Busters (US, Version 2)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/bbusters.h b/src/mame/includes/bbusters.h
index b2577b2f67c..d078fe982d0 100644
--- a/src/mame/includes/bbusters.h
+++ b/src/mame/includes/bbusters.h
@@ -82,13 +82,8 @@ protected:
private:
required_shared_ptr<uint16_t> m_eprom_data;
- int m_gun_select;
-
DECLARE_READ16_MEMBER(eprom_r);
- DECLARE_READ16_MEMBER(control_3_r);
- DECLARE_WRITE16_MEMBER(gun_select_w);
DECLARE_WRITE16_MEMBER(three_gun_output_w);
- DECLARE_READ16_MEMBER(kludge_r);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void bbusters_map(address_map &map);