summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/taito68705interface.h
blob: 7d7365bc8bd69f6f694405a438ddde584fc70e41 (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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi, Nicola Salmoria, David Haywood, Vas Crabb
#ifndef MAME_MACHINE_TAITO68705INTERFACE_H
#define MAME_MACHINE_TAITO68705INTERFACE_H

#pragma once

#include "cpu/m6805/m68705.h"


DECLARE_DEVICE_TYPE(TAITO68705_MCU,       taito68705_mcu_device)
DECLARE_DEVICE_TYPE(TAITO68705_MCU_TIGER, taito68705_mcu_tiger_device)
DECLARE_DEVICE_TYPE(ARKANOID_68705P3,     arkanoid_68705p3_device)
DECLARE_DEVICE_TYPE(ARKANOID_68705P5,     arkanoid_68705p5_device)


class taito68705_mcu_device_base : public device_t
{
public:
	template <typename Obj> static devcb_base &set_semaphore_cb(device_t &device, Obj &&cb)
	{ return downcast<taito68705_mcu_device_base &>(device).m_semaphore_cb.set_callback(std::forward<Obj>(cb)); }

	// host interface
	DECLARE_READ8_MEMBER(data_r);
	DECLARE_WRITE8_MEMBER(data_w);
	DECLARE_WRITE_LINE_MEMBER(reset_w);
	DECLARE_READ_LINE_MEMBER(host_semaphore_r) { return m_host_flag ? ASSERT_LINE : CLEAR_LINE; }
	DECLARE_READ_LINE_MEMBER(mcu_semaphore_r) { return m_mcu_flag ? ASSERT_LINE : CLEAR_LINE; }
	DECLARE_CUSTOM_INPUT_MEMBER(host_semaphore_r) { return m_host_flag ? 1 : 0; }
	DECLARE_CUSTOM_INPUT_MEMBER(mcu_semaphore_r) { return m_mcu_flag ? 1 : 0; }

protected:
	taito68705_mcu_device_base(
			machine_config const &mconfig,
			device_type type,
			char const *tag,
			device_t *owner,
			u32 clock);

	// MCU callbacks
	DECLARE_WRITE8_MEMBER(mcu_pa_w);

	virtual void device_start() override;
	virtual void device_reset() override;

	bool host_flag() const { return m_host_flag; }
	bool mcu_flag() const { return m_mcu_flag; }
	u8 pa_value() const { return m_pa_output & (m_latch_driven ? m_host_latch : 0xff); }
	void latch_control(u8 data, u8 &value, unsigned host_bit, unsigned mcu_bit);

	required_device<m68705p_device> m_mcu;

private:
	devcb_write_line    m_semaphore_cb;

	bool    m_latch_driven;
	bool    m_reset_input;
	bool    m_host_flag;
	bool    m_mcu_flag;
	u8      m_host_latch;
	u8      m_mcu_latch;
	u8      m_pa_output;
};


#define MCFG_TAITO_M68705_AUX_STROBE_CB(cb) \
		devcb = &taito68705_mcu_device::set_aux_strobe_cb(*device, DEVCB_##cb);

class taito68705_mcu_device : public taito68705_mcu_device_base
{
public:
	template <typename Obj> static devcb_base &set_aux_strobe_cb(device_t &device, Obj &&cb)
	{ return downcast<taito68705_mcu_device &>(device).m_aux_strobe_cb.set_callback(std::forward<Obj>(cb)); }

	taito68705_mcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

protected:
	taito68705_mcu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);

	virtual DECLARE_READ8_MEMBER(mcu_portc_r);
	DECLARE_WRITE8_MEMBER(mcu_portb_w);

	virtual void device_add_mconfig(machine_config &config) override;
	virtual void device_start() override;

	devcb_write8    m_aux_strobe_cb;

	u8  m_pb_output;
};


class taito68705_mcu_tiger_device : public taito68705_mcu_device
{
public:
	taito68705_mcu_tiger_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);

protected:
	virtual DECLARE_READ8_MEMBER(mcu_portc_r) override;
};


#define MCFG_ARKANOID_MCU_SEMAPHORE_CB(cb) \
		devcb = &arkanoid_mcu_device_base::set_semaphore_cb(*device, DEVCB_##cb);

#define MCFG_ARKANOID_MCU_PORTB_R_CB(cb) \
		devcb = &arkanoid_mcu_device_base::set_portb_r_cb(*device, DEVCB_##cb);

class arkanoid_mcu_device_base : public taito68705_mcu_device_base
{
public:
	template <typename Obj> static devcb_base &set_portb_r_cb(device_t &device, Obj &&cb)
	{ return downcast<arkanoid_mcu_device_base &>(device).m_portb_r_cb.set_callback(std::forward<Obj>(cb)); }

protected:
	arkanoid_mcu_device_base(
			machine_config const &mconfig,
			device_type type,
			char const *tag,
			device_t *owner,
			u32 clock);

	// MCU callbacks
	DECLARE_READ8_MEMBER(mcu_pb_r);
	DECLARE_READ8_MEMBER(mcu_pc_r);
	DECLARE_WRITE8_MEMBER(mcu_pc_w);

	virtual void device_start() override;

	devcb_read8 m_portb_r_cb;

	u8  m_pc_output;
};


class arkanoid_68705p3_device : public arkanoid_mcu_device_base
{
public:
	arkanoid_68705p3_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);

protected:
	virtual void device_add_mconfig(machine_config &config) override;
};


class arkanoid_68705p5_device : public arkanoid_mcu_device_base
{
public:
	arkanoid_68705p5_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);

protected:
	virtual void device_add_mconfig(machine_config &config) override;
};

#endif // MAME_MACHINE_TAITO68705INTERFACE_H