summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/generalplus_gpce4_soc.h
blob: 1060956e3ba061037019ca6806a0bd5562540322 (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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
// license:BSD-3-Clause
// copyright-holders:David Haywood
#ifndef MAME_MACHINE_GENERALPLUS_GPCE4_SOC_H
#define MAME_MACHINE_GENERALPLUS_GPCE4_SOC_H

#pragma once

#include "cpu/unsp/unsp.h"
#include "machine/timer.h"
#include "sound/dac.h"

#include "speaker.h"

class generalplus_gpce4_soc_device : public unsp_20_device
{
public:
	generalplus_gpce4_soc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	auto porta_in() { return m_porta_in.bind(); }
	auto portb_in() { return m_portb_in.bind(); }
	auto portc_in() { return m_portc_in.bind(); }

	auto porta_out() { return m_porta_out.bind(); }
	auto portb_out() { return m_portb_out.bind(); }
	auto portc_out() { return m_portc_out.bind(); }

	auto spi2_out() { return m_spi2_out.bind(); }
	auto spi_out() { return m_spi_out.bind(); }
	auto spi_reset() { return m_spi_reset.bind(); }

	void request_interrupt(int which);
	void clear_interrupt(int which);

	void recieve_spi_fifo_data(u8 data);
	u8 *get_spi_romregion();
	void set_spi_romregion(u8 *region, u32 size) { m_spiregion = region; m_spisize = size; }

protected:
	// device-level overrides
	virtual void device_start() override ATTR_COLD;
	virtual void device_reset() override ATTR_COLD;
	virtual void device_add_mconfig(machine_config& config) override ATTR_COLD;

private:
	void internal_map(address_map &map);

	u16 ioa_data_r();
	void ioa_data_w(u16 data);
	u16 ioa_buffer_r();
	void ioa_buffer_w(u16 data);
	u16 ioa_direction_r();
	void ioa_direction_w(u16 data);
	u16 ioa_attribute_r();
	void ioa_attribute_w(u16 data);

	u16 iob_data_r();
	void iob_data_w(u16 data);
	u16 iob_buffer_r();
	void iob_buffer_w(u16 data);
	u16 iob_direction_r();
	void iob_direction_w(u16 data);
	u16 iob_attribute_r();
	void iob_attribute_w(u16 data);

	u16 ioc_data_r();
	void ioc_data_w(u16 data);
	u16 ioc_buffer_r();
	void ioc_buffer_w(u16 data);
	u16 ioc_direction_r();
	void ioc_direction_w(u16 data);
	u16 ioc_attribute_r();
	void ioc_attribute_w(u16 data);

	u16 io_ctrl_r();
	void io_ctrl_w(u16 data);

	u16 timer_ctrl_r();
	void timer_ctrl_w(u16 data);

	void timera_data_w(u16 data);
	void timera_counter_w(u16 data);
	void timerb_data_w(u16 data);
	void timerb_counter_w(u16 data);
	void timerc_data_w(u16 data);
	void timerc_counter_w(u16 data);

	u16 pwm0_ctrl_r();
	u16 pwm1_ctrl_r();
	u16 pwm2_ctrl_r();
	u16 pwm3_ctrl_r();

	void pwm0_ctrl_w(u16 data);
	void pwm1_ctrl_w(u16 data);
	void pwm2_ctrl_w(u16 data);
	void pwm3_ctrl_w(u16 data);

	void system_clock_w(u16 data);

	void timebase_clear_w(u16 data);
	void watchdog_clear_w(u16 data);
	void dac_ctrl_w(u16 data);
	void dac_cha1_data_w(u16 data);
	void dac_cha2_data_w(u16 data);
	void ppam_ctrl_w(u16 data);

	void wait_ctrl_w(u16 data);
	u16 cache_ctrl_r();
	void cache_ctrl_w(u16 data);

	u16 interrupt_ctrl_r();
	void interrupt_ctrl_w(u16 data);
	u16 interrupt_status_r();
	void interrupt_status_w(u16 data);
	u16 fiq_sel_r();
	void fiq_sel_w(u16 data);
	u16 fiq2_sel_r();
	void fiq2_sel_w(u16 data);
	u16 interrupt2_ctrl_r();
	void interrupt2_ctrl_w(u16 data);
	u16 interrupt2_status_r();
	void interrupt2_status_w(u16 data);

	u16 spi2_ctrl_r();
	void spi2_ctrl_w(u16 data);
	u16 spi2_txstatus_r();
	void spi2_txstatus_w(u16 data);
	void spi2_txdata_w(u16 data);
	u16 spi2_rxstatus_r();
	void spi2_rxstatus_w(u16 data);
	u16 spi2_rxdata_r();
	u16 spi2_misc_r();
	void spi2_misc_w(u16 data);

	u16 spi_man_ctrl_r();
	void spi_man_ctrl_w(u16 data);
	u16 spi_ctrl_r();
	void spi_ctrl_w(u16 data);
	void spi_txstatus_w(u16 data);
	void spi_txdata_w(u16 data);
	u16 spi_rxstatus_r();
	void spi_rxstatus_w(u16 data);
	u16 spi_rxdata_r();
	u16 spi_misc_r();
	void spi_misc_w(u16 data);
	u16 spi_auto_ctrl_r();
	void spi_auto_ctrl_w(u16 data);
	u16 spi_bank_r();
	void spi_bank_w(u16 data);

	u16 adc_data_r();
	void adc_data_w(u16 data);
	u16 adc_ctrl_r();
	void adc_ctrl_w(u16 data);
	u16 adc_linein_bitctrl_r();
	void adc_linein_bitctrl_w(u16 data);

	u16 spi_direct_r(offs_t offset);

	void update_interrupts();

	void write_to_tx_fifo(u8 data);
	void reset_spi_fifos();

	TIMER_DEVICE_CALLBACK_MEMBER(timer_c_cb);
	TIMER_DEVICE_CALLBACK_MEMBER(timer_a_cb);
	TIMER_DEVICE_CALLBACK_MEMBER(timer_2hz_cb);
	TIMER_DEVICE_CALLBACK_MEMBER(timer_64hz_cb);
	TIMER_DEVICE_CALLBACK_MEMBER(timer_2khz_cb);
	TIMER_DEVICE_CALLBACK_MEMBER(timer_spi_tx);

	u8 *m_spiregion;
	u32 m_spisize;

	u16 m_ioa_buffer;
	u16 m_iob_buffer;
	u16 m_interrupt_ctrl;
	u16 m_interrupt2_ctrl;
	u16 m_timer_ctrl;
	u16 m_io_ctrl;
	u16 m_ioa_attribute;
	u16 m_iob_attribute;
	u16 m_ioc_attribute;
	u16 m_ioa_direction;
	u16 m_iob_direction;
	u16 m_ioc_direction;
	u16 m_cache_ctrl;
	u16 m_spi_auto_ctrl;
	u16 m_spi_bank;
	u16 m_fiq_sel;
	u16 m_fiq2_sel;
	u16 m_spi2_ctrl;
	u16 m_spi_ctrl;

	u16 m_pwm0_ctrl;
	u16 m_pwm1_ctrl;
	u16 m_pwm2_ctrl;
	u16 m_pwm3_ctrl;

	u32 m_interrupt_status;

	u8 m_spi_rx_fifo[8];
	u8 m_spi_tx_fifo[8];
	u8 m_rx_fifo_entries;
	u8 m_tx_fifo_entries;

	devcb_read16 m_porta_in;
	devcb_read16 m_portb_in;
	devcb_read16 m_portc_in;

	devcb_write16 m_porta_out;
	devcb_write16 m_portb_out;
	devcb_write16 m_portc_out;

	devcb_write8 m_spi2_out;
	devcb_write8 m_spi_out;
	devcb_write8 m_spi_reset;

	required_device<dac_word_device_base> m_dac;
	required_device<timer_device> m_spi_tx_timer;
};

DECLARE_DEVICE_TYPE(GPCE4, generalplus_gpce4_soc_device)

#endif // MAME_MACHINE_GENERALPLUS_GPCE4_SOC_H