diff options
author | hap <happppp@users.noreply.github.com> | 2019-05-06 17:01:09 +0200 |
---|---|---|
committer | hap <happppp@users.noreply.github.com> | 2019-05-06 17:01:29 +0200 |
commit | c1268bf76c464250d85c04396c702e50744c73f4 (patch) | |
tree | 47ff0a38b749e5dc97a0456630f26c349757a06b | |
parent | 03839b914ac4c7e29c248bed5d6fb7588813e502 (diff) |
New not working machine added
----------
Computer Chess (Mattel) [hap, Sean Riddle]
-rw-r--r-- | scripts/target/mame/mess.lua | 1 | ||||
-rw-r--r-- | src/devices/video/hlcd0515.cpp | 14 | ||||
-rw-r--r-- | src/devices/video/hlcd0515.h | 13 | ||||
-rw-r--r-- | src/mame/drivers/mattelchess.cpp | 219 | ||||
-rw-r--r-- | src/mame/drivers/scisys_cp2000.cpp | 2 | ||||
-rw-r--r-- | src/mame/mame.lst | 9 | ||||
-rw-r--r-- | src/mame/mess.flt | 1 |
7 files changed, 250 insertions, 9 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index ce764e3673f..a6c4b24d22f 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2512,6 +2512,7 @@ files { MAME_DIR .. "src/mame/video/aquarius.cpp", MAME_DIR .. "src/mame/drivers/juicebox.cpp", MAME_DIR .. "src/mame/drivers/hyperscan.cpp", + MAME_DIR .. "src/mame/drivers/mattelchess.cpp", } createMESSProjects(_target, _subtarget, "matsushi") diff --git a/src/devices/video/hlcd0515.cpp b/src/devices/video/hlcd0515.cpp index 87abf50bc0e..92d0bfb26be 100644 --- a/src/devices/video/hlcd0515.cpp +++ b/src/devices/video/hlcd0515.cpp @@ -5,12 +5,12 @@ Hughes HLCD 0515 family LCD Driver 0515: 25 columns(also size of buffer/ram) - 0569: 24 columns, no DATA OUT pin, display blank has no effect + 0569: 24 columns, display blank has no effect(instead it's external with VDRIVE?) 0530: specifications unknown, pinout seems similar to 0569 + 0601: specifications unknown, pinout seems similar to 0569 TODO: - read mode is untested - - MAME bitmap update callback when needed */ @@ -21,6 +21,7 @@ DEFINE_DEVICE_TYPE(HLCD0515, hlcd0515_device, "hlcd0515", "Hughes HLCD 0515 LCD Driver") DEFINE_DEVICE_TYPE(HLCD0569, hlcd0569_device, "hlcd0569", "Hughes HLCD 0569 LCD Driver") DEFINE_DEVICE_TYPE(HLCD0530, hlcd0530_device, "hlcd0530", "Hughes HLCD 0530 LCD Driver") +DEFINE_DEVICE_TYPE(HLCD0601, hlcd0601_device, "hlcd0601", "Hughes HLCD 0601 LCD Driver") //------------------------------------------------- // constructor @@ -44,6 +45,10 @@ hlcd0530_device::hlcd0530_device(const machine_config &mconfig, const char *tag, hlcd0515_device(mconfig, HLCD0530, tag, owner, clock, 24) { } +hlcd0601_device::hlcd0601_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + hlcd0515_device(mconfig, HLCD0601, tag, owner, clock, 24) +{ } + //------------------------------------------------- @@ -64,6 +69,7 @@ void hlcd0515_device::device_start() m_cs = 0; m_clk = 0; m_data = 0; + m_dataout = 0; m_count = 0; m_control = 0; m_blank = false; @@ -77,6 +83,7 @@ void hlcd0515_device::device_start() save_item(NAME(m_cs)); save_item(NAME(m_clk)); save_item(NAME(m_data)); + save_item(NAME(m_dataout)); save_item(NAME(m_count)); save_item(NAME(m_control)); save_item(NAME(m_blank)); @@ -139,7 +146,8 @@ void hlcd0515_device::clock_data(int col) if (col < m_colmax) m_buffer <<= 1; - m_write_data(m_buffer >> m_colmax & 1); + m_dataout = m_buffer >> m_colmax & 1; + m_write_data(m_dataout); } else { diff --git a/src/devices/video/hlcd0515.h b/src/devices/video/hlcd0515.h index 1108890a1fb..af821eb8fcf 100644 --- a/src/devices/video/hlcd0515.h +++ b/src/devices/video/hlcd0515.h @@ -21,7 +21,7 @@ ROW3 4 | | 37 DATA IN ROW3 4 | | 37 CLOCK ROW4 5 | | 36 _CS ROW4 5 | | 36 DATA IN ROW5 6 | | 35 DATA OUT ROW5 6 | | 35 _CS - ROW6 7 | | 34 COL25 ROW6 7 | | 34 OSC OUT? + ROW6 7 | | 34 COL25 ROW6 7 | | 34 DATA OUT? ROW7 8 | | 33 COL24 ROW7 8 | | 33 COL24 COL1 9 | | 32 COL23 COL1 9 | | 32 COL23 COL2 10 | HLCD 0515 | 31 COL22 COL2 10 | HLCD 0569 | 31 COL22 @@ -48,11 +48,12 @@ public: // configuration helpers auto write_cols() { return m_write_cols.bind(); } // COL/ROW pins (offset for ROW) - auto write_data() { return m_write_data.bind(); } // DATA OUT pin, don't use on HLCD0569 + auto write_data() { return m_write_data.bind(); } // DATA OUT pin DECLARE_WRITE_LINE_MEMBER(clock_w); DECLARE_WRITE_LINE_MEMBER(cs_w); DECLARE_WRITE_LINE_MEMBER(data_w) { m_data = (state) ? 1 : 0; } + DECLARE_READ_LINE_MEMBER(data_r) { return m_dataout; } protected: hlcd0515_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 colmax); @@ -69,6 +70,7 @@ protected: int m_cs; // input pin state int m_clk; // " int m_data; // " + int m_dataout; // DATA OUT pin state int m_count; u8 m_control; bool m_blank; // display blank/visible @@ -101,9 +103,16 @@ public: hlcd0530_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; +class hlcd0601_device : public hlcd0515_device +{ +public: + hlcd0601_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + DECLARE_DEVICE_TYPE(HLCD0515, hlcd0515_device) DECLARE_DEVICE_TYPE(HLCD0569, hlcd0569_device) DECLARE_DEVICE_TYPE(HLCD0530, hlcd0530_device) +DECLARE_DEVICE_TYPE(HLCD0601, hlcd0601_device) #endif // MAME_VIDEO_HLCD0515_H diff --git a/src/mame/drivers/mattelchess.cpp b/src/mame/drivers/mattelchess.cpp new file mode 100644 index 00000000000..6abe760f962 --- /dev/null +++ b/src/mame/drivers/mattelchess.cpp @@ -0,0 +1,219 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/****************************************************************************** + +Mattel Computer Chess + +Hardware notes: +- INS8050 CPU @ 6MHz (4KB internal ROM, 256 bytes internal RAM) +- 2*HLCD0569(also seen with 2*HLCD0601, functionally same?) +- custom LCD screen with chess squares background + +TODO: +- It goes bonkers at computer's turn, it reads from LCD RAM and seems it doesn't + get the data it expects +- add SAVE switch +- internal artwork + +******************************************************************************/ + +#include "emu.h" +#include "cpu/mcs48/mcs48.h" +#include "video/hlcd0515.h" +#include "screen.h" + + +namespace { + +class mchess_state : public driver_device +{ +public: + mchess_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_lcd(*this, "lcd%u", 0), + m_inputs(*this, "IN.%u", 0), + m_out_x(*this, "%u.%u.%u", 0U, 0U, 0U) + { } + + void mchess(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device<mcs48_cpu_device> m_maincpu; + required_device_array<hlcd0569_device, 2> m_lcd; + required_ioport_array<3> m_inputs; + output_finder<2, 8, 22> m_out_x; + + u8 m_inp_mux; + u8 m_lcd_control; + + // I/O handlers + template<int Sel> DECLARE_WRITE32_MEMBER(lcd_output_w); + DECLARE_WRITE8_MEMBER(input_w); + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(lcd_w); + DECLARE_READ8_MEMBER(lcd_r); +}; + +void mchess_state::machine_start() +{ + // resolve handlers + m_out_x.resolve(); + + // zerofill + m_inp_mux = 0; + m_lcd_control = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_lcd_control)); +} + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +template<int Sel> +WRITE32_MEMBER(mchess_state::lcd_output_w) +{ + // output to x.y.z where x = chip, y = row, z = col + // up to 22 columns used + for (int i = 0; i < 22; i++) + m_out_x[Sel][offset][i] = BIT(data, i); +} + +WRITE8_MEMBER(mchess_state::input_w) +{ + // d0,d5,d6: input mux + m_inp_mux = (~data >> 4 & 6) | (~data & 1); +} + +READ8_MEMBER(mchess_state::input_r) +{ + u8 data = 0; + + // d1-d4,d7: multiplexed inputs + for (int i = 0; i < 3; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data; +} + +WRITE8_MEMBER(mchess_state::lcd_w) +{ + // d0: both LCDC VDRIVE + // d1: N/C + + // d3: 1st LCDC _CS + // d6: 2nd LCDC _CS + m_lcd[0]->cs_w(BIT(data, 3)); + m_lcd[1]->cs_w(BIT(data, 6)); + + // d4: both LCDC CLOCK + // d5: both LCDC DATA IN + for (int i = 0; i < 2; i++) + { + m_lcd[i]->clock_w(BIT(data, 4)); + m_lcd[i]->data_w(BIT(data, 5)); + } + + m_lcd_control = data; +} + +READ8_MEMBER(mchess_state::lcd_r) +{ + // d2: 1st LCDC DATA OUT + // d7: 2nd LCDC DATA OUT + u8 r0 = m_lcd[0]->data_r(); + u8 r1 = m_lcd[1]->data_r(); + return (0x84^0xff) | r0 << 2 | r1 << 7; +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( mchess ) + PORT_START("IN.0") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Player vs. Player") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Machine vs. Machine") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Player vs. Machine") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.1") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Move") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") + + PORT_START("IN.2") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter Move") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Enter Position") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Color") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Take Back") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void mchess_state::mchess(machine_config &config) +{ + /* basic machine hardware */ + I8050(config, m_maincpu, 6_MHz_XTAL); + m_maincpu->p1_out_cb().set(FUNC(mchess_state::input_w)); + m_maincpu->p1_in_cb().set(FUNC(mchess_state::input_r)); + m_maincpu->p2_out_cb().set(FUNC(mchess_state::lcd_w)); + m_maincpu->p2_in_cb().set(FUNC(mchess_state::lcd_r)); + + /* video hardware */ + HLCD0569(config, m_lcd[0], 500); // C=0.01uF + m_lcd[0]->write_cols().set(FUNC(mchess_state::lcd_output_w<0>)); + HLCD0569(config, m_lcd[1], 500); // C=0.01uF + m_lcd[1]->write_cols().set(FUNC(mchess_state::lcd_output_w<1>)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_svg_region("svg"); + screen.set_refresh_hz(50); + screen.set_size(977, 1080); + screen.set_visarea_full(); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( mchess ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD("ins8050-6hwu_n", 0x0000, 0x1000, CRC(de272323) SHA1(9ba323b614504e20b25c86d290c0667f0bbf6c6b) ) + + ROM_REGION( 796334, "svg", 0) + ROM_LOAD( "mchess.svg", 0, 796334, CRC(88792457) SHA1(cc8b654829532a8cbb7447176436c113ac584bba) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, mchess, 0, 0, mchess, mchess, mchess_state, empty_init, "Mattel", "Computer Chess (Mattel)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/scisys_cp2000.cpp b/src/mame/drivers/scisys_cp2000.cpp index f104aeb3257..421e004bc4f 100644 --- a/src/mame/drivers/scisys_cp2000.cpp +++ b/src/mame/drivers/scisys_cp2000.cpp @@ -212,4 +212,4 @@ ROM_END ******************************************************************************/ // YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1980, cp2000, 0, 0, cp2000, cp2000, cp2000_state, empty_init, "SciSys", "Chess Partner 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, cp2000, 0, 0, cp2000, cp2000, cp2000_state, empty_init, "SciSys", "Chess Partner 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 491115ae28a..f43cabbb420 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -18618,9 +18618,6 @@ spelunkrj // (c) 1985 licensed from Broderbund yanchamr // (c) 1986 (Japan) youjyudn // (c) 1986 (Japan) -@source:spartanxtec.cpp -spartanxtec - @source:m63.cpp atomboy // M63 (c) 1985 Irem + Memetron license atomboya // M63 (c) 1985 Irem + Memetron license @@ -18970,6 +18967,9 @@ maniach // TA-0017 (c) 1986 + Taito America license maniach2 // TA-0017 (c) 1986 + Taito America license matmania // TA-0015 (c) 1985 + Taito America license +@source:mattelchess.cpp +mchess + @source:maxaflex.cpp maxaflex // mf_achas // (c) 1982 Exidy / First Star Software @@ -35909,6 +35909,9 @@ starwarr // Potomac Mortgage @source:spaceg.cpp spaceg // (c) 19?? +@source:spartanxtec.cpp +spartanxtec + @source:spbactn.cpp spbactn // 9002 - (c) 1991 Tecmo spbactnj // 9002 - (c) 1991 Tecmo diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 00221331e52..adbdb970acd 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -427,6 +427,7 @@ mac.cpp mac128.cpp macpci.cpp magnum.cpp +mattelchess.cpp mbc200.cpp mbc55x.cpp mbee.cpp |