diff options
| author | 2022-11-02 17:50:02 +0100 | |
|---|---|---|
| committer | 2022-11-02 17:50:16 +0100 | |
| commit | c97fed267001decc43371a4f579935f8198cc10e (patch) | |
| tree | 7c51e9263cd5ac83ad19f151daff18e158e29349 | |
| parent | e70843b46ca41a5afb0136ce132efaf95aca34e6 (diff) | |
New working machines
--------------------
Teammate Game Computer [hap, Michael Kamprath, Sean Riddle]
| -rw-r--r-- | src/mame/handheld/teammate.cpp | 239 | ||||
| -rw-r--r-- | src/mame/layout/teammate.lay | 46 | ||||
| -rw-r--r-- | src/mame/mame.lst | 3 | ||||
| -rw-r--r-- | src/mame/mess.flt | 1 |
4 files changed, 289 insertions, 0 deletions
diff --git a/src/mame/handheld/teammate.cpp b/src/mame/handheld/teammate.cpp new file mode 100644 index 00000000000..64c504a47bc --- /dev/null +++ b/src/mame/handheld/teammate.cpp @@ -0,0 +1,239 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Michael Kamprath +/******************************************************************************* + +Logix Teammate Game Computer +Stylized as T.E.A.M.M.A.T.E.: Total Electronic Advanced Microprocessing +Maneuvers And Tactics Equipment + +It's a tabletop with built-in mini games, led display overlays were included. +Two versions are known, one with black hexadecimal keys, and one with blue keys. + +Hardware notes: +- Mostek 3870 @ ~3.6MHz +- 2*7seg led + 16 leds, 1-bit sound + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +#include "teammate.lh" + + +namespace { + +class teammate_state : public driver_device +{ +public: + teammate_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + void teammate(machine_config &config); + + // P3 button is tied to MCU RESET pin + DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); } + +protected: + virtual void machine_start() override; + +private: + required_device<cpu_device> m_maincpu; + required_device<pwm_display_device> m_display; + required_device<dac_bit_interface> m_dac; + required_ioport_array<3> m_inputs; + + void main_map(address_map &map); + void main_io(address_map &map); + + void select_w(u8 data); + void led_w(u8 data); + u8 input_r(); + void input_w(u8 data); + u8 sound_r(); + void sound_w(u8 data); + + u8 m_inp_sel = 0; + u8 m_input = 0; + u8 m_sound = 0; +}; + +void teammate_state::machine_start() +{ + save_item(NAME(m_inp_sel)); + save_item(NAME(m_input)); + save_item(NAME(m_sound)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void teammate_state::select_w(u8 data) +{ + // P00,P01,P06,P07: led select + m_display->write_my((data >> 4 & 0xc) | (data & 3)); + + // P02,P03,P05: input select + // P04: N/C + m_inp_sel = (data >> 3 & 4) | (data >> 2 & 3); +} + +void teammate_state::led_w(u8 data) +{ + // P10-P17: DS8817N to leds + m_display->write_mx(bitswap<8>(~data,0,1,2,3,4,5,6,7)); +} + +u8 teammate_state::input_r() +{ + u8 data = 0; + + // P40-P47: read buttons + for (int i = 0; i < 3; i++) + if (BIT(m_inp_sel, i)) + data |= m_inputs[i]->read(); + + return data | m_input; +} + +void teammate_state::input_w(u8 data) +{ + m_input = data; +} + +void teammate_state::sound_w(u8 data) +{ + // P50: speaker out + m_dac->write(data & 1); + m_sound = data; +} + +u8 teammate_state::sound_r() +{ + return m_sound; +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void teammate_state::main_map(address_map &map) +{ + map.global_mask(0x7ff); + map(0x0000, 0x07ff).rom(); +} + +void teammate_state::main_io(address_map &map) +{ + map(0x00, 0x00).w(FUNC(teammate_state::select_w)); + map(0x01, 0x01).w(FUNC(teammate_state::led_w)); + map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write)); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( teammate ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + + PORT_START("IN.2") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_NAME("P1") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_NAME("P4") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_NAME("P2") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("RESET") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHANGED_MEMBER(DEVICE_SELF, teammate_state, reset_button, 0) PORT_NAME("P3") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void teammate_state::teammate(machine_config &config) +{ + // basic machine hardware + F8(config, m_maincpu, 3600000/2); // R/C osc, approximation + m_maincpu->set_addrmap(AS_PROGRAM, &teammate_state::main_map); + m_maincpu->set_addrmap(AS_IO, &teammate_state::main_io); + + f38t56_device &psu(F38T56(config, "psu", 3600000/2)); + psu.read_a().set(FUNC(teammate_state::input_r)); + psu.write_a().set(FUNC(teammate_state::input_w)); + psu.read_b().set(FUNC(teammate_state::sound_r)); + psu.write_b().set(FUNC(teammate_state::sound_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 8); + m_display->set_segmask(0xc, 0x7f); + + config.set_default_layout(layout_teammate); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( teammate ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("mk14194n", 0x0000, 0x0800, CRC(15615d03) SHA1(4448a64888c68d6bf3555dcce736ad0126515843) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1978, teammate, 0, 0, teammate, teammate, teammate_state, empty_init, "Logix", "Teammate Game Computer", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/layout/teammate.lay b/src/mame/layout/teammate.lay new file mode 100644 index 00000000000..0dcb45096a2 --- /dev/null +++ b/src/mame/layout/teammate.lay @@ -0,0 +1,46 @@ +<?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="1.0" green="0.1" blue="0.15" /></disk> + </element> + + +<!-- build screen --> + + <view name="Internal Layout"> + <bounds left="-1" right="8" top="-1" bottom="12.4" /> + + <element name="0.0" ref="led"><bounds x="0" y="6" width="1" height="1" /></element> + <element name="0.1" ref="led"><bounds x="0" y="4" width="1" height="1" /></element> + <element name="0.2" ref="led"><bounds x="0" y="2" width="1" height="1" /></element> + <element name="0.3" ref="led"><bounds x="0" y="0" width="1" height="1" /></element> + <element name="0.4" ref="led"><bounds x="2" y="0" width="1" height="1" /></element> + <element name="0.5" ref="led"><bounds x="2" y="2" width="1" height="1" /></element> + <element name="0.6" ref="led"><bounds x="2" y="4" width="1" height="1" /></element> + <element name="0.7" ref="led"><bounds x="2" y="6" width="1" height="1" /></element> + + <element name="1.0" ref="led"><bounds x="4" y="6" width="1" height="1" /></element> + <element name="1.1" ref="led"><bounds x="4" y="4" width="1" height="1" /></element> + <element name="1.2" ref="led"><bounds x="4" y="2" width="1" height="1" /></element> + <element name="1.3" ref="led"><bounds x="4" y="0" width="1" height="1" /></element> + <element name="1.4" ref="led"><bounds x="6" y="0" width="1" height="1" /></element> + <element name="1.5" ref="led"><bounds x="6" y="2" width="1" height="1" /></element> + <element name="1.6" ref="led"><bounds x="6" y="4" width="1" height="1" /></element> + <element name="1.7" ref="led"><bounds x="6" y="6" width="1" height="1" /></element> + + <element name="digit3" ref="digit"><bounds x="2" y="10" width="1" height="1.4" /></element> + <element name="digit2" ref="digit"><bounds x="4" y="10" width="1" height="1.4" /></element> + + </view> +</mamelayout> diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 4757b27b2ae..84075e9037d 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -41534,6 +41534,9 @@ tdv2324 // @source:misc/teamjocs.cpp diaelite // +@source:handheld/teammate.cpp +teammate + @source:ausnz/tec1.cpp tec1 // Talking Electronics Computer tecjmon // Talking Electronics Computer diff --git a/src/mame/mess.flt b/src/mame/mess.flt index afb0c39daa7..2d586c04648 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -308,6 +308,7 @@ handheld/rzone.cpp handheld/scrablex.cpp handheld/talkingbb.cpp handheld/talkingfb.cpp +handheld/teammate.cpp handheld/tispeak.cpp handheld/tispellb.cpp handheld/wildfire.cpp |
