summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Couriersud <couriersud@users.noreply.github.com>2009-10-03 21:45:09 +0000
committer Couriersud <couriersud@users.noreply.github.com>2009-10-03 21:45:09 +0000
commitde55177d940d8dec493b3889a509c5d6ff1afe44 (patch)
treee2a8c17bb3a460725ffb182e3b0bf862abeae52d
parentfa947ec474dd89cb3a1010fdc3349c4375f500be (diff)
Discrete task groups
- DISCRETE_TASK_START now requires a parameter TASK_GROUP (>=0, <=9) - Tasks are scheduled in the order of their task group - Nodes are automatically buffered between task groups - Discrete core determines nodes which need buffering to minimize overhead (information in DISCRETE_LOG) - A discrete block list now must put each stepped node into a task if it uses tasks - Drivers not using tasks will get one task allocated automatically - Updated drivers accordingly - Some more constification
-rw-r--r--src/emu/sound/disc_sys.c82
-rw-r--r--src/emu/sound/discrete.c166
-rw-r--r--src/emu/sound/discrete.h13
-rw-r--r--src/mame/audio/dkong.c28
-rw-r--r--src/mame/audio/galaxian.c39
-rw-r--r--src/mame/audio/mario.c14
-rw-r--r--src/mame/audio/sprint8.c16
7 files changed, 194 insertions, 164 deletions
diff --git a/src/emu/sound/disc_sys.c b/src/emu/sound/disc_sys.c
index be43c9e7c1a..c9782cb8302 100644
--- a/src/emu/sound/disc_sys.c
+++ b/src/emu/sound/disc_sys.c
@@ -36,7 +36,7 @@ struct dso_wavelog_context
*
*************************************/
-static void task_check(discrete_task *task, discrete_task *dest_task)
+static void task_check(discrete_task *task, const discrete_task *dest_task)
{
int inputnum;
const linked_list_entry *node_entry;
@@ -47,8 +47,7 @@ static void task_check(discrete_task *task, discrete_task *dest_task)
*/
for (node_entry = task->list; node_entry != NULL; node_entry = node_entry->next)
{
- node_description *task_node = (node_description *) node_entry->ptr;
- int found = 0;
+ const node_description *task_node = (node_description *) node_entry->ptr;
for (step_entry = dest_task->list; step_entry != NULL; step_entry = step_entry->next)
{
@@ -62,36 +61,40 @@ static void task_check(discrete_task *task, discrete_task *dest_task)
{
if (NODE_DEFAULT_NODE(task_node->block->node) == NODE_DEFAULT_NODE(inputnode))
{
- int i;
- found = 0;
+ discrete_source_node *source;
+ int i, found = -1;
+
for (i = 0; i < task->numbuffered; i++)
if (task->nodes[i]->block->node == inputnode)
- found = 1;
- if (!found)
+ {
+ found = i;
+ break;
+ }
+
+ if (found<0)
{
- discrete_source_node *source;
-
if (task->numbuffered >= DISCRETE_MAX_TASK_OUTPUTS)
fatalerror("dso_task_start - Number of maximum buffered nodes exceeded");
- discrete_log(task_node->info, "dso_task_start - buffering %d(%d) in task %p referenced by %d", NODE_INDEX(inputnode), NODE_CHILD_NODE_NUM(inputnode), task, NODE_BLOCKINDEX(dest_node));
task->node_buf[task->numbuffered] = auto_alloc_array(task_node->info->device->machine, double, 2048);
task->source[task->numbuffered] = (double *) dest_node->input[inputnum];
task->nodes[task->numbuffered] = discrete_find_node(task_node->info, inputnode);
-
- /* register into source list */
- source = auto_alloc(dest_node->info->device->machine, discrete_source_node);
- linked_list_add(dest_node->info,
- (linked_list_entry **) &dest_task->source_list,
- source);
- source->task = task;
- source->output_node = task->numbuffered;
-
- /* point the input to a buffered location */
- dest_node->input[inputnum] = &source->buffer;
-
+ i = task->numbuffered;
task->numbuffered++;
}
+ discrete_log(task_node->info, "dso_task_start - buffering %d(%d) in task %p group %d referenced by %d group %d", NODE_INDEX(inputnode), NODE_CHILD_NODE_NUM(inputnode), task, task->task_group, NODE_BLOCKINDEX(dest_node), dest_task->task_group);
+
+ /* register into source list */
+ source = auto_alloc(dest_node->info->device->machine, discrete_source_node);
+ linked_list_add(dest_node->info,
+ (linked_list_entry **) &dest_task->source_list,
+ source);
+ source->task = task;
+ source->output_node = i;
+
+ /* point the input to a buffered location */
+ dest_node->input[inputnum] = &source->buffer;
+
}
}
}
@@ -99,36 +102,49 @@ static void task_check(discrete_task *task, discrete_task *dest_task)
}
}
-static DISCRETE_START( dso_task )
+static DISCRETE_START( dso_task_start )
{
discrete_task *task = (discrete_task *) node->context;
const linked_list_entry *task_entry;
- /* dummy task for main */
- discrete_task main_task;
+
+ task->task_group = (int) DISCRETE_INPUT(0);
+
+ if (task->task_group < 0 || task->task_group >= DISCRETE_MAX_TASK_GROUPS)
+ fatalerror("discrete_dso_task: illegal task_group %d", task->task_group);
for (task_entry = node->info->task_list; task_entry != NULL; task_entry = task_entry->next)
{
discrete_task *dest_task = (discrete_task *) task_entry->ptr;
- if (task->task_group < dest_task->task_group)
- task_check(task, dest_task);
+ if (task->task_group > dest_task->task_group)
+ task_check(dest_task, task);
}
- main_task.list = node->info->main_list;
- main_task.source_list = node->info->main_source_list;
- task_check(task, &main_task);
- *((linked_list_entry **) &node->info->main_source_list) = main_task.source_list;
}
-static DISCRETE_STEP( dso_task )
+static DISCRETE_STEP( dso_task_end )
{
discrete_task *task = (discrete_task *) node->context;
int i;
for (i = 0; i < task->numbuffered; i++)
- *(task->ptr[i]++) = *task->source[i]; //DISCRETE_INPUT(i);
+ *(task->ptr[i]++) = *task->source[i];
}
+static DISCRETE_STEP( dso_task_start )
+{
+ const discrete_task *task = (discrete_task *) node->context;
+ const linked_list_entry *entry;
+
+ /* update source node buffer */
+ for (entry = task->source_list; entry != 0; entry = entry->next)
+ {
+ discrete_source_node *sn = (discrete_source_node *) entry->ptr;
+ sn->buffer = *sn->ptr++;
+ }
+}
+
+
static DISCRETE_RESET( dso_task )
{
/* nothing to do - just avoid being stepped */
diff --git a/src/emu/sound/discrete.c b/src/emu/sound/discrete.c
index 0edbe39b47e..93f6475dc7b 100644
--- a/src/emu/sound/discrete.c
+++ b/src/emu/sound/discrete.c
@@ -78,9 +78,9 @@ struct _task_info
*
*************************************/
-static void init_nodes(discrete_info *info, linked_list_entry *block_list, const device_config *device);
-static void find_input_nodes(discrete_info *info);
-static node_description *discrete_find_node(const discrete_info *info, int node);
+static void init_nodes(discrete_info *info, const linked_list_entry *block_list, const device_config *device);
+static void find_input_nodes(const discrete_info *info);
+static node_description *discrete_find_node(const discrete_info *info, const int node);
static DEVICE_RESET( discrete );
static STREAM_UPDATE( discrete_stream_update );
static STREAM_UPDATE( buffer_stream_update );
@@ -103,6 +103,7 @@ static void CLIB_DECL ATTR_PRINTF(2,3) discrete_log(const discrete_info *disc_in
{
vfprintf(disc_info->disclogfile, text, arg);
fprintf(disc_info->disclogfile, "\n");
+ fflush(disc_info->disclogfile);
}
va_end(arg);
@@ -200,8 +201,8 @@ static const discrete_module module_list[] =
{ DSO_IMPORT ,"DSO_IMPORT" , 0 ,0 ,NULL ,NULL ,NULL ,NULL },
/* parallel modules */
- { DSO_TASK_START ,"DSO_TASK_START" , 0 ,0 ,NULL ,NULL ,NULL ,NULL },
- { DSO_TASK_END ,"DSO_TASK_END" , 0 ,0 ,dso_task_reset ,dso_task_step ,dso_task_start ,NULL },
+ { DSO_TASK_START ,"DSO_TASK_START" , 0 ,0 ,dso_task_reset ,dso_task_start_step ,dso_task_start_start ,NULL },
+ { DSO_TASK_END ,"DSO_TASK_END" , 0 ,0 ,dso_task_reset ,dso_task_end_step ,NULL ,NULL },
{ DSO_TASK_SYNC ,"DSO_TASK_SYNC" , 0 ,0 ,NULL ,NULL ,NULL ,NULL },
/* nop */
@@ -431,7 +432,7 @@ static void discrete_build_list(discrete_info *info, const discrete_sound_block
static void discrete_sanity_check(const discrete_info *info)
{
- linked_list_entry *entry;
+ const linked_list_entry *entry;
int node_count = 0;
discrete_log(info, "discrete_start() - Doing node list sanity check");
@@ -470,8 +471,8 @@ static void discrete_sanity_check(const discrete_info *info)
static DEVICE_START( discrete )
{
linked_list_entry **intf;
- linked_list_entry *entry;
- discrete_sound_block *intf_start = (discrete_sound_block *)device->static_config;
+ const linked_list_entry *entry;
+ const discrete_sound_block *intf_start = (discrete_sound_block *)device->static_config;
discrete_info *info = get_safe_token(device);
char name[32];
@@ -503,10 +504,8 @@ static DEVICE_START( discrete )
/* Start with empty lists */
info->node_list = NULL;
- info->main_list = NULL;
info->output_list = NULL;
info->input_list = NULL;
- info->main_source_list = NULL;
/* allocate memory to hold pointers to nodes by index */
info->indexed_node = auto_alloc_array_clear(device->machine, node_description *, DISCRETE_MAX_NODES);
@@ -587,11 +586,8 @@ static void display_profiling(const discrete_info *info)
discrete_task *task = (discrete_task *) entry->ptr;
tt = list_run_time(task->list);
- printf("Task: %8.2f %15.2f\n", tt / (double) total * 100.0, tt / (double) info->total_samples);
+ printf("Task(%d): %8.2f %15.2f\n", task->task_group, tt / (double) total * 100.0, tt / (double) info->total_samples);
}
- tt = list_run_time(info->main_list);
-
- printf("Main: %8.2f %15.2f\n", tt / (double) total * 100.0, tt / (double) info->total_samples);
printf("Average samples/stream_update: %8.2f\n", (double) info->total_samples / (double) info->total_stream_updates);
}
@@ -599,7 +595,7 @@ static void display_profiling(const discrete_info *info)
static DEVICE_STOP( discrete )
{
discrete_info *info = get_safe_token(device);
- linked_list_entry *entry;
+ const linked_list_entry *entry;
osd_work_queue_free(info->queue);
@@ -637,8 +633,8 @@ static DEVICE_STOP( discrete )
static DEVICE_RESET( discrete )
{
- discrete_info *info = get_safe_token(device);
- linked_list_entry *entry;
+ const discrete_info *info = get_safe_token(device);
+ const linked_list_entry *entry;
/* loop over all nodes */
for (entry = info->node_list; entry != 0; entry = entry->next)
@@ -665,16 +661,17 @@ static DEVICE_RESET( discrete )
static void *task_callback(void *param, int threadid)
{
- task_info *ti = (task_info *) param;
- linked_list_entry *entry;
+ const task_info *ti = (task_info *) param;
+ const linked_list_entry *entry;
+ discrete_task *task = ti->task;
int samples, i;
/* set up task buffers */
- for (i = 0; i < ti->task->numbuffered; i++)
- ti->task->ptr[i] = ti->task->node_buf[i];
+ for (i = 0; i < task->numbuffered; i++)
+ task->ptr[i] = task->node_buf[i];
/* initialize sources */
- for (entry = ti->task->source_list; entry != 0; entry = entry->next)
+ for (entry = task->source_list; entry != 0; entry = entry->next)
{
discrete_source_node *sn = (discrete_source_node *) entry->ptr;
sn->ptr = sn->task->node_buf[sn->output_node];
@@ -683,50 +680,19 @@ static void *task_callback(void *param, int threadid)
samples = ti->samples;
while (samples-- > 0)
{
- /* update source node buffer */
- for (entry = ti->task->source_list; entry != 0; entry = entry->next)
- {
- discrete_source_node *sn = (discrete_source_node *) entry->ptr;
- sn->buffer = *sn->ptr++;
- }
-
/* step */
- step_nodes_in_list(ti->task->list);
+ step_nodes_in_list(task->list);
}
free(param);
return NULL;
}
-INLINE void update_main_nodes(discrete_info *info, int samples)
-{
- linked_list_entry *entry;
-
- /* initialize sources */
- for (entry = info->main_source_list; entry != 0; entry = entry->next)
- {
- discrete_source_node *sn = (discrete_source_node *) entry->ptr;
- sn->ptr = sn->task->node_buf[sn->output_node];
- }
-
- while (samples-- > 0)
- {
- /* update source node buffer */
- for (entry = info->main_source_list; entry != 0; entry = entry->next)
- {
- discrete_source_node *sn = (discrete_source_node *) entry->ptr;
- sn->buffer = *sn->ptr++;
- }
-
- /* loop over all nodes */
- step_nodes_in_list(info->main_list);
- }
-}
static STREAM_UPDATE( buffer_stream_update )
{
- node_description *node = (node_description *) param;
- struct dss_input_context *context = (struct dss_input_context *)node->context;
+ const node_description *node = (node_description *) param;
+ const struct dss_input_context *context = (struct dss_input_context *)node->context;
stream_sample_t *ptr = outputs[0];
int data = context->data;
int samplenum = samples;
@@ -739,8 +705,8 @@ static STREAM_UPDATE( buffer_stream_update )
static STREAM_UPDATE( discrete_stream_update )
{
discrete_info *info = (discrete_info *)param;
- linked_list_entry *entry;
- int outputnum;
+ const linked_list_entry *entry;
+ int outputnum, task_group;
if (samples == 0)
return;
@@ -758,23 +724,26 @@ static STREAM_UPDATE( discrete_stream_update )
context->ptr = (stream_sample_t *) inputs[context->stream_in_number];
}
- /* Queue tasks */
- for (entry = info->task_list; entry != 0; entry = entry->next)
+ for (task_group = 0; task_group < DISCRETE_MAX_TASK_GROUPS; task_group++)
{
- task_info *ti = (task_info *)malloc(sizeof(task_info));
- discrete_task *task = (discrete_task *) entry->ptr;
-
- /* Fire task */
- ti->task = task;
- ti->samples = samples;
- osd_work_item_queue(info->queue, task_callback, (void *) ti, WORK_ITEM_FLAG_AUTO_RELEASE);
- }
+ /* Queue tasks */
+ for (entry = info->task_list; entry != 0; entry = entry->next)
+ {
+ discrete_task *task = (discrete_task *) entry->ptr;
- /* and wait for them */
- osd_work_queue_wait(info->queue, osd_ticks_per_second()*10);
+ if (task->task_group == task_group)
+ {
+ task_info *ti = (task_info *)malloc(sizeof(task_info));
- /* Now we must do samples iterations of the node list, one output for each step */
- update_main_nodes(info, samples);
+ /* Fire task */
+ ti->task = task;
+ ti->samples = samples;
+ osd_work_item_queue(info->queue, task_callback, (void *) ti, WORK_ITEM_FLAG_AUTO_RELEASE);
+ }
+ }
+ /* and wait for them */
+ osd_work_queue_wait(info->queue, osd_ticks_per_second()*10);
+ }
if (DISCRETE_PROFILING)
{
@@ -793,23 +762,38 @@ static STREAM_UPDATE( discrete_stream_update )
*************************************/
-static void init_nodes(discrete_info *info, linked_list_entry *block_list, const device_config *device)
+static void init_nodes(discrete_info *info, const linked_list_entry *block_list, const device_config *device)
{
- linked_list_entry **task_node_list_ptr = NULL;
- linked_list_entry *entry;
+ const linked_list_entry *entry;
linked_list_entry *task_node_list = NULL;
discrete_task *task = NULL;
/* list tail pointers */
- linked_list_entry **main_list_ptr = &info->main_list;
+ linked_list_entry **task_node_list_ptr = NULL;
linked_list_entry **node_list_ptr = &info->node_list;
linked_list_entry **task_list_ptr = &info->task_list;
linked_list_entry **output_list_ptr = &info->output_list;
linked_list_entry **input_list_ptr = &info->input_list;
+ int has_tasks = 0;
+ /* check whether we have tasks ... */
+ for (entry = block_list; entry != NULL; entry = entry->next)
+ {
+ const discrete_sound_block *block = (discrete_sound_block *) entry->ptr;
+ if (block->type == DSO_TASK_START)
+ has_tasks = 1;
+ }
+
+ if (!has_tasks)
+ {
+ /* set up a main task */
+ task_node_list = NULL;
+ task_node_list_ptr = &task_node_list;
+ }
+
/* loop over all nodes */
for (entry = block_list; entry != NULL; entry = entry->next)
{
- discrete_sound_block *block = (discrete_sound_block *) entry->ptr;
+ const discrete_sound_block *block = (discrete_sound_block *) entry->ptr;
node_description *node = auto_alloc_clear(info->device->machine, node_description);
int modulenum;
@@ -864,6 +848,8 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
case DSO_TASK_START:
if (task_node_list_ptr != NULL)
fatalerror("init_nodes() - Nested DISCRETE_START_TASK.");
+ task = auto_alloc_clear(info->device->machine, discrete_task);
+ node->context = task;
task_node_list = NULL;
task_node_list_ptr = &task_node_list;
break;
@@ -871,10 +857,9 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
case DSO_TASK_END:
if (task_node_list_ptr == NULL)
fatalerror("init_nodes() - NO DISCRETE_START_TASK.");
- task = auto_alloc_clear(info->device->machine, discrete_task);
task->numbuffered = 0;
task->list = task_node_list;
- task->task_group = 99; /* will be set later */
+ task->task_group = -1; /* will be set later */
task->source_list = NULL;
linked_list_tail_add(info, &task_list_ptr, task);
node->context = task;
@@ -914,7 +899,7 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
{
/* do we belong to a task? */
if (task_node_list_ptr == NULL)
- linked_list_tail_add(info, &main_list_ptr, node);
+ fatalerror("init_nodes() - found node outside of task.");
else
linked_list_tail_add(info, &task_node_list_ptr, node);
}
@@ -929,6 +914,19 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
state_save_register_device_item_array(device, node->block->node, node->output);
}
+ if (!has_tasks)
+ {
+ /* make sure we have one simple task
+ * No need to create a node since there are no dependencies.
+ */
+ task = auto_alloc_clear(info->device->machine, discrete_task);
+ task->numbuffered = 0;
+ task->list = task_node_list;
+ task->task_group = 0;
+ task->source_list = NULL;
+ linked_list_tail_add(info, &task_list_ptr, task);
+ }
+
/* if no outputs, give an error */
if (linked_list_count(info->output_list) == 0)
fatalerror("init_nodes() - Couldn't find an output node");
@@ -941,10 +939,10 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
*
*************************************/
-static void find_input_nodes(discrete_info *info)
+static void find_input_nodes(const discrete_info *info)
{
+ const linked_list_entry *entry;
int inputnum;
- linked_list_entry *entry;
/* loop over all nodes */
for (entry = info->node_list; entry != NULL; entry = entry->next)
@@ -960,7 +958,7 @@ static void find_input_nodes(discrete_info *info)
/* if this input is node-based, find the node in the indexed list */
if IS_VALUE_A_NODE(inputnode)
{
- node_description *node_ref = info->indexed_node[NODE_INDEX(inputnode)];
+ const node_description *node_ref = info->indexed_node[NODE_INDEX(inputnode)];
if (!node_ref)
fatalerror("discrete_start - NODE_%02d referenced a non existent node NODE_%02d", NODE_BLOCKINDEX(node), NODE_INDEX(inputnode));
@@ -987,7 +985,7 @@ static void find_input_nodes(discrete_info *info)
}
for (inputnum = node->active_inputs; inputnum < DISCRETE_MAX_INPUTS; inputnum++)
{
- //FIXME: Check that no nodes follow !
+ /* FIXME: Check that no nodes follow ! */
node->input[inputnum] = &(block->initial[inputnum]);
}
}
diff --git a/src/emu/sound/discrete.h b/src/emu/sound/discrete.h
index 8f65edbdd8e..763df9e8e18 100644
--- a/src/emu/sound/discrete.h
+++ b/src/emu/sound/discrete.h
@@ -16,6 +16,7 @@
* Coding started in November 2000
*
* Additions/bugfix February 2003 - D.Renaud, F.Palazzolo, K.Wilkins
+ * Discrete parallel tasks 2009 - Couriersud
*
***********************************************************************
*
@@ -3446,6 +3447,7 @@
#define DISCRETE_MAX_INPUTS 10
#define DISCRETE_MAX_OUTPUTS 8
#define DISCRETE_MAX_TASK_OUTPUTS 8
+#define DISCRETE_MAX_TASK_GROUPS 8
/*************************************
@@ -3526,7 +3528,7 @@
/* Mixer types */
#define DISC_MIXER_IS_RESISTOR 0
#define DISC_MIXER_IS_OP_AMP 1
-#define DISC_MIXER_IS_OP_AMP_WITH_RI 2 // Used only internally. Use DISC_MIXER_IS_OP_AMP
+#define DISC_MIXER_IS_OP_AMP_WITH_RI 2 /* Used only internally. Use DISC_MIXER_IS_OP_AMP */
/* Triggered Op Amp Functions */
enum
@@ -3787,13 +3789,6 @@ struct _discrete_info
/* list of all nodes */
linked_list_entry *node_list; /* node_description * */
- /* list of "main" task nodes */
- linked_list_entry *main_list; /* node_description * */
-
- /* list of main source nodes */
-
- linked_list_entry *main_source_list; /* discrete_source_node */
-
/* list of discrete blocks after prescan (IMPORT, DELETE, REPLACE) */
linked_list_entry *block_list; /* discrete_sound_block * */
@@ -4499,7 +4494,7 @@ enum
/* parallel tasks */
-#define DISCRETE_TASK_START() { NODE_SPECIAL, DSO_TASK_START,0, { 0 }, { 0 }, NULL, "DISCRETE_TASK_START" },
+#define DISCRETE_TASK_START(TASK_GROUP) { NODE_SPECIAL, DSO_TASK_START,1, { NODE_NC, NODE_NC }, { TASK_GROUP, 0 }, NULL, "DISCRETE_TASK_START" },
#define DISCRETE_TASK_END() { NODE_SPECIAL, DSO_TASK_END , 1, { 0 }, { 0 }, NULL, "DISCRETE_TASK_END" },
//#define DISCRETE_TASK_SYNC() { NODE_SPECIAL, DSO_TASK_SYNC, 0, { 0 }, { 0 }, NULL, "DISCRETE_TASK_SYNC" },
diff --git a/src/mame/audio/dkong.c b/src/mame/audio/dkong.c
index a08352e8412..e033131c634 100644
--- a/src/mame/audio/dkong.c
+++ b/src/mame/audio/dkong.c
@@ -361,14 +361,11 @@ static DISCRETE_SOUND_START(dkong2b)
DISCRETE_INPUT_NOT(DS_DISCHARGE_INV)
//DISCRETE_INPUT_DATA(DS_DAC)
- /* Mixing - DAC */
- DISCRETE_ADJUSTMENT_TAG(DS_ADJ_DAC, 0, 1, DISC_LINADJ, "VR2")
-
/************************************************/
/* Stomp */
/************************************************/
/* Noise */
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
DISCRETE_LFSR_NOISE(NODE_11, 1, 1, CLOCK_2VF, 1.0, 0, 0.5, &dkong_lfsr)
DISCRETE_COUNTER(NODE_12, 1, 0, NODE_11, 7, DISC_COUNT_UP, 0, DISC_CLK_ON_R_EDGE) /* LS161, IC 3J */
DISCRETE_TRANSFORM3(NODE_13,NODE_12,3,DK_SUP_V,"01>2*")
@@ -391,7 +388,7 @@ static DISCRETE_SOUND_START(dkong2b)
/************************************************/
/* tt */
/* 4049B Inverter Oscillator build from 3 inverters */
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
DISCRETE_INVERTER_OSC(NODE_25,1,0,DK_R38,DK_R39,DK_C26,0,&dkong_inverter_osc_desc_jump)
#if DK_USE_CUSTOM
@@ -423,7 +420,7 @@ static DISCRETE_SOUND_START(dkong2b)
/************************************************/
/* Walk */
/************************************************/
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
DISCRETE_INVERTER_OSC(NODE_51,1,0,DK_R47,DK_R48,DK_C30,0,&dkong_inverter_osc_desc_walk)
#if DK_USE_CUSTOM
@@ -450,7 +447,7 @@ static DISCRETE_SOUND_START(dkong2b)
/* DAC */
/************************************************/
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
/* Buffer DAC first to input stream 0 */
DISCRETE_INPUT_BUFFER(DS_DAC, 0)
//DISCRETE_INPUT_DATA(DS_DAC)
@@ -480,6 +477,10 @@ static DISCRETE_SOUND_START(dkong2b)
/* Amplifier */
/************************************************/
+ DISCRETE_TASK_START(2)
+ /* Mixing - DAC */
+ DISCRETE_ADJUSTMENT_TAG(DS_ADJ_DAC, 0, 1, DISC_LINADJ, "VR2")
+
DISCRETE_MIXER4(NODE_288, 1, DS_OUT_SOUND0, DS_OUT_SOUND1, DS_OUT_DAC, DS_OUT_SOUND2, &dkong_mixer_desc)
/* Amplifier: internal amplifier */
@@ -497,6 +498,7 @@ static DISCRETE_SOUND_START(dkong2b)
//DISCRETE_CSVLOG2(NODE_296, NODE_288)
//DISCRETE_WAVELOG1(NODE_296, 32767.0/5.0 * 3.41)
#endif
+ DISCRETE_TASK_END()
DISCRETE_SOUND_END
@@ -876,7 +878,7 @@ static DISCRETE_SOUND_START(dkongjr)
/* SOUND0 / SOUND7 */
/************************************************/
-DISCRETE_TASK_START()
+DISCRETE_TASK_START(1)
DISCRETE_LOGIC_INVERT(DS_SOUND7,DS_SOUND7_INV)
DISCRETE_COUNTER(NODE_100,1,0,NODE_118,0xFFFF,DISC_COUNT_UP,0,DISC_CLK_BY_COUNT)
@@ -909,7 +911,7 @@ DISCRETE_TASK_END()
/* SOUND1 */
/************************************************/
-DISCRETE_TASK_START()
+DISCRETE_TASK_START(1)
DISCRETE_LS123(NODE_10, DS_SOUND1_INV, JR_R9, JR_C15)
DISCRETE_TRANSFORM2(NODE_11,NODE_104,TTL_HIGH,"0!1*")
DISCRETE_LOGIC_INVERT(NODE_12,NODE_10)
@@ -927,7 +929,7 @@ DISCRETE_TASK_END()
/* SOUND2 */
/************************************************/
-DISCRETE_TASK_START()
+DISCRETE_TASK_START(1)
DISCRETE_74LS624(NODE_20, 0, 0.98*DK_SUP_V, JR_C20, DISC_LS624_OUT_COUNT_F)
DISCRETE_LFSR_NOISE(NODE_21, 1, 1, NODE_20, 1.0, 0, 0.5, &dkongjr_lfsr)
DISCRETE_LS123_INV(NODE_25, DS_SOUND2_INV, JR_R17, JR_C27)
@@ -943,7 +945,7 @@ DISCRETE_TASK_END()
/* SOUND9 */
/************************************************/
-DISCRETE_TASK_START()
+DISCRETE_TASK_START(1)
DISCRETE_LOGIC_INVERT(DS_SOUND9,DS_SOUND9_INV)
DISCRETE_RCFILTER(NODE_90, 1, DS_SOUND9_INV, JR_R14, JR_C26)
DISCRETE_MULTIPLY(NODE_91, NODE_90, TTL_HIGH)
@@ -956,7 +958,7 @@ DISCRETE_TASK_END()
/* DAC */
/************************************************/
-DISCRETE_TASK_START()
+DISCRETE_TASK_START(1)
DISCRETE_INPUT_BUFFER(DS_DAC, 0)
/* Signal decay circuit Q7, R20, C32 */
DISCRETE_RCDISC(NODE_170, DS_DISCHARGE_INV, 1, JR_R20, JR_C32)
@@ -978,6 +980,7 @@ DISCRETE_TASK_END()
/* Amplifier */
/************************************************/
+DISCRETE_TASK_START(2)
DISCRETE_MIXER5(NODE_288, 1, DS_OUT_SOUND9, DS_OUT_SOUND0, DS_OUT_SOUND2, DS_OUT_SOUND1, DS_OUT_DAC, &dkongjr_mixer_desc)
/* Amplifier: internal amplifier
@@ -985,6 +988,7 @@ DISCRETE_TASK_END()
*/
DISCRETE_CRFILTER(NODE_295,1,NODE_288, 1000, JR_C13)
DISCRETE_OUTPUT(NODE_295, 32767.0/5.0 * 10)
+DISCRETE_TASK_END()
DISCRETE_SOUND_END
diff --git a/src/mame/audio/galaxian.c b/src/mame/audio/galaxian.c
index 7c8d231ee2a..0e23f057675 100644
--- a/src/mame/audio/galaxian.c
+++ b/src/mame/audio/galaxian.c
@@ -268,8 +268,22 @@ static DISCRETE_SOUND_START(galaxian)
/* Pitch */
DISCRETE_INPUT_DATA(GAL_INP_PITCH)
+ DISCRETE_TASK_START(0)
+
+ /************************************************/
+ /* NOISE */
+ /************************************************/
+
+ /* since only a sample of the LFSR is latched @V2 we let the lfsr
+ * run at a lower speed
+ */
+ DISCRETE_LFSR_NOISE(NODE_150, 1, 1, RNG_RATE/100, 1.0, 0, 0.5, &galaxian_lfsr)
+ DISCRETE_SQUAREWFIX(NODE_151,1,60*264/2,1.0,50,0.5,0) /* 2V signal */
+ DISCRETE_LOGIC_DFLIPFLOP(NODE_152,1,1,NODE_151,NODE_150)
+ DISCRETE_TASK_END()
+
/* Group Background and pitch */
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
/************************************************/
/* Background */
@@ -310,28 +324,19 @@ static DISCRETE_SOUND_START(galaxian)
/* End of this task */
DISCRETE_TASK_END()
- /* Group Hit and Fire */
-
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
/************************************************/
/* HIT */
/************************************************/
- /* NOISE */
- /* since only a sample of the LFSR is latched @V2 we let the lfsr
- * run at a lower speed
- */
- DISCRETE_LFSR_NOISE(NODE_150, 1, 1, RNG_RATE/100, 1.0, 0, 0.5, &galaxian_lfsr)
- DISCRETE_SQUAREWFIX(NODE_151,1,60*264/2,1.0,50,0.5,0) /* 2V signal */
- DISCRETE_LOGIC_DFLIPFLOP(NODE_152,1,1,NODE_151,NODE_150)
-
-
/* Not 100% correct - switching causes high impedance input for node_157
* this is not emulated */
DISCRETE_RCDISC5(NODE_155, NODE_152, GAL_INP_HIT, (GAL_R35 + GAL_R36), GAL_C21)
DISCRETE_OP_AMP_FILTER(NODE_157, 1, NODE_155, 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &galaxian_bandpass_desc)
+ DISCRETE_TASK_END()
+ DISCRETE_TASK_START(1)
/************************************************/
/* FIRE */
/************************************************/
@@ -361,9 +366,11 @@ static DISCRETE_SOUND_START(galaxian)
/* FINAL MIX */
/************************************************/
- DISCRETE_MIXER5(NODE_279, 1, NODE_SUB(133,0), NODE_SUB(133,2), NODE_SUB(133,2), NODE_SUB(133,3), NODE_120, &galaxian_mixerpre_desc)
- DISCRETE_MIXER3(NODE_280, 1, NODE_279, NODE_157, NODE_182, &galaxian_mixer_desc)
- DISCRETE_OUTPUT(NODE_280, 32767.0/5.0*5)
+ DISCRETE_TASK_START(2)
+ DISCRETE_MIXER5(NODE_279, 1, NODE_SUB(133,0), NODE_SUB(133,2), NODE_SUB(133,2), NODE_SUB(133,3), NODE_120, &galaxian_mixerpre_desc)
+ DISCRETE_MIXER3(NODE_280, 1, NODE_279, NODE_157, NODE_182, &galaxian_mixer_desc)
+ DISCRETE_OUTPUT(NODE_280, 32767.0/5.0*5)
+ DISCRETE_TASK_END()
DISCRETE_SOUND_END
diff --git a/src/mame/audio/mario.c b/src/mame/audio/mario.c
index f859a95e36c..cb85e52c0e6 100644
--- a/src/mame/audio/mario.c
+++ b/src/mame/audio/mario.c
@@ -304,15 +304,14 @@ static DISCRETE_SOUND_START(mario)
/************************************************/
/* DISCRETE_INPUT_DATA */
- DISCRETE_INPUT_PULSE(DS_SOUND0_INV, 1)
- DISCRETE_INPUT_PULSE(DS_SOUND1_INV, 1)
DISCRETE_INPUT_NOT(DS_SOUND7_INV)
/************************************************/
/* SOUND0 */
/************************************************/
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
+ DISCRETE_INPUT_PULSE(DS_SOUND0_INV, 1)
DISCRETE_LS123(NODE_10, DS_SOUND0_INV, MR_R17, MR_C14)
DISCRETE_RCFILTER(NODE_11, 1, NODE_10, MR_R6, MR_C3 )
DISCRETE_CUSTOM7(NODE_12, NODE_10, NODE_11, NODE_11, MR_C6, MR_C17,
@@ -324,7 +323,8 @@ static DISCRETE_SOUND_START(mario)
/* SOUND1 */
/************************************************/
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
+ DISCRETE_INPUT_PULSE(DS_SOUND1_INV, 1)
DISCRETE_LS123(NODE_20, DS_SOUND1_INV, MR_R18, MR_C15)
DISCRETE_RCFILTER(NODE_21, 1, NODE_20, MR_R7, MR_C4 )
DISCRETE_CUSTOM7(NODE_22, NODE_20, NODE_21, NODE_21, MR_C5, MR_C16,
@@ -336,7 +336,7 @@ static DISCRETE_SOUND_START(mario)
/* SOUND7 */
/************************************************/
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
DISCRETE_COUNTER(NODE_100,1,0,NODE_118,0xFFFF,DISC_COUNT_UP,0,DISC_CLK_BY_COUNT)
DISCRETE_BIT_DECODE(NODE_102, NODE_100, 3, 1) //LS157 2B
@@ -365,7 +365,7 @@ static DISCRETE_SOUND_START(mario)
* is a filter circuit. Simulation in LTSPICE shows, that the following is equivalent:
*/
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
DISCRETE_INPUT_BUFFER(DS_DAC, 0)
DISCRETE_MULTIPLY(NODE_170, DS_DAC, TTL_HIGH/256.0)
DISCRETE_RCFILTER(NODE_171, 1, NODE_170, RES_K(750), CAP_P(200))
@@ -379,6 +379,7 @@ static DISCRETE_SOUND_START(mario)
/* MIXER */
/************************************************/
+ DISCRETE_TASK_START(2)
DISCRETE_ADDER4(NODE_295, 1, DS_OUT_SOUND0, DS_OUT_SOUND1, DS_OUT_SOUND7, DS_OUT_DAC)
/* Amplifier: internal amplifier
@@ -390,6 +391,7 @@ static DISCRETE_SOUND_START(mario)
DISCRETE_OUTPUT(NODE_297, 32767.0/5.0 * 10)
//DISCRETE_WAVELOG1(DS_OUT_SOUND0, 32767/5.0)
//DISCRETE_WAVELOG2(NODE_296, 32767/5.0 * 2, DS_SOUND7_INV, 10000)
+ DISCRETE_TASK_END()
DISCRETE_SOUND_END
diff --git a/src/mame/audio/sprint8.c b/src/mame/audio/sprint8.c
index 9b7adaaa117..b4176e0d9ea 100644
--- a/src/mame/audio/sprint8.c
+++ b/src/mame/audio/sprint8.c
@@ -180,6 +180,8 @@ DISCRETE_SOUND_START( sprint8 )
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR6_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR7_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR8_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
+
+ DISCRETE_TASK_START(0)
DISCRETE_ADJUSTMENT_TAG(SPRINT8_R132_POT, 0, SPRINT8_R132, DISC_LINADJ, "R132")
/************************************************
@@ -193,6 +195,9 @@ DISCRETE_SOUND_START( sprint8 )
SPRINT8_ATTRACT_EN, /* RESET */
SPRINT8_2V, 1, 0, 0.5, &sprint8_lfsr) /* CLK,AMPL,FEED,BIAS,LFSRTB */
+ DISCRETE_TASK_END()
+
+ DISCRETE_TASK_START(1)
DISCRETE_GAIN(NODE_70, SPRINT8_NOISE, DEFAULT_TTL_V_LOGIC_1 * RES_VOLTAGE_DIVIDER(SPRINT8_R148, SPRINT8_R147))
DISCRETE_CRFILTER_VREF(NODE_71,
1, /* ENAB */
@@ -229,26 +234,27 @@ DISCRETE_SOUND_START( sprint8 )
/* IC E5, pin 14 gain. Does not simulate minor DC offset caused by R93. */
DISCRETE_TRANSFORM5(NODE_77, NODE_76, 5, SPRINT8_R132_POT, SPRINT8_R101, 1, "01-23/4+*1+")
DISCRETE_CLAMP(SPRINT8_CRASH_SCREECH_SND, NODE_77, 0, 15.0 - 1.5)
+ DISCRETE_TASK_END()
/************************************************
* Car Motor
************************************************/
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
SPRINT8_MOTOR_CIRCUIT(1)
SPRINT8_MOTOR_CIRCUIT(2)
DISCRETE_TASK_END()
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
SPRINT8_MOTOR_CIRCUIT(3)
SPRINT8_MOTOR_CIRCUIT(7)
DISCRETE_TASK_END()
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
SPRINT8_MOTOR_CIRCUIT(5)
SPRINT8_MOTOR_CIRCUIT(6)
DISCRETE_TASK_END()
- DISCRETE_TASK_START()
+ DISCRETE_TASK_START(1)
SPRINT8_MOTOR_CIRCUIT(4)
SPRINT8_MOTOR_CIRCUIT(8)
DISCRETE_TASK_END()
@@ -256,6 +262,7 @@ DISCRETE_SOUND_START( sprint8 )
/************************************************
* Final Mix
************************************************/
+ DISCRETE_TASK_START(2)
DISCRETE_MIXER3(SPRINT8_AUDIO_1_2,
SPRINT8_ATTRACT_EN, /* ENAB */
SPRINT8_CRASH_SCREECH_SND,
@@ -284,6 +291,7 @@ DISCRETE_SOUND_START( sprint8 )
DISCRETE_OUTPUT(SPRINT8_AUDIO_3_7, 65500.0/8)
DISCRETE_OUTPUT(SPRINT8_AUDIO_5_6, 65500.0/8)
DISCRETE_OUTPUT(SPRINT8_AUDIO_4_8, 65500.0/8)
+ DISCRETE_TASK_END()
DISCRETE_SOUND_END