summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio/seibu.h
blob: 5e3a003ca10039cdf2456fb11a12f8c566083055 (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
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/***************************************************************************

    Seibu Sound System v1.02, games using this include:

    Cross Shooter    1987   * "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC." (YM2151 substituted for YM3812)
    Cabal            1988   * "Michel/Seibu    sound 11/04/88" (YM2151 substituted for YM3812, unknown ADPCM)
    Dead Angle       1988   * "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC." (2xYM2203 substituted for YM3812, unknown ADPCM)
    Dynamite Duke    1989   * "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC."
    Toki             1989   * "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC."
    Raiden           1990   * "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC."
    Blood Brothers   1990     "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC."
    D-Con            1992     "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC."

    Related sound programs (not implemented yet):

    Zero Team                 "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC."
    Legionaire                "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC." (YM2151 substituted for YM3812)
    Raiden 2                  "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC." (YM2151 substituted for YM3812, plus extra MSM6205)
    Raiden DX                 "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC." (YM2151 substituted for YM3812, plus extra MSM6205)
    Cup Soccer                "START UP PROGRAM V1.02 (C)1986 SEIBU KAIHATSU INC." (YM2151 substituted for YM3812, plus extra MSM6205)
    SD Gundam Psycho Salamander "Copyright by King Bee Sol 1991"
    * = encrypted

***************************************************************************/

#include "cpu/z80/z80.h"
#include "sound/3812intf.h"
#include "sound/2151intf.h"
#include "sound/2203intf.h"
#include "sound/okim6295.h"

ADDRESS_MAP_EXTERN(seibu_sound_map, 8);
ADDRESS_MAP_EXTERN(seibu2_sound_map, 8);
ADDRESS_MAP_EXTERN(seibu2_airraid_sound_map, 8);
ADDRESS_MAP_EXTERN(seibu2_raiden2_sound_map, 8);
ADDRESS_MAP_EXTERN(seibu_newzeroteam_sound_map, 8);
ADDRESS_MAP_EXTERN(seibu3_sound_map, 8);
ADDRESS_MAP_EXTERN(seibu3_adpcm_sound_map, 8);

class seibu_sound_device : public device_t
{
public:
	seibu_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
	~seibu_sound_device() {}

	DECLARE_READ16_MEMBER( main_word_r );
	DECLARE_WRITE16_MEMBER( main_word_w );

	DECLARE_WRITE16_MEMBER( main_mustb_w );

	DECLARE_WRITE8_MEMBER( irq_clear_w );
	DECLARE_WRITE8_MEMBER( rst10_ack_w );
	DECLARE_WRITE8_MEMBER( rst18_ack_w );
	DECLARE_WRITE8_MEMBER( bank_w );
	DECLARE_WRITE8_MEMBER( coin_w );
	void ym3812_irqhandler(int linestate);
	WRITE_LINE_MEMBER(ym2151_irqhandler);
	void ym2203_irqhandler(int linestate);
	DECLARE_READ8_MEMBER( soundlatch_r );
	DECLARE_READ8_MEMBER( main_data_pending_r );
	DECLARE_WRITE8_MEMBER( main_data_w );
	DECLARE_WRITE8_MEMBER( pending_w );
	void decrypt(const char *cpu,int length);
	void update_irq_lines(int param);

protected:
	// device-level overrides
	virtual void device_start();
	virtual void device_reset();

	private:
	// internal state
	device_t *m_sound_cpu;
	UINT8 m_main2sub[2];
	UINT8 m_sub2main[2];
	int m_main2sub_pending;
	int m_sub2main_pending;
	UINT8 m_rst10_irq;
	UINT8 m_rst18_irq;

	enum
	{
		VECTOR_INIT,
		RST10_ASSERT,
		RST10_CLEAR,
		RST18_ASSERT,
		RST18_CLEAR
	};
};

extern const device_type SEIBU_SOUND;


// Seibu ADPCM device

class seibu_adpcm_device : public device_t,
									public device_sound_interface
{
public:
	seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
	~seibu_adpcm_device() {}

	static void set_adpcm_rom_tag(device_t &device, const char *tag) { downcast<seibu_adpcm_device &>(device).m_rom_tag = tag; }

	void decrypt(const char *region);
	DECLARE_WRITE8_MEMBER( adr_w );
	DECLARE_WRITE8_MEMBER( ctl_w );

protected:
	// device-level overrides
	virtual void device_start();

	// sound stream update overrides
	virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);

	private:
	// internal state
	oki_adpcm_state m_adpcm;
	sound_stream *m_stream;
	UINT32 m_current;
	UINT32 m_end;
	UINT8 m_nibble;
	UINT8 m_playing;
	const char *m_rom_tag;
	UINT8 *m_base;
};

extern const device_type SEIBU_ADPCM;

/**************************************************************************/

#define MCFG_SEIBU_ADPCM_ROMREGION(_tag) \
	seibu_adpcm_device::set_adpcm_rom_tag(*device, _tag);

#define SEIBU_COIN_INPUTS                                           \
	PORT_START("COIN")                                              \
	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(4)     \
	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(4)     \
	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )                    \
	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )                    \
	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )                    \
	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )                    \
	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )                    \
	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )

#define SEIBU_COIN_INPUTS_INVERT                                    \
	PORT_START("COIN")                                              \
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(4)      \
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(4)      \
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )                     \
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )                     \
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )                     \
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )                     \
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )                     \
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )


#define SEIBU_SOUND_SYSTEM_CPU(freq)                                \
	MCFG_CPU_ADD("audiocpu", Z80, freq)                             \
	MCFG_CPU_PROGRAM_MAP(seibu_sound_map)                           \
	MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0)

#define SEIBU2_SOUND_SYSTEM_CPU(freq)                               \
	MCFG_CPU_ADD("audiocpu", Z80, freq)                             \
	MCFG_CPU_PROGRAM_MAP(seibu2_sound_map)                          \
	MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0)

#define SEIBU2_AIRRAID_SOUND_SYSTEM_CPU(freq)                       \
	MCFG_CPU_ADD("audiocpu", Z80, freq)                             \
	MCFG_CPU_PROGRAM_MAP(seibu2_airraid_sound_map)                  \
	MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0)

#define SEIBU2_RAIDEN2_SOUND_SYSTEM_CPU(freq)                       \
	MCFG_CPU_ADD("audiocpu",  Z80, freq)                            \
	MCFG_CPU_PROGRAM_MAP(seibu2_raiden2_sound_map)                  \
	MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0)

#define SEIBU_NEWZEROTEAM_SOUND_SYSTEM_CPU(freq)                    \
	MCFG_CPU_ADD("audiocpu", Z80, freq)                             \
	MCFG_CPU_PROGRAM_MAP(seibu_newzeroteam_sound_map)               \
	MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0)

#define SEIBU3_SOUND_SYSTEM_CPU(freq)                               \
	MCFG_CPU_ADD("audiocpu", Z80, freq)                             \
	MCFG_CPU_PROGRAM_MAP(seibu3_sound_map)                          \
	MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0)

#define SEIBU3A_SOUND_SYSTEM_CPU(freq)                              \
	MCFG_CPU_ADD("audiocpu", Z80, freq)                             \
	MCFG_CPU_PROGRAM_MAP(seibu3_adpcm_sound_map)                    \
	MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0)

#define SEIBU_SOUND_SYSTEM_YM3812_INTERFACE(freq1,freq2)            \
	MCFG_SPEAKER_STANDARD_MONO("mono")                              \
																	\
	MCFG_SOUND_ADD("ymsnd", YM3812, freq1)                              \
	MCFG_YM3812_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym3812_irqhandler)) \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)                      \
																	\
	MCFG_OKIM6295_ADD("oki", freq2, OKIM6295_PIN7_LOW)              \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)

#define SEIBU_SOUND_SYSTEM_YM3812_RAIDEN_INTERFACE(freq1,freq2)     \
	MCFG_SPEAKER_STANDARD_MONO("mono")                              \
																	\
	MCFG_SOUND_ADD("ymsnd", YM3812, freq1)                              \
	MCFG_YM3812_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym3812_irqhandler)) \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)                      \
																	\
	MCFG_OKIM6295_ADD("oki", freq2, OKIM6295_PIN7_HIGH)             \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)

#define SEIBU_SOUND_SYSTEM_YM2151_INTERFACE(freq1,freq2)            \
	MCFG_SPEAKER_STANDARD_MONO("mono")                              \
																	\
	MCFG_YM2151_ADD("ymsnd", freq1)                             \
	MCFG_YM2151_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2151_irqhandler)) \
	MCFG_SOUND_ROUTE(0, "mono", 0.50)                               \
	MCFG_SOUND_ROUTE(1, "mono", 0.50)                               \
																	\
	MCFG_OKIM6295_ADD("oki", freq2, OKIM6295_PIN7_LOW)              \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)

#define SEIBU_AIRRAID_SOUND_SYSTEM_YM2151_INTERFACE(freq1)          \
	MCFG_SPEAKER_STANDARD_MONO("mono")                              \
																	\
	MCFG_YM2151_ADD("ymsnd", freq1)                             \
	MCFG_YM2151_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2151_irqhandler)) \
	MCFG_SOUND_ROUTE(0, "mono", 0.50)                               \
	MCFG_SOUND_ROUTE(1, "mono", 0.50)

#define SEIBU_SOUND_SYSTEM_YM2151_RAIDEN2_INTERFACE(freq1,freq2,regiona, regionb)       \
	MCFG_SPEAKER_STANDARD_MONO("mono")                              \
																	\
	MCFG_YM2151_ADD("ymsnd", freq1)                             \
	MCFG_YM2151_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2151_irqhandler)) \
	MCFG_SOUND_ROUTE(0, "mono", 0.50)                               \
	MCFG_SOUND_ROUTE(1, "mono", 0.50)                               \
																	\
	MCFG_OKIM6295_ADD("oki1", freq2, OKIM6295_PIN7_HIGH)            \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)                     \
																	\
	MCFG_OKIM6295_ADD("oki2", freq2, OKIM6295_PIN7_HIGH)            \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)

#define SEIBU_SOUND_SYSTEM_YM2203_INTERFACE(freq)                   \
	MCFG_SPEAKER_STANDARD_MONO("mono")                              \
																	\
	MCFG_SOUND_ADD("ym1", YM2203, freq)                             \
	MCFG_YM2203_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2203_irqhandler)) \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)                     \
																	\
	MCFG_SOUND_ADD("ym2", YM2203, freq)                             \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)

#define SEIBU_SOUND_SYSTEM_ADPCM_INTERFACE                          \
	MCFG_SOUND_ADD("adpcm1", SEIBU_ADPCM, 8000)                     \
	MCFG_SEIBU_ADPCM_ROMREGION("adpcm1")                      \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)                     \
																	\
	MCFG_SOUND_ADD("adpcm2", SEIBU_ADPCM, 8000)                     \
	MCFG_SEIBU_ADPCM_ROMREGION("adpcm2")                      \
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)

/**************************************************************************/