summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio/redalert.c
blob: f726cb24b68db115d0e024e727a2ecf647676891 (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
/***************************************************************************

Irem Red Alert sound hardware

The manual lists two sets of sounds.

Analogue:
- Formation Aircraft
- Dive bombers
- Helicopters
- Launcher firing
- Explosion #1
- Explosion #2
- Explosion #3

Digital:
- Melody #1.  Starting sound.
- Melody #2.  Ending sound
- Time signal
- Chirping birds
- Alarm
- Excellent
- Coin insertion
- MIRV division
- Megaton bomb - long
- Megaton bomb - short
- Megaton bomb landing

If you have any questions about how this driver works, don't hesitate to
ask.  - Mike Balfour (mab22@po.cwru.edu)
***************************************************************************/

#include "driver.h"
#include "cpu/m6502/m6502.h"
#include "cpu/i8085/i8085.h"
#include "sound/ay8910.h"

static int AY8910_A_input_data = 0;
static int c030_data = 0;
static int sound_register_IC1 = 0;
static int sound_register_IC2 = 0;

WRITE8_HANDLER( redalert_c030_w )
{
	c030_data = data & 0x3F;

	/* Is this some type of sound command? */
	if (data & 0x80)
		/* Cause an NMI on the voice CPU here? */
		cpunum_set_input_line(2,I8085_RST75_LINE,HOLD_LINE);
}

READ8_HANDLER( redalert_voicecommand_r )
{
	return c030_data;
}

WRITE8_HANDLER( redalert_soundlatch_w )
{
	/* The byte is connected to Port A of the AY8910 */
	AY8910_A_input_data = data;

	/* Bit D7 is also connected to the NMI input of the CPU */
	if ((data & 0x80)!=0x80)
		cpunum_set_input_line(1,INPUT_LINE_NMI,PULSE_LINE);
}

READ8_HANDLER( redalert_AY8910_A_r )
{
	return AY8910_A_input_data;
}

WRITE8_HANDLER( redalert_AY8910_w )
{
	/* BC2 is connected to a pull-up resistor, so BC2=1 always */
	switch (data)
	{
		case 0x00:
			/* BC1=0, BDIR=0 : INACTIVE */
			break;
		case 0x01:
			/* BC1=1, BDIR=0 : READ FROM PSG */
			sound_register_IC1 = AY8910_read_port_0_r(offset);
			break;
		case 0x02:
			/* BC1=0, BDIR=1 : WRITE TO PSG */
			AY8910_write_port_0_w(offset,sound_register_IC2);
			break;
		case 0x03:
			/* BC1=1, BDIR=1 : LATCH ADDRESS */
			AY8910_control_port_0_w(offset,sound_register_IC2);
			break;
		default:
			logerror("Invalid Sound Command: %02X\n",data);
			break;
	}
}

READ8_HANDLER( redalert_sound_register_IC1_r )
{
	return sound_register_IC1;
}

WRITE8_HANDLER( redalert_sound_register_IC2_w )
{
	sound_register_IC2 = data;
}

WRITE8_HANDLER( redalert_AY8910_B_w )
{
	/* I'm fairly certain this port triggers analog sounds */
	logerror("Port B Trigger: %02X\n",data);
	/* D0 = Formation Aircraft? */
	/* D1 = Dive bombers? */
	/* D2 = Helicopters? */
	/* D3 = Launcher firing? */
	/* D4 = Explosion #1? */
	/* D5 = Explosion #2? */
	/* D6 = Explosion #3? */
}