diff options
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 |
commit | 98e8ed32043d8d47fe63b6565c452dc61182fd02 (patch) | |
tree | 1a2cc7981d4b015bd6b7740e4f3c9c489e96ee57 | |
parent | 90c5a29f41bb7402cf180c4f852e4e9d7aabffd1 (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.cpp | 89 | ||||
-rw-r--r-- | src/devices/bus/gba/rom.h | 29 | ||||
-rw-r--r-- | src/devices/bus/megadrive/stm95.cpp | 7 | ||||
-rw-r--r-- | src/devices/bus/megadrive/stm95.h | 12 | ||||
-rw-r--r-- | src/devices/bus/snes/bsx.cpp | 44 | ||||
-rw-r--r-- | src/devices/bus/snes/bsx.h | 10 | ||||
-rw-r--r-- | src/devices/bus/snes/spc7110.cpp | 152 | ||||
-rw-r--r-- | src/devices/bus/snes/spc7110.h | 47 | ||||
-rw-r--r-- | src/emu/device.h | 14 | ||||
-rw-r--r-- | src/emu/emu.h | 2 | ||||
-rw-r--r-- | src/emu/emumem.cpp | 18 | ||||
-rw-r--r-- | src/emu/emumem.h | 8 | ||||
-rw-r--r-- | src/emu/emumem_mview.cpp | 5 | ||||
-rw-r--r-- | src/emu/output.cpp | 6 | ||||
-rw-r--r-- | src/emu/save.cpp | 33 | ||||
-rw-r--r-- | src/emu/save.h | 198 | ||||
-rw-r--r-- | src/emu/schedule.cpp | 18 | ||||
-rw-r--r-- | src/emu/schedule.h | 3 | ||||
-rw-r--r-- | src/mame/drivers/gaelco3d.cpp | 16 | ||||
-rw-r--r-- | src/mame/includes/gaelco3d.h | 31 | ||||
-rw-r--r-- | src/mame/video/gaelco3d.cpp | 14 |
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 ®(std::unique_ptr<T> &data, char const *name) + std::enable_if_t<!std::is_array<T>::value, save_registrar> ®(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 ®(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 ®(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 ®(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)); } |