diff options
Diffstat (limited to 'src/emu/cpuexec.h')
-rw-r--r-- | src/emu/cpuexec.h | 434 |
1 files changed, 434 insertions, 0 deletions
diff --git a/src/emu/cpuexec.h b/src/emu/cpuexec.h new file mode 100644 index 00000000000..ba966ae6046 --- /dev/null +++ b/src/emu/cpuexec.h @@ -0,0 +1,434 @@ +/*************************************************************************** + + cpuexec.h + + Core multi-CPU execution engine. + + Copyright (c) 1996-2007, Nicola Salmoria and the MAME Team. + Visit http://mamedev.org for licensing and usage restrictions. + +***************************************************************************/ + +#pragma once + +#ifndef __CPUEXEC_H__ +#define __CPUEXEC_H__ + +#include "memory.h" +#include "timer.h" + + +/* Enum listing all the CPUs */ +typedef enum _cpu_type cpu_type; +enum _cpu_type +{ + CPU_DUMMY, + CPU_Z80, + CPU_Z180, + CPU_8080, + CPU_8085A, + CPU_M6502, + CPU_M65C02, + CPU_M65SC02, + CPU_M65CE02, + CPU_M6509, + CPU_M6510, + CPU_M6510T, + CPU_M7501, + CPU_M8502, + CPU_N2A03, + CPU_DECO16, + CPU_M4510, + CPU_H6280, + CPU_I8086, + CPU_I8088, + CPU_I80186, + CPU_I80188, + CPU_I80286, + CPU_V20, + CPU_V25, + CPU_V30, + CPU_V33, + CPU_V35, + CPU_V60, + CPU_V70, + CPU_I8035, + CPU_I8039, + CPU_I8048, + CPU_N7751, + CPU_I8X41, + CPU_I8051, + CPU_I8052, + CPU_I8751, + CPU_I8752, + CPU_M6800, + CPU_M6801, + CPU_M6802, + CPU_M6803, + CPU_M6808, + CPU_HD63701, + CPU_NSC8105, + CPU_M6805, + CPU_M68705, + CPU_HD63705, + CPU_HD6309, + CPU_M6809, + CPU_M6809E, + CPU_KONAMI, + CPU_M68000, + CPU_M68008, + CPU_M68010, + CPU_M68EC020, + CPU_M68020, + CPU_M68040, + CPU_T11, + CPU_S2650, + CPU_TMS34010, + CPU_TMS34020, + CPU_TI990_10, + CPU_TMS9900, + CPU_TMS9940, + CPU_TMS9980, + CPU_TMS9985, + CPU_TMS9989, + CPU_TMS9995, + CPU_TMS99100, + CPU_TMS99105A, + CPU_TMS99110A, + CPU_Z8000, + CPU_TMS32010, + CPU_TMS32025, + CPU_TMS32026, + CPU_TMS32031, + CPU_TMS32032, + CPU_TMS32051, + CPU_CCPU, + CPU_ADSP2100, + CPU_ADSP2101, + CPU_ADSP2104, + CPU_ADSP2105, + CPU_ADSP2115, + CPU_ADSP2181, + CPU_PSXCPU, + CPU_ASAP, + CPU_UPD7810, + CPU_UPD7807, + CPU_JAGUARGPU, + CPU_JAGUARDSP, + CPU_R3000BE, + CPU_R3000LE, + CPU_R4600BE, + CPU_R4600LE, + CPU_R4650BE, + CPU_R4650LE, + CPU_R4700BE, + CPU_R4700LE, + CPU_R5000BE, + CPU_R5000LE, + CPU_QED5271BE, + CPU_QED5271LE, + CPU_RM7000BE, + CPU_RM7000LE, + CPU_ARM, + CPU_ARM7, + CPU_SH2, + CPU_SH4, + CPU_DSP32C, + CPU_PIC16C54, + CPU_PIC16C55, + CPU_PIC16C56, + CPU_PIC16C57, + CPU_PIC16C58, + CPU_G65816, + CPU_SPC700, + CPU_E116T, + CPU_E116XT, + CPU_E116XS, + CPU_E116XSR, + CPU_E132N, + CPU_E132T, + CPU_E132XN, + CPU_E132XT, + CPU_E132XS, + CPU_E132XSR, + CPU_GMS30C2116, + CPU_GMS30C2132, + CPU_GMS30C2216, + CPU_GMS30C2232, + CPU_I386, + CPU_I486, + CPU_PENTIUM, + CPU_MEDIAGX, + CPU_I960, + CPU_H83002, + CPU_V810, + CPU_M37702, + CPU_M37710, + CPU_PPC403, + CPU_PPC601, + CPU_PPC602, + CPU_PPC603, + CPU_MPC8240, + CPU_SE3208, + CPU_MC68HC11, + CPU_ADSP21062, + CPU_DSP56156, + CPU_RSP, + CPU_ALPHA8201, + CPU_ALPHA8301, + CPU_CDP1802, + CPU_COP420, + CPU_COP410, + CPU_COP411, + CPU_TMP90840, + CPU_TMP90841, + CPU_TMP91640, + CPU_TMP91641, + CPU_APEXC, + CPU_CP1610, + CPU_F8, + CPU_LH5801, + CPU_PDP1, + CPU_SATURN, + CPU_SC61860, + CPU_TX0_64KW, + CPU_TX0_8KW, + CPU_Z80GB, + CPU_TMS7000, + CPU_TMS7000_EXL, + CPU_SM8500, + CPU_V30MZ, + CPU_MB8841, + CPU_MB8842, + CPU_MB8843, + CPU_MB8844, + CPU_MB86233, + CPU_SSP1610, + CPU_MINX, + CPU_COUNT +}; + + +/************************************* + * + * CPU description for drivers + * + *************************************/ + +typedef struct _cpu_config cpu_config; +struct _cpu_config +{ + cpu_type type; /* index for the CPU type */ + int flags; /* flags; see #defines below */ + int clock; /* in Hertz */ + construct_map_t construct_map[ADDRESS_SPACES][2]; /* 2 memory maps per address space */ + void (*vblank_interrupt)(void); /* for interrupts tied to VBLANK */ + int vblank_interrupts_per_frame;/* usually 1 */ + void (*timed_interrupt)(void); /* for interrupts not tied to VBLANK */ + attoseconds_t timed_interrupt_period; /* period for periodic interrupts */ + void * reset_param; /* parameter for cpu_reset */ + const char *tag; +}; + + + +/************************************* + * + * CPU flag constants + * + *************************************/ + +enum +{ + /* set this flag to disable execution of a CPU (if one is there for documentation */ + /* purposes only, for example */ + CPU_DISABLE = 0x0001 +}; + + + + +/************************************* + * + * Core CPU execution + * + *************************************/ + +/* Prepare CPUs for execution */ +void cpuexec_init(running_machine *machine); + +/* Execute for a single timeslice */ +void cpuexec_timeslice(void); + + + +/************************************* + * + * Optional watchdog + * + *************************************/ + +/* bang on the watchdog */ +void watchdog_reset(void); + +/* watchdog enabled when TRUE */ +/* timer is set to reset state when going from disable to enable */ +void watchdog_enable(int enable); + + + +/************************************* + * + * CPU scheduling + * + *************************************/ + +/* Suspension reasons */ +enum +{ + SUSPEND_REASON_HALT = 0x0001, + SUSPEND_REASON_RESET = 0x0002, + SUSPEND_REASON_SPIN = 0x0004, + SUSPEND_REASON_TRIGGER = 0x0008, + SUSPEND_REASON_DISABLE = 0x0010, + SUSPEND_ANY_REASON = ~0 +}; + +/* Suspend the given CPU for a specific reason */ +void cpunum_suspend(int cpunum, int reason, int eatcycles); + +/* Suspend the given CPU for a specific reason */ +void cpunum_resume(int cpunum, int reason); + +/* Returns true if the given CPU is suspended for any of the given reasons */ +int cpunum_is_suspended(int cpunum, int reason); + +/* Aborts the timeslice for the active CPU */ +void activecpu_abort_timeslice(void); + +/* Returns the current local time for a CPU */ +attotime cpunum_get_localtime(int cpunum); + +/* Returns the current CPU's unscaled running clock speed */ +/* If you want to know the current effective running clock + * after scaling it is just the double sec_to_cycles[cpunum] */ +int cpunum_get_clock(int cpunum); + +/* Sets the current CPU's clock speed and then adjusts for scaling */ +void cpunum_set_clock(int cpunum, int clock); +void cpunum_set_clock_period(int cpunum, attoseconds_t clock_period); + +/* Returns the current scaling factor for a CPU's clock speed */ +double cpunum_get_clockscale(int cpunum); + +/* Sets the current scaling factor for a CPU's clock speed */ +void cpunum_set_clockscale(int cpunum, double clockscale); + +/* Temporarily boosts the interleave factor */ +void cpu_boost_interleave(attotime timeslice_time, attotime boost_duration); + + + +/************************************* + * + * Timing helpers + * + *************************************/ + +/* Returns the number of cycles run so far this timeslice */ +int cycles_currently_ran(void); + +/* Returns the total number of CPU cycles */ +UINT32 activecpu_gettotalcycles(void); +UINT64 activecpu_gettotalcycles64(void); + +/* Returns the total number of CPU cycles for a given CPU */ +UINT32 cpunum_gettotalcycles(int cpunum); +UINT64 cpunum_gettotalcycles64(int cpunum); + +/* Safely eats cycles so we don't cross a timeslice boundary */ +void activecpu_eat_cycles(int cycles); + +/* Scales a given value by the ratio of fcount / fperiod */ +int cpu_scalebyfcount(int value); + + + +/************************************* + * + * Video timing + * + *************************************/ + +/***** OBSOLETE NOTICE: these functions are no longer considered */ +/***** to be the authority on scanline timing. Please use the */ +/***** video_screen_* functions in video.c for newer drivers. */ +/***** These functions may eventually go away. */ + +/* Recomputes the VBLANK timing after, e.g., a visible area change */ +void cpu_compute_vblank_timing(void); + +/* Returns the number of the video frame we are currently playing */ +int cpu_getcurrentframe(void); + + + +/************************************* + * + * Synchronization + * + *************************************/ + +/* generate a trigger now */ +void cpu_trigger(int trigger); + +/* generate a trigger after a specific period of time */ +void cpu_triggertime(attotime duration, int trigger); + +/* generate a trigger corresponding to an interrupt on the given CPU */ +void cpu_triggerint(int cpunum); + +/* burn CPU cycles until a timer trigger */ +void cpu_spinuntil_trigger(int trigger); + +/* burn specified CPU cycles until a timer trigger */ +void cpunum_spinuntil_trigger(int cpunum, int trigger); + +/* yield our timeslice until a timer trigger */ +void cpu_yielduntil_trigger(int trigger); + +/* burn CPU cycles until the next interrupt */ +void cpu_spinuntil_int(void); + +/* yield our timeslice until the next interrupt */ +void cpu_yielduntil_int(void); + +/* burn CPU cycles until our timeslice is up */ +void cpu_spin(void); + +/* yield our current timeslice */ +void cpu_yield(void); + +/* burn CPU cycles for a specific period of time */ +void cpu_spinuntil_time(attotime duration); + +/* yield our timeslice for a specific period of time */ +void cpu_yielduntil_time(attotime duration); + + + +/************************************* + * + * Core timing + * + *************************************/ + +/* Returns the number of times the interrupt handler will be called before + the end of the current video frame. This is can be useful to interrupt + handlers to synchronize their operation. If you call this from outside + an interrupt handler, add 1 to the result, i.e. if it returns 0, it means + that the interrupt handler will be called once. */ +int cpu_getiloops(void); + + +#endif /* __CPUEXEC_H__ */ |