summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/fp1000/fp1060io.cpp
blob: b18b99aa0c04899885a054138990d612b0c5cc4f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// license:BSD-3-Clause
// copyright-holders:Angelo Salese

#include "emu.h"
#include "fp1060io.h"

#define VERBOSE 1
//#define LOG_OUTPUT_FUNC osd_printf_info
#include "logmacro.h"

DEFINE_DEVICE_TYPE(FP1060IO, fp1060io_device, "fp1060io", "FP-1060I/O Expansion Box")

fp1060io_device::fp1060io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
	: fp1000_exp_device(mconfig, FP1060IO, tag, owner, clock)
	, m_subslot(*this, "%u", 0U)
	, m_irqs_int(*this, { "irqs_inta", "irqs_intb", "irqs_intc", "irqs_intd"})
{
}


void fp1060io_device::device_add_mconfig(machine_config &config)
{
	INPUT_MERGER_ANY_HIGH(config, m_irqs_int[0]).output_handler().set(FUNC(fp1060io_device::inta_w));
	INPUT_MERGER_ANY_HIGH(config, m_irqs_int[1]).output_handler().set(FUNC(fp1060io_device::intb_w));
	INPUT_MERGER_ANY_HIGH(config, m_irqs_int[2]).output_handler().set(FUNC(fp1060io_device::intc_w));
	INPUT_MERGER_ANY_HIGH(config, m_irqs_int[3]).output_handler().set(FUNC(fp1060io_device::intd_w));

	// default is just for CLI usability, what a retail '1060 gives back on its own is unconfirmed.
	FP1060IO_EXP_SLOT(config, m_subslot[0], fp1060io_slot_devices, "rampack");
	m_subslot[0]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<0>));
	m_subslot[0]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<0>));
	m_subslot[0]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<0>));
	m_subslot[0]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<0>));

	FP1060IO_EXP_SLOT(config, m_subslot[1], fp1060io_slot_devices, "rampack");
	m_subslot[1]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<1>));
	m_subslot[1]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<1>));
	m_subslot[1]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<1>));
	m_subslot[1]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<1>));

	FP1060IO_EXP_SLOT(config, m_subslot[2], fp1060io_slot_devices, "rampack");
	m_subslot[2]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<2>));
	m_subslot[2]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<2>));
	m_subslot[2]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<2>));
	m_subslot[2]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<2>));

	FP1060IO_EXP_SLOT(config, m_subslot[3], fp1060io_slot_devices, "rampack");
	m_subslot[3]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<3>));
	m_subslot[3]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<3>));
	m_subslot[3]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<3>));
	m_subslot[3]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<3>));
}

void fp1060io_device::device_start()
{
}

void fp1060io_device::device_reset()
{
}

u8 fp1060io_device::id_r(offs_t offset)
{
	LOG("ID select %02x\n", m_slot_select);
	if (m_slot_select & 0xc)
		return 0xff;
	const auto dev = m_subslot[m_slot_select]->m_dev;
	//LOG("\texists: %d\n", dev != nullptr);

	if (dev == nullptr)
		return 0xff;

	return dev->get_id();
}

void fp1060io_device::cs_w(offs_t offset, u8 data)
{
	m_slot_select = data & 0xf;
}

void fp1060io_device::remap_cb()
{
	LOG("remap_cb %02x\n", m_slot_select);
	if (m_slot_select & 0xc)
		m_slot->iospace().unmap_readwrite(0x0000, 0xfeff);
	else
	{
		const auto dev = m_subslot[m_slot_select]->m_dev;
		//LOG("\texists %d\n", dev != nullptr);
		if (dev == nullptr)
			m_slot->iospace().unmap_readwrite(0x0000, 0xfeff);
		else
			m_slot->iospace().install_device(0x0000, 0xfeff, *m_subslot[m_slot_select]->m_dev, &device_fp1060io_exp_interface::io_map);
	}
}