summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/saitek_mark5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/saitek_mark5.cpp')
-rw-r--r--src/mame/drivers/saitek_mark5.cpp95
1 files changed, 87 insertions, 8 deletions
diff --git a/src/mame/drivers/saitek_mark5.cpp b/src/mame/drivers/saitek_mark5.cpp
index db415f9ea8a..6cc05e6edab 100644
--- a/src/mame/drivers/saitek_mark5.cpp
+++ b/src/mame/drivers/saitek_mark5.cpp
@@ -25,15 +25,16 @@ Hardware notes:
- sensory board at left edge, only for MK VI
Chess Champion Sensory Board:
+- PCB label: SciSys 502-00
- 4KB ROM (NEC D2732), TTL
- magnet sensors, 64 leds
-A piece-recognition chessboard was also announced but not released. Maybe
-it existed as prototype, see patent GB2103943A.
+The slots were designed to support anything, but the only released peripheral
+was the Chess Champion Sensory Board. A piece-recognition chessboard was also
+announced but not released. Maybe it existed as prototype, see patent GB2103943A.
TODO:
- WIP
-- add sensory board peripheral, need rom dump
- /2 CPU divider when accessing 0x5000 (the nvram)
- reading from 0x4400 will write to the LCD too, open bus? it wouldn't make
sense to use it (and as expected, it never is used)
@@ -45,6 +46,7 @@ TODO:
#include "emu.h"
#include "cpu/m6502/m6502.h"
#include "machine/nvram.h"
+#include "machine/sensorboard.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
#include "video/hlcd0538.h"
@@ -55,6 +57,7 @@ TODO:
// internal artwork
//#include "saitek_mark5.lh" // clickable
+//#include "saitek_mark6.lh" // clickable
namespace {
@@ -65,6 +68,8 @@ public:
mark5_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
+ m_board(*this, "board"),
+ m_cb_rom(*this, "chessboard"),
m_display(*this, "display%u", 0),
m_lcd(*this, "lcd%u", 0),
m_dac(*this, "dac"),
@@ -75,6 +80,9 @@ public:
// machine drivers
void mark5(machine_config &config);
+ void mark6(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(cb_enable) { if (!newval) m_display[3]->clear(); }
protected:
virtual void machine_start() override;
@@ -83,7 +91,9 @@ protected:
private:
// devices/pointers
required_device<cpu_device> m_maincpu;
- required_device_array<pwm_display_device, 3> m_display;
+ optional_device<sensorboard_device> m_board;
+ optional_region_ptr<u8> m_cb_rom;
+ optional_device_array<pwm_display_device, 3+1> m_display;
required_device_array<hlcd0538_device, 3> m_lcd;
required_device<dac_bit_interface> m_dac;
required_shared_ptr<u8> m_nvram;
@@ -91,7 +101,8 @@ private:
output_finder<3, 8, 34> m_out_x;
// address maps
- void main_map(address_map &map);
+ void mark5_map(address_map &map);
+ void mark6_map(address_map &map);
// I/O handlers
DECLARE_WRITE8_MEMBER(nvram_w);
@@ -102,6 +113,9 @@ private:
DECLARE_WRITE8_MEMBER(reset_irq_w);
DECLARE_READ8_MEMBER(reset_irq_r);
DECLARE_READ8_MEMBER(input_r);
+ DECLARE_READ8_MEMBER(cb_rom_r);
+ DECLARE_WRITE8_MEMBER(cb_w);
+ DECLARE_READ8_MEMBER(cb_r);
template<int N> DECLARE_WRITE8_MEMBER(pwm_output_w);
template<int N> DECLARE_WRITE64_MEMBER(lcd_output_w);
@@ -109,6 +123,7 @@ private:
u8 m_dac_data;
u8 m_lcd_lcd;
u8 m_lcd_rowsel;
+ u8 m_cb_mux;
emu_timer *m_irqtimer;
TIMER_CALLBACK_MEMBER(interrupt);
@@ -124,11 +139,13 @@ void mark5_state::machine_start()
m_dac_data = 0;
m_lcd_lcd = 0;
m_lcd_rowsel = 0;
+ m_cb_mux = 0;
// register for savestates
save_item(NAME(m_dac_data));
save_item(NAME(m_lcd_lcd));
save_item(NAME(m_lcd_rowsel));
+ save_item(NAME(m_cb_mux));
}
void mark5_state::machine_reset()
@@ -246,13 +263,39 @@ READ8_MEMBER(mark5_state::input_r)
return ~data;
}
+WRITE8_MEMBER(mark5_state::cb_w)
+{
+ if (~m_inputs[6]->read() & 0x20)
+ return;
+
+ // d0-d2: chessboard led mux 1/input mux
+ // d3-d5: chessboard led mux 2
+ // d6: led state
+ m_display[3]->matrix(1 << (data & 7), 1 << (data >> 3 & 0xf));
+ m_cb_mux = data;
+}
+
+READ8_MEMBER(mark5_state::cb_r)
+{
+ if (~m_inputs[6]->read() & 0x20)
+ return 0xff;
+
+ // read chessboard sensors
+ return ~m_board->read_file(m_cb_mux & 7);
+}
+
+READ8_MEMBER(mark5_state::cb_rom_r)
+{
+ return (m_inputs[6]->read() & 0x20) ? m_cb_rom[offset] : 0xff;
+}
+
/******************************************************************************
Address Maps
******************************************************************************/
-void mark5_state::main_map(address_map &map)
+void mark5_state::mark5_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x3fff).ram();
@@ -264,6 +307,14 @@ void mark5_state::main_map(address_map &map)
map(0x8000, 0xffff).rom();
}
+void mark5_state::mark6_map(address_map &map)
+{
+ mark5_map(map);
+
+ map(0x7000, 0x77ff).r(FUNC(mark5_state::cb_rom_r));
+ map(0x7800, 0x7800).mirror(0x07ff).rw(FUNC(mark5_state::cb_r), FUNC(mark5_state::cb_w));
+}
+
/******************************************************************************
@@ -338,6 +389,15 @@ static INPUT_PORTS_START( mark5 )
PORT_CONFSETTING( 0x02, DEF_STR( On ) )
INPUT_PORTS_END
+static INPUT_PORTS_START( mark6 )
+ PORT_INCLUDE( mark5 )
+
+ PORT_MODIFY("IN.6")
+ PORT_CONFNAME( 0x20, 0x20, "Sensory Board" ) PORT_CHANGED_MEMBER(DEVICE_SELF, mark5_state, cb_enable, 0)
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x20, DEF_STR( On ) )
+INPUT_PORTS_END
+
/******************************************************************************
@@ -348,7 +408,7 @@ void mark5_state::mark5(machine_config &config)
{
/* basic machine hardware */
M6502(config, m_maincpu, 19.6608_MHz_XTAL / 10);
- m_maincpu->set_addrmap(AS_PROGRAM, &mark5_state::main_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mark5_state::mark5_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -381,6 +441,22 @@ void mark5_state::mark5(machine_config &config)
VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
+void mark5_state::mark6(machine_config &config)
+{
+ mark5(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mark5_state::mark6_map);
+
+ SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS);
+ m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
+ m_board->set_delay(attotime::from_msec(150));
+
+ PWM_DISPLAY(config, m_display[3]).set_size(8, 8);
+ m_display[3]->set_bri_levels(0.001);
+ //config.set_default_layout(layout_saitek_mark6);
+}
+
/******************************************************************************
@@ -405,6 +481,9 @@ ROM_START( ccmk6 )
ROM_LOAD("y6_c0", 0xc000, 0x2000, CRC(705e5718) SHA1(513bba3e7344194efaaf022a7934d32d8cba3cb5) ) // "
ROM_LOAD("y6_e0", 0xe000, 0x2000, CRC(b92c3eb3) SHA1(99a20f5e971b8c4228e0eda0a4c05750d46b95f6) ) // "
+ ROM_REGION( 0x1000, "chessboard", 0 )
+ ROM_LOAD("d2732c-e.u1", 0x0000, 0x1000, CRC(93221b4c) SHA1(8561b52c80cab7c04d30eaa14f9520a362d7f822) ) // no label, identical halves
+
ROM_REGION( 1887311, "screen", 0)
ROM_LOAD( "ccmk5.svg", 0, 1887311, CRC(3261bcb2) SHA1(46b38a2877faa36ef1adea2b8f484a97b46ea529) )
ROM_END
@@ -419,4 +498,4 @@ ROM_END
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1981, ccmk5, 0, 0, mark5, mark5, mark5_state, empty_init, "SciSys / Philidor Software", "Chess Champion: Mark V", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-CONS( 1982, ccmk6, ccmk5, 0, mark5, mark5, mark5_state, empty_init, "SciSys / Philidor Software", "Chess Champion: Mark VI/Philidor", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+CONS( 1982, ccmk6, ccmk5, 0, mark6, mark6, mark5_state, empty_init, "SciSys / Philidor Software", "Chess Champion: Mark VI/Philidor", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )