From 61f12dbf6c4e02e903abbf12f64241bfe1e60a14 Mon Sep 17 00:00:00 2001 From: Couriersud Date: Sat, 15 Aug 2009 18:43:56 +0000 Subject: [PATCH] Added DISCRETE_BIT(S)_DECODE - decodes individual bits from input values - Updated drivers which had macro DISCRETE_BITSET (which was a bit misleading) - This should be slightly faster than using DISCRETE_TRANSROM --- src/emu/sound/disc_mth.c | 46 +++++++++++++++++++++++++++++++++++++++ src/emu/sound/discrete.c | 2 ++ src/emu/sound/discrete.h | 43 ++++++++++++++++++++++++++++++++++++ src/mame/audio/dkong.c | 9 ++++---- src/mame/audio/galaxian.c | 14 +++++++----- src/mame/audio/mario.c | 9 +++----- 6 files changed, 106 insertions(+), 17 deletions(-) diff --git a/src/emu/sound/disc_mth.c b/src/emu/sound/disc_mth.c index a3b2c2d30f8..f2c29fda07a 100644 --- a/src/emu/sound/disc_mth.c +++ b/src/emu/sound/disc_mth.c @@ -48,6 +48,14 @@ struct dst_comp_adder_context double total[256]; }; +struct dst_bits_decode_context +{ + int from; + int count; + int last_val; + int v_out; +}; + struct dst_dac_r1_context { double i_bias; /* current of the bias circuit */ @@ -667,6 +675,44 @@ static DISCRETE_STEP(dst_logic_inv) } } +/************************************************************************ + * + * DST_BITS_DECODE - Decode Bits from input node + * + * input[0] - input + * input[1] - From bit + * input[2] - To bit + * + ************************************************************************/ +#define DST_BITS_DECODE__IN (*(node->input[0])) +#define DST_BITS_DECODE__FROM (*(node->input[1])) +#define DST_BITS_DECODE__TO (*(node->input[2])) +#define DST_BITS_DECODE__VOUT (*(node->input[3])) + +static DISCRETE_STEP(dst_bits_decode) +{ + struct dst_bits_decode_context *context = (struct dst_bits_decode_context *)node->context; + int v = DST_BITS_DECODE__IN; + int i; + + if (context->last_val != v) + { + context->last_val = v; + for (i = 0; i < context->count; i++ ) + node->output[i] = ((v >> (i+context->from)) & 1) * context->v_out; + } +} + +static DISCRETE_RESET(dst_bits_decode) +{ + struct dst_bits_decode_context *context = (struct dst_bits_decode_context *)node->context; + + context->from = DST_BITS_DECODE__FROM; + context->count = DST_BITS_DECODE__TO - context->from + 1; + context->v_out = DST_BITS_DECODE__VOUT; + + DISCRETE_STEP_CALL(dst_bits_decode); +} /************************************************************************ * * DST_LOGIC_AND - Logic AND gate implementation diff --git a/src/emu/sound/discrete.c b/src/emu/sound/discrete.c index dd40a86428b..a922c45a606 100644 --- a/src/emu/sound/discrete.c +++ b/src/emu/sound/discrete.c @@ -164,6 +164,8 @@ static const discrete_module module_list[] = { DST_DIVIDE ,"DST_DIVIDE" , 1 ,0 ,NULL ,dst_divide_step }, { DST_GAIN ,"DST_GAIN" , 1 ,0 ,NULL ,dst_gain_step }, { DST_LOGIC_INV ,"DST_LOGIC_INV" , 1 ,0 ,NULL ,dst_logic_inv_step }, + { DST_GAIN ,"DST_GAIN" , 1 ,0 ,NULL ,dst_gain_step }, + { DST_BITS_DECODE ,"DST_BITS_DECODE" , 8 ,sizeof(struct dst_bits_decode_context) ,dst_bits_decode_reset ,dst_bits_decode_step }, { DST_LOGIC_AND ,"DST_LOGIC_AND" , 1 ,0 ,NULL ,dst_logic_and_step }, { DST_LOGIC_NAND ,"DST_LOGIC_NAND" , 1 ,0 ,NULL ,dst_logic_nand_step }, { DST_LOGIC_OR ,"DST_LOGIC_OR" , 1 ,0 ,NULL ,dst_logic_or_step }, diff --git a/src/emu/sound/discrete.h b/src/emu/sound/discrete.h index 87817204de6..ee2381f5e4b 100644 --- a/src/emu/sound/discrete.h +++ b/src/emu/sound/discrete.h @@ -255,6 +255,9 @@ * DISCRETE_OP_AMP_ONESHOT(NODE,TRIG,INFO) * DISCRETE_OP_AMP_TRIG_VCA(NODE,TRG0,TRG1,TRG2,IN0,IN1,INFO) * + * DISCRETE_BIT_DECODE(NODE,INP,BIT_N,VOUT) + * DISCRETE_BITS_DECODE(NODE,INP,BIT_FROM,BIT_TO,VOUT) + * * DISCRETE_LOGIC_INVERT(NODE,ENAB,INP0) * DISCRETE_LOGIC_AND(NODE,ENAB,INP0,INP1) * DISCRETE_LOGIC_AND3(NODE,ENAB,INP0,INP1,INP2) @@ -1242,6 +1245,41 @@ * to write a divide by zero error to the Mame log if enabled. * *********************************************************************** + * + * DISCRETE_BIT_DECODE - Decode a bit from value + * DISCRETE_BITS_DECODE - Decode a range of bits from value + * + * Declaration syntax + * + * DISCRETE_BIT_DECODE(name of node, + * input0 node or static value, + * bit number static value, + * output voltage (logic high) static value) + * + * Example config lines + * + * DISCRETE_BIT_DECODE(NODE_03,7,0,5) + * + * Node output is 5 + * + * DISCRETE_BIT_DECODE(NODE_03,7,3,5) + * + * Node output is 0 + * + * if the range variant is used, you may access the bits (up to 8) + * by using NODE_SUB, i.e. + * + * DISCRETE_BITS_DECODE(NODE_03,5,0,4,5) + * + * NODE_SUB(NODE_03, 0) = 5 + * NODE_SUB(NODE_03, 1) = 0 + * NODE_SUB(NODE_03, 2) = 5 + * NODE_SUB(NODE_03, 3) = 0 + * NODE_SUB(NODE_03, 4) = 0 + * + * EXAMPLES: galaxian, dkong, mario + * +# *********************************************************************** * * DISCRETE_LOGIC_INVERT - Logic invertor * DISCRETE_LOGIC_AND - Logic AND gate (3 & 4 input also available) @@ -4038,6 +4076,7 @@ enum DST_CLAMP, /* Signal Clamp */ DST_DIVIDE, /* Gain Block, C = A/B */ DST_GAIN, /* Gain Block, D = (A*B) + C*/ + DST_BITS_DECODE, /* Decode bits from input value */ DST_LOGIC_INV, DST_LOGIC_AND, DST_LOGIC_NAND, @@ -4179,6 +4218,10 @@ enum #define DISCRETE_GAIN(NODE,INP0,GAIN) { NODE, DST_GAIN , 4, { NODE_NC,INP0,NODE_NC,NODE_NC }, { 1,INP0,GAIN,0 }, NULL, "DISCRETE_GAIN" }, #define DISCRETE_INVERT(NODE,INP0) { NODE, DST_GAIN , 4, { NODE_NC,INP0,NODE_NC,NODE_NC }, { 1,INP0,-1,0 }, NULL, "DISCRETE_INVERT" }, #define DISCRETE_LOGIC_INVERT(NODE,ENAB,INP0) { NODE, DST_LOGIC_INV , 2, { ENAB,INP0 }, { ENAB,INP0 }, NULL, "DISCRETE_LOGIC_INVERT" }, + +#define DISCRETE_BIT_DECODE(NODE, INP, BIT_N, VOUT) { NODE, DST_BITS_DECODE , 3, { INP,NODE_NC,NODE_NC,NODE_NC }, { INP,BIT_N,BIT_N, VOUT }, NULL, "DISCRETE_BIT_DECODE" }, +#define DISCRETE_BITS_DECODE(NODE, INP, BIT_FROM, BIT_TO, VOUT) { NODE, DST_BITS_DECODE , 4, { INP,NODE_NC,NODE_NC,NODE_NC }, { INP,BIT_FROM,BIT_TO, VOUT }, NULL, "DISCRETE_BITS_DECODE" }, + #define DISCRETE_LOGIC_AND(NODE,ENAB,INP0,INP1) { NODE, DST_LOGIC_AND , 5, { ENAB,INP0,INP1,NODE_NC,NODE_NC }, { ENAB,INP0,INP1,1.0,1.0 }, NULL, "DISCRETE_LOGIC_AND" }, #define DISCRETE_LOGIC_AND3(NODE,ENAB,INP0,INP1,INP2) { NODE, DST_LOGIC_AND , 5, { ENAB,INP0,INP1,INP2,NODE_NC }, { ENAB,INP0,INP1,INP2,1.0 }, NULL, "DISCRETE_LOGIC_AND3" }, #define DISCRETE_LOGIC_AND4(NODE,ENAB,INP0,INP1,INP2,INP3) { NODE, DST_LOGIC_AND , 5, { ENAB,INP0,INP1,INP2,INP3 }, { ENAB,INP0,INP1,INP2,INP3 } ,NULL, "DISCRETE_LOGIC_AND4" }, diff --git a/src/mame/audio/dkong.c b/src/mame/audio/dkong.c index ae3dfb7c6b1..f454fd0959c 100644 --- a/src/mame/audio/dkong.c +++ b/src/mame/audio/dkong.c @@ -804,7 +804,6 @@ DISCRETE_SOUND_END #define DISCRETE_LS123_INV(_N, _T, _R, _C) \ DISCRETE_ONESHOTR(_N, 0, _T, TTL_HIGH, (0.25 * (_R) * (_C) * (1.0+700./(_R))), DISC_ONESHOT_RETRIG | DISC_ONESHOT_REDGE | DISC_OUT_ACTIVE_LOW) -#define DISCRETE_BITSET(_N, _N1, _B) DISCRETE_TRANSFORM3(_N, _N1, 1 << ((_B)-1), 0, "01&2>") #define DISCRETE_ENERGY_NAND(_N, _N1, _N2) DISCRETE_TRANSFORM3(_N, _N1, _N2, 1, "201*-") static const discrete_mixer_desc dkongjr_mixer_desc = @@ -911,10 +910,10 @@ static DISCRETE_SOUND_START(dkongjr) DISCRETE_COUNTER(NODE_100,1,0,NODE_118,0xFFFF,DISC_COUNT_UP,0,DISC_CLK_BY_COUNT) - DISCRETE_BITSET(NODE_101, NODE_100, 7) /*LS157 2A */ - DISCRETE_BITSET(NODE_102, NODE_100, 4) /*LS157 2B */ - DISCRETE_BITSET(NODE_103, NODE_100, 13) /*LS157 3A */ - DISCRETE_BITSET(NODE_104, NODE_100, 12) /*LS157 3B */ + DISCRETE_BIT_DECODE(NODE_101, NODE_100, 6, 1) /*LS157 2A */ + DISCRETE_BIT_DECODE(NODE_102, NODE_100, 3, 1) /*LS157 2B */ + DISCRETE_BIT_DECODE(NODE_103, NODE_100, 12, 1) /*LS157 3A */ + DISCRETE_BIT_DECODE(NODE_104, NODE_100, 11, 1) /*LS157 3B */ /* LS157 Switches */ DISCRETE_SWITCH(NODE_105, 1, DS_SOUND7_INV, GND, NODE_113) /* Switch 1 from LS624 */ diff --git a/src/mame/audio/galaxian.c b/src/mame/audio/galaxian.c index af0828b3833..2716aa16715 100644 --- a/src/mame/audio/galaxian.c +++ b/src/mame/audio/galaxian.c @@ -35,7 +35,7 @@ TODO: #define SOUND_CLOCK (XTAL/6/2) /* 1.536 MHz */ #define RNG_RATE (XTAL/3*2) /* RNG clock is XTAL/3*2 see Aaron's note in video/galaxian.c */ -#define DISCRETE_BITSET(_N, _N1, _B, _OV) DISCRETE_TRANSFORM4(_N, _N1, (1 << ((_B)-1)), 0, _OV, "01&2>3*") +//#define DISCRETE_BITSET(_N, _N1, _B, _OV) DISCRETE_TRANSFORM4(_N, _N1, (1 << ((_B)-1)), 0, _OV, "01&2>3*") /* 74LS259 */ #define GAL_INP_BG_DAC NODE_10 /* at 9M Q4 to Q7 in schematics */ @@ -291,16 +291,18 @@ static DISCRETE_SOUND_START(galaxian) /* PITCH */ /************************************************/ + /* two cascaded LS164 which are reset to pitch latch value, + * thus generating SOUND_CLOCK / (256 - pitch_clock) signal + */ DISCRETE_TRANSFORM3(NODE_130, SOUND_CLOCK, 256, GAL_INP_PITCH, "012-/") DISCRETE_COUNTER(NODE_132, 1, 0, NODE_130, 15, DISC_COUNT_UP, 0, DISC_CLK_IS_FREQ) - /* Needs to be replaced by timer ... */ - DISCRETE_BITSET(NODE_133, NODE_132, 1, TTL_OUT) /* QA 74393 */ - DISCRETE_BITSET(NODE_134, NODE_132, 3, TTL_OUT) /* QC 74393 */ - DISCRETE_BITSET(NODE_135, NODE_132, 4, TTL_OUT) /* QD 74393 */ + DISCRETE_BIT_DECODE(NODE_133, NODE_132, 0, TTL_OUT) /* QA 74393 */ + DISCRETE_BIT_DECODE(NODE_134, NODE_132, 2, TTL_OUT) /* QC 74393 */ + DISCRETE_BIT_DECODE(NODE_135, NODE_132, 3, TTL_OUT) /* QD 74393 */ /************************************************/ - /* HIT */ + /* HIT */ /************************************************/ /* NOISE */ diff --git a/src/mame/audio/mario.c b/src/mame/audio/mario.c index 50aac5539d1..eec3c406d02 100644 --- a/src/mame/audio/mario.c +++ b/src/mame/audio/mario.c @@ -132,8 +132,6 @@ #define DISCRETE_LS123_INV(_N, _T, _R, _C) \ DISCRETE_ONESHOTR(_N, 0, _T, TTL_HIGH, (0.25 * (_R) * (_C) * (1.0+700./(_R))), DISC_ONESHOT_RETRIG | DISC_ONESHOT_REDGE | DISC_OUT_ACTIVE_LOW) -#define DISCRETE_BITSET(_N, _N1, _B) DISCRETE_TRANSFORM3(_N, _N1, (1 << ((_B)-1)), 0, "01&2>") - /* The following formula was derived from figures 2 and 3 in LS624 datasheet. Coefficients * where calculated using least square approximation. * This approach gives a bit better results compared to the first approach. @@ -304,8 +302,8 @@ static DISCRETE_SOUND_START(mario) DISCRETE_COUNTER(NODE_100,1,0,NODE_118,0xFFFF,DISC_COUNT_UP,0,DISC_CLK_BY_COUNT) - DISCRETE_BITSET(NODE_102, NODE_100, 4) //LS157 2B - DISCRETE_BITSET(NODE_104, NODE_100, 12) //LS157 3B + DISCRETE_BIT_DECODE(NODE_102, NODE_100, 3, 1) //LS157 2B + DISCRETE_BIT_DECODE(NODE_104, NODE_100, 11, TTL_HIGH) //LS157 3B DISCRETE_LS123(NODE_110, DS_SOUND7_INV, MR_R61, CAP_AGE(MR_C41, 0.6)) DISCRETE_TRANSFORM2(NODE_111, NODE_110, TTL_HIGH, "0!1*") @@ -314,8 +312,7 @@ static DISCRETE_SOUND_START(mario) DISCRETE_LOGIC_XOR(NODE_115, 1, NODE_102, NODE_113) - DISCRETE_TRANSFORM2(NODE_116, NODE_104, TTL_HIGH, "0!1*") - DISCRETE_RCFILTER(NODE_117, 1, NODE_116, MR_R64, MR_C43) + DISCRETE_RCFILTER(NODE_117, 1, NODE_104, MR_R64, MR_C43) DISCRETE_74LS624(NODE_118, 1, NODE_117, VSS, MR_C39, DISC_LS624_OUT_COUNT_F) DISCRETE_LOGIC_AND(NODE_120, 1, NODE_115, NODE_110)