New working machines

--------------------
4 in 1 Electronic Games (VTech) [hap, Sean Riddle]
This commit is contained in:
hap 2022-02-25 22:09:39 +01:00
parent fd45e9cfad
commit 3753498688
7 changed files with 288 additions and 177 deletions

View File

@ -3,27 +3,60 @@
// thanks-to:Sean Riddle, Couriersud
/******************************************************************************
Waddingtons 2001: The Game Machine
It's a tabletop electronic game machine + calculator.
It was possibly created by VTech, but they didn't distribute it by themselves
until later in 1980 as the Computer Game System. There's also a handheld version
"Mini Game Machine". VTech later made a sequel "Game Machine 2" with 5 games.
VTech Game Machine tabletop/handheld
It's a an electronic game machine + calculator.
Hardware notes:
- Mostek MK3870 MCU, 2KB internal ROM
- 12 digits 7seg VFD panel
- MC1455P(555 timer) + bunch of discrete components for sound
- Mostek MK3870 MCU (2KB internal ROM)
- 12 digits 7seg VFD/LED panel (LED handheld version has 4 extra LEDs)
- tabletop: MC1455P(555 timer) + bunch of discrete components for sound
- handheld: simple 1-bit sound
TODO:
- MCU frequency was measured approx 2.1MHz on its XTL2 pin, but considering that
the MK3870 has an internal /2 divider, this is way too slow when compared to
video references of the game
CPU Frequency should be around 4 to 4.5MHz. Sean's measurement and video of
the LED handheld version is around 4.4MHz, and there are other video references
on YouTube with slower speed. Sean's measurement of the bigger Game Machine was
around 2.1MHz, that's way too slow compared to video references and it was perhaps
a case of measuring equipment influencing CPU speed.
The I/O for the tabletop and handheld version is nearly identical, enough to
put them in the same MAME driver. The main difference is the more complex sound
on the tabletop version.
The first version should be the tabletop (lower ROM serial). It was created by
VTech, but they didn't distribute it by themselves* until later in 1980 as the
Computer Game System. VTech Computron/Lesson One has a very similar design.
*: Apparently, VTech (Hong Kong company) first couple of products were published
through foreign companies. It wasn't until around 1980 when they started publishing
under their own brand.
Known releases:
Tabletop version:
- Waddingtons 2001: The Game Machine, by Waddingtons
- Computer Game System, by VTech
- Computer Game System, by Cheryco (Japan)
- Bingo 2000: Der Spiele-Computer, by Cheryco
- Game Machine 2, by VTech (sequel with 5 games)
Handheld LED version (Speedway, Brain Drain, Blackjack, Calculator):
- 4 in 1 Electronic Games (model CGS-2011), by VTech
- Electronic Games (model 60-2143), by Tandy (Radio Shack brand)
- 4-in-1 Electronic Computer Game, by Grandstand
- Enterprise, by Videomaster (this is Waddingtons)
- Micro-Game Centre, by Prinztronic
Handheld VFD version (Code Hunter, Grand Prix, Sub Hunt, Blackjack):
- Mini Game Machine, by VTech
- Mini Game Machine, by House of Games (this is Waddingtons)
- The Game Machine, by Grandstand
BTANB:
- some digit segments get stuck after crashing in the GP game
- gamemach: some digit segments get stuck after crashing in the GP game
*******************************************************************************
===============================================================================
Tabletop version notes:
After boot, press a number to start a game:
0: 4 Function Calculator (not a game)
@ -60,30 +93,38 @@ Grand Prix:
******************************************************************************/
#include "emu.h"
#include "cpu/f8/f8.h"
#include "video/pwm.h"
#include "machine/f3853.h"
#include "speaker.h"
#include "machine/netlist.h"
#include "sound/spkrdev.h"
#include "speaker.h"
#include "audio/nl_gamemachine.h"
// internal artwork
#include "tgm.lh"
#include "gamemach.lh"
#include "v4in1eg.lh"
namespace {
class tgm_state : public driver_device
class gm_state : public driver_device
{
public:
tgm_state(const machine_config &mconfig, device_type type, const char *tag) :
gm_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_psu(*this, "psu"),
m_display(*this, "display"),
m_audio_pin(*this, "snd_nl:p%02u", 8U),
m_speaker(*this, "speaker"),
m_snd_nl_pin(*this, "snd_nl:p%02u", 8U),
m_inputs(*this, "IN.%u", 0)
{ }
void tgm(machine_config &config);
void v4in1eg(machine_config &config);
void gamemach(machine_config &config);
protected:
virtual void machine_start() override;
@ -91,9 +132,11 @@ protected:
private:
// devices/pointers
required_device<cpu_device> m_maincpu;
required_device<f38t56_device> m_psu;
required_device<pwm_display_device> m_display;
required_device_array<netlist_mame_logic_input_device, 8> m_audio_pin;
required_ioport_array<10> m_inputs;
optional_device<speaker_sound_device> m_speaker;
optional_device_array<netlist_mame_logic_input_device, 8> m_snd_nl_pin;
required_ioport_array<2> m_inputs;
void main_map(address_map &map);
void main_io(address_map &map);
@ -104,23 +147,20 @@ private:
void digit_w(u8 data);
u8 input_r();
void sound_w(u8 data);
void discrete_w(u8 data);
u8 sound_r();
u16 m_inp_mux;
u16 m_digit_select;
u8 m_digit_data;
u16 m_mux = 0;
u8 m_seg_data = 0;
u8 m_sound_data = 0;
};
void tgm_state::machine_start()
void gm_state::machine_start()
{
// zerofill
m_inp_mux = 0;
m_digit_select = 0;
m_digit_data = 0;
// register for savestates
save_item(NAME(m_inp_mux));
save_item(NAME(m_digit_select));
save_item(NAME(m_digit_data));
save_item(NAME(m_mux));
save_item(NAME(m_seg_data));
save_item(NAME(m_sound_data));
}
@ -129,58 +169,69 @@ void tgm_state::machine_start()
I/O
******************************************************************************/
// MK3870 ports
void tgm_state::update_display()
void gm_state::update_display()
{
// output VFD digit data
m_display->matrix(m_digit_select, m_digit_data);
m_display->matrix(m_mux, m_seg_data);
}
void tgm_state::mux1_w(u8 data)
void gm_state::mux1_w(u8 data)
{
// P00-P06: input mux part
m_inp_mux = (m_inp_mux & 7) | (data << 3 & 0x3f8);
// P00-P07: digit select part
m_digit_select = (m_digit_select & 0xf) | (data << 4);
// P00-P07: mux part
m_mux = (m_mux & ~0xff0) | (data << 4 & 0xff0);
update_display();
}
void tgm_state::mux2_w(u8 data)
void gm_state::mux2_w(u8 data)
{
// P15-P17: input mux part
m_inp_mux = (m_inp_mux & 0x3f8) | (data >> 5 & 7);
// P14-P17: digit select part
m_digit_select = (m_digit_select & 0xff0) | (data >> 4 & 0xf);
// P14-P17: mux part
m_mux = (m_mux & ~0xf) | (data >> 4 & 0xf);
update_display();
}
void tgm_state::digit_w(u8 data)
void gm_state::digit_w(u8 data)
{
// P50-P57: digit 7seg data
m_digit_data = bitswap<8>(data,0,1,2,3,4,5,6,7);
m_seg_data = bitswap<8>(data,0,1,2,3,4,5,6,7);
update_display();
}
u8 tgm_state::input_r()
u8 gm_state::input_r()
{
u8 data = 0;
// P12,P13: multiplexed inputs
for (int i = 0; i < 10; i++)
if (m_inp_mux >> i & 1)
data |= m_inputs[i]->read();
for (int i = 0; i < 12; i++)
if (BIT(m_mux, i))
for (int j = 0; j < 2; j++)
data |= BIT(m_inputs[j]->read(), i) << j;
return data << 2;
}
void tgm_state::sound_w(u8 data)
void gm_state::sound_w(u8 data)
{
// P40-P47: 555 to speaker (see netlist above)
m_sound_data = data;
// P40: speaker out
m_speaker->level_w(data & 1);
// P44-P47: 4 extra leds
m_mux = (m_mux & ~0xf000) | (bitswap<4>(data,7,6,4,5) << 12);
update_display();
}
void gm_state::discrete_w(u8 data)
{
m_sound_data = data;
// P40-P47: 555 to speaker (see nl_gamemachine.cpp)
for (int i = 0; i < 8; i++)
m_audio_pin[i]->write_line(BIT(~data, i));
m_snd_nl_pin[i]->write_line(BIT(~data, i));
}
u8 gm_state::sound_r()
{
return m_sound_data;
}
@ -189,16 +240,16 @@ void tgm_state::sound_w(u8 data)
Address Maps
******************************************************************************/
void tgm_state::main_map(address_map &map)
void gm_state::main_map(address_map &map)
{
map.global_mask(0x07ff);
map(0x0000, 0x07ff).rom();
}
void tgm_state::main_io(address_map &map)
void gm_state::main_io(address_map &map)
{
map(0x00, 0x00).w(FUNC(tgm_state::mux1_w));
map(0x01, 0x01).rw(FUNC(tgm_state::input_r), FUNC(tgm_state::mux2_w));
map(0x00, 0x00).w(FUNC(gm_state::mux1_w));
map(0x01, 0x01).rw(FUNC(gm_state::input_r), FUNC(gm_state::mux2_w));
map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write));
}
@ -208,46 +259,64 @@ void tgm_state::main_io(address_map &map)
Input Ports
******************************************************************************/
static INPUT_PORTS_START( tgm )
static INPUT_PORTS_START( gamemach )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COLON) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("CL")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COLON) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("CL")
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME(u8"÷")
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_ASTERISK) PORT_CODE(KEYCODE_UP) PORT_NAME(u8"×")
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=")
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("+=")
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_END) PORT_NAME("MR")
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_HOME) PORT_NAME("MS")
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_R) PORT_NAME("Return")
PORT_BIT(0x800, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME(u8"÷")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("7")
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
PORT_BIT(0x800, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_ASTERISK) PORT_CODE(KEYCODE_UP) PORT_NAME(u8"×")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("7")
static INPUT_PORTS_START( v4in1eg )
PORT_START("IN.0")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("G2: Code / M+")
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("G2: Manual / M-")
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("G2: Exam / MR")
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("G2: Enter / MC")
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("G3: Black Jack")
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("G2: Brain Drain")
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("G4: Calc. / C/CE")
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("G1: Speed Way")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("G3: Total / =")
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"G1: Up / ÷")
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"G1: Down / ×")
PORT_BIT(0x800, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("G3: Insur. / -")
PORT_START("IN.3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
PORT_START("IN.4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("+=")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
PORT_START("IN.5")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
PORT_START("IN.6")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
PORT_START("IN.7")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_END) PORT_NAME("MR")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_HOME) PORT_NAME("MS")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
PORT_START("IN.9")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_R) PORT_NAME("Return")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
PORT_START("IN.1")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("G3: Clear / +")
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("G3: Bet / .")
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G1: Gas / 7")
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("G1: Brake / 4")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("G3: Split / 3")
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("G3: Double / 2")
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("G3: Hit / 1")
PORT_BIT(0x800, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("G3: Stand / 0")
INPUT_PORTS_END
@ -256,28 +325,41 @@ INPUT_PORTS_END
Machine Configs
******************************************************************************/
void tgm_state::tgm(machine_config &config)
void gm_state::v4in1eg(machine_config &config)
{
/* basic machine hardware */
F8(config, m_maincpu, 4000000/2); // MK3870, frequency is approximate
m_maincpu->set_addrmap(AS_PROGRAM, &tgm_state::main_map);
m_maincpu->set_addrmap(AS_IO, &tgm_state::main_io);
// basic machine hardware
F8(config, m_maincpu, 4200000/2); // MK3870, approximation (internal /2 divider)
m_maincpu->set_addrmap(AS_PROGRAM, &gm_state::main_map);
m_maincpu->set_addrmap(AS_IO, &gm_state::main_io);
f38t56_device &psu(F38T56(config, "psu", 4000000/2));
psu.write_a().set(FUNC(tgm_state::sound_w));
psu.write_b().set(FUNC(tgm_state::digit_w));
F38T56(config, m_psu, 4200000/2);
m_psu->write_a().set(FUNC(gm_state::sound_w));
m_psu->read_a().set(FUNC(gm_state::sound_r));
m_psu->write_b().set(FUNC(gm_state::digit_w));
/* video hardware */
PWM_DISPLAY(config, m_display).set_size(12, 8);
// video hardware
PWM_DISPLAY(config, m_display).set_size(12+4, 8);
m_display->set_segmask(0xfff, 0xff);
config.set_default_layout(layout_tgm);
m_display->set_bri_levels(0.01, 0.1); // player led may be brighter
config.set_default_layout(layout_v4in1eg);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
NETLIST_SOUND(config, "snd_nl", 48000)
.set_source(NETLIST_NAME(gamemachine))
.add_route(ALL_OUTPUTS, "speaker", 1.0);
// sound hardware
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker);
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
void gm_state::gamemach(machine_config &config)
{
v4in1eg(config);
// basic machine hardware
m_psu->write_a().set(FUNC(gm_state::discrete_w));
config.set_default_layout(layout_gamemach);
// sound hardware
NETLIST_SOUND(config, "snd_nl", 48000).set_source(NETLIST_NAME(gamemachine)).add_route(ALL_OUTPUTS, "mono", 1.0);
NETLIST_STREAM_OUTPUT(config, "snd_nl:cout0", 0, "SPK1.2").set_mult_offset(-10000.0 / 32768.0, 10000.0 * 3.75 / 32768.0);
NETLIST_LOGIC_INPUT(config, "snd_nl:p08", "P08.IN", 0);
@ -296,11 +378,16 @@ void tgm_state::tgm(machine_config &config)
ROM Definitions
******************************************************************************/
ROM_START( 2001tgm )
ROM_START( gamemach )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD("mk14154n_2001", 0x0000, 0x0800, CRC(6d524c32) SHA1(73d84e59952b751c76dff8bf259b98e1f9136b41) )
ROM_END
ROM_START( v4in1eg )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD("mk14336n_2011", 0x0000, 0x0800, CRC(1846a033) SHA1(8bceff44d80a5d3c1ef6f80a79d03f4083edc280) )
ROM_END
} // anonymous namespace
@ -309,5 +396,7 @@ ROM_END
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1978, 2001tgm, 0, 0, tgm, tgm, tgm_state, empty_init, "Waddingtons", "2001: The Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1978, gamemach, 0, 0, gamemach, gamemach, gm_state, empty_init, "VTech / Waddingtons", "The Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
CONS( 1979, v4in1eg, 0, 0, v4in1eg, v4in1eg, gm_state, empty_init, "VTech", "4 in 1 Electronic Games (VTech)", MACHINE_SUPPORTS_SAVE )

View File

@ -0,0 +1,23 @@
<?xml version="1.0"?>
<!--
license:CC0
-->
<mamelayout version="2">
<!-- define elements -->
<element name="digit" defstate="0">
<led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
</element>
<!-- build screen -->
<view name="Internal Layout">
<repeat count="12">
<param name="x" start="0" increment="2.5" />
<param name="i" start="11" increment="-1" />
<element name="digit~i~" ref="digit"><bounds x="~x~" y="0" width="2" height="2.9" /></element>
</repeat>
</view>
</mamelayout>

View File

@ -10,129 +10,105 @@ license:CC0
<element name="text_places" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="PLACES" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="PLACES" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_shows" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="SHOWS" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="SHOWS" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_earnings" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="EARNINGS" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="EARNINGS" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_oflast5" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="OF LAST 5 RACES" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="OF LAST 5 RACES" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_rating" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="RATING" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="RATING" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_finpos" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="FINISH POSITION" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="FINISH POSITION" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_finish" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="FINISH" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="FINISH" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_3call" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="3RD CALL" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="3RD CALL" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_curyear" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="CURRENT YEAR" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="CURRENT YEAR" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_pastyear" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="PAST YEAR" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="PAST YEAR" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_rsl" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="RACES SINCE LAYOFF" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="RACES SINCE LAYOFF" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_distance" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="DISTANCE" align="2"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="DISTANCE" align="2"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_postpos" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="POST POSITION" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="POST POSITION" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_3rb" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="3RD RACE BACK" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="3RD RACE BACK" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_2rb" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="2ND RACE BACK" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="2ND RACE BACK" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_lastrace" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="LAST RACE" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="LAST RACE" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_purse" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="PURSE" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="PURSE" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_lback" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="LENGTHS BACK" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="LENGTHS BACK" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_1call" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="1ST CALL" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="1ST CALL" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_2call" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="2ND CALL" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="2ND CALL" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_2bsr" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="2 BEST SPEED RATINGS" align="0"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="2 BEST SPEED RATINGS" align="0"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_daysaway" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="DAYS AWAY" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="DAYS AWAY" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_wins" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="WINS" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="WINS" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="text_races" defstate="0">
<rect><color red="0.54" green="0.57" blue="0.58" /></rect>
<text state="0" string="RACES" align="1"><color red="0.49412" green="0.51765" blue="0.51765" /></text>
<text state="1" string="RACES" align="1"><color red="0.2" green="0.16" blue="0.16" /></text>
</element>
<element name="digit" defstate="0">
<led7seg><color red="0.2" green="0.16" blue="0.16" /></led7seg>
<led7seg alpha="0"><color red="0.2" green="0.16" blue="0.16" /></led7seg>
</element>

View File

@ -1,31 +0,0 @@
<?xml version="1.0"?>
<!--
license:CC0
-->
<mamelayout version="2">
<!-- define elements -->
<element name="digit" defstate="0">
<led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
</element>
<!-- build screen -->
<view name="Internal Layout">
<element name="digit11" ref="digit"><bounds x="0" y="0" width="10" height="15" /></element>
<element name="digit10" ref="digit"><bounds x="10" y="0" width="10" height="15" /></element>
<element name="digit9" ref="digit"><bounds x="20" y="0" width="10" height="15" /></element>
<element name="digit8" ref="digit"><bounds x="30" y="0" width="10" height="15" /></element>
<element name="digit7" ref="digit"><bounds x="40" y="0" width="10" height="15" /></element>
<element name="digit6" ref="digit"><bounds x="50" y="0" width="10" height="15" /></element>
<element name="digit5" ref="digit"><bounds x="60" y="0" width="10" height="15" /></element>
<element name="digit4" ref="digit"><bounds x="70" y="0" width="10" height="15" /></element>
<element name="digit3" ref="digit"><bounds x="80" y="0" width="10" height="15" /></element>
<element name="digit2" ref="digit"><bounds x="90" y="0" width="10" height="15" /></element>
<element name="digit1" ref="digit"><bounds x="100" y="0" width="10" height="15" /></element>
<element name="digit0" ref="digit"><bounds x="110" y="0" width="10" height="15" /></element>
</view>
</mamelayout>

View File

@ -0,0 +1,53 @@
<?xml version="1.0"?>
<!--
license:CC0
-->
<mamelayout version="2">
<!-- define elements -->
<element name="led" defstate="0">
<disk state="0"><color red="0.15" green="0.015" blue="0.0225" /></disk>
<disk state="1"><color red="0.6" green="0.06" blue="0.09" /></disk>
<disk state="2"><color red="1.0" green="0.1" blue="0.15" /></disk>
</element>
<element name="digit" defstate="0">
<led7seg alpha="0.08"><color red="1.0" green="0.1" blue="0.15" /></led7seg>
</element>
<element name="text_l1"><text string="Speedway"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="text_l2"><text string="Brain Drain"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="text_l3"><text string="Blackjack"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="text_l4"><text string="Calculator"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<!-- build screen -->
<view name="Internal Layout">
<bounds left="8" right="41.5" top="-1" bottom="11" />
<repeat count="4">
<param name="x" start="11.25" increment="8.333" />
<param name="i" start="12" increment="1" />
<element name="~i~.a" ref="led"><bounds x="~x~" y="0" width="2" height="2" /></element>
</repeat>
<repeat count="4">
<param name="x" start="1.25" increment="8.333" />
<param name="i" start="1" increment="1" />
<element ref="text_l~i~"><bounds x="~x~" y="2" width="22" height="1.75" /></element>
</repeat>
<repeat count="12">
<param name="x" start="10" increment="2.5" />
<param name="i" start="11" increment="-1" />
<element name="multi~i~.1" ref="digit"><bounds x="~x~" y="7.1" width="2" height="2.9" /><color alpha="0.65" /></element>
<element name="multi~i~.2" ref="digit"><bounds x="~x~" y="7.1" width="2" height="2.9" /></element>
</repeat>
</view>
</mamelayout>

View File

@ -14931,7 +14931,8 @@ gamekin3 //
gameking //
@source:gamemachine.cpp
2001tgm //
gamemach //
v4in1eg //
@source:gamemasters.cpp
gmsshoot // (c) 1989 GameMasters

View File

@ -278,7 +278,7 @@ zigzagb // (c) 1982 LAX (bootleg)
zigzagb2 // (c) 1982 LAX (bootleg)
@source:gamemachine.cpp
2001tgm //
gamemach //
@source:hazeltin.cpp
hazl1500 // Hazeltine 1500 (c) 1977