summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2021-04-14 14:05:19 -0700
committer Aaron Giles <aaron@aarongiles.com>2021-04-14 14:05:19 -0700
commit98e8ed32043d8d47fe63b6565c452dc61182fd02 (patch)
tree1a2cc7981d4b015bd6b7740e4f3c9c489e96ee57
parent90c5a29f41bb7402cf180c4f852e4e9d7aabffd1 (diff)
Remove final cases where people directly registered state data with the core manager. Fixed array stride calculations in registration. Removed old registration mechanism entirely.
-rw-r--r--src/devices/bus/gba/rom.cpp89
-rw-r--r--src/devices/bus/gba/rom.h29
-rw-r--r--src/devices/bus/megadrive/stm95.cpp7
-rw-r--r--src/devices/bus/megadrive/stm95.h12
-rw-r--r--src/devices/bus/snes/bsx.cpp44
-rw-r--r--src/devices/bus/snes/bsx.h10
-rw-r--r--src/devices/bus/snes/spc7110.cpp152
-rw-r--r--src/devices/bus/snes/spc7110.h47
-rw-r--r--src/emu/device.h14
-rw-r--r--src/emu/emu.h2
-rw-r--r--src/emu/emumem.cpp18
-rw-r--r--src/emu/emumem.h8
-rw-r--r--src/emu/emumem_mview.cpp5
-rw-r--r--src/emu/output.cpp6
-rw-r--r--src/emu/save.cpp33
-rw-r--r--src/emu/save.h198
-rw-r--r--src/emu/schedule.cpp18
-rw-r--r--src/emu/schedule.h3
-rw-r--r--src/mame/drivers/gaelco3d.cpp16
-rw-r--r--src/mame/includes/gaelco3d.h31
-rw-r--r--src/mame/video/gaelco3d.cpp14
21 files changed, 330 insertions, 426 deletions
diff --git a/src/devices/bus/gba/rom.cpp b/src/devices/bus/gba/rom.cpp
index 643432b8433..fa6162a5a06 100644
--- a/src/devices/bus/gba/rom.cpp
+++ b/src/devices/bus/gba/rom.cpp
@@ -149,9 +149,13 @@ gba_rom_3dmatrix_device::gba_rom_3dmatrix_device(const machine_config &mconfig,
void gba_rom_device::device_start()
{
- save_item(NAME(m_gpio_regs));
- save_item(NAME(m_gpio_write_only));
- save_item(NAME(m_gpio_dirs));
+}
+
+void gba_rom_device::device_register_save(save_registrar &save)
+{
+ save.reg(NAME(m_gpio_regs))
+ .reg(NAME(m_gpio_write_only))
+ .reg(NAME(m_gpio_dirs));
}
void gba_rom_device::device_reset()
@@ -174,8 +178,13 @@ void gba_rom_wariotws_device::device_start()
{
gba_rom_device::device_start();
m_rumble.resolve();
- save_item(NAME(m_last_val));
- save_item(NAME(m_counter));
+}
+
+void gba_rom_wariotws_device::device_register_save(save_registrar &save)
+{
+ gba_rom_sram_device::device_register_save(save);
+ save.reg(NAME(m_last_val))
+ .reg(NAME(m_counter));
}
void gba_rom_wariotws_device::device_reset()
@@ -204,12 +213,23 @@ void gba_rom_eeprom_device::device_start()
m_eeprom = std::make_unique<gba_eeprom_device>(machine(), (uint8_t*)get_nvram_base(), get_nvram_size(), 6);
}
+void gba_rom_eeprom_device::device_register_save(save_registrar &save)
+{
+ gba_rom_device::device_register_save(save);
+ save.reg(NAME(m_eeprom));
+}
+
void gba_rom_yoshiug_device::device_start()
{
gba_rom_eeprom_device::device_start();
- save_item(NAME(m_tilt_ready));
- save_item(NAME(m_xpos));
- save_item(NAME(m_ypos));
+}
+
+void gba_rom_yoshiug_device::device_register_save(save_registrar &save)
+{
+ gba_rom_eeprom_device::device_register_save(save);
+ save.reg(NAME(m_tilt_ready))
+ .reg(NAME(m_xpos))
+ .reg(NAME(m_ypos));
}
void gba_rom_yoshiug_device::device_reset()
@@ -227,13 +247,24 @@ void gba_rom_eeprom64_device::device_start()
m_eeprom = std::make_unique<gba_eeprom_device>(machine(), (uint8_t*)get_nvram_base(), get_nvram_size(), 14);
}
+void gba_rom_eeprom64_device::device_register_save(save_registrar &save)
+{
+ gba_rom_device::device_register_save(save);
+ save.reg(NAME(m_eeprom));
+}
+
void gba_rom_boktai_device::device_start()
{
gba_rom_eeprom64_device::device_start();
m_rtc = std::make_unique<gba_s3511_device>(machine());
+}
- save_item(NAME(m_last_val));
- save_item(NAME(m_counter));
+void gba_rom_boktai_device::device_register_save(save_registrar &save)
+{
+ gba_rom_eeprom64_device::device_register_save(save);
+ save.reg(NAME(m_rtc))
+ .reg(NAME(m_last_val))
+ .reg(NAME(m_counter));
}
void gba_rom_boktai_device::device_reset()
@@ -248,18 +279,36 @@ void gba_rom_flash_rtc_device::device_start()
m_rtc = std::make_unique<gba_s3511_device>(machine());
}
+void gba_rom_flash_rtc_device::device_register_save(save_registrar &save)
+{
+ gba_rom_flash_device::device_register_save(save);
+ save.reg(NAME(m_rtc));
+}
+
+
void gba_rom_flash1m_rtc_device::device_start()
{
gba_rom_device::device_start();
m_rtc = std::make_unique<gba_s3511_device>(machine());
}
+void gba_rom_flash1m_rtc_device::device_register_save(save_registrar &save)
+{
+ gba_rom_flash1m_device::device_register_save(save);
+ save.reg(NAME(m_rtc));
+}
+
void gba_rom_3dmatrix_device::device_start()
{
gba_rom_device::device_start();
- save_item(NAME(m_src));
- save_item(NAME(m_dst));
- save_item(NAME(m_nblock));
+}
+
+void gba_rom_3dmatrix_device::device_register_save(save_registrar &save)
+{
+ gba_rom_device::device_register_save(save);
+ save.reg(NAME(m_src))
+ .reg(NAME(m_dst))
+ .reg(NAME(m_nblock));
}
void gba_rom_3dmatrix_device::device_reset()
@@ -797,13 +846,6 @@ gba_s3511_device::gba_s3511_device(running_machine &machine) :
m_command = 0;
m_data_len = 1;
m_data[0] = 0;
-
- m_machine.save().save_item(m_phase, "GBA_RTC/m_phase");
- m_machine.save().save_item(m_data, "GBA_RTC/m_data");
- m_machine.save().save_item(m_last_val, "GBA_RTC/m_last_val");
- m_machine.save().save_item(m_bits, "GBA_RTC/m_bits");
- m_machine.save().save_item(m_command, "GBA_RTC/m_command");
- m_machine.save().save_item(m_data_len, "GBA_RTC/m_data_len");
}
@@ -962,13 +1004,6 @@ gba_eeprom_device::gba_eeprom_device(running_machine &machine, uint8_t *eeprom,
m_data = eeprom;
m_data_size = size;
m_addr_bits = addr_bits;
-
- m_machine.save().save_item(m_state, "GBA_EEPROM/m_state");
- m_machine.save().save_item(m_command, "GBA_EEPROM/m_command");
- m_machine.save().save_item(m_count, "GBA_EEPROM/m_count");
- m_machine.save().save_item(m_addr, "GBA_EEPROM/m_addr");
- m_machine.save().save_item(m_bits, "GBA_EEPROM/m_bits");
- m_machine.save().save_item(m_eep_data, "GBA_EEPROM/m_eep_data");
}
uint32_t gba_eeprom_device::read()
diff --git a/src/devices/bus/gba/rom.h b/src/devices/bus/gba/rom.h
index 3a1ac4005a1..d817087e0a7 100644
--- a/src/devices/bus/gba/rom.h
+++ b/src/devices/bus/gba/rom.h
@@ -22,6 +22,16 @@ public:
int read_line();
void write(uint16_t data, int gpio_dirs);
+ void register_save(save_registrar &save)
+ {
+ save.reg(NAME(m_phase))
+ .reg(NAME(m_data))
+ .reg(NAME(m_last_val))
+ .reg(NAME(m_bits))
+ .reg(NAME(m_command))
+ .reg(NAME(m_data_len));
+ }
+
protected:
enum
{
@@ -53,6 +63,16 @@ public:
uint32_t read();
void write(uint32_t data);
+ void register_save(save_registrar &save)
+ {
+ save.reg(NAME(m_state))
+ .reg(NAME(m_command))
+ .reg(NAME(m_count))
+ .reg(NAME(m_addr))
+ .reg(NAME(m_bits))
+ .reg(NAME(m_eep_data));
+ }
+
protected:
enum
{
@@ -104,6 +124,7 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
virtual void device_reset() override;
private:
@@ -163,6 +184,7 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
virtual void device_reset() override;
private:
@@ -214,6 +236,7 @@ public:
protected:
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
private:
std::unique_ptr<gba_s3511_device> m_rtc;
@@ -260,6 +283,7 @@ public:
protected:
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
private:
std::unique_ptr<gba_s3511_device> m_rtc;
@@ -283,6 +307,7 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
private:
std::unique_ptr<gba_eeprom_device> m_eeprom;
@@ -306,6 +331,7 @@ public:
protected:
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
virtual void device_reset() override;
private:
@@ -333,6 +359,7 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
std::unique_ptr<gba_eeprom_device> m_eeprom;
};
@@ -354,6 +381,7 @@ public:
private:
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
virtual void device_reset() override;
std::unique_ptr<gba_s3511_device> m_rtc;
@@ -377,6 +405,7 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
virtual void device_reset() override;
private:
diff --git a/src/devices/bus/megadrive/stm95.cpp b/src/devices/bus/megadrive/stm95.cpp
index e3fca0bbffe..21b729991a6 100644
--- a/src/devices/bus/megadrive/stm95.cpp
+++ b/src/devices/bus/megadrive/stm95.cpp
@@ -21,13 +21,6 @@ stm95_eeprom_device::stm95_eeprom_device(running_machine &machine, uint8_t *eepr
m_machine(machine)
{
eeprom_data = eeprom;
- m_machine.save().save_item(latch, "STM95/latch");
- m_machine.save().save_item(reset_line, "STM95/reset_line");
- m_machine.save().save_item(sck_line, "STM95/sck_line");
- m_machine.save().save_item(WEL, "STM95/WEL");
- m_machine.save().save_item(stream_pos, "STM95/stream_pos");
- m_machine.save().save_item(stream_data, "STM95/stream_data");
- m_machine.save().save_item(eeprom_addr, "STM95/eeprom_addr");
}
void stm95_eeprom_device::set_cs_line(int state)
diff --git a/src/devices/bus/megadrive/stm95.h b/src/devices/bus/megadrive/stm95.h
index c04651d742c..efb9e467492 100644
--- a/src/devices/bus/megadrive/stm95.h
+++ b/src/devices/bus/megadrive/stm95.h
@@ -29,6 +29,17 @@ public:
void set_sck_line(int state);
int get_so_line(void);
+ void register_save(save_registrar &save)
+ {
+ save.reg(NAME(latch))
+ .reg(NAME(reset_line))
+ .reg(NAME(sck_line))
+ .reg(NAME(WEL))
+ .reg(NAME(stream_pos))
+ .reg(NAME(stream_data))
+ .reg(NAME(eeprom_addr));
+ }
+
protected:
enum STMSTATE
{
@@ -73,6 +84,7 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override { save.reg(NAME(m_stm95)); }
virtual void device_reset() override;
private:
diff --git a/src/devices/bus/snes/bsx.cpp b/src/devices/bus/snes/bsx.cpp
index 6aacaa3ed2c..b61ff480a32 100644
--- a/src/devices/bus/snes/bsx.cpp
+++ b/src/devices/bus/snes/bsx.cpp
@@ -70,15 +70,21 @@ void sns_rom_bsx_device::device_start()
m_cart_regs[7] = 0x80;
m_cart_regs[8] = 0x80;
access_update();
+}
+
+void sns_rom_bsx_device::device_register_save(save_registrar &save)
+{
+ sns_rom_device::device_register_save(save);
- save_item(NAME(m_cart_regs));
- save_item(NAME(access_00_1f));
- save_item(NAME(access_80_9f));
- save_item(NAME(access_40_4f));
- save_item(NAME(access_50_5f));
- save_item(NAME(access_60_6f));
- save_item(NAME(rom_access));
- save_item(NAME(m_pram));
+ save.reg(NAME(m_base_unit))
+ .reg(NAME(m_cart_regs))
+ .reg(NAME(access_00_1f))
+ .reg(NAME(access_80_9f))
+ .reg(NAME(access_40_4f))
+ .reg(NAME(access_50_5f))
+ .reg(NAME(access_60_6f))
+ .reg(NAME(rom_access))
+ .reg(NAME(m_pram));
}
void sns_rom_bsx_device::device_reset()
@@ -96,12 +102,18 @@ void sns_rom_bsxhi_device::device_start()
void sns_rom_bsmempak_device::device_start()
{
- save_item(NAME(m_command));
- save_item(NAME(m_write_old));
- save_item(NAME(m_write_new));
- save_item(NAME(m_flash_enable));
- save_item(NAME(m_read_enable));
- save_item(NAME(m_write_enable));
+}
+
+void sns_rom_bsmempak_device::device_register_save(save_registrar &save)
+{
+ sns_rom_device::device_register_save(save);
+
+ save.reg(NAME(m_command))
+ .reg(NAME(m_write_old))
+ .reg(NAME(m_write_new))
+ .reg(NAME(m_flash_enable))
+ .reg(NAME(m_read_enable))
+ .reg(NAME(m_write_enable));
}
void sns_rom_bsmempak_device::device_reset()
@@ -122,10 +134,6 @@ void sns_rom_bsmempak_device::device_reset()
sns_rom_bsx_device::bsx_base::bsx_base(running_machine &machine)
: r2192_minute(0), m_machine(machine)
{
- m_machine.save().save_item(regs, "SNES_BSX/regs");
- m_machine.save().save_item(r2192_counter, "SNES_BSX/r2192_counter");
- m_machine.save().save_item(r2192_hour, "SNES_BSX/r2192_hour");
- m_machine.save().save_item(r2192_second, "SNES_BSX/r2192_second");
}
void sns_rom_bsx_device::bsx_base::init()
diff --git a/src/devices/bus/snes/bsx.h b/src/devices/bus/snes/bsx.h
index e144ff118ff..881cd1e1a64 100644
--- a/src/devices/bus/snes/bsx.h
+++ b/src/devices/bus/snes/bsx.h
@@ -36,6 +36,14 @@ protected:
uint8_t read(uint32_t offset);
void write(uint32_t offset, uint8_t data);
+ void register_save(save_registrar &save)
+ {
+ save.reg(NAME(regs))
+ .reg(NAME(r2192_counter))
+ .reg(NAME(r2192_hour))
+ .reg(NAME(r2192_second));
+ }
+
private:
// regs
uint8_t regs[0x18]; // 0x2188-0x219f
@@ -51,6 +59,7 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
@@ -139,6 +148,7 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
virtual void device_reset() override;
// flash regs
diff --git a/src/devices/bus/snes/spc7110.cpp b/src/devices/bus/snes/spc7110.cpp
index 20d59dc681a..8ac928788d5 100644
--- a/src/devices/bus/snes/spc7110.cpp
+++ b/src/devices/bus/snes/spc7110.cpp
@@ -127,57 +127,63 @@ void sns_rom_spc7110_device::spc7110_start()
m_r4840 = 0x00;
m_r4841 = 0x00;
m_r4842 = 0x00;
+}
- save_item(NAME(m_r4801));
- save_item(NAME(m_r4802));
- save_item(NAME(m_r4803));
- save_item(NAME(m_r4804));
- save_item(NAME(m_r4805));
- save_item(NAME(m_r4806));
- save_item(NAME(m_r4807));
- save_item(NAME(m_r4808));
- save_item(NAME(m_r4809));
- save_item(NAME(m_r480a));
- save_item(NAME(m_r480b));
- save_item(NAME(m_r480c));
- save_item(NAME(m_r4811));
- save_item(NAME(m_r4812));
- save_item(NAME(m_r4813));
- save_item(NAME(m_r4814));
- save_item(NAME(m_r4815));
- save_item(NAME(m_r4816));
- save_item(NAME(m_r4817));
- save_item(NAME(m_r4818));
- save_item(NAME(m_r481x));
- save_item(NAME(m_r4814_latch));
- save_item(NAME(m_r4815_latch));
- save_item(NAME(m_r4820));
- save_item(NAME(m_r4821));
- save_item(NAME(m_r4822));
- save_item(NAME(m_r4823));
- save_item(NAME(m_r4824));
- save_item(NAME(m_r4825));
- save_item(NAME(m_r4826));
- save_item(NAME(m_r4827));
- save_item(NAME(m_r4828));
- save_item(NAME(m_r4829));
- save_item(NAME(m_r482a));
- save_item(NAME(m_r482b));
- save_item(NAME(m_r482c));
- save_item(NAME(m_r482d));
- save_item(NAME(m_r482e));
- save_item(NAME(m_r482f));
- save_item(NAME(m_r4830));
- save_item(NAME(m_r4831));
- save_item(NAME(m_r4832));
- save_item(NAME(m_r4833));
- save_item(NAME(m_r4834));
- save_item(NAME(m_r4840));
- save_item(NAME(m_r4841));
- save_item(NAME(m_r4842));
- save_item(NAME(m_dx_offset));
- save_item(NAME(m_ex_offset));
- save_item(NAME(m_fx_offset));
+void sns_rom_spc7110_device::device_register_save(save_registrar &save)
+{
+ sns_rom21_device::device_register_save(save);
+
+ save.reg(NAME(m_r4801))
+ .reg(NAME(m_r4802))
+ .reg(NAME(m_r4803))
+ .reg(NAME(m_r4804))
+ .reg(NAME(m_r4805))
+ .reg(NAME(m_r4806))
+ .reg(NAME(m_r4807))
+ .reg(NAME(m_r4808))
+ .reg(NAME(m_r4809))
+ .reg(NAME(m_r480a))
+ .reg(NAME(m_r480b))
+ .reg(NAME(m_r480c))
+ .reg(NAME(m_decomp))
+ .reg(NAME(m_r4811))
+ .reg(NAME(m_r4812))
+ .reg(NAME(m_r4813))
+ .reg(NAME(m_r4814))
+ .reg(NAME(m_r4815))
+ .reg(NAME(m_r4816))
+ .reg(NAME(m_r4817))
+ .reg(NAME(m_r4818))
+ .reg(NAME(m_r481x))
+ .reg(NAME(m_r4814_latch))
+ .reg(NAME(m_r4815_latch))
+ .reg(NAME(m_r4820))
+ .reg(NAME(m_r4821))
+ .reg(NAME(m_r4822))
+ .reg(NAME(m_r4823))
+ .reg(NAME(m_r4824))
+ .reg(NAME(m_r4825))
+ .reg(NAME(m_r4826))
+ .reg(NAME(m_r4827))
+ .reg(NAME(m_r4828))
+ .reg(NAME(m_r4829))
+ .reg(NAME(m_r482a))
+ .reg(NAME(m_r482b))
+ .reg(NAME(m_r482c))
+ .reg(NAME(m_r482d))
+ .reg(NAME(m_r482e))
+ .reg(NAME(m_r482f))
+ .reg(NAME(m_r4830))
+ .reg(NAME(m_r4831))
+ .reg(NAME(m_r4832))
+ .reg(NAME(m_r4833))
+ .reg(NAME(m_r4834))
+ .reg(NAME(m_r4840))
+ .reg(NAME(m_r4841))
+ .reg(NAME(m_r4842))
+ .reg(NAME(m_dx_offset))
+ .reg(NAME(m_ex_offset))
+ .reg(NAME(m_fx_offset));
}
void sns_rom_spc7110_device::device_start()
@@ -212,8 +218,6 @@ void sns_rom_spc7110rtc_device::device_start()
mapper specific handlers
-------------------------------------------------*/
-#define SPC7110_DECOMP_BUFFER_SIZE 64
-
static const uint8_t spc7110_evolution_table[53][4] =
{
{ 0x5a, 1, 1, 1 },
@@ -331,50 +335,6 @@ sns_rom_spc7110_device::SPC7110_Decomp::SPC7110_Decomp(running_machine &machine)
m_morton32[2][i] = m_morton32[0][i] << 4;
m_morton32[3][i] = m_morton32[0][i] << 6;
}
-
- m_machine.save().save_item(m_decomp_mode, "SNES_SPC7110/m_decomp_mode");
- m_machine.save().save_item(m_decomp_offset, "SNES_SPC7110/m_decomp_offset");
- m_machine.save().save_pointer(m_decomp_buffer.get(), "SNES_SPC7110/m_decomp_buffer", SPC7110_DECOMP_BUFFER_SIZE);
- m_machine.save().save_item(m_decomp_buffer_rdoffset, "SNES_SPC7110/m_decomp_buffer_rdoffset");
- m_machine.save().save_item(m_decomp_buffer_wroffset, "SNES_SPC7110/m_decomp_buffer_wroffset");
- m_machine.save().save_item(m_decomp_buffer_length, "SNES_SPC7110/m_decomp_buffer_length");
-
- for (int i = 0; i < 32; i++)
- {
- m_machine.save().save_item(m_context[i].index, "SNES_SPC7110/m_context[i].index", i);
- m_machine.save().save_item(m_context[i].invert, "SNES_SPC7110/m_context[i].invert", i);
- }
-
- m_machine.save().save_item(m_m0_val, "SNES_SPC7110/m_m0_val");
- m_machine.save().save_item(m_m0_in, "SNES_SPC7110/m_m0_in");
- m_machine.save().save_item(m_m0_span, "SNES_SPC7110/m_m0_span");
- m_machine.save().save_item(m_m0_out, "SNES_SPC7110/m_m0_out");
- m_machine.save().save_item(m_m0_inverts, "SNES_SPC7110/m_m0_inverts");
- m_machine.save().save_item(m_m0_lps, "SNES_SPC7110/m_m0_lps");
- m_machine.save().save_item(m_m0_in_count, "SNES_SPC7110/m_m0_in_count");
-
- m_machine.save().save_item(m_m1_pixelorder, "SNES_SPC7110/m_m1_pixelorder");
- m_machine.save().save_item(m_m1_realorder, "SNES_SPC7110/m_m1_realorder");
- m_machine.save().save_item(m_m1_val, "SNES_SPC7110/m_m1_val");
- m_machine.save().save_item(m_m1_in, "SNES_SPC7110/m_m1_in");
- m_machine.save().save_item(m_m1_span, "SNES_SPC7110/m_m1_span");
- m_machine.save().save_item(m_m1_out, "SNES_SPC7110/m_m1_out");
- m_machine.save().save_item(m_m1_inverts, "SNES_SPC7110/m_m1_inverts");
- m_machine.save().save_item(m_m1_lps, "SNES_SPC7110/m_m1_lps");
- m_machine.save().save_item(m_m1_in_count, "SNES_SPC7110/m_m1_in_count");
-
- m_machine.save().save_item(m_m2_pixelorder, "SNES_SPC7110/m_m2_pixelorder");
- m_machine.save().save_item(m_m2_realorder, "SNES_SPC7110/m_m2_realorder");
- m_machine.save().save_item(m_m2_bitplanebuffer, "SNES_SPC7110/m_m2_bitplanebuffer");
- m_machine.save().save_item(m_m2_buffer_index, "SNES_SPC7110/m_m2_buffer_index");
- m_machine.save().save_item(m_m2_val, "SNES_SPC7110/m_m2_val");
- m_machine.save().save_item(m_m2_in, "SNES_SPC7110/m_m2_in");
- m_machine.save().save_item(m_m2_span, "SNES_SPC7110/m_m2_span");
- m_machine.save().save_item(m_m2_out0, "SNES_SPC7110/m_m2_out0");
- m_machine.save().save_item(m_m2_out1, "SNES_SPC7110/m_m2_out1");
- m_machine.save().save_item(m_m2_inverts, "SNES_SPC7110/m_m2_inverts");
- m_machine.save().save_item(m_m2_lps, "SNES_SPC7110/m_m2_lps");
- m_machine.save().save_item(m_m2_in_count, "SNES_SPC7110/m_m2_in_count");
}
void sns_rom_spc7110_device::SPC7110_Decomp::reset()
diff --git a/src/devices/bus/snes/spc7110.h b/src/devices/bus/snes/spc7110.h
index a7c798244c1..57104749bc2 100644
--- a/src/devices/bus/snes/spc7110.h
+++ b/src/devices/bus/snes/spc7110.h
@@ -31,6 +31,7 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_register_save(save_registrar &save) override;
class SPC7110_Decomp
{
@@ -48,6 +49,50 @@ protected:
void mode1(uint8_t init, uint8_t *ROM, uint32_t len);
void mode2(uint8_t init, uint8_t *ROM, uint32_t len);
+ static constexpr int SPC7110_DECOMP_BUFFER_SIZE = 64;
+
+ void register_save(save_registrar &save)
+ {
+ save.reg(NAME(m_decomp_mode))
+ .reg(NAME(m_decomp_offset))
+ .reg(NAME(m_decomp_buffer), SPC7110_DECOMP_BUFFER_SIZE)
+ .reg(NAME(m_decomp_buffer_rdoffset))
+ .reg(NAME(m_decomp_buffer_wroffset))
+ .reg(NAME(m_decomp_buffer_length))
+ .reg(NAME(m_context))
+
+ .reg(NAME(m_m0_val))
+ .reg(NAME(m_m0_in))
+ .reg(NAME(m_m0_span))
+ .reg(NAME(m_m0_out))
+ .reg(NAME(m_m0_inverts))
+ .reg(NAME(m_m0_lps))
+ .reg(NAME(m_m0_in_count))
+
+ .reg(NAME(m_m1_pixelorder))
+ .reg(NAME(m_m1_realorder))
+ .reg(NAME(m_m1_val))
+ .reg(NAME(m_m1_in))
+ .reg(NAME(m_m1_span))
+ .reg(NAME(m_m1_out))
+ .reg(NAME(m_m1_inverts))
+ .reg(NAME(m_m1_lps))
+ .reg(NAME(m_m1_in_count))
+
+ .reg(NAME(m_m2_pixelorder))
+ .reg(NAME(m_m2_realorder))
+ .reg(NAME(m_m2_bitplanebuffer))
+ .reg(NAME(m_m2_buffer_index))
+ .reg(NAME(m_m2_val))
+ .reg(NAME(m_m2_in))
+ .reg(NAME(m_m2_span))
+ .reg(NAME(m_m2_out0))
+ .reg(NAME(m_m2_out1))
+ .reg(NAME(m_m2_inverts))
+ .reg(NAME(m_m2_lps))
+ .reg(NAME(m_m2_in_count));
+ }
+
private:
uint8_t dataread(uint8_t *ROM, uint32_t len);
@@ -70,6 +115,8 @@ protected:
{
uint8_t index;
uint8_t invert;
+
+ void register_save(save_registrar &save) { save.reg(NAME(index)).reg(NAME(invert)); }
} m_context[32];
uint32_t m_morton16[2][256];
diff --git a/src/emu/device.h b/src/emu/device.h
index 0e53183e179..e88bd1a919f 100644
--- a/src/emu/device.h
+++ b/src/emu/device.h
@@ -622,13 +622,6 @@ public:
else
m_unstructured_save.reg(value, string_format("%s[%d]", valname, index).c_str());
}
- template<typename ItemType, typename StructType, typename ElementType>
- void ATTR_COLD save_item(ItemType &value, ElementType StructType::*element, const char *valname, int index = 0)
- {
- assert(m_save);
- m_save->save_item(this, name(), tag(), index, value, element, valname);
- osd_printf_warning("Legacy save_item not supported of %s:%s/%X/%s\n", tag(), name(), index, valname);
- }
template<typename ItemType>
void ATTR_COLD save_pointer(ItemType &&value, const char *valname, u32 count, int index = -1)
{
@@ -638,13 +631,6 @@ public:
else
m_unstructured_save.reg(value, string_format("%s[%d]", valname, index).c_str(), count);
}
- template<typename ItemType, typename StructType, typename ElementType>
- void ATTR_COLD save_pointer(ItemType &&value, ElementType StructType::*element, const char *valname, u32 count, int index = 0)
- {
- assert(m_save);
- m_save->save_pointer(this, name(), tag(), index, std::forward<ItemType>(value), element, valname, count);
- osd_printf_warning("Legacy save_pointer not supported of %s:%s/%X/%s\n", tag(), name(), index, valname);
- }
// debugging
device_debug *debug() const { return m_debug.get(); }
diff --git a/src/emu/emu.h b/src/emu/emu.h
index a3f4a3869a3..20692a356db 100644
--- a/src/emu/emu.h
+++ b/src/emu/emu.h
@@ -45,13 +45,13 @@
#include "fileio.h"
#include "delegate.h"
#include "devdelegate.h"
+#include "save.h"
// memory and address spaces
#include "emumem.h"
// machine-wide utilities
#include "romentry.h"
-#include "save.h"
// I/O
#include "input.h"
diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp
index 30e6141e3e9..eddbc5418d7 100644
--- a/src/emu/emumem.cpp
+++ b/src/emu/emumem.cpp
@@ -284,6 +284,10 @@ template class handler_entry_write<3, -3, ENDIANNESS_BIG>;
memory_manager::memory_manager(running_machine &machine)
: m_machine(machine)
+ , m_root_registrar(machine.save().root_registrar(), "memory")
+ , m_bank_registrar(m_root_registrar, "banks")
+ , m_view_registrar(m_root_registrar, "views")
+ , m_contents_registrar(m_root_registrar, "contents")
{
}
@@ -334,7 +338,15 @@ void *memory_manager::allocate_memory(device_t &dev, int spacenum, std::string n
{
void *const ptr = m_datablocks.emplace_back(malloc(bytes)).get();
memset(ptr, 0, bytes);
- machine().save().save_memory(&dev, "memory", dev.tag(), spacenum, name.c_str(), ptr, width/8, u32(bytes) / (width/8));
+ std::string save_name = string_format("%s:%d:%s", dev.tag(), spacenum, name.c_str());
+ assert(width == 1 || width == 2 || width == 4 || width == 8);
+ switch (width)
+ {
+ case 8: m_contents_registrar.reg(reinterpret_cast<uint8_t *>(ptr), save_name.c_str(), bytes / 1); break;
+ case 16: m_contents_registrar.reg(reinterpret_cast<uint16_t *>(ptr), save_name.c_str(), bytes / 2); break;
+ case 32: m_contents_registrar.reg(reinterpret_cast<uint32_t *>(ptr), save_name.c_str(), bytes / 4); break;
+ case 64: m_contents_registrar.reg(reinterpret_cast<uint64_t *>(ptr), save_name.c_str(), bytes / 8); break;
+ }
return ptr;
}
@@ -963,7 +975,9 @@ memory_bank::memory_bank(device_t &device, std::string tag)
{
m_tag = std::move(tag);
m_name = string_format("Bank '%s'", m_tag);
- machine().save().save_item(&device, "memory", m_tag.c_str(), 0, NAME(m_curentry));
+
+ save_registrar container(m_machine.memory().bank_registrar(), string_format("%s:%s", device.tag(), m_tag.c_str()).c_str());
+ container.reg(NAME(m_curentry));
}
diff --git a/src/emu/emumem.h b/src/emu/emumem.h
index ef47941290a..4a1fb087e4f 100644
--- a/src/emu/emumem.h
+++ b/src/emu/emumem.h
@@ -1917,11 +1917,19 @@ public:
memory_region *region_find(std::string name);
void region_free(std::string name);
+ // save registrations
+ save_registrar &bank_registrar() { return m_bank_registrar; }
+ save_registrar &view_registrar() { return m_view_registrar; }
+
private:
struct stdlib_deleter { void operator()(void *p) const { free(p); } };
// internal state
running_machine & m_machine; // reference to the machine
+ save_registrar m_root_registrar; // outer container for all
+ save_registrar m_bank_registrar; // container for banks
+ save_registrar m_view_registrar; // container for views
+ save_registrar m_contents_registrar; // container for contents
std::vector<std::unique_ptr<void, stdlib_deleter>> m_datablocks; // list of memory blocks to free on exit
std::unordered_map<std::string, std::unique_ptr<memory_bank>> m_banklist; // map of banks
diff --git a/src/emu/emumem_mview.cpp b/src/emu/emumem_mview.cpp
index a6ad0805803..2aad27d5e5d 100644
--- a/src/emu/emumem_mview.cpp
+++ b/src/emu/emumem_mview.cpp
@@ -651,8 +651,9 @@ memory_view::~memory_view()
void memory_view::register_state()
{
- m_device.machine().save().save_item(&m_device, "view", m_name.c_str(), 0, NAME(m_cur_slot));
- m_device.machine().save().save_item(&m_device, "view", m_name.c_str(), 0, NAME(m_cur_id));
+ save_registrar container(m_device.machine().memory().view_registrar(), string_format("%d:%d", m_device.tag(), m_name.c_str()).c_str());
+ container.reg(NAME(m_cur_slot))
+ .reg(NAME(m_cur_id));
m_device.machine().save().register_postload(save_prepost_delegate(NAME([this]() { m_handler_read->select_a(m_cur_id); m_handler_write->select_a(m_cur_id); })));
}
diff --git a/src/emu/output.cpp b/src/emu/output.cpp
index 65378d2e525..bf08ac90c76 100644
--- a/src/emu/output.cpp
+++ b/src/emu/output.cpp
@@ -104,12 +104,6 @@ void output_manager::register_save()
for (auto &item : m_itemtable)
m_save_order.emplace_back(item.second);
std::sort(m_save_order.begin(), m_save_order.end(), [] (auto const &l, auto const &r) { return l.get().name() < r.get().name(); });
-
- // register the reserved space for saving
- machine().save().save_pointer(nullptr, "output", nullptr, 0, NAME(&m_save_data[0]), m_itemtable.size());
- if (OUTPUT_VERBOSE)
- osd_printf_verbose("Registered %u outputs for save states\n", m_itemtable.size());
-
}
diff --git a/src/emu/save.cpp b/src/emu/save.cpp
index b7b20ba5c2e..d0f8c63b856 100644
--- a/src/emu/save.cpp
+++ b/src/emu/save.cpp
@@ -67,7 +67,6 @@ save_manager::save_manager(running_machine &machine)
, m_reg_allowed(true)
, m_illegal_regs(0)
, m_root_registrar(m_root_item)
- , m_legacy_registrar(m_root_registrar, "legacy")
{
m_rewind = std::make_unique<rewinder>(*this);
}
@@ -173,38 +172,6 @@ void save_manager::register_postload(save_prepost_delegate func)
//-------------------------------------------------
-// save_memory - register an array of data in
-// memory
-//-------------------------------------------------
-
-void save_manager::save_memory(device_t *device, const char *module, const char *tag, u32 index, const char *name, void *val, u32 valsize, u32 valcount, u32 blockcount, u32 stride)
-{
- assert(valsize == 1 || valsize == 2 || valsize == 4 || valsize == 8);
- assert(((blockcount <= 1) && (stride == 0)) || (stride >= valcount));
-
- // check for invalid timing
- if (!m_reg_allowed)
- {
- machine().logerror("Attempt to register save state entry after state registration is closed!\nModule %s tag %s name %s\n", module, tag, name);
- if (machine().system().flags & machine_flags::SUPPORTS_SAVE)
- fatalerror("Attempt to register save state entry after state registration is closed!\nModule %s tag %s name %s\n", module, tag, name);
- m_illegal_regs++;
- return;
- }
-
- // create the full name
- std::string totalname;
- if (tag)
- totalname = string_format("%s/%s/%X/%s", module, tag, index, name);
- else
- totalname = string_format("%s/%X/%s", module, index, name);
-
- // insert us into the list
- m_entry_list.emplace_back(std::make_unique<state_entry>(val, std::move(totalname), device, module, tag ? tag : "", index, valsize, valcount, blockcount, stride));
-}
-
-
-//-------------------------------------------------
// check_file - check if a file is a valid save
// state
//-------------------------------------------------
diff --git a/src/emu/save.h b/src/emu/save.h
index 892c6e6ce89..bf2654acc84 100644
--- a/src/emu/save.h
+++ b/src/emu/save.h
@@ -77,19 +77,10 @@ typedef named_delegate<void ()> save_prepost_delegate;
template<> struct save_registrar::is_floating_point_like<Type> { static constexpr bool value = true; };
-// use this to declare a given type is a simple, non-pointer type that can be
-// saved; in general, this is intended only to be used for specific enum types
-// defined by your device
-#define ALLOW_SAVE_TYPE(TYPE) \
- template <> struct save_manager::is_atom<TYPE> { static constexpr bool value = true; };
-// use this as above, but also to declare that std::vector<TYPE> is safe as well
-#define ALLOW_SAVE_TYPE_AND_VECTOR(TYPE) \
- ALLOW_SAVE_TYPE(TYPE) \
- template <> struct save_manager::is_vector_safe<TYPE> { static constexpr bool value = true; };
-
-// use this for saving members of structures in arrays
-#define STRUCT_MEMBER(s, m) s, &save_manager::pointer_unwrap<decltype(s)>::underlying_type::m, #s "." #m
+// remove me
+#define ALLOW_SAVE_TYPE(TYPE)
+#define ALLOW_SAVE_TYPE_AND_VECTOR(TYPE)
//**************************************************************************
@@ -272,7 +263,7 @@ public:
// std::unique_ptrs -- these are containers with a single "unique" item within
template<typename T>
- save_registrar &reg(std::unique_ptr<T> &data, char const *name)
+ std::enable_if_t<!std::is_array<T>::value, save_registrar> &reg(std::unique_ptr<T> &data, char const *name)
{
if (data.get() == nullptr)
throw emu_fatalerror("Passed null pointer to save state registration.");
@@ -287,16 +278,16 @@ public:
template<typename T, std::size_t N>
save_registrar &reg(T (&data)[N], char const *name)
{
- save_registrar container(*this, save_registered_item::save_type(N), sizeof(data[0]), name, &data[0]);
+ save_registrar container(*this, save_registered_item::save_type(N), uintptr_t(&data[1]) - uintptr_t(&data[0]), name, &data[0]);
container.reg(data[0], "");
return *this;
}
- // std::arrays -- these identically to arrays
+ // std::arrays -- treat these identically to arrays
template<typename T, std::size_t N>
save_registrar &reg(std::array<T, N> &data, char const *name)
{
- save_registrar container(*this, save_registered_item::save_type(N), sizeof(data[0]), name, &data[0]);
+ save_registrar container(*this, save_registered_item::save_type(N), uintptr_t(&data[1]) - uintptr_t(&data[0]), name, &data[0]);
container.reg(data[0], "");
return *this;
}
@@ -308,7 +299,7 @@ public:
if (data == nullptr)
throw emu_fatalerror("Passed null pointer to save state registration.");
- save_registrar container(*this, save_registered_item::save_type(count), sizeof(data[0]), name, &data[0]);
+ save_registrar container(*this, save_registered_item::save_type(count), uintptr_t(&data[1]) - uintptr_t(&data[0]), name, &data[0]);
container.reg(data[0], "");
return *this;
}
@@ -325,7 +316,7 @@ public:
save_registrar container(*this, save_registered_item::TYPE_VECTOR, sizeof(data), "", &data, &data[0]);
// then an array container within
- save_registrar subcontainer(container, save_registered_item::save_type(data.size()), sizeof(data[0]), name, &data[0]);
+ save_registrar subcontainer(container, save_registered_item::save_type(data.size()), uintptr_t(&data[1]) - uintptr_t(&data[0]), name, &data[0]);
subcontainer.reg(data[0], "");
return *this;
}
@@ -334,12 +325,16 @@ public:
template<typename T>
save_registrar &reg(std::unique_ptr<T[]> &data, char const *name, std::size_t count)
{
+ // skip if nothing
+ if (count == 0)
+ return *this;
+
if (data.get() == nullptr)
throw emu_fatalerror("Passed null pointer to save state registration.");
- save_registrar container(*this, save_registered_item::TYPE_UNIQUE, sizeof(data), "", &data, &data[0]);
+ save_registrar container(*this, save_registered_item::TYPE_UNIQUE, sizeof(data), "", &data, data.get());
- save_registrar subcontainer(container, save_registered_item::save_type(count), sizeof(data[0]), name, &data[0]);
+ save_registrar subcontainer(container, save_registered_item::save_type(count), uintptr_t(&data[1]) - uintptr_t(&data[0]), name, &data[0]);
subcontainer.reg(data[0], "");
return *this;
}
@@ -461,12 +456,6 @@ class save_manager
friend class rewinder;
public:
- // stuff to allow STRUCT_MEMBER to work with pointers
- template <typename T> struct pointer_unwrap { using underlying_type = typename array_unwrap<T>::underlying_type; };
- template <typename T> struct pointer_unwrap<T &> { using underlying_type = typename pointer_unwrap<std::remove_cv_t<T> >::underlying_type; };
- template <typename T> struct pointer_unwrap<T *> { using underlying_type = typename array_unwrap<T>::underlying_type; };
- template <typename T> struct pointer_unwrap<std::unique_ptr<T []> > { using underlying_type = typename array_unwrap<T>::underlying_type; };
-
// construction/destruction
save_manager(running_machine &machine);
@@ -488,132 +477,6 @@ public:
void dispatch_presave();
void dispatch_postload();
- // generic memory registration
- void save_memory(device_t *device, const char *module, const char *tag, u32 index, const char *name, void *val, u32 valsize, u32 valcount = 1, u32 blockcount = 1, u32 stride = 0);
-
- // templatized wrapper for general objects and arrays
- template <typename ItemType>
- std::enable_if_t<is_atom<typename array_unwrap<ItemType>::underlying_type>::value> save_item(device_t *device, const char *module, const char *tag, int index, ItemType &value, const char *valname)
- {
- static_assert(!std::is_pointer<ItemType>::value, "Called save_item on a pointer with no count!");
- save_memory(device, module, tag, index, valname, array_unwrap<ItemType>::ptr(value), array_unwrap<ItemType>::SIZE, array_unwrap<ItemType>::SAVE_COUNT);
- }
-
- // templatized wrapper for structure members
- template <typename ItemType, typename StructType, typename ElementType>
- void save_item(device_t *device, const char *module, const char *tag, int index, ItemType &value, ElementType StructType::*element, const char *valname)
- {
- static_assert(std::is_base_of<StructType, typename array_unwrap<ItemType>::underlying_type>::value, "Called save_item on a non-matching struct member pointer!");
- static_assert(!std::is_pointer<ElementType>::value, "Called save_item on a struct member pointer!");
- static_assert(is_atom<typename array_unwrap<ElementType>::underlying_type>::value, "Called save_item on a non-fundamental type!");
- save_memory(device, module, tag, index, valname, array_unwrap<ElementType>::ptr(array_unwrap<ItemType>::ptr(value)->*element), array_unwrap<ElementType>::SIZE, array_unwrap<ElementType>::SAVE_COUNT, array_unwrap<ItemType>::SAVE_COUNT, sizeof(typename array_unwrap<ItemType>::underlying_type));
- }
-
- // templatized wrapper for pointers
- template <typename ItemType>
- std::enable_if_t<is_atom<typename array_unwrap<ItemType>::underlying_type>::value> save_pointer(device_t *device, const char *module, const char *tag, int index, ItemType *value, const char *valname, u32 count)
- {
- save_memory(device, module, tag, index, valname, array_unwrap<ItemType>::ptr(value[0]), array_unwrap<ItemType>::SIZE, array_unwrap<ItemType>::SAVE_COUNT * count);
- }
-
- template <typename ItemType, typename StructType, typename ElementType>
- void save_pointer(device_t *device, const char *module, const char *tag, int index, ItemType *value, ElementType StructType::*element, const char *valname, u32 count)
- {
- static_assert(std::is_base_of<StructType, typename array_unwrap<ItemType>::underlying_type>::value, "Called save_pointer on a non-matching struct member pointer!");
- static_assert(!std::is_pointer<ElementType>::value, "Called save_pointer on a struct member pointer!");
- static_assert(is_atom<typename array_unwrap<ElementType>::underlying_type>::value, "Called save_pointer on a non-fundamental type!");
- save_memory(device, module, tag, index, valname, array_unwrap<ElementType>::ptr(array_unwrap<ItemType>::ptr(value[0])->*element), array_unwrap<ElementType>::SIZE, array_unwrap<ElementType>::SAVE_COUNT, array_unwrap<ItemType>::SAVE_COUNT * count, sizeof(typename array_unwrap<ItemType>::underlying_type));
- }
-
- // templatized wrapper for std::unique_ptr
- template <typename ItemType>
- std::enable_if_t<is_atom<typename array_unwrap<ItemType>::underlying_type>::value> save_pointer(device_t *device, const char *module, const char *tag, int index, const std::unique_ptr<ItemType []> &value, const char *valname, u32 count)
- {
- save_memory(device, module, tag, index, valname, array_unwrap<ItemType>::ptr(value[0]), array_unwrap<ItemType>::SIZE, array_unwrap<ItemType>::SAVE_COUNT * count);
- }
-
- template <typename ItemType, typename StructType, typename ElementType>
- void save_pointer(device_t *device, const char *module, const char *tag, int index, const std::unique_ptr<ItemType []> &value, ElementType StructType::*element, const char *valname, u32 count)
- {
- static_assert(std::is_base_of<StructType, typename array_unwrap<ItemType>::underlying_type>::value, "Called save_pointer on a non-matching struct member pointer!");
- static_assert(!std::is_pointer<ElementType>::value, "Called save_pointer on a struct member pointer!");
- static_assert(is_atom<typename array_unwrap<ElementType>::underlying_type>::value, "Called save_pointer on a non-fundamental type!");
- save_memory(device, module, tag, index, valname, array_unwrap<ElementType>::ptr(array_unwrap<ItemType>::ptr(value[0])->*element), array_unwrap<ElementType>::SIZE, array_unwrap<ElementType>::SAVE_COUNT, array_unwrap<ItemType>::SAVE_COUNT * count, sizeof(typename array_unwrap<ItemType>::underlying_type));
- }
-
- // templatized wrapper for std::vector
- template <typename ItemType>
- std::enable_if_t<is_vector_safe<typename array_unwrap<ItemType>::underlying_type>::value> save_item(device_t *device, const char *module, const char *tag, int index, std::vector<ItemType> &value, const char *valname)
- {
- save_pointer(device, module, tag, index, &value[0], valname, value.size());
- }
-
- // specializations for bitmaps
- void save_item(device_t *device, const char *module, const char *tag, int index, bitmap_ind8 &value, const char *valname)
- {
- save_memory(device, module, tag, index, valname, &value.pix(0), value.bpp() / 8, value.rowpixels() * value.height());
- }
-
- void save_item(device_t *device, const char *module, const char *tag, int index, bitmap_ind16 &value, const char *valname)
- {
- save_memory(device, module, tag, index, valname, &value.pix(0), value.bpp() / 8, value.rowpixels() * value.height());
- }
-
- void save_item(device_t *device, const char *module, const char *tag, int index, bitmap_ind32 &value, const char *valname)
- {
- save_memory(device, module, tag, index, valname, &value.pix(0), value.bpp() / 8, value.rowpixels() * value.height());
- }
-
- void save_item(device_t *device, const char *module, const char *tag, int index, bitmap_rgb32 &value, const char *valname)
- {
- save_memory(device, module, tag, index, valname, &value.pix(0), value.bpp() / 8, value.rowpixels() * value.height());
- }
-
- // specializations for attotimes
- template <typename ItemType>
- std::enable_if_t<std::is_same<typename save_manager::array_unwrap<ItemType>::underlying_type, attotime>::value> save_item(device_t *device, const char *module, const char *tag, int index, ItemType &value, const char *valname)
- {
- std::string tempstr;
- tempstr.assign(valname).append(".attoseconds");
- save_item(device, module, tag, index, value, &attotime::m_attoseconds, tempstr.c_str());
- tempstr.assign(valname).append(".seconds");
- save_item(device, module, tag, index, value, &attotime::m_seconds, tempstr.c_str());
- }
-
- template <typename ItemType>
- std::enable_if_t<std::is_same<typename save_manager::array_unwrap<ItemType>::underlying_type, attotime>::value> save_pointer(device_t *device, const char *module, const char *tag, int index, ItemType *value, const char *valname, u32 count)
- {
- std::string tempstr;
- tempstr.assign(valname).append(".attoseconds");
- save_item(device, module, tag, index, value, &attotime::m_attoseconds, tempstr.c_str(), count);
- tempstr.assign(valname).append(".seconds");
- save_item(device, module, tag, index, value, &attotime::m_seconds, tempstr.c_str(), count);
- }
-
- template <typename ItemType>
- std::enable_if_t<std::is_same<typename save_manager::array_unwrap<ItemType>::underlying_type, attotime>::value> save_pointer(device_t *device, const char *module, const char *tag, int index, const std::unique_ptr<ItemType []> &value, const char *valname, u32 count)
- {
- std::string tempstr;
- tempstr.assign(valname).append(".attoseconds");
- save_item(device, module, tag, index, value, &attotime::m_attoseconds, tempstr.c_str(), count);
- tempstr.assign(valname).append(".seconds");
- save_item(device, module, tag, index, value, &attotime::m_seconds, tempstr.c_str(), count);
- }
-
- // global memory registration
- template <typename ItemType>
- void save_item(ItemType &value, const char *valname, int index = 0)
- { save_item(nullptr, "global", nullptr, index, value, valname); }
- template <typename ItemType, typename StructType, typename ElementType>
- void save_item(ItemType &value, ElementType StructType::*element, const char *valname, int index = 0)
- { save_item(nullptr, "global", nullptr, index, value, element, valname); }
- template <typename ItemType>
- void save_pointer(ItemType &&value, const char *valname, u32 count, int index = 0)
- { save_pointer(nullptr, "global", nullptr, index, std::forward<ItemType>(value), valname, count); }
- template <typename ItemType, typename StructType, typename ElementType>
- void save_pointer(ItemType &&value, ElementType StructType::*element, const char *valname, u32 count, int index = 0)
- { save_pointer(nullptr, "global", nullptr, index, std::forward<ItemType>(value), element, valname, count); }
-
// file processing
static save_error check_file(running_machine &machine, emu_file &file, const char *gamename, void (CLIB_DECL *errormsg)(const char *fmt, ...));
save_error write_file(emu_file &file);
@@ -626,7 +489,6 @@ public:
save_error read_buffer(const void *buf, size_t size);
save_registrar &root_registrar() { return m_root_registrar; }
- save_registrar &legacy_registrar() { return m_legacy_registrar; }
void test_dump();
private:
@@ -657,7 +519,6 @@ private:
save_registered_item m_root_item;
save_registrar m_root_registrar;
- save_registrar m_legacy_registrar;
std::vector<std::unique_ptr<state_entry>> m_entry_list; // list of registered entries
std::vector<std::unique_ptr<ram_state>> m_ramstate_list; // list of ram states
@@ -717,33 +578,4 @@ public:
bool step();
};
-
-// template specializations to enumerate the fundamental atomic types you are allowed to save
-ALLOW_SAVE_TYPE_AND_VECTOR(char)
-ALLOW_SAVE_TYPE (bool) // std::vector<bool> may be packed internally
-ALLOW_SAVE_TYPE_AND_VECTOR(osd::s8)
-ALLOW_SAVE_TYPE_AND_VECTOR(osd::u8)
-ALLOW_SAVE_TYPE_AND_VECTOR(osd::s16)
-ALLOW_SAVE_TYPE_AND_VECTOR(osd::u16)
-ALLOW_SAVE_TYPE_AND_VECTOR(osd::s32)
-ALLOW_SAVE_TYPE_AND_VECTOR(osd::u32)
-ALLOW_SAVE_TYPE_AND_VECTOR(osd::s64)
-ALLOW_SAVE_TYPE_AND_VECTOR(osd::u64)
-ALLOW_SAVE_TYPE_AND_VECTOR(PAIR)
-ALLOW_SAVE_TYPE_AND_VECTOR(PAIR64)
-ALLOW_SAVE_TYPE_AND_VECTOR(float)
-ALLOW_SAVE_TYPE_AND_VECTOR(double)
-ALLOW_SAVE_TYPE_AND_VECTOR(endianness_t)
-ALLOW_SAVE_TYPE_AND_VECTOR(rgb_t)
-
-
-
-
-
-
-
-
-
-
-
#endif // MAME_EMU_SAVE_H
diff --git a/src/emu/schedule.cpp b/src/emu/schedule.cpp
index e32afb68f00..4f140590560 100644
--- a/src/emu/schedule.cpp
+++ b/src/emu/schedule.cpp
@@ -262,12 +262,13 @@ void emu_timer::register_save()
index++;
}
- // save the bits
- machine().save().save_item(m_device, "timer", name.c_str(), index, NAME(m_param));
- machine().save().save_item(m_device, "timer", name.c_str(), index, NAME(m_enabled));
- machine().save().save_item(m_device, "timer", name.c_str(), index, NAME(m_period));
- machine().save().save_item(m_device, "timer", name.c_str(), index, NAME(m_start));
- machine().save().save_item(m_device, "timer", name.c_str(), index, NAME(m_expire));
+ // save the bits in their own container
+ save_registrar container(machine().scheduler().m_scheduler_container, string_format("timer:%s[%d]", name.c_str(), index).c_str());
+ container.reg(NAME(m_param))
+ .reg(NAME(m_enabled))
+ .reg(NAME(m_period))
+ .reg(NAME(m_start))
+ .reg(NAME(m_expire));
}
@@ -337,14 +338,15 @@ device_scheduler::device_scheduler(running_machine &machine) :
m_callback_timer_modified(false),
m_callback_timer_expire_time(attotime::zero),
m_suspend_changes_pending(true),
- m_quantum_minimum(ATTOSECONDS_IN_NSEC(1) / 1000)
+ m_quantum_minimum(ATTOSECONDS_IN_NSEC(1) / 1000),
+ m_scheduler_container(machine.save().root_registrar(), "scheduler")
{
// append a single never-expiring timer so there is always one in the list
m_timer_list = &m_timer_allocator.alloc()->init(machine, timer_expired_delegate(), nullptr, true);
m_timer_list->adjust(attotime::never);
// register global states
- machine.save().save_item(NAME(m_basetime));
+ m_scheduler_container.reg(NAME(m_basetime));
machine.save().register_presave(save_prepost_delegate(FUNC(device_scheduler::presave), this));
machine.save().register_postload(save_prepost_delegate(FUNC(device_scheduler::postload), this));
}
diff --git a/src/emu/schedule.h b/src/emu/schedule.h
index 67f6d945898..a4bdfb985db 100644
--- a/src/emu/schedule.h
+++ b/src/emu/schedule.h
@@ -188,6 +188,9 @@ private:
simple_list<quantum_slot> m_quantum_list; // list of active quanta
fixed_allocator<quantum_slot> m_quantum_allocator; // allocator for quanta
attoseconds_t m_quantum_minimum; // duration of minimum quantum
+
+ // state saving
+ save_registrar m_scheduler_container;
};
diff --git a/src/mame/drivers/gaelco3d.cpp b/src/mame/drivers/gaelco3d.cpp
index 561b1fcacf5..467d3f06e0f 100644
--- a/src/mame/drivers/gaelco3d.cpp
+++ b/src/mame/drivers/gaelco3d.cpp
@@ -176,18 +176,6 @@ WRITE_LINE_MEMBER(gaelco3d_state::ser_irq)
void gaelco3d_state::machine_start()
{
- // Save state support
- save_item(NAME(m_sound_status));
- save_item(NAME(m_analog_ports));
- save_item(NAME(m_framenum));
- save_item(NAME(m_adsp_ireg));
- save_item(NAME(m_adsp_ireg_base));
- save_item(NAME(m_adsp_incs));
- save_item(NAME(m_adsp_size));
- save_item(NAME(m_fp_clock));
- save_item(NAME(m_fp_state));
- save_item(NAME(m_fp_analog_ports));
- save_item(NAME(m_fp_lenght));
}
@@ -360,9 +348,9 @@ WRITE_LINE_MEMBER(gaelco3d_state::fp_analog_clock_w)
s32 aay = ay - 0x80;
s32 aax = ax - 0x80;
u32 len = aay * aay + aax * aax;
- if (len <= m_fp_lenght[i])
+ if (len <= m_fp_length[i])
m_fp_analog_ports[i] |= 2;
- m_fp_lenght[i] = len;
+ m_fp_length[i] = len;
}
}
}
diff --git a/src/mame/includes/gaelco3d.h b/src/mame/includes/gaelco3d.h
index 24005639cab..521d1a6819b 100644
--- a/src/mame/includes/gaelco3d.h
+++ b/src/mame/includes/gaelco3d.h
@@ -28,6 +28,10 @@
class gaelco3d_state : public driver_device
{
+ static constexpr int MAX_POLYGONS = 4096;
+ static constexpr int MAX_POLYDATA = MAX_POLYGONS * 21;
+ static constexpr int MAX_VERTICES = 32;
+
public:
gaelco3d_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
@@ -65,6 +69,29 @@ private:
virtual void machine_reset() override;
virtual void video_start() override;
+ virtual void device_register_save(save_registrar &save) override
+ {
+ // machine items
+ save.reg(NAME(m_sound_status))
+ .reg(NAME(m_analog_ports))
+ .reg(NAME(m_framenum))
+ .reg(NAME(m_adsp_ireg))
+ .reg(NAME(m_adsp_ireg_base))
+ .reg(NAME(m_adsp_incs))
+ .reg(NAME(m_adsp_size))
+ .reg(NAME(m_fp_clock))
+ .reg(NAME(m_fp_state))
+ .reg(NAME(m_fp_analog_ports))
+ .reg(NAME(m_fp_length))
+
+ // video items
+ .reg(NAME(m_palette), 32768)
+ .reg(NAME(m_polydata_buffer), MAX_POLYDATA)
+ .reg(NAME(m_polydata_count))
+ .reg(NAME(m_lastscan))
+ .reg(NAME(m_poly));
+ }
+
struct gaelco3d_object_data
{
uint32_t tex, color;
@@ -85,6 +112,8 @@ private:
void render_poly(screen_device &screen, uint32_t *polydata);
+ void register_save(save_registrar &save) { save.reg(NAME(m_screenbits)).reg(NAME(m_zbuffer)); }
+
protected:
gaelco3d_state &m_state;
@@ -127,7 +156,7 @@ private:
uint8_t m_sound_status;
uint8_t m_analog_ports[4];
uint32_t m_fp_analog_ports[2];
- uint32_t m_fp_lenght[2];
+ uint32_t m_fp_length[2];
uint8_t m_fp_clock;
uint8_t m_fp_state;
uint8_t m_framenum;
diff --git a/src/mame/video/gaelco3d.cpp b/src/mame/video/gaelco3d.cpp
index 241c8da4b22..c92877ab4d9 100644
--- a/src/mame/video/gaelco3d.cpp
+++ b/src/mame/video/gaelco3d.cpp
@@ -14,10 +14,6 @@
#include "video/rgbutil.h"
-#define MAX_POLYGONS 4096
-#define MAX_POLYDATA (MAX_POLYGONS * 21)
-#define MAX_VERTICES 32
-
#define DISPLAY_TEXTURE 0
#define LOG_POLYGONS 0
#define DISPLAY_STATS 0
@@ -36,9 +32,6 @@ gaelco3d_state::gaelco3d_renderer::gaelco3d_renderer(gaelco3d_state &state)
m_texture(std::make_unique<uint8_t[]>(m_texture_size)),
m_texmask(std::make_unique<uint8_t[]>(m_texmask_size))
{
- state.machine().save().save_item(NAME(m_screenbits));
- state.machine().save().save_item(NAME(m_zbuffer));
-
/* first expand the pixel data */
uint8_t *src = state.memregion("gfx1")->base();
uint8_t *dst = m_texture.get();
@@ -72,13 +65,6 @@ void gaelco3d_state::video_start()
m_palette = std::make_unique<rgb_t[]>(32768);
m_polydata_buffer = std::make_unique<uint32_t[]>(MAX_POLYDATA);
-
- /* save states */
-
- save_pointer(NAME(m_palette), 32768);
- save_pointer(NAME(m_polydata_buffer), MAX_POLYDATA);
- save_item(NAME(m_polydata_count));
- save_item(NAME(m_lastscan));
}