diff options
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 |
commit | 369b87e1c9b161e3f214e14c7c080dd21c8cd3f0 (patch) | |
tree | 600bb559a4de93bb01b095413371b7ddf07597b2 | |
parent | 1ce38c40f73dfff7faa24ed07eeeea62dddc04d0 (diff) |
sensorboard: save last board position on exit (nw)
-rw-r--r-- | src/devices/machine/sensorboard.cpp | 41 | ||||
-rw-r--r-- | src/devices/machine/sensorboard.h | 10 |
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; |