mirror of
https://github.com/holub/mame
synced 2025-05-24 23:05:32 +03:00
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
This commit is contained in:
parent
5ad5752fd1
commit
61f12dbf6c
@ -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
|
||||
|
@ -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 },
|
||||
|
@ -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" },
|
||||
|
@ -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 */
|
||||
|
@ -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,13 +291,15 @@ 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 */
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user