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