summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/z88/z88.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/z88/z88.cpp')
-rw-r--r--src/devices/bus/z88/z88.cpp77
1 files changed, 47 insertions, 30 deletions
diff --git a/src/devices/bus/z88/z88.cpp b/src/devices/bus/z88/z88.cpp
index 024c960a9b7..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");
}
@@ -189,6 +196,16 @@ void z88cart_slot_device::write(offs_t offset, uint8_t data)
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->vpp_w(state);
+}
+
/*-------------------------------------------------
get_cart_base