From 879470fc1b3df18996d58436f9f580318d52e2ec Mon Sep 17 00:00:00 2001 From: MooglyGuy Date: Fri, 18 Jan 2019 19:32:28 +0100 Subject: [PATCH] -vsmile_slot: Added NVRAM support which should work, but doesn't. nw --- hash/vsmile_cart.xml | 8 ++++---- src/devices/bus/vsmile/rom.cpp | 26 +++++++++++++------------- src/devices/bus/vsmile/rom.h | 10 +++++----- src/devices/bus/vsmile/vsmile_slot.cpp | 24 ++++++++++++++++++------ src/devices/bus/vsmile/vsmile_slot.h | 13 ++++++++----- src/mame/drivers/vsmile.cpp | 4 ++-- 6 files changed, 50 insertions(+), 35 deletions(-) diff --git a/hash/vsmile_cart.xml b/hash/vsmile_cart.xml index 1d60db5ef70..7e607636156 100644 --- a/hash/vsmile_cart.xml +++ b/hash/vsmile_cart.xml @@ -2234,7 +2234,7 @@ Game cartridges VTech - + @@ -2243,7 +2243,7 @@ Game cartridges - + @@ -2254,7 +2254,7 @@ Game cartridges VTech - + @@ -2263,7 +2263,7 @@ Game cartridges - + diff --git a/src/devices/bus/vsmile/rom.cpp b/src/devices/bus/vsmile/rom.cpp index 627b93f56c1..49740bc7f37 100644 --- a/src/devices/bus/vsmile/rom.cpp +++ b/src/devices/bus/vsmile/rom.cpp @@ -4,7 +4,7 @@ V.Smile cart emulation - We support standard carts and one with on-board RAM + We support standard carts and one with on-board NVRAM ***********************************************************************************************************/ @@ -17,8 +17,8 @@ // vsmile_rom_device - constructor //------------------------------------------------- -DEFINE_DEVICE_TYPE(VSMILE_ROM_STD, vsmile_rom_device, "vsmile_rom", "V.Smile Cart") -DEFINE_DEVICE_TYPE(VSMILE_ROM_RAM, vsmile_rom_ram_device, "vsmile_rom_ram", "V.Smile Cart + RAM") +DEFINE_DEVICE_TYPE(VSMILE_ROM_STD, vsmile_rom_device, "vsmile_rom", "V.Smile Cart") +DEFINE_DEVICE_TYPE(VSMILE_ROM_NVRAM, vsmile_rom_nvram_device, "vsmile_rom_nvram", "V.Smile Cart + NVRAM") vsmile_rom_device::vsmile_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) @@ -32,13 +32,13 @@ vsmile_rom_device::vsmile_rom_device(const machine_config &mconfig, const char * { } -vsmile_rom_ram_device::vsmile_rom_ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) +vsmile_rom_nvram_device::vsmile_rom_nvram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : vsmile_rom_device(mconfig, type, tag, owner, clock) { } -vsmile_rom_ram_device::vsmile_rom_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : vsmile_rom_ram_device(mconfig, VSMILE_ROM_RAM, tag, owner, clock) +vsmile_rom_nvram_device::vsmile_rom_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : vsmile_rom_nvram_device(mconfig, VSMILE_ROM_NVRAM, tag, owner, clock) { } @@ -57,19 +57,19 @@ void vsmile_rom_device::device_reset() /*------------------------------------------------- - Carts with RAM + Cart with NVRAM -------------------------------------------------*/ -READ16_MEMBER(vsmile_rom_ram_device::bank2_r) +READ16_MEMBER(vsmile_rom_nvram_device::bank2_r) { - if (!m_ram.empty() && offset < m_ram.size()) - return m_ram[offset]; + if (!m_nvram.empty() && offset < m_nvram.size()) + return m_nvram[offset]; else // this cannot actually happen... return 0; } -WRITE16_MEMBER(vsmile_rom_ram_device::bank2_w) +WRITE16_MEMBER(vsmile_rom_nvram_device::bank2_w) { - if (!m_ram.empty() && offset < m_ram.size()) - COMBINE_DATA(&m_ram[offset]); + if (!m_nvram.empty() && offset < m_nvram.size()) + COMBINE_DATA(&m_nvram[offset]); } diff --git a/src/devices/bus/vsmile/rom.h b/src/devices/bus/vsmile/rom.h index 18208b6c4c7..5d93cb64109 100644 --- a/src/devices/bus/vsmile/rom.h +++ b/src/devices/bus/vsmile/rom.h @@ -30,25 +30,25 @@ protected: }; -// ======================> vsmile_rom_ram_device +// ======================> vsmile_rom_nvram_device -class vsmile_rom_ram_device : public vsmile_rom_device +class vsmile_rom_nvram_device : public vsmile_rom_device { public: // construction/destruction - vsmile_rom_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + vsmile_rom_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual DECLARE_READ16_MEMBER(bank2_r) override; virtual DECLARE_WRITE16_MEMBER(bank2_w) override; protected: - vsmile_rom_ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + vsmile_rom_nvram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); }; // device type definition DECLARE_DEVICE_TYPE(VSMILE_ROM_STD, vsmile_rom_device) -DECLARE_DEVICE_TYPE(VSMILE_ROM_RAM, vsmile_rom_ram_device) +DECLARE_DEVICE_TYPE(VSMILE_ROM_NVRAM, vsmile_rom_nvram_device) #endif // MAME_BUS_VSMILE_ROM_H diff --git a/src/devices/bus/vsmile/vsmile_slot.cpp b/src/devices/bus/vsmile/vsmile_slot.cpp index 7e33578f00e..9489c1f38dd 100644 --- a/src/devices/bus/vsmile/vsmile_slot.cpp +++ b/src/devices/bus/vsmile/vsmile_slot.cpp @@ -57,12 +57,12 @@ void device_vsmile_cart_interface::rom_alloc(uint32_t size, const char *tag) //------------------------------------------------- -// ram_alloc - alloc the space for the ram +// nvram_alloc - alloc the space for the nvram //------------------------------------------------- -void device_vsmile_cart_interface::ram_alloc(uint32_t size) +void device_vsmile_cart_interface::nvram_alloc(uint32_t size) { - m_ram.resize(size / sizeof(uint16_t)); + m_nvram.resize(size / sizeof(uint16_t)); } @@ -115,7 +115,7 @@ struct vsmile_slot static const vsmile_slot slot_list[] = { { VSMILE_STD, "vsmile_rom" }, - { VSMILE_SRAM, "vsmile_ram" }, + { VSMILE_NVRAM, "vsmile_nvram" }, }; static int vsmile_get_pcb_id(const char *slot) @@ -164,9 +164,15 @@ image_init_result vsmile_cart_slot_device::call_load() osd_printf_info("V.Smile: Detected (XML) %s\n", pcb_name ? pcb_name : "NONE"); } - if (m_type == VSMILE_SRAM) + if (m_type == VSMILE_NVRAM) { - m_cart->ram_alloc(0x200000); + m_cart->nvram_alloc(0x200000); + } + + if (m_cart->get_nvram_size()) + { + printf("nvram_size 1\n"); + battery_load(m_cart->get_nvram_base(), m_cart->get_nvram_size(), 0x00); } return image_init_result::PASS; @@ -182,6 +188,12 @@ image_init_result vsmile_cart_slot_device::call_load() void vsmile_cart_slot_device::call_unload() { + if (m_cart) + printf("nvram_size: %d\n", m_cart->get_nvram_size()); + if (m_cart && m_cart->get_nvram_size()) + { + battery_save(m_cart->get_nvram_base(), m_cart->get_nvram_size()); + } } diff --git a/src/devices/bus/vsmile/vsmile_slot.h b/src/devices/bus/vsmile/vsmile_slot.h index 559d0185f93..0eceee33a25 100644 --- a/src/devices/bus/vsmile/vsmile_slot.h +++ b/src/devices/bus/vsmile/vsmile_slot.h @@ -17,7 +17,7 @@ enum { VSMILE_STD = 0, - VSMILE_SRAM + VSMILE_NVRAM }; // ======================> device_vsmile_cart_interface @@ -39,20 +39,22 @@ public: virtual DECLARE_WRITE16_MEMBER(bank3_w) { printf("3 %08x = %04x\n", offset, data); } void rom_alloc(uint32_t size, const char *tag); - void ram_alloc(uint32_t size); + void nvram_alloc(uint32_t size); uint16_t* get_rom_base() { return m_rom; } - uint16_t* get_ram_base() { return &m_ram[0]; } + uint16_t* get_nvram_base() { return &m_nvram[0]; } uint32_t get_rom_size() { return m_rom_size; } - uint32_t get_ram_size() { return m_ram.size() * sizeof(uint16_t); } + uint32_t get_nvram_size() { return m_nvram.size() * sizeof(uint16_t); } void set_rom_size(uint32_t val) { m_rom_size = val; } + void save_nvram() { device().save_item(NAME(m_nvram)); } + protected: device_vsmile_cart_interface(const machine_config &mconfig, device_t &device); // internal state uint16_t *m_rom; // this points to the cart rom region uint32_t m_rom_size; // this is the actual game size, not the rom region size! - std::vector m_ram; + std::vector m_nvram; }; @@ -84,6 +86,7 @@ public: virtual void call_unload() override; virtual const software_list_loader &get_software_list_loader() const override { return rom_software_list_loader::instance(); } + void save_nvram() { if (m_cart && m_cart->get_nvram_size()) m_cart->save_nvram(); } uint32_t get_rom_size() { if (m_cart) return m_cart->get_rom_size(); return 0; } virtual iodevice_t image_type() const override { return IO_CARTSLOT; } diff --git a/src/mame/drivers/vsmile.cpp b/src/mame/drivers/vsmile.cpp index 8fe97323b80..dbf61382002 100644 --- a/src/mame/drivers/vsmile.cpp +++ b/src/mame/drivers/vsmile.cpp @@ -557,8 +557,8 @@ INPUT_PORTS_END static void vsmile_cart(device_slot_interface &device) { - device.option_add_internal("vsmile_rom", VSMILE_ROM_STD); - device.option_add_internal("vsmile_ram", VSMILE_ROM_RAM); + device.option_add_internal("vsmile_rom", VSMILE_ROM_STD); + device.option_add_internal("vsmile_nvram", VSMILE_ROM_NVRAM); } void vsmile_base_state::vsmile_base(machine_config &config)