From cadaf6d17b1584cabf088e19ad1ceb29fc8c623d Mon Sep 17 00:00:00 2001 From: tim lindner Date: Sun, 7 Oct 2018 17:29:02 -0700 Subject: [PATCH] Fixed Zumwalt banking thru the Multi-Pak. --- src/devices/bus/coco/coco_multi.cpp | 11 ++++++++++ src/devices/bus/coco/coco_pak.cpp | 22 +++++++++++++++++++- src/devices/bus/coco/coco_pak.h | 2 ++ src/devices/bus/coco/cococart.cpp | 32 ++++++++++++++++++++++------- src/devices/bus/coco/cococart.h | 4 +++- 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp index e8ae24c7b60..60a2b99286c 100644 --- a/src/devices/bus/coco/coco_multi.cpp +++ b/src/devices/bus/coco/coco_multi.cpp @@ -100,6 +100,7 @@ namespace virtual void device_add_mconfig(machine_config &config) override; virtual uint8_t* get_cart_base() override; + virtual uint32_t get_cart_size() override; // these are only public so they can be in a MACHINE_CONFIG_START // declaration; don't think about them as publically accessable @@ -443,6 +444,16 @@ uint8_t* coco_multipak_device::get_cart_base() } +//------------------------------------------------- +// get_cart_size +//------------------------------------------------- + +uint32_t coco_multipak_device::get_cart_size() +{ + return active_cts_slot().get_cart_size(); +} + + //------------------------------------------------- // scs_read //------------------------------------------------- diff --git a/src/devices/bus/coco/coco_pak.cpp b/src/devices/bus/coco/coco_pak.cpp index 7c184dc67ad..16f17441ed4 100644 --- a/src/devices/bus/coco/coco_pak.cpp +++ b/src/devices/bus/coco/coco_pak.cpp @@ -95,6 +95,15 @@ const tiny_rom_entry *coco_pak_device::device_rom_region() const return ROM_NAME( coco_pak ); } +//------------------------------------------------- +// get_cart_size +//------------------------------------------------- + +uint32_t coco_pak_device::get_cart_size() +{ + return 0x8000; +} + /*------------------------------------------------- device_reset - device-specific startup -------------------------------------------------*/ @@ -121,6 +130,17 @@ uint8_t* coco_pak_device::get_cart_base() return memregion(CARTSLOT_TAG)->base(); } +/*------------------------------------------------- + get_cart_memregion +-------------------------------------------------*/ + +memory_region* coco_pak_device::get_cart_memregion() +{ + return memregion(CARTSLOT_TAG); +} + + + /*************************************************************************** BANKED CARTRIDGES ***************************************************************************/ @@ -199,7 +219,7 @@ uint8_t *coco_pak_banked_device::get_cart_base() uint32_t coco_pak_banked_device::get_cart_size() { - return 0x20000; + return 0x4000; } //------------------------------------------------- diff --git a/src/devices/bus/coco/coco_pak.h b/src/devices/bus/coco/coco_pak.h index 088d7e278ac..43168e5e32c 100644 --- a/src/devices/bus/coco/coco_pak.h +++ b/src/devices/bus/coco/coco_pak.h @@ -26,6 +26,8 @@ public: virtual ioport_constructor device_input_ports() const override; virtual uint8_t* get_cart_base() override; + virtual uint32_t get_cart_size() override; + virtual memory_region* get_cart_memregion() override; protected: coco_pak_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp index 93d1c42453f..2c009aa8724 100644 --- a/src/devices/bus/coco/cococart.cpp +++ b/src/devices/bus/coco/cococart.cpp @@ -387,9 +387,9 @@ uint32_t cococart_slot_device::get_cart_size() { if (m_cart != nullptr) return m_cart->get_cart_size(); - return 0; -} + return 0x8000; +} //------------------------------------------------- // set_cart_base_update @@ -410,20 +410,24 @@ image_init_result cococart_slot_device::call_load() { if (m_cart) { - offs_t read_length; + memory_region *cart_mem = m_cart->get_cart_memregion(); + uint8_t *base = cart_mem->base(); + offs_t read_length, cart_legnth = cart_mem->bytes();; + if (!loaded_through_softlist()) { - read_length = fread(m_cart->get_cart_base(), m_cart->get_cart_size()); + read_length = fread(base, cart_legnth); } else { read_length = get_software_region_length("rom"); - memcpy(m_cart->get_cart_base(), get_software_region("rom"), read_length); + memcpy(base, get_software_region("rom"), read_length); } - while(read_length < m_cart->get_cart_size()) + + while (read_length < cart_legnth) { offs_t len = std::min(read_length, m_cart->get_cart_size() - read_length); - memcpy(m_cart->get_cart_base() + read_length, m_cart->get_cart_base(), len); + memcpy(base + read_length, base, len); read_length += len; } } @@ -565,8 +569,22 @@ void device_cococart_interface::cart_base_changed(void) { if (!m_update.isnull()) m_update(get_cart_base()); + else + { + // propagate up to host interface + device_cococart_interface *host = dynamic_cast(m_host); + host->cart_base_changed(); + } } +/*------------------------------------------------- + get_cart_memregion +-------------------------------------------------*/ + +memory_region* device_cococart_interface::get_cart_memregion() +{ + return 0; +} //------------------------------------------------- // cartridge_space diff --git a/src/devices/bus/coco/cococart.h b/src/devices/bus/coco/cococart.h index 325d5f2e1d6..2d5d37fd443 100644 --- a/src/devices/bus/coco/cococart.h +++ b/src/devices/bus/coco/cococart.h @@ -114,7 +114,7 @@ public: // cart base uint8_t *get_cart_base(); - uint32_t get_cart_size(); + virtual uint32_t get_cart_size(); void set_cart_base_update(cococart_base_update_delegate update); private: @@ -180,6 +180,8 @@ public: virtual uint8_t* get_cart_base(); virtual uint32_t get_cart_size(); void set_cart_base_update(cococart_base_update_delegate update); + virtual memory_region* get_cart_memregion(); + virtual void interface_config_complete() override; virtual void interface_pre_start() override;