summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/novag_presto.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/novag_presto.cpp')
-rw-r--r--src/mame/drivers/novag_presto.cpp122
1 files changed, 63 insertions, 59 deletions
diff --git a/src/mame/drivers/novag_presto.cpp b/src/mame/drivers/novag_presto.cpp
index 3c81e6e35fb..cf3279967d5 100644
--- a/src/mame/drivers/novag_presto.cpp
+++ b/src/mame/drivers/novag_presto.cpp
@@ -2,26 +2,24 @@
// copyright-holders:hap
// thanks-to:Berger
/******************************************************************************
+*
+* novag_presto.cpp, subdriver of novagbase.cpp
- Novag generic MCS-48 based chess computer driver
-
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
-
- TODO:
- - is presto led handling correct? mux data needs to be auto cleared
- similar to diablo/sexpert
+TODO:
+- is presto led handling correct? mux data needs to be auto cleared
+ similar to diablo/sexpert
*******************************************************************************
-Presto:
-- NEC D80C49C MCU(serial 186), OSC from LC circuit measured ~6MHz
-- buzzer, 16+4 LEDs, 8*8 chessboard buttons
+Presto
+----------
+NEC D80C49C MCU(serial 186), OSC from LC circuit measured ~6MHz
+buzzer, 16+4 LEDs, 8*8 chessboard buttons
+
+Octo
+----------
+NEC D80C49HC MCU(serial 111), OSC from LC circuit measured ~12MHz
-Octo:
-- NEC D80C49HC MCU(serial 111), OSC from LC circuit measured ~12MHz
The buzzer has a little electronic circuit going on, not sure whatfor.
Otherwise, it's identical to Presto. The MCU internal ROM is same too.
@@ -38,48 +36,71 @@ Otherwise, it's identical to Presto. The MCU internal ROM is same too.
#include "novag_presto.lh" // clickable
-class novagmcs48_state : public novagbase_state
+namespace {
+
+class presto_state : public novagbase_state
{
public:
- novagmcs48_state(const machine_config &mconfig, device_type type, const char *tag) :
+ presto_state(const machine_config &mconfig, device_type type, const char *tag) :
novagbase_state(mconfig, type, tag),
m_maincpu(*this, "maincpu")
{ }
+ // machine drivers
void presto(machine_config &config);
void octo(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(octo_cpu_freq);
-
-private:
+protected:
+ // devices/pointers
required_device<mcs48_cpu_device> m_maincpu;
- // Presto/Octo
- DECLARE_WRITE8_MEMBER(presto_mux_w);
- DECLARE_WRITE8_MEMBER(presto_control_w);
- DECLARE_READ8_MEMBER(presto_input_r);
- DECLARE_MACHINE_RESET(octo);
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+class octo_state : public presto_state
+{
+public:
+ octo_state(const machine_config &mconfig, device_type type, const char *tag) :
+ presto_state(mconfig, type, tag)
+ { }
+
+ DECLARE_INPUT_CHANGED_MEMBER(octo_cpu_freq) { octo_set_cpu_freq(); }
+
+protected:
+ virtual void machine_reset() override;
void octo_set_cpu_freq();
};
+void octo_state::machine_reset()
+{
+ presto_state::machine_reset();
+ octo_set_cpu_freq();
+}
+void octo_state::octo_set_cpu_freq()
+{
+ // Octo was released with either 12MHz or 15MHz CPU
+ m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (15000000) : (12000000));
+}
-// Devices, I/O
/******************************************************************************
- Presto/Octo
+ Devices, I/O
******************************************************************************/
// MCU ports/generic
-WRITE8_MEMBER(novagmcs48_state::presto_mux_w)
+WRITE8_MEMBER(presto_state::mux_w)
{
// D0-D7: input mux low, led data
m_inp_mux = (m_inp_mux & ~0xff) | (~data & 0xff);
display_matrix(8, 3, m_inp_mux, m_led_select);
}
-WRITE8_MEMBER(novagmcs48_state::presto_control_w)
+WRITE8_MEMBER(presto_state::control_w)
{
// P21: input mux high
m_inp_mux = (m_inp_mux & 0xff) | (~data << 7 & 0x100);
@@ -92,24 +113,12 @@ WRITE8_MEMBER(novagmcs48_state::presto_control_w)
m_inp_mux &= ~0xff; // ?
}
-READ8_MEMBER(novagmcs48_state::presto_input_r)
+READ8_MEMBER(presto_state::input_r)
{
// P10-P17: multiplexed inputs
return ~read_inputs(9) & 0xff;
}
-void novagmcs48_state::octo_set_cpu_freq()
-{
- // Octo was released with either 12MHz or 15MHz CPU
- m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (15000000) : (12000000));
-}
-
-MACHINE_RESET_MEMBER(novagmcs48_state, octo)
-{
- novagbase_state::machine_reset();
- octo_set_cpu_freq();
-}
-
/******************************************************************************
@@ -134,31 +143,26 @@ static INPUT_PORTS_START( octo )
PORT_INCLUDE( presto )
PORT_START("FAKE")
- PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, novagmcs48_state, octo_cpu_freq, nullptr) // factory set
+ PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, octo_state, octo_cpu_freq, nullptr) // factory set
PORT_CONFSETTING( 0x00, "12MHz" )
PORT_CONFSETTING( 0x01, "15MHz" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(novagmcs48_state::octo_cpu_freq)
-{
- octo_set_cpu_freq();
-}
-
/******************************************************************************
Machine Drivers
******************************************************************************/
-void novagmcs48_state::presto(machine_config &config)
+void presto_state::presto(machine_config &config)
{
/* basic machine hardware */
I8049(config, m_maincpu, 6000000); // LC circuit, measured 6MHz
- m_maincpu->p1_in_cb().set(FUNC(novagmcs48_state::presto_input_r));
- m_maincpu->p2_out_cb().set(FUNC(novagmcs48_state::presto_control_w));
- m_maincpu->bus_out_cb().set(FUNC(novagmcs48_state::presto_mux_w));
+ m_maincpu->p1_in_cb().set(FUNC(presto_state::input_r));
+ m_maincpu->p2_out_cb().set(FUNC(presto_state::control_w));
+ m_maincpu->bus_out_cb().set(FUNC(presto_state::mux_w));
- TIMER(config, "display_decay").configure_periodic(FUNC(novagmcs48_state::display_decay_tick), attotime::from_msec(1));
+ TIMER(config, "display_decay").configure_periodic(FUNC(presto_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_novag_presto);
/* sound hardware */
@@ -167,14 +171,12 @@ void novagmcs48_state::presto(machine_config &config)
VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
-void novagmcs48_state::octo(machine_config &config)
+void presto_state::octo(machine_config &config)
{
presto(config);
/* basic machine hardware */
m_maincpu->set_clock(12000000); // LC circuit, measured, see octo_set_cpu_freq
-
- MCFG_MACHINE_RESET_OVERRIDE(novagmcs48_state, octo)
}
@@ -193,12 +195,14 @@ ROM_START( nocto )
ROM_LOAD("d80c49hc_111", 0x0000, 0x0800, CRC(29a0eb4c) SHA1(e058d6018e53ddcaa3b5ec25b33b8bff091b04db) ) // same program as npresto
ROM_END
+} // anonymous namespace
+
/******************************************************************************
Drivers
******************************************************************************/
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1984, npresto, 0, 0, presto, presto, novagmcs48_state, empty_init, "Novag", "Presto (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1987, nocto, npresto, 0, octo, octo, novagmcs48_state, empty_init, "Novag", "Octo (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+CONS( 1984, npresto, 0, 0, presto, presto, presto_state, empty_init, "Novag", "Presto (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, nocto, npresto, 0, octo, octo, octo_state, empty_init, "Novag", "Octo (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )