From a5886e8c0f313089705903a8e4ae2ae814f7b516 Mon Sep 17 00:00:00 2001 From: Sandro Ronco Date: Sun, 20 Oct 2019 00:30:31 +0200 Subject: [PATCH] Machines promoted to working ---------------------------- Fidelity Phantom Chess Challenger [Sandro Ronco] --- src/devices/machine/sensorboard.cpp | 20 + src/devices/machine/sensorboard.h | 2 +- src/mame/drivers/fidel_phantom.cpp | 295 +++++++++++- src/mame/layout/fidel_phantom.lay | 669 ++++++++++++++++++++++++++++ 4 files changed, 975 insertions(+), 11 deletions(-) create mode 100644 src/mame/layout/fidel_phantom.lay diff --git a/src/devices/machine/sensorboard.cpp b/src/devices/machine/sensorboard.cpp index 18f20adf510..da479cc9203 100644 --- a/src/devices/machine/sensorboard.cpp +++ b/src/devices/machine/sensorboard.cpp @@ -600,6 +600,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<16 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x07) PORT_NAME("Sensor H1") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<16 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x08) PORT_NAME("Sensor I1") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<16 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x09) PORT_NAME("Sensor J1") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<16 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x0a) PORT_NAME("Sensor K1") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<16 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x0b) PORT_NAME("Sensor L1") PORT_START("RANK.2") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<17 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x10) PORT_NAME("Sensor A2") @@ -612,6 +614,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<17 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x17) PORT_NAME("Sensor H2") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<17 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x18) PORT_NAME("Sensor I2") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<17 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x19) PORT_NAME("Sensor J2") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<17 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x1a) PORT_NAME("Sensor K2") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<17 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x1b) PORT_NAME("Sensor L2") PORT_START("RANK.3") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<18 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x20) PORT_NAME("Sensor A3") @@ -624,6 +628,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<18 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x27) PORT_NAME("Sensor H3") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<18 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x28) PORT_NAME("Sensor I3") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<18 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x29) PORT_NAME("Sensor J3") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<18 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x2a) PORT_NAME("Sensor K3") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<18 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x2b) PORT_NAME("Sensor L3") PORT_START("RANK.4") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<19 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x30) PORT_NAME("Sensor A4") @@ -636,6 +642,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<19 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x37) PORT_NAME("Sensor H4") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<19 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x38) PORT_NAME("Sensor I4") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<19 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x39) PORT_NAME("Sensor J4") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<19 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x3a) PORT_NAME("Sensor K4") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<19 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x3b) PORT_NAME("Sensor L4") PORT_START("RANK.5") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<20 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x40) PORT_NAME("Sensor A5") @@ -648,6 +656,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<20 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x47) PORT_NAME("Sensor H5") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<20 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x48) PORT_NAME("Sensor I5") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<20 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x49) PORT_NAME("Sensor J5") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<20 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x4a) PORT_NAME("Sensor K5") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<20 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x4b) PORT_NAME("Sensor L5") PORT_START("RANK.6") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<21 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x50) PORT_NAME("Sensor A6") @@ -660,6 +670,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<21 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x57) PORT_NAME("Sensor H6") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<21 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x58) PORT_NAME("Sensor I6") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<21 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x59) PORT_NAME("Sensor J6") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<21 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x5a) PORT_NAME("Sensor K6") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<21 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x5b) PORT_NAME("Sensor L6") PORT_START("RANK.7") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<22 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x60) PORT_NAME("Sensor A7") @@ -672,6 +684,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<22 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x67) PORT_NAME("Sensor H7") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<22 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x68) PORT_NAME("Sensor I7") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<22 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x69) PORT_NAME("Sensor J7") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<22 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x6a) PORT_NAME("Sensor K7") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<22 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x6b) PORT_NAME("Sensor L7") PORT_START("RANK.8") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<23 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x70) PORT_NAME("Sensor A8") @@ -684,6 +698,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<23 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x77) PORT_NAME("Sensor H8") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<23 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x78) PORT_NAME("Sensor I8") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<23 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x79) PORT_NAME("Sensor J8") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<23 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x7a) PORT_NAME("Sensor K8") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<23 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x7b) PORT_NAME("Sensor L8") PORT_START("RANK.9") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<24 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x80) PORT_NAME("Sensor A9") @@ -696,6 +712,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<24 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x87) PORT_NAME("Sensor H9") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<24 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x88) PORT_NAME("Sensor I9") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<24 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x89) PORT_NAME("Sensor J9") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<24 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x8a) PORT_NAME("Sensor K9") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<24 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x8b) PORT_NAME("Sensor L9") PORT_START("RANK.10") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<25 | 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x90) PORT_NAME("Sensor A10") @@ -708,6 +726,8 @@ static INPUT_PORTS_START( sensorboard ) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<25 | 1<<7, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x97) PORT_NAME("Sensor H10") PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<25 | 1<<8, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x98) PORT_NAME("Sensor I10") PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<25 | 1<<9, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x99) PORT_NAME("Sensor J10") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<25 | 1<<10, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x9a) PORT_NAME("Sensor K10") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("BS_CHECK", 1<<25 | 1<<11, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, sensor, 0x9b) PORT_NAME("Sensor L10") PORT_START("SPAWN") PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CONDITION("SS_CHECK", 1<<0, EQUALS, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, sensorboard_device, ui_spawn, 1) PORT_NAME("Spawn Piece 1") diff --git a/src/devices/machine/sensorboard.h b/src/devices/machine/sensorboard.h index 9eef956b5ab..424db04c558 100644 --- a/src/devices/machine/sensorboard.h +++ b/src/devices/machine/sensorboard.h @@ -26,7 +26,7 @@ public: // configuration helpers sensorboard_device &set_type(sb_type type); // sensor type - sensorboard_device &set_size(u8 width, u8 height) { m_width = width; m_height = height; return *this; } // board dimensions, max 10 * 10 + sensorboard_device &set_size(u8 width, u8 height) { m_width = width; m_height = height; return *this; } // board dimensions, max 12 * 10 sensorboard_device &set_spawnpoints(u8 i) { m_maxspawn = i; m_maxid = i; return *this; } // number of piece spawnpoints, max 16 sensorboard_device &set_max_id(u8 i) { m_maxid = i; return *this; } // maximum piece id (if larger than set_spawnpoints) sensorboard_device &set_delay(attotime delay) { m_sensordelay = delay; return *this; } // delay when activating a sensor (like PORT_IMPULSE), set to attotime::never to disable diff --git a/src/mame/drivers/fidel_phantom.cpp b/src/mame/drivers/fidel_phantom.cpp index 745bb7bb6ee..a341912f5fd 100644 --- a/src/mame/drivers/fidel_phantom.cpp +++ b/src/mame/drivers/fidel_phantom.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:hap +// copyright-holders:hap,Sandro Ronco /****************************************************************************** Fidelity Phantom (model 6100) @@ -17,19 +17,19 @@ Hardware notes: - piezo speaker, LEDs, 8*8 chessboard buttons - PCB label 510.1128A01 -TODO: -- everything, this is a skeleton driver - ******************************************************************************/ #include "emu.h" #include "cpu/m6502/r65c02.h" +#include "machine/sensorboard.h" +#include "machine/timer.h" #include "sound/dac.h" #include "sound/volt_reg.h" +#include "video/pwm.h" #include "speaker.h" // internal artwork -//#include "fidel_phantom.lh" // clickable +#include "fidel_phantom.lh" // clickable namespace { @@ -41,13 +41,17 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_rombank(*this, "rombank"), - m_dac(*this, "dac") + m_dac(*this, "dac"), + m_board(*this, "board"), + m_display(*this, "display"), + m_input(*this, "IN.0") { } void fphantom(machine_config &config); void init_fphantom(); protected: + virtual void machine_start() override; virtual void machine_reset() override; private: @@ -55,12 +59,74 @@ private: required_device m_maincpu; required_memory_bank m_rombank; required_device m_dac; + required_device m_board; + required_device m_display; + required_ioport m_input; void main_map(address_map &map); + + TIMER_DEVICE_CALLBACK_MEMBER(motors_timer); + DECLARE_WRITE8_MEMBER(mux_w); + DECLARE_WRITE8_MEMBER(lcd_w); + DECLARE_WRITE8_MEMBER(lcd_mask_w); + DECLARE_WRITE8_MEMBER(motors_w); + DECLARE_WRITE8_MEMBER(led_w); + DECLARE_WRITE8_MEMBER(rombank_w); + DECLARE_READ8_MEMBER(input_r); + DECLARE_READ8_MEMBER(motors_r); + DECLARE_READ8_MEMBER(irq_ack_r); + DECLARE_READ8_MEMBER(hmotor_ff_clear_r); + DECLARE_READ8_MEMBER(vmotor_ff_clear_r); + void update_pieces_position(int state); + + uint8_t m_mux; + uint8_t m_lcd_mask; + uint32_t m_lcd_data; + uint8_t m_motors_ctrl; + uint8_t m_hmotor_pos; + uint8_t m_vmotor_pos; + bool m_vmotor_sensor0_ff; + bool m_vmotor_sensor1_ff; + bool m_hmotor_sensor0_ff; + bool m_hmotor_sensor1_ff; + int m_piece; + bool m_piece_collision; + uint8_t m_pieces_map[0x40][0x40]; }; +void phantom_state::machine_start() +{ + save_item(NAME(m_mux)); + save_item(NAME(m_lcd_mask)); + save_item(NAME(m_lcd_data)); + save_item(NAME(m_motors_ctrl)); + save_item(NAME(m_hmotor_pos)); + save_item(NAME(m_vmotor_pos)); + save_item(NAME(m_vmotor_sensor0_ff)); + save_item(NAME(m_vmotor_sensor1_ff)); + save_item(NAME(m_hmotor_sensor0_ff)); + save_item(NAME(m_hmotor_sensor1_ff)); + save_item(NAME(m_piece)); + save_item(NAME(m_piece_collision)); + save_item(NAME(m_pieces_map)); +} + void phantom_state::machine_reset() { + m_mux = 0; + m_lcd_mask = 0; + m_lcd_data = 0; + m_motors_ctrl = 0; + m_hmotor_pos = 0xff; + m_vmotor_pos = 0xff; + m_vmotor_sensor0_ff = false; + m_vmotor_sensor1_ff = false; + m_hmotor_sensor0_ff = false; + m_hmotor_sensor1_ff = false; + m_piece = 0; + m_piece_collision = false; + memset(m_pieces_map, 0, sizeof(m_pieces_map)); + m_rombank->set_entry(0); } @@ -70,13 +136,187 @@ void phantom_state::init_fphantom() } +TIMER_DEVICE_CALLBACK_MEMBER(phantom_state::motors_timer) +{ + if (m_motors_ctrl & 0x03) m_vmotor_sensor0_ff = true; + if (m_motors_ctrl & 0x02) m_vmotor_sensor1_ff = true; + if (m_motors_ctrl & 0x0c) m_hmotor_sensor0_ff = true; + if (m_motors_ctrl & 0x04) m_hmotor_sensor1_ff = true; + + if ((m_motors_ctrl & 0x01) && m_vmotor_pos > 0x00) m_vmotor_pos--; + if ((m_motors_ctrl & 0x02) && m_vmotor_pos < 0xff) m_vmotor_pos++; + if ((m_motors_ctrl & 0x04) && m_hmotor_pos > 0x00) m_hmotor_pos--; + if ((m_motors_ctrl & 0x08) && m_hmotor_pos < 0xff) m_hmotor_pos++; +} + +void phantom_state::update_pieces_position(int state) +{ + // convert motors position into board coordinates + int x = m_hmotor_pos / 16 - 2; + int y = m_vmotor_pos / 16; + + if (x < 0) + x += 12; + + // check if the magnet is in the center of a square + bool valid_pos = ((m_hmotor_pos & 0x0f) == 0x03 || (m_hmotor_pos & 0x0f) == 0x07) && ((m_vmotor_pos & 0x0f) == 0x09 || (m_vmotor_pos & 0x0f) == 0x0d); + + if (state) + { + if (m_piece_collision) + m_piece_collision = valid_pos = false; + + if (valid_pos) + { + m_piece = m_board->read_piece(x, y); + m_board->write_piece(x, y, 0); + } + else + m_piece = m_pieces_map[m_vmotor_pos / 4][m_hmotor_pos / 4]; + + m_pieces_map[m_vmotor_pos / 4][m_hmotor_pos / 4] = 0; + } + else + { + // check for pieces collisions + if (valid_pos && m_board->read_piece(x, y) != 0) + { + valid_pos = false; + m_piece_collision = true; + } + + if (valid_pos) + m_board->write_piece(x, y, m_piece); + + m_pieces_map[m_vmotor_pos / 4][m_hmotor_pos / 4] = m_piece; + m_piece = 0; + } + + m_board->refresh(); +} /****************************************************************************** I/O ******************************************************************************/ -//.. +WRITE8_MEMBER(phantom_state::mux_w) +{ + uint8_t mask = 1 << offset; + m_mux = (m_mux & ~mask) | ((data & 0x02) ? mask : 0); +} + +WRITE8_MEMBER(phantom_state::lcd_mask_w) +{ + m_lcd_mask = (data & 0x02) ? 0x00 : 0xff; +} + +WRITE8_MEMBER(phantom_state::led_w) +{ + m_display->matrix_partial(0, 2, 1, BIT(~data, 7) << m_mux); +} + +WRITE8_MEMBER(phantom_state::rombank_w) +{ + m_rombank->set_entry(data & 1); +} + +WRITE8_MEMBER(phantom_state::motors_w) +{ + // bit 0: vertical motor down + // bit 1: vertical motor up + // bit 2: horizontal motor left + // bit 3: horizontal motor right + // bit 4: electromagnet + // bit 5: speaker + + if ((m_motors_ctrl ^ data) & 0x10) + update_pieces_position(BIT(data, 4)); + + m_dac->write(BIT(data, 5)); + m_motors_ctrl = data; +} + +WRITE8_MEMBER(phantom_state::lcd_w) +{ + data ^= m_lcd_mask; + + u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5); + for (int i = 0; i < 4; i++) + { + m_lcd_data = (m_lcd_data & ~mask) | (BIT(data, i * 2) ? mask : 0); + mask <<= 8; + + m_display->write_row(i+2, m_lcd_data >> (8*i) & 0xff); + } + + m_display->update(); +} + +READ8_MEMBER(phantom_state::input_r) +{ + uint8_t data = 0xff; + + if (m_mux == 8) + { + if (BIT(m_input->read(), offset * 2 + 1)) data &= ~0x40; + if (BIT(m_input->read(), offset * 2 + 0)) data &= ~0x80; + } + else if (offset < 4) + { + if (BIT(m_board->read_file(offset * 2 + 1), m_mux)) data &= ~0x40; + if (BIT(m_board->read_file(offset * 2 + 0), m_mux)) data &= ~0x80; + } + else + { + if (BIT(m_board->read_file( 8 + (offset & 1)), m_mux)) data &= ~0x40; // black captured pieces + if (BIT(m_board->read_file(11 - (offset & 1)), m_mux)) data &= ~0x80; // white captured pieces + } + + return data; +} + +READ8_MEMBER(phantom_state::motors_r) +{ + uint8_t data = 0xff; + + switch (offset) + { + case 0: + if (!m_vmotor_sensor1_ff) data &= ~0x40; + if (!m_hmotor_sensor1_ff) data &= ~0x80; + break; + case 1: + if (!m_vmotor_sensor0_ff) data &= ~0x40; + if (!m_hmotor_sensor0_ff) data &= ~0x80; + break; + } + + return data; +} + +READ8_MEMBER(phantom_state::irq_ack_r) +{ + if (!machine().side_effects_disabled()) + m_maincpu->set_input_line(R65C02_IRQ_LINE, CLEAR_LINE); + return 0; +} + +READ8_MEMBER(phantom_state::hmotor_ff_clear_r) +{ + if (!machine().side_effects_disabled()) + m_hmotor_sensor1_ff = m_hmotor_sensor0_ff = false; + + return 0; +} + +READ8_MEMBER(phantom_state::vmotor_ff_clear_r) +{ + if (!machine().side_effects_disabled()) + m_vmotor_sensor1_ff = m_vmotor_sensor0_ff = false; + + return 0; +} /****************************************************************************** @@ -86,6 +326,17 @@ void phantom_state::init_fphantom() void phantom_state::main_map(address_map &map) { map(0x0000, 0x1fff).ram(); + map(0x2000, 0x2003).w(FUNC(phantom_state::mux_w)); + map(0x2004, 0x2004).w(FUNC(phantom_state::led_w)); + map(0x2006, 0x2006).w(FUNC(phantom_state::rombank_w)); + map(0x20ff, 0x20ff).w(FUNC(phantom_state::lcd_mask_w)); + map(0x2100, 0x2107).w(FUNC(phantom_state::lcd_w)).nopr(); + map(0x2200, 0x2200).w(FUNC(phantom_state::motors_w)); + map(0x2400, 0x2405).r(FUNC(phantom_state::input_r)); + map(0x2406, 0x2407).r(FUNC(phantom_state::motors_r)); + map(0x2500, 0x25ff).r(FUNC(phantom_state::hmotor_ff_clear_r)); + map(0x2600, 0x2600).r(FUNC(phantom_state::vmotor_ff_clear_r)); + map(0x2700, 0x2700).r(FUNC(phantom_state::irq_ack_r)); map(0x4000, 0x7fff).bankr("rombank"); map(0x8000, 0xffff).rom(); } @@ -97,6 +348,19 @@ void phantom_state::main_map(address_map &map) ******************************************************************************/ static INPUT_PORTS_START( fphantom ) + PORT_START("IN.0") + PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem") + PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Time") + PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New") + PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Replay") + PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Info") + PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / Alternate") + PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Auto / Stop") + PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Shift") + PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x800, IP_ACTIVE_HIGH, IPT_UNUSED) INPUT_PORTS_END @@ -109,10 +373,21 @@ void phantom_state::fphantom(machine_config &config) { /* basic machine hardware */ R65C02(config, m_maincpu, 4.9152_MHz_XTAL); // R65C02P4 - m_maincpu->set_periodic_int(FUNC(phantom_state::irq0_line_hold), attotime::from_hz(600)); // guessed + m_maincpu->set_periodic_int(FUNC(phantom_state::irq0_line_assert), attotime::from_hz(600)); // guessed m_maincpu->set_addrmap(AS_PROGRAM, &phantom_state::main_map); - //config.set_default_layout(layout_fidel_phantom); + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->set_size(12, 8); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(100)); + + TIMER(config, "motors_timer").configure_periodic(FUNC(phantom_state::motors_timer), attotime::from_hz(120)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(2+4, 9); + m_display->set_segmask(0x3c, 0x7f); + + config.set_default_layout(layout_fidel_phantom); /* sound hardware */ SPEAKER(config, "speaker").front_center(); @@ -143,4 +418,4 @@ ROM_END ******************************************************************************/ // YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS -CONS( 1988, fphantom, 0, 0, fphantom, fphantom, phantom_state, init_fphantom, "Fidelity Electronics", "Phantom Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) +CONS( 1988, fphantom, 0, 0, fphantom, fphantom, phantom_state, init_fphantom, "Fidelity Electronics", "Phantom Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL ) diff --git a/src/mame/layout/fidel_phantom.lay b/src/mame/layout/fidel_phantom.lay new file mode 100644 index 00000000000..77da515b4da --- /dev/null +++ b/src/mame/layout/fidel_phantom.lay @@ -0,0 +1,669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +