mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
Added discrete 74LS624(56789) implementation
- DISCRETE_74LS624 is a VCO needed for dkongjr - Supports Logic, Energy and Count outputs
This commit is contained in:
parent
83d4e33df8
commit
e15832fcb4
@ -100,6 +100,12 @@ struct dsd_566_context
|
|||||||
double triOffset; // used to shift a triangle to AC
|
double triOffset; // used to shift a triangle to AC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct dsd_ls624_context
|
||||||
|
{
|
||||||
|
int state;
|
||||||
|
double remain; // remaining time from last step
|
||||||
|
int outtype;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Test to see if basic 555 options are valid. */
|
/* Test to see if basic 555 options are valid. */
|
||||||
@ -1370,3 +1376,90 @@ void dsd_566_reset(node_description *node)
|
|||||||
/* Step the output */
|
/* Step the output */
|
||||||
dsd_566_step(node);
|
dsd_566_step(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
*
|
||||||
|
* DSD_LS624 - Usage of node_description values
|
||||||
|
*
|
||||||
|
* input[0] - Enable input value
|
||||||
|
* input[1] - Modulation Voltage
|
||||||
|
* input[2] - Range Voltage
|
||||||
|
* input[3] - C value
|
||||||
|
* input[4] - Output type
|
||||||
|
*
|
||||||
|
* Dec 2007, Couriersud
|
||||||
|
************************************************************************/
|
||||||
|
#define DSD_LS624__ENABLE (*(node->input[0]))
|
||||||
|
#define DSD_LS624__VMOD (*(node->input[1]))
|
||||||
|
#define DSD_LS624__VRNG (*(node->input[2]))
|
||||||
|
#define DSD_LS624__C (*(node->input[3]))
|
||||||
|
#define DSD_LS624__OUTTYPE (*(node->input[4]))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These formulas are derived from diagrams in the datasheet!
|
||||||
|
* They are not based on any law. The function is not
|
||||||
|
* described anywhere.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LS624_F1(x) (0.19 + 20.0/90.0*(x))
|
||||||
|
#define LS624_T(_C, _R, _F) (-600.0 * (_C) * log(1.0-LS624_F1(_R)*0.12/LS624_F1(_F)))
|
||||||
|
|
||||||
|
void dsd_ls624_step(node_description *node)
|
||||||
|
{
|
||||||
|
struct dsd_ls624_context *context = node->context;
|
||||||
|
|
||||||
|
if (DSD_LS624__ENABLE)
|
||||||
|
{
|
||||||
|
double dt; // change in time
|
||||||
|
double sample_t;
|
||||||
|
double t;
|
||||||
|
int lst, cntf=0, cntr=0;
|
||||||
|
|
||||||
|
sample_t = discrete_current_context->sample_time; // Change in time
|
||||||
|
dt = LS624_T(DSD_LS624__C, DSD_LS624__VRNG, DSD_LS624__VMOD);
|
||||||
|
dt = 16 * dt;
|
||||||
|
t = context->remain;
|
||||||
|
lst = context->state;
|
||||||
|
while (t + dt < sample_t)
|
||||||
|
{
|
||||||
|
context->state = (1-context->state);
|
||||||
|
if (context->state)
|
||||||
|
cntr++;
|
||||||
|
else
|
||||||
|
cntf++;
|
||||||
|
t += dt;
|
||||||
|
}
|
||||||
|
context->remain = t - sample_t;
|
||||||
|
|
||||||
|
switch (context->outtype)
|
||||||
|
{
|
||||||
|
case DISC_LS624_OUT_ENERGY:
|
||||||
|
node->output = ((double) lst) * (1.0+context->remain/sample_t) - ((double) context->state) * context->remain/sample_t;
|
||||||
|
break;
|
||||||
|
case DISC_LS624_OUT_LOGIC:
|
||||||
|
node->output = context->state;
|
||||||
|
break;
|
||||||
|
case DISC_LS624_OUT_COUNT_F:
|
||||||
|
node->output = cntf;
|
||||||
|
break;
|
||||||
|
case DISC_LS624_OUT_COUNT_R:
|
||||||
|
node->output = cntr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
node->output = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dsd_ls624_reset(node_description *node)
|
||||||
|
{
|
||||||
|
struct dsd_ls624_context *context = node->context;
|
||||||
|
|
||||||
|
context->remain = 0;
|
||||||
|
context->state = 0;
|
||||||
|
context->outtype = DSD_LS624__OUTTYPE;
|
||||||
|
|
||||||
|
/* Step the output */
|
||||||
|
dsd_ls624_step(node);
|
||||||
|
}
|
||||||
|
@ -259,7 +259,7 @@ static const discrete_module module_list[] =
|
|||||||
{ DSD_555_CC ,"DSD_555_CC" ,sizeof(struct dsd_555_cc_context) ,dsd_555_cc_reset ,dsd_555_cc_step },
|
{ DSD_555_CC ,"DSD_555_CC" ,sizeof(struct dsd_555_cc_context) ,dsd_555_cc_reset ,dsd_555_cc_step },
|
||||||
{ DSD_555_VCO1 ,"DSD_555_VCO1" ,sizeof(struct dsd_555_vco1_context) ,dsd_555_vco1_reset ,dsd_555_vco1_step },
|
{ DSD_555_VCO1 ,"DSD_555_VCO1" ,sizeof(struct dsd_555_vco1_context) ,dsd_555_vco1_reset ,dsd_555_vco1_step },
|
||||||
{ DSD_566 ,"DSD_566" ,sizeof(struct dsd_566_context) ,dsd_566_reset ,dsd_566_step },
|
{ DSD_566 ,"DSD_566" ,sizeof(struct dsd_566_context) ,dsd_566_reset ,dsd_566_step },
|
||||||
|
{ DSD_LS624 ,"DSD_LS624" ,sizeof(struct dsd_ls624_context) ,dsd_ls624_reset ,dsd_ls624_step },
|
||||||
/* must be the last one */
|
/* must be the last one */
|
||||||
{ DSS_NULL ,"DSS_NULL" ,0 ,NULL ,NULL }
|
{ DSS_NULL ,"DSS_NULL" ,0 ,NULL ,NULL }
|
||||||
};
|
};
|
||||||
|
@ -2911,9 +2911,9 @@
|
|||||||
*
|
*
|
||||||
* DISCRETE_566(name of node,
|
* DISCRETE_566(name of node,
|
||||||
* enable node or static value,
|
* enable node or static value,
|
||||||
|
* vMod node or static value,
|
||||||
* R node or static value in ohms,
|
* R node or static value in ohms,
|
||||||
* C node or static value in Farads,
|
* C node or static value in Farads,
|
||||||
* vMod node or static value,
|
|
||||||
* address of discrete_566_desc structure)
|
* address of discrete_566_desc structure)
|
||||||
*
|
*
|
||||||
* discrete_566_desc = {options, vPlus, vNeg}
|
* discrete_566_desc = {options, vPlus, vNeg}
|
||||||
@ -2929,6 +2929,50 @@
|
|||||||
*
|
*
|
||||||
***********************************************************************
|
***********************************************************************
|
||||||
*
|
*
|
||||||
|
* DISCRETE_74LS624 - VCO.
|
||||||
|
*
|
||||||
|
* Simplified 74LS624 - calculated frequencies should match datasheet
|
||||||
|
* for C > 1nF. Output is Logic (1/0)
|
||||||
|
*
|
||||||
|
* The datasheet gives no formulae. The implementation therefore is
|
||||||
|
* a rough model of the diagrams given.
|
||||||
|
*
|
||||||
|
* For a LS628, use VRng = 3.2
|
||||||
|
*
|
||||||
|
* V+
|
||||||
|
* |
|
||||||
|
* .---------.
|
||||||
|
* vRng >------------|Rng V+ |
|
||||||
|
* | |
|
||||||
|
* vMod >------------|Freq Z |---------> Netlist Node
|
||||||
|
* | |
|
||||||
|
* .---|CX1 |
|
||||||
|
* | | |
|
||||||
|
* --- | |
|
||||||
|
* C --- | |
|
||||||
|
* | | |
|
||||||
|
* '---|CX2 |
|
||||||
|
* '---------'
|
||||||
|
* |
|
||||||
|
* GND
|
||||||
|
*
|
||||||
|
* Declaration syntax
|
||||||
|
*
|
||||||
|
* DISCRETE_74LS624(name of node,
|
||||||
|
* enable node or static value,
|
||||||
|
* vMod node or static value,
|
||||||
|
* vRng node or static value,
|
||||||
|
* C node or static value in Farads,
|
||||||
|
* Type of output static value)
|
||||||
|
*
|
||||||
|
* Type of Output
|
||||||
|
* DISC_LS624_OUT_ENERGY Energy - use for audio output
|
||||||
|
* DISC_LS624_OUT_LOGIC Logic ( 0 or 1)
|
||||||
|
* DISC_LS624_OUT_COUNT_F Number of Falling edges
|
||||||
|
* DISC_LS624_OUT_COUNT_R Number of Rising edges
|
||||||
|
*
|
||||||
|
***********************************************************************
|
||||||
|
*
|
||||||
* DISCRETE_CUSTOMx - Link to custom code
|
* DISCRETE_CUSTOMx - Link to custom code
|
||||||
* where x = 1 to 5
|
* where x = 1 to 5
|
||||||
*
|
*
|
||||||
@ -3208,6 +3252,11 @@ enum
|
|||||||
|
|
||||||
#define DISC_566_OUT_MASK 0x30 /* Bits that define output type.
|
#define DISC_566_OUT_MASK 0x30 /* Bits that define output type.
|
||||||
* Used only internally in module. */
|
* Used only internally in module. */
|
||||||
|
/* LS624 output flags */
|
||||||
|
#define DISC_LS624_OUT_ENERGY 0x01
|
||||||
|
#define DISC_LS624_OUT_LOGIC 0x02
|
||||||
|
#define DISC_LS624_OUT_COUNT_F 0x03
|
||||||
|
#define DISC_LS624_OUT_COUNT_R 0x04
|
||||||
|
|
||||||
/* Oneshot types */
|
/* Oneshot types */
|
||||||
#define DISC_ONESHOT_FEDGE 0x00
|
#define DISC_ONESHOT_FEDGE 0x00
|
||||||
@ -3739,6 +3788,7 @@ enum
|
|||||||
DSD_555_CC, /* Constant Current 555 circuit (VCO)*/
|
DSD_555_CC, /* Constant Current 555 circuit (VCO)*/
|
||||||
DSD_555_VCO1, /* Op-Amp linear ramp based 555 VCO */
|
DSD_555_VCO1, /* Op-Amp linear ramp based 555 VCO */
|
||||||
DSD_566, /* NE566 Emulation */
|
DSD_566, /* NE566 Emulation */
|
||||||
|
DSD_LS624, /* 74LS624 Emulation */
|
||||||
|
|
||||||
/* Custom */
|
/* Custom */
|
||||||
DST_CUSTOM, /* whatever you want */
|
DST_CUSTOM, /* whatever you want */
|
||||||
@ -3902,7 +3952,7 @@ enum
|
|||||||
#define DISCRETE_555_VCO1(NODE,RESET,VIN,OPTIONS) { NODE, DSD_555_VCO1 , 3, { RESET,VIN,NODE_NC }, { RESET,VIN,-1 }, OPTIONS, "555 VCO1 - Op-Amp type" },
|
#define DISCRETE_555_VCO1(NODE,RESET,VIN,OPTIONS) { NODE, DSD_555_VCO1 , 3, { RESET,VIN,NODE_NC }, { RESET,VIN,-1 }, OPTIONS, "555 VCO1 - Op-Amp type" },
|
||||||
#define DISCRETE_555_VCO1_CV(NODE,RESET,VIN,CTRLV,OPTIONS) { NODE, DSD_555_VCO1 , 3, { RESET,VIN,CTRLV }, { RESET,VIN,CTRLV }, OPTIONS, "555 VCO1 with CV - Op-Amp type" },
|
#define DISCRETE_555_VCO1_CV(NODE,RESET,VIN,CTRLV,OPTIONS) { NODE, DSD_555_VCO1 , 3, { RESET,VIN,CTRLV }, { RESET,VIN,CTRLV }, OPTIONS, "555 VCO1 with CV - Op-Amp type" },
|
||||||
#define DISCRETE_566(NODE,ENAB,VMOD,R,C,OPTIONS) { NODE, DSD_566 , 4, { ENAB,VMOD,R,C }, { ENAB,VMOD,R,C }, OPTIONS, "566" },
|
#define DISCRETE_566(NODE,ENAB,VMOD,R,C,OPTIONS) { NODE, DSD_566 , 4, { ENAB,VMOD,R,C }, { ENAB,VMOD,R,C }, OPTIONS, "566" },
|
||||||
|
#define DISCRETE_74LS624(NODE,ENAB,VMOD,VRNG,C,OUTTYPE) { NODE, DSD_LS624 , 5, { ENAB,VMOD,VRNG,C,NODE_NC }, { ENAB,VMOD,VRNG,C, OUTTYPE }, NULL, "74LS624" },
|
||||||
#define DISCRETE_CSVLOG1(NODE1) { NODE_SPECIAL, DSO_CSVLOG , 1, { NODE1 }, { NODE1 }, NULL, "CSV Log 1 Node" },
|
#define DISCRETE_CSVLOG1(NODE1) { NODE_SPECIAL, DSO_CSVLOG , 1, { NODE1 }, { NODE1 }, NULL, "CSV Log 1 Node" },
|
||||||
#define DISCRETE_CSVLOG2(NODE1,NODE2) { NODE_SPECIAL, DSO_CSVLOG , 2, { NODE1,NODE2 }, { NODE1,NODE2 }, NULL, "CSV Log 2 Nodes" },
|
#define DISCRETE_CSVLOG2(NODE1,NODE2) { NODE_SPECIAL, DSO_CSVLOG , 2, { NODE1,NODE2 }, { NODE1,NODE2 }, NULL, "CSV Log 2 Nodes" },
|
||||||
#define DISCRETE_CSVLOG3(NODE1,NODE2,NODE3) { NODE_SPECIAL, DSO_CSVLOG , 3, { NODE1,NODE2,NODE3 }, { NODE1,NODE2,NODE3 }, NULL, "CSV Log 3 Nodes" },
|
#define DISCRETE_CSVLOG3(NODE1,NODE2,NODE3) { NODE_SPECIAL, DSO_CSVLOG , 3, { NODE1,NODE2,NODE3 }, { NODE1,NODE2,NODE3 }, NULL, "CSV Log 3 Nodes" },
|
||||||
|
Loading…
Reference in New Issue
Block a user