summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2020-06-08 22:16:59 +0200
committer hap <happppp@users.noreply.github.com>2020-06-08 22:17:13 +0200
commit369b87e1c9b161e3f214e14c7c080dd21c8cd3f0 (patch)
tree600bb559a4de93bb01b095413371b7ddf07597b2
parent1ce38c40f73dfff7faa24ed07eeeea62dddc04d0 (diff)
sensorboard: save last board position on exit (nw)
-rw-r--r--src/devices/machine/sensorboard.cpp41
-rw-r--r--src/devices/machine/sensorboard.h10
2 files changed, 36 insertions, 15 deletions
diff --git a/src/devices/machine/sensorboard.cpp b/src/devices/machine/sensorboard.cpp
index 70be6bc34c1..34f713d5c66 100644
--- a/src/devices/machine/sensorboard.cpp
+++ b/src/devices/machine/sensorboard.cpp
@@ -31,7 +31,7 @@ the outputs with output_cb() to avoid collisions.
Usage notes:
-At reset, the board is in its default starting position. RESET button works the
+At startup, the board is in its default starting position. RESET button works the
same way, and holding CTRL while pressing it will rotate the board, eg. for placing
black at the bottom with chess.
@@ -67,6 +67,7 @@ DEFINE_DEVICE_TYPE(SENSORBOARD, sensorboard_device, "sensorboard", "Sensorboard"
sensorboard_device::sensorboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, SENSORBOARD, tag, owner, clock),
+ m_nvram(*this, "position"),
m_out_piece(*this, "piece_%c%u", 0U + 'a', 1U),
m_out_pui(*this, "piece_ui%u", 0U),
m_out_count(*this, "count_ui%u", 0U),
@@ -110,10 +111,6 @@ void sensorboard_device::device_start()
m_out_count.resolve();
}
- clear_board();
- m_custom_init_cb(1);
- memcpy(m_history[0], m_curstate, m_height * m_width);
-
m_undotimer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sensorboard_device::undo_tick),this));
m_sensortimer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sensorboard_device::sensor_off),this));
cancel_sensor();
@@ -129,6 +126,8 @@ void sensorboard_device::device_start()
m_ulast = 0;
m_usize = ARRAY_LENGTH(m_history);
+ m_nvram->set_base(m_curstate, sizeof(m_curstate));
+
// register for savestates
save_item(NAME(m_magnets));
save_item(NAME(m_inductive));
@@ -155,6 +154,18 @@ void sensorboard_device::device_start()
save_item(NAME(m_sensordelay));
}
+void sensorboard_device::nvram_init(nvram_device &nvram, void *data, size_t size)
+{
+ clear_board();
+ m_custom_init_cb(1);
+}
+
+void sensorboard_device::device_add_mconfig(machine_config &config)
+{
+ // 'nvram' is the last board position (m_curstate)
+ NVRAM(config, m_nvram).set_custom_handler(FUNC(sensorboard_device::nvram_init));
+}
+
void sensorboard_device::preset_chess(int state)
{
// set chessboard start position
@@ -191,9 +202,8 @@ void sensorboard_device::device_reset()
{
cancel_sensor();
cancel_hand();
+ undo_reset();
- clear_board();
- m_custom_init_cb(0);
refresh();
}
@@ -531,6 +541,15 @@ TIMER_CALLBACK_MEMBER(sensorboard_device::undo_tick)
m_undotimer->adjust(attotime::from_msec(500), param);
}
+void sensorboard_device::undo_reset()
+{
+ memcpy(m_history[0], m_curstate, m_height * m_width);
+
+ m_upointer = 0;
+ m_ufirst = 0;
+ m_ulast = 0;
+}
+
INPUT_CHANGED_MEMBER(sensorboard_device::ui_undo)
{
u8 select = (u8)param;
@@ -571,13 +590,7 @@ INPUT_CHANGED_MEMBER(sensorboard_device::ui_init)
// reset undo
if (m_inp_ui->read() & 1)
- {
- memcpy(m_history[0], m_curstate, m_height * m_width);
-
- m_upointer = 0;
- m_ufirst = 0;
- m_ulast = 0;
- }
+ undo_reset();
refresh();
}
diff --git a/src/devices/machine/sensorboard.h b/src/devices/machine/sensorboard.h
index d950b2041ac..fcaea539163 100644
--- a/src/devices/machine/sensorboard.h
+++ b/src/devices/machine/sensorboard.h
@@ -11,6 +11,9 @@
#pragma once
+#include "machine/nvram.h"
+
+
class sensorboard_device : public device_t
{
public:
@@ -50,7 +53,7 @@ public:
// handle board state
u8 read_piece(u8 x, u8 y) { return m_curstate[y * m_width + x]; }
void write_piece(u8 x, u8 y, u8 id) { m_curstate[y * m_width + x] = id; }
- void clear_board() { memset(m_curstate, 0, ARRAY_LENGTH(m_curstate)); }
+ void clear_board() { memset(m_curstate, 0, sizeof(m_curstate)); }
void refresh();
void cancel_sensor();
@@ -77,11 +80,13 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
virtual void device_post_load() override { refresh(); }
virtual ioport_constructor device_input_ports() const override;
private:
+ required_device<nvram_device> m_nvram;
output_finder<0x10, 0x10> m_out_piece;
output_finder<0x20+1> m_out_pui;
output_finder<2> m_out_count;
@@ -118,8 +123,11 @@ private:
u32 m_ulast;
u32 m_usize;
+ void nvram_init(nvram_device &nvram, void *data, size_t size);
+
emu_timer *m_undotimer;
TIMER_CALLBACK_MEMBER(undo_tick);
+ void undo_reset();
attotime m_sensordelay;
emu_timer *m_sensortimer;