1 // license:BSD-3-Clause
2 // copyright-holders:Derrick Renaud
3 /*************************************************************************
4 
5     audio\skydiver.c
6 
7 *************************************************************************/
8 #include "emu.h"
9 #include "includes/skydiver.h"
10 #include "sound/discrete.h"
11 
12 
13 /************************************************************************/
14 /* skydiver Sound System Analog emulation                               */
15 /* Jan 2004, Derrick Renaud                                             */
16 /************************************************************************/
17 
18 static const discrete_555_desc skydiverWhistl555 =
19 {
20 	DISC_555_OUT_SQW | DISC_555_OUT_AC,
21 	5,      // B+ voltage of 555
22 	DEFAULT_555_VALUES
23 };
24 
25 static const discrete_lfsr_desc skydiver_lfsr =
26 {
27 	DISC_CLK_IS_FREQ,
28 	16,                     /* Bit Length */
29 	0,                      /* Reset Value */
30 	0,                      /* Use Bit 0 as XOR input 0 */
31 	14,                     /* Use Bit 14 as XOR input 1 */
32 	DISC_LFSR_XNOR,         /* Feedback stage1 is XNOR */
33 	DISC_LFSR_OR,           /* Feedback stage2 is just stage 1 output OR with external feed */
34 	DISC_LFSR_REPLACE,      /* Feedback stage3 replaces the shifted register contents */
35 	0x000001,               /* Everything is shifted into the first bit only */
36 	DISC_LFSR_FLAG_OUT_INVERT,  /* Output is inverted, Active Low Reset */
37 	15                      /* Output bit */
38 };
39 
40 /* Nodes - Sounds */
41 #define SKYDIVER_NOTE_SND       NODE_11
42 #define SKYDIVER_NOISE_SND      NODE_12
43 #define SKYDIVER_WHISTLE1_SND   NODE_13
44 #define SKYDIVER_WHISTLE2_SND   NODE_14
45 
46 DISCRETE_SOUND_START(skydiver_discrete)
47 	/************************************************/
48 	/* skydiver  Effects Relative Gain Table        */
49 	/*                                              */
50 	/* Effect  V-ampIn  Gain ratio        Relative  */
51 	/* Note     3.8     3.8/260.5          1000.0   */
52 	/* Noise    3.8     3.8/680             383.1   */
53 	/* Whistle  5.0     5.0/1500            228.5   */
54 	/************************************************/
55 
56 	/************************************************/
57 	/* Input register mapping for skydiver          */
58 	/************************************************/
59 	/*                    NODE                  GAIN        OFFSET  INIT */
60 	DISCRETE_INPUT_DATA  (SKYDIVER_RANGE_DATA)
61 	DISCRETE_INPUT_LOGIC (SKYDIVER_RANGE3_EN)
62 	DISCRETE_INPUT_DATA  (SKYDIVER_NOTE_DATA)
63 	DISCRETE_INPUTX_DATA (SKYDIVER_NOISE_DATA,  383.1/15.0, 0.0,    0.0)
64 	DISCRETE_INPUT_NOT   (SKYDIVER_NOISE_RST)
65 	DISCRETE_INPUT_LOGIC (SKYDIVER_WHISTLE1_EN)
66 	DISCRETE_INPUT_LOGIC (SKYDIVER_WHISTLE2_EN)
67 	DISCRETE_INPUT_LOGIC (SKYDIVER_OCT1_EN)
68 	DISCRETE_INPUT_LOGIC (SKYDIVER_OCT2_EN)
69 	DISCRETE_INPUT_LOGIC (SKYDIVER_SOUND_EN)
70 	/************************************************/
71 
72 	/************************************************/
73 	/* The note generator has a selectable range    */
74 	/* and selectable frequency.                    */
75 	/* The base frequency is                        */
76 	/* 12.096MHz / 2 / range / note freq / 2        */
77 	/* The final /2 is just to give a 50% duty,     */
78 	/* so we can just start by 12.096MHz/4/range    */
79 	/* The octave is selected by 3 bits selecting   */
80 	/* 000 64H  = 12096MHz / 2 / 128                */
81 	/* 001 32H  = 12096MHz / 2 / 64                 */
82 	/* 010 16H  = 12096MHz / 2 / 32                 */
83 	/* 011  8H  = 12096MHz / 2 / 16                 */
84 	/* 100  4H  = 12096MHz / 2 / 8                  */
85 	/* 101  2H  = 12096MHz / 2 / 4                  */
86 	/* 110  1H  = 12096MHz / 2 / 2                  */
87 	/* 111 6MHz = 12096MHz / 2 / 1                  */
88 	/* We will convert the 3 range bits to a        */
89 	/* divide value in the driver before sending    */
90 	/* to the sound interface.                      */
91 	/*                                              */
92 	/* note data: 0xff = off,                       */
93 	/*            0xfe = /2,                        */
94 	/*            0x00 = /256                       */
95 	/* We will send the note data bit inverted to   */
96 	/* sound interface so it is easier to work with.*/
97 	/*                                              */
98 	/* The note generator is disabled by a low on   */
99 	/* RANGE3.                                      */
100 	/************************************************/
101 	// We will disable the divide if SKYDIVER_RANGE_DATA = 0
102 	DISCRETE_DIVIDE(NODE_20, SKYDIVER_RANGE_DATA, 12096000.0 /2.0 / 2.0, SKYDIVER_RANGE_DATA)
103 	DISCRETE_ADDER2(NODE_21, 1, SKYDIVER_NOTE_DATA, 1)
104 	// We will disable the divide if SKYDIVER_NOTE_DATA = 0
105 	DISCRETE_DIVIDE(NODE_22, SKYDIVER_NOTE_DATA, NODE_20, NODE_21)  // freq
106 	DISCRETE_SQUAREWAVE(SKYDIVER_NOTE_SND, SKYDIVER_RANGE3_EN, NODE_22, 1000.0, 50.0, 0, 0.0)
107 
108 	/************************************************/
109 	/* Noise circuit is built around a noise        */
110 	/* generator built from 2 shift registers that  */
111 	/* are clocked by the 1V signal.                */
112 	/* 1V = HSYNC/2                                 */
113 	/*    = 15750/2                                 */
114 	/* Output is binary weighted with 4 bits of     */
115 	/* volume.                                      */
116 	/************************************************/
117 	DISCRETE_LFSR_NOISE(SKYDIVER_NOISE_SND, SKYDIVER_NOISE_RST, SKYDIVER_NOISE_RST, 15750.0/2.0, SKYDIVER_NOISE_DATA, 0, 0, &skydiver_lfsr)
118 
119 	/************************************************/
120 	/* Whistle circuit is a 555 capacitor charge    */
121 	/* waveform.  The original game pot varies from */
122 	/* 0-250k, but we are going to limit it because */
123 	/* below 50k the frequency is too high.         */
124 	/* When triggered it starts at it's highest     */
125 	/* frequency, then decays at the rate set by    */
126 	/* a 68k resistor and 22uf capacitor.           */
127 	/************************************************/
128 	DISCRETE_ADJUSTMENT(NODE_30, 250000, 50000, DISC_LINADJ, "WHISTLE1")    /* R66 */
129 	DISCRETE_MULTADD(NODE_31, SKYDIVER_WHISTLE1_EN, 3.05-0.33, 0.33)
130 	DISCRETE_RCDISC2(NODE_32, SKYDIVER_WHISTLE1_EN, NODE_31, 1.0, NODE_31, 68000.0, 2.2e-5) /* CV */
131 	DISCRETE_SWITCH(NODE_33, 1, SKYDIVER_OCT1_EN, 1e-8, 1e-8 + 3.3e-9)  /* Cap C73 & C58 */
132 	DISCRETE_555_ASTABLE_CV(NODE_34, SKYDIVER_WHISTLE1_EN, 100000, NODE_30, NODE_33, NODE_32, &skydiverWhistl555)
133 	DISCRETE_MULTIPLY(SKYDIVER_WHISTLE1_SND, NODE_34, 228.5/3.3)
134 
135 	DISCRETE_ADJUSTMENT(NODE_35, 250000, 50000, DISC_LINADJ, "WHISTLE2")    /* R65 */
136 	DISCRETE_MULTADD(NODE_36, SKYDIVER_WHISTLE2_EN, 3.05-0.33, 0.33)
137 	DISCRETE_RCDISC2(NODE_37, SKYDIVER_WHISTLE2_EN, NODE_36, 1.0, NODE_36, 68000.0, 2.2e-5) /* CV */
138 	DISCRETE_SWITCH(NODE_38, 1, SKYDIVER_OCT2_EN, 1e-8, 1e-8 + 3.3e-9)  /* Cap C72 & C59 */
139 	DISCRETE_555_ASTABLE_CV(NODE_39, SKYDIVER_WHISTLE2_EN, 100000, NODE_35, NODE_38, NODE_37, &skydiverWhistl555)
140 	DISCRETE_MULTIPLY(SKYDIVER_WHISTLE2_SND, NODE_39, 228.5/3.3)
141 
142 	/************************************************/
143 	/* Final mix and output.                        */
144 	/************************************************/
145 	DISCRETE_ADDER4(NODE_90, SKYDIVER_SOUND_EN, SKYDIVER_NOTE_SND, SKYDIVER_NOISE_SND, SKYDIVER_WHISTLE1_SND, SKYDIVER_WHISTLE2_SND)
146 
147 	DISCRETE_OUTPUT(NODE_90, 65534.0/(1000.0 + 383.1 + 228.5 + 228.5))
148 DISCRETE_SOUND_END
149