summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nes_ctrl/rob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nes_ctrl/rob.cpp')
-rw-r--r--src/devices/bus/nes_ctrl/rob.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/devices/bus/nes_ctrl/rob.cpp b/src/devices/bus/nes_ctrl/rob.cpp
new file mode 100644
index 00000000000..5e101d55042
--- /dev/null
+++ b/src/devices/bus/nes_ctrl/rob.cpp
@@ -0,0 +1,139 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/**********************************************************************
+
+Nintendo HVC-012 Family Computer Robot / Nintendo NES-012 R.O.B.
+
+TODO:
+- does nes_rob have motor sensors? (eg. limit switches, or optical
+ sensor to determine position)
+- can't really play anything with nes_rob, because of interaction
+ with physical objects (gyromite especially, since it has a gadget
+ to make the robot press joypad buttons)
+
+**********************************************************************/
+
+#include "emu.h"
+#include "rob.h"
+
+#include "nes_rob.lh"
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(NES_ROB, nes_rob_device, "nes_rob", "Nintendo R.O.B. / Family Computer Robot")
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+static INPUT_PORTS_START( nes_rob )
+ PORT_START("EYE_X")
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(30) PORT_MINMAX(0, 255)
+ PORT_START("EYE_Y")
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(30) PORT_MINMAX(0, 239)
+INPUT_PORTS_END
+
+ioport_constructor nes_rob_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( nes_rob );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// constructor
+//-------------------------------------------------
+
+nes_rob_device::nes_rob_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, NES_ROB, tag, owner, clock)
+ , device_nes_control_port_interface(mconfig, *this)
+ , m_maincpu(*this, "maincpu")
+ , m_sensor(*this, "sensor")
+ , m_eye_x(*this, "EYE_X")
+ , m_eye_y(*this, "EYE_Y")
+ , m_motor_out(*this, "rob_motor.%u", 0U)
+ , m_led_out(*this, "rob_led")
+{
+}
+
+
+//-------------------------------------------------
+// device_start
+//-------------------------------------------------
+
+void nes_rob_device::device_start()
+{
+ // resolve handlers
+ m_motor_out.resolve();
+ m_led_out.resolve();
+}
+
+
+//-------------------------------------------------
+// R.O.B. specific handlers
+//-------------------------------------------------
+
+u8 nes_rob_device::input_r()
+{
+ // R00: lightsensor
+ return m_sensor->detect_light(m_eye_x->read(), m_eye_y->read()) ? 0 : 1;
+}
+
+void nes_rob_device::output_w(offs_t offset, u8 data)
+{
+ switch (offset & 3)
+ {
+ case 0:
+ // R03: led
+ m_led_out = BIT(data, 3);
+ break;
+
+ case 1:
+ // R10-R13: motors: down, up, close, open
+ for (int i = 0; i < 4; i++)
+ m_motor_out[i] = BIT(data, i);
+ break;
+
+ case 2:
+ // R20,R21: motors: right, left
+ for (int i = 0; i < 2; i++)
+ m_motor_out[i + 4] = BIT(data, i);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void nes_rob_device::device_add_mconfig(machine_config &config)
+{
+ SM590(config, m_maincpu, 455_kHz_XTAL);
+ m_maincpu->read_r<0>().set(FUNC(nes_rob_device::input_r));
+ m_maincpu->write_r<0>().set(FUNC(nes_rob_device::output_w));
+ m_maincpu->write_r<1>().set(FUNC(nes_rob_device::output_w));
+ m_maincpu->write_r<2>().set(FUNC(nes_rob_device::output_w));
+ m_maincpu->write_r<3>().set(FUNC(nes_rob_device::output_w));
+
+ NES_ZAPPER_SENSOR(config, m_sensor, 0);
+ if (m_port != nullptr)
+ m_sensor->set_screen_tag(m_port->m_screen);
+
+ // must use -numscreens 2 to see the output status
+ config.set_default_layout(layout_nes_rob);
+}
+
+ROM_START( nes_rob )
+ ROM_REGION( 0x200, "maincpu", 0 )
+ ROM_LOAD( "rfc-cpu10.ic1", 0x000, 0x200, CRC(f9c96b9c) SHA1(a87e2f0f5e454c093d1352ac368aa9e82e9f6790) )
+ROM_END
+
+const tiny_rom_entry *nes_rob_device::device_rom_region() const
+{
+ return ROM_NAME(nes_rob);
+}