New working machines

--------------------
Playmaker: Hockey, Soccer, Basketball [hap, Sean Riddle]
This commit is contained in:
hap 2022-02-22 20:49:21 +01:00
parent dc7d590ae2
commit c17b6c5dd9
8 changed files with 313 additions and 40 deletions

46
hash/playmaker.xml Normal file
View File

@ -0,0 +1,46 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0
-->
<softwarelist name="playmaker" description="Tiger Playmaker playcards">
<!--
3 playcards came with the handheld: Basketball, Hockey, Soccer.
Each playcard also functions as a screen overlay, but MAME doesn't support this yet
through the softwarelist.
-->
<software name="baskball">
<description>Basketball</description>
<year>1980</year>
<publisher>Tiger Electronics</publisher>
<part name="cart" interface="playmaker_cart">
<feature name="notch" value="0x1" />
<dataarea name="nodata" size="0x10"></dataarea>
</part>
</software>
<software name="hockey">
<description>Hockey</description>
<year>1980</year>
<publisher>Tiger Electronics</publisher>
<part name="cart" interface="playmaker_cart">
<feature name="notch" value="0x3" />
<dataarea name="nodata" size="0x10"></dataarea>
</part>
</software>
<software name="soccer">
<description>Soccer</description>
<year>1980</year>
<publisher>Tiger Electronics</publisher>
<part name="cart" interface="playmaker_cart">
<feature name="notch" value="0x2" />
<dataarea name="nodata" size="0x10"></dataarea>
</part>
</software>
</softwarelist>

View File

@ -22,7 +22,7 @@ through the softwarelist.
<year>1981</year>
<publisher>Coleco</publisher>
<part name="cart" interface="tc4_cart">
<feature name="pinout" value="0x01" />
<feature name="pinout" value="0x1" />
<dataarea name="nodata" size="0x10"></dataarea>
</part>
</software>
@ -32,7 +32,7 @@ through the softwarelist.
<year>1981</year>
<publisher>Coleco</publisher>
<part name="cart" interface="tc4_cart">
<feature name="pinout" value="0x08" />
<feature name="pinout" value="0x8" />
<dataarea name="nodata" size="0x10"></dataarea>
</part>
</software>
@ -42,7 +42,7 @@ through the softwarelist.
<year>1981</year>
<publisher>Coleco</publisher>
<part name="cart" interface="tc4_cart">
<feature name="pinout" value="0x04" />
<feature name="pinout" value="0x4" />
<dataarea name="nodata" size="0x10"></dataarea>
</part>
</software>
@ -52,7 +52,7 @@ through the softwarelist.
<year>1981</year>
<publisher>Coleco</publisher>
<part name="cart" interface="tc4_cart">
<feature name="pinout" value="0x02" />
<feature name="pinout" value="0x2" />
<dataarea name="nodata" size="0x10"></dataarea>
</part>
</software>

View File

@ -23,7 +23,7 @@ using the same ROM as the original Chesster. Model 6124 extra hardware is on a
daughterboard, the housing is the same as model 6100, except for button labels.
Model 6126 has a dedicated PCB, this version also has a motion sensor at the front
and 2 leds to mimick eyes, and the housing is green instead of beige.
and 2 leds to mimick eyes, and the housing color theme is green instead of beige.
To play, wait until the motor is finished before making a move. At boot-up, the
computer will do a self-test.
@ -35,6 +35,12 @@ TODO:
- cphantom artwork should be green instead of beige
- motor position in artwork?
BTANB:
- cphantom: As the manual suggests, the computer's move should be displayed on the
LCD while it's moving the piece just like in fphantom, but this is often too brief
or not displayed at all. (This may seem like a minor bug in the game, but it
actually makes it more difficult to write a MAME UCI plugin for this driver.)
******************************************************************************/
#include "emu.h"

View File

@ -53,7 +53,7 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
@MP1204 TMS1100 1980, Entex Baseball 3 (6007)
*MP1209 TMS1100 1980, U.S. Games Space Cruiser/Strategy Football
@MP1211 TMS1100 1980, Entex Space Invader (6012)
*MP1215 TMS1100 1980, Tiger Playmaker
@MP1215 TMS1100 1980, Tiger Playmaker
@MP1218 TMS1100 1980, Entex Basketball 2 (6010)
@MP1219 TMS1100 1980, U.S. Games Super Sports-4
@MP1221 TMS1100 1980, Entex Raise The Devil (6011)
@ -261,6 +261,7 @@ TODO:
#include "palmmd8.lh"
#include "pbmastm.lh"
#include "phpball.lh"
#include "playmaker.lh"
#include "qfire.lh" // clickable
#include "quizwizc.lh"
#include "raisedvl.lh"
@ -2381,8 +2382,7 @@ class quizwizc_state : public hh_tms1k_state
{
public:
quizwizc_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_tms1k_state(mconfig, type, tag),
m_pinout(0)
hh_tms1k_state(mconfig, type, tag)
{ }
void quizwizc(machine_config &config);
@ -2392,7 +2392,7 @@ protected:
private:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
u16 m_pinout; // cartridge R pins
u16 m_pinout = 0x07; // cartridge R pins
void update_display();
void write_r(u16 data);
@ -2419,10 +2419,16 @@ DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state::cart_load)
}
// get cartridge pinout K1 to R connections
std::string pinout(image.get_feature("pinout"));
m_pinout = std::stoul(pinout, nullptr, 2) & 0xe7;
const char *pinout = image.get_feature("pinout");
m_pinout = pinout ? strtoul(pinout, nullptr, 2) & 0xe7 : 0;
m_pinout = bitswap<8>(m_pinout,4,3,7,5,2,1,6,0) << 4;
if (m_pinout == 0)
{
image.seterror(image_error::INVALIDIMAGE, "Invalid cartridge pinout");
return image_init_result::FAIL;
}
return image_init_result::PASS;
}
@ -2571,8 +2577,7 @@ class tc4_state : public hh_tms1k_state
{
public:
tc4_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_tms1k_state(mconfig, type, tag),
m_pinout(0)
hh_tms1k_state(mconfig, type, tag)
{ }
void tc4(machine_config &config);
@ -2582,7 +2587,7 @@ protected:
private:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
u8 m_pinout; // cartridge K pins
u8 m_pinout = 0xf; // cartridge K pins
void update_display();
void write_r(u16 data);
@ -2609,8 +2614,8 @@ DEVICE_IMAGE_LOAD_MEMBER(tc4_state::cart_load)
}
// get cartridge pinout R9 to K connections
std::string pinout(image.get_feature("pinout"));
m_pinout = std::stoul(pinout, nullptr, 0) & 0xf;
const char *pinout = image.get_feature("pinout");
m_pinout = pinout ? strtoul(pinout, nullptr, 0) & 0xf : 0xf;
return image_init_result::PASS;
}
@ -5242,8 +5247,6 @@ public:
void gpoker(machine_config &config);
protected:
virtual void machine_reset() override;
required_device<beep_device> m_beeper;
void update_display();
@ -5252,12 +5255,6 @@ protected:
virtual u8 read_k();
};
void gpoker_state::machine_reset()
{
hh_tms1k_state::machine_reset();
m_beeper->set_state(0);
}
// handlers
void gpoker_state::update_display()
@ -12316,7 +12313,170 @@ ROM_END
/***************************************************************************
Tiger Deluxe Football (model 7-550)
Tiger Playmaker: Hockey, Soccer, Basketball (model 7-540 or 7-540A)
* TMS1100 MP1215 (die label 1100B MP1215)
* 2-digit 7seg LED display + 40 other LEDs, 1-bit sound
The games are on playcards(Tiger calls them that), the hardware detects which
game is inserted from a notch at the lower-right. The playcards also function
as an overlay. MAME external artwork is needed for those.
Booting the handheld with no playcard inserted will initiate a halftime show.
"Playmaker" is actually Tiger's trademark for the d-pad controller, this
controller term was also used in for example Deluxe Football, and 7 in 1 Sports
Stadium. The d-pad has a ball shape at the bottom that sits on a concave base.
Note that this was 2 years before Nintendo's d-pad invention.
***************************************************************************/
class playmaker_state : public hh_tms1k_state
{
public:
playmaker_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_tms1k_state(mconfig, type, tag)
{ }
void playmaker(machine_config &config);
protected:
virtual void machine_start() override;
private:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
u8 m_notch = 0; // cartridge K1/K2
void update_display();
void write_r(u16 data);
void write_o(u16 data);
u8 read_k();
};
void playmaker_state::machine_start()
{
hh_tms1k_state::machine_start();
// register for savestates
save_item(NAME(m_notch));
}
// handlers
DEVICE_IMAGE_LOAD_MEMBER(playmaker_state::cart_load)
{
if (!image.loaded_through_softlist())
{
image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist");
return image_init_result::FAIL;
}
// get cartridge notch
const char *notch = image.get_feature("notch");
m_notch = notch ? strtoul(notch, nullptr, 0) & 3 : 0;
return image_init_result::PASS;
}
void playmaker_state::update_display()
{
m_display->matrix(m_r, m_o);
}
void playmaker_state::write_r(u16 data)
{
// R10: speaker out
m_speaker->level_w(data >> 10 & 1);
// R0-R3: input mux
m_inp_mux = data & 0xf;
// R0-R7: led select
// R8,R9: digit select
m_r = data;
update_display();
}
void playmaker_state::write_o(u16 data)
{
// O0-O6: led data
m_o = data;
update_display();
}
u8 playmaker_state::read_k()
{
// K: multiplexed inputs, cartridge notch from R3
return read_inputs(3) | ((m_inp_mux & 8) ? m_notch : 0);
}
// config
static INPUT_PORTS_START( playmaker )
PORT_START("IN.0") // R0
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
PORT_START("IN.1") // R1
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL
PORT_START("IN.2") // R2
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Shoot")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot / P1 Skill")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / P2 Skill")
INPUT_PORTS_END
void playmaker_state::playmaker(machine_config &config)
{
// basic machine hardware
TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=20K, C=250pF
m_maincpu->k().set(FUNC(playmaker_state::read_k));
m_maincpu->r().set(FUNC(playmaker_state::write_r));
m_maincpu->o().set(FUNC(playmaker_state::write_o));
// video hardware
PWM_DISPLAY(config, m_display).set_size(10, 7);
m_display->set_segmask(0x300, 0x7f);
m_display->set_bri_levels(0.004, 0.04); // player 1 leds are brighter
config.set_default_layout(layout_playmaker);
// sound hardware
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker);
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
// cartridge
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "playmaker_cart"));
cartslot.set_must_be_loaded(false);
cartslot.set_device_load(FUNC(playmaker_state::cart_load));
SOFTWARE_LIST(config, "cart_list").set_original("playmaker");
}
// roms
ROM_START( playmaker )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "mp1215", 0x0000, 0x0800, CRC(bfc7b6c8) SHA1(33f6e2b86fae2fd9e4b0a4b8dc842c257ca3047d) )
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
ROM_REGION( 365, "maincpu:opla", 0 )
ROM_LOAD( "tms1100_playmaker_output.pla", 0, 365, CRC(0cd484d6) SHA1(4a9af9f3d18af504145690cb0f6444ff1aef26ca) )
ROM_END
/***************************************************************************
Tiger Deluxe Football with Instant Replay (model 7-550)
* TMS1400NLL MP7302 (die label TMS1400 MP7302)
* 4-digit 7seg LED display, 80 red/green LEDs, 1-bit sound
@ -12324,6 +12484,9 @@ ROM_END
playing a 1-player game, the CPU controls green, so on MAME, player 1
is the red side.
Booting the handheld with the Score and Replay buttons held down will
initiate a halftime show.
***************************************************************************/
class dxfootb_state : public hh_tms1k_state
@ -12388,10 +12551,10 @@ static INPUT_PORTS_START( dxfootb )
PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.1") // R4
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Kick")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass")
PORT_START("IN.2") // R5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
@ -12549,7 +12712,7 @@ void ss7in1_state::ss7in1(machine_config &config)
// video hardware
PWM_DISPLAY(config, m_display).set_size(9, 8);
m_display->set_segmask(0xf, 0x7f);
m_display->set_bri_levels(0.01, 0.04); // player led is brighter
m_display->set_bri_levels(0.004, 0.04); // player led is brighter
config.set_default_layout(layout_7in1ss);
// sound hardware
@ -13652,6 +13815,7 @@ CONS( 1979, timaze, 0, 0, timaze, timaze, timaze_state, emp
SYST( 1979, tithermos, 0, 0, tithermos, tithermos, tithermos_state, empty_init, "Texas Instruments", "Electronic Digital Thermostat", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
CONS( 1979, subwars, 0, 0, subwars, subwars, subwars_state, empty_init, "Tiger Electronics", "Sub Wars (LED version)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, playmaker, 0, 0, playmaker, playmaker, playmaker_state, empty_init, "Tiger Electronics", "Playmaker: Hockey, Soccer, Basketball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1980, dxfootb, 0, 0, dxfootb, dxfootb, dxfootb_state, empty_init, "Tiger Electronics", "Deluxe Football with Instant Replay", MACHINE_SUPPORTS_SAVE )
CONS( 1980, 7in1ss, 0, 0, ss7in1, ss7in1, ss7in1_state, empty_init, "Tiger Electronics", "7 in 1 Sports Stadium", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1979, copycat, 0, 0, copycat, copycat, copycat_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-520)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )

View File

@ -7,13 +7,13 @@ license:CC0
<!-- define elements -->
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.25" blue="0.28" /></led7seg>
<led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
</element>
<element name="led" defstate="0">
<disk state="0"><color red="0.1" green="0.025" blue="0.028" /></disk>
<disk state="1"><color red="0.5" green="0.125" blue="0.14" /></disk>
<disk state="2"><color red="1.0" green="0.25" blue="0.28" /></disk>
<disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
<disk state="1"><color red="0.5" green="0.05" blue="0.075" /></disk>
<disk state="2"><color red="1.0" green="0.1" blue="0.15" /></disk>
</element>

View File

@ -7,7 +7,7 @@ license:CC0
<!-- define elements -->
<element name="black"><rect><color red="0" green="0" blue="0" /></rect></element>
<element name="dark"><rect><color red="0.14" green="0.14" blue="0.14" /></rect></element>
<element name="dark"><rect><color red="0.14" green="0.15" blue="0.14" /></rect></element>
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
@ -26,11 +26,11 @@ license:CC0
<!-- main display -->
<group name="display1">
<bounds x="0" y="0" width="30.3" height="15.4" />
<bounds x="0" y="0" width="30.2" height="15.4" />
<!-- bezel (etched, not white) -->
<element ref="dark"><bounds x="0" y="0" width="30.3" height="15.4" /></element>
<element ref="black"><bounds x="0.2" y="0.2" width="29.9" height="15" /></element>
<element ref="dark"><bounds x="0" y="0" width="30.2" height="15.4" /></element>
<element ref="black"><bounds x="0.2" y="0.2" width="29.8" height="15" /></element>
<repeat count="9">
<param name="x" start="3" increment="3" />
@ -73,9 +73,9 @@ license:CC0
<!-- build screen -->
<view name="Internal Layout">
<bounds left="-1" right="21.2" top="-1" bottom="31.3" />
<bounds left="-1" right="21.2" top="-1" bottom="31.2" />
<group ref="display1"><bounds x="0" y="0" width="15.4" height="30.3" /><orientation rotate="90" /></group>
<group ref="display1"><bounds x="0" y="0" width="15.4" height="30.2" /><orientation rotate="90" /></group>
<group ref="display2"><bounds x="17.2" y="10.2" width="3" height="9.8" /><orientation rotate="90" /></group>
</view>
</mamelayout>

View File

@ -0,0 +1,56 @@
<?xml version="1.0"?>
<!--
license:CC0
-->
<mamelayout version="2">
<!-- define elements -->
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
</element>
<element name="led" defstate="0">
<disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
<disk state="1"><color red="0.5" green="0.05" blue="0.075" /></disk>
<disk state="2"><color red="1.0" green="0.1" blue="0.15" /></disk>
</element>
<!-- led matrix -->
<group name="display1">
<bounds x="0" y="0" width="36" height="21" />
<repeat count="5">
<param name="y" start="0" increment="5" />
<param name="i2" start="4" increment="-1" />
<repeat count="8">
<param name="x" start="0" increment="5" />
<param name="i1" start="7" increment="-1" />
<element name="~i1~.~i2~" ref="led"><bounds x="~x~" y="~y~" width="1" height="1" /></element>
</repeat>
</repeat>
</group>
<!-- 7seg leds -->
<group name="display2">
<bounds x="0" y="0" width="5.5" height="3" />
<element name="digit8" ref="digit"><bounds x="0" y="0" width="2" height="3" /></element>
<element name="digit9" ref="digit"><bounds x="3.5" y="0" width="2" height="3" /></element>
</group>
<!-- build screen -->
<view name="Internal Layout">
<bounds left="2.2" right="35" top="-2" bottom="38" />
<group ref="display1"><bounds x="12" y="0" width="21" height="36" /><orientation rotate="270" /></group>
<group ref="display2"><bounds x="4.2" y="14" width="3.8" height="8" /><orientation rotate="270" /></group>
</view>
</mamelayout>

View File

@ -16733,6 +16733,7 @@ palmf31 // Canon
palmmd8 // Canon
pbmastm // Parker Bros
phpball // Tomy
playmaker // Tiger Electronics
qfire // Electroplay
quizwizc // Coleco
raisedvl // Entex