bus/msx/slot: Use std::unique_ptr instead of std::vector. (#12746)

This commit is contained in:
wilbertpol 2024-09-10 19:53:04 +01:00 committed by GitHub
parent d75b6cd0cb
commit 0c0f349b0c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 60 additions and 49 deletions

View File

@ -36,10 +36,11 @@ void msx_slot_fs4600_device::device_start()
fatalerror("Memory region '%s' is too small for the FS4600 firmware\n", m_rom_region.finder_tag());
}
m_sram.resize(SRAM_SIZE);
m_nvram->set_base(m_sram.data(), SRAM_SIZE);
m_sram = std::make_unique<u8[]>(SRAM_SIZE);
m_nvram->set_base(&m_sram[0], SRAM_SIZE);
save_item(NAME(m_sram_address));
save_pointer(NAME(m_sram), SRAM_SIZE);
for (int i = 0; i < 3; i++)
m_rombank[i]->configure_entries(0, 0x40, m_rom_region->base() + m_region_offset, 0x4000);

View File

@ -41,7 +41,7 @@ private:
memory_view m_view[3];
u32 m_region_offset;
u32 m_sram_address;
std::vector<u8> m_sram;
std::unique_ptr<u8[]> m_sram;
};

View File

@ -32,15 +32,15 @@ void msx_slot_fsa1fm2_device::device_start()
fatalerror("Memory region '%s' is not the correct size for the FS-A1FM firmware\n", m_rom_region.finder_tag());
}
m_ram.resize(RAM_SIZE);
m_empty_bank.resize(8 * 1024);
m_ram = std::make_unique<u8[]>(RAM_SIZE);
m_empty_bank = std::make_unique<u8[]>(8 * 1024);
for (int i = 0; i < 8 * 1024; i++)
m_empty_bank[i] = 0xff;
save_item(NAME(m_selected_bank));
save_item(NAME(m_control));
save_item(NAME(m_ram_active));
save_pointer(m_ram.data(), "ram", RAM_SIZE);
save_pointer(NAME(m_ram), m_size);
for (int i = 0; i < 6; i++)
{
@ -48,10 +48,10 @@ void msx_slot_fsa1fm2_device::device_start()
m_bank[i]->configure_entries(0x80, 0x80, m_rom_region->base() + m_region_offset, 0x2000);
for (int j = 0; j < 4; j++)
{
m_bank[i]->configure_entry(0x80 + j, m_empty_bank.data()); // 0x80-0x83 empty
m_bank[i]->configure_entry(0x84 + j, m_ram.data()); // 0x84-0x87 ram
m_bank[i]->configure_entry(0x88 + j, m_empty_bank.data()); // 0x88-0x8b empty
m_bank[i]->configure_entry(0x8c + j, m_ram.data()); // 0x8c-0x8f ram
m_bank[i]->configure_entry(0x80 + j, &m_empty_bank[0]); // 0x80-0x83 empty
m_bank[i]->configure_entry(0x84 + j, &m_ram[0]); // 0x84-0x87 ram
m_bank[i]->configure_entry(0x88 + j, &m_empty_bank[0]); // 0x88-0x8b empty
m_bank[i]->configure_entry(0x8c + j, &m_ram[0]); // 0x8c-0x8f ram
}
}
@ -182,14 +182,16 @@ void msx_slot_fsa1fm_device::device_start()
fatalerror("Memory region '%s' is not the correct size for the FS-A1FM firmware\n", m_rom_region.finder_tag());
}
m_sram.resize(SRAM_SIZE);
m_nvram->set_base(m_sram.data(), SRAM_SIZE);
m_sram = std::make_unique<u8[]>(SRAM_SIZE);
m_nvram->set_base(&m_sram[0], SRAM_SIZE);
save_pointer(NAME(m_sram), SRAM_SIZE);
m_rombank->configure_entries(0, 16, m_rom_region->base(), 0x2000);
page(1)->install_read_bank(0x4000, 0x5fff, m_rombank);
// SRAM is always visible?
page(1)->install_ram(0x6000, 0x7fff, m_sram.data());
page(1)->install_ram(0x6000, 0x7fff, &m_sram[0]);
page(1)->install_write_handler(0x7fc0, 0x7fc0, emu::rw_delegate(*m_i8251, FUNC(i8251_device::data_w)));
page(1)->install_read_handler(0x7fc0, 0x7fc0, emu::rw_delegate(*m_i8251, FUNC(i8251_device::data_r)));
page(1)->install_write_handler(0x7fc1, 0x7fc1, emu::rw_delegate(*m_i8251, FUNC(i8251_device::control_w)));

View File

@ -42,8 +42,8 @@ private:
uint8_t m_selected_bank[6];
bool m_ram_active[6];
uint8_t m_control;
std::vector<uint8_t> m_ram;
std::vector<uint8_t> m_empty_bank;
std::unique_ptr<u8[]> m_ram;
std::unique_ptr<u8[]> m_empty_bank;
};
@ -76,7 +76,7 @@ private:
required_memory_region m_rom_region;
memory_bank_creator m_rombank;
u32 m_region_offset;
std::vector<u8> m_sram;
std::unique_ptr<u8[]> m_sram;
};

View File

@ -255,21 +255,21 @@ void msx_slot_rs232_sony_device::device_start()
{
msx_slot_rs232_base_device::device_start();
m_ram.resize(RAM_SIZE);
save_item(NAME(m_ram));
m_ram = std::make_unique<u8[]>(RAM_SIZE);
save_pointer(NAME(m_ram), RAM_SIZE);
// TODO unmap rom from page 0
page(0)->install_ram(0x2000, 0x27ff, m_ram.data());
page(0)->install_ram(0x2000, 0x27ff, &m_ram[0]);
page(1)->install_rom(0x4000, 0x5fff, m_rom_region->base() + m_region_offset);
page(1)->install_ram(0x6000, 0x67ff, m_ram.data());
page(2)->install_ram(0xa000, 0xa7ff, m_ram.data());
page(1)->install_ram(0x6000, 0x67ff, &m_ram[0]);
page(2)->install_ram(0xa000, 0xa7ff, &m_ram[0]);
page(2)->install_read_handler(0xbff8, 0xbff9, emu::rw_delegate(*m_i8251, FUNC(i8251_device::read)));
page(2)->install_write_handler(0xbff8, 0xbff9, emu::rw_delegate(*m_i8251, FUNC(i8251_device::write)));
page(2)->install_read_handler(0xbffa, 0xbffa, emu::rw_delegate(*this, FUNC(msx_slot_rs232_sony_device::status_r)));
page(2)->install_write_handler(0xbffa, 0xbffa, emu::rw_delegate(*this, FUNC(msx_slot_rs232_sony_device::irq_mask_w)));
page(2)->install_read_handler(0xbffc, 0xbfff, emu::rw_delegate(*m_i8253, FUNC(pit8253_device::read)));
page(2)->install_write_handler(0xbffc, 0xbfff, emu::rw_delegate(*m_i8253, FUNC(pit8253_device::write)));
page(3)->install_ram(0xe000, 0xe7ff, m_ram.data());
page(3)->install_ram(0xe000, 0xe7ff, &m_ram[0]);
}
u8 msx_slot_rs232_sony_device::status_r(offs_t offset)
@ -454,10 +454,11 @@ void msx_slot_rs232_toshiba_hx3x_device::device_start()
io_space().install_readwrite_handler(0x82, 0x82, emu::rw_delegate(*this, FUNC(msx_slot_rs232_toshiba_hx3x_device::status_r)), emu::rw_delegate(*this, FUNC(msx_slot_rs232_toshiba_hx3x_device::irq_mask_w)));
io_space().install_readwrite_handler(0x84, 0x87, emu::rw_delegate(*m_i8253, FUNC(pit8253_device::read)), emu::rw_delegate(*m_i8253, FUNC(pit8253_device::write)));
m_sram.resize(SRAM_SIZE);
m_nvram->set_base(m_sram.data(), SRAM_SIZE);
m_sram = std::make_unique<u8[]>(SRAM_SIZE);
m_nvram->set_base(&m_sram[0], SRAM_SIZE);
save_item(NAME(m_bank_reg));
save_pointer(NAME(m_sram), SRAM_SIZE);
m_rombank->configure_entries(0, 4, m_rom_region->base() + m_region_offset + 0x4000, 0x4000);
@ -465,7 +466,7 @@ void msx_slot_rs232_toshiba_hx3x_device::device_start()
page(1)->install_read_handler(0x7fff, 0x7fff, emu::rw_delegate(*this, FUNC(msx_slot_rs232_toshiba_hx3x_device::bank_r)));
page(2)->install_view(0x8000, 0xbfff, m_view);
m_view[0].install_read_bank(0x8000, 0xbfff, m_rombank);
m_view[1].install_ram(0x8000, 0x87ff, 0x3800, m_sram.data());
m_view[1].install_ram(0x8000, 0x87ff, 0x3800, &m_sram[0]);
}
void msx_slot_rs232_toshiba_hx3x_device::device_reset()

View File

@ -95,7 +95,7 @@ protected:
static constexpr size_t RAM_SIZE = 0x800;
required_ioport m_switch_port;
std::vector<u8> m_ram;
std::unique_ptr<u8[]> m_ram;
};
@ -152,7 +152,7 @@ protected:
required_device<nvram_device> m_nvram;
memory_bank_creator m_rombank;
memory_view m_view;
std::vector<u8> m_sram;
std::unique_ptr<u8[]> m_sram;
u8 m_bank_reg;
};

View File

@ -41,20 +41,21 @@ void msx_slot_panasonic08_device::device_start()
fatalerror("Memory region '%s' is too small for the panasonic08 firmware\n", m_rom_region.finder_tag());
}
m_sram.resize(SRAM_SIZE);
m_sram = std::make_unique<u8[]>(SRAM_SIZE);
m_nvram->set_base(&m_sram[0], SRAM_SIZE);
save_item(NAME(m_selected_bank));
save_item(NAME(m_control));
save_pointer(NAME(m_sram), SRAM_SIZE);
for (int i = 0; i < 6; i++)
{
m_bank[i]->configure_entries(0, 0x100, m_rom_region->base() + m_region_offset, 0x2000);
m_bank[i]->configure_entry(0x80, m_sram.data());
m_bank[i]->configure_entry(0x81, m_sram.data() + 0x2000);
m_bank[i]->configure_entry(0x82, m_sram.data());
m_bank[i]->configure_entry(0x83, m_sram.data() + 0x2000);
m_bank[i]->configure_entry(0x80, &m_sram[0]);
m_bank[i]->configure_entry(0x81, &m_sram[0x2000]);
m_bank[i]->configure_entry(0x82, &m_sram[0]);
m_bank[i]->configure_entry(0x83, &m_sram[0x2000]);
}
page(0)->install_view(0x0000, 0x1fff, m_view[0]);

View File

@ -41,7 +41,7 @@ private:
u32 m_region_offset;
u8 m_selected_bank[6];
u8 m_control;
std::vector<uint8_t> m_sram;
std::unique_ptr<u8[]> m_sram;
};

View File

@ -52,6 +52,7 @@ void msx_slot_panasonic08r_device::device_start()
save_item(NAME(m_selected_bank));
save_item(NAME(m_control));
save_item(NAME(m_bank9));
save_pointer(NAME(m_sram), m_sram_size);
for (int i = 0; i < 8; i++)
{
@ -65,13 +66,13 @@ void msx_slot_panasonic08r_device::device_start()
}
// Assuming smaller internal RAM is mirrored.
int internal_ram_banks = m_mm->get_ram().size() / 0x2000;
int internal_ram_banks = m_mm->get_ram_size() / 0x2000;
int start_bank = 0x180;
do {
int nr_banks = internal_ram_banks;
if (start_bank + nr_banks > 0x200)
nr_banks = 0x200 - start_bank;
m_bank[i]->configure_entries(start_bank, nr_banks, m_mm->get_ram().data(), 0x2000);
m_bank[i]->configure_entries(start_bank, nr_banks, m_mm->get_ram_base(), 0x2000);
start_bank += internal_ram_banks;
}
while (start_bank < 0x200);

View File

@ -14,10 +14,13 @@ msx_slot_ram_device::msx_slot_ram_device(const machine_config &mconfig, const ch
void msx_slot_ram_device::device_start()
{
m_ram.resize(m_size);
save_item(NAME(m_ram));
if (m_size < m_end_address - m_start_address)
fatalerror("Invalid size %04x for address range %004x - %04x\n", m_start_address, m_end_address);
u8 *ram = m_ram.data();
m_ram = std::make_unique<u8[]>(m_size);
save_pointer(NAME(m_ram), m_size);
u8 *ram = &m_ram[0];
u32 start_address = m_start_address;
for (int i = m_start_address >> 14; i < 4 && i * 0x4000 < m_end_address; i++)
{

View File

@ -20,7 +20,7 @@ protected:
virtual void device_start() override;
private:
std::vector<u8> m_ram;
std::unique_ptr<u8[]> m_ram;
};

View File

@ -30,9 +30,8 @@ void msx_slot_ram_mm_device::device_start()
default: fatalerror("Invalid memory mapper size specified\n");
}
m_ram.resize(m_total_size);
save_item(NAME(m_ram));
m_ram = std::make_unique<u8[]>(m_total_size);
save_pointer(NAME(m_ram), m_total_size);
// Install IO read/write handlers using taps to prevent overwriting taps
// installed by other (external) memory mapper devices.
@ -41,7 +40,7 @@ void msx_slot_ram_mm_device::device_start()
for (int i = 0; i < 4; i++)
{
m_rambank[i]->configure_entries(0, u32(m_bank_mask) + 1, m_ram.data(), 0x4000);
m_rambank[i]->configure_entries(0, u32(m_bank_mask) + 1, &m_ram[0], 0x4000);
page(i)->install_readwrite_bank(0x4000 * i, (0x4000 * i) + 0x3fff, m_rambank[i]);
}
}

View File

@ -16,7 +16,8 @@ public:
msx_slot_ram_mm_device &set_unused_bits(u8 unused_bits) { m_unused_bits = unused_bits; return *this; }
// Backdoor for the Turbo-R firmware/internal mapper to access internal RAM.
std::vector<u8> &get_ram() { return m_ram; }
u32 get_ram_size() { return m_total_size; }
u8 *get_ram_base() { return &m_ram[0]; }
protected:
virtual void device_start() override;
@ -25,7 +26,7 @@ private:
u8 read_mapper_bank(offs_t offset);
void write_mapper_bank(offs_t offset, u8 data);
std::vector<u8> m_ram;
std::unique_ptr<u8[]> m_ram;
u32 m_total_size;
u8 m_bank_mask;
u8 m_unused_bits;

View File

@ -38,8 +38,10 @@ void msx_slot_sony08_device::device_start()
fatalerror("Memory region '%s' is too small for the SONY08 firmware\n", m_rom_region.finder_tag());
}
m_sram.resize(SRAM_SIZE);
m_nvram->set_base(m_sram.data(), SRAM_SIZE);
m_sram= std::make_unique<u8[]>(SRAM_SIZE);
m_nvram->set_base(&m_sram[0], SRAM_SIZE);
save_pointer(NAME(m_sram), SRAM_SIZE);
for (int i = 0; i < 4; i++)
m_rombank[i]->configure_entries(0, 0x80, m_rom_region->base() + m_region_offset, 0x2000);
@ -48,7 +50,7 @@ void msx_slot_sony08_device::device_start()
page(0)->install_view(0x0000, 0x3fff, m_view[0]);
m_view[0][0];
m_view[0][1].install_ram(0x0000, 0x3fff, m_sram.data());
m_view[0][1].install_ram(0x0000, 0x3fff, &m_sram[0]);
page(1)->install_read_bank(0x4000, 0x5fff, m_rombank[0]);
page(1)->install_write_handler(0x4fff, 0x4fff, emu::rw_delegate(*this, FUNC(msx_slot_sony08_device::bank_w<0>)));

View File

@ -36,7 +36,7 @@ private:
memory_bank_array_creator<6> m_rombank;
memory_view m_view[2];
u32 m_region_offset;
std::vector<u8> m_sram;
std::unique_ptr<u8[]> m_sram;
};