mirror of
https://github.com/holub/mame
synced 2025-10-04 16:34:53 +03:00
New working machines added
------------- Starting Lineup Talking Baseball [hap, Kevin Horton] Superstar Lineup Talking Football [hap, Kevin Horton]
This commit is contained in:
parent
5cd463e076
commit
0680e6f454
@ -3993,6 +3993,8 @@ files {
|
||||
MAME_DIR .. "src/mame/drivers/sys2900.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/sys9002.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/systec.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/talkingbb.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/talkingfb.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/tavernie.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/tecnbras.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/terak.cpp",
|
||||
|
@ -272,5 +272,5 @@ ROM_END
|
||||
******************************************************************************/
|
||||
|
||||
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
|
||||
COMP( 1978, boris, 0, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris (rev. 01)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) // "Boris awaits your move"
|
||||
COMP( 1978, borisa, boris, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris (rev. 00)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) // "Boris plays black"
|
||||
CONS( 1978, boris, 0, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris (rev. 01)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) // "Boris awaits your move"
|
||||
CONS( 1978, borisa, boris, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris (rev. 00)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) // "Boris plays black"
|
||||
|
@ -407,4 +407,4 @@ ROM_END
|
||||
******************************************************************************/
|
||||
|
||||
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
|
||||
COMP( 1980, ggm, 0, 0, ggm, ggm, ggm_state, empty_init, "Applied Concepts", "Great Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
|
||||
CONS( 1980, ggm, 0, 0, ggm, ggm, ggm_state, empty_init, "Applied Concepts", "Great Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
|
||||
|
@ -415,4 +415,4 @@ ROM_END
|
||||
******************************************************************************/
|
||||
|
||||
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
|
||||
COMP( 1978, 2001tgm, 0, 0, tgm, tgm, tgm_state, empty_init, "Waddingtons", "2001: The Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
|
||||
CONS( 1978, 2001tgm, 0, 0, tgm, tgm, tgm_state, empty_init, "Waddingtons", "2001: The Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
|
||||
|
379
src/mame/drivers/talkingbb.cpp
Normal file
379
src/mame/drivers/talkingbb.cpp
Normal file
@ -0,0 +1,379 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:hap
|
||||
// thanks-to:Kevin Horton
|
||||
/******************************************************************************
|
||||
|
||||
Parker Brothers Starting Lineup Talking Baseball
|
||||
|
||||
Hardware notes:
|
||||
- PCB label KPT-349 REV 6C<1>
|
||||
- 80C31 MCU @ 12MHz
|
||||
- 2KB RAM, 128KB ROM, 2 cartridge slots
|
||||
- 12 leds, 2 16-button keypads
|
||||
|
||||
ROM chip has (C) 1987 Tonka (Kenner Parker Toys was acquired by Tonka in 1987, Parker
|
||||
Brothers itself was acquired by Kenner in 1985)
|
||||
|
||||
The speech driver is by Forrest S. Mozer's company.
|
||||
|
||||
The cartridge slots are for extra teams. There are around 8 cartridges, each one
|
||||
included 3 or 4 baseball teams, with exception to the "Hall of Fame" cartridge.
|
||||
Players enter 3-digit code to select the team.
|
||||
|
||||
TODO:
|
||||
- add cartridge slots
|
||||
- Buttons are unresponsive at initial game setup, you need to hold the yes/no button
|
||||
until it responds. The keypad reading routine is at $1A5D, it gets skipped for several
|
||||
seconds at a time. Once in-game, everything is fine though. BTANB or different cause?
|
||||
|
||||
*******************************************************************************
|
||||
|
||||
Field positions (used when substituting):
|
||||
|
||||
1: Pitcher
|
||||
2: Catcher
|
||||
3: First Base
|
||||
4: Second Base
|
||||
5: Third Base
|
||||
6: Shortstop
|
||||
7: Left Field
|
||||
8: Center Field
|
||||
9: Right Field
|
||||
|
||||
The game includes baseball cards with player stats. At the very least, the roster
|
||||
cards are needed to play the game properly. See below for the default teams.
|
||||
|
||||
American Team:
|
||||
--------------
|
||||
|
||||
Starting lineup batting order:
|
||||
|
||||
1: #23 Rickey Henderson, CF
|
||||
2: #14 Don Mattingly, 1B
|
||||
3: #18 Wade Boggs, 3B
|
||||
4: #22 George Bell, LF
|
||||
5: #24 Dave Winfield, RF
|
||||
6: #16 Cal Ripken, SS
|
||||
7: #11 Terry Kennedy, C
|
||||
8: #15 Willie Randolph, 2B
|
||||
9: #20 Alan Trammell, SS & DH
|
||||
10:#27 Roger Clemens, P
|
||||
|
||||
Substitutes:
|
||||
|
||||
#19: George Brett, 3B
|
||||
#12: Carlton Fisk, C
|
||||
#25: Jack Morris, P
|
||||
#13: Eddie Murray, 1B
|
||||
#21: Kirby Puckett, OF
|
||||
#30: Dan Quisenberry, P
|
||||
#29: Dave Righetti, P
|
||||
#28: Bret Saberhagen, P
|
||||
#17: Lou Whitaker, 2B
|
||||
#26: Robin Yount, SS
|
||||
|
||||
National Team:
|
||||
--------------
|
||||
|
||||
Starting lineup batting order:
|
||||
|
||||
1: #23: Tim Raines, LF
|
||||
2: #16: Ryne Sandberg, 2B
|
||||
3: #22: Darryl Strawberry, RF
|
||||
4: #19: Mike Schmidt, 3B
|
||||
5: #13: Jack Clark, 1B
|
||||
6: #20: Eric Davis, CF
|
||||
7: #11: Gary Carter, C
|
||||
8: #17: Ozzie Smith, SS
|
||||
9: #18: Dale Murphy, OF & DH
|
||||
10:#25: Mike Scott, P
|
||||
|
||||
Substitutes:
|
||||
|
||||
#15: Buddy Bell, 3B
|
||||
#26: Jody Davis, C
|
||||
#24: Andre Dawson, CF
|
||||
#29: Dwight Gooden, P
|
||||
#21: Tony Gwynn, OF
|
||||
#14: Keith Hernandez, 1B
|
||||
#30: Nolan Ryan, P
|
||||
#12: Steve Sax, 2B
|
||||
#28: Fernando Valenzuela, P
|
||||
#27: Todd Worrell, P
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/mcs51/mcs51.h"
|
||||
#include "machine/timer.h"
|
||||
#include "sound/dac.h"
|
||||
#include "sound/volt_reg.h"
|
||||
#include "speaker.h"
|
||||
|
||||
// internal artwork
|
||||
#include "talkingbb.lh"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class talkingbb_state : public driver_device
|
||||
{
|
||||
public:
|
||||
talkingbb_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_rom(*this, "maincpu"),
|
||||
m_delay_display(*this, "delay_display_%u", 0),
|
||||
m_out_led(*this, "led%u", 0U),
|
||||
m_inputs(*this, "IN.%u", 0)
|
||||
{ }
|
||||
|
||||
void talkingbb(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
|
||||
private:
|
||||
// devices/pointers
|
||||
required_device<mcs51_cpu_device> m_maincpu;
|
||||
required_region_ptr<u8> m_rom;
|
||||
required_device_array<timer_device, 12> m_delay_display;
|
||||
output_finder<12> m_out_led;
|
||||
required_ioport_array<5> m_inputs;
|
||||
|
||||
void main_map(address_map &map);
|
||||
void main_io(address_map &map);
|
||||
|
||||
u8 m_bank;
|
||||
u8 m_led_select;
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(delay_display) { m_out_led[param] = 0; }
|
||||
|
||||
// I/O handlers
|
||||
DECLARE_WRITE8_MEMBER(bank_w);
|
||||
DECLARE_READ8_MEMBER(bank_r);
|
||||
DECLARE_WRITE8_MEMBER(input_w);
|
||||
DECLARE_READ8_MEMBER(input_r);
|
||||
DECLARE_READ8_MEMBER(switch_r);
|
||||
};
|
||||
|
||||
void talkingbb_state::machine_start()
|
||||
{
|
||||
// resolve handlers
|
||||
m_out_led.resolve();
|
||||
|
||||
// zerofill
|
||||
m_bank = 0;
|
||||
m_led_select = 0;
|
||||
|
||||
// register for savestates
|
||||
save_item(NAME(m_bank));
|
||||
save_item(NAME(m_led_select));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
I/O
|
||||
******************************************************************************/
|
||||
|
||||
WRITE8_MEMBER(talkingbb_state::bank_w)
|
||||
{
|
||||
// d0-d1: upper rom bank
|
||||
// d2-d4: upper rom enable (bus conflict possible)
|
||||
// d3: internal rom, cart slot 1, d4: cart slot 2
|
||||
m_bank = data;
|
||||
}
|
||||
|
||||
READ8_MEMBER(talkingbb_state::bank_r)
|
||||
{
|
||||
u32 hi = (~m_bank & 3) << 15;
|
||||
u8 data = (m_bank & 4) ? 0xff : m_rom[offset | hi];
|
||||
|
||||
// TODO: cartridge
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(talkingbb_state::input_w)
|
||||
{
|
||||
// no effect if P30 is low (never happens though)
|
||||
if (~m_bank & 1)
|
||||
return;
|
||||
|
||||
// d4-d7: led select (also input mux)
|
||||
// d0-d2: led data
|
||||
for (int i = 0; i < 12; i++)
|
||||
{
|
||||
u8 prev = BIT(m_led_select >> 4, i & 3) & BIT(~m_led_select, i >> 2);
|
||||
u8 cur = BIT(data >> 4, i & 3) & BIT(~data, i >> 2);
|
||||
|
||||
// they're strobed, so on falling edge, delay them going off to prevent flicker or stuck display
|
||||
if (prev & ~cur)
|
||||
m_delay_display[i]->adjust(attotime::from_msec(50), i);
|
||||
else if (cur)
|
||||
m_out_led[i] = 1;
|
||||
}
|
||||
|
||||
m_led_select = data;
|
||||
}
|
||||
|
||||
READ8_MEMBER(talkingbb_state::input_r)
|
||||
{
|
||||
// open bus if P30 is low (never happens though)
|
||||
if (~m_bank & 1)
|
||||
return 0xff;
|
||||
|
||||
u8 data = 0;
|
||||
|
||||
// multiplexed inputs
|
||||
for (int i = 0; i < 4; i++)
|
||||
if (BIT(m_led_select >> 4, i))
|
||||
data |= m_inputs[i]->read();
|
||||
|
||||
return ~data;
|
||||
}
|
||||
|
||||
READ8_MEMBER(talkingbb_state::switch_r)
|
||||
{
|
||||
// d5: mode switch
|
||||
return ~m_inputs[4]->read();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Address Maps
|
||||
******************************************************************************/
|
||||
|
||||
void talkingbb_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom().region("maincpu", 0x18000);
|
||||
map(0x8000, 0xffff).r(FUNC(talkingbb_state::bank_r));
|
||||
}
|
||||
|
||||
void talkingbb_state::main_io(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x07ff).mirror(0x3800).ram();
|
||||
map(0x8000, 0x8000).mirror(0x7fff).rw(FUNC(talkingbb_state::input_r), FUNC(talkingbb_state::input_w));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Input Ports
|
||||
******************************************************************************/
|
||||
|
||||
/* keypad layout: **** P1 = Batter **** | **** P2 = Pitcher ****
|
||||
|
|
||||
[PINCH [1 [2] [3 [TIME OUT] | [INFIELD [1 [2 [3 [TIME OUT]
|
||||
HITTER] BUNT] POWER] | IN] FAST] CURVE] CHANGE]
|
||||
|
|
||||
[SCORE] [4] [5 [6] [NO | [SCORE] [4 [5 [6 [NO
|
||||
SQUEEZE] CANCEL] | PTCHOUT] PICKOFF] INTWALK] CANCEL]
|
||||
|
|
||||
[PINCH [7 [8] [9 [YES | [INSTANT [7 [8] [9 [YES
|
||||
RUNNER] STEAL] X-BASE] ENTER] | REPLAY] RELIEF] SUB] ENTER]
|
||||
|
|
||||
[0 | [0
|
||||
SWING] | BALL]
|
||||
*/
|
||||
|
||||
static INPUT_PORTS_START( talkingbb )
|
||||
PORT_START("IN.0")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_R) PORT_NAME("P1 3 / Power")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F) PORT_NAME("P1 6")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_V) PORT_NAME("P1 9 / Extra Base")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("P1 Time Out")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_O) PORT_NAME("P2 3 / Change")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_L) PORT_NAME("P2 6 / Intentional Walk")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("P2 9 / Sub")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("P2 Time Out")
|
||||
|
||||
PORT_START("IN.1")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_E) PORT_NAME("P1 2")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_D) PORT_NAME("P1 5 / Squeeze")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_C) PORT_NAME("P1 8")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_LALT) PORT_NAME("P1 0 / Swing")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 2 / Curve")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 5 / Pickoff")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 8")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RALT) PORT_NAME("P2 0 / Ball")
|
||||
|
||||
PORT_START("IN.2")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_W) PORT_NAME("P1 1 / Bunt")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_S) PORT_NAME("P1 4")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_X) PORT_NAME("P1 7 / Steal")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 1 / Fast")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 4 / Pitchout")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 7 / Relief")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel")
|
||||
|
||||
PORT_START("IN.3")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Pinch Hitter")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pinch Runner")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Infield In")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Instant Replay")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter")
|
||||
|
||||
PORT_START("IN.4")
|
||||
PORT_CONFNAME( 0x20, 0x00, "Mode" )
|
||||
PORT_CONFSETTING( 0x00, "Player" )
|
||||
PORT_CONFSETTING( 0x20, "Coach" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Machine Configs
|
||||
******************************************************************************/
|
||||
|
||||
void talkingbb_state::talkingbb(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
I80C31(config, m_maincpu, 12_MHz_XTAL);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &talkingbb_state::main_map);
|
||||
m_maincpu->set_addrmap(AS_IO, &talkingbb_state::main_io);
|
||||
m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write));
|
||||
m_maincpu->port_out_cb<3>().set(FUNC(talkingbb_state::bank_w));
|
||||
m_maincpu->port_in_cb<3>().set(FUNC(talkingbb_state::switch_r));
|
||||
|
||||
/* video hardware */
|
||||
for (int i = 0; i < 12; i++)
|
||||
TIMER(config, m_delay_display[i]).configure_generic(FUNC(talkingbb_state::delay_display));
|
||||
|
||||
config.set_default_layout(layout_talkingbb);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "speaker").front_center();
|
||||
DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5);
|
||||
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
|
||||
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
|
||||
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
ROM Definitions
|
||||
******************************************************************************/
|
||||
|
||||
ROM_START( talkingbb )
|
||||
ROM_REGION( 0x20000, "maincpu", 0 )
|
||||
ROM_LOAD("sp17208-002", 0x0000, 0x20000, CRC(e0e56217) SHA1(24a06b5c94a5c750799f61e3eb865e02d6cea68a) ) // GM231000-110
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Drivers
|
||||
******************************************************************************/
|
||||
|
||||
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
|
||||
CONS( 1988, talkingbb, 0, 0, talkingbb, talkingbb, talkingbb_state, empty_init, "Parker Brothers", "Starting Lineup Talking Baseball", MACHINE_SUPPORTS_SAVE )
|
264
src/mame/drivers/talkingfb.cpp
Normal file
264
src/mame/drivers/talkingfb.cpp
Normal file
@ -0,0 +1,264 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:hap
|
||||
// thanks-to:Kevin Horton
|
||||
/******************************************************************************
|
||||
|
||||
Parker Brothers Superstar Lineup Talking Football
|
||||
|
||||
Hardware notes:
|
||||
- PCB label KPT-410 REV B1 (*KPT = Kenner Parker Toys)
|
||||
- 80C31 MCU @ 12MHz
|
||||
- 2KB RAM, 256KB ROM, 2 cartridge slots
|
||||
- two 20-button keypads
|
||||
|
||||
Like Baseball, The ROM chip has (C) Tonka.
|
||||
The speech driver is by Mozer, the ROM data includes employees names.
|
||||
|
||||
The cartridge slots are probably meant for extra teams. I can't find anything
|
||||
about it in the manual or any proof that cartridges were released for this.
|
||||
Maybe the toy went out of production soon after release.
|
||||
|
||||
The game includes formation cards, refer to the manual on which number is which strategy.
|
||||
|
||||
TODO:
|
||||
- add cartridge slots (no need if no carts exist?)
|
||||
- verify keypad (everything seems ok, but "Pursue" and "Go For Turnover" might
|
||||
be swapped, their function is nearly identical so it's hard to test)
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/mcs51/mcs51.h"
|
||||
#include "sound/dac.h"
|
||||
#include "sound/volt_reg.h"
|
||||
#include "speaker.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class talkingfb_state : public driver_device
|
||||
{
|
||||
public:
|
||||
talkingfb_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_rom(*this, "maincpu"),
|
||||
m_inputs(*this, "IN.%u", 0)
|
||||
{ }
|
||||
|
||||
void talkingfb(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
|
||||
private:
|
||||
// devices/pointers
|
||||
required_device<mcs51_cpu_device> m_maincpu;
|
||||
required_region_ptr<u8> m_rom;
|
||||
required_ioport_array<5> m_inputs;
|
||||
|
||||
void main_map(address_map &map);
|
||||
void main_io(address_map &map);
|
||||
|
||||
u8 m_bank;
|
||||
u8 m_inp_mux;
|
||||
|
||||
// I/O handlers
|
||||
DECLARE_WRITE8_MEMBER(bank_w);
|
||||
template<int Psen> DECLARE_READ8_MEMBER(bank_r);
|
||||
DECLARE_WRITE8_MEMBER(input_w);
|
||||
DECLARE_READ8_MEMBER(input_r);
|
||||
};
|
||||
|
||||
void talkingfb_state::machine_start()
|
||||
{
|
||||
// zerofill
|
||||
m_bank = 0;
|
||||
m_inp_mux = 0;
|
||||
|
||||
// register for savestates
|
||||
save_item(NAME(m_bank));
|
||||
save_item(NAME(m_inp_mux));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
I/O
|
||||
******************************************************************************/
|
||||
|
||||
WRITE8_MEMBER(talkingfb_state::bank_w)
|
||||
{
|
||||
// d0-d2: upper rom bank
|
||||
// d3-d5: upper rom enable (bus conflict possible)
|
||||
// d3: cart slot 1, d4: cart slot 2, d5: internal rom
|
||||
m_bank = data;
|
||||
}
|
||||
|
||||
template<int Psen>
|
||||
READ8_MEMBER(talkingfb_state::bank_r)
|
||||
{
|
||||
u32 hi = (m_bank & 7) << 15;
|
||||
u8 data = (m_bank & 0x20) ? 0xff : m_rom[offset | hi];
|
||||
|
||||
// cartridge slots are only enabled if PSEN is high
|
||||
// TODO
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(talkingfb_state::input_w)
|
||||
{
|
||||
// d3-d7: input mux
|
||||
m_inp_mux = data >> 3;
|
||||
}
|
||||
|
||||
READ8_MEMBER(talkingfb_state::input_r)
|
||||
{
|
||||
u8 data = 0;
|
||||
|
||||
// multiplexed inputs
|
||||
for (int i = 0; i < 5; i++)
|
||||
if (BIT(~m_inp_mux, i))
|
||||
data |= m_inputs[i]->read();
|
||||
|
||||
return ~data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Address Maps
|
||||
******************************************************************************/
|
||||
|
||||
void talkingfb_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom();
|
||||
map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<0>));
|
||||
}
|
||||
|
||||
void talkingfb_state::main_io(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x07ff).mirror(0x3800).ram();
|
||||
map(0x4000, 0x4000).mirror(0x3fff).rw(FUNC(talkingfb_state::input_r), FUNC(talkingfb_state::input_w));
|
||||
map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<1>));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Input Ports
|
||||
******************************************************************************/
|
||||
|
||||
/* keypad layout is like this: (P1 = Home, P2 = Away, both keypads are same)
|
||||
|
||||
OFFENSIVE [1 [2 [3 DEFENSIVE
|
||||
ACTION HB] FB] ST] ACTION
|
||||
|
||||
[SCRAM/ [SCORE] [4 [5 [6 [PURSUE]
|
||||
EVADE] FL] WR] TE]
|
||||
|
||||
[PASS OUT/ [TIME [7] [8 [9] [GO FOR
|
||||
RUN OUT] OUT] SE] TURNOVER]
|
||||
|
||||
[CHECK OFF [REPLAY] [YES/ [0 [NO/
|
||||
TO BACK] ENTER] DEMO] CANCEL]
|
||||
|
||||
*/
|
||||
|
||||
static INPUT_PORTS_START( talkingfb )
|
||||
PORT_START("IN.0")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Pursue")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Scram / Evade")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Pass Out / Run Out")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Check Off To Back")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pursue")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Scram / Evade")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Pass Out / Run Out")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("P1 Check Off To Back")
|
||||
|
||||
PORT_START("IN.1")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Go For Turnover")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Time Out")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Replay")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Go For Turnover")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Time Out")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("P1 Replay")
|
||||
|
||||
PORT_START("IN.2")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P2 1 / HB")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P2 4 / FL")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P2 7")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("P1 1 / HB")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("P1 4 / FL")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("P1 7")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter")
|
||||
|
||||
PORT_START("IN.3")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P2 2 / FB")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P2 5 / WR")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P2 8 / SE")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P2 0 / Demo")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("P1 2 / FB")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("P1 5 / WR")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("P1 8 / SE")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("P1 0 / Demo")
|
||||
|
||||
PORT_START("IN.4")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P2 3 / ST")
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P2 6 / TE")
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P2 9")
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel")
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("P1 3 / ST")
|
||||
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("P1 6 / TE")
|
||||
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("P1 9")
|
||||
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Machine Configs
|
||||
******************************************************************************/
|
||||
|
||||
void talkingfb_state::talkingfb(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
I80C31(config, m_maincpu, 12_MHz_XTAL);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &talkingfb_state::main_map);
|
||||
m_maincpu->set_addrmap(AS_IO, &talkingfb_state::main_io);
|
||||
m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write));
|
||||
m_maincpu->port_out_cb<3>().set(FUNC(talkingfb_state::bank_w));
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "speaker").front_center();
|
||||
DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5);
|
||||
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
|
||||
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
|
||||
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
ROM Definitions
|
||||
******************************************************************************/
|
||||
|
||||
ROM_START( talkingfb )
|
||||
ROM_REGION( 0x40000, "maincpu", 0 )
|
||||
ROM_LOAD("sp17492-001", 0x0000, 0x40000, CRC(d03851c6) SHA1(e8ac9c342bee987657c3c18f24d466b3906d6fb0) ) // Sharp LH532378
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Drivers
|
||||
******************************************************************************/
|
||||
|
||||
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
|
||||
CONS( 1989, talkingfb, 0, 0, talkingfb, talkingfb, talkingfb_state, empty_init, "Parker Brothers", "Superstar Lineup Talking Football", MACHINE_SUPPORTS_SAVE )
|
48
src/mame/layout/talkingbb.lay
Normal file
48
src/mame/layout/talkingbb.lay
Normal file
@ -0,0 +1,48 @@
|
||||
<?xml version="1.0"?>
|
||||
<mamelayout version="2">
|
||||
|
||||
<!-- define elements -->
|
||||
|
||||
<element name="white"><rect><color red="0.9" green="0.9" blue="0.9" /></rect></element>
|
||||
<element name="yellow"><rect><color red="0.8" green="0.75" blue="0.6" /></rect></element>
|
||||
<element name="black"><rect><color red="0" green="0" blue="0" /></rect></element>
|
||||
|
||||
<element name="led" defstate="0">
|
||||
<disk state="0"><color red="0.15" green="0.015" blue="0.02" /></disk>
|
||||
<disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
|
||||
</element>
|
||||
|
||||
|
||||
<!-- build screen -->
|
||||
|
||||
<view name="Internal Layout">
|
||||
<bounds left="14.85" right="30.15" top="8.85" bottom="26.15" />
|
||||
|
||||
<bezel element="yellow"><bounds x="14.5" y="8.5" width="16" height="18" /></bezel>
|
||||
|
||||
<bezel element="black"><bounds x="19.35" y="19.35" width="6.3" height="6.3" /></bezel>
|
||||
<bezel element="white"><bounds x="19.5" y="19.5" width="6" height="6" /></bezel>
|
||||
<bezel name="led1" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
|
||||
<bezel name="led2" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
|
||||
<bezel name="led3" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
|
||||
<bezel name="led5" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
|
||||
<bezel name="led6" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
|
||||
<bezel name="led7" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
|
||||
<bezel name="led9" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
|
||||
<bezel name="led10" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
|
||||
<bezel name="led11" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
|
||||
|
||||
<bezel element="black"><bounds x="15.35" y="15.35" width="2.3" height="2.3" /></bezel>
|
||||
<bezel element="white"><bounds x="15.5" y="15.5" width="2" height="2" /></bezel>
|
||||
<bezel name="led0" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
|
||||
|
||||
<bezel element="black"><bounds x="27.35" y="15.35" width="2.3" height="2.3" /></bezel>
|
||||
<bezel element="white"><bounds x="27.5" y="15.5" width="2" height="2" /></bezel>
|
||||
<bezel name="led8" element="led"><bounds x="28" y="16" width="1" height="1" /></bezel>
|
||||
|
||||
<bezel element="black"><bounds x="21.35" y="9.35" width="2.3" height="2.3" /></bezel>
|
||||
<bezel element="white"><bounds x="21.5" y="9.5" width="2" height="2" /></bezel>
|
||||
<bezel name="led4" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
|
||||
|
||||
</view>
|
||||
</mamelayout>
|
@ -37326,6 +37326,12 @@ taitotz //
|
||||
@source:taitowlf.cpp
|
||||
pf2012 // E59 (c) 1997 Taito
|
||||
|
||||
@source:talkingbb.cpp
|
||||
talkingbb
|
||||
|
||||
@source:talkingfb.cpp
|
||||
talkingfb
|
||||
|
||||
@source:tamag1.cpp
|
||||
tama // Bandai
|
||||
|
||||
|
@ -758,6 +758,8 @@ symbolics.cpp
|
||||
sys2900.cpp
|
||||
sys9002.cpp
|
||||
systec.cpp
|
||||
talkingbb.cpp
|
||||
talkingfb.cpp
|
||||
tamag1.cpp
|
||||
tandy1t.cpp
|
||||
tandy2k.cpp
|
||||
|
Loading…
Reference in New Issue
Block a user