diff options
Diffstat (limited to 'src/devices/bus/z88/z88.cpp')
-rw-r--r-- | src/devices/bus/z88/z88.cpp | 85 |
1 files changed, 51 insertions, 34 deletions
diff --git a/src/devices/bus/z88/z88.cpp b/src/devices/bus/z88/z88.cpp index c65cc3d97a7..fe77274a8ed 100644 --- a/src/devices/bus/z88/z88.cpp +++ b/src/devices/bus/z88/z88.cpp @@ -26,7 +26,7 @@ DEFINE_DEVICE_TYPE(Z88CART_SLOT, z88cart_slot_device, "z88cart_slot", "Z88 Cartr //************************************************************************** -// Z88 cartridges Interface +// Z88 Cartridge Interface //************************************************************************** //------------------------------------------------- @@ -57,7 +57,7 @@ device_z88cart_interface::~device_z88cart_interface() //------------------------------------------------- z88cart_slot_device::z88cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, Z88CART_SLOT, tag, owner, clock) - , device_image_interface(mconfig, *this) + , device_cartrom_image_interface(mconfig, *this) , device_single_card_slot_interface<device_z88cart_interface>(mconfig, *this) , m_out_flp_cb(*this) , m_cart(nullptr) @@ -73,63 +73,52 @@ void z88cart_slot_device::device_start() { m_cart = get_card_device(); - // resolve callbacks - m_out_flp_cb.resolve_safe(); - - m_flp_timer = timer_alloc(TIMER_FLP_CLEAR); + m_flp_timer = timer_alloc(FUNC(z88cart_slot_device::close_flap), this); m_flp_timer->reset(); } //------------------------------------------------- -// device_timer - handler timer events +// close_flap //------------------------------------------------- -void z88cart_slot_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +TIMER_CALLBACK_MEMBER(z88cart_slot_device::close_flap) { - if (id == TIMER_FLP_CLEAR) - { - // close the flap - m_out_flp_cb(CLEAR_LINE); - } + // close the flap + m_out_flp_cb(CLEAR_LINE); } /*------------------------------------------------- call load -------------------------------------------------*/ -image_init_result z88cart_slot_device::call_load() +std::pair<std::error_condition, std::string> z88cart_slot_device::call_load() { if (m_cart) { - uint8_t *cart_base = m_cart->get_cart_base(); + uint8_t *const cart_base = m_cart->get_cart_base(); + if (!cart_base) + return std::make_pair(image_error::INTERNAL, std::string()); - if (cart_base != nullptr) + if (!loaded_through_softlist()) { - if (!loaded_through_softlist()) - { - offs_t read_length = length(); - fread(cart_base + (m_cart->get_cart_size() - read_length), read_length); - } - else - { - offs_t read_length = get_software_region_length("rom"); - memcpy(cart_base + (m_cart->get_cart_size() - read_length), get_software_region("rom"), read_length); - } + offs_t read_length = length(); + fread(cart_base + (m_cart->get_cart_size() - read_length), read_length); } else { - return image_init_result::FAIL; + offs_t read_length = get_software_region_length("rom"); + memcpy(cart_base + (m_cart->get_cart_size() - read_length), get_software_region("rom"), read_length); } } // open the flap m_out_flp_cb(ASSERT_LINE); - // setup the timer for close the flap + // setup the timer to close the flap m_flp_timer->adjust(CLOSE_FLAP_TIME); - return image_init_result::PASS; + return std::make_pair(std::error_condition(), std::string()); } @@ -151,7 +140,7 @@ void z88cart_slot_device::call_unload() // open the flap m_out_flp_cb(ASSERT_LINE); - // setup the timer for close the flap + // setup the timer to close the flap m_flp_timer->adjust(CLOSE_FLAP_TIME); } @@ -162,6 +151,24 @@ void z88cart_slot_device::call_unload() std::string z88cart_slot_device::get_default_card_software(get_default_card_software_hook &hook) const { + // select the correct slot device for the ROM size + if (hook.image_file()) + { + uint64_t size; + std::error_condition err = hook.image_file()->length(size); + + if (!err) + { + if (size <= 0x8000) return std::string("32krom"); + if (size <= 0x20000) return std::string("128krom"); + if (size <= 0x40000) return std::string("256krom"); + if (size <= 0x100000) return std::string("1024kflash"); + fatalerror("%s: unsupported ROM size 0x%06x", tag(), size); + } + else + fatalerror("%s: %s:%d %s\n", tag(), err.category().name(), err.value(), err.message()); + } + return software_get_default_slot("128krom"); } @@ -170,10 +177,10 @@ std::string z88cart_slot_device::get_default_card_software(get_default_card_soft read -------------------------------------------------*/ -READ8_MEMBER(z88cart_slot_device::read) +uint8_t z88cart_slot_device::read(offs_t offset) { if (m_cart) - return m_cart->read(space, offset); + return m_cart->read(offset); else return 0xff; } @@ -183,10 +190,20 @@ READ8_MEMBER(z88cart_slot_device::read) write -------------------------------------------------*/ -WRITE8_MEMBER(z88cart_slot_device::write) +void z88cart_slot_device::write(offs_t offset, uint8_t data) +{ + if (m_cart) + m_cart->write(offset, data); +} + +/*------------------------------------------------- + set EPROM programming voltage to slot 3 +-------------------------------------------------*/ + +void z88cart_slot_device::vpp_w(int state) { if (m_cart) - m_cart->write(space, offset, data); + m_cart->vpp_w(state); } |