Removed globals from cpuexec.

Removed ATTOTIME_TO_CYCLES() and ATTOTIME_IN_CYCLES(). Replaced them
with functions in cpuexec: cpu_clocks_to_attotime() and
cpu_attotime_to_clocks(), both of which take CPU devices instead of
indexes. Updated all callers, many of which were using the functions
dubiously.
This commit is contained in:
Aaron Giles 2008-11-25 06:23:14 +00:00
parent dd87df6926
commit ca3478a1fc
48 changed files with 175 additions and 163 deletions

View File

@ -607,7 +607,7 @@ static void adjust_timer_interrupt(void)
{ {
UINT64 clocks_until_int = hyperstone.tr_clocks_per_tick - (clocks_since_base % hyperstone.tr_clocks_per_tick); UINT64 clocks_until_int = hyperstone.tr_clocks_per_tick - (clocks_since_base % hyperstone.tr_clocks_per_tick);
UINT64 cycles_until_int = (clocks_until_int << hyperstone.clock_scale) + cycles_until_next_clock; UINT64 cycles_until_int = (clocks_until_int << hyperstone.clock_scale) + cycles_until_next_clock;
timer_adjust_oneshot(hyperstone.timer, ATTOTIME_IN_CYCLES(cycles_until_int + 1, cpunum), cpunum * 2 + 1); timer_adjust_oneshot(hyperstone.timer, cpu_clocks_to_attotime(Machine->activecpu, cycles_until_int + 1), cpunum * 2 + 1);
} }
/* else if the timer interrupt is enabled, configure it to fire at the appropriate time */ /* else if the timer interrupt is enabled, configure it to fire at the appropriate time */
@ -624,7 +624,7 @@ static void adjust_timer_interrupt(void)
{ {
UINT64 clocks_until_int = mulu_32x32(delta, hyperstone.tr_clocks_per_tick); UINT64 clocks_until_int = mulu_32x32(delta, hyperstone.tr_clocks_per_tick);
UINT64 cycles_until_int = (clocks_until_int << hyperstone.clock_scale) + cycles_until_next_clock; UINT64 cycles_until_int = (clocks_until_int << hyperstone.clock_scale) + cycles_until_next_clock;
timer_adjust_oneshot(hyperstone.timer, ATTOTIME_IN_CYCLES(cycles_until_int, cpunum), cpunum * 2 + 0); timer_adjust_oneshot(hyperstone.timer, cpu_clocks_to_attotime(Machine->activecpu, cycles_until_int), cpunum * 2 + 0);
} }
} }

View File

@ -194,7 +194,7 @@ void mips3com_update_cycle_counting(mips3_state *mips)
UINT32 count = (cpu_get_total_cycles(mips->device) - mips->count_zero_time) / 2; UINT32 count = (cpu_get_total_cycles(mips->device) - mips->count_zero_time) / 2;
UINT32 compare = mips->cpr[0][COP0_Compare]; UINT32 compare = mips->cpr[0][COP0_Compare];
UINT32 delta = compare - count; UINT32 delta = compare - count;
attotime newtime = ATTOTIME_IN_CYCLES(((UINT64)delta * 2), cpu_get_index(mips->device)); attotime newtime = cpu_clocks_to_attotime(mips->device, (UINT64)delta * 2);
timer_adjust_oneshot(mips->compare_int_timer, newtime, 0); timer_adjust_oneshot(mips->compare_int_timer, newtime, 0);
return; return;
} }

View File

@ -168,7 +168,7 @@ INLINE void set_decrementer(powerpc_state *ppc, UINT32 newdec)
} }
ppc->dec_zero_cycles = cpu_get_total_cycles(Machine->cpu[ppc->cpunum]) + cycles_until_done; ppc->dec_zero_cycles = cpu_get_total_cycles(Machine->cpu[ppc->cpunum]) + cycles_until_done;
timer_adjust_oneshot(ppc->decrementer_int_timer, ATTOTIME_IN_CYCLES(cycles_until_done, ppc->cpunum), 0); timer_adjust_oneshot(ppc->decrementer_int_timer, cpu_clocks_to_attotime(ppc->device, cycles_until_done), 0);
if ((INT32)curdec >= 0 && (INT32)newdec < 0) if ((INT32)curdec >= 0 && (INT32)newdec < 0)
ppc->irq_pending |= 0x02; ppc->irq_pending |= 0x02;
@ -1256,7 +1256,7 @@ static TIMER_CALLBACK( decrementer_int_callback )
/* advance by another full rev */ /* advance by another full rev */
ppc->dec_zero_cycles += (UINT64)ppc->tb_divisor << 32; ppc->dec_zero_cycles += (UINT64)ppc->tb_divisor << 32;
cycles_until_next = ppc->dec_zero_cycles - cpu_get_total_cycles(machine->cpu[ppc->cpunum]); cycles_until_next = ppc->dec_zero_cycles - cpu_get_total_cycles(machine->cpu[ppc->cpunum]);
timer_adjust_oneshot(ppc->decrementer_int_timer, ATTOTIME_IN_CYCLES(cycles_until_next, ppc->cpunum), 0); timer_adjust_oneshot(ppc->decrementer_int_timer, cpu_clocks_to_attotime(ppc->device, cycles_until_next), 0);
} }
@ -1526,7 +1526,7 @@ static TIMER_CALLBACK( ppc4xx_fit_callback )
UINT32 timebase = get_timebase(ppc); UINT32 timebase = get_timebase(ppc);
UINT32 interval = 0x200 << (4 * ((ppc->spr[SPR4XX_TCR] & PPC4XX_TCR_FP_MASK) >> 24)); UINT32 interval = 0x200 << (4 * ((ppc->spr[SPR4XX_TCR] & PPC4XX_TCR_FP_MASK) >> 24));
UINT32 target = (timebase + interval) & ~(interval - 1); UINT32 target = (timebase + interval) & ~(interval - 1);
timer_adjust_oneshot(ppc->fit_timer, ATTOTIME_IN_CYCLES((target + 1 - timebase) / ppc->tb_divisor, ppc->cpunum), TRUE); timer_adjust_oneshot(ppc->fit_timer, cpu_clocks_to_attotime(ppc->device, (target + 1 - timebase) / ppc->tb_divisor), TRUE);
} }
/* otherwise, turn ourself off */ /* otherwise, turn ourself off */
@ -1557,7 +1557,7 @@ static TIMER_CALLBACK( ppc4xx_pit_callback )
UINT32 timebase = get_timebase(ppc); UINT32 timebase = get_timebase(ppc);
UINT32 interval = ppc->pit_reload; UINT32 interval = ppc->pit_reload;
UINT32 target = timebase + interval; UINT32 target = timebase + interval;
timer_adjust_oneshot(ppc->pit_timer, ATTOTIME_IN_CYCLES((target + 1 - timebase) / ppc->tb_divisor, ppc->cpunum), TRUE); timer_adjust_oneshot(ppc->pit_timer, cpu_clocks_to_attotime(ppc->device, (target + 1 - timebase) / ppc->tb_divisor), TRUE);
} }
/* otherwise, turn ourself off */ /* otherwise, turn ourself off */

View File

@ -98,7 +98,7 @@ static void sh2_timer_activate(void)
if(divider) { if(divider) {
max_delta <<= divider; max_delta <<= divider;
sh2->frc_base = cpu_get_total_cycles(sh2->device); sh2->frc_base = cpu_get_total_cycles(sh2->device);
timer_adjust_oneshot(sh2->timer, ATTOTIME_IN_CYCLES(max_delta, cpu_get_index(sh2->device)), 0); timer_adjust_oneshot(sh2->timer, cpu_clocks_to_attotime(sh2->device, max_delta), 0);
} else { } else {
logerror("SH2.%d: Timer event in %d cycles of external clock", cpu_get_index(sh2->device), max_delta); logerror("SH2.%d: Timer event in %d cycles of external clock", cpu_get_index(sh2->device), max_delta);
} }
@ -176,7 +176,7 @@ static void sh2_dmac_check(int dma)
LOG(("SH2: DMA %d start %x, %x, %x, %04x, %d, %d, %d\n", dma, src, dst, count, sh2->m[0x63+4*dma], incs, incd, size)); LOG(("SH2: DMA %d start %x, %x, %x, %04x, %d, %d, %d\n", dma, src, dst, count, sh2->m[0x63+4*dma], incs, incd, size));
sh2->dma_timer_active[dma] = 1; sh2->dma_timer_active[dma] = 1;
timer_adjust_oneshot(sh2->dma_timer[dma], ATTOTIME_IN_CYCLES(2*count+1, cpu_get_index(sh2->device)), dma); timer_adjust_oneshot(sh2->dma_timer[dma], cpu_clocks_to_attotime(sh2->device, 2*count+1), dma);
src &= AM; src &= AM;
dst &= AM; dst &= AM;

View File

@ -462,7 +462,7 @@ static int sh4_dma_transfer(int channel, int timermode, UINT32 chcr, UINT32 *sar
if (timermode == 1) if (timermode == 1)
{ {
sh4.dma_timer_active[channel] = 1; sh4.dma_timer_active[channel] = 1;
timer_adjust_oneshot(sh4.dma_timer[channel], ATTOTIME_IN_CYCLES(2*count+1, sh4.cpu_number), (sh4.cpu_number << 8) | channel); timer_adjust_oneshot(sh4.dma_timer[channel], cpu_clocks_to_attotime(sh4.device, 2*count+1), (sh4.cpu_number << 8) | channel);
} }
else if (timermode == 2) else if (timermode == 2)
{ {

View File

@ -86,6 +86,7 @@ Other references can be found on spies.com:
*/ */
#include "debugger.h" #include "debugger.h"
#include "cpuexec.h"
#include "deprecat.h" #include "deprecat.h"
#include "tms9900.h" #include "tms9900.h"
@ -933,7 +934,7 @@ WRITE8_HANDLER(tms9995_internal2_w)
/* read decrementer */ /* read decrementer */
if (I.decrementer_enabled && !(I.flag & 1)) if (I.decrementer_enabled && !(I.flag & 1))
/* timer mode, timer enabled */ /* timer mode, timer enabled */
return ceil(ATTOTIME_TO_CYCLES(cpunum_get_active(), attotime_div(timer_timeleft(I.timer), 16))); return ceil(cpu_attotime_to_clocks(I.device, attotime_div(timer_timeleft(I.timer), 16)));
else else
/* event counter mode or timer mode, timer disabled */ /* event counter mode or timer mode, timer disabled */
return I.decrementer_count; return I.decrementer_count;
@ -997,7 +998,7 @@ WRITE8_HANDLER(tms9995_internal2_w)
if (I.decrementer_enabled && !(I.flag & 1)) if (I.decrementer_enabled && !(I.flag & 1))
/* timer mode, timer enabled */ /* timer mode, timer enabled */
value = ceil(ATTOTIME_TO_CYCLES(cpunum_get_active(), attotime_div(timer_timeleft(I.timer), 16))); value = ceil(cpu_attotime_to_clocks(I.device, attotime_div(timer_timeleft(I.timer), 16)));
else else
/* event counter mode or timer mode, timer disabled */ /* event counter mode or timer mode, timer disabled */
value = I.decrementer_count; value = I.decrementer_count;
@ -1830,7 +1831,7 @@ static void reset_decrementer(void)
if (I.decrementer_enabled && ! (I.flag & 1)) if (I.decrementer_enabled && ! (I.flag & 1))
{ /* timer */ { /* timer */
attotime period = ATTOTIME_IN_CYCLES(I.decrementer_interval * 16L, cpunum_get_active()); attotime period = cpu_clocks_to_attotime(I.device, I.decrementer_interval * 16L);
timer_adjust_periodic(I.timer, period, 0, period); timer_adjust_periodic(I.timer, period, 0, period);
} }
} }

View File

@ -64,8 +64,11 @@ struct _cpu_class_data
/* this item must remain first */ /* this item must remain first */
cpu_class_header header; /* header containing public data */ cpu_class_header header; /* header containing public data */
/* core interface */ /* cycle counting and executing */
UINT8 executing; /* TRUE if the values below are valid */
int * icount; /* pointer to the icount */ int * icount; /* pointer to the icount */
int cycles_running; /* number of cycles we are executing */
int cycles_stolen; /* number of cycles we artificially stole */
/* input states and IRQ callbacks */ /* input states and IRQ callbacks */
cpu_irq_callback driver_irq; /* driver-specific IRQ callback */ cpu_irq_callback driver_irq; /* driver-specific IRQ callback */
@ -87,6 +90,8 @@ struct _cpu_class_data
INT32 divisor; /* 32-bit attoseconds_per_cycle divisor */ INT32 divisor; /* 32-bit attoseconds_per_cycle divisor */
UINT8 divshift; /* right shift amount to fit the divisor into 32 bits */ UINT8 divshift; /* right shift amount to fit the divisor into 32 bits */
emu_timer * timedint_timer; /* reference to this CPU's periodic interrupt timer */ emu_timer * timedint_timer; /* reference to this CPU's periodic interrupt timer */
UINT32 cycles_per_second; /* cycles per second, adjusted for multipliers */
attoseconds_t attoseconds_per_cycle; /* attoseconds per adjusted clock cycle */
/* these below are hacks to support multiple interrupts per frame */ /* these below are hacks to support multiple interrupts per frame */
INT32 iloops; /* number of interrupts remaining this frame */ INT32 iloops; /* number of interrupts remaining this frame */
@ -96,17 +101,6 @@ struct _cpu_class_data
/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
/* general CPU variables */
static int cycles_running;
static int cycles_stolen;
static const device_config *executingcpu;
/*************************************************************************** /***************************************************************************
FUNCTION PROTOTYPES FUNCTION PROTOTYPES
***************************************************************************/ ***************************************************************************/
@ -375,39 +369,39 @@ void cpuexec_timeslice(running_machine *machine)
if (classdata->suspend == 0) if (classdata->suspend == 0)
{ {
attotime delta = attotime_sub(target, classdata->localtime); attotime delta = attotime_sub(target, classdata->localtime);
if (delta.seconds >= 0 && delta.attoseconds >= attoseconds_per_cycle[cpunum]) if (delta.seconds >= 0 && delta.attoseconds >= classdata->attoseconds_per_cycle)
{ {
/* compute how long to run */ /* compute how long to run */
cycles_running = div_64x32(delta.attoseconds >> classdata->divshift, classdata->divisor); classdata->cycles_running = div_64x32(delta.attoseconds >> classdata->divshift, classdata->divisor);
LOG((" cpu %d: %d cycles\n", cpunum, cycles_running)); LOG((" cpu %d: %d cycles\n", cpunum, classdata->cycles_running));
profiler_mark(PROFILER_CPU1 + cpunum); profiler_mark(PROFILER_CPU1 + cpunum);
/* note that this global variable cycles_stolen can be modified */ /* note that this global variable cycles_stolen can be modified */
/* via the call to the cpunum_execute */ /* via the call to the cpunum_execute */
cycles_stolen = 0; classdata->cycles_stolen = 0;
executingcpu = machine->cpu[cpunum]; classdata->executing = TRUE;
if (!call_debugger) if (!call_debugger)
ran = cpu_execute(machine->cpu[cpunum], cycles_running); ran = cpu_execute(machine->cpu[cpunum], classdata->cycles_running);
else else
{ {
debugger_start_cpu_hook(machine->cpu[cpunum], target); debugger_start_cpu_hook(machine->cpu[cpunum], target);
ran = cpu_execute(machine->cpu[cpunum], cycles_running); ran = cpu_execute(machine->cpu[cpunum], classdata->cycles_running);
debugger_stop_cpu_hook(machine->cpu[cpunum]); debugger_stop_cpu_hook(machine->cpu[cpunum]);
} }
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (ran < cycles_stolen) if (ran < classdata->cycles_stolen)
fatalerror("Negative CPU cycle count!"); fatalerror("Negative CPU cycle count!");
#endif /* MAME_DEBUG */ #endif /* MAME_DEBUG */
executingcpu = NULL; classdata->executing = FALSE;
ran -= cycles_stolen; ran -= classdata->cycles_stolen;
profiler_mark(PROFILER_END); profiler_mark(PROFILER_END);
/* account for these cycles */ /* account for these cycles */
classdata->totalcycles += ran; classdata->totalcycles += ran;
classdata->localtime = attotime_add_attoseconds(classdata->localtime, ran * attoseconds_per_cycle[cpunum]); classdata->localtime = attotime_add_attoseconds(classdata->localtime, ran * classdata->attoseconds_per_cycle);
LOG((" %d ran, %d total, time = %s\n", ran, (INT32)classdata->totalcycles, attotime_string(classdata->localtime, 9))); LOG((" %d ran, %d total, time = %s\n", ran, (INT32)classdata->totalcycles, attotime_string(classdata->localtime, 9)));
/* if the new local CPU time is less than our target, move the target up */ /* if the new local CPU time is less than our target, move the target up */
@ -431,12 +425,12 @@ void cpuexec_timeslice(running_machine *machine)
attotime delta = attotime_sub(target, classdata->localtime); attotime delta = attotime_sub(target, classdata->localtime);
/* compute how long to run */ /* compute how long to run */
cycles_running = div_64x32(delta.attoseconds >> classdata->divshift, classdata->divisor); classdata->cycles_running = div_64x32(delta.attoseconds >> classdata->divshift, classdata->divisor);
LOG((" cpu %d: %d cycles (suspended)\n", cpunum, cycles_running)); LOG((" cpu %d: %d cycles (suspended)\n", cpunum, classdata->cycles_running));
classdata->totalcycles += cycles_running; classdata->totalcycles += classdata->cycles_running;
classdata->localtime = attotime_add_attoseconds(classdata->localtime, cycles_running * attoseconds_per_cycle[cpunum]); classdata->localtime = attotime_add_attoseconds(classdata->localtime, classdata->cycles_running * classdata->attoseconds_per_cycle);
LOG((" %d skipped, %d total, time = %s\n", cycles_running, (INT32)classdata->totalcycles, attotime_string(classdata->localtime, 9))); LOG((" %d skipped, %d total, time = %s\n", classdata->cycles_running, (INT32)classdata->totalcycles, attotime_string(classdata->localtime, 9)));
} }
/* update the suspend state (breaks steeltal if we don't) */ /* update the suspend state (breaks steeltal if we don't) */
@ -499,7 +493,7 @@ void cpu_suspend(const device_config *device, int reason, int eatcycles)
classdata->nexteatcycles = eatcycles; classdata->nexteatcycles = eatcycles;
/* if we're active, synchronize */ /* if we're active, synchronize */
if (device == executingcpu) if (classdata->executing)
cpu_abort_timeslice(device); cpu_abort_timeslice(device);
} }
@ -517,7 +511,7 @@ void cpu_resume(const device_config *device, int reason)
classdata->nextsuspend &= ~reason; classdata->nextsuspend &= ~reason;
/* if we're active, synchronize */ /* if we're active, synchronize */
if (device == executingcpu) if (classdata->executing)
cpu_abort_timeslice(device); cpu_abort_timeslice(device);
} }
@ -600,6 +594,33 @@ void cpu_set_clockscale(const device_config *device, double clockscale)
} }
/*-------------------------------------------------
cpu_clocks_to_attotime - converts a number of
clock ticks to an attotime
-------------------------------------------------*/
attotime cpu_clocks_to_attotime(const device_config *device, UINT32 clocks)
{
cpu_class_data *classdata = get_safe_classtoken(device);
if (clocks < classdata->cycles_per_second)
return attotime_make(0, clocks * classdata->attoseconds_per_cycle);
else
return attotime_make(clocks / classdata->cycles_per_second, (clocks % classdata->cycles_per_second) * classdata->attoseconds_per_cycle);
}
/*-------------------------------------------------
cpu_attotime_to_clocks - converts a duration
as attotime to CPU clock ticks
-------------------------------------------------*/
UINT32 cpu_attotime_to_clocks(const device_config *device, attotime duration)
{
cpu_class_data *classdata = get_safe_classtoken(device);
return duration.seconds * classdata->cycles_per_second + duration.attoseconds / classdata->attoseconds_per_cycle;
}
/*************************************************************************** /***************************************************************************
CPU TIMING CPU TIMING
@ -617,10 +638,10 @@ attotime cpu_get_local_time(const device_config *device)
/* if we're active, add in the time from the current slice */ /* if we're active, add in the time from the current slice */
result = classdata->localtime; result = classdata->localtime;
if (device == executingcpu) if (classdata->executing)
{ {
int cycles = cycles_running - *classdata->icount; int cycles = classdata->cycles_running - *classdata->icount;
result = attotime_add(result, ATTOTIME_IN_CYCLES(cycles, classdata->header.index)); result = attotime_add(result, cpu_clocks_to_attotime(device, cycles));
} }
return result; return result;
} }
@ -636,8 +657,8 @@ UINT64 cpu_get_total_cycles(const device_config *device)
{ {
cpu_class_data *classdata = get_safe_classtoken(device); cpu_class_data *classdata = get_safe_classtoken(device);
if (device == executingcpu) if (classdata->executing)
return classdata->totalcycles + cycles_running - *classdata->icount; return classdata->totalcycles + classdata->cycles_running - *classdata->icount;
else else
return classdata->totalcycles; return classdata->totalcycles;
} }
@ -653,7 +674,7 @@ void cpu_eat_cycles(const device_config *device, int cycles)
cpu_class_data *classdata = get_safe_classtoken(device); cpu_class_data *classdata = get_safe_classtoken(device);
/* ignore if not the executing CPU */ /* ignore if not the executing CPU */
if (device != executingcpu) if (!classdata->executing)
return; return;
if (cycles > *classdata->icount) if (cycles > *classdata->icount)
@ -672,7 +693,7 @@ void cpu_adjust_icount(const device_config *device, int delta)
cpu_class_data *classdata = get_safe_classtoken(device); cpu_class_data *classdata = get_safe_classtoken(device);
/* ignore if not the executing CPU */ /* ignore if not the executing CPU */
if (device != executingcpu) if (!classdata->executing)
return; return;
*classdata->icount += delta; *classdata->icount += delta;
@ -691,15 +712,15 @@ void cpu_abort_timeslice(const device_config *device)
int delta; int delta;
/* ignore if not the executing CPU */ /* ignore if not the executing CPU */
if (device != executingcpu) if (!classdata->executing)
return; return;
/* swallow the remaining cycles */ /* swallow the remaining cycles */
if (classdata->icount != NULL) if (classdata->icount != NULL)
{ {
delta = *classdata->icount + 1; delta = *classdata->icount + 1;
cycles_stolen += delta; classdata->cycles_stolen += delta;
cycles_running -= delta; classdata->cycles_running -= delta;
*classdata->icount -= delta; *classdata->icount -= delta;
} }
} }
@ -791,14 +812,14 @@ void cpuexec_trigger(running_machine *machine, int trigger)
{ {
int cpunum; int cpunum;
/* cause an immediate resynchronization */
if (executingcpu != NULL)
cpu_abort_timeslice(executingcpu);
/* look for suspended CPUs waiting for this trigger and unsuspend them */ /* look for suspended CPUs waiting for this trigger and unsuspend them */
for (cpunum = 0; cpunum < ARRAY_LENGTH(machine->cpu) && machine->cpu[cpunum] != NULL; cpunum++) for (cpunum = 0; cpunum < ARRAY_LENGTH(machine->cpu) && machine->cpu[cpunum] != NULL; cpunum++)
{ {
cpu_class_data *classdata = machine->cpu[cpunum]->classtoken; cpu_class_data *classdata = machine->cpu[cpunum]->classtoken;
/* if we're executing, for an immediate abort */
if (classdata->executing)
cpu_abort_timeslice(machine->cpu[cpunum]);
/* see if this is a matching trigger */ /* see if this is a matching trigger */
if (classdata->suspend != 0 && classdata->trigger == trigger) if (classdata->suspend != 0 && classdata->trigger == trigger)
@ -1067,11 +1088,11 @@ static void update_clock_information(const device_config *device)
INT64 attos; INT64 attos;
/* recompute cps and spc */ /* recompute cps and spc */
cycles_per_second[classdata->header.index] = (double)classdata->clock * classdata->clockscale; classdata->cycles_per_second = (double)classdata->clock * classdata->clockscale;
attoseconds_per_cycle[classdata->header.index] = ATTOSECONDS_PER_SECOND / ((double)classdata->clock * classdata->clockscale); classdata->attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / ((double)classdata->clock * classdata->clockscale);
/* update the CPU's divisor */ /* update the CPU's divisor */
attos = attoseconds_per_cycle[classdata->header.index]; attos = classdata->attoseconds_per_cycle;
classdata->divshift = 0; classdata->divshift = 0;
while (attos >= (1UL << 31)) while (attos >= (1UL << 31))
{ {
@ -1092,17 +1113,19 @@ static void update_clock_information(const device_config *device)
static void compute_perfect_interleave(running_machine *machine) static void compute_perfect_interleave(running_machine *machine)
{ {
if (attoseconds_per_cycle[0] != 0) if (machine->cpu[0] != NULL && machine->cpu[0]->classtoken != NULL)
{ {
attoseconds_t smallest = attoseconds_per_cycle[0] * cputype_get_min_cycles(machine->config->cpu[0].type); cpu_class_data *classdata = machine->cpu[0]->classtoken;
attoseconds_t smallest = classdata->attoseconds_per_cycle * cputype_get_min_cycles(machine->config->cpu[0].type);
attoseconds_t perfect = ATTOSECONDS_PER_SECOND - 1; attoseconds_t perfect = ATTOSECONDS_PER_SECOND - 1;
int cpunum; int cpunum;
/* start with a huge time factor and find the 2nd smallest cycle time */ /* start with a huge time factor and find the 2nd smallest cycle time */
for (cpunum = 1; cpunum < ARRAY_LENGTH(machine->cpu) && machine->cpu[cpunum] != NULL; cpunum++) for (cpunum = 1; cpunum < ARRAY_LENGTH(machine->cpu) && machine->cpu[cpunum] != NULL; cpunum++)
if (attoseconds_per_cycle[cpunum] != 0) if (machine->cpu[cpunum] != NULL && machine->cpu[cpunum]->classtoken != NULL)
{ {
attoseconds_t curtime = attoseconds_per_cycle[cpunum] * cputype_get_min_cycles(machine->config->cpu[cpunum].type); cpu_class_data *classdata = machine->cpu[cpunum]->classtoken;
attoseconds_t curtime = classdata->attoseconds_per_cycle * cputype_get_min_cycles(machine->config->cpu[cpunum].type);
/* find the 2nd smallest cycle interval */ /* find the 2nd smallest cycle interval */
if (curtime < smallest) if (curtime < smallest)
@ -1111,7 +1134,7 @@ static void compute_perfect_interleave(running_machine *machine)
smallest = curtime; smallest = curtime;
} }
else if (curtime < perfect) else if (curtime < perfect)
perfect = attoseconds_per_cycle[cpunum]; perfect = classdata->attoseconds_per_cycle;
} }
/* adjust the final value */ /* adjust the final value */

View File

@ -127,6 +127,12 @@ double cpu_get_clockscale(const device_config *device);
/* sets the current scaling factor for a CPU's clock speed */ /* sets the current scaling factor for a CPU's clock speed */
void cpu_set_clockscale(const device_config *device, double clockscale); void cpu_set_clockscale(const device_config *device, double clockscale);
/* converts a number of clock ticks to an attotime */
attotime cpu_clocks_to_attotime(const device_config *device, UINT32 clocks);
/* converts a duration as attotime to CPU clock ticks */
UINT32 cpu_attotime_to_clocks(const device_config *device, attotime duration);
/* ----- CPU timing ----- */ /* ----- CPU timing ----- */

View File

@ -98,10 +98,6 @@ struct _quantum_slot
GLOBAL VARIABLES GLOBAL VARIABLES
***************************************************************************/ ***************************************************************************/
/* conversion constants */
attoseconds_t attoseconds_per_cycle[MAX_CPU];
UINT32 cycles_per_second[MAX_CPU];
/* list of active timers */ /* list of active timers */
static emu_timer timers[MAX_TIMERS]; static emu_timer timers[MAX_TIMERS];
static emu_timer *timer_head; static emu_timer *timer_head;

View File

@ -38,10 +38,6 @@ enum
MACROS MACROS
***************************************************************************/ ***************************************************************************/
/* convert cycles on a given CPU to/from attotime */
#define ATTOTIME_TO_CYCLES(cpu,t) ((t).seconds * cycles_per_second[cpu] + (t).attoseconds / attoseconds_per_cycle[cpu])
#define ATTOTIME_IN_CYCLES(c,cpu) (attotime_make((c) / cycles_per_second[cpu], (c) * attoseconds_per_cycle[cpu]))
/* macro for the RC time constant on a 74LS123 with C > 1000pF */ /* macro for the RC time constant on a 74LS123 with C > 1000pF */
/* R is in ohms, C is in farads */ /* R is in ohms, C is in farads */
#define TIME_OF_74LS123(r,c) (0.45 * (double)(r) * (double)(c)) #define TIME_OF_74LS123(r,c) (0.45 * (double)(r) * (double)(c))
@ -146,16 +142,6 @@ typedef struct _emu_timer emu_timer;
/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
/* arrays containing mappings between CPU cycle times and timer values */
extern attoseconds_t attoseconds_per_cycle[];
extern UINT32 cycles_per_second[];
/*************************************************************************** /***************************************************************************
FUNCTION PROTOTYPES FUNCTION PROTOTYPES
***************************************************************************/ ***************************************************************************/

View File

@ -1731,7 +1731,7 @@ static TIMER_CALLBACK( internal_timer_callback )
/* set the next timer, but only if it's for a reasonable number */ /* set the next timer, but only if it's for a reasonable number */
if (!dcs.timer_ignore && (dcs.timer_period > 10 || dcs.timer_scale > 1)) if (!dcs.timer_ignore && (dcs.timer_period > 10 || dcs.timer_scale > 1))
timer_adjust_oneshot(dcs.internal_timer, ATTOTIME_IN_CYCLES(target_cycles, cpu_get_index(dcs.cpu)), 0); timer_adjust_oneshot(dcs.internal_timer, cpu_clocks_to_attotime(dcs.cpu, target_cycles), 0);
cpu_set_input_line(dcs.cpu, ADSP2105_TIMER, PULSE_LINE); cpu_set_input_line(dcs.cpu, ADSP2105_TIMER, PULSE_LINE);
} }
@ -1766,7 +1766,7 @@ static void reset_timer(running_machine *machine)
/* adjust the timer if not optimized */ /* adjust the timer if not optimized */
if (!dcs.timer_ignore) if (!dcs.timer_ignore)
timer_adjust_oneshot(dcs.internal_timer, ATTOTIME_IN_CYCLES(dcs.timer_scale * (dcs.timer_start_count + 1), cpu_get_index(dcs.cpu)), 0); timer_adjust_oneshot(dcs.internal_timer, cpu_clocks_to_attotime(dcs.cpu, dcs.timer_scale * (dcs.timer_start_count + 1)), 0);
} }
@ -1776,7 +1776,7 @@ static void timer_enable_callback(int enable)
dcs.timer_ignore = 0; dcs.timer_ignore = 0;
if (enable) if (enable)
{ {
// mame_printf_debug("Timer enabled @ %d cycles/int, or %f Hz\n", dcs.timer_scale * (dcs.timer_period + 1), 1.0 / ATTOTIME_IN_CYCLES(dcs.timer_scale * (dcs.timer_period + 1), cpu_get_index(dcs.cpu))); // mame_printf_debug("Timer enabled @ %d cycles/int, or %f Hz\n", dcs.timer_scale * (dcs.timer_period + 1), 1.0 / cpu_clocks_to_attotime(dcs.cpu, dcs.timer_scale * (dcs.timer_period + 1)));
reset_timer(Machine); reset_timer(Machine);
} }
else else

View File

@ -120,7 +120,7 @@ WRITE16_HANDLER(f3_68681_w)
case 3: case 3:
logerror("Counter: X1/Clk - divided by 16, counter is %04x, so interrupt every %d cycles\n",counter,(M68000_CLOCK/M68681_CLOCK)*counter*16); logerror("Counter: X1/Clk - divided by 16, counter is %04x, so interrupt every %d cycles\n",counter,(M68000_CLOCK/M68681_CLOCK)*counter*16);
timer_mode=TIMER_SINGLESHOT; timer_mode=TIMER_SINGLESHOT;
timer_adjust_oneshot(timer_68681, ATTOTIME_IN_CYCLES((M68000_CLOCK/M68681_CLOCK)*counter*16,1), 0); timer_adjust_oneshot(timer_68681, cpu_clocks_to_attotime(space->cpu, (M68000_CLOCK/M68681_CLOCK)*counter*16), 0);
break; break;
case 4: case 4:
logerror("Timer: Unimplemented external IP2\n"); logerror("Timer: Unimplemented external IP2\n");
@ -131,7 +131,7 @@ WRITE16_HANDLER(f3_68681_w)
case 6: case 6:
logerror("Timer: X1/Clk, counter is %04x, so interrupt every %d cycles\n",counter,(M68000_CLOCK/M68681_CLOCK)*counter); logerror("Timer: X1/Clk, counter is %04x, so interrupt every %d cycles\n",counter,(M68000_CLOCK/M68681_CLOCK)*counter);
timer_mode=TIMER_PULSE; timer_mode=TIMER_PULSE;
timer_adjust_periodic(timer_68681, ATTOTIME_IN_CYCLES((M68000_CLOCK/M68681_CLOCK)*counter,1), 0, ATTOTIME_IN_CYCLES((M68000_CLOCK/M68681_CLOCK)*counter,1)); timer_adjust_periodic(timer_68681, cpu_clocks_to_attotime(space->cpu, (M68000_CLOCK/M68681_CLOCK)*counter), 0, cpu_clocks_to_attotime(space->cpu, (M68000_CLOCK/M68681_CLOCK)*counter));
break; break;
case 7: case 7:
logerror("Timer: Unimplemented X1/Clk - divided by 16\n"); logerror("Timer: Unimplemented X1/Clk - divided by 16\n");

View File

@ -246,7 +246,7 @@ static TIMER_CALLBACK( cadash_interrupt5 )
static INTERRUPT_GEN( cadash_interrupt ) static INTERRUPT_GEN( cadash_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(500,0), NULL, 0, cadash_interrupt5); timer_set(cpu_clocks_to_attotime(device,500), NULL, 0, cadash_interrupt5);
cpu_set_input_line(device, 4, HOLD_LINE); /* interrupt vector 4 */ cpu_set_input_line(device, 4, HOLD_LINE); /* interrupt vector 4 */
} }

View File

@ -1365,7 +1365,7 @@ static WRITE8_HANDLER( meter_w )
{ {
int i; int i;
int changed = meter_latch ^ data; int changed = meter_latch ^ data;
long cycles = ATTOTIME_TO_CYCLES(0, timer_get_time() ); UINT64 cycles = cpu_get_total_cycles(space->cpu);
meter_latch = data; meter_latch = data;
@ -1378,7 +1378,7 @@ static WRITE8_HANDLER( meter_w )
if (changed & (1 << i)) if (changed & (1 << i))
{ {
Mechmtr_update(i, cycles, data & (1 << i) ); Mechmtr_update(i, cycles, data & (1 << i) );
cpu_set_input_line(space->machine->cpu[1], M6809_FIRQ_LINE, PULSE_LINE ); cpu_set_input_line(space->cpu, M6809_FIRQ_LINE, PULSE_LINE );
} }
} }
} }

View File

@ -605,7 +605,7 @@ static WRITE8_HANDLER( mmtr_w )
{ {
int i; int i;
int changed = mmtr_latch ^ data; int changed = mmtr_latch ^ data;
long cycles = ATTOTIME_TO_CYCLES(0, timer_get_time() ); UINT64 cycles = cpu_get_total_cycles(space->cpu);
mmtr_latch = data; mmtr_latch = data;

View File

@ -91,11 +91,11 @@ static TIMER_CALLBACK( reset_analog_bit )
} }
static attotime compute_duration(int analog_pos) static attotime compute_duration(const device_config *device, int analog_pos)
{ {
/* the 58 comes from the length of the loop used to /* the 58 comes from the length of the loop used to
read the analog position */ read the analog position */
return ATTOTIME_IN_CYCLES(58 * analog_pos, 0); return cpu_clocks_to_attotime(device, 58 * analog_pos);
} }
@ -107,8 +107,8 @@ static WRITE8_HANDLER( analog_reset_w )
analog_port_val = 0xff; analog_port_val = 0xff;
timer_adjust_oneshot(analog_timer_1, compute_duration(input_port_read(space->machine, "AN1")), 0x02); timer_adjust_oneshot(analog_timer_1, compute_duration(space->cpu, input_port_read(space->machine, "AN1")), 0x02);
timer_adjust_oneshot(analog_timer_2, compute_duration(input_port_read(space->machine, "AN2")), 0x01); timer_adjust_oneshot(analog_timer_2, compute_duration(space->cpu, input_port_read(space->machine, "AN2")), 0x01);
} }

View File

@ -248,7 +248,7 @@ static READ8_HANDLER ( combasc_YM2203_status_port_0_r )
if (boost) if (boost)
{ {
boost = 0; boost = 0;
timer_adjust_periodic(combasc_interleave_timer, attotime_zero, 0, ATTOTIME_IN_CYCLES(80,1)); timer_adjust_periodic(combasc_interleave_timer, attotime_zero, 0, cpu_clocks_to_attotime(space->cpu,80));
} }
else if (status & 2) else if (status & 2)
{ {

View File

@ -169,7 +169,7 @@ static READ32_HANDLER( galastrm_adstick_ctrl_r )
static WRITE32_HANDLER( galastrm_adstick_ctrl_w ) static WRITE32_HANDLER( galastrm_adstick_ctrl_w )
{ {
timer_set(ATTOTIME_IN_CYCLES(1000,0), NULL, 0, galastrm_interrupt6); timer_set(cpu_clocks_to_attotime(space->cpu,1000), NULL, 0, galastrm_interrupt6);
} }
/*********************************************************** /***********************************************************

View File

@ -64,8 +64,8 @@ static INTERRUPT_GEN( gcpinbal_interrupt )
{ {
/* Unsure of actual sequence */ /* Unsure of actual sequence */
timer_set(ATTOTIME_IN_CYCLES(500,0), NULL, 0, gcpinbal_interrupt1); timer_set(cpu_clocks_to_attotime(device,500), NULL, 0, gcpinbal_interrupt1);
// timer_set(ATTOTIME_IN_CYCLES(1000,0), NULL, 0, gcpinbal_interrupt3); // timer_set(cpu_clocks_to_attotime(device,1000), NULL, 0, gcpinbal_interrupt3);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }

View File

@ -211,7 +211,7 @@ static WRITE32_HANDLER( groundfx_adc_w )
{ {
/* One interrupt per input port (4 per frame, though only 2 used). /* One interrupt per input port (4 per frame, though only 2 used).
1000 cycle delay is arbitrary */ 1000 cycle delay is arbitrary */
timer_set(ATTOTIME_IN_CYCLES(1000,0), NULL, 0, groundfx_interrupt5); timer_set(cpu_clocks_to_attotime(space->cpu,1000), NULL, 0, groundfx_interrupt5);
} }
static WRITE32_HANDLER( rotate_control_w ) /* only a guess that it's rotation */ static WRITE32_HANDLER( rotate_control_w ) /* only a guess that it's rotation */

View File

@ -69,7 +69,7 @@ static TIMER_CALLBACK( gunbustr_interrupt5 )
static INTERRUPT_GEN( gunbustr_interrupt ) static INTERRUPT_GEN( gunbustr_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(200000-500,0), NULL, 0, gunbustr_interrupt5); timer_set(cpu_clocks_to_attotime(device,200000-500), NULL, 0, gunbustr_interrupt5);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }
@ -166,7 +166,7 @@ static READ32_HANDLER( gunbustr_gun_r )
static WRITE32_HANDLER( gunbustr_gun_w ) static WRITE32_HANDLER( gunbustr_gun_w )
{ {
/* 10000 cycle delay is arbitrary */ /* 10000 cycle delay is arbitrary */
timer_set(ATTOTIME_IN_CYCLES(10000,0), NULL, 0, gunbustr_interrupt5); timer_set(cpu_clocks_to_attotime(space->cpu,10000), NULL, 0, gunbustr_interrupt5);
} }

View File

@ -1008,7 +1008,7 @@ static WRITE8_HANDLER( blitter_w )
else else
{ {
blitter_busy = 1; blitter_busy = 1;
timer_adjust_oneshot(blitter_reset_timer, ATTOTIME_IN_CYCLES(100, 0), 0); // free blitter if no updates in 100 cycles timer_adjust_oneshot(blitter_reset_timer, cpu_clocks_to_attotime(space->cpu, 100), 0); // free blitter if no updates in 100 cycles
} }
} }
} }

View File

@ -558,7 +558,7 @@ static READ16_HANDLER( jpmio_r )
static WRITE16_HANDLER( jpmio_w ) static WRITE16_HANDLER( jpmio_w )
{ {
long cycles = ATTOTIME_TO_CYCLES(0, timer_get_time() ); UINT64 cycles = cpu_get_total_cycles(space->cpu);
switch (offset) switch (offset)
{ {
case 0x02: case 0x02:

View File

@ -509,7 +509,7 @@ static TIMER_CALLBACK( atapi_xfer_end )
atapi_regs[ATAPI_REG_COUNTLOW] = atapi_xferlen & 0xff; atapi_regs[ATAPI_REG_COUNTLOW] = atapi_xferlen & 0xff;
atapi_regs[ATAPI_REG_COUNTHIGH] = (atapi_xferlen>>8)&0xff; atapi_regs[ATAPI_REG_COUNTHIGH] = (atapi_xferlen>>8)&0xff;
timer_adjust_oneshot(atapi_timer, ATTOTIME_IN_CYCLES((ATAPI_CYCLES_PER_SECTOR * (atapi_xferlen/2048)), 0), 0); timer_adjust_oneshot(atapi_timer, cpu_clocks_to_attotime(machine->cpu[0], (ATAPI_CYCLES_PER_SECTOR * (atapi_xferlen/2048))), 0);
} }
else else
{ {
@ -735,7 +735,7 @@ static WRITE32_HANDLER( atapi_w )
case 0x45: // PLAY case 0x45: // PLAY
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_BSY; atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_BSY;
timer_adjust_oneshot( atapi_timer, ATTOTIME_IN_CYCLES( ATAPI_CYCLES_PER_SECTOR, 0 ), 0 ); timer_adjust_oneshot( atapi_timer, cpu_clocks_to_attotime( space->cpu, ATAPI_CYCLES_PER_SECTOR ), 0 );
break; break;
} }
@ -974,7 +974,7 @@ static void cdrom_dma_write( UINT32 n_address, INT32 n_size )
verboselog( 2, "atapi_xfer_end: %d %d\n", atapi_xferlen, atapi_xfermod ); verboselog( 2, "atapi_xfer_end: %d %d\n", atapi_xferlen, atapi_xfermod );
// set a transfer complete timer (Note: CYCLES_PER_SECTOR can't be lower than 2000 or the BIOS ends up "out of order") // set a transfer complete timer (Note: CYCLES_PER_SECTOR can't be lower than 2000 or the BIOS ends up "out of order")
timer_adjust_oneshot(atapi_timer, ATTOTIME_IN_CYCLES((ATAPI_CYCLES_PER_SECTOR * (atapi_xferlen/2048)), 0), 0); timer_adjust_oneshot(atapi_timer, cpu_clocks_to_attotime(Machine->cpu[0], (ATAPI_CYCLES_PER_SECTOR * (atapi_xferlen/2048))), 0);
} }
static UINT32 m_n_security_control; static UINT32 m_n_security_control;

View File

@ -222,8 +222,8 @@ static WRITE16_HANDLER( m72_main_mcu_w)
protection_ram[offset] = val; protection_ram[offset] = val;
cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE); cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE);
/* Line driven, most likely by write line */ /* Line driven, most likely by write line */
//timer_set(ATTOTIME_IN_CYCLES(2, mame_find_cpu_index(space->machine, "mcu")), NULL, 0, mcu_irq0_clear); //timer_set(cpu_clocks_to_attotime(cputag_get_cpu(space->machine, "mcu"), 2), NULL, 0, mcu_irq0_clear);
//timer_set(ATTOTIME_IN_CYCLES(0, mame_find_cpu_index(space->machine, "mcu")), NULL, 0, mcu_irq0_raise); //timer_set(cpu_clocks_to_attotime(cputag_get_cpu(space->machine, "mcu"), 0), NULL, 0, mcu_irq0_raise);
} }
else else
timer_call_after_resynch( protection_ram, (offset<<16) | val, delayed_ram16_w); timer_call_after_resynch( protection_ram, (offset<<16) | val, delayed_ram16_w);

View File

@ -2102,7 +2102,7 @@ static void megadrive_io_write_data_port_6button(int portnum, UINT16 data)
if (((megadrive_io_data_regs[portnum]&0x40)==0x00) && ((data&0x40) == 0x40)) if (((megadrive_io_data_regs[portnum]&0x40)==0x00) && ((data&0x40) == 0x40))
{ {
io_stage[portnum]++; io_stage[portnum]++;
timer_adjust_oneshot(io_timeout[portnum], ATTOTIME_IN_CYCLES(8192,0), 0); timer_adjust_oneshot(io_timeout[portnum], cpu_clocks_to_attotime(Machine->cpu[0],8192), 0);
} }
} }
@ -4051,7 +4051,7 @@ VIDEO_UPDATE(megadriv)
/* reference */ /* reference */
// time_elapsed_since_crap = timer_timeelapsed(frame_timer); // time_elapsed_since_crap = timer_timeelapsed(frame_timer);
// xxx = ATTOTIME_TO_CYCLES(0,time_elapsed_since_crap); // xxx = cpu_attotime_to_clocks(screen->machine->cpu[0],time_elapsed_since_crap);
// mame_printf_debug("update cycles %d, %08x %08x\n",xxx, (UINT32)(time_elapsed_since_crap.attoseconds>>32),(UINT32)(time_elapsed_since_crap.attoseconds&0xffffffff)); // mame_printf_debug("update cycles %d, %08x %08x\n",xxx, (UINT32)(time_elapsed_since_crap.attoseconds>>32),(UINT32)(time_elapsed_since_crap.attoseconds&0xffffffff));
return 0; return 0;
@ -6226,7 +6226,7 @@ int megadrive_z80irq_hpos = 320;
frametime = ATTOSECONDS_PER_SECOND/megadriv_framerate; frametime = ATTOSECONDS_PER_SECOND/megadriv_framerate;
time_elapsed_since_crap = timer_timeelapsed(frame_timer); time_elapsed_since_crap = timer_timeelapsed(frame_timer);
xxx = ATTOTIME_TO_CYCLES(0,time_elapsed_since_crap); xxx = cpu_attotime_to_clocks(machine->cpu[0],time_elapsed_since_crap);
//mame_printf_debug("---------- cycles %d, %08x %08x\n",xxx, (UINT32)(time_elapsed_since_crap.attoseconds>>32),(UINT32)(time_elapsed_since_crap.attoseconds&0xffffffff)); //mame_printf_debug("---------- cycles %d, %08x %08x\n",xxx, (UINT32)(time_elapsed_since_crap.attoseconds>>32),(UINT32)(time_elapsed_since_crap.attoseconds&0xffffffff));
//mame_printf_debug("---------- framet %d, %08x %08x\n",xxx, (UINT32)(frametime>>32),(UINT32)(frametime&0xffffffff)); //mame_printf_debug("---------- framet %d, %08x %08x\n",xxx, (UINT32)(frametime>>32),(UINT32)(frametime&0xffffffff));
timer_adjust_oneshot(frame_timer, attotime_zero, 0); timer_adjust_oneshot(frame_timer, attotime_zero, 0);

View File

@ -887,7 +887,7 @@ static WRITE8_HANDLER( pia_ic7_porta_w )
static WRITE8_HANDLER( pia_ic7_portb_w ) static WRITE8_HANDLER( pia_ic7_portb_w )
{ {
int meter; int meter;
long cycles = ATTOTIME_TO_CYCLES(0, timer_get_time() ); UINT64 cycles = cpu_get_total_cycles(space->cpu);
/* The meters are connected to a voltage drop sensor, where current /* The meters are connected to a voltage drop sensor, where current
flowing through them also passes through pin B7, meaning that when flowing through them also passes through pin B7, meaning that when
@ -928,7 +928,7 @@ static WRITE8_HANDLER( pia_ic7_cb2_w )
{ {
/* The eighth meter is connected here, because the voltage sensor /* The eighth meter is connected here, because the voltage sensor
is on PB7. */ is on PB7. */
long cycles = ATTOTIME_TO_CYCLES(0, timer_get_time() ); UINT64 cycles = cpu_get_total_cycles(space->cpu);
if (data) if (data)
{ {
pia_set_input_b(4,mmtr_data|0x80); pia_set_input_b(4,mmtr_data|0x80);

View File

@ -181,7 +181,7 @@ static TIMER_CALLBACK( clear_irq_cb )
static INTERRUPT_GEN( assert_irq ) static INTERRUPT_GEN( assert_irq )
{ {
cpu_set_input_line(device, 0, ASSERT_LINE); cpu_set_input_line(device, 0, ASSERT_LINE);
timer_set(ATTOTIME_IN_CYCLES(14288, 0), NULL, 0, clear_irq_cb); timer_set(cpu_clocks_to_attotime(device, 14288), NULL, 0, clear_irq_cb);
/* Timing here is an educated GUESS, Z80 /INT must stay high so the irq /* Timing here is an educated GUESS, Z80 /INT must stay high so the irq
fires no less than TWICE per frame, else game doesn't work right. fires no less than TWICE per frame, else game doesn't work right.
6000000 / 56.747 = 105732.4616 cycles per frame, we'll call it A 6000000 / 56.747 = 105732.4616 cycles per frame, we'll call it A

View File

@ -893,7 +893,7 @@ static WRITE16_HANDLER( nbmcu_shared_w )
// C74 BIOS has a very short window on the CPU sync signal, so immediately let the '020 at it // C74 BIOS has a very short window on the CPU sync signal, so immediately let the '020 at it
if ((offset == 0x6000/2) && (data & 0x80)) if ((offset == 0x6000/2) && (data & 0x80))
{ {
cpu_spinuntil_time(space->cpu, ATTOTIME_IN_CYCLES(300, 1)); // was 300 cpu_spinuntil_time(space->cpu, cpu_clocks_to_attotime(space->cpu, 300)); // was 300
} }
} }

View File

@ -324,7 +324,7 @@ static WRITE32_HANDLER( arm7_latch_arm_w )
cpuexec_trigger(space->machine, 1002); cpuexec_trigger(space->machine, 1002);
#else #else
cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(100)); cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(100));
cpu_spinuntil_time(space->cpu, ATTOTIME_IN_CYCLES(100, 0)); cpu_spinuntil_time(space->cpu, cpu_clocks_to_attotime(space->cpu, 100));
#endif #endif
} }
@ -358,7 +358,7 @@ static WRITE16_HANDLER( arm7_latch_68k_w )
#else #else
cpu_set_input_line(space->machine->cpu[2], ARM7_FIRQ_LINE, PULSE_LINE); cpu_set_input_line(space->machine->cpu[2], ARM7_FIRQ_LINE, PULSE_LINE);
cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(200)); cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(200));
cpu_spinuntil_time(space->cpu, ATTOTIME_IN_CYCLES(200, 2)); // give the arm time to respond (just boosting the interleave doesn't help cpu_spinuntil_time(space->cpu, cpu_clocks_to_attotime(space->machine->cpu[2], 200)); // give the arm time to respond (just boosting the interleave doesn't help
#endif #endif
} }
@ -740,13 +740,13 @@ static WRITE32_HANDLER( kovsh_arm7_protlatch_w )
} }
// cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(100)); // cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(100));
// cpu_spinuntil_time(space->cpu, ATTOTIME_IN_CYCLES(100, 0)); // cpu_spinuntil_time(space->cpu, cpu_clocks_to_attotime(space->machine->cpu[0], 100));
} }
static READ16_HANDLER( kovsh_68k_protlatch_r ) static READ16_HANDLER( kovsh_68k_protlatch_r )
{ {
//cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(200)); //cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(200));
cpu_spinuntil_time(space->cpu, ATTOTIME_IN_CYCLES(600, 0)); cpu_spinuntil_time(space->cpu, cpu_clocks_to_attotime(space->machine->cpu[0], 600));
switch (offset) switch (offset)
{ {

View File

@ -187,7 +187,7 @@ static TIMER_CALLBACK( slapshot_interrupt6 )
static INTERRUPT_GEN( slapshot_interrupt ) static INTERRUPT_GEN( slapshot_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(200000-500,0), NULL, 0, slapshot_interrupt6); timer_set(cpu_clocks_to_attotime(device,200000-500), NULL, 0, slapshot_interrupt6);
cpu_set_input_line(device,5,HOLD_LINE); cpu_set_input_line(device,5,HOLD_LINE);
} }

View File

@ -459,7 +459,7 @@ static MACHINE_RESET(skns)
{ {
timer_pulse(ATTOTIME_IN_MSEC(2), NULL, 15, interrupt_callback); timer_pulse(ATTOTIME_IN_MSEC(2), NULL, 15, interrupt_callback);
timer_pulse(ATTOTIME_IN_MSEC(8), NULL, 11, interrupt_callback); timer_pulse(ATTOTIME_IN_MSEC(8), NULL, 11, interrupt_callback);
timer_pulse(ATTOTIME_IN_CYCLES(1824, 0), NULL, 9, interrupt_callback); timer_pulse(cpu_clocks_to_attotime(machine->cpu[0], 1824), NULL, 9, interrupt_callback);
memory_set_bankptr(machine, 1,memory_region(machine, "user1")); memory_set_bankptr(machine, 1,memory_region(machine, "user1"));
} }

View File

@ -192,7 +192,7 @@ static TIMER_CALLBACK( rsaga2_interrupt2 )
static INTERRUPT_GEN( rastansaga2_interrupt ) static INTERRUPT_GEN( rastansaga2_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, rsaga2_interrupt2); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, rsaga2_interrupt2);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }
@ -204,7 +204,7 @@ static TIMER_CALLBACK( crimec_interrupt3 )
static INTERRUPT_GEN( crimec_interrupt ) static INTERRUPT_GEN( crimec_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, crimec_interrupt3); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, crimec_interrupt3);
cpu_set_input_line(device, 5, HOLD_LINE); cpu_set_input_line(device, 5, HOLD_LINE);
} }
@ -216,7 +216,7 @@ static TIMER_CALLBACK( hitice_interrupt6 )
static INTERRUPT_GEN( hitice_interrupt ) static INTERRUPT_GEN( hitice_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, hitice_interrupt6); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, hitice_interrupt6);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }
@ -228,7 +228,7 @@ static TIMER_CALLBACK( rambo3_interrupt1 )
static INTERRUPT_GEN( rambo3_interrupt ) static INTERRUPT_GEN( rambo3_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, rambo3_interrupt1); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, rambo3_interrupt1);
cpu_set_input_line(device, 6, HOLD_LINE); cpu_set_input_line(device, 6, HOLD_LINE);
} }
@ -240,7 +240,7 @@ static TIMER_CALLBACK( pbobble_interrupt5 )
static INTERRUPT_GEN( pbobble_interrupt ) static INTERRUPT_GEN( pbobble_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, pbobble_interrupt5); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, pbobble_interrupt5);
cpu_set_input_line(device, 3, HOLD_LINE); cpu_set_input_line(device, 3, HOLD_LINE);
} }
@ -251,7 +251,7 @@ static TIMER_CALLBACK( viofight_interrupt1 )
static INTERRUPT_GEN( viofight_interrupt ) static INTERRUPT_GEN( viofight_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, viofight_interrupt1); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, viofight_interrupt1);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }
@ -262,7 +262,7 @@ static TIMER_CALLBACK( masterw_interrupt4 )
static INTERRUPT_GEN( masterw_interrupt ) static INTERRUPT_GEN( masterw_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, masterw_interrupt4); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, masterw_interrupt4);
cpu_set_input_line(device, 5, HOLD_LINE); cpu_set_input_line(device, 5, HOLD_LINE);
} }
@ -273,7 +273,7 @@ static TIMER_CALLBACK( silentd_interrupt4 )
static INTERRUPT_GEN( silentd_interrupt ) static INTERRUPT_GEN( silentd_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, silentd_interrupt4); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, silentd_interrupt4);
cpu_set_input_line(device, 6, HOLD_LINE); cpu_set_input_line(device, 6, HOLD_LINE);
} }
@ -284,7 +284,7 @@ static TIMER_CALLBACK( selfeena_interrupt4 )
static INTERRUPT_GEN( selfeena_interrupt ) static INTERRUPT_GEN( selfeena_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(5000,0), NULL, 0, selfeena_interrupt4); timer_set(cpu_clocks_to_attotime(device,5000), NULL, 0, selfeena_interrupt4);
cpu_set_input_line(device, 6, HOLD_LINE); cpu_set_input_line(device, 6, HOLD_LINE);
} }
@ -295,7 +295,7 @@ static TIMER_CALLBACK( sbm_interrupt5 )//4
static INTERRUPT_GEN( sbm_interrupt )//5 static INTERRUPT_GEN( sbm_interrupt )//5
{ {
timer_set(ATTOTIME_IN_CYCLES(10000,0), NULL, 0, sbm_interrupt5); timer_set(cpu_clocks_to_attotime(device,10000), NULL, 0, sbm_interrupt5);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }

View File

@ -793,7 +793,7 @@ static TIMER_CALLBACK( taitof2_interrupt6 )
static INTERRUPT_GEN( taitof2_interrupt ) static INTERRUPT_GEN( taitof2_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(500,0), NULL, 0, taitof2_interrupt6); timer_set(cpu_clocks_to_attotime(device,500), NULL, 0, taitof2_interrupt6);
cpu_set_input_line(device, 5, HOLD_LINE); cpu_set_input_line(device, 5, HOLD_LINE);
} }

View File

@ -358,7 +358,7 @@ static TIMER_CALLBACK( f3_interrupt3 )
static INTERRUPT_GEN( f3_interrupt2 ) static INTERRUPT_GEN( f3_interrupt2 )
{ {
cpu_set_input_line(device, 2, HOLD_LINE); // vblank cpu_set_input_line(device, 2, HOLD_LINE); // vblank
timer_set( ATTOTIME_IN_CYCLES(10000,0), NULL, 0, f3_interrupt3); timer_set( cpu_clocks_to_attotime(device,10000), NULL, 0, f3_interrupt3);
} }
static MACHINE_RESET( f3 ) static MACHINE_RESET( f3 )

View File

@ -1000,7 +1000,7 @@ static INTERRUPT_GEN( sci_interrupt )
sci_int6 = !sci_int6; sci_int6 = !sci_int6;
if (sci_int6) if (sci_int6)
timer_set(ATTOTIME_IN_CYCLES(200000-500,0), NULL, 0, taitoz_interrupt6); timer_set(cpu_clocks_to_attotime(device,200000-500), NULL, 0, taitoz_interrupt6);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }
@ -1015,7 +1015,7 @@ static INTERRUPT_GEN( dblaxle_interrupt )
dblaxle_int6 = !dblaxle_int6; dblaxle_int6 = !dblaxle_int6;
if (dblaxle_int6) if (dblaxle_int6)
timer_set(ATTOTIME_IN_CYCLES(200000-500,0), NULL, 0, taitoz_interrupt6); timer_set(cpu_clocks_to_attotime(device,200000-500), NULL, 0, taitoz_interrupt6);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }
@ -1023,7 +1023,7 @@ static INTERRUPT_GEN( dblaxle_interrupt )
static INTERRUPT_GEN( dblaxle_cpub_interrupt ) static INTERRUPT_GEN( dblaxle_cpub_interrupt )
{ {
// Unsure how many int6's per frame // Unsure how many int6's per frame
timer_set(ATTOTIME_IN_CYCLES(200000-500,0), NULL, 0, taitoz_interrupt6); timer_set(cpu_clocks_to_attotime(device,200000-500), NULL, 0, taitoz_interrupt6);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }
@ -1254,7 +1254,7 @@ static WRITE16_HANDLER( bshark_stick_w )
but we don't want CPUA to have an int6 before int4 is over (?) but we don't want CPUA to have an int6 before int4 is over (?)
*/ */
timer_set(ATTOTIME_IN_CYCLES(10000,0), NULL, 0, taitoz_interrupt6); timer_set(cpu_clocks_to_attotime(space->cpu,10000), NULL, 0, taitoz_interrupt6);
} }
@ -1337,7 +1337,7 @@ static WRITE16_HANDLER( spacegun_lightgun_w )
Four lightgun interrupts happen before the collected coords Four lightgun interrupts happen before the collected coords
are moved to shared ram where CPUA can use them. */ are moved to shared ram where CPUA can use them. */
timer_set(ATTOTIME_IN_CYCLES(10000,0), NULL, 0, taitoz_sg_cpub_interrupt5); timer_set(cpu_clocks_to_attotime(space->cpu,10000), NULL, 0, taitoz_sg_cpub_interrupt5);
} }

View File

@ -309,7 +309,7 @@ static WRITE8_HANDLER( thunderx_1f98_w )
calculate_collisions(); calculate_collisions();
/* 100 cycle delay is arbitrary */ /* 100 cycle delay is arbitrary */
timer_set(ATTOTIME_IN_CYCLES(100,0), NULL, 0, thunderx_firq_callback); timer_set(cpu_clocks_to_attotime(space->cpu,100), NULL, 0, thunderx_firq_callback);
} }
thunderx_1f98_data = data; thunderx_1f98_data = data;

View File

@ -310,14 +310,14 @@ static TIMER_CALLBACK( topspeed_cpub_interrupt6 )
static INTERRUPT_GEN( topspeed_interrupt ) static INTERRUPT_GEN( topspeed_interrupt )
{ {
/* Unsure how many int6's per frame */ /* Unsure how many int6's per frame */
timer_set(ATTOTIME_IN_CYCLES(200000-500,0), NULL, 0, topspeed_interrupt6); timer_set(cpu_clocks_to_attotime(device,200000-500), NULL, 0, topspeed_interrupt6);
cpu_set_input_line(device, 5, HOLD_LINE); cpu_set_input_line(device, 5, HOLD_LINE);
} }
static INTERRUPT_GEN( topspeed_cpub_interrupt ) static INTERRUPT_GEN( topspeed_cpub_interrupt )
{ {
/* Unsure how many int6's per frame */ /* Unsure how many int6's per frame */
timer_set(ATTOTIME_IN_CYCLES(200000-500,0), NULL, 0, topspeed_cpub_interrupt6); timer_set(cpu_clocks_to_attotime(device,200000-500), NULL, 0, topspeed_cpub_interrupt6);
cpu_set_input_line(device, 5, HOLD_LINE); cpu_set_input_line(device, 5, HOLD_LINE);
} }

View File

@ -392,7 +392,7 @@ static READ32_HANDLER( unknown_hardware_r )
static WRITE32_HANDLER( unknown_int_req_w ) static WRITE32_HANDLER( unknown_int_req_w )
{ {
/* 10000 cycle delay is arbitrary */ /* 10000 cycle delay is arbitrary */
timer_set(ATTOTIME_IN_CYCLES(10000,0), NULL, 0, interrupt5); timer_set(cpu_clocks_to_attotime(space->cpu,10000), NULL, 0, interrupt5);
} }
@ -482,7 +482,7 @@ static WRITE32_HANDLER( cbombers_adc_w )
{ {
/* One interrupt per input port (4 per frame, though only 2 used). /* One interrupt per input port (4 per frame, though only 2 used).
1000 cycle delay is arbitrary */ 1000 cycle delay is arbitrary */
timer_set(ATTOTIME_IN_CYCLES(1000, 0), NULL, 0, interrupt5); timer_set(cpu_clocks_to_attotime(space->cpu, 1000), NULL, 0, interrupt5);
} }
/*********************************************************** /***********************************************************

View File

@ -488,7 +488,7 @@ static TIMER_CALLBACK( wgp_cpub_interrupt6 )
static INTERRUPT_GEN( wgp_cpub_interrupt ) static INTERRUPT_GEN( wgp_cpub_interrupt )
{ {
timer_set(ATTOTIME_IN_CYCLES(200000-500,0), NULL, 0, wgp_cpub_interrupt6); timer_set(cpu_clocks_to_attotime(device,200000-500), NULL, 0, wgp_cpub_interrupt6);
cpu_set_input_line(device, 4, HOLD_LINE); cpu_set_input_line(device, 4, HOLD_LINE);
} }
@ -611,7 +611,7 @@ static WRITE16_HANDLER( wgp_adinput_w )
hardware has got the next a/d conversion ready. We set a token hardware has got the next a/d conversion ready. We set a token
delay of 10000 cycles although our inputs are always ready. */ delay of 10000 cycles although our inputs are always ready. */
timer_set(ATTOTIME_IN_CYCLES(10000,0), NULL, 0, wgp_interrupt6); timer_set(cpu_clocks_to_attotime(space->cpu,10000), NULL, 0, wgp_interrupt6);
} }

View File

@ -293,7 +293,7 @@ static WRITE32_HANDLER( znsecsel_w )
psx_sio_install_handler( 0, sio_dip_handler ); psx_sio_install_handler( 0, sio_dip_handler );
psx_sio_input( space->machine, 0, PSX_SIO_IN_DSR, 0 ); psx_sio_input( space->machine, 0, PSX_SIO_IN_DSR, 0 );
timer_adjust_oneshot( dip_timer, ATTOTIME_IN_CYCLES( 100, 0 ), 1 ); timer_adjust_oneshot( dip_timer, cpu_clocks_to_attotime( space->cpu, 100 ), 1 );
} }
verboselog( 2, "znsecsel_w( %08x, %08x, %08x )\n", offset, data, mem_mask ); verboselog( 2, "znsecsel_w( %08x, %08x, %08x )\n", offset, data, mem_mask );
@ -305,7 +305,7 @@ static TIMER_CALLBACK( dip_timer_fired )
if( param ) if( param )
{ {
timer_adjust_oneshot( dip_timer, ATTOTIME_IN_CYCLES( 50, 0 ), 0 ); timer_adjust_oneshot( dip_timer, cpu_clocks_to_attotime( machine->cpu[0], 50 ), 0 );
} }
} }

View File

@ -1033,7 +1033,7 @@ static void blitter_setup(void)
CUSTOM_REG(REG_DMACON) |= 0x4000; CUSTOM_REG(REG_DMACON) |= 0x4000;
/* set a timer */ /* set a timer */
timer_adjust_oneshot( amiga_blitter_timer, ATTOTIME_IN_CYCLES( blittime, 0 ), 0); timer_adjust_oneshot( amiga_blitter_timer, cpu_clocks_to_attotime( Machine->activecpu, blittime ), 0);
} }
@ -1399,7 +1399,7 @@ WRITE16_HANDLER( amiga_custom_w )
/* if 'blitter-nasty' has been turned on and we have a blit pending, reschedule it */ /* if 'blitter-nasty' has been turned on and we have a blit pending, reschedule it */
if ( ( data & 0x400 ) && ( CUSTOM_REG(REG_DMACON) & 0x4000 ) ) if ( ( data & 0x400 ) && ( CUSTOM_REG(REG_DMACON) & 0x4000 ) )
timer_adjust_oneshot( amiga_blitter_timer, ATTOTIME_IN_CYCLES( BLITTER_NASTY_DELAY, 0 ), 0); timer_adjust_oneshot( amiga_blitter_timer, cpu_clocks_to_attotime( Machine->activecpu, BLITTER_NASTY_DELAY ), 0);
break; break;
@ -1410,7 +1410,7 @@ WRITE16_HANDLER( amiga_custom_w )
CUSTOM_REG(offset) = data; CUSTOM_REG(offset) = data;
if ( temp & 0x8000 ) /* if we're enabling irq's, delay a bit */ if ( temp & 0x8000 ) /* if we're enabling irq's, delay a bit */
timer_adjust_oneshot( amiga_irq_timer, ATTOTIME_IN_CYCLES( AMIGA_IRQ_DELAY_CYCLES, 0 ), 0); timer_adjust_oneshot( amiga_irq_timer, cpu_clocks_to_attotime( Machine->activecpu, AMIGA_IRQ_DELAY_CYCLES ), 0);
else /* if we're disabling irq's, process right away */ else /* if we're disabling irq's, process right away */
update_irqs(space->machine); update_irqs(space->machine);
break; break;
@ -1427,7 +1427,7 @@ WRITE16_HANDLER( amiga_custom_w )
CUSTOM_REG(offset) = data; CUSTOM_REG(offset) = data;
if ( temp & 0x8000 ) /* if we're generating irq's, delay a bit */ if ( temp & 0x8000 ) /* if we're generating irq's, delay a bit */
timer_adjust_oneshot( amiga_irq_timer, ATTOTIME_IN_CYCLES( AMIGA_IRQ_DELAY_CYCLES, 0 ), 0); timer_adjust_oneshot( amiga_irq_timer, cpu_clocks_to_attotime( Machine->activecpu, AMIGA_IRQ_DELAY_CYCLES ), 0);
else /* if we're clearing irq's, process right away */ else /* if we're clearing irq's, process right away */
update_irqs(space->machine); update_irqs(space->machine);
break; break;

View File

@ -695,7 +695,7 @@ static TIMER_CALLBACK( cchip_timer )
{ {
// Simulate time for command to execute (exact timing unknown, this is close) // Simulate time for command to execute (exact timing unknown, this is close)
current_cmd=0xf5; current_cmd=0xf5;
timer_set(ATTOTIME_IN_CYCLES(80000,0), NULL, 0, opwolf_timer_callback); timer_set(cpu_clocks_to_attotime(machine->cpu[0],80000), NULL, 0, opwolf_timer_callback);
} }
cchip_last_7a=cchip_ram[0x7a]; cchip_last_7a=cchip_ram[0x7a];

View File

@ -170,7 +170,7 @@ static TIMER_CALLBACK( snes_scanline_tick )
if( snes_ram[NMITIMEN] & 0x80 ) /* NMI only signaled if this bit set */ if( snes_ram[NMITIMEN] & 0x80 ) /* NMI only signaled if this bit set */
{ {
// NMI goes off about 12 cycles after this (otherwise Chrono Trigger, NFL QB Club, etc. lock up) // NMI goes off about 12 cycles after this (otherwise Chrono Trigger, NFL QB Club, etc. lock up)
timer_adjust_oneshot(snes_nmi_timer, ATTOTIME_IN_CYCLES(12, 0), 0); timer_adjust_oneshot(snes_nmi_timer, cpu_clocks_to_attotime(machine->cpu[0], 12), 0);
} }
} }

View File

@ -97,7 +97,7 @@ static void update_irq_encoder(int line, int state)
static PIT8253_OUTPUT_CHANGED( v_irq4_w ) static PIT8253_OUTPUT_CHANGED( v_irq4_w )
{ {
update_irq_encoder(INPUT_LINE_IRQ4, state); update_irq_encoder(INPUT_LINE_IRQ4, state);
vertigo_vproc(ATTOTIME_TO_CYCLES(0, attotime_sub(timer_get_time(), irq4_time)), state); vertigo_vproc(cpu_attotime_to_clocks(device->machine->cpu[0], attotime_sub(timer_get_time(), irq4_time)), state);
irq4_time = timer_get_time(); irq4_time = timer_get_time();
} }

View File

@ -393,12 +393,12 @@ WRITE16_HANDLER( volfied_cchip_ram_w )
// Palette request cmd - verified to take around 122242 68000 cycles to complete // Palette request cmd - verified to take around 122242 68000 cycles to complete
if (current_cmd >= 0x1 && current_cmd < 0x12) if (current_cmd >= 0x1 && current_cmd < 0x12)
{ {
timer_set(ATTOTIME_IN_CYCLES(122242,0), NULL, 0, volfied_timer_callback); timer_set(cpu_clocks_to_attotime(space->cpu,122242), NULL, 0, volfied_timer_callback);
} }
// Unknown cmd - verified to take around 105500 68000 cycles to complete // Unknown cmd - verified to take around 105500 68000 cycles to complete
else if (current_cmd >= 0x81 && current_cmd < 0x92) else if (current_cmd >= 0x81 && current_cmd < 0x92)
{ {
timer_set(ATTOTIME_IN_CYCLES(105500,0), NULL, 0, volfied_timer_callback); timer_set(cpu_clocks_to_attotime(space->cpu,105500), NULL, 0, volfied_timer_callback);
} }
else else
{ {

View File

@ -448,7 +448,7 @@ static void astrocade_trigger_lightpen(running_machine *machine, UINT8 vfeedback
else else
{ {
cpu_set_input_line_and_vector(machine->cpu[0], 0, ASSERT_LINE, interrupt_vector & 0xf0); cpu_set_input_line_and_vector(machine->cpu[0], 0, ASSERT_LINE, interrupt_vector & 0xf0);
timer_set(ATTOTIME_IN_CYCLES(1, 0), NULL, 0, interrupt_off); timer_set(cpu_clocks_to_attotime(machine->cpu[0], 1), NULL, 0, interrupt_off);
} }
/* latch the feedback registers */ /* latch the feedback registers */
@ -488,7 +488,7 @@ static TIMER_CALLBACK( scanline_callback )
else else
{ {
cpu_set_input_line_and_vector(machine->cpu[0], 0, ASSERT_LINE, interrupt_vector); cpu_set_input_line_and_vector(machine->cpu[0], 0, ASSERT_LINE, interrupt_vector);
timer_set(ATTOTIME_IN_CYCLES(1, 0), NULL, 0, interrupt_off); timer_set(cpu_clocks_to_attotime(machine->cpu[0], 1), NULL, 0, interrupt_off);
} }
} }

View File

@ -891,7 +891,7 @@ logerror("vlbank starting\n");
// a game can read the high bit of $2002 before the NMI is called (potentially resetting the bit // a game can read the high bit of $2002 before the NMI is called (potentially resetting the bit
// via a read from $2002 in the NMI handler). // via a read from $2002 in the NMI handler).
// B-Wings is an example game that needs this. // B-Wings is an example game that needs this.
timer_adjust_oneshot(this_ppu->nmi_timer, ATTOTIME_IN_CYCLES(4, 0), num); timer_adjust_oneshot(this_ppu->nmi_timer, cpu_clocks_to_attotime(machine->cpu[0], 4), num);
} }
} }
@ -942,7 +942,7 @@ logerror("vlbank ending\n");
next_scanline = 0; next_scanline = 0;
// Call us back when the hblank starts for this scanline // Call us back when the hblank starts for this scanline
timer_adjust_oneshot(this_ppu->hblank_timer, ATTOTIME_IN_CYCLES(86.67, 0), num); // ??? FIXME - hardcoding NTSC, need better calculation timer_adjust_oneshot(this_ppu->hblank_timer, cpu_clocks_to_attotime(machine->cpu[0], 86.67), num); // ??? FIXME - hardcoding NTSC, need better calculation
// trigger again at the start of the next scanline // trigger again at the start of the next scanline
timer_adjust_oneshot(this_ppu->scanline_timer, video_screen_get_time_until_pos(machine->primary_screen, next_scanline * this_ppu->scan_scale, 0), num); timer_adjust_oneshot(this_ppu->scanline_timer, video_screen_get_time_until_pos(machine->primary_screen, next_scanline * this_ppu->scan_scale, 0), num);
@ -973,7 +973,7 @@ void ppu2c0x_reset(running_machine *machine, int num, int scan_scale)
timer_adjust_oneshot(chips[num].nmi_timer, attotime_never, num); timer_adjust_oneshot(chips[num].nmi_timer, attotime_never, num);
// Call us back when the hblank starts for this scanline // Call us back when the hblank starts for this scanline
timer_adjust_oneshot(chips[num].hblank_timer, ATTOTIME_IN_CYCLES(86.67, 0), num); // ??? FIXME - hardcoding NTSC, need better calculation timer_adjust_oneshot(chips[num].hblank_timer, cpu_clocks_to_attotime(machine->cpu[0], 86.67), num); // ??? FIXME - hardcoding NTSC, need better calculation
// Call us back at the start of the next scanline // Call us back at the start of the next scanline
timer_adjust_oneshot(chips[num].scanline_timer, video_screen_get_time_until_pos(machine->primary_screen, 1, 0), num); timer_adjust_oneshot(chips[num].scanline_timer, video_screen_get_time_until_pos(machine->primary_screen, 1, 0), num);