From 69d5d89940d2463227adb84047bc0c9e69b8904d Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 22 Apr 2020 12:13:37 +0200 Subject: [PATCH] New machines marked as NOT_WORKING ---------------------------------- Executive Chess [hap, Sean Riddle] --- scripts/target/mame/mess.lua | 1 + src/devices/cpu/hmcs40/hmcs40.cpp | 2 +- src/devices/cpu/hmcs40/hmcs40op.cpp | 2 +- src/devices/video/hlcd0538.cpp | 22 +-- src/devices/video/hlcd0538.h | 11 +- src/mame/drivers/compuchess.cpp | 4 +- src/mame/drivers/fidel_elite.cpp | 12 +- src/mame/drivers/hh_hmcs40.cpp | 2 +- src/mame/drivers/homerun.cpp | 18 +- src/mame/drivers/mattelchess.cpp | 2 +- src/mame/drivers/microvsn.cpp | 6 +- src/mame/drivers/novag_savant.cpp | 2 +- src/mame/drivers/saitek_chesstrv.cpp | 6 +- src/mame/drivers/saitek_cp2000.cpp | 4 +- src/mame/drivers/saitek_exchess.cpp | 243 +++++++++++++++++++++++++++ src/mame/layout/microvision.lay | 4 +- src/mame/mame.lst | 3 + src/mame/mess.flt | 1 + 18 files changed, 299 insertions(+), 46 deletions(-) create mode 100644 src/mame/drivers/saitek_exchess.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index ef964574c21..44330d8c992 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -3345,6 +3345,7 @@ files { MAME_DIR .. "src/mame/drivers/saitek_chesstrv.cpp", MAME_DIR .. "src/mame/drivers/saitek_cp2000.cpp", MAME_DIR .. "src/mame/drivers/saitek_delta1.cpp", + MAME_DIR .. "src/mame/drivers/saitek_exchess.cpp", MAME_DIR .. "src/mame/drivers/saitek_mark5.cpp", MAME_DIR .. "src/mame/drivers/saitek_prschess.cpp", MAME_DIR .. "src/mame/drivers/saitek_risc2500.cpp", diff --git a/src/devices/cpu/hmcs40/hmcs40.cpp b/src/devices/cpu/hmcs40/hmcs40.cpp index 5a15217e922..0d3b331d531 100644 --- a/src/devices/cpu/hmcs40/hmcs40.cpp +++ b/src/devices/cpu/hmcs40/hmcs40.cpp @@ -593,7 +593,7 @@ void hmcs40_cpu_device::execute_run() debugger_instruction_hook(m_pc); m_icount--; m_op = m_program->read_word(m_pc) & 0x3ff; - m_i = bitswap<8>(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for 4-bit immediate param (except for XAMR) + m_i = bitswap<4>(m_op,0,1,2,3); // reversed bit-order for 4-bit immediate param (except for XAMR) increment_pc(); // handle opcode diff --git a/src/devices/cpu/hmcs40/hmcs40op.cpp b/src/devices/cpu/hmcs40/hmcs40op.cpp index 1886768bc8d..b90cdcda2b3 100644 --- a/src/devices/cpu/hmcs40/hmcs40op.cpp +++ b/src/devices/cpu/hmcs40/hmcs40op.cpp @@ -669,7 +669,7 @@ void hmcs40_cpu_device::op_p() if (o & 0x100) { // B3 B2 B1 B0 A0 A1 A2 A3 - m_a = bitswap<8>(o,7,6,5,4,0,1,2,3) & 0xf; + m_a = bitswap<4>(o,0,1,2,3); m_b = o >> 4 & 0xf; } if (o & 0x200) diff --git a/src/devices/video/hlcd0538.cpp b/src/devices/video/hlcd0538.cpp index 40498ef84c3..a5f731313e9 100644 --- a/src/devices/video/hlcd0538.cpp +++ b/src/devices/video/hlcd0538.cpp @@ -2,13 +2,16 @@ // copyright-holders:hap /* - Hughes HLCD 0538(A)/0539(A) LCD Driver +Hughes HLCD 0538(A)/0539(A) LCD Driver - 0538: 8 rows, 26 columns - 0539: 0 rows, 34 columns +0538: 8 rows, 26 columns +0539: 0 rows, 34 columns - TODO: - - the only difference between 0538/0539 is row pins voltage levels? +"LCD" pin can be used in 2 modes, either direct drive, or as an oscillator. +In latter case, output frequency is approximately 1/RC. + +TODO: +- the only difference between 0538/0539 is row pins voltage levels? */ @@ -47,11 +50,10 @@ void hlcd0538_device::device_start() m_write_cols.resolve_safe(); m_write_interrupt.resolve_safe(); - // zerofill - m_lcd = 0; - m_clk = 0; - m_data = 0; - m_shift = 0; + // timer (when LCD pin is oscillator) + m_lcd_timer = timer_alloc(); + attotime period = (clock() != 0) ? attotime::from_hz(2 * clock()) : attotime::never; + m_lcd_timer->adjust(period, 0, period); // register for savestates save_item(NAME(m_lcd)); diff --git a/src/devices/video/hlcd0538.h b/src/devices/video/hlcd0538.h index 694abe3648c..2b17167b160 100644 --- a/src/devices/video/hlcd0538.h +++ b/src/devices/video/hlcd0538.h @@ -58,11 +58,14 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override { lcd_w(!m_lcd); } - int m_lcd; // input pin state - int m_clk; // " - int m_data; // " - u64 m_shift; + emu_timer *m_lcd_timer; + + int m_lcd = 0; + int m_clk = 0; + int m_data = 0; + u64 m_shift = 0; // callbacks devcb_write64 m_write_cols; diff --git a/src/mame/drivers/compuchess.cpp b/src/mame/drivers/compuchess.cpp index c83e642d0aa..2ee07675c82 100644 --- a/src/mame/drivers/compuchess.cpp +++ b/src/mame/drivers/compuchess.cpp @@ -368,8 +368,8 @@ void cmpchess_state::mk1(machine_config &config) cmpchess(config); /* basic machine hardware */ - m_maincpu->set_clock(2200000); // JS&A version measured 2.18MHz on average - subdevice("smi")->set_clock(2200000); + m_maincpu->set_clock(2250000); // JS&A version measured 2.18MHz on average + subdevice("smi")->set_clock(2250000); config.set_default_layout(layout_novag_mk1); } diff --git a/src/mame/drivers/fidel_elite.cpp b/src/mame/drivers/fidel_elite.cpp index 0b1c362068a..0b18d43a514 100644 --- a/src/mame/drivers/fidel_elite.cpp +++ b/src/mame/drivers/fidel_elite.cpp @@ -533,15 +533,15 @@ ROM_END ROM_START( feasgla ) ROM_REGION( 0x10000, "mainmap", 0 ) - ROM_LOAD("4,0_8_6", 0x8000, 0x0800, CRC(32784e2d) SHA1(dae060a5c49cc1993a78db293cd80464adfd892d) ) + ROM_LOAD("4.0_86", 0x8000, 0x0800, CRC(32784e2d) SHA1(dae060a5c49cc1993a78db293cd80464adfd892d) ) ROM_CONTINUE( 0x9000, 0x0800 ) ROM_CONTINUE( 0x8800, 0x0800 ) ROM_CONTINUE( 0x9800, 0x0800 ) - ROM_LOAD("c_5", 0xc000, 0x0800, CRC(ddb80412) SHA1(b1d9435d9a71b8eb241a2169bfbaa0499f510769) ) + ROM_LOAD("c5", 0xc000, 0x0800, CRC(ddb80412) SHA1(b1d9435d9a71b8eb241a2169bfbaa0499f510769) ) ROM_CONTINUE( 0xd000, 0x0800 ) ROM_CONTINUE( 0xc800, 0x0800 ) ROM_CONTINUE( 0xd800, 0x0800 ) - ROM_LOAD("4,0_e_4", 0xe000, 0x0800, CRC(62a5305a) SHA1(a361bd9a54b903d7b0fbacabe55ea5ccbbc1dc51) ) + ROM_LOAD("4.0_e4", 0xe000, 0x0800, CRC(62a5305a) SHA1(a361bd9a54b903d7b0fbacabe55ea5ccbbc1dc51) ) ROM_CONTINUE( 0xf000, 0x0800 ) ROM_CONTINUE( 0xe800, 0x0800 ) ROM_CONTINUE( 0xf800, 0x0800 ) @@ -569,15 +569,15 @@ ROM_END ROM_START( feasglaa ) ROM_REGION( 0x10000, "mainmap", 0 ) - ROM_LOAD("p6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) ) + ROM_LOAD("6a", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) ) ROM_CONTINUE( 0x9000, 0x0800 ) ROM_CONTINUE( 0x8800, 0x0800 ) ROM_CONTINUE( 0x9800, 0x0800 ) - ROM_LOAD("p5", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) ) + ROM_LOAD("5a", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) ) ROM_CONTINUE( 0xd000, 0x0800 ) ROM_CONTINUE( 0xc800, 0x0800 ) ROM_CONTINUE( 0xd800, 0x0800 ) - ROM_LOAD("p4", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) ) + ROM_LOAD("4a", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) ) ROM_CONTINUE( 0xf000, 0x0800 ) ROM_CONTINUE( 0xe800, 0x0800 ) ROM_CONTINUE( 0xf800, 0x0800 ) diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp index 33172303b5f..c6326cab70e 100644 --- a/src/mame/drivers/hh_hmcs40.cpp +++ b/src/mame/drivers/hh_hmcs40.cpp @@ -2736,7 +2736,7 @@ WRITE16_MEMBER(einvader2_state::grid_w) READ16_MEMBER(einvader2_state::input_r) { // D13-D15: multiplexed inputs - return read_inputs(6) << 13; + return read_inputs(3) << 13; } // config diff --git a/src/mame/drivers/homerun.cpp b/src/mame/drivers/homerun.cpp index d148a5176ab..cd3350e2078 100644 --- a/src/mame/drivers/homerun.cpp +++ b/src/mame/drivers/homerun.cpp @@ -496,16 +496,16 @@ void homerun_state::ganjaja(machine_config &config) ROM_START( homerun ) ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD( "homerun.ic43", 0x00000, 0x20000, CRC(e759e476) SHA1(ad4f356ff26209033320a3e6353e4d4d9beb59c1) ) + ROM_LOAD( "homerun.ic43", 0x00000, 0x20000, CRC(e759e476) SHA1(ad4f356ff26209033320a3e6353e4d4d9beb59c1) ) ROM_REGION( 0x10000, "gfx1", 0 ) - ROM_LOAD( "homerun.ic60", 0x00000, 0x10000, CRC(69a720d1) SHA1(0f0a4877578f358e9e829ece8c31e23f01adcf83) ) + ROM_LOAD( "homerun.ic60", 0x00000, 0x10000, CRC(69a720d1) SHA1(0f0a4877578f358e9e829ece8c31e23f01adcf83) ) ROM_REGION( 0x20000, "gfx2", 0 ) - ROM_LOAD( "homerun.ic120", 0x00000, 0x20000, CRC(52f0709b) SHA1(19e675bcccadb774f60ec5929fc1fb5cf0d3f617) ) + ROM_LOAD( "homerun.ic120", 0x00000, 0x20000, CRC(52f0709b) SHA1(19e675bcccadb774f60ec5929fc1fb5cf0d3f617) ) ROM_REGION( 0x08000, "d7756", ROMREGION_ERASE00 ) - ROM_LOAD( "d7756c.ic98", 0x00000, 0x08000, NO_DUMP ) // D7756C built-in rom - very likely the same rom as Moero!! Pro Yakyuu (Black/Red) on Famicom + ROM_LOAD( "d7756c_146.ic98", 0x00000, 0x08000, NO_DUMP ) // D7756C built-in rom - same maskrom serial as Moero!! Pro Yakyuu (Black/Red) on Famicom ROM_END ROM_START( nhomerun ) @@ -519,21 +519,21 @@ ROM_START( nhomerun ) ROM_LOAD( "2.ic120", 0x00000, 0x20000, CRC(57e9b757) SHA1(8190d690721005407a5b06d13d64e70301d1e925) ) ROM_REGION( 0x08000, "d7756", ROMREGION_ERASE00 ) - ROM_LOAD( "d7756c.ic98", 0x00000, 0x08000, NO_DUMP ) + ROM_LOAD( "d7756c_146.ic98", 0x00000, 0x08000, NO_DUMP ) ROM_END ROM_START( dynashot ) ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD( "1.ic43", 0x00000, 0x20000, CRC(bf3c9586) SHA1(439effbda305f5fa265e5897c81dc1447e5d867d) ) + ROM_LOAD( "1.ic43", 0x00000, 0x20000, CRC(bf3c9586) SHA1(439effbda305f5fa265e5897c81dc1447e5d867d) ) ROM_REGION( 0x10000, "gfx1", 0 ) - ROM_LOAD( "3.ic60", 0x00000, 0x10000, CRC(77d6a608) SHA1(a31ff343a5d4d6f20301c030ecc2e252149bcf9d) ) + ROM_LOAD( "3.ic60", 0x00000, 0x10000, CRC(77d6a608) SHA1(a31ff343a5d4d6f20301c030ecc2e252149bcf9d) ) ROM_REGION( 0x20000, "gfx2", 0 ) - ROM_LOAD( "2.ic120", 0x00000, 0x20000, CRC(bedf7b98) SHA1(cb6c5fcaf8df5f5c7636c3c8f79b9dda78e30c2e) ) + ROM_LOAD( "2.ic120", 0x00000, 0x20000, CRC(bedf7b98) SHA1(cb6c5fcaf8df5f5c7636c3c8f79b9dda78e30c2e) ) ROM_REGION( 0x08000, "d7756", ROMREGION_ERASE00 ) - ROM_LOAD( "d7756c.ic98", 0x00000, 0x08000, NO_DUMP ) + ROM_LOAD( "d7756c_146.ic98", 0x00000, 0x08000, NO_DUMP ) // unused? ROM_END diff --git a/src/mame/drivers/mattelchess.cpp b/src/mame/drivers/mattelchess.cpp index 6447f6458bf..8d756b89d8f 100644 --- a/src/mame/drivers/mattelchess.cpp +++ b/src/mame/drivers/mattelchess.cpp @@ -225,7 +225,7 @@ ROM_START( mchess ) ROM_LOAD("ins8050-6hwu_n", 0x0000, 0x1000, CRC(de272323) SHA1(9ba323b614504e20b25c86d290c0667f0bbf6c6b) ) ROM_REGION( 796406, "screen", 0) - ROM_LOAD( "mchess.svg", 0, 796406, CRC(795d66e0) SHA1(5f786c00bf33793bfba7065d8e9ec476e02e5c46) ) + ROM_LOAD("mchess.svg", 0, 796406, CRC(795d66e0) SHA1(5f786c00bf33793bfba7065d8e9ec476e02e5c46) ) ROM_END } // anonymous namespace diff --git a/src/mame/drivers/microvsn.cpp b/src/mame/drivers/microvsn.cpp index 8dfd3f78a5c..5354850cce6 100644 --- a/src/mame/drivers/microvsn.cpp +++ b/src/mame/drivers/microvsn.cpp @@ -413,14 +413,14 @@ static INPUT_PORTS_START( microvision ) PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_START("CONF") - PORT_CONFNAME( 0x01, 0x01, "Overlay" ) PORT_CHANGED_MEMBER(DEVICE_SELF, microvision_state, conf_changed, 0) - PORT_CONFSETTING( 0x00, DEF_STR( None ) ) + PORT_CONFNAME( 0x01, 0x01, "Restrict Buttons" ) PORT_CHANGED_MEMBER(DEVICE_SELF, microvision_state, conf_changed, 0) + PORT_CONFSETTING( 0x00, DEF_STR( No ) ) PORT_CONFSETTING( 0x01, "Auto" ) PORT_CONFNAME( 0x06, 0x04, "Paddle Hardware" ) PORT_CHANGED_MEMBER(DEVICE_SELF, microvision_state, conf_changed, 0) PORT_CONFSETTING( 0x00, DEF_STR( No ) ) // no circuitry on cartridge PCB PORT_CONFSETTING( 0x02, DEF_STR( Yes ) ) PORT_CONFSETTING( 0x04, "Auto" ) - PORT_CONFNAME( 0x18, 0x10, "TMS1100 PLA" ) PORT_CHANGED_MEMBER(DEVICE_SELF, microvision_state, conf_changed, 0) + PORT_CONFNAME( 0x18, 0x10, "TMS1100 PLA Type" ) PORT_CHANGED_MEMBER(DEVICE_SELF, microvision_state, conf_changed, 0) PORT_CONFSETTING( 0x00, "0" ) PORT_CONFSETTING( 0x08, "1" ) PORT_CONFSETTING( 0x10, "Auto" ) diff --git a/src/mame/drivers/novag_savant.cpp b/src/mame/drivers/novag_savant.cpp index 031ac4736ae..31dec9858b2 100644 --- a/src/mame/drivers/novag_savant.cpp +++ b/src/mame/drivers/novag_savant.cpp @@ -365,7 +365,7 @@ void savant_state::savant(machine_config &config) m_mcu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge)); F38T56(config, m_psu, 4_MHz_XTAL/2); - m_psu->set_int_vector(0x20); + m_psu->set_int_vector(0x0020); m_psu->int_req_callback().set_inputline(m_mcu, F8_INPUT_LINE_INT_REQ); m_psu->write_a().set(FUNC(savant_state::lcd_w)); m_psu->read_b().set(FUNC(savant_state::input_r)); diff --git a/src/mame/drivers/saitek_chesstrv.cpp b/src/mame/drivers/saitek_chesstrv.cpp index 6b19631c02c..f008c21171a 100644 --- a/src/mame/drivers/saitek_chesstrv.cpp +++ b/src/mame/drivers/saitek_chesstrv.cpp @@ -191,11 +191,11 @@ INPUT_PORTS_END void chesstrv_state::chesstrv(machine_config &config) { /* basic machine hardware */ - F8(config, m_maincpu, 3000000/2); // Fairchild 3870, measured ~3MHz + F8(config, m_maincpu, 4500000/2); // approximation m_maincpu->set_addrmap(AS_PROGRAM, &chesstrv_state::chesstrv_mem); m_maincpu->set_addrmap(AS_IO, &chesstrv_state::chesstrv_io); - f38t56_device &psu(F38T56(config, "psu", 3000000/2)); + f38t56_device &psu(F38T56(config, "psu", 4500000/2)); psu.read_a().set(FUNC(chesstrv_state::ram_data_r)); psu.write_a().set(FUNC(chesstrv_state::ram_data_w)); psu.read_b().set(FUNC(chesstrv_state::input_r)); @@ -219,7 +219,7 @@ void chesstrv_state::chesstrv(machine_config &config) ROM_START( chesstrv ) ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD("3870-sl90387", 0x0000, 0x0800, CRC(b76214d8) SHA1(7760903a64d9c513eb54c4787f535dabec62eb64) ) + ROM_LOAD("sl90387", 0x0000, 0x0800, CRC(b76214d8) SHA1(7760903a64d9c513eb54c4787f535dabec62eb64) ) ROM_END } // anonymous namespace diff --git a/src/mame/drivers/saitek_cp2000.cpp b/src/mame/drivers/saitek_cp2000.cpp index 8d63aaabcfc..4a848139cf0 100644 --- a/src/mame/drivers/saitek_cp2000.cpp +++ b/src/mame/drivers/saitek_cp2000.cpp @@ -220,12 +220,12 @@ INPUT_PORTS_END void cp2000_state::cp2000(machine_config &config) { /* basic machine hardware */ - F8(config, m_maincpu, 2800000); // see driver notes + F8(config, m_maincpu, 2750000); // see driver notes m_maincpu->set_addrmap(AS_PROGRAM, &cp2000_state::main_map); m_maincpu->set_addrmap(AS_IO, &cp2000_state::main_io); m_maincpu->set_irq_acknowledge_callback("f3853", FUNC(f3853_device::int_acknowledge)); - f3853_device &f3853(F3853(config, "f3853", 2800000)); + f3853_device &f3853(F3853(config, "f3853", 2750000)); f3853.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); diff --git a/src/mame/drivers/saitek_exchess.cpp b/src/mame/drivers/saitek_exchess.cpp new file mode 100644 index 00000000000..9d82ae727f4 --- /dev/null +++ b/src/mame/drivers/saitek_exchess.cpp @@ -0,0 +1,243 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/****************************************************************************** + +SciSys Executive Chess, handheld chesscomputer. +Also known as Senator Chess in Germany. + +Hardware notes: +- Fairchild 3870 MCU (variant with 4KB internal ROM) +- 1KB RAM (2*TC5514P) +- HLCD0538, HLCD0539, LCD screen + +TODO: +- SVG screen + +******************************************************************************/ + +#include "emu.h" +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "video/hlcd0538.h" +#include "video/pwm.h" + +// internal artwork +//#include "saitek_exchess.lh" // clickable + + +namespace { + +class exchess_state : public driver_device +{ +public: + exchess_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_lcd1(*this, "lcd1"), + m_lcd2(*this, "lcd2"), + m_display(*this, "display"), + m_inputs(*this, "IN.%u", 0) + { } + + void exchess(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_lcd1; + required_device m_lcd2; + required_device m_display; + required_ioport_array<3> m_inputs; + + void main_map(address_map &map); + void main_io(address_map &map); + + template void lcd_output_w(u64 data); + void lcd_data_w(u8 data); + + u16 ram_address() { return (m_ram_address[1] << 8 | m_ram_address[0]) & 0x3ff; } + template u8 ram_address_r(); + template void ram_address_w(u8 data); + u8 ram_data_r(); + void ram_data_w(u8 data); + + std::unique_ptr m_ram; + u8 m_ram_address[2] = { 0, 0 }; + u64 m_lcd_data[2] = { 0, 0 }; +}; + +void exchess_state::machine_start() +{ + m_ram = make_unique_clear(0x400); + + // register for savestates + save_pointer(NAME(m_ram), 0x400); + save_item(NAME(m_ram_address)); + save_item(NAME(m_lcd_data)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +// LCD + +template +void exchess_state::lcd_output_w(u64 data) +{ + m_lcd_data[N] = data; + m_display->matrix(m_lcd_data[0] & 0xff, m_lcd_data[1] << 26 | m_lcd_data[0] >> 8); +} + +void exchess_state::lcd_data_w(u8 data) +{ + // P40: HLCD0539 data + // P44: HLCD0538 data + m_lcd1->data_w(BIT(data, 4)); + m_lcd2->data_w(BIT(data, 0)); + + if (~m_ram_address[1] & 4) + { + m_lcd1->clk_w(1); m_lcd1->clk_w(0); + m_lcd2->clk_w(1); m_lcd2->clk_w(0); + } +} + + +// 1KB RAM (port-mapped) + +template +void exchess_state::ram_address_w(u8 data) +{ + // P00-P17: RAM A0-A7 + // P10-P11: RAM A8-A9 + // P12: RAM CE + m_ram_address[N] = data; +} + +template +u8 exchess_state::ram_address_r() +{ + u8 data = m_ram_address[N]; + + // P13: Enter button + return (N) ? data | m_inputs[0]->read() : data; +} + +void exchess_state::ram_data_w(u8 data) +{ + if (m_ram_address[1] & 4) + m_ram[ram_address()] = data; +} + +u8 exchess_state::ram_data_r() +{ + return (m_ram_address[1] & 4) ? m_ram[ram_address()] : 0; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void exchess_state::main_map(address_map &map) +{ + map.global_mask(0xfff); + map(0x0000, 0x0fff).rom(); +} + +void exchess_state::main_io(address_map &map) +{ + map(0x00, 0x00).rw(FUNC(exchess_state::ram_address_r<0>), FUNC(exchess_state::ram_address_w<0>)); + map(0x01, 0x01).rw(FUNC(exchess_state::ram_address_r<1>), FUNC(exchess_state::ram_address_w<1>)); + map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( exchess ) + PORT_START("IN.0") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) + PORT_BIT(0xf7, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.1") + 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) + + PORT_START("IN.2") + PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void exchess_state::exchess(machine_config &config) +{ + /* basic machine hardware */ + F8(config, m_maincpu, 4500000/2); // measured + m_maincpu->set_addrmap(AS_PROGRAM, &exchess_state::main_map); + m_maincpu->set_addrmap(AS_IO, &exchess_state::main_io); + m_maincpu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge)); + + f38t56_device &psu(F38T56(config, "psu", 4500000/2)); + psu.set_int_vector(0x0020); + psu.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); + psu.read_a().set(FUNC(exchess_state::ram_data_r)); + psu.write_a().set(FUNC(exchess_state::ram_data_w)); + psu.write_a().append(FUNC(exchess_state::lcd_data_w)); + psu.read_b().set_ioport("IN.1"); + + /* video hardware */ + HLCD0538(config, m_lcd1, 310); // measured + m_lcd1->write_cols().set(FUNC(exchess_state::lcd_output_w<0>)); + m_lcd1->write_interrupt().set(m_lcd2, FUNC(hlcd0539_device::lcd_w)); + + HLCD0539(config, m_lcd2, 0); + m_lcd2->write_cols().set(FUNC(exchess_state::lcd_output_w<1>)); + m_lcd2->write_interrupt().set("psu", FUNC(f38t56_device::ext_int_w)).invert(); + + PWM_DISPLAY(config, m_display).set_size(8, 26+34); + //config.set_default_layout(layout_saitek_exchess); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( exchess ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD("sl90553", 0x0000, 0x1000, CRC(a61b0c7e) SHA1(a13b11a93f78236223c5c0b9879a93284b7f7525) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1981, exchess, 0, 0, exchess, exchess, exchess_state, empty_init, "SciSys", "Executive Chess", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/layout/microvision.lay b/src/mame/layout/microvision.lay index 9cea8157b5d..4e88c9e4e6f 100644 --- a/src/mame/layout/microvision.lay +++ b/src/mame/layout/microvision.lay @@ -11,10 +11,10 @@ license:CC0 - + - + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 3aa7d82cf24..48f09955601 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -35120,6 +35120,9 @@ cp2000 // @source:saitek_delta1.cpp ccdelta1 // +@source:saitek_exchess.cpp +exchess + @source:saitek_mark5.cpp ccmk5 ccmk6 diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 0c93eb5e7a8..acfac894c28 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -791,6 +791,7 @@ saitek_chesstrv.cpp saitek_corona.cpp saitek_cp2000.cpp saitek_delta1.cpp +saitek_exchess.cpp saitek_mark5.cpp saitek_prschess.cpp saitek_risc2500.cpp