From dfec64bf4bd9c19c7a55f6cd7d95f2a5cd316143 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 3 Sep 2019 18:55:48 +0200 Subject: [PATCH] mark5: add svg screen, add inputs (nw) --- src/mame/drivers/mephisto_brikett.cpp | 2 +- src/mame/drivers/novag_savant.cpp | 2 +- src/mame/drivers/saitek_delta1.cpp | 5 +- src/mame/drivers/saitek_mark5.cpp | 181 +++++++++++++++++++------- src/mame/drivers/saitek_ssystem3.cpp | 2 +- 5 files changed, 141 insertions(+), 51 deletions(-) diff --git a/src/mame/drivers/mephisto_brikett.cpp b/src/mame/drivers/mephisto_brikett.cpp index 862d6dd3be8..bb688c7b334 100644 --- a/src/mame/drivers/mephisto_brikett.cpp +++ b/src/mame/drivers/mephisto_brikett.cpp @@ -360,7 +360,7 @@ static INPUT_PORTS_START( mephisto ) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H / 8") PORT_START("IN.4") // 2nd model main PCB has 2 XTALs on PCB - PORT_CONFNAME( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, brikett_state, switch_cpu_freq, 0) PORT_CONDITION("IN.4", 0x30, NOTEQUALS, 0x00) + PORT_CONFNAME( 0x03, 0x01, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, brikett_state, switch_cpu_freq, 0) PORT_CONDITION("IN.4", 0x30, NOTEQUALS, 0x00) PORT_CONFSETTING( 0x00, "3.579MHz (Battery)" ) PORT_CONFSETTING( 0x01, "6.144MHz (Mains)" ) PORT_CONFNAME( 0x30, 0x00, "Base Hardware" ) PORT_CHANGED_MEMBER(DEVICE_SELF, brikett_state, switch_cpu_freq, 0) diff --git a/src/mame/drivers/novag_savant.cpp b/src/mame/drivers/novag_savant.cpp index 4613abb87b2..b4f9337da3e 100644 --- a/src/mame/drivers/novag_savant.cpp +++ b/src/mame/drivers/novag_savant.cpp @@ -344,7 +344,7 @@ static INPUT_PORTS_START( savant ) PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Set Up") PORT_START("LIGHT") - PORT_CONFNAME( 0x01, 0x01, "LCD Backlight" ) PORT_CHANGED_MEMBER(DEVICE_SELF, savant_state, light_switch, 0) + PORT_CONFNAME( 0x01, 0x01, "LCD Light" ) PORT_CHANGED_MEMBER(DEVICE_SELF, savant_state, light_switch, 0) PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) PORT_CONFSETTING( 0x01, DEF_STR( On ) ) INPUT_PORTS_END diff --git a/src/mame/drivers/saitek_delta1.cpp b/src/mame/drivers/saitek_delta1.cpp index 9a100f8b3c7..6731223dd5f 100644 --- a/src/mame/drivers/saitek_delta1.cpp +++ b/src/mame/drivers/saitek_delta1.cpp @@ -3,9 +3,8 @@ // thanks-to:Berger /****************************************************************************** -SciSys Delta-1, the chess engine seems similar to Boris (see aci_boris.cpp) -It was sold by both Novag and SciSys, ROM has "COPY RIGHT WINKLER HK 1979", -Winkler was the founder of SciSys(later renamed to Saitek). +SciSys Delta-1, it was sold by both Novag and SciSys, ROM has "COPY RIGHT WINKLER +HK 1979", Winkler was the founder of SciSys(later renamed to Saitek). Hardware notes: - 3850PK CPU at ~2MHz, 3853PK memory interface diff --git a/src/mame/drivers/saitek_mark5.cpp b/src/mame/drivers/saitek_mark5.cpp index e775b6da88e..1910f30eb0c 100644 --- a/src/mame/drivers/saitek_mark5.cpp +++ b/src/mame/drivers/saitek_mark5.cpp @@ -7,7 +7,7 @@ Chess Champion: Mark V / Mark VI (aka MK V / MK VI) Released in late 1981, the chess engine was initially written by David Broughton for a Z80 CPU and used in a prototype. It was ported to 6502 by Mark Taylor, -I/O by Mike Johnson. Support from David Levy and Kevin o'Connell, hardware +I/O by Mike Johnson. Support from David Levy and Kevin O'Connell, hardware by Nick Toop. These credits are in the ROM data. Mark VI/Philidor was released a year later, it was a plug-in module for the Mark V. @@ -16,15 +16,32 @@ It's not much stronger than Mark V(retroactively called Mark V/Travemunde). Hardware notes: - x +3 slots: +- ROM module at the bottom, mandatory (4*8KB) +- unused module slot next to the LCD +- sensory board at left edge, only for MK VI + +Chess Champion Sensory Board: +- hardware unknown +- magnet sensors, 64 leds + +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) +- what are the 1M/3M/4M diodes for? CPU speed? the only noticeable difference + is beeper pitch ******************************************************************************/ #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" @@ -33,8 +50,6 @@ TODO: #include "screen.h" #include "speaker.h" -#include - // internal artwork //#include "saitek_mark5.lh" // clickable @@ -47,7 +62,6 @@ 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_display(*this, "display%u", 0), m_lcd(*this, "lcd%u", 0), m_dac(*this, "dac"), @@ -65,11 +79,10 @@ protected: private: // devices/pointers required_device m_maincpu; - required_device m_board; - required_device_array m_display; + required_device_array m_display; required_device_array m_lcd; required_device m_dac; - required_ioport_array<2> m_inputs; + required_ioport_array<7+1> m_inputs; output_finder<3, 8, 34> m_out_x; // address maps @@ -77,7 +90,9 @@ private: // I/O handlers DECLARE_WRITE8_MEMBER(lcd_data_w); + DECLARE_WRITE8_MEMBER(sound_w); DECLARE_READ8_MEMBER(sound_r); + DECLARE_WRITE8_MEMBER(reset_irq_w); DECLARE_READ8_MEMBER(reset_irq_r); DECLARE_READ8_MEMBER(input_r); @@ -86,7 +101,7 @@ private: u8 m_dac_data; u8 m_lcd_lcd; - u64 m_lcd_data[3]; + u8 m_lcd_rowsel; emu_timer *m_irqtimer; TIMER_CALLBACK_MEMBER(interrupt); @@ -101,17 +116,17 @@ void mark5_state::machine_start() // zerofill m_dac_data = 0; m_lcd_lcd = 0; - std::fill_n(m_lcd_data, ARRAY_LENGTH(m_lcd_data), 0); + m_lcd_rowsel = 0; // register for savestates save_item(NAME(m_dac_data)); save_item(NAME(m_lcd_lcd)); - save_item(NAME(m_lcd_data)); + save_item(NAME(m_lcd_rowsel)); } void mark5_state::machine_reset() { - reset_irq_r(machine().dummy_space(), 0); + reset_irq_w(machine().dummy_space(), 0, 0); } @@ -129,13 +144,14 @@ WRITE8_MEMBER(mark5_state::pwm_output_w) template WRITE64_MEMBER(mark5_state::lcd_output_w) { - m_lcd_data[N] = data; - - u8 sel = m_lcd_data[0] & 0xff; if (N == 0) + { + // HLCD0538 R pins + m_lcd_rowsel = data & 0xff; data >>= 8; + } - m_display[N]->matrix(sel, data); + m_display[N]->matrix(m_lcd_rowsel, data); } void mark5_state::write_lcd(int state) @@ -157,26 +173,32 @@ TIMER_CALLBACK_MEMBER(mark5_state::interrupt) write_lcd(m_lcd_lcd ^ 1); } +WRITE8_MEMBER(mark5_state::reset_irq_w) +{ + // MC14020 R + m_irqtimer->adjust(attotime::from_hz((19.6608_MHz_XTAL / 10 / 0x1000) * 2)); + write_lcd(0); +} + READ8_MEMBER(mark5_state::reset_irq_r) { if (!machine().side_effects_disabled()) - { - // MC14020 R - m_irqtimer->adjust(attotime::from_hz((19.6608_MHz_XTAL / 10 / 0x1000) * 2)); - write_lcd(0); - } + reset_irq_w(space, offset, 0); return 0xff; } +WRITE8_MEMBER(mark5_state::sound_w) +{ + // 7474 to speaker out + m_dac_data ^= 1; + m_dac->write(m_dac_data & m_inputs[7]->read()); +} + READ8_MEMBER(mark5_state::sound_r) { if (!machine().side_effects_disabled()) - { - // 7474 to speaker out - m_dac->write(m_dac_data); - m_dac_data ^= 1; - } + sound_w(space, offset, 0); return 0xff; } @@ -195,9 +217,15 @@ WRITE8_MEMBER(mark5_state::lcd_data_w) READ8_MEMBER(mark5_state::input_r) { + u8 data = 0; + // _a6: configuration diodes // a0-a5: multiplexed inputs - return 0xff; + for (int i = 0; i < 7; i++) + if (BIT(offset ^ 0x40, i)) + data |= m_inputs[i]->read(); + + return ~data; } @@ -210,11 +238,11 @@ void mark5_state::main_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x3fff).ram(); - map(0x4000, 0x407f).r(FUNC(mark5_state::input_r)); - map(0x4400, 0x4400).w(FUNC(mark5_state::lcd_data_w)); - map(0x4800, 0x4800).r(FUNC(mark5_state::sound_r)); - map(0x4c00, 0x4c00).r(FUNC(mark5_state::reset_irq_r)); - map(0x5000, 0x50ff).ram(); + map(0x4000, 0x407f).mirror(0x0380).r(FUNC(mark5_state::input_r)); + map(0x4400, 0x4400).mirror(0x03ff).w(FUNC(mark5_state::lcd_data_w)); + map(0x4800, 0x4800).mirror(0x03ff).rw(FUNC(mark5_state::sound_r), FUNC(mark5_state::sound_w)); + map(0x4c00, 0x4c00).mirror(0x03ff).rw(FUNC(mark5_state::reset_irq_r), FUNC(mark5_state::reset_irq_w)); + map(0x5000, 0x50ff).mirror(0x0f00).ram(); map(0x8000, 0xffff).rom(); } @@ -226,16 +254,70 @@ void mark5_state::main_map(address_map &map) static INPUT_PORTS_START( mark5 ) PORT_START("IN.0") - 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(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) // enter pos + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) // newgame + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) // draw + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) // peripheral + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) // next simul + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) // swap PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) // next best + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) // auto + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) // comment + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) // analysis + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) // clock + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) // clock stop + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) // 0 + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) // a + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) // 2 + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) // c + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) // 4 + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) // e + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) // f + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) // g + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) // h + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) // 9 + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) // take back + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) // forward + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) // replay + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) // go + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) // enter + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) // ce + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) // mode + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) // clock start + + PORT_START("IN.5") // square 'd-pad' + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.6") // diodes + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_CUSTOM) // 1M/3M/4M + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_CUSTOM) // " + PORT_CONFNAME( 0x0c, 0x00, DEF_STR( Language ) ) + PORT_CONFSETTING( 0x00, DEF_STR( English ) ) + PORT_CONFSETTING( 0x04, DEF_STR( German ) ) + PORT_CONFSETTING( 0x08, DEF_STR( French ) ) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_CUSTOM) // $6000 edge connector + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_CUSTOM) // $7000 " + + PORT_START("IN.7") // switches + PORT_CONFNAME( 0x01, 0x01, "Sound" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_CONFNAME( 0x02, 0x02, "LCD Light" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x02, DEF_STR( On ) ) INPUT_PORTS_END @@ -250,9 +332,6 @@ void mark5_state::mark5(machine_config &config) M6502(config, m_maincpu, 19.6608_MHz_XTAL / 10); m_maincpu->set_addrmap(AS_PROGRAM, &mark5_state::main_map); - SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - /* video hardware */ HLCD0538(config, m_lcd[0]).write_cols().set(FUNC(mark5_state::lcd_output_w<0>)); PWM_DISPLAY(config, m_display[0]).set_size(8, 26); @@ -266,7 +345,13 @@ void mark5_state::mark5(machine_config &config) PWM_DISPLAY(config, m_display[2]).set_size(8, 34); m_display[2]->output_x().set(FUNC(mark5_state::pwm_output_w<2>)); - PWM_DISPLAY(config, m_display[3]).set_size(8, 8); + for (int i = 0; i < 3; i++) + m_display[i]->set_bri_maximum(0.1); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(942, 1080); + screen.set_visarea_full(); //config.set_default_layout(layout_saitek_mark5); @@ -288,6 +373,9 @@ ROM_START( ccmk5 ) ROM_LOAD("c47025_syp_2364-3-y5a", 0xa000, 0x2000, CRC(3239c96b) SHA1(6a23713b30c48546d993a0de8998c8de9044e48c) ) // " ROM_LOAD("c47026_syp_2364-3-y5c", 0xc000, 0x2000, CRC(1754ccab) SHA1(d246b6aa2e2a1858dd6608a4dbf496778f79b22e) ) // " ROM_LOAD("c47027_syp_2364-3-y5d", 0xe000, 0x2000, CRC(7c0f7bd8) SHA1(68b4566f0501005f6b1739bb24a4bec990421a6f) ) // " + + ROM_REGION( 1887311, "screen", 0) + ROM_LOAD( "ccmk5.svg", 0, 1887311, CRC(3261bcb2) SHA1(46b38a2877faa36ef1adea2b8f484a97b46ea529) ) ROM_END ROM_START( ccmk6 ) @@ -296,6 +384,9 @@ ROM_START( ccmk6 ) ROM_LOAD("y6_a0", 0xa000, 0x2000, CRC(dd77dd90) SHA1(844aee56e1941f05bdf046d95c5ae687707a2c95) ) // " ROM_LOAD("y6_c0", 0xc000, 0x2000, CRC(705e5718) SHA1(513bba3e7344194efaaf022a7934d32d8cba3cb5) ) // " ROM_LOAD("y6_e0", 0xe000, 0x2000, CRC(b92c3eb3) SHA1(99a20f5e971b8c4228e0eda0a4c05750d46b95f6) ) // " + + ROM_REGION( 1887311, "screen", 0) + ROM_LOAD( "ccmk5.svg", 0, 1887311, CRC(3261bcb2) SHA1(46b38a2877faa36ef1adea2b8f484a97b46ea529) ) ROM_END } // anonymous namespace @@ -308,4 +399,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, 0, 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, mark5, mark5, mark5_state, empty_init, "SciSys / Philidor Software", "Chess Champion: Mark VI/Philidor", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/saitek_ssystem3.cpp b/src/mame/drivers/saitek_ssystem3.cpp index f464749dda1..aa48269ceb9 100644 --- a/src/mame/drivers/saitek_ssystem3.cpp +++ b/src/mame/drivers/saitek_ssystem3.cpp @@ -275,7 +275,7 @@ static INPUT_PORTS_START( ssystem3 ) PORT_CONFNAME( 0x01, 0x01, "Sound" ) PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_CONFNAME( 0x02, 0x02, "Light" ) + PORT_CONFNAME( 0x02, 0x02, "LCD Light" ) PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) PORT_CONFSETTING( 0x02, DEF_STR( On ) )