summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2020-06-09 11:19:59 +0200
committer hap <happppp@users.noreply.github.com>2020-06-09 11:20:23 +0200
commit994f468b22bb4f19b87bc3d0bf1758ab9f9e64d9 (patch)
tree8cc277eb1d654575c1fb534b9b580bab2caabc42
parent11723fc8a30d3d5cdda56ac3d4cd05d352d63a69 (diff)
nvram: don't save 0byte file (nw)
-rw-r--r--src/devices/machine/nvram.h1
-rw-r--r--src/devices/machine/rp5c01.h1
-rw-r--r--src/devices/machine/sensorboard.cpp42
-rw-r--r--src/devices/machine/sensorboard.h17
-rw-r--r--src/emu/dinvram.h2
-rw-r--r--src/emu/machine.cpp11
6 files changed, 46 insertions, 28 deletions
diff --git a/src/devices/machine/nvram.h b/src/devices/machine/nvram.h
index a25cc665988..6f575d998d2 100644
--- a/src/devices/machine/nvram.h
+++ b/src/devices/machine/nvram.h
@@ -57,6 +57,7 @@ protected:
virtual void nvram_default() override;
virtual void nvram_read(emu_file &file) override;
virtual void nvram_write(emu_file &file) override;
+ virtual bool nvram_pre_write() override { return m_base && m_length; }
// internal helpers
void determine_final_base();
diff --git a/src/devices/machine/rp5c01.h b/src/devices/machine/rp5c01.h
index a638d5df145..1a78b8d2c1f 100644
--- a/src/devices/machine/rp5c01.h
+++ b/src/devices/machine/rp5c01.h
@@ -65,6 +65,7 @@ protected:
virtual void nvram_default() override;
virtual void nvram_read(emu_file &file) override;
virtual void nvram_write(emu_file &file) override;
+ virtual bool nvram_pre_write() override { return m_battery_backed; }
private:
inline void set_alarm_line();
diff --git a/src/devices/machine/sensorboard.cpp b/src/devices/machine/sensorboard.cpp
index 27c16277448..17996dcddd9 100644
--- a/src/devices/machine/sensorboard.cpp
+++ b/src/devices/machine/sensorboard.cpp
@@ -67,7 +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"),
+ device_nvram_interface(mconfig, *this),
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),
@@ -127,8 +127,6 @@ 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,18 +153,6 @@ 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
@@ -214,6 +200,32 @@ void sensorboard_device::device_reset()
}
+//-------------------------------------------------
+// device_nvram_interface overrides
+//-------------------------------------------------
+
+void sensorboard_device::nvram_default()
+{
+ clear_board();
+ m_custom_init_cb(1);
+}
+
+void sensorboard_device::nvram_read(emu_file &file)
+{
+ file.read(m_curstate, sizeof(m_curstate));
+}
+
+void sensorboard_device::nvram_write(emu_file &file)
+{
+ file.write(m_curstate, sizeof(m_curstate));
+}
+
+bool sensorboard_device::nvram_pre_write()
+{
+ return m_nvram_on;
+}
+
+
//-------------------------------------------------
// public handlers
diff --git a/src/devices/machine/sensorboard.h b/src/devices/machine/sensorboard.h
index 08359725247..21ff547201d 100644
--- a/src/devices/machine/sensorboard.h
+++ b/src/devices/machine/sensorboard.h
@@ -11,10 +11,7 @@
#pragma once
-#include "machine/nvram.h"
-
-
-class sensorboard_device : public device_t
+class sensorboard_device : public device_t, public device_nvram_interface
{
public:
sensorboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
@@ -81,13 +78,17 @@ 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;
+ // device_nvram_interface overrides
+ virtual void nvram_default() override;
+ virtual void nvram_read(emu_file &file) override;
+ virtual void nvram_write(emu_file &file) override;
+ virtual bool nvram_pre_write() 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;
@@ -114,6 +115,7 @@ private:
int m_droppos;
int m_sensorpos;
u8 m_ui_enabled;
+ bool m_nvram_on;
u8 m_curstate[0x100];
u8 m_history[1000][0x100];
@@ -124,9 +126,6 @@ private:
u32 m_ulast;
u32 m_usize;
- void nvram_init(nvram_device &nvram, void *data, size_t size);
- bool m_nvram_on;
-
emu_timer *m_undotimer;
TIMER_CALLBACK_MEMBER(undo_tick);
void undo_reset();
diff --git a/src/emu/dinvram.h b/src/emu/dinvram.h
index d48889d29dd..3e5dab4898c 100644
--- a/src/emu/dinvram.h
+++ b/src/emu/dinvram.h
@@ -37,12 +37,14 @@ public:
void nvram_reset() { nvram_default(); }
void nvram_load(emu_file &file) { nvram_read(file); }
void nvram_save(emu_file &file) { nvram_write(file); }
+ bool nvram_pre_save() { return nvram_pre_write(); }
protected:
// derived class overrides
virtual void nvram_default() = 0;
virtual void nvram_read(emu_file &file) = 0;
virtual void nvram_write(emu_file &file) = 0;
+ virtual bool nvram_pre_write() { return true; }
};
// iterator
diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp
index 8955446ec3c..1c8b3c269d5 100644
--- a/src/emu/machine.cpp
+++ b/src/emu/machine.cpp
@@ -1203,11 +1203,14 @@ void running_machine::nvram_save()
{
for (device_nvram_interface &nvram : nvram_interface_iterator(root_device()))
{
- emu_file file(options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(nvram_filename(nvram.device())) == osd_file::error::NONE)
+ if (nvram.nvram_pre_save())
{
- nvram.nvram_save(file);
- file.close();
+ emu_file file(options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
+ if (file.open(nvram_filename(nvram.device())) == osd_file::error::NONE)
+ {
+ nvram.nvram_save(file);
+ file.close();
+ }
}
}
}