diff options
author | 2019-06-27 01:37:40 +0200 | |
---|---|---|
committer | 2019-06-27 01:37:55 +0200 | |
commit | 60924e122283d734f63519196f6bb743de28caad (patch) | |
tree | ec74b0fd46063b8cb7f52e3d2d6bedd4ddde0817 /src | |
parent | ffe04a3f0801b3a90db471e79cb1f2ed8413bcfa (diff) |
New not working machine added
-------------
Savant [hap, Berger, Sean Riddle]
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/machine/f3853.cpp | 18 | ||||
-rw-r--r-- | src/devices/machine/f3853.h | 1 | ||||
-rw-r--r-- | src/devices/machine/sensorboard.cpp | 50 | ||||
-rw-r--r-- | src/devices/machine/sensorboard.h | 10 | ||||
-rw-r--r-- | src/devices/video/hlcd0538.h | 2 | ||||
-rw-r--r-- | src/mame/drivers/microterm_f8.cpp | 2 | ||||
-rw-r--r-- | src/mame/drivers/novag_savant.cpp | 409 | ||||
-rw-r--r-- | src/mame/drivers/vidbrain.cpp | 4 | ||||
-rw-r--r-- | src/mame/layout/mchess.lay | 25 | ||||
-rw-r--r-- | src/mame/mame.lst | 3 | ||||
-rw-r--r-- | src/mame/mess.flt | 1 |
11 files changed, 475 insertions, 50 deletions
diff --git a/src/devices/machine/f3853.cpp b/src/devices/machine/f3853.cpp index 29be4c38823..7a23f5a04d0 100644 --- a/src/devices/machine/f3853.cpp +++ b/src/devices/machine/f3853.cpp @@ -50,7 +50,7 @@ f3853_device::f3853_device(const machine_config &mconfig, device_type type, cons m_int_vector(0), m_prescaler(31), m_priority_line(false), - m_external_interrupt_line(true) + m_external_interrupt_line(false) { } f3853_device::f3853_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : @@ -210,7 +210,7 @@ TIMER_CALLBACK_MEMBER(f3853_device::timer_callback) WRITE_LINE_MEMBER(f3853_device::ext_int_w) { - if (m_external_interrupt_line && !state && m_external_int_enable) + if (!m_external_interrupt_line && state && m_external_int_enable) { m_request_flipflop = true; } @@ -387,6 +387,20 @@ WRITE8_MEMBER(f3856_device::write) // f38t56_device-specific handlers //------------------------------------------------- +READ8_MEMBER(f38t56_device::read) +{ + switch (offset & 3) + { + // interrupt: sense ext int pin + case 2: + return (m_external_interrupt_line) ? 0 : 0x80; + + // other: same as 3856 + default: + return f3856_device::read(space, offset); + } +} + WRITE8_MEMBER(f38t56_device::write) { switch (offset & 3) diff --git a/src/devices/machine/f3853.h b/src/devices/machine/f3853.h index 762f46950fb..48d0543dfec 100644 --- a/src/devices/machine/f3853.h +++ b/src/devices/machine/f3853.h @@ -169,6 +169,7 @@ class f38t56_device : public f3856_device public: f38t56_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual DECLARE_READ8_MEMBER(read) override; virtual DECLARE_WRITE8_MEMBER(write) override; }; diff --git a/src/devices/machine/sensorboard.cpp b/src/devices/machine/sensorboard.cpp index 784041f957b..b2106665aaf 100644 --- a/src/devices/machine/sensorboard.cpp +++ b/src/devices/machine/sensorboard.cpp @@ -51,7 +51,6 @@ sensorboard_device::sensorboard_device(const machine_config &mconfig, const char m_custom_spawn_cb(*this), m_custom_output_cb(*this) { - memset(m_inistate, 0, ARRAY_LENGTH(m_inistate)); m_magnets = false; m_inductive = false; m_ui_enabled = 3; @@ -71,7 +70,7 @@ sensorboard_device::sensorboard_device(const machine_config &mconfig, const char void sensorboard_device::device_start() { // resolve handlers - m_custom_init_cb.resolve_safe(0); + m_custom_init_cb.resolve_safe(); m_custom_sensor_cb.resolve_safe(0); m_custom_spawn_cb.resolve(); m_custom_output_cb.resolve(); @@ -83,9 +82,8 @@ void sensorboard_device::device_start() m_out_count.resolve(); } - // custom init (meant for setting m_inistate) - m_custom_init_cb(); - memcpy(m_curstate, m_inistate, m_height * m_width); + clear_board(); + m_custom_init_cb(1); memcpy(m_history[0], m_curstate, m_height * m_width); for (int i = 0; i < m_maxspawn; i++) @@ -128,7 +126,6 @@ void sensorboard_device::device_start() save_item(NAME(m_ui_enabled)); save_item(NAME(m_curstate)); - save_item(NAME(m_inistate)); save_item(NAME(m_history)); save_item(NAME(m_uselect)); @@ -139,7 +136,7 @@ void sensorboard_device::device_start() save_item(NAME(m_sensordelay)); } -int sensorboard_device::preset_chess() +void sensorboard_device::preset_chess(int state) { // set chessboard start position @@ -150,24 +147,22 @@ int sensorboard_device::preset_chess() // 5 = white queen 11 = black queen // 6 = white king 12 = black king - write_init(0, 0, 4); - write_init(7, 0, 4); - write_init(1, 0, 2); - write_init(6, 0, 2); - write_init(2, 0, 3); - write_init(5, 0, 3); - write_init(3, 0, 5); - write_init(4, 0, 6); + write_piece(0, 0, 4); + write_piece(7, 0, 4); + write_piece(1, 0, 2); + write_piece(6, 0, 2); + write_piece(2, 0, 3); + write_piece(5, 0, 3); + write_piece(3, 0, 5); + write_piece(4, 0, 6); for (int x = 0; x < 8; x++) { - write_init(x, 1, 1); - write_init(x, 6, 7); - write_init(x, 7, read_init(x, 0) + 6); + write_piece(x, 1, 1); + write_piece(x, 6, 7); + write_piece(x, 7, read_piece(x, 0) + 6); } - return 1; - // note that for inductive boards, 2 additional callbacks are needed: // additional init_cb() for reassigning the piece ids for initial board state // spawn_cb() for checking if a piece is available and reassigning the piece id @@ -177,6 +172,9 @@ void sensorboard_device::device_reset() { cancel_sensor(); cancel_hand(); + + clear_board(); + m_custom_init_cb(0); refresh(); } @@ -416,7 +414,7 @@ INPUT_CHANGED_MEMBER(sensorboard_device::ui_spawn) return; u8 pos = (u8)(uintptr_t)param; - if (pos >= m_maxspawn) + if (pos > m_maxspawn) return; cancel_sensor(); @@ -506,16 +504,14 @@ INPUT_CHANGED_MEMBER(sensorboard_device::ui_init) if (!newval) return; - u8 select = (u8)(uintptr_t)param; + u8 init = (u8)(uintptr_t)param; cancel_sensor(); cancel_hand(); - // clear board - memset(m_curstate, 0, m_height * m_width); + clear_board(); - // reset to initial position - if (select) - memcpy(m_curstate, m_inistate, m_height * m_width); + if (init) + m_custom_init_cb(0); refresh(); } diff --git a/src/devices/machine/sensorboard.h b/src/devices/machine/sensorboard.h index c710d1cdfeb..77f43bfd26c 100644 --- a/src/devices/machine/sensorboard.h +++ b/src/devices/machine/sensorboard.h @@ -32,12 +32,12 @@ public: sensorboard_device &set_ui_enable(bool b) { if (!b) m_maxspawn = 0; m_ui_enabled = (b) ? 3 : 0; return *this; } // enable UI inputs sensorboard_device &set_mod_enable(bool b) { if (b) m_ui_enabled |= 1; else m_ui_enabled &= 2; return *this; } // enable modifier keys - auto init_cb() { return m_custom_init_cb.bind(); } + auto init_cb() { return m_custom_init_cb.bind(); } // for setting pieces starting position auto sensor_cb() { return m_custom_sensor_cb.bind(); } // x = offset & 0xf, y = offset >> 4 & 0xf auto spawn_cb() { return m_custom_spawn_cb.bind(); } // spawnpoint/piece = offset, retval = new piece id auto output_cb() { return m_custom_output_cb.bind(); } // pos = offset(A8 for ui/board, A9 for count), id = data - int preset_chess(); // init_cb() preset for chessboards + void preset_chess(int state); // init_cb() preset for chessboards // read sensors u8 read_sensor(u8 x, u8 y); @@ -47,8 +47,7 @@ public: // handle board state u8 read_piece(u8 x, u8 y) { return m_curstate[y * m_width + x]; } void write_piece(u8 x, u8 y, u8 id) { m_curstate[y * m_width + x] = id; } - u8 read_init(u8 x, u8 y) { return m_inistate[y * m_width + x]; } - void write_init(u8 x, u8 y, u8 id) { m_inistate[y * m_width + x] = id; } // for setting initial board state + void clear_board() { memset(m_curstate, 0, ARRAY_LENGTH(m_curstate)); } void refresh(); @@ -85,7 +84,7 @@ private: required_ioport_array<10> m_inp_rank; required_ioport m_inp_ui; - devcb_read_line m_custom_init_cb; + devcb_write_line m_custom_init_cb; devcb_read8 m_custom_sensor_cb; devcb_read8 m_custom_spawn_cb; devcb_write16 m_custom_output_cb; @@ -105,7 +104,6 @@ private: u8 m_ui_enabled; u8 m_curstate[0x100]; - u8 m_inistate[0x100]; u8 m_history[1000][0x100]; u8 m_uselect; diff --git a/src/devices/video/hlcd0538.h b/src/devices/video/hlcd0538.h index bc1a78d16fc..694abe3648c 100644 --- a/src/devices/video/hlcd0538.h +++ b/src/devices/video/hlcd0538.h @@ -73,7 +73,7 @@ protected: class hlcd0539_device : public hlcd0538_device { public: - hlcd0539_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + hlcd0539_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); }; diff --git a/src/mame/drivers/microterm_f8.cpp b/src/mame/drivers/microterm_f8.cpp index 878b9c96c81..6591e7b3dc5 100644 --- a/src/mame/drivers/microterm_f8.cpp +++ b/src/mame/drivers/microterm_f8.cpp @@ -535,7 +535,7 @@ void microterm_f8_state::act5a(machine_config &config) AY51013(config, m_uart); m_uart->read_si_callback().set(m_io, FUNC(rs232_port_device::rxd_r)); m_uart->write_so_callback().set("txd", FUNC(input_merger_device::in_w<0>)); - m_uart->write_dav_callback().set("smi", FUNC(f3853_device::ext_int_w)).invert(); + m_uart->write_dav_callback().set("smi", FUNC(f3853_device::ext_int_w)); m_uart->set_auto_rdav(true); RS232_PORT(config, m_io, default_rs232_devices, nullptr); diff --git a/src/mame/drivers/novag_savant.cpp b/src/mame/drivers/novag_savant.cpp new file mode 100644 index 00000000000..2d32017bc6d --- /dev/null +++ b/src/mame/drivers/novag_savant.cpp @@ -0,0 +1,409 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/****************************************************************************** + +Novag Savant, chess computer with touchscreen. It was followed by Savant II and +Savant Royale on similar hardware. The chess engine is MyChess by David Kittinger. + +Hardware overview: +- Zilog Z80B @ 6MHz +- 24KB ROM(3*TMM2364) + sockets for expansion (populated in Savant II) +- 4KB RAM(8*MM2114N-2L), 256x4 battery-backed RAM(MWS5101) +- Fairchild 3870 @ 4MHz (2KB internal ROM) +- HLCD0538, HLCD0539, LCD screen with 8*8 touch-sensitive overlay +- external ports for optional chess clock and printer + +The display (both the LCD and the sensors) didn't last long, probably none exist +anymore in original working order. + +TODO: +- doesn't work, Z80 side stops communicating and gets in an infinite loop +- hook up inputs +- internal artwork + +******************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "video/hlcd0538.h" +#include "video/pwm.h" +#include "machine/sensorboard.h" +#include "machine/nvram.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" +#include "screen.h" +#include "speaker.h" + +// internal artwork +//#include "novag_savant.lh" // clickable + + +namespace { + +class savant_state : public driver_device +{ +public: + savant_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_mcu(*this, "mcu"), + m_psu(*this, "psu"), + m_lcd1(*this, "lcd1"), + m_lcd2(*this, "lcd2"), + m_display(*this, "display"), + m_board(*this, "board"), + m_dac(*this, "dac"), + m_nvram(*this, "nvram"), + m_inputs(*this, "IN.%u", 0) + { } + + // machine drivers + void savant(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device<cpu_device> m_maincpu; + required_device<cpu_device> m_mcu; + required_device<f38t56_device> m_psu; + required_device<hlcd0538_device> m_lcd1; + required_device<hlcd0539_device> m_lcd2; + required_device<pwm_display_device> m_display; + required_device<sensorboard_device> m_board; + required_device<dac_bit_interface> m_dac; + required_shared_ptr<u8> m_nvram; + required_ioport_array<3> m_inputs; + + // address maps + void main_map(address_map &map); + void main_io(address_map &map); + void mcu_map(address_map &map); + void mcu_io(address_map &map); + + // I/O handlers + DECLARE_READ8_MEMBER(nvram_r); + DECLARE_READ8_MEMBER(stall_r); + DECLARE_WRITE8_MEMBER(stall_w); + DECLARE_READ8_MEMBER(mcustatus_r); + + DECLARE_WRITE64_MEMBER(lcd1_output_w); + DECLARE_WRITE64_MEMBER(lcd2_output_w); + + DECLARE_READ8_MEMBER(databus_r); + DECLARE_WRITE8_MEMBER(databus_w); + DECLARE_READ8_MEMBER(control_r); + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_WRITE8_MEMBER(lcd_w); + DECLARE_READ8_MEMBER(input_r); + + u8 m_inp_mux; + u8 m_databus; + u8 m_control; + u64 m_lcd_data; +}; + +void savant_state::machine_start() +{ + // zerofill + m_inp_mux = 0; + m_databus = 0; + m_control = 0; + m_lcd_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_databus)); + save_item(NAME(m_control)); + save_item(NAME(m_lcd_data)); +} + + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// Z80 side + +READ8_MEMBER(savant_state::nvram_r) +{ + // nvram is only d0-d3 + return m_nvram[offset] & 0xf; +} + +READ8_MEMBER(savant_state::stall_r) +{ + // TODO: seen in disasm + return 0; +} + +WRITE8_MEMBER(savant_state::stall_w) +{ + // any access to port C0 puts the Z80 into WAIT, sets BUSRQ, and sets MCU EXT INT + m_databus = data; + m_psu->ext_int_w(1); + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE); + m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, ASSERT_LINE); +} + +READ8_MEMBER(savant_state::mcustatus_r) +{ + // d0: MCU P1.2 + return BIT(~m_control, 2); +} + + +// 3870 side + +WRITE64_MEMBER(savant_state::lcd1_output_w) +{ + // uses C1-C24 + m_lcd_data = m_lcd_data << 24 | (data >> 8 & 0xffffff); + m_display->matrix(data & 0xff, m_lcd_data); +} + +WRITE64_MEMBER(savant_state::lcd2_output_w) +{ + // uses C6-C32 + m_lcd_data = data >> 5 & 0x7ffffff; +} + +READ8_MEMBER(savant_state::databus_r) +{ + return ~m_databus; +} + +WRITE8_MEMBER(savant_state::databus_w) +{ + m_databus = ~data; +} + +READ8_MEMBER(savant_state::control_r) +{ + return m_control; +} + +WRITE8_MEMBER(savant_state::control_w) +{ + // d0: clear EXT INT, clear Z80 WAIT + if (~data & m_control & 1) + { + m_psu->ext_int_w(0); + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); + } + + // d1: clear Z80 BUSRQ + if (~data & m_control & 2) + { + //m_maincpu->set_state_int(Z80_A, m_databus); + m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, CLEAR_LINE); + } + + // d2: return data for Z80 + + // d3: speaker out + m_dac->write(BIT(data, 3)); + + // d4: LCD pins + m_lcd2->lcd_w(BIT(~data, 4)); + m_lcd1->lcd_w(BIT(~data, 4)); + + // d5-d7: keypad mux + + m_control = data; +} + +WRITE8_MEMBER(savant_state::lcd_w) +{ + // d0: HLCD0538 data + // d4: HLCD0539 data + m_lcd1->data_w(BIT(~data, 0)); + m_lcd2->data_w(BIT(~data, 4)); + + // STROBE pin to LCD chips CLK + m_lcd1->clk_w(1); m_lcd1->clk_w(0); + m_lcd2->clk_w(1); m_lcd2->clk_w(0); + + // also touchscreen input mux + m_inp_mux = bitswap<8>(data,7,3,6,2,5,1,4,0); +} + +READ8_MEMBER(savant_state::input_r) +{ + u8 data = 0; + + // read touchscreen + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_rank(i); + + data = bitswap<8>(data,0,1,2,3,7,6,5,4); + + // read keypad + for (int i = 0; i < 3; i++) + if (BIT(m_control >> 5, i)) + data |= m_inputs[i]->read(); + + return data; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void savant_state::main_map(address_map &map) +{ + map(0x0000, 0x5fff).rom(); + map(0xc000, 0xcfff).ram(); + map(0xd000, 0xd0ff).mirror(0x0300).ram().r(FUNC(savant_state::nvram_r)).share("nvram"); +} + +void savant_state::main_io(address_map &map) +{ + map.global_mask(0xff); + map(0xc0, 0xc0).mirror(0x38).rw(FUNC(savant_state::stall_r), FUNC(savant_state::stall_w)); + map(0xc1, 0xc1).mirror(0x38).unmapw(); // clock + map(0xc2, 0xc2).mirror(0x38).unmapw(); // printer + map(0xc3, 0xc3).mirror(0x38).unmapr(); // printer + map(0xc4, 0xc4).mirror(0x38).r(FUNC(savant_state::mcustatus_r)); + map(0xc5, 0xc5).mirror(0x38).unmapw(); // printer +} + +void savant_state::mcu_map(address_map &map) +{ + map.global_mask(0x7ff); + map(0x0000, 0x07ff).rom(); +} + +void savant_state::mcu_io(address_map &map) +{ + map(0x00, 0x00).rw(FUNC(savant_state::databus_r), FUNC(savant_state::databus_w)); + map(0x01, 0x01).rw(FUNC(savant_state::control_r), FUNC(savant_state::control_w)); + map(0x04, 0x07).rw(m_psu, FUNC(f38t56_device::read), FUNC(f38t56_device::write)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( savant ) + 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(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.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void savant_state::savant(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 6_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &savant_state::main_map); + m_maincpu->set_addrmap(AS_IO, &savant_state::main_io); + + F8(config, m_mcu, 4_MHz_XTAL/2); + m_mcu->set_addrmap(AS_PROGRAM, &savant_state::mcu_map); + m_mcu->set_addrmap(AS_IO, &savant_state::mcu_io); + 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->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)); + + config.m_perfect_cpu_quantum = subtag("mcu"); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->set_ui_enable(false); // no chesspieces + m_board->set_delay(attotime::never); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); + + /* video hardware */ + HLCD0538(config, m_lcd1).write_cols().set(FUNC(savant_state::lcd1_output_w)); + HLCD0539(config, m_lcd2).write_cols().set(FUNC(savant_state::lcd2_output_w)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(958, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 24+27); + //config.set_default_layout(layout_novag_savant); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( savant ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD("5605_1f_orange.u13", 0x0000, 0x2000, CRC(1feb8e29) SHA1(1c9a9f6ca7b02ea002ea9dc07b0870b3b0a4cdb9) ) // TMM2364 + ROM_LOAD("5606_1g_white.u14", 0x2000, 0x2000, CRC(9d95cf14) SHA1(eb29774d05c2f17b54363417297e535b4217e222) ) // " + ROM_LOAD("5607_1e_blue.u15", 0x4000, 0x2000, CRC(131fb097) SHA1(2423d369cc9d9c62e6040e7c34941833f7ec7aa0) ) // " + // 3 more ROM sockets not populated(yellow, red, gold), manual mentions possible expansion + + ROM_REGION( 0x0800, "mcu", 0 ) + ROM_LOAD("sl90547.u29", 0x0000, 0x0800, CRC(6fbf2aa0) SHA1(18e673ba5b806b397dd3d350525b5467c25a0d94) ) + + ROM_REGION( 763850, "screen", 0) + ROM_LOAD("savant.svg", 0, 763850, CRC(f29a5ca4) SHA1(9fabfb86e6235057b60232e987872a645ee4112e) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1981, savant, 0, 0, savant, savant, savant_state, empty_init, "Novag", "Savant", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/vidbrain.cpp b/src/mame/drivers/vidbrain.cpp index 6f81b404f3c..71af674ae38 100644 --- a/src/mame/drivers/vidbrain.cpp +++ b/src/mame/drivers/vidbrain.cpp @@ -314,7 +314,7 @@ WRITE_LINE_MEMBER( vidbrain_state::ext_int_w ) { if (state) { - m_smi->ext_int_w(0); + m_smi->ext_int_w(1); } } @@ -362,7 +362,7 @@ READ8_MEMBER(vidbrain_state::memory_read_byte) void vidbrain_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { m_uv->ext_int_w(0); - m_smi->ext_int_w(1); + m_smi->ext_int_w(0); } diff --git a/src/mame/layout/mchess.lay b/src/mame/layout/mchess.lay index 9e77f64bb7b..9fa79a6f9bc 100644 --- a/src/mame/layout/mchess.lay +++ b/src/mame/layout/mchess.lay @@ -10,6 +10,7 @@ <element name="red"><rect><color red="0.75" green="0.15" blue="0.2" /></rect></element> <element name="blue"><rect><color red="0.15" green="0.2" blue="0.75" /></rect></element> <element name="blueb"><rect><color red="0.07" green="0.01" blue="0.25" /></rect></element> + <element name="blueb2"><rect><color red="0.12" green="0.03" blue="0.4" /></rect></element> <element name="redd"> <rect><color red="0.5" green="0.1" blue="0.15" /></rect> @@ -33,8 +34,9 @@ </element> <element name="text_switch" defstate="0"> - <text string="POWER SWITCH: ON" align="1" state="0"><color red="0.3" green="0.3" blue="0.3" /></text> - <text string="POWER SWITCH: SAVE" align="1" state="1"><color red="0.3" green="0.3" blue="0.3" /></text> + <rect><color red="0.12" green="0.03" blue="0.4" /></rect> + <text string="POWER SWITCH: ON" align="1" state="0"><color red="0.4" green="0.4" blue="0.55" /></text> + <text string="POWER SWITCH: SAVE" align="1" state="1"><color red="0.4" green="0.4" blue="0.55" /></text> </element> <element name="text_l0"><text string="MOVE"><color red="0.8" green="0.8" blue="0.8" /></text></element> @@ -142,19 +144,20 @@ <!-- build screen --> - <view name="Internal Layout (Screen)"> - <group ref="display"><bounds x="0" y="0" width="86" height="94.434" /></group> - </view> - <view name="Internal Layout (Full)"> - <bounds left="-1" right="185" top="-1" bottom="96" /> + <bounds left="-1" right="182.5" top="-1" bottom="96" /> <group ref="display"><bounds x="0" y="0" width="86" height="94.434" /></group> - <bezel element="blueb"><bounds x="89" y="43" width="97" height="53" /></bezel> - <bezel element="blackb"><bounds x="92" y="46" width="97" height="53" /></bezel> - <group ref="buttons"><bounds x="95" y="48.634" width="87.8" height="45.8" /></group> + <bezel element="blueb2"><bounds x="88" y="0" width="95" height="53" /></bezel> + <bezel element="blueb"><bounds x="88" y="44" width="95" height="53" /></bezel> + <bezel element="blackb"><bounds x="91" y="47" width="95" height="53" /></bezel> + <group ref="buttons"><bounds x="93" y="48.634" width="87.8" height="45.8" /></group> - <bezel element="text_switch" inputtag="IN.3" inputmask="0x01"><bounds x="95" y="38" width="24" height="2.7" /></bezel> + <bezel element="text_switch" inputtag="IN.3" inputmask="0x01"><bounds x="91" y="2" width="24" height="2.7" /></bezel> + </view> + + <view name="Internal Layout (Screen)"> + <group ref="display"><bounds x="0" y="0" width="86" height="94.434" /></group> </view> </mamelayout> diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 42da707355b..cd3cc8f2da1 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -30964,6 +30964,9 @@ ccmk2 // Chess Champion MK II nocto // npresto // +@source:novag_savant.cpp +savant // + @source:novag_scon.cpp supercon // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 51aea0b02b8..772cfa6b4dc 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -544,6 +544,7 @@ novag_diablo.cpp novag_mk1.cpp novag_mk2.cpp novag_presto.cpp +novag_savant.cpp novag_scon.cpp novag_sexpert.cpp o2.cpp |