summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/ap2_slot.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/ap2_slot.c')
-rw-r--r--src/mess/machine/ap2_slot.c233
1 files changed, 233 insertions, 0 deletions
diff --git a/src/mess/machine/ap2_slot.c b/src/mess/machine/ap2_slot.c
new file mode 100644
index 00000000000..6c76bc7e361
--- /dev/null
+++ b/src/mess/machine/ap2_slot.c
@@ -0,0 +1,233 @@
+/*********************************************************************
+
+ ap2_slot.c
+
+ Implementation of Apple II device slots
+
+*********************************************************************/
+
+#include "ap2_slot.h"
+#include "includes/apple2.h"
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+typedef struct _apple2_slot_token apple2_slot_token;
+struct _apple2_slot_token
+{
+ device_t *slot_device;
+};
+
+
+
+/***************************************************************************
+ INLINE FUNCTIONS
+***************************************************************************/
+
+INLINE void assert_valid(device_t *device)
+{
+ assert(device != NULL);
+ assert(device->type() == APPLE2_SLOT);
+}
+
+
+
+INLINE const apple2_slot_config *get_config(device_t *device)
+{
+ assert_valid(device);
+ return (const apple2_slot_config *) downcast<const legacy_device_base *>(device)->inline_config();
+}
+
+
+
+INLINE apple2_slot_token *get_token(device_t *device)
+{
+ assert_valid(device);
+ return (apple2_slot_token *) downcast<legacy_device_base *>(device)->token();
+}
+
+
+
+/***************************************************************************
+ CORE IMPLEMENTATION
+***************************************************************************/
+
+/*-------------------------------------------------
+ apple2_slot - looks up a slot
+-------------------------------------------------*/
+
+device_t *apple2_slot(running_machine &machine, int slotnum)
+{
+ char buffer[7];
+
+ assert((slotnum >= 0) && (slotnum <= 7));
+ snprintf(buffer, ARRAY_LENGTH(buffer), "slot_%d", slotnum);
+
+ return machine.device(buffer);
+}
+
+
+
+/*-------------------------------------------------
+ DEVICE_START(apple2_slot) - device start
+ function
+-------------------------------------------------*/
+
+static DEVICE_START(apple2_slot)
+{
+ const apple2_slot_config *config = get_config(device);
+ apple2_slot_token *token = get_token(device);
+
+ if (config->tag != NULL)
+ {
+ /* locate the device */
+ token->slot_device = device->machine().device(config->tag);
+
+ assert(token->slot_device != NULL);
+ }
+ else
+ {
+ token->slot_device = NULL;
+ }
+}
+
+
+
+/*-------------------------------------------------
+ apple2_slot_r - slot read function
+-------------------------------------------------*/
+
+READ8_DEVICE_HANDLER(apple2_slot_r)
+{
+ UINT8 result = 0x00;
+ const apple2_slot_config *config = get_config(device);
+ apple2_slot_token *token = get_token(device);
+
+ /* do we actually have a device, and can we read? */
+ if ((token->slot_device != NULL) && (config->rh != NULL))
+ {
+ result = (*config->rh)(token->slot_device, offset);
+ }
+
+ return result;
+}
+
+
+
+/*-------------------------------------------------
+ apple2_slot_w - slot write function
+-------------------------------------------------*/
+
+WRITE8_DEVICE_HANDLER(apple2_slot_w)
+{
+ const apple2_slot_config *config = get_config(device);
+ apple2_slot_token *token = get_token(device);
+
+ /* do we actually have a device, and can we read? */
+ if ((token->slot_device != NULL) && (config->wh != NULL))
+ {
+ (*config->wh)(token->slot_device, offset, data);
+ }
+}
+
+/*-------------------------------------------------
+ apple2_c800_slot_r - slot read function
+-------------------------------------------------*/
+
+READ8_DEVICE_HANDLER(apple2_c800_slot_r)
+{
+ UINT8 result = 0x00;
+ const apple2_slot_config *config = get_config(device);
+ apple2_slot_token *token = get_token(device);
+
+ /* do we actually have a device, and can we read? */
+ if ((token->slot_device != NULL) && (config->rhc800 != NULL))
+ {
+ result = (*config->rhc800)(token->slot_device, offset);
+ }
+
+ return result;
+}
+
+/*-------------------------------------------------
+ apple2_c800_slot_w - slot write function
+-------------------------------------------------*/
+
+WRITE8_DEVICE_HANDLER(apple2_c800_slot_w)
+{
+ const apple2_slot_config *config = get_config(device);
+ apple2_slot_token *token = get_token(device);
+
+ /* do we actually have a device, and can we read? */
+ if ((token->slot_device != NULL) && (config->whc800 != NULL))
+ {
+ (*config->whc800)(token->slot_device, offset, data);
+ }
+}
+
+/*-------------------------------------------------
+ apple2_slot_ROM_w - slot ROM read function
+-------------------------------------------------*/
+READ8_DEVICE_HANDLER(apple2_slot_ROM_r)
+{
+ const apple2_slot_config *config = get_config(device);
+ apple2_slot_token *token = get_token(device);
+
+ /* do we actually have a device, and can we read? */
+ if ((token->slot_device != NULL) && (config->rhcnxx != NULL))
+ {
+ return (*config->rhcnxx)(token->slot_device, offset);
+ }
+
+ if (config->slotnum > 0)
+ {
+ return apple2_slotram_r(device->machine(), config->slotnum, offset + ((config->slotnum-1)<<8));
+ }
+
+ return apple2_getfloatingbusvalue(device->machine());
+}
+
+/*-------------------------------------------------
+ apple2_slot_ROM_w - slot ROM write function
+-------------------------------------------------*/
+
+WRITE8_DEVICE_HANDLER(apple2_slot_ROM_w)
+{
+ const apple2_slot_config *config = get_config(device);
+ apple2_slot_token *token = get_token(device);
+
+ /* do we actually have a device, and can we write? */
+ if ((token->slot_device != NULL) && (config->whcnxx != NULL))
+ {
+ (*config->whcnxx)(token->slot_device, offset, data);
+ }
+}
+
+/*-------------------------------------------------
+ DEVICE_GET_INFO(apple2_slot) - device get info
+ function
+-------------------------------------------------*/
+
+DEVICE_GET_INFO(apple2_slot)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(apple2_slot_token); break;
+ case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(apple2_slot_config); break;
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(apple2_slot); break;
+ case DEVINFO_FCT_STOP: /* Nothing */ break;
+ case DEVINFO_FCT_RESET: /* Nothing */ break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case DEVINFO_STR_NAME: strcpy(info->s, "Apple II Slot"); break;
+ case DEVINFO_STR_FAMILY: strcpy(info->s, "Apple II Slot"); break;
+ case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break;
+ case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
+ }
+}
+
+DEFINE_LEGACY_DEVICE(APPLE2_SLOT, apple2_slot);