summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/supercon.c
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2012-08-21 10:41:19 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2012-08-21 10:41:19 +0000
commit7285b359d259b2ae0fdf85096571c386ec8c991a (patch)
treea027aff57f1a255f9ec6cfd3b68cabe4b6683998 /src/mess/drivers/supercon.c
parent67c425e90757876a6716b7867df30c0149912e74 (diff)
Merge of MESS sources (no whatsnew)
Diffstat (limited to 'src/mess/drivers/supercon.c')
-rw-r--r--src/mess/drivers/supercon.c760
1 files changed, 760 insertions, 0 deletions
diff --git a/src/mess/drivers/supercon.c b/src/mess/drivers/supercon.c
new file mode 100644
index 00000000000..636277bbf07
--- /dev/null
+++ b/src/mess/drivers/supercon.c
@@ -0,0 +1,760 @@
+/******************************************************************************
+ Novag SuperConstellation Chess Computer
+ 2010 R. Schaefer
+
+
+ CPU 6502
+ Clock 4 MHz
+ IRQ CLK 600 Hz
+
+ RAM 0x0000, 0x0fff)
+ ROM 0x2000, 0xffff)
+ I/O 0x1c00 Unknown
+ 0x1d00 Unknown
+ 0x1e00 LED's and buttons
+ 0x1f00 LED's, buttons and buzzer
+
+
+******************************************************************************/
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+#include "sound/beep.h"
+#include "supercon.lh"
+
+#define MACHINE_RESET_MEMBER(name) void name::machine_reset()
+
+class supercon_state : public driver_device
+{
+public:
+ supercon_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_beep(*this, BEEPER_TAG)
+ { }
+
+ required_device<cpu_device> m_maincpu;
+ required_device<device_t> m_beep;
+ DECLARE_READ8_MEMBER(supercon_port1_r);
+ DECLARE_READ8_MEMBER(supercon_port2_r);
+ DECLARE_READ8_MEMBER(supercon_port3_r);
+ DECLARE_READ8_MEMBER(supercon_port4_r);
+ DECLARE_WRITE8_MEMBER(supercon_port1_w);
+ DECLARE_WRITE8_MEMBER(supercon_port2_w);
+ DECLARE_WRITE8_MEMBER(supercon_port3_w);
+ DECLARE_WRITE8_MEMBER(supercon_port4_w);
+ static const UINT8 m_border_pieces[12];
+ emu_timer* m_timer_update_irq;
+ emu_timer* m_timer_mouse_click;
+ int m_emu_started;
+ int m_moving_piece;
+ UINT8 m_data_1E00;
+ UINT8 m_data_1F00;
+ UINT8 m_LED_18;
+ UINT8 m_LED_AH;
+ UINT8 m_LED_ST;
+ UINT8 *m_last_LED;
+ UINT8 m_last_LED_value;
+ int m_led_update;
+ int m_remove_led_flag;
+ int m_selecting;
+ int m_save_key_data;
+ attotime m_wait_time;
+ int *m_current_field;
+ int m_confirm_board_click;
+ int m_board[64];
+ int m_save_board[64];
+ void set_board();
+ void set_pieces();
+ void set_border_pieces();
+ void clear_pieces();
+ void update_leds();
+ virtual void machine_reset();
+ DECLARE_DRIVER_INIT(supercon);
+};
+
+
+#define VERBOSE 0
+#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
+
+enum
+{
+ EM, /*No piece*/
+ BP,
+ BN,
+ BB,
+ BR,
+ BQ,
+ BK,
+ WP,
+ WN,
+ WB,
+ WR,
+ WQ,
+ WK
+};
+
+
+#define LED_LINE_AH 0x10
+#define LED_LINE_ST 0x20
+#define LED_LINE_18 0x40
+
+
+#define MAIN_CLOCK 4000000 /* 4 MHz */
+
+#define NOT_VALID 99
+
+#define NO_ACTION 0
+#define TAKE 1
+#define SET 2
+
+/* artwork board */
+
+const UINT8 supercon_state::m_border_pieces[12] = {WK,WQ,WR,WB,WN,WP,BK,BQ,BR,BB,BN,BP};
+
+void supercon_state::set_board()
+{
+ static const int start_board[64] = {
+ BR, BN, BB, BQ, BK, BB, BN, BR,
+ BP, BP, BP, BP, BP, BP, BP, BP,
+ EM, EM, EM, EM, EM, EM, EM, EM,
+ EM, EM, EM, EM, EM, EM, EM, EM,
+ EM, EM, EM, EM, EM, EM, EM, EM,
+ EM, EM, EM, EM, EM, EM, EM, EM,
+ WP, WP, WP, WP, WP, WP, WP, WP,
+ WR, WN, WB, WQ, WK, WB, WN, WR };
+
+ for (UINT8 i=0; i<64; i++)
+ m_board[i]=start_board[i];
+}
+
+void supercon_state::set_pieces()
+{
+ int i;
+ for (i=0;i<64;i++)
+ output_set_indexed_value("P", i, m_board[i]);
+}
+
+void supercon_state::set_border_pieces()
+{
+ UINT8 i;
+
+ for (i=0;i<12;i++)
+ output_set_indexed_value("Q", i, m_border_pieces[i]);
+}
+
+void supercon_state::clear_pieces()
+{
+ int i;
+ for (i=0;i<64;i++)
+ {
+ output_set_indexed_value("P", i, EM);
+ m_board[i]=EM;
+ }
+}
+
+static int get_first_cleared_bit(UINT8 data)
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ if (!BIT(data, i))
+ return i;
+
+ return NOT_VALID;
+}
+
+static int get_first_bit(UINT8 data)
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ if (BIT(data, i))
+ return i;
+
+ return NOT_VALID;
+}
+
+
+void supercon_state::update_leds()
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (BIT(m_LED_18, i))
+ output_set_led_value(i + 1, 1);
+ else
+ output_set_led_value(i + 1, 0);
+
+ if (BIT(m_LED_AH, i))
+ output_set_led_value(i + 9, 1);
+ else
+ output_set_led_value(i + 9, 0);
+
+ if (BIT(m_LED_ST, i))
+ output_set_led_value(i + 17, 1);
+ else
+ output_set_led_value(i + 17, 0);
+ }
+}
+
+static void mouse_update(running_machine &machine)
+{
+ supercon_state *state = machine.driver_data<supercon_state>();
+ UINT8 port_input; // m_left;
+ int i;
+
+/* border pieces and moving piece */
+
+ port_input=machine.root_device().ioport("B_WHITE")->read();
+ if (port_input)
+ {
+ i=get_first_bit(port_input);
+ state->m_moving_piece=state->m_border_pieces[i];
+ output_set_value("MOVING",state->m_moving_piece);
+ return;
+ }
+
+
+ port_input=machine.root_device().ioport("B_BLACK")->read();
+ if (port_input)
+ {
+ i=get_first_bit(port_input);
+ state->m_moving_piece=state->m_border_pieces[6+i];
+ output_set_value("MOVING",state->m_moving_piece);
+ return;
+ }
+
+
+ port_input=machine.root_device().ioport("B_CLR")->read();
+ if (port_input)
+ {
+ if (state->m_moving_piece)
+ {
+ state->m_moving_piece=0;
+ output_set_value("MOVING",state->m_moving_piece);
+ return;
+ }
+ }
+}
+
+/* Driver initialization */
+
+DRIVER_INIT_MEMBER(supercon_state,supercon)
+{
+ m_LED_18=0;
+ m_LED_AH=0;
+ m_LED_ST=0;
+
+ m_wait_time = attotime::from_hz(4);
+ m_save_key_data = 0xff;
+
+ m_moving_piece=0;
+}
+
+/* Read 1C000 */
+
+READ8_MEMBER( supercon_state::supercon_port1_r )
+{
+ LOG(("Read from %04x \n",0x1C00));
+ return 0xff;
+}
+
+/* Read 1D000 */
+
+READ8_MEMBER( supercon_state::supercon_port2_r )
+{
+ LOG(("Read from %04x \n",0x1D00));
+ return 0xff;
+}
+
+/* Read 1E00 */
+
+READ8_MEMBER( supercon_state::supercon_port3_r )
+{
+ int i;
+ UINT8 key_data=0;
+
+ static const char *const status_lines[8] =
+ { "STATUS_1", "STATUS_2", "STATUS_3", "STATUS_4", "STATUS_5", "STATUS_6", "STATUS_7", "STATUS_8" };
+
+ LOG(("Read from %04x \n",0x1E00));
+
+/* remove last bit (only if it was not already set) */
+
+ if ( m_data_1F00 & LED_LINE_AH )
+ {
+ if (m_last_LED_value != m_LED_AH)
+ m_LED_AH=m_LED_AH & ~m_data_1E00;
+ }
+ else if ( m_data_1F00 & LED_LINE_ST)
+ {
+ if (m_last_LED_value != m_LED_ST)
+ m_LED_ST=m_LED_ST & ~m_data_1E00;
+ }
+ else if ( m_data_1F00 & LED_LINE_18 )
+ {
+ if (m_last_LED_value != m_LED_18)
+ m_LED_18=m_LED_18 & ~m_data_1E00;
+ }
+
+
+ LOG(("LED_18 from %02x \n",m_LED_18));
+ LOG(("LED_AH from %02x \n",m_LED_AH));
+ LOG(("LED_ST from %02x \n",m_LED_ST));
+
+ if (m_led_update) /*No LED Update if Port 1C00,1D00 was read */
+ update_leds();
+
+ m_remove_led_flag=TRUE;
+ m_led_update=TRUE;
+
+ m_LED_18=0;
+ m_LED_AH=0;
+ m_LED_ST=0;
+
+
+/* Start */
+
+ if (!m_emu_started)
+ return 0xbf;
+ else
+ m_timer_update_irq->adjust( attotime::zero, 0, attotime::from_hz(598) ); //HACK adjust timer after start ???
+
+
+/* Buttons */
+
+ i=get_first_bit(m_data_1E00);
+ if (i==NOT_VALID)
+ return 0xff;
+
+ key_data=ioport(status_lines[i])->read();
+
+ if (key_data != 0xc0)
+ {
+ LOG(("%s, key_data: %02x \n",status_lines[i],key_data));
+
+/* Button: New Game -> initialize board */
+
+ if (i==0 && key_data==0x80)
+ {
+ set_board();
+ set_pieces();
+
+ m_emu_started=FALSE;
+ }
+
+/* Button: Clear Board -> remove all pieces */
+
+ if (i==3 && key_data==0x80)
+ clear_pieces();
+
+ if (key_data != 0xff )
+ return key_data;
+ }
+
+ return 0xc0;
+}
+
+/* Read Port $1F00 */
+
+READ8_MEMBER( supercon_state::supercon_port4_r )
+{
+ int i_18, i_AH;
+ UINT8 key_data = 0x00;
+
+ static const char *const board_lines[8] =
+ { "BOARD_1", "BOARD_2", "BOARD_3", "BOARD_4", "BOARD_5", "BOARD_6", "BOARD_7", "BOARD_8" };
+
+ LOG(("Read from %04x \n",0x1F00));
+
+/* Board buttons */
+
+ i_18=get_first_bit(m_data_1E00);
+ if (i_18==NOT_VALID)
+ return 0xff;
+
+/* if a button was pressed wait til timer -timer_mouse_click- is fired */
+
+ if (m_selecting)
+ return m_save_key_data;
+ else
+ {
+ set_pieces();
+ output_set_value("MOVING",m_moving_piece);
+ }
+
+ key_data=ioport(board_lines[i_18])->read();
+
+ if (key_data != 0xff)
+ {
+ LOG(("%s key_data: %02x \n",board_lines[i_18],key_data));
+
+/* Only if valid data and mouse button is pressed */
+
+ if (key_data && ioport("BUTTON_L")->read())
+ {
+
+/* Set or remove pieces */
+
+ i_AH=7-get_first_cleared_bit(key_data);
+ LOG(("Press -> AH: %d 18: %d Piece: %d\n",i_AH,i_18,m_board[i_18*8 + i_AH]););
+
+ m_current_field=&m_board[i_18*8 + i_AH];
+
+ if (m_moving_piece)
+ {
+ *m_current_field = m_moving_piece;
+ m_moving_piece = EM;
+ }
+ else
+ {
+ m_moving_piece = *m_current_field;
+ *m_current_field = EM;
+ }
+ m_selecting=TRUE; /* Flag is removed in timer -timer_mouse_click- */
+ m_save_key_data=key_data; /* return same key_data til flag selecting is removed */
+
+ m_timer_mouse_click->adjust(m_wait_time, 0);
+
+ return key_data;
+ }
+ }
+
+ return 0xff;
+}
+
+/* Write Port $1C00 */
+
+WRITE8_MEMBER( supercon_state::supercon_port1_w )
+{
+ LOG(("Write from %04x data: %02x\n",0x1C00,data));
+ m_led_update=FALSE;
+}
+
+/* Write Port $1D00 */
+
+WRITE8_MEMBER( supercon_state::supercon_port2_w )
+{
+ LOG(("Write from %04x data: %02x\n",0x1D00,data));
+ m_led_update=FALSE;
+}
+
+/* Write Port $1E00 */
+
+WRITE8_MEMBER( supercon_state::supercon_port3_w )
+{
+ if (data)
+ LOG(("Write from %04x data: %02x\n",0x1E00,data));
+
+ if (data)
+ {
+ m_data_1E00=data;
+
+/* Set bits for LED's */
+
+ if ( m_data_1F00)
+ {
+
+ if (m_data_1F00 & LED_LINE_AH )
+ {
+ m_last_LED = &m_LED_AH; /* save last value */
+ m_last_LED_value = *m_last_LED;
+
+ m_LED_AH=m_LED_AH | m_data_1E00;
+ }
+ else if (m_data_1F00 & LED_LINE_ST )
+ {
+ m_last_LED = &m_LED_ST;
+ m_last_LED_value = *m_last_LED;
+
+ m_LED_ST=m_LED_ST | m_data_1E00;
+ }
+ else if (m_data_1F00 & LED_LINE_18)
+ {
+ m_last_LED = &m_LED_18;
+ m_last_LED_value = *m_last_LED;
+
+ m_LED_18=m_LED_18 | m_data_1E00;
+ }
+ }
+ }
+}
+
+/* Write Port $1F00 */
+
+WRITE8_MEMBER( supercon_state::supercon_port4_w )
+{
+ if (data)
+ LOG(("Write from %04x data: %02x\n",0x1F00,data));
+
+ if (data)
+ m_data_1F00=data;
+
+/* Bit 7 is set -> Buzzer on */
+
+ if ( m_data_1F00 & 0x80 )
+ {
+ beep_set_state(m_beep, 1);
+ m_emu_started=TRUE;
+ }
+ else
+ beep_set_state(m_beep ,0);
+}
+
+static TIMER_CALLBACK( mouse_click )
+{
+ supercon_state *state = machine.driver_data<supercon_state>();
+
+ if (state->ioport("BUTTON_L")->read_safe(0) ) /* wait for mouse release */
+ state->m_timer_mouse_click->adjust(state->m_wait_time, 0);
+ else
+ state->m_selecting=FALSE;
+}
+
+static TIMER_DEVICE_CALLBACK( update_artwork )
+{
+ mouse_update(timer.machine());
+}
+
+static TIMER_CALLBACK( update_irq )
+{
+ cputag_set_input_line(machine, "maincpu", M6502_IRQ_LINE, ASSERT_LINE);
+ cputag_set_input_line(machine, "maincpu", M6502_IRQ_LINE, CLEAR_LINE);
+}
+
+/* Save state call backs */
+
+static void board_presave(supercon_state *state)
+{
+ int i;
+ for (i=0;i<64;i++)
+ state->m_save_board[i]=state->m_board[i];
+}
+
+static void board_postload(supercon_state *state)
+{
+ int i;
+ for (i=0;i<64;i++)
+ state->m_board[i]=state->m_save_board[i];
+
+ state->set_pieces();
+}
+
+static MACHINE_START( supercon )
+{
+ supercon_state *state = machine.driver_data<supercon_state>();
+ state->m_timer_update_irq = machine.scheduler().timer_alloc(FUNC(update_irq));
+ state->m_timer_update_irq->adjust( attotime::zero, 0, attotime::from_hz(1000) );
+ state->m_timer_mouse_click = machine.scheduler().timer_alloc(FUNC(mouse_click),NULL);
+ state->save_item(NAME(state->m_save_board));
+ machine.save().register_postload(save_prepost_delegate(FUNC(board_postload),state));
+ machine.save().register_presave(save_prepost_delegate(FUNC(board_presave),state));
+}
+
+MACHINE_RESET_MEMBER( supercon_state )
+{
+ set_board();
+ set_pieces();
+ set_border_pieces();
+
+ m_emu_started=FALSE;
+}
+
+/* Address maps */
+
+static ADDRESS_MAP_START(supercon_mem, AS_PROGRAM, 8, supercon_state)
+ AM_RANGE( 0x0000, 0x0fff) AM_RAM
+ AM_RANGE( 0x2000, 0x7fff) AM_ROM
+ AM_RANGE( 0x8000, 0xffff) AM_ROM
+
+ AM_RANGE( 0x1C00, 0x1C00) AM_WRITE ( supercon_port1_w )
+ AM_RANGE( 0x1D00, 0x1D00) AM_WRITE ( supercon_port2_w )
+ AM_RANGE( 0x1E00, 0x1E00) AM_WRITE ( supercon_port3_w )
+ AM_RANGE( 0x1F00, 0x1F00) AM_WRITE ( supercon_port4_w )
+
+ AM_RANGE( 0x1C00, 0x1C00) AM_READ ( supercon_port1_r )
+ AM_RANGE( 0x1D00, 0x1D00) AM_READ ( supercon_port2_r )
+ AM_RANGE( 0x1E00, 0x1E00) AM_READ ( supercon_port3_r )
+ AM_RANGE( 0x1F00, 0x1F00) AM_READ ( supercon_port4_r )
+ADDRESS_MAP_END
+
+/* Input ports */
+
+static INPUT_PORTS_START( supercon )
+ PORT_START("MOUSE_X")
+ PORT_BIT( 0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100)
+
+ PORT_START("MOUSE_Y")
+ PORT_BIT( 0xffff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(100)
+
+ PORT_START("BUTTON_L")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("left button")
+
+ PORT_START("BUTTON_R")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("right button")
+
+ PORT_START("BOARD_1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("BOARD_2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("BOARD_3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("BOARD_4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("BOARD_5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("BOARD_6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("BOARD_7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("BOARD_8")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("STATUS_1")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("STATUS_2")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("STATUS_3")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("STATUS_4")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("STATUS_5")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("STATUS_6")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("STATUS_7")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("STATUS_8")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD)
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD)
+
+ PORT_START("B_WHITE")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+
+ PORT_START("B_BLACK")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+ PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+
+ PORT_START("B_CLR")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD)
+INPUT_PORTS_END
+
+/* Machine driver */
+static MACHINE_CONFIG_START( supercon, supercon_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu",M6502,MAIN_CLOCK)
+ MCFG_CPU_PROGRAM_MAP(supercon_mem)
+
+ MCFG_MACHINE_START( supercon )
+
+ /* video hardware */
+ MCFG_DEFAULT_LAYOUT(layout_supercon)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD(BEEPER_TAG, BEEP, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+
+ MCFG_TIMER_ADD_PERIODIC("artwork_timer", update_artwork, attotime::from_hz(20))
+MACHINE_CONFIG_END
+
+/* ROM definition */
+
+ROM_START(supercon)
+ ROM_REGION(0x10000,"maincpu",0)
+ ROM_LOAD("supercon_low.bin", 0x0000, 0x8000, CRC(b853cf6e) SHA1(1a759072a5023b92c07f1fac01b7a21f7b5b45d0 ))
+ ROM_LOAD("supercon_high.bin", 0x8000, 0x8000, CRC(c8f82331) SHA1(f7fd039f9a3344db9749931490ded9e9e309cfbe ))
+ROM_END
+
+/* Driver */
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
+CONS( 1983, supercon, 0, 0, supercon, supercon, supercon_state, supercon, "Novag", "SuperConstellation", GAME_SUPPORTS_SAVE)