mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
ecbackg: add custom sensorboard handling
This commit is contained in:
parent
cc7db139c2
commit
8eaf308e15
@ -78,6 +78,7 @@ sensorboard_device::sensorboard_device(const machine_config &mconfig, const char
|
|||||||
m_inp_conf(*this, "CONF"),
|
m_inp_conf(*this, "CONF"),
|
||||||
m_clear_cb(*this),
|
m_clear_cb(*this),
|
||||||
m_init_cb(*this),
|
m_init_cb(*this),
|
||||||
|
m_remove_cb(*this, 0),
|
||||||
m_sensor_cb(*this, 0),
|
m_sensor_cb(*this, 0),
|
||||||
m_spawn_cb(*this, 0),
|
m_spawn_cb(*this, 0),
|
||||||
m_output_cb(*this)
|
m_output_cb(*this)
|
||||||
@ -477,13 +478,15 @@ INPUT_CHANGED_MEMBER(sensorboard_device::sensor)
|
|||||||
m_sensortimer->adjust(m_sensordelay);
|
m_sensortimer->adjust(m_sensordelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool drop = m_hand != 0;
|
||||||
|
|
||||||
// optional custom handling:
|
// optional custom handling:
|
||||||
// return d0 = block drop piece
|
// return d0 = block drop piece
|
||||||
// return d1 = block pick up piece
|
// return d1 = block pick up piece
|
||||||
u8 custom = m_sensor_cb(pos);
|
u8 custom = m_sensor_cb(pos);
|
||||||
|
|
||||||
// drop piece
|
// drop piece
|
||||||
if (m_hand != 0)
|
if (drop)
|
||||||
{
|
{
|
||||||
if (~custom & 1)
|
if (~custom & 1)
|
||||||
drop_piece(x, y);
|
drop_piece(x, y);
|
||||||
@ -519,7 +522,12 @@ INPUT_CHANGED_MEMBER(sensorboard_device::ui_hand)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
cancel_sensor();
|
cancel_sensor();
|
||||||
remove_hand();
|
|
||||||
|
// optional custom handling:
|
||||||
|
// return d0: block remove hand
|
||||||
|
if (~m_remove_cb() & 1)
|
||||||
|
remove_hand();
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ public:
|
|||||||
|
|
||||||
auto clear_cb() { return m_clear_cb.bind(); } // 0 = internal clear, 1 = user presses clear
|
auto clear_cb() { return m_clear_cb.bind(); } // 0 = internal clear, 1 = user presses clear
|
||||||
auto init_cb() { return m_init_cb.bind(); } // for setting pieces starting position
|
auto init_cb() { return m_init_cb.bind(); } // for setting pieces starting position
|
||||||
|
auto remove_cb() { return m_remove_cb.bind(); } // user removes piece from hand
|
||||||
auto sensor_cb() { return m_sensor_cb.bind(); } // x = offset & 0xf, y = offset >> 4 & 0xf
|
auto sensor_cb() { return m_sensor_cb.bind(); } // x = offset & 0xf, y = offset >> 4 & 0xf
|
||||||
auto spawn_cb() { return m_spawn_cb.bind(); } // spawnpoint/piece = offset, retval = new piece id
|
auto spawn_cb() { return m_spawn_cb.bind(); } // spawnpoint/piece = offset, retval = new piece id
|
||||||
auto output_cb() { return m_output_cb.bind(); } // pos = offset(A8 for ui/board, A9 for count), id = data
|
auto output_cb() { return m_output_cb.bind(); } // pos = offset(A8 for ui/board, A9 for count), id = data
|
||||||
@ -60,7 +61,10 @@ public:
|
|||||||
// handle pieces
|
// handle pieces
|
||||||
void cancel_hand();
|
void cancel_hand();
|
||||||
void remove_hand();
|
void remove_hand();
|
||||||
|
u8 get_hand() { return m_hand; }
|
||||||
|
void set_hand(u8 hand) { m_hand = hand; }
|
||||||
int get_handpos() { return m_handpos; }
|
int get_handpos() { return m_handpos; }
|
||||||
|
void set_handpos(int pos) { m_handpos = pos; }
|
||||||
bool drop_piece(u8 x, u8 y);
|
bool drop_piece(u8 x, u8 y);
|
||||||
bool pickup_piece(u8 x, u8 y);
|
bool pickup_piece(u8 x, u8 y);
|
||||||
|
|
||||||
@ -102,6 +106,7 @@ private:
|
|||||||
|
|
||||||
devcb_write_line m_clear_cb;
|
devcb_write_line m_clear_cb;
|
||||||
devcb_write_line m_init_cb;
|
devcb_write_line m_init_cb;
|
||||||
|
devcb_read8 m_remove_cb;
|
||||||
devcb_read8 m_sensor_cb;
|
devcb_read8 m_sensor_cb;
|
||||||
devcb_read8 m_spawn_cb;
|
devcb_read8 m_spawn_cb;
|
||||||
devcb_write16 m_output_cb;
|
devcb_write16 m_output_cb;
|
||||||
|
@ -16,7 +16,7 @@ Hardware notes:
|
|||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- if/when MAME supports an exit callback, hook up power-off switch to that
|
- if/when MAME supports an exit callback, hook up power-off switch to that
|
||||||
- finish sensorboard handling, internal artwork
|
- finish internal artwork
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
@ -51,6 +51,7 @@ public:
|
|||||||
|
|
||||||
void ecbackg(machine_config &config);
|
void ecbackg(machine_config &config);
|
||||||
|
|
||||||
|
DECLARE_INPUT_CHANGED_MEMBER(init_board);
|
||||||
DECLARE_INPUT_CHANGED_MEMBER(power_off) { if (newval) m_power = false; }
|
DECLARE_INPUT_CHANGED_MEMBER(power_off) { if (newval) m_power = false; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -73,7 +74,13 @@ private:
|
|||||||
u8 m_lcd_com = 0;
|
u8 m_lcd_com = 0;
|
||||||
|
|
||||||
// I/O handlers
|
// I/O handlers
|
||||||
void init_board(int state);
|
void init_backgammon();
|
||||||
|
void init_jacquet();
|
||||||
|
void init_plakoto();
|
||||||
|
void reset_board(int state);
|
||||||
|
u8 spawn_piece(offs_t offset);
|
||||||
|
u8 remove_piece();
|
||||||
|
u8 move_piece(offs_t offset);
|
||||||
u8 board_r(u8 row);
|
u8 board_r(u8 row);
|
||||||
|
|
||||||
void standby(int state);
|
void standby(int state);
|
||||||
@ -106,8 +113,172 @@ void ecbackg_state::machine_start()
|
|||||||
Sensorboard
|
Sensorboard
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
void ecbackg_state::init_board(int state)
|
void ecbackg_state::init_backgammon()
|
||||||
{
|
{
|
||||||
|
// initial position for Backgammon (default)
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
m_board->write_piece(6, i, 1);
|
||||||
|
m_board->write_piece(0, i, 4);
|
||||||
|
m_board->write_piece(0, 9 - i, 1);
|
||||||
|
m_board->write_piece(6, 9 - i, 4);
|
||||||
|
|
||||||
|
if (i < 3)
|
||||||
|
{
|
||||||
|
m_board->write_piece(4, i, 1);
|
||||||
|
m_board->write_piece(4, 9 - i, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < 2)
|
||||||
|
{
|
||||||
|
m_board->write_piece(11, 9 - i, 1);
|
||||||
|
m_board->write_piece(11, i, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ecbackg_state::init_jacquet()
|
||||||
|
{
|
||||||
|
// initial position for Jacquet / Trictrac / Moultezim
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
m_board->write_piece(11, 9 - i, 3);
|
||||||
|
m_board->write_piece(0, i, 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ecbackg_state::init_plakoto()
|
||||||
|
{
|
||||||
|
// initial position for Plakoto
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
m_board->write_piece(11, 9 - i, 3);
|
||||||
|
m_board->write_piece(11, i, 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_CHANGED_MEMBER(ecbackg_state::init_board)
|
||||||
|
{
|
||||||
|
if (!newval)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_board->cancel_sensor();
|
||||||
|
m_board->cancel_hand();
|
||||||
|
m_board->clear_board();
|
||||||
|
|
||||||
|
// 3 possible initial board positions
|
||||||
|
switch (param)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
init_backgammon();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
init_jacquet();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
init_plakoto();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_board->refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ecbackg_state::reset_board(int state)
|
||||||
|
{
|
||||||
|
if (!state)
|
||||||
|
init_backgammon();
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 ecbackg_state::spawn_piece(offs_t offset)
|
||||||
|
{
|
||||||
|
return (offset == 1) ? 1 : 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 ecbackg_state::remove_piece()
|
||||||
|
{
|
||||||
|
int handpos = m_board->get_handpos();
|
||||||
|
u8 x = handpos & 0xf;
|
||||||
|
u8 y = handpos >> 4 & 0xf;
|
||||||
|
|
||||||
|
if (handpos == -1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
u8 piece = m_board->read_piece(x, y);
|
||||||
|
m_board->remove_hand();
|
||||||
|
|
||||||
|
// decrement piece
|
||||||
|
if (piece != 1 && piece != 4)
|
||||||
|
m_board->write_piece(x, y, piece - 1);
|
||||||
|
|
||||||
|
// block default sensorboard handling
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 ecbackg_state::move_piece(offs_t offset)
|
||||||
|
{
|
||||||
|
u8 x = offset & 0xf;
|
||||||
|
u8 y = offset >> 4 & 0xf;
|
||||||
|
u8 piece = m_board->read_piece(x, y);
|
||||||
|
|
||||||
|
u8 hand = m_board->get_hand();
|
||||||
|
|
||||||
|
// drop piece
|
||||||
|
if (hand != 0)
|
||||||
|
{
|
||||||
|
// drop piece on same spot
|
||||||
|
if (offset == m_board->get_handpos())
|
||||||
|
{
|
||||||
|
m_board->cancel_hand();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (piece != 0)
|
||||||
|
{
|
||||||
|
u8 piece_color = (piece < 4) ? 1 : 4;
|
||||||
|
u8 piece_index = piece - piece_color;
|
||||||
|
|
||||||
|
// invalid drop (overflow, or onto a stack of the opposite color)
|
||||||
|
if (piece_index == 2 || ((hand != piece_color) && piece_index == 1))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
remove_piece();
|
||||||
|
|
||||||
|
// swap piece (blot)
|
||||||
|
if ((hand != piece_color) && piece_index == 0)
|
||||||
|
{
|
||||||
|
m_board->write_piece(x, y, hand);
|
||||||
|
m_board->set_hand(piece_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
// increment piece
|
||||||
|
else
|
||||||
|
m_board->write_piece(x, y, piece + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// drop piece on empty spot
|
||||||
|
remove_piece();
|
||||||
|
m_board->write_piece(x, y, hand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// pick up piece
|
||||||
|
else if (piece != 0)
|
||||||
|
{
|
||||||
|
// white or black piece
|
||||||
|
piece = (piece < 4) ? 1 : 4;
|
||||||
|
|
||||||
|
m_board->set_hand(piece);
|
||||||
|
m_board->set_handpos(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
// block default sensorboard handling
|
||||||
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 ecbackg_state::board_r(u8 row)
|
u8 ecbackg_state::board_r(u8 row)
|
||||||
@ -273,6 +444,11 @@ static INPUT_PORTS_START( ecbackg )
|
|||||||
|
|
||||||
PORT_START("POWER") // needs to be triggered for nvram to work
|
PORT_START("POWER") // needs to be triggered for nvram to work
|
||||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, ecbackg_state, power_off, 0) PORT_NAME("Stop")
|
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, ecbackg_state, power_off, 0) PORT_NAME("Stop")
|
||||||
|
|
||||||
|
PORT_START("BOARD")
|
||||||
|
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, ecbackg_state, init_board, 0) PORT_NAME("Board Reset Backgammon")
|
||||||
|
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, ecbackg_state, init_board, 1) PORT_NAME("Board Reset Jacquet")
|
||||||
|
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, ecbackg_state, init_board, 2) PORT_NAME("Board Reset Plakoto")
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
@ -298,9 +474,13 @@ void ecbackg_state::ecbackg(machine_config &config)
|
|||||||
m_maincpu->out_p7_cb().set(FUNC(ecbackg_state::lcd_com_w));
|
m_maincpu->out_p7_cb().set(FUNC(ecbackg_state::lcd_com_w));
|
||||||
|
|
||||||
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
|
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
|
||||||
m_board->init_cb().set(FUNC(ecbackg_state::init_board));
|
m_board->init_cb().set(FUNC(ecbackg_state::reset_board));
|
||||||
|
m_board->spawn_cb().set(FUNC(ecbackg_state::spawn_piece));
|
||||||
|
m_board->remove_cb().set(FUNC(ecbackg_state::remove_piece));
|
||||||
|
m_board->sensor_cb().set(FUNC(ecbackg_state::move_piece));
|
||||||
m_board->set_size(13, 10);
|
m_board->set_size(13, 10);
|
||||||
m_board->set_spawnpoints(2);
|
m_board->set_spawnpoints(2);
|
||||||
|
m_board->set_max_id(6);
|
||||||
m_board->set_delay(attotime::from_msec(150));
|
m_board->set_delay(attotime::from_msec(150));
|
||||||
m_board->set_nvram_enable(true);
|
m_board->set_nvram_enable(true);
|
||||||
|
|
||||||
@ -310,7 +490,7 @@ void ecbackg_state::ecbackg(machine_config &config)
|
|||||||
|
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
|
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
|
||||||
screen.set_refresh_hz(60);
|
screen.set_refresh_hz(60);
|
||||||
screen.set_size(1920/3, 518/3);
|
screen.set_size(1920/5, 518/5);
|
||||||
screen.set_visarea_full();
|
screen.set_visarea_full();
|
||||||
|
|
||||||
PWM_DISPLAY(config, m_led_pwm).set_size(3, 8);
|
PWM_DISPLAY(config, m_led_pwm).set_size(3, 8);
|
||||||
|
Loading…
Reference in New Issue
Block a user