From 9f7c3518265d5b3c57f66c8252393162d017e947 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 9 Mar 2023 20:39:52 +0100 Subject: [PATCH] New working systems ------------------- Gammonmaster II [hap, Sean Riddle] Omar [hap, Sean Riddle] Electronic Chess (Tryom) [hap, Sean Riddle] Punch Your Lights Out [hap, Sean Riddle, Frank Palazzolo] --- src/devices/cpu/tms7000/tms7000.h | 2 +- src/mame/chess/compuchess.cpp | 1 - src/mame/chess/conchess.cpp | 2 +- src/mame/handheld/hh_cop400.cpp | 2 +- src/mame/layout/gammonm2.lay | 263 +++++++++++++++++++ src/mame/layout/omar.lay | 254 +++++++++++++++++++ src/mame/layout/pylo.lay | 404 ++++++++++++++++++++++++++++++ src/mame/layout/tchess.lay | 203 +++++++++++++++ src/mame/mame.lst | 12 + src/mame/mess.flt | 4 + src/mame/tiger/pylo.cpp | 226 +++++++++++++++++ src/mame/tryom/chess.cpp | 281 +++++++++++++++++++++ src/mame/tryom/gammonm.cpp | 201 +++++++++++++++ src/mame/tryom/omar.cpp | 245 ++++++++++++++++++ 14 files changed, 2096 insertions(+), 4 deletions(-) create mode 100644 src/mame/layout/gammonm2.lay create mode 100644 src/mame/layout/omar.lay create mode 100644 src/mame/layout/pylo.lay create mode 100644 src/mame/layout/tchess.lay create mode 100644 src/mame/tiger/pylo.cpp create mode 100644 src/mame/tryom/chess.cpp create mode 100644 src/mame/tryom/gammonm.cpp create mode 100644 src/mame/tryom/omar.cpp diff --git a/src/devices/cpu/tms7000/tms7000.h b/src/devices/cpu/tms7000/tms7000.h index 8d623f5c725..3c39ed217b6 100644 --- a/src/devices/cpu/tms7000/tms7000.h +++ b/src/devices/cpu/tms7000/tms7000.h @@ -82,7 +82,7 @@ protected: virtual void device_reset() override; // device_execute_interface overrides - virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + m_divider - 1) / 2; } + virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + m_divider - 1) / m_divider; } virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * m_divider); } virtual uint32_t execute_min_cycles() const noexcept override { return 5; } virtual uint32_t execute_max_cycles() const noexcept override { return 49; } diff --git a/src/mame/chess/compuchess.cpp b/src/mame/chess/compuchess.cpp index 934b93b8094..fb4777a92b0 100644 --- a/src/mame/chess/compuchess.cpp +++ b/src/mame/chess/compuchess.cpp @@ -12,7 +12,6 @@ for new game, B for empty board, or C for continue. TODO: - cncchess sound is wrong, it should be a long dual-tone alarm sound -- is Tryom CC-700 a hack of cmpchess? it does the L, bP thing at start too BTANB: - cmpchess/cmpchess2 accepts illegal moves (Conic fixed that) diff --git a/src/mame/chess/conchess.cpp b/src/mame/chess/conchess.cpp index 694935ea081..618caf33a50 100644 --- a/src/mame/chess/conchess.cpp +++ b/src/mame/chess/conchess.cpp @@ -367,4 +367,4 @@ CONS( 1982, conc, 0, 0, conc, conchess, conchess_state, empt CONS( 1984, concgla, 0, 0, concgla, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Princhess Glasgow", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) CONS( 1985, concams5, 0, 0, concams5, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Amsterdam 5.5MHz", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) CONS( 1985, concams8, concams5, 0, concams8, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Amsterdam 8.0MHz", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1989, concvicp, 0, 0, concvicp, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Victoria (prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1990, concvicp, 0, 0, concvicp, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Victoria (prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/handheld/hh_cop400.cpp b/src/mame/handheld/hh_cop400.cpp index d865733e080..ec641e922f0 100644 --- a/src/mame/handheld/hh_cop400.cpp +++ b/src/mame/handheld/hh_cop400.cpp @@ -2577,7 +2577,7 @@ static INPUT_PORTS_START( lilcomp ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Code 5") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CODE(KEYCODE_X) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("IN.2") // L2 port G PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Code 1") diff --git a/src/mame/layout/gammonm2.lay b/src/mame/layout/gammonm2.lay new file mode 100644 index 00000000000..a22a41a4549 --- /dev/null +++ b/src/mame/layout/gammonm2.lay @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/omar.lay b/src/mame/layout/omar.lay new file mode 100644 index 00000000000..5e3f448fce7 --- /dev/null +++ b/src/mame/layout/omar.lay @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/pylo.lay b/src/mame/layout/pylo.lay new file mode 100644 index 00000000000..69d3b13e094 --- /dev/null +++ b/src/mame/layout/pylo.lay @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/tchess.lay b/src/mame/layout/tchess.lay new file mode 100644 index 00000000000..fba9c36740d --- /dev/null +++ b/src/mame/layout/tchess.lay @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 5714e9aa3f5..7860e531e01 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -43506,6 +43506,9 @@ k28 @source:tiger/k28m2.cpp k28m2 +@source:tiger/pylo.cpp +pylo + @source:tigertel/gizmondo.cpp gizmondo // @@ -43841,6 +43844,15 @@ cp500 // Prologica CP500 @source:trs/vis.cpp vis +@source:tryom/chess.cpp +tchess + +@source:tryom/gammonm.cpp +gammonm2 + +@source:tryom/omar.cpp +omar + @source:tvgames/actions_atj2279b.cpp rbitgen diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 86ff4013b32..286adf2ffd9 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -1090,6 +1090,7 @@ ti/tm990189.cpp tiger/gamecom.cpp tiger/k28.cpp tiger/k28m2.cpp +tiger/pylo.cpp tigertel/gizmondo.cpp tiki/tiki100.cpp tomy/tomy_princ.cpp @@ -1128,6 +1129,9 @@ trs/trs80dt1.cpp trs/trs80m2.cpp trs/trs80m3.cpp trs/vis.cpp +tryom/chess.cpp +tryom/gammonm.cpp +tryom/omar.cpp tvgames/actions_atj2279b.cpp tvgames/elan_ep3a19a.cpp tvgames/elan_eu3a05.cpp diff --git a/src/mame/tiger/pylo.cpp b/src/mame/tiger/pylo.cpp new file mode 100644 index 00000000000..0d7b5fd33ad --- /dev/null +++ b/src/mame/tiger/pylo.cpp @@ -0,0 +1,226 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle, Frank Palazzolo +/******************************************************************************* + +Tiger Punch Your Lights Out (model 7-571) + +Hardware notes: +- PCB label: 7-571A +- TI TMS70C40 @ 4MHz, custom label but decap shows it's a TMS70C40F with + ROM serial C61013, 4KB internal ROM is half empty +- 4 7segs, 4*6 other leds, piezo + +There's also a version with a Toshiba TMP47C200. + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/tms7000/tms7000.h" +#include "sound/spkrdev.h" +#include "video/pwm.h" + +#include "speaker.h" + +#include "pylo.lh" // clickable + + +namespace { + +class pylo_state : public driver_device +{ +public: + pylo_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_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + void pylo(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_device m_speaker; + required_ioport_array<6> m_inputs; + + void update_display(); + u8 input_r(); + void input_w(u8 data); + void digit_w(u8 data); + void led_w(u8 data); + + u8 m_inp_mux = 0; + u8 m_digit_data = 0; + u8 m_led_data = 0; +}; + +void pylo_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_digit_data)); + save_item(NAME(m_led_data)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void pylo_state::update_display() +{ + m_display->matrix(m_inp_mux >> 2, m_led_data << 7 | m_digit_data); +} + +u8 pylo_state::input_r() +{ + u8 data = 0; + + // A0-A7: multiplexed inputs + for (int i = 0; i < 6; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return data; +} + +void pylo_state::input_w(u8 data) +{ + // B0-B5: input mux + // B2-B5: digit/led select + // B6,B7: N/C + m_inp_mux = data & 0x3f; + update_display(); +} + +void pylo_state::digit_w(u8 data) +{ + // C0-C6: digit segments + // C7: N/C + m_digit_data = ~data & 0x7f; + update_display(); +} + +void pylo_state::led_w(u8 data) +{ + // D0-D5: led data + m_led_data = ~data & 0x3f; + update_display(); + + // D6: N/C + // D7: speaker out + m_speaker->level_w(BIT(~data, 7)); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( pylo ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_CONFNAME( 0x0e, 0x02, "Game" ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x08, "3" ) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON3) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_BUTTON4) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_START1) + PORT_BIT(0x0e, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON5) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON6) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON7) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_BUTTON8) + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_START2) + PORT_BIT(0x0e, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON9) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON10) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON11) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_BUTTON12) + + PORT_START("IN.3") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_COCKTAIL + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_COCKTAIL + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_COCKTAIL + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_COCKTAIL + + PORT_START("IN.4") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_COCKTAIL + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_COCKTAIL + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON7) PORT_COCKTAIL + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_BUTTON8) PORT_COCKTAIL + + PORT_START("IN.5") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_COCKTAIL + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON10) PORT_COCKTAIL + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON11) PORT_COCKTAIL + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_BUTTON12) PORT_COCKTAIL +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void pylo_state::pylo(machine_config &config) +{ + // basic machine hardware + TMS70C40(config, m_maincpu, 4_MHz_XTAL); + m_maincpu->in_porta().set(FUNC(pylo_state::input_r)); + m_maincpu->out_portb().set(FUNC(pylo_state::input_w)); + m_maincpu->out_portc().set(FUNC(pylo_state::digit_w)); + m_maincpu->out_portd().set(FUNC(pylo_state::led_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 13); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_pylo); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( pylo ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD("1-7571a1-2.u1", 0x0000, 0x1000, CRC(0cb01059) SHA1(68a422cef6513e8eed2d83d492e2be11d049d183) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1988, pylo, 0, 0, pylo, pylo, pylo_state, empty_init, "Tiger", "Punch Your Lights Out", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/tryom/chess.cpp b/src/mame/tryom/chess.cpp new file mode 100644 index 00000000000..ab73cbe61e4 --- /dev/null +++ b/src/mame/tryom/chess.cpp @@ -0,0 +1,281 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Tryom Electronic Chess (model CC-700) + +Hardware notes: +- PCB label: 170-313-01, JAB, TRYOM +- Fairchild 3870 MCU, label SL90453 +- 256x4 RAM (SCM5101E-8) +- 9-digit 7seg led panel (3 unused), piezo + +The hardware has similarities with Omar. + +The user interface resembles CompuChess. At the "L" prompt, enter level (1-8). +At "bP", press A for new game, B for empty board, C to continue. At "0", press +1-4 for an opening book, or 5 to select one at random. + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +#include "tchess.lh" // clickable + + +namespace { + +class chess_state : public driver_device +{ +public: + chess_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 tchess(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_device m_dac; + required_ioport_array<5> m_inputs; + + void main_map(address_map &map); + void main_io(address_map &map); + + u8 read_inputs(); + void p0_w(u8 data); + u8 p0_r(); + void p1_w(u8 data); + u8 p1_r(); + void p4_w(u8 data); + u8 p4_r(); + void p5_w(u8 data); + u8 p5_r(); + + std::unique_ptr m_ram; + u8 m_ram_address = 0; + u8 m_ram_data = 0; + u8 m_inp_mux = 0; + u8 m_digit_data = 0; +}; + +void chess_state::machine_start() +{ + m_ram = make_unique_clear(0x100); + + // register for savestates + save_pointer(NAME(m_ram), 0x100); + save_item(NAME(m_ram_address)); + save_item(NAME(m_ram_data)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_digit_data)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +u8 chess_state::read_inputs() +{ + u8 data = 0; + + for (int i = 0; i < 5; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return data; +} + +void chess_state::p0_w(u8 data) +{ + // P00-P05: digit select, input mux + // P06: RAM CE1 + m_display->write_my(~data & 0x3f); + m_inp_mux = data; +} + +u8 chess_state::p0_r() +{ + // P07: multiplexed inputs (high) + return (read_inputs() << 3 & 0x80) | m_inp_mux; +} + +void chess_state::p1_w(u8 data) +{ + // P10-P17: RAM address + m_ram_address = data; +} + +u8 chess_state::p1_r() +{ + return m_ram_address; +} + +void chess_state::p4_w(u8 data) +{ + // P40-P43: RAM DI + if (m_inp_mux & 0x40) + m_ram[m_ram_address] = data & 0xf; + + m_ram_data = data; +} + +u8 chess_state::p4_r() +{ + // P44-P47: multiplexed inputs (low), RAM DO + u8 data = read_inputs(); + if (m_inp_mux & 0x40) + data |= m_ram[m_ram_address]; + + return data << 4 | m_ram_data; +} + +void chess_state::p5_w(u8 data) +{ + // P50-P56: digit data + m_display->write_mx(bitswap<7>(~data,0,1,5,4,6,2,3)); + m_digit_data = data; + + // P57: speaker out + m_dac->write(BIT(data, 7)); +} + +u8 chess_state::p5_r() +{ + return m_digit_data; +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void chess_state::main_map(address_map &map) +{ + map.global_mask(0x7ff); + map(0x0000, 0x07ff).rom(); +} + +void chess_state::main_io(address_map &map) +{ + map(0x00, 0x00).rw(FUNC(chess_state::p0_r), FUNC(chess_state::p0_w)); + map(0x01, 0x01).rw(FUNC(chess_state::p1_r), FUNC(chess_state::p1_w)); + map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write)); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( tchess ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("XMV") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("FP") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("EP") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("PLY") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RST") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A / WK") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("B / WQ") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("C / WB") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("D / WN") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("WSD") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("E / WR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("F / WP") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("G") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("H") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("BSD") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / BK") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / BQ") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / BB") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / BN") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / BR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / BP") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void chess_state::tchess(machine_config &config) +{ + // basic machine hardware + F8(config, m_maincpu, 4500000/2); // approximation + m_maincpu->set_addrmap(AS_PROGRAM, &chess_state::main_map); + m_maincpu->set_addrmap(AS_IO, &chess_state::main_io); + m_maincpu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge)); + + f38t56_device &psu(F38T56(config, "psu", 4500000/2)); + psu.set_int_vector(0x20); + psu.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); + psu.read_a().set(FUNC(chess_state::p4_r)); + psu.write_a().set(FUNC(chess_state::p4_w)); + psu.read_b().set(FUNC(chess_state::p5_r)); + psu.write_b().set(FUNC(chess_state::p5_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 7); + m_display->set_segmask(0x3f, 0x7f); + config.set_default_layout(layout_tchess); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( tchess ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("sl90453", 0x0000, 0x0800, CRC(f7fbe9b0) SHA1(d79ae43acfdf733908bc57b1fcca2563a2fdf48e) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1981, tchess, 0, 0, tchess, tchess, chess_state, empty_init, "Tryom", "Electronic Chess (Tryom)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/tryom/gammonm.cpp b/src/mame/tryom/gammonm.cpp new file mode 100644 index 00000000000..72db90ce952 --- /dev/null +++ b/src/mame/tryom/gammonm.cpp @@ -0,0 +1,201 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Tryom Gammon Master series, backgammon computer + +Gammon Master (published by Cardinal) (not dumped yet) +Gammonmaster II (standard model and Doubler model) + +According to the manual, the two GM II have the same housing. GM II has labels +intended for The Doubler, but they don't apply to this model. + +Hardware notes: +- PCB label: AN0178 REV I, JRH +- Motorola MC6800P @ ~0.85MHz (no XTAL, main clock and NMI are from a 74124) +- 512 bytes RAM (4*NEC D2111AL-4), 4KB+2KB ROM +- DL-4507 4-digit 7seg panel + other leds for dice and status +- no sound, non-electronic backgammon board is attached + +To start a game, press ST twice, then EN. Read the manual for more information. +For test mode, press BO after boot, followed by a number. + +TODO: +- what is IN.5 0x04 for? maybe just for led strobe timing (reads it at PC=E1BB, + sets a counter in RAM offset E3) +- it locks up when holding the 1 key at boot (happens on real machine too), + what's the purpose of checking this key at power on? + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/m6800/m6800.h" +#include "video/pwm.h" + +#include "gammonm2.lh" // clickable + + +namespace { + +class gammonm_state : public driver_device +{ +public: + gammonm_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_inputs(*this, "IN.%u", 0) + { } + + void gammonm2(machine_config &config); + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_ioport_array<6> m_inputs; + + void main_map(address_map &map); + + void led_w(offs_t offset, u8 data); + void digit_w(offs_t offset, u8 data); + u8 input_r(offs_t offset); +}; + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void gammonm_state::led_w(offs_t offset, u8 data) +{ + // a0-a3 + data: misc leds + m_display->matrix_partial(4, 4, offset, ~data); +} + +void gammonm_state::digit_w(offs_t offset, u8 data) +{ + // a0-a3 + data: 7seg leds + m_display->matrix_partial(0, 4, offset, bitswap<8>(~data,4,6,3,5,2,7,1,0)); +} + +u8 gammonm_state::input_r(offs_t offset) +{ + u8 data = 0x0f; + + // read multiplexed inputs + for (int i = 0; i < 5; i++) + if (!BIT(offset, i)) + data &= m_inputs[i]->read(); + + return data | m_inputs[5]->read() << 4; +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void gammonm_state::main_map(address_map &map) +{ + map(0x0000, 0x01ff).ram(); + map(0x4000, 0x400f).mirror(0x1ff0).w(FUNC(gammonm_state::led_w)); + map(0x6000, 0x601f).mirror(0x1fe0).r(FUNC(gammonm_state::input_r)); + map(0x8000, 0x800f).mirror(0x1ff0).w(FUNC(gammonm_state::digit_w)); + map(0xe000, 0xe7ff).rom(); + map(0xf000, 0xffff).rom(); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( gammonm2 ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CL") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("EN") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("BA") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("BO") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("VR") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("11") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("12") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN) + PORT_CONFNAME( 0x08, 0x00, "Version" ) // factory-set + PORT_CONFSETTING( 0x08, "Standard" ) + PORT_CONFSETTING( 0x00, "The Doubler" ) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void gammonm_state::gammonm2(machine_config &config) +{ + // basic machine hardware + M6800(config, m_maincpu, 850000); // measured + m_maincpu->set_addrmap(AS_PROGRAM, &gammonm_state::main_map); + + const attotime nmi_period = attotime::from_hz(262); // measured + m_maincpu->set_periodic_int(FUNC(gammonm_state::nmi_line_pulse), nmi_period); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_gammonm2); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( gammonm2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("c38083_bc3.0-s3", 0xe000, 0x0800, CRC(5a82df02) SHA1(dbad870b0fc69c1af892441aa5a851366c7b04a6) ) + ROM_LOAD("d2332c_027", 0xf000, 0x1000, CRC(407e015e) SHA1(09900a672e8cc6f280253544511e6e08a1c78a02) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1978, gammonm2, 0, 0, gammonm2, gammonm2, gammonm_state, empty_init, "Tryom", "Gammonmaster II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/tryom/omar.cpp b/src/mame/tryom/omar.cpp new file mode 100644 index 00000000000..9a7d771ba54 --- /dev/null +++ b/src/mame/tryom/omar.cpp @@ -0,0 +1,245 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Tryom Omar, handheld backgammon computer + +Hardware notes: +- PCB label: AP0379 REV.8, PC103, JRH +- Fairchild 3870 MCU, custom label +- 9-digit 7seg led panel (3 unused), piezo + +Omar II has an LCD instead of 7segs. PCB label is AN2379 REV.6, PC101. + +There are more 'sequels', but assumed to be the same game. The newer ones didn't +include a backgammon board. + +LED versions: Omar(I), Omar IV, Electronic Backgammon (Cardinal) +LCD versions: Omar II, Omar III, Omar V, Computerized Backgammon (Tandy) + +BTANB: +- piezo buzzes when you hold down a button + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +#include "omar.lh" // clickable + + +namespace { + +class omar_state : public driver_device +{ +public: + omar_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 omar(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_device m_dac; + required_ioport_array<5> m_inputs; + + void main_map(address_map &map); + void main_io(address_map &map); + + void p0_w(u8 data); + void p1_w(u8 data); + void p4_w(u8 data); + u8 p4_r(); + void p5_w(u8 data); + + u8 m_inp_mux = 0; +}; + +void omar_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void omar_state::p0_w(u8 data) +{ + // P00: input mux part + m_inp_mux = (m_inp_mux & ~2) | (data << 1 & 2); + + // P01-P06: digit select + m_display->write_my(~data >> 1 & 0x3f); + + // P07: speaker out + m_dac->write(BIT(~data, 7)); +} + +void omar_state::p1_w(u8 data) +{ + // P10,P12-P17: digit data + m_display->write_mx(bitswap<7>(~data,4,5,7,3,0,6,2)); + + // P11: input mux part + m_inp_mux = (m_inp_mux & ~1) | (data >> 1 & 1); +} + +void omar_state::p4_w(u8 data) +{ + // P40,P41: input mux part + m_inp_mux = (m_inp_mux & ~0xc) | (data << 2 & 0xc); +} + +u8 omar_state::p4_r() +{ + u8 data = 0; + + // P42-P46: multiplexed inputs + for (int i = 0; i < 5; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return data << 2; +} + +void omar_state::p5_w(u8 data) +{ + // P55: input mux part + m_inp_mux = (m_inp_mux & ~0x10) | (data >> 1 & 0x10); +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void omar_state::main_map(address_map &map) +{ + map.global_mask(0x7ff); + map(0x0000, 0x07ff).rom(); +} + +void omar_state::main_io(address_map &map) +{ + map(0x00, 0x00).w(FUNC(omar_state::p0_w)); + map(0x01, 0x01).w(FUNC(omar_state::p1_w)); + map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write)); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( omar ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("BO") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("VR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("DBL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("ACC") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("12") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("11") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("EN") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("BAR") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CLR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Dice") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("CUB") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void omar_state::omar(machine_config &config) +{ + // basic machine hardware + F8(config, m_maincpu, 2700000/2); // approximation + m_maincpu->set_addrmap(AS_PROGRAM, &omar_state::main_map); + m_maincpu->set_addrmap(AS_IO, &omar_state::main_io); + m_maincpu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge)); + + f38t56_device &psu(F38T56(config, "psu", 2700000/2)); + psu.set_int_vector(0x20); + psu.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); + psu.read_a().set(FUNC(omar_state::p4_r)); + psu.write_a().set(FUNC(omar_state::p4_w)); + psu.write_b().set(FUNC(omar_state::p5_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 7); + m_display->set_segmask(0x3f, 0x7f); + config.set_default_layout(layout_omar); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( omar ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("lom1ar279", 0x0000, 0x0800, CRC(e1bcee50) SHA1(658d6d8a0af3c1672610c651fea7d0289e4703f7) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, omar, 0, 0, omar, omar, omar_state, empty_init, "Tryom", "Omar", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )