blob: 1ebeeae5e52a861a3e5cf2fac152504e218557bd (
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
|
// license:BSD-3-Clause
// copyright-holders:Aaron Giles,Frank Palazzolo
/***********************************************************
Astrocade custom 'IO' chip
************************************************************
_____ _____
Vss 1 |* \_/ | 40 MXD7
SI0 2 | | 39 MXD6
SI1 3 | | 38 MXD5
SI2 4 | | 37 MXD4
SI3 5 | | 36 MXD3
SI4 6 | | 35 MXD2
SI5 7 | | 34 MXD1
SI6 8 | | 33 MXD0
SI7 9 | | 32 SO0
POT0 10 | CUSTOM | 31 SO1
POT1 11 | I/O | 30 SO2
POT2 12 | | 29 SO3
POT3 13 | | 28 SO4
DISCHG 14 | | 27 SO5
MONOS 15 | | 26 SO6
ϕ 16 | | 25 SO7
/RESET 17 | | 24 AUDIO
TEST 18 | | 23 /RD
/IORQ 19 | | 22 Vgg
/ϕ 20 |_____________| 21 Vdd
***********************************************************/
#ifndef MAME_SOUND_ASTROCDE_H
#define MAME_SOUND_ASTROCDE_H
#pragma once
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_ASTROCADE_IO_SI_READ_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_si_callback(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_SO0_STROBE_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_so_callback<0>(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_SO1_STROBE_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_so_callback<1>(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_SO2_STROBE_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_so_callback<2>(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_SO3_STROBE_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_so_callback<3>(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_SO4_STROBE_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_so_callback<4>(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_SO5_STROBE_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_so_callback<5>(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_SO6_STROBE_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_so_callback<6>(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_SO7_STROBE_CB(_devcb) \
devcb = &downcast<astrocade_io_device &>(*device).set_so_callback<7>(DEVCB_##_devcb);
#define MCFG_ASTROCADE_IO_POT0(_tag) \
downcast<astrocade_io_device &>(*device).set_pot_tag<0>(_tag);
#define MCFG_ASTROCADE_IO_POT1(_tag) \
downcast<astrocade_io_device &>(*device).set_pot_tag<1>(_tag);
#define MCFG_ASTROCADE_IO_POT2(_tag) \
downcast<astrocade_io_device &>(*device).set_pot_tag<2>(_tag);
#define MCFG_ASTROCADE_IO_POT3(_tag) \
downcast<astrocade_io_device &>(*device).set_pot_tag<3>(_tag);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> astrocade_io_device
class astrocade_io_device : public device_t, public device_sound_interface
{
public:
astrocade_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration access
template<class Object> devcb_base &set_si_callback(Object &&cb) { return m_si_callback.set_callback(std::forward<Object>(cb)); }
template<int N, class Object> devcb_base &set_so_callback(Object &&cb) { return m_so_callback[N].set_callback(std::forward<Object>(cb)); }
template<int N> void set_pot_tag(const char *tag) { m_pots[N].set_tag(tag); }
protected:
// device-level overrides
virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
public:
DECLARE_WRITE8_MEMBER(write);
DECLARE_READ8_MEMBER(read);
private:
void state_save_register();
sound_stream *m_stream; /* sound stream */
uint8_t m_reg[8]; /* 8 control registers */
uint8_t m_master_count; /* current master oscillator count */
uint16_t m_vibrato_clock; /* current vibrato clock */
uint8_t m_noise_clock; /* current noise generator clock */
uint16_t m_noise_state; /* current noise LFSR state */
uint8_t m_a_count; /* current tone generator A count */
uint8_t m_a_state; /* current tone generator A state */
uint8_t m_b_count; /* current tone generator B count */
uint8_t m_b_state; /* current tone generator B state */
uint8_t m_c_count; /* current tone generator C count */
uint8_t m_c_state; /* current tone generator C state */
uint8_t m_bitswap[256]; /* bitswap table */
devcb_read8 m_si_callback;
devcb_write8 m_so_callback[8];
optional_ioport_array<4> m_pots;
};
DECLARE_DEVICE_TYPE(ASTROCADE_IO, astrocade_io_device)
#endif // MAME_SOUND_ASTROCDE_H
|