summaryrefslogtreecommitdiffstatshomepage
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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));
}