summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/coco/cococart.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/coco/cococart.cpp')
-rw-r--r--src/devices/bus/coco/cococart.cpp79
1 files changed, 37 insertions, 42 deletions
diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp
index 60e6f5c840a..2c385890311 100644
--- a/src/devices/bus/coco/cococart.cpp
+++ b/src/devices/bus/coco/cococart.cpp
@@ -44,6 +44,7 @@
#include "coco_dcmodem.h"
#include "coco_fdc.h"
#include "coco_gmc.h"
+#include "coco_ide.h"
#include "coco_max.h"
#include "coco_midi.h"
#include "coco_multi.h"
@@ -72,7 +73,6 @@
PARAMETERS
***************************************************************************/
-//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
#define LOG_CART (1U << 1) // shows cart line changes
#define LOG_NMI (1U << 2) // shows switch changes
#define LOG_HALT (1U << 3) // shows switch changes
@@ -89,14 +89,6 @@
CONSTANTS
***************************************************************************/
-enum
-{
- TIMER_CART,
- TIMER_NMI,
- TIMER_HALT
-};
-
-
// definitions of RPK PCBs in layout.xml
static const char *coco_rpk_pcbdefs[] =
{
@@ -133,7 +125,7 @@ ALLOW_SAVE_TYPE(cococart_slot_device::line_value);
cococart_slot_device::cococart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
device_t(mconfig, COCOCART_SLOT, tag, owner, clock),
device_single_card_slot_interface<device_cococart_interface>(mconfig, *this),
- device_image_interface(mconfig, *this),
+ device_cartrom_image_interface(mconfig, *this),
m_cart_callback(*this),
m_nmi_callback(*this),
m_halt_callback(*this), m_cart(nullptr)
@@ -148,11 +140,11 @@ cococart_slot_device::cococart_slot_device(const machine_config &mconfig, const
void cococart_slot_device::device_start()
{
- for(int i=0; i<TIMER_POOL; i++ )
+ for(int i=0; i < TIMER_POOL; i++ )
{
- m_cart_line.timer[i] = timer_alloc(TIMER_CART);
- m_nmi_line.timer[i] = timer_alloc(TIMER_NMI);
- m_halt_line.timer[i] = timer_alloc(TIMER_HALT);
+ m_cart_line.timer[i] = timer_alloc(FUNC(cococart_slot_device::cart_line_timer_tick), this);
+ m_nmi_line.timer[i] = timer_alloc(FUNC(cococart_slot_device::nmi_line_timer_tick), this);
+ m_halt_line.timer[i] = timer_alloc(FUNC(cococart_slot_device::halt_line_timer_tick), this);
}
m_cart_line.timer_index = 0;
@@ -160,7 +152,6 @@ void cococart_slot_device::device_start()
m_cart_line.value = line_value::CLEAR;
m_cart_line.line = 0;
m_cart_line.q_count = 0;
- m_cart_callback.resolve();
m_cart_line.callback = &m_cart_callback;
m_nmi_line.timer_index = 0;
@@ -168,7 +159,6 @@ void cococart_slot_device::device_start()
m_nmi_line.value = line_value::CLEAR;
m_nmi_line.line = 0;
m_nmi_line.q_count = 0;
- m_nmi_callback.resolve();
m_nmi_line.callback = &m_nmi_callback;
m_halt_line.timer_index = 0;
@@ -176,7 +166,6 @@ void cococart_slot_device::device_start()
m_halt_line.value = line_value::CLEAR;
m_halt_line.line = 0;
m_halt_line.q_count = 0;
- m_halt_callback.resolve();
m_halt_line.callback = &m_halt_callback;
m_cart = get_card_device();
@@ -203,28 +192,37 @@ void cococart_slot_device::device_start()
//-------------------------------------------------
-// device_timer - handle timer callbacks
+// cart_line_timer_tick - update the output
+// value for the cart's line to PIA1 CB1
//-------------------------------------------------
-void cococart_slot_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+TIMER_CALLBACK_MEMBER(cococart_slot_device::cart_line_timer_tick)
{
- switch(id)
- {
- case TIMER_CART:
- set_line(line::CART, m_cart_line, (line_value) param);
- break;
+ set_line(line::CART, m_cart_line, (line_value) param);
+}
- case TIMER_NMI:
- set_line(line::NMI, m_nmi_line, (line_value) param);
- break;
+//-------------------------------------------------
+// nmi_line_timer_tick - update the output
+// value sent to the CPU's NMI line
+//-------------------------------------------------
- case TIMER_HALT:
- set_line(line::HALT, m_halt_line, (line_value) param);
- break;
- }
+TIMER_CALLBACK_MEMBER(cococart_slot_device::nmi_line_timer_tick)
+{
+ set_line(line::NMI, m_nmi_line, (line_value) param);
+}
+
+//-------------------------------------------------
+// halt_line_timer_tick - update the output
+// value sent to the CPU's HALT line
+//-------------------------------------------------
+
+TIMER_CALLBACK_MEMBER(cococart_slot_device::halt_line_timer_tick)
+{
+ set_line(line::HALT, m_halt_line, (line_value) param);
}
+
//-------------------------------------------------
// cts_read
//-------------------------------------------------
@@ -344,9 +342,8 @@ void cococart_slot_device::set_line(line ln, coco_cartridge_line &line, cococart
break;
}
- /* invoke the callback, if present */
- if (!(*line.callback).isnull())
- (*line.callback)(line.line);
+ /* invoke the callback */
+ (*line.callback)(line.line);
}
}
@@ -573,7 +570,7 @@ static std::error_condition read_coco_rpk(std::unique_ptr<util::random_read> &&s
// call_load
//-------------------------------------------------
-image_init_result cococart_slot_device::call_load()
+std::pair<std::error_condition, std::string> cococart_slot_device::call_load()
{
if (m_cart)
{
@@ -595,7 +592,7 @@ image_init_result cococart_slot_device::call_load()
if (!err)
err = read_coco_rpk(std::move(proxy), base, cart_length, read_length);
if (err)
- return image_init_result::FAIL;
+ return std::make_pair(err, std::string());
}
else
{
@@ -610,7 +607,7 @@ image_init_result cococart_slot_device::call_load()
read_length += len;
}
}
- return image_init_result::PASS;
+ return std::make_pair(std::error_condition(), std::string());
}
@@ -655,7 +652,7 @@ template class device_finder<device_cococart_interface, true>;
device_cococart_interface::device_cococart_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "cococart")
- , m_owning_slot(nullptr)
+ , m_owning_slot(dynamic_cast<cococart_slot_device *>(device.owner()))
, m_host(nullptr)
{
}
@@ -676,7 +673,6 @@ device_cococart_interface::~device_cococart_interface()
void device_cococart_interface::interface_config_complete()
{
- m_owning_slot = dynamic_cast<cococart_slot_device *>(device().owner());
m_host = m_owning_slot
? dynamic_cast<device_cococart_host_interface *>(m_owning_slot->owner())
: nullptr;
@@ -834,6 +830,7 @@ void coco_cart_add_basic_devices(device_slot_interface &device)
device.option_add("ccpsg", COCO_PSG);
device.option_add("dcmodem", COCO_DCMODEM);
device.option_add("gmc", COCO_PAK_GMC);
+ device.option_add("ide", COCO_IDE);
device.option_add("max", COCO_PAK_MAX);
device.option_add("midi", COCO_MIDI);
device.option_add("orch90", COCO_ORCH90);
@@ -858,12 +855,10 @@ void coco_cart_add_fdcs(device_slot_interface &device)
{
// FDCs are optional because if they are on a Multi-Pak interface, they must
// be on Slot 4
- device.option_add("cc2hdb1", COCO2_HDB1);
- device.option_add("cc3hdb1", COCO3_HDB1);
device.option_add("cd6809_fdc", CD6809_FDC);
device.option_add("cp450_fdc", CP450_FDC);
device.option_add("fdc", COCO_FDC);
- device.option_add("fdcv11", COCO_FDC_V11);
+ device.option_add("scii", COCO_SCII);
}