diff options
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 |
commit | de55177d940d8dec493b3889a509c5d6ff1afe44 (patch) | |
tree | e2a8c17bb3a460725ffb182e3b0bf862abeae52d | |
parent | fa947ec474dd89cb3a1010fdc3349c4375f500be (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.c | 82 | ||||
-rw-r--r-- | src/emu/sound/discrete.c | 166 | ||||
-rw-r--r-- | src/emu/sound/discrete.h | 13 | ||||
-rw-r--r-- | src/mame/audio/dkong.c | 28 | ||||
-rw-r--r-- | src/mame/audio/galaxian.c | 39 | ||||
-rw-r--r-- | src/mame/audio/mario.c | 14 | ||||
-rw-r--r-- | src/mame/audio/sprint8.c | 16 |
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 |