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

    audio\triplhnt.c

*************************************************************************/
#include "driver.h"
#include "triplhnt.h"
#include "sound/discrete.h"


static const char *triplhnt_sample_names[] =
{
	"*triplhnt",
	"bear_rac.wav",
	"witch.wav",
	0
};

struct Samplesinterface triplhnt_samples_interface =
{
	2,	/* 2 channels */
	triplhnt_sample_names
};


/************************************************************************/
/* triplhnt Sound System Analog emulation                               */
/* Feb 2004, Derrick Renaud                                             */
/************************************************************************/
static const discrete_lfsr_desc triplhnt_lfsr =
{
	DISC_CLK_IS_FREQ,
	16,			/* Bit Length */
	0,			/* Reset Value */
	0,			/* Use Bit 0 as XOR input 0 */
	14,			/* Use Bit 14 as XOR input 1 */
	DISC_LFSR_XNOR,		/* Feedback stage1 is XNOR */
	DISC_LFSR_OR,		/* Feedback stage2 is just stage 1 output OR with external feed */
	DISC_LFSR_REPLACE,	/* Feedback stage3 replaces the shifted register contents */
	0x000001,		/* Everything is shifted into the first bit only */
	0,			/* Output not inverted */
	15			/* Output bit */
};

static const discrete_dac_r1_ladder triplhnt_bear_roar_v_dac =
{
	4,		// size of ladder
	{1000000, 470000, 220000, 2200000},	// R47, R50, R48, R51
	5,		// vBias
	68000,	// R44
	0,		// no rGnd
	0		// no smoothing cap
};

static const discrete_dac_r1_ladder triplhnt_bear_roar_out_dac =
{
	3,		// size of ladder
	{100000, 33000, 100000},	// R56, R58, R57
	0,		// no vBias
	0,		// no rBias
	0,		// no rGnd
	0		// no smoothing cap
};

static const discrete_dac_r1_ladder triplhnt_shot_dac =
{
	4,		// size of ladder
	{8200, 3900, 2200, 1000},	// R53, R54, R55, R52
	0,		// no vBias
	0,		// no rBias
	0,		// no rGnd
	0		// no smoothing cap
};

static const discrete_555_cc_desc triplhnt_bear_roar_vco =
{
	DISC_555_OUT_DC | DISC_555_OUT_SQW,
	5,		// B+ voltage of 555
	DEFAULT_555_VALUES,
	5,		// B+ voltage of the Constant Current source
	0.7		// Q2 junction voltage
};

static const discrete_schmitt_osc_desc triplhnt_screech_osc =
{
	2200,	// R84
	330,	// R85
	1.e-6,	// C59
	DEFAULT_7414_VALUES,
	1		// invert output using 7400 gate E7
};

static const discrete_mixer_desc triplhnt_mixer =
{
	DISC_MIXER_IS_RESISTOR,
	{3300 + 19879.5, 47000, 27000 + 545.6},	// R59 + (R56||R57||R58), R60 + (R52||R53||R54||R55), R61
	{0},			// No variable resistor nodes
	{0},			// No caps
	0,				// No rI
	1000,			// R78
	1e-7,			// C72
	1e-7,			// C44
	0,				// vBias not used for resistor network
	245000
};

/* Nodes - Sounds */
#define TRIPLHNT_NOISE			NODE_10
#define TRIPLHNT_BEAR_ROAR_SND	NODE_11
#define TRIPLHNT_SHOT_SND		NODE_12
#define TRIPLHNT_SCREECH_SND	NODE_13
#define POOLSHRK_SCORE_SND		NODE_14

DISCRETE_SOUND_START(triplhnt)
	/************************************************/
	/* Input register mapping for triplhnt          */
	/************************************************/
	/*                   NODE                 GAIN      OFFSET  INIT */
	DISCRETE_INPUTX_DATA(TRIPLHNT_BEAR_ROAR_DATA, -1, 0x0f, 0)
	DISCRETE_INPUT_NOT  (TRIPLHNT_BEAR_EN)
	DISCRETE_INPUT_DATA (TRIPLHNT_SHOT_DATA)
	DISCRETE_INPUT_LOGIC(TRIPLHNT_SCREECH_EN)
	DISCRETE_INPUT_NOT  (TRIPLHNT_LAMP_EN)
	/************************************************/

	DISCRETE_LFSR_NOISE(TRIPLHNT_NOISE,			// Output A7 pin 13
				TRIPLHNT_LAMP_EN, TRIPLHNT_LAMP_EN,	// From gate A8 pin 10
				12096000.0/2/256,		// 256H signal
				DEFAULT_TTL_V_LOGIC_1, 0, DEFAULT_TTL_V_LOGIC_1/2, &triplhnt_lfsr)

	/************************************************/
	/* Bear Roar is a VCO with noise mixed in.      */
	/************************************************/
	DISCRETE_ADJUSTMENT_TAG(NODE_20, 1,
				10000,	// R86 + R88 @ 0
				260000,	// R86 + R88 @ max
				DISC_LOGADJ, "BEAR")
	DISCRETE_DAC_R1(NODE_21, 1,			// base of Q2
			TRIPLHNT_BEAR_ROAR_DATA,	// IC B10, Q0-Q3
			DEFAULT_TTL_V_LOGIC_1,		// TTL ON level
			&triplhnt_bear_roar_v_dac)
	DISCRETE_555_CC(NODE_22, 1,	// IC C11 pin 3, always enabled
			NODE_21,		// vIn
			NODE_20,		// current adjust
			1.e-8,			// C58
			0, 390000, 0,	// no rBias, R87, no rDis
			&triplhnt_bear_roar_vco)
	DISCRETE_COUNTER(NODE_23, 1, TRIPLHNT_BEAR_EN,	// IC B6, QB-QD
			NODE_22,								// from IC C11, pin 3
			5, 1, 0, DISC_CLK_ON_R_EDGE)			// /6 counter on rising edge
	DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 2, "01>")	// IC B6, pin 8
	DISCRETE_LOGIC_INVERT(NODE_25, 1, NODE_22)			// IC D9, pin 3
	DISCRETE_LOGIC_NAND(NODE_26, 1, NODE_25, TRIPLHNT_NOISE)	// IC D9, pin 11
	DISCRETE_LOGIC_XOR(NODE_27, 1, NODE_24, NODE_26)	// IC B8, pin 6
	DISCRETE_COUNTER(NODE_28, 1, TRIPLHNT_BEAR_EN,	// IC B6, pin 12
			NODE_27,								// from IC B8, pin 6
			1, 1, 0, DISC_CLK_ON_R_EDGE)			// /2 counter on rising edge
	DISCRETE_TRANSFORM5(NODE_29, 1, NODE_24, NODE_28, NODE_26, 2, 4, "13*24*+0+")	// Mix the mess together in binary
	DISCRETE_DAC_R1(TRIPLHNT_BEAR_ROAR_SND, 1, NODE_29,
			DEFAULT_TTL_V_LOGIC_1,
			&triplhnt_bear_roar_out_dac)

	/************************************************/
	/* Shot is just the noise amplitude modulated   */
	/* by an R1 DAC.                                */
	/************************************************/
	DISCRETE_SWITCH(NODE_40, 1,	// Gate A9, pins 6, 8, 11, 3
			TRIPLHNT_NOISE,	// noise enables the data which is then inverted
			1, TRIPLHNT_SHOT_DATA)
	DISCRETE_DAC_R1(TRIPLHNT_SHOT_SND, 1,
			NODE_40,
			DEFAULT_TTL_V_LOGIC_1,
			&triplhnt_shot_dac)

	/************************************************/
	/* Screech is just the noise modulating a       */
	/* Schmitt VCO.                                 */
	/************************************************/
	DISCRETE_SCHMITT_OSCILLATOR(TRIPLHNT_SCREECH_SND, TRIPLHNT_SCREECH_EN, TRIPLHNT_NOISE, 3.4, &triplhnt_screech_osc)

	/************************************************/
	/* Final mix and output.                        */
	/************************************************/
	DISCRETE_MIXER3(NODE_90, 1, TRIPLHNT_BEAR_ROAR_SND, TRIPLHNT_SHOT_SND, TRIPLHNT_SCREECH_SND, &triplhnt_mixer)
	DISCRETE_OUTPUT(NODE_90, 1)
DISCRETE_SOUND_END