static void cpu_pre_run(void) { int cpunum; logerror("Machine reset\n"); begin_resource_tracking(); /* read hi scores information from hiscore.dat */ hs_open(Machine->gamedrv->name); hs_init(); /* initialize the various timers (suspends all CPUs at startup) */ cpu_inittimers(); watchdog_counter = -1; /* reset sound chips */ sound_reset(); /* first pass over CPUs */ for (cpunum = 0; cpunum < cpu_gettotalcpu(); cpunum++) { /* enable all CPUs (except for audio CPUs if the sound is off) */ if (!(Machine->drv->cpu[cpunum].cpu_flags & CPU_AUDIO_CPU) || Machine->sample_rate != 0) cpunum_resume(cpunum, SUSPEND_ANY_REASON); else cpunum_suspend(cpunum, SUSPEND_REASON_DISABLE, 1); /* reset the interrupt state */ cpuint_reset_cpu(cpunum); /* reset the total number of cycles */ cpu[cpunum].totalcycles = 0; cpu[cpunum].localtime = 0; } vblank = 0; /* do this AFTER the above so machine_init() can use cpu_halt() to hold the */ /* execution of some CPUs, or disable interrupts */ if (Machine->drv->machine_init) (*Machine->drv->machine_init)(); /* now reset each CPU */ for (cpunum = 0; cpunum < cpu_gettotalcpu(); cpunum++) cpunum_reset(cpunum, Machine->drv->cpu[cpunum].reset_param, cpu_irq_callbacks[cpunum]); /* reset the globals */ cpu_vblankreset(); current_frame = 0; state_save_dump_registry(); }
static void reset_callback(int param) { int cpunum = param & 0xff; int state = param >> 8; /* if we're asserting the line, just halt the CPU */ if (state == ASSERT_LINE) { cpunum_suspend(cpunum, SUSPEND_REASON_RESET, 1); return; } /* if we're clearing the line that was previously asserted, or if we're just */ /* pulsing the line, reset the CPU */ if ((state == CLEAR_LINE && (cpu[cpunum].suspend & SUSPEND_REASON_RESET)) || state == PULSE_LINE) cpunum_reset(cpunum, Machine->drv->cpu[cpunum].reset_param, cpu_irq_callbacks[cpunum]); /* if we're clearing the line, make sure the CPU is not halted */ cpunum_resume(cpunum, SUSPEND_REASON_RESET); }
static TIMER_CALLBACK( cpunum_empty_event_queue ) { int cpunum = param & 0xff; int line = param >> 8; int i; /* swap to the CPU's context */ cpuintrf_push_context(cpunum); /* loop over all events */ for (i = 0; i < input_event_index[cpunum][line]; i++) { INT32 input_event = input_event_queue[cpunum][line][i]; int state = input_event & 0xff; int vector = input_event >> 8; LOG(("cpunum_empty_event_queue %d,%d,%d\n",cpunum,line,state)); /* set the input line state and vector */ input_line_state[cpunum][line] = state; input_line_vector[cpunum][line] = vector; /* special case: RESET */ if (line == INPUT_LINE_RESET) { /* if we're asserting the line, just halt the CPU */ if (state == ASSERT_LINE) cpunum_suspend(cpunum, SUSPEND_REASON_RESET, 1); else { /* if we're clearing the line that was previously asserted, or if we're just */ /* pulsing the line, reset the CPU */ if ((state == CLEAR_LINE && cpunum_is_suspended(cpunum, SUSPEND_REASON_RESET)) || state == PULSE_LINE) cpunum_reset(cpunum); /* if we're clearing the line, make sure the CPU is not halted */ cpunum_resume(cpunum, SUSPEND_REASON_RESET); } } /* special case: HALT */ else if (line == INPUT_LINE_HALT) { /* if asserting, halt the CPU */ if (state == ASSERT_LINE) cpunum_suspend(cpunum, SUSPEND_REASON_HALT, 1); /* if clearing, unhalt the CPU */ else if (state == CLEAR_LINE) cpunum_resume(cpunum, SUSPEND_REASON_HALT); } /* all other cases */ else { /* switch off the requested state */ switch (state) { case PULSE_LINE: /* temporary: PULSE_LINE only makes sense for NMI lines on Z80 */ assert(machine->drv->cpu[cpunum].type != CPU_Z80 || line == INPUT_LINE_NMI); activecpu_set_input_line(line, INTERNAL_ASSERT_LINE); activecpu_set_input_line(line, INTERNAL_CLEAR_LINE); break; case HOLD_LINE: case ASSERT_LINE: activecpu_set_input_line(line, INTERNAL_ASSERT_LINE); break; case CLEAR_LINE: activecpu_set_input_line(line, INTERNAL_CLEAR_LINE); break; default: logerror("cpunum_empty_event_queue cpu #%d, line %d, unknown state %d\n", cpunum, line, state); } /* generate a trigger to unsuspend any CPUs waiting on the interrupt */ if (state != CLEAR_LINE) cpu_triggerint(cpunum); } } /* swap back */ cpuintrf_pop_context(); /* reset counter */ input_event_index[cpunum][line] = 0; }