diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 6f4b0ccf2cd..3f5c92c4f31 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1071,7 +1071,6 @@ function linkProjects_mame_mess(_target, _subtarget) "cccp", "cce", "ccs", - "chess", "chessking", "chromatics", "chrysler", @@ -1104,6 +1103,7 @@ function linkProjects_mame_mess(_target, _subtarget) "exidy", "fairch", "fairlight", + "fidelity", "force", "fujitsu", "funtech", @@ -1889,39 +1889,6 @@ files { MAME_DIR .. "src/mame/drivers/ccs300.cpp", } -createMESSProjects(_target, _subtarget, "chess") -files { - MAME_DIR .. "src/mame/machine/chessbase.cpp", - MAME_DIR .. "src/mame/includes/chessbase.h", - - MAME_DIR .. "src/mame/machine/fidelbase.cpp", - MAME_DIR .. "src/mame/includes/fidelbase.h", - MAME_DIR .. "src/mame/drivers/fidel_as12.cpp", - MAME_DIR .. "src/mame/drivers/fidel_card.cpp", - MAME_DIR .. "src/mame/drivers/fidel_cc1.cpp", - MAME_DIR .. "src/mame/drivers/fidel_cc10.cpp", - MAME_DIR .. "src/mame/drivers/fidel_cc7.cpp", - MAME_DIR .. "src/mame/drivers/fidel_chesster.cpp", - MAME_DIR .. "src/mame/drivers/fidel_csc.cpp", - MAME_DIR .. "src/mame/drivers/fidel_dames.cpp", - MAME_DIR .. "src/mame/drivers/fidel_desdis.cpp", - MAME_DIR .. "src/mame/drivers/fidel_eag68k.cpp", - MAME_DIR .. "src/mame/drivers/fidel_elite.cpp", - MAME_DIR .. "src/mame/drivers/fidel_excel.cpp", - MAME_DIR .. "src/mame/drivers/fidel_phantom.cpp", - MAME_DIR .. "src/mame/drivers/fidel_sc12.cpp", - MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp", - MAME_DIR .. "src/mame/drivers/fidel_sc8.cpp", - MAME_DIR .. "src/mame/drivers/fidel_sc9.cpp", - MAME_DIR .. "src/mame/drivers/fidel_vcc.cpp", - MAME_DIR .. "src/mame/drivers/fidel_vsc.cpp", - - MAME_DIR .. "src/mame/machine/novagbase.cpp", - MAME_DIR .. "src/mame/includes/novagbase.h", - MAME_DIR .. "src/mame/drivers/novag_diablo.cpp", - MAME_DIR .. "src/mame/drivers/novag_sexpert.cpp", -} - createMESSProjects(_target, _subtarget, "chessking") files { MAME_DIR .. "src/mame/drivers/cking_master.cpp", @@ -2218,6 +2185,33 @@ files { MAME_DIR .. "src/mame/machine/cmi_mkbd.h", } +createMESSProjects(_target, _subtarget, "fidelity") +files { + MAME_DIR .. "src/mame/machine/chessbase.cpp", + MAME_DIR .. "src/mame/includes/chessbase.h", + MAME_DIR .. "src/mame/machine/fidelbase.cpp", + MAME_DIR .. "src/mame/includes/fidelbase.h", + MAME_DIR .. "src/mame/drivers/fidel_as12.cpp", + MAME_DIR .. "src/mame/drivers/fidel_card.cpp", + MAME_DIR .. "src/mame/drivers/fidel_cc1.cpp", + MAME_DIR .. "src/mame/drivers/fidel_cc10.cpp", + MAME_DIR .. "src/mame/drivers/fidel_cc7.cpp", + MAME_DIR .. "src/mame/drivers/fidel_chesster.cpp", + MAME_DIR .. "src/mame/drivers/fidel_csc.cpp", + MAME_DIR .. "src/mame/drivers/fidel_dames.cpp", + MAME_DIR .. "src/mame/drivers/fidel_desdis.cpp", + MAME_DIR .. "src/mame/drivers/fidel_eag68k.cpp", + MAME_DIR .. "src/mame/drivers/fidel_elite.cpp", + MAME_DIR .. "src/mame/drivers/fidel_excel.cpp", + MAME_DIR .. "src/mame/drivers/fidel_phantom.cpp", + MAME_DIR .. "src/mame/drivers/fidel_sc12.cpp", + MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp", + MAME_DIR .. "src/mame/drivers/fidel_sc8.cpp", + MAME_DIR .. "src/mame/drivers/fidel_sc9.cpp", + MAME_DIR .. "src/mame/drivers/fidel_vcc.cpp", + MAME_DIR .. "src/mame/drivers/fidel_vsc.cpp", +} + createMESSProjects(_target, _subtarget, "force") files { MAME_DIR .. "src/mame/drivers/miniforce.cpp", @@ -2816,11 +2810,13 @@ createMESSProjects(_target, _subtarget, "novag") files { MAME_DIR .. "src/mame/drivers/novag_cforte.cpp", MAME_DIR .. "src/mame/drivers/novag_delta1.cpp", + MAME_DIR .. "src/mame/drivers/novag_diablo.cpp", MAME_DIR .. "src/mame/drivers/novag_mk1.cpp", MAME_DIR .. "src/mame/drivers/novag_mk2.cpp", MAME_DIR .. "src/mame/drivers/novag_presto.cpp", MAME_DIR .. "src/mame/drivers/novag_savant.cpp", MAME_DIR .. "src/mame/drivers/novag_scon.cpp", + MAME_DIR .. "src/mame/drivers/novag_sexpert.cpp", MAME_DIR .. "src/mame/drivers/ssystem3.cpp", MAME_DIR .. "src/mame/includes/ssystem3.h", MAME_DIR .. "src/mame/video/ssystem3.cpp", diff --git a/src/mame/drivers/novag_cforte.cpp b/src/mame/drivers/novag_cforte.cpp index 79c93898b01..5a6e62c9b9f 100644 --- a/src/mame/drivers/novag_cforte.cpp +++ b/src/mame/drivers/novag_cforte.cpp @@ -42,7 +42,7 @@ public: m_irq_on(*this, "irq_on"), m_display(*this, "display"), m_board(*this, "board"), - m_lcd(*this, "lcd"), + m_lcd(*this, "hlcd0538"), m_beeper(*this, "beeper"), m_inputs(*this, "IN.%u", 0) { } diff --git a/src/mame/drivers/novag_diablo.cpp b/src/mame/drivers/novag_diablo.cpp index 8f05e9c2092..f8cfc71d5ff 100644 --- a/src/mame/drivers/novag_diablo.cpp +++ b/src/mame/drivers/novag_diablo.cpp @@ -3,11 +3,9 @@ // thanks-to:yoyo_chessboard /****************************************************************************** -* novag_diablo.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp +Novag Diablo 68000 / Novag Scorpio 68000 -******************************************************************************* - -Novag Diablo 68000 overview: +Hardware notes (Diablo): - M68000 @ 16MHz, IPL1 256Hz, IPL2 from ACIA IRQ(always high) - 2*8KB RAM TC5565 battery-backed, 2*32KB hashtable RAM TC55257 3*32KB ROM - HD44780 LCD controller (16x1) @@ -19,12 +17,16 @@ Scorpio 68000 hardware is very similar, but with chessboard buttons and side led ******************************************************************************/ #include "emu.h" -#include "includes/novagbase.h" - #include "bus/rs232/rs232.h" #include "cpu/m68000/m68000.h" +#include "video/pwm.h" +#include "video/hd44780.h" #include "machine/mos6551.h" #include "machine/nvram.h" +#include "machine/timer.h" +#include "sound/beep.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" @@ -35,47 +37,122 @@ Scorpio 68000 hardware is very similar, but with chessboard buttons and side led namespace { -class diablo_state : public novagbase_state +class diablo_state : public driver_device { public: diablo_state(const machine_config &mconfig, device_type type, const char *tag) : - novagbase_state(mconfig, type, tag), + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), m_screen(*this, "screen"), + m_display(*this, "display"), + m_lcd(*this, "hd44780"), m_acia(*this, "acia"), - m_rs232(*this, "rs232") + m_rs232(*this, "rs232"), + m_beeper(*this, "beeper"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers void diablo68k(machine_config &config); void scorpio68k(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device m_maincpu; + required_device m_irq_on; required_device m_screen; + required_device m_display; + required_device m_lcd; required_device m_acia; required_device m_rs232; + required_device m_beeper; + required_ioport_array<8> m_inputs; // address maps void diablo68k_map(address_map &map); void scorpio68k_map(address_map &map); + // periodic interrupts + template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); } + template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); } + // I/O handlers + void update_display(); DECLARE_WRITE8_MEMBER(control_w); DECLARE_WRITE8_MEMBER(lcd_data_w); DECLARE_WRITE8_MEMBER(leds_w); DECLARE_READ8_MEMBER(input1_r); DECLARE_READ8_MEMBER(input2_r); + + HD44780_PIXEL_UPDATE(lcd_pixel_update); + void lcd_palette(palette_device &palette) const; + + u8 m_inp_mux; + u8 m_led_data; + u8 m_led_side; + u8 m_lcd_control; + u8 m_lcd_data; }; +void diablo_state::machine_start() +{ + // zerofill + m_inp_mux = 0; + m_led_data = 0; + m_led_side = 0; + m_lcd_control = 0; + m_lcd_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_data)); + save_item(NAME(m_led_side)); + save_item(NAME(m_lcd_control)); + save_item(NAME(m_lcd_data)); +} + + /****************************************************************************** Devices, I/O ******************************************************************************/ +// LCD + +void diablo_state::lcd_palette(palette_device &palette) const +{ + palette.set_pen_color(0, rgb_t(138, 146, 148)); // background + palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on + palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off +} + +HD44780_PIXEL_UPDATE(diablo_state::lcd_pixel_update) +{ + // char size is 5x8 + if (x > 4 || y > 7) + return; + + if (line < 2 && pos < 8) + { + // internal: (8+8)*1, external: 1*16 + bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2; + } +} + + // TTL +void diablo_state::update_display() +{ + // update leds (lcd is done separately) + u8 led_select = 1 << m_inp_mux; + m_display->matrix(led_select, m_led_side << 8 | m_led_data); +} + WRITE8_MEMBER(diablo_state::control_w) { // d0: HD44780 E @@ -88,12 +165,11 @@ WRITE8_MEMBER(diablo_state::control_w) m_beeper->set_state(data >> 7 & 1); // d2,d3: side leds(scorpio) - u8 leds2 = ~data >> 2 & 3; + m_led_side = ~data >> 2 & 3; // d4-d6: input mux, led select - m_inp_mux = 1 << (data >> 4 & 0x7) & 0xff; - display_matrix(8+2, 8, m_led_data | leds2 << 8, m_inp_mux); - m_led_data = 0; // ? + m_inp_mux = data >> 4 & 7; + update_display(); } WRITE8_MEMBER(diablo_state::lcd_data_w) @@ -106,19 +182,20 @@ WRITE8_MEMBER(diablo_state::leds_w) { // d0-d7: chessboard leds m_led_data = data; + update_display(); } READ8_MEMBER(diablo_state::input1_r) { // d0-d7: multiplexed inputs (chessboard squares) - return ~read_inputs(8) & 0xff; + return ~m_inputs[m_inp_mux]->read() & 0xff; } READ8_MEMBER(diablo_state::input2_r) { // d0-d2: multiplexed inputs (side panel) // other: ? - return ~read_inputs(8) >> 8 & 7; + return ~m_inputs[m_inp_mux]->read() >> 8 & 7; } @@ -154,6 +231,170 @@ void diablo_state::scorpio68k_map(address_map &map) Input Ports ******************************************************************************/ +INPUT_PORTS_START( generic_cb_buttons ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") +INPUT_PORTS_END + +INPUT_PORTS_START( generic_cb_magnets ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") +INPUT_PORTS_END + static INPUT_PORTS_START( diablo68k_sidepanel ) PORT_MODIFY("IN.0") PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Go") @@ -245,13 +486,13 @@ void diablo_state::diablo68k(machine_config &config) m_screen->set_screen_update("hd44780", FUNC(hd44780_device::screen_update)); m_screen->set_palette("palette"); - PALETTE(config, "palette", FUNC(diablo_state::novag_lcd_palette), 3); + PALETTE(config, "palette", FUNC(diablo_state::lcd_palette), 3); HD44780(config, m_lcd, 0); m_lcd->set_lcd_size(2, 8); - m_lcd->set_pixel_update_cb(FUNC(diablo_state::novag_lcd_pixel_update), this); + m_lcd->set_pixel_update_cb(FUNC(diablo_state::lcd_pixel_update), this); - TIMER(config, "display_decay").configure_periodic(FUNC(diablo_state::display_decay_tick), attotime::from_msec(1)); + PWM_DISPLAY(config, m_display).set_size(8, 8+2); config.set_default_layout(layout_novag_diablo68k); /* sound hardware */ diff --git a/src/mame/drivers/novag_presto.cpp b/src/mame/drivers/novag_presto.cpp index 3b8293589c2..d9717f9e4a7 100644 --- a/src/mame/drivers/novag_presto.cpp +++ b/src/mame/drivers/novag_presto.cpp @@ -5,6 +5,13 @@ Novag Presto / Novag Octo +TODO: +- controls are too sensitive, is there a bug in the CPU core timer emulation? + 6MHz: valid (single) button press registered between 307ms and 436ms, + 12MHz: between 154ms and 218ms, 15MHz: between 123ms and 174ms. + +******************************************************************************* + Hardware notes (Presto): - NEC D80C49C MCU(serial 186), OSC from LC circuit measured ~6MHz - buzzer, 16+4 LEDs, 8*8 chessboard buttons @@ -13,11 +20,6 @@ Octo has a NEC D80C49HC MCU(serial 111), OSC from LC circuit measured ~12MHz The buzzer has a little electronic circuit going on, not sure whatfor. Otherwise, it's identical to Presto. The MCU internal ROM is same too. -TODO: -- controls are too sensitive, is there a bug in the CPU core timer emulation? - 6MHz: valid (single) button press registered between 307ms and 436ms, - 12MHz: between 154ms and 218ms, 15MHz: between 123ms and 174ms. - ******************************************************************************/ #include "emu.h" diff --git a/src/mame/drivers/novag_sexpert.cpp b/src/mame/drivers/novag_sexpert.cpp index 84b92acc376..e70b9ca487e 100644 --- a/src/mame/drivers/novag_sexpert.cpp +++ b/src/mame/drivers/novag_sexpert.cpp @@ -3,14 +3,14 @@ // thanks-to:Berger /****************************************************************************** -* novag_sexpert.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp +Novag Super Expert (model 878/887/902) / Novag Super Forte TODO: -- led handling is correct? The core issue is probably led strobe timing. +- sforte lcd_data_w implementation is wrong, especially led handling ******************************************************************************* -Novag Super Expert (model 878/887/902) overview: +Hardware notes (Super Expert) - 65C02 @ 5MHz or 6MHz (10MHz or 12MHz XTAL) - 8KB RAM battery-backed, 3*32KB ROM - HD44780 LCD controller (16x1) @@ -26,12 +26,16 @@ instead of magnet sensors. ******************************************************************************/ #include "emu.h" -#include "includes/novagbase.h" - #include "bus/rs232/rs232.h" #include "cpu/m6502/m65c02.h" +#include "video/pwm.h" +#include "video/hd44780.h" #include "machine/mos6551.h" #include "machine/nvram.h" +#include "machine/timer.h" +#include "sound/beep.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" @@ -42,14 +46,23 @@ instead of magnet sensors. namespace { -class sexpert_state : public novagbase_state +// Super Expert / shared + +class sexpert_state : public driver_device { public: sexpert_state(const machine_config &mconfig, device_type type, const char *tag) : - novagbase_state(mconfig, type, tag), + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), + m_rombank(*this, "rombank"), m_screen(*this, "screen"), + m_display(*this, "display"), + m_lcd(*this, "hd44780"), m_acia(*this, "acia"), - m_rs232(*this, "rs232") + m_rs232(*this, "rs232"), + m_beeper(*this, "beeper"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -61,10 +74,18 @@ public: protected: // devices/pointers + required_device m_maincpu; + required_device m_irq_on; + required_memory_bank m_rombank; required_device m_screen; + required_device m_display; + required_device m_lcd; required_device m_acia; required_device m_rs232; + required_device m_beeper; + required_ioport_array<8> m_inputs; + virtual void machine_start() override; virtual void machine_reset() override; void sexpert_set_cpu_freq(); @@ -72,15 +93,62 @@ protected: // address maps void sexpert_map(address_map &map); + // periodic interrupts + template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); } + template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); } + // I/O handlers + void update_display(); virtual DECLARE_WRITE8_MEMBER(lcd_control_w); virtual DECLARE_WRITE8_MEMBER(lcd_data_w); DECLARE_WRITE8_MEMBER(leds_w); DECLARE_WRITE8_MEMBER(mux_w); DECLARE_READ8_MEMBER(input1_r); DECLARE_READ8_MEMBER(input2_r); + + HD44780_PIXEL_UPDATE(lcd_pixel_update); + void lcd_palette(palette_device &palette) const; + + u8 m_inp_mux; + u8 m_led_data; + u8 m_lcd_control; + u8 m_lcd_data; }; +void sexpert_state::machine_start() +{ + // zerofill + m_inp_mux = 0; + m_led_data = 0; + m_lcd_control = 0; + m_lcd_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_data)); + save_item(NAME(m_lcd_control)); + save_item(NAME(m_lcd_data)); +} + +void sexpert_state::sexpert_set_cpu_freq() +{ + // machines were released with either 5MHz or 6MHz CPU + m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (12_MHz_XTAL/2) : (10_MHz_XTAL/2)); +} + +void sexpert_state::machine_reset() +{ + sexpert_set_cpu_freq(); + m_rombank->set_entry(0); +} + +void sexpert_state::init_sexpert() +{ + m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x8000, 0x8000); +} + +// Super Forte + class sforte_state : public sexpert_state { public: @@ -100,32 +168,43 @@ private: virtual DECLARE_WRITE8_MEMBER(lcd_data_w) override; }; -void sexpert_state::sexpert_set_cpu_freq() -{ - // machines were released with either 5MHz or 6MHz CPU - m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (12_MHz_XTAL/2) : (10_MHz_XTAL/2)); -} - -void sexpert_state::machine_reset() -{ - novagbase_state::machine_reset(); - - sexpert_set_cpu_freq(); - m_rombank->set_entry(0); -} - -void sexpert_state::init_sexpert() -{ - m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x8000, 0x8000); -} /****************************************************************************** Devices, I/O ******************************************************************************/ +// LCD + +void sexpert_state::lcd_palette(palette_device &palette) const +{ + palette.set_pen_color(0, rgb_t(138, 146, 148)); // background + palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on + palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off +} + +HD44780_PIXEL_UPDATE(sexpert_state::lcd_pixel_update) +{ + // char size is 5x8 + if (x > 4 || y > 7) + return; + + if (line < 2 && pos < 8) + { + // internal: (8+8)*1, external: 1*16 + bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2; + } +} + + // TTL/generic +void sexpert_state::update_display() +{ + // update leds (lcd is done separately) + m_display->matrix(m_inp_mux, m_led_data); +} + WRITE8_MEMBER(sexpert_state::lcd_control_w) { // d0: HD44780 RS @@ -146,6 +225,7 @@ WRITE8_MEMBER(sexpert_state::leds_w) { // d0-d7: chessboard leds m_led_data = data; + update_display(); } WRITE8_MEMBER(sexpert_state::mux_w) @@ -158,21 +238,33 @@ WRITE8_MEMBER(sexpert_state::mux_w) // d4-d7: 74145 to input mux/led select m_inp_mux = 1 << (data >> 4 & 0xf) & 0xff; - display_matrix(8, 8, m_led_data, m_inp_mux); - m_led_data = 0; // ? + update_display(); } READ8_MEMBER(sexpert_state::input1_r) { + u8 data = 0; + // d0-d7: multiplexed inputs (chessboard squares) - return ~read_inputs(8) & 0xff; + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data; } READ8_MEMBER(sexpert_state::input2_r) { + u8 data = 0; + // d0-d2: printer port + // d5-d7: multiplexed inputs (side panel) - return ~read_inputs(8) >> 3 & 0xe0; + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read() >> 3; + + return ~data & 0xe0; } @@ -183,7 +275,7 @@ WRITE8_MEMBER(sforte_state::lcd_control_w) // d3: rom bankswitch m_rombank->set_entry(data >> 3 & 1); - // assume same as sexpert + // LCD pins: same as sexpert sexpert_state::lcd_control_w(space, offset, data); } @@ -196,14 +288,14 @@ WRITE8_MEMBER(sforte_state::lcd_data_w) if (~m_lcd_control & 4) { // d5,d6: led data, but not both at same time? - if ((data & 0x60) != 0x60) - display_matrix(2, 8, data >> 5 & 3, m_inp_mux); + m_led_data = ((data & 0x60) != 0x60) ? (data >> 5 & 3) : 0; + update_display(); // d7: enable beeper m_beeper->set_state(data >> 7 & 1); } - // assume same as sexpert + // LCD pins: same as sexpert sexpert_state::lcd_data_w(space, offset, data); } @@ -244,6 +336,170 @@ void sforte_state::sforte_map(address_map &map) Input Ports ******************************************************************************/ +INPUT_PORTS_START( generic_cb_buttons ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") +INPUT_PORTS_END + +INPUT_PORTS_START( generic_cb_magnets ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") +INPUT_PORTS_END + static INPUT_PORTS_START( sexy_shared ) PORT_MODIFY("IN.0") PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Go") @@ -339,13 +595,13 @@ void sexpert_state::sexpert(machine_config &config) m_screen->set_screen_update("hd44780", FUNC(hd44780_device::screen_update)); m_screen->set_palette("palette"); - PALETTE(config, "palette", FUNC(sexpert_state::novag_lcd_palette), 3); + PALETTE(config, "palette", FUNC(sexpert_state::lcd_palette), 3); HD44780(config, m_lcd, 0); m_lcd->set_lcd_size(2, 8); - m_lcd->set_pixel_update_cb(FUNC(sexpert_state::novag_lcd_pixel_update), this); + m_lcd->set_pixel_update_cb(FUNC(sexpert_state::lcd_pixel_update), this); - TIMER(config, "display_decay").configure_periodic(FUNC(sexpert_state::display_decay_tick), attotime::from_msec(1)); + PWM_DISPLAY(config, m_display).set_size(8, 8); config.set_default_layout(layout_novag_sexpert); /* sound hardware */ diff --git a/src/mame/includes/novagbase.h b/src/mame/includes/novagbase.h deleted file mode 100644 index b2fae6a4558..00000000000 --- a/src/mame/includes/novagbase.h +++ /dev/null @@ -1,63 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/****************************************************************************** -* -* Novag chess computers base driver -* implementation is in machine/novagbase.cpp -* -******************************************************************************/ - -#ifndef MAME_INCLUDES_NOVAGBASE_H -#define MAME_INCLUDES_NOVAGBASE_H - -#pragma once - -#include "includes/chessbase.h" - -#include "machine/timer.h" -#include "sound/dac.h" -#include "sound/beep.h" -#include "video/hd44780.h" -#include "emupal.h" - -class novagbase_state : public chessbase_state -{ -public: - novagbase_state(const machine_config &mconfig, device_type type, const char *tag) : - chessbase_state(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_irq_on(*this, "irq_on"), - m_rombank(*this, "rombank"), - m_beeper(*this, "beeper"), - m_dac(*this, "dac"), - m_lcd(*this, "hd44780") - { } - - // in case reset button is directly tied to maincpu reset pin - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); } - -protected: - // devices/pointers - required_device m_maincpu; - optional_device m_irq_on; - optional_memory_bank m_rombank; - optional_device m_beeper; - optional_device m_dac; - optional_device m_lcd; - - // periodic interrupts - template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); } - template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); } - - // lcd common - HD44780_PIXEL_UPDATE(novag_lcd_pixel_update); - void novag_lcd_palette(palette_device &palette) const; - u8 m_lcd_control; - u8 m_lcd_data; - - virtual void machine_start() override; - virtual void machine_reset() override; -}; - - -#endif // MAME_INCLUDES_NOVAGBASE_H diff --git a/src/mame/machine/novagbase.cpp b/src/mame/machine/novagbase.cpp deleted file mode 100644 index 6595de8e288..00000000000 --- a/src/mame/machine/novagbase.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/****************************************************************************** - -Novag chess computers base driver - -TODO: -- printer port - -******************************************************************************/ - -#include "emu.h" -#include "includes/novagbase.h" - - -// machine start/reset - -void novagbase_state::machine_start() -{ - chessbase_state::machine_start(); - - // zerofill/register for savestates - m_lcd_control = 0; - m_lcd_data = 0; - - save_item(NAME(m_lcd_control)); - save_item(NAME(m_lcd_data)); -} - -void novagbase_state::machine_reset() -{ - chessbase_state::machine_reset(); -} - - -/*************************************************************************** - Helper Functions -***************************************************************************/ - -// LCD - -void novagbase_state::novag_lcd_palette(palette_device &palette) const -{ - palette.set_pen_color(0, rgb_t(138, 146, 148)); // background - palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on - palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off -} - -HD44780_PIXEL_UPDATE(novagbase_state::novag_lcd_pixel_update) -{ - // char size is 5x8 - if (x > 4 || y > 7) - return; - - if (line < 2 && pos < 8) - { - // internal: (8+8)*1, external: 1*16 - bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2; - } -}