From 994f468b22bb4f19b87bc3d0bf1758ab9f9e64d9 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 9 Jun 2020 11:19:59 +0200 Subject: nvram: don't save 0byte file (nw) --- src/devices/machine/nvram.h | 1 + src/devices/machine/rp5c01.h | 1 + src/devices/machine/sensorboard.cpp | 42 ++++++++++++++++++++++++------------- src/devices/machine/sensorboard.h | 17 +++++++-------- src/emu/dinvram.h | 2 ++ src/emu/machine.cpp | 11 ++++++---- 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 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(); + } } } } -- cgit v1.2.3