summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/novagmcs48.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/novagmcs48.cpp')
-rw-r--r--src/mame/drivers/novagmcs48.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/src/mame/drivers/novagmcs48.cpp b/src/mame/drivers/novagmcs48.cpp
new file mode 100644
index 00000000000..d4c1cb4cd6a
--- /dev/null
+++ b/src/mame/drivers/novagmcs48.cpp
@@ -0,0 +1,159 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger
+/******************************************************************************
+
+ 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:
+ - x
+
+******************************************************************************
+
+Presto:
+- x
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/novagbase.h"
+
+#include "cpu/mcs48/mcs48.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "novag_presto.lh" // clickable
+
+
+class novagmcs48_state : public novagbase_state
+{
+public:
+ novagmcs48_state(const machine_config &mconfig, device_type type, const char *tag)
+ : novagbase_state(mconfig, type, tag)
+ { }
+
+ // Presto/Octo
+ DECLARE_WRITE8_MEMBER(presto_mux_w);
+ DECLARE_WRITE8_MEMBER(presto_control_w);
+ DECLARE_READ8_MEMBER(presto_input_r);
+};
+
+
+
+// Devices, I/O
+
+/******************************************************************************
+ Presto/Octo
+******************************************************************************/
+
+// MCU ports
+
+WRITE8_MEMBER(novagmcs48_state::presto_mux_w)
+{
+ // D0-D7: input mux low, led data
+ m_inp_mux = (m_inp_mux & ~0xff) | (~data & 0xff);
+ m_led_data = data;
+ display_matrix(8, 3, m_led_data, m_led_select);
+}
+
+WRITE8_MEMBER(novagmcs48_state::presto_control_w)
+{
+ // P21: input mux high
+ m_inp_mux = (m_inp_mux & 0xff) | (~data << 7 & 0x100);
+
+ // P22,P23: speaker lead 1,2
+ m_dac->write(BIT(data, 2) & BIT(~data, 3));
+
+ // P24-P26: led select
+ m_led_select = data >> 4 & 7;
+ display_matrix(8, 3, m_led_data, m_led_select);
+}
+
+READ8_MEMBER(novagmcs48_state::presto_input_r)
+{
+ // P10-P17: multiplexed inputs
+ return ~read_inputs(9) & 0xff;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+// Presto/Octo
+
+static ADDRESS_MAP_START( presto_map, AS_IO, 8, novagmcs48_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(presto_input_r) AM_WRITENOP
+ AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(presto_control_w)
+ AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_WRITE(presto_mux_w)
+ADDRESS_MAP_END
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( presto )
+ PORT_INCLUDE( novag_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+static MACHINE_CONFIG_START( presto, novagmcs48_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", I8049, 6000000) // LC circuit, measured
+ MCFG_CPU_IO_MAP(presto_map)
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagbase_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_novag_presto)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("speaker")
+ MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
+ MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
+ MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+MACHINE_CONFIG_END
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( npresto )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD("d80c49c_186", 0x0000, 0x0800, CRC(29a0eb4c) SHA1(e058d6018e53ddcaa3b5ec25b33b8bff091b04db) )
+ROM_END
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */
+CONS( 1984, npresto, 0, 0, presto, presto, driver_device, 0, "Novag", "Presto (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NOT_WORKING )