summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2019-06-29 04:57:19 +0200
committer hap <happppp@users.noreply.github.com>2019-06-29 04:57:19 +0200
commit7a3eb11ab1ecfe5a87eee52c4334847e9dce1b3c (patch)
tree0865ff33c52cbef04962caa42efc6d32114a1412
parentfe0db6545c8077cef465dfa52f9124903fcc74e2 (diff)
remove novagbase class (nw)
-rw-r--r--scripts/target/mame/mess.lua64
-rw-r--r--src/mame/drivers/novag_cforte.cpp2
-rw-r--r--src/mame/drivers/novag_diablo.cpp277
-rw-r--r--src/mame/drivers/novag_presto.cpp12
-rw-r--r--src/mame/drivers/novag_sexpert.cpp326
-rw-r--r--src/mame/includes/novagbase.h63
-rw-r--r--src/mame/machine/novagbase.cpp60
7 files changed, 588 insertions, 216 deletions
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<m68000_base_device> m_maincpu;
+ required_device<timer_device> m_irq_on;
required_device<screen_device> m_screen;
+ required_device<pwm_display_device> m_display;
+ required_device<hd44780_device> m_lcd;
required_device<mos6551_device> m_acia;
required_device<rs232_port_device> m_rs232;
+ required_device<beep_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<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
+ template<int Line> 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<cpu_device> m_maincpu;
+ required_device<timer_device> m_irq_on;
+ required_memory_bank m_rombank;
required_device<screen_device> m_screen;
+ required_device<pwm_display_device> m_display;
+ required_device<hd44780_device> m_lcd;
required_device<mos6551_device> m_acia;
required_device<rs232_port_device> m_rs232;
+ required_device<beep_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<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
+ template<int Line> 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);
-}
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
-void sexpert_state::init_sexpert()
+// LCD
+
+void sexpert_state::lcd_palette(palette_device &palette) const
{
- m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x8000, 0x8000);
+ 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;
+ }
+}
-/******************************************************************************
- Devices, I/O
-******************************************************************************/
// 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<cpu_device> m_maincpu;
- optional_device<timer_device> m_irq_on;
- optional_memory_bank m_rombank;
- optional_device<beep_device> m_beeper;
- optional_device<dac_bit_interface> m_dac;
- optional_device<hd44780_device> m_lcd;
-
- // periodic interrupts
- template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
- template<int Line> 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;
- }
-}