summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpuintrf.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/cpuintrf.h')
-rw-r--r--src/emu/cpuintrf.h516
1 files changed, 516 insertions, 0 deletions
diff --git a/src/emu/cpuintrf.h b/src/emu/cpuintrf.h
new file mode 100644
index 00000000000..c93308a9e34
--- /dev/null
+++ b/src/emu/cpuintrf.h
@@ -0,0 +1,516 @@
+/***************************************************************************
+
+ cpuintrf.h
+
+ Core CPU interface functions and definitions.
+
+ Copyright (c) 1996-2007, Nicola Salmoria and the MAME Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __CPUINTRF_H__
+#define __CPUINTRF_H__
+
+#include "cpuint.h"
+#include "cpuexec.h"
+#include "mame.h"
+#include "state.h"
+
+
+/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+#define MAX_CPU 8
+
+
+/* Interrupt line constants */
+enum
+{
+ /* line states */
+ CLEAR_LINE = 0, /* clear (a fired, held or pulsed) line */
+ ASSERT_LINE, /* assert an interrupt immediately */
+ HOLD_LINE, /* hold interrupt line until acknowledged */
+ PULSE_LINE, /* pulse interrupt line for one instruction */
+
+ /* internal flags (not for use by drivers!) */
+ INTERNAL_CLEAR_LINE = 100 + CLEAR_LINE,
+ INTERNAL_ASSERT_LINE = 100 + ASSERT_LINE,
+
+ /* input lines */
+ MAX_INPUT_LINES = 32+3,
+ INPUT_LINE_IRQ0 = 0,
+ INPUT_LINE_IRQ1 = 1,
+ INPUT_LINE_IRQ2 = 2,
+ INPUT_LINE_IRQ3 = 3,
+ INPUT_LINE_IRQ4 = 4,
+ INPUT_LINE_IRQ5 = 5,
+ INPUT_LINE_IRQ6 = 6,
+ INPUT_LINE_IRQ7 = 7,
+ INPUT_LINE_IRQ8 = 8,
+ INPUT_LINE_IRQ9 = 9,
+ INPUT_LINE_NMI = MAX_INPUT_LINES - 3,
+
+ /* special input lines that are implemented in the core */
+ INPUT_LINE_RESET = MAX_INPUT_LINES - 2,
+ INPUT_LINE_HALT = MAX_INPUT_LINES - 1,
+
+ /* output lines */
+ MAX_OUTPUT_LINES = 32
+};
+
+
+/* Maximum number of registers of any CPU */
+enum
+{
+ MAX_REGS = 256
+};
+
+
+/* CPU information constants */
+enum
+{
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ CPUINFO_INT_FIRST = 0x00000,
+
+ CPUINFO_INT_CONTEXT_SIZE = CPUINFO_INT_FIRST, /* R/O: size of CPU context in bytes */
+ CPUINFO_INT_INPUT_LINES, /* R/O: number of input lines */
+ CPUINFO_INT_OUTPUT_LINES, /* R/O: number of output lines */
+ CPUINFO_INT_DEFAULT_IRQ_VECTOR, /* R/O: default IRQ vector */
+ CPUINFO_INT_ENDIANNESS, /* R/O: either CPU_IS_BE or CPU_IS_LE */
+ CPUINFO_INT_CLOCK_DIVIDER, /* R/O: internal clock divider */
+ CPUINFO_INT_MIN_INSTRUCTION_BYTES, /* R/O: minimum bytes per instruction */
+ CPUINFO_INT_MAX_INSTRUCTION_BYTES, /* R/O: maximum bytes per instruction */
+ CPUINFO_INT_MIN_CYCLES, /* R/O: minimum cycles for a single instruction */
+ CPUINFO_INT_MAX_CYCLES, /* R/O: maximum cycles for a single instruction */
+
+ CPUINFO_INT_DATABUS_WIDTH, /* R/O: data bus size for each address space (8,16,32,64) */
+ CPUINFO_INT_DATABUS_WIDTH_LAST = CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACES - 1,
+ CPUINFO_INT_ADDRBUS_WIDTH, /* R/O: address bus size for each address space (12-32) */
+ CPUINFO_INT_ADDRBUS_WIDTH_LAST = CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACES - 1,
+ CPUINFO_INT_ADDRBUS_SHIFT, /* R/O: shift applied to addresses each address space (+3 means >>3, -1 means <<1) */
+ CPUINFO_INT_ADDRBUS_SHIFT_LAST = CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACES - 1,
+ CPUINFO_INT_LOGADDR_WIDTH, /* R/O: address bus size for logical accesses in each space (0=same as physical) */
+ CPUINFO_INT_LOGADDR_WIDTH_LAST = CPUINFO_INT_LOGADDR_WIDTH + ADDRESS_SPACES - 1,
+ CPUINFO_INT_PAGE_SHIFT, /* R/O: size of a page log 2 (i.e., 12=4096), or 0 if paging not supported */
+ CPUINFO_INT_PAGE_SHIFT_LAST = CPUINFO_INT_PAGE_SHIFT + ADDRESS_SPACES - 1,
+
+ CPUINFO_INT_SP, /* R/W: the current stack pointer value */
+ CPUINFO_INT_PC, /* R/W: the current PC value */
+ CPUINFO_INT_PREVIOUSPC, /* R/W: the previous PC value */
+ CPUINFO_INT_INPUT_STATE, /* R/W: states for each input line */
+ CPUINFO_INT_INPUT_STATE_LAST = CPUINFO_INT_INPUT_STATE + MAX_INPUT_LINES - 1,
+ CPUINFO_INT_OUTPUT_STATE, /* R/W: states for each output line */
+ CPUINFO_INT_OUTPUT_STATE_LAST = CPUINFO_INT_OUTPUT_STATE + MAX_OUTPUT_LINES - 1,
+ CPUINFO_INT_REGISTER, /* R/W: values of up to MAX_REGs registers */
+ CPUINFO_INT_REGISTER_LAST = CPUINFO_INT_REGISTER + MAX_REGS - 1,
+
+ CPUINFO_INT_CPU_SPECIFIC = 0x08000, /* R/W: CPU-specific values start here */
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ CPUINFO_PTR_FIRST = 0x10000,
+
+ CPUINFO_PTR_SET_INFO = CPUINFO_PTR_FIRST, /* R/O: void (*set_info)(UINT32 state, INT64 data, void *ptr) */
+ CPUINFO_PTR_GET_CONTEXT, /* R/O: void (*get_context)(void *buffer) */
+ CPUINFO_PTR_SET_CONTEXT, /* R/O: void (*set_context)(void *buffer) */
+ CPUINFO_PTR_INIT, /* R/O: void (*init)(int index, int clock, const void *config, int (*irqcallback)(int)) */
+ CPUINFO_PTR_RESET, /* R/O: void (*reset)(void) */
+ CPUINFO_PTR_EXIT, /* R/O: void (*exit)(void) */
+ CPUINFO_PTR_EXECUTE, /* R/O: int (*execute)(int cycles) */
+ CPUINFO_PTR_BURN, /* R/O: void (*burn)(int cycles) */
+ CPUINFO_PTR_DISASSEMBLE, /* R/O: offs_t (*disassemble)(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram) */
+ CPUINFO_PTR_TRANSLATE, /* R/O: int (*translate)(int space, offs_t *address) */
+ CPUINFO_PTR_READ, /* R/O: int (*read)(int space, UINT32 offset, int size, UINT64 *value) */
+ CPUINFO_PTR_WRITE, /* R/O: int (*write)(int space, UINT32 offset, int size, UINT64 value) */
+ CPUINFO_PTR_READOP, /* R/O: int (*readop)(UINT32 offset, int size, UINT64 *value) */
+ CPUINFO_PTR_DEBUG_SETUP_COMMANDS, /* R/O: void (*setup_commands)(void) */
+ CPUINFO_PTR_INSTRUCTION_COUNTER, /* R/O: int *icount */
+ CPUINFO_PTR_INTERNAL_MEMORY_MAP, /* R/O: construct_map_t map */
+ CPUINFO_PTR_INTERNAL_MEMORY_MAP_LAST = CPUINFO_PTR_INTERNAL_MEMORY_MAP + ADDRESS_SPACES - 1,
+ CPUINFO_PTR_DEBUG_REGISTER_LIST, /* R/O: int *list: list of registers for the debugger */
+
+ CPUINFO_PTR_CPU_SPECIFIC = 0x18000, /* R/W: CPU-specific values start here */
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ CPUINFO_STR_FIRST = 0x20000,
+
+ CPUINFO_STR_NAME = CPUINFO_STR_FIRST, /* R/O: name of the CPU */
+ CPUINFO_STR_CORE_FAMILY, /* R/O: family of the CPU */
+ CPUINFO_STR_CORE_VERSION, /* R/O: version of the CPU core */
+ CPUINFO_STR_CORE_FILE, /* R/O: file containing the CPU core */
+ CPUINFO_STR_CORE_CREDITS, /* R/O: credits for the CPU core */
+ CPUINFO_STR_FLAGS, /* R/O: string representation of the main flags value */
+ CPUINFO_STR_REGISTER, /* R/O: string representation of up to MAX_REGs registers */
+ CPUINFO_STR_REGISTER_LAST = CPUINFO_STR_REGISTER + MAX_REGS - 1,
+
+ CPUINFO_STR_CPU_SPECIFIC = 0x28000 /* R/W: CPU-specific values start here */
+};
+
+
+/* get_reg/set_reg constants */
+enum
+{
+ /* This value is passed to activecpu_get_reg to retrieve the previous
+ * program counter value, ie. before a CPU emulation started
+ * to fetch opcodes and arguments for the current instrution. */
+ REG_PREVIOUSPC = CPUINFO_INT_PREVIOUSPC - CPUINFO_INT_REGISTER,
+
+ /* This value is passed to activecpu_get_reg to retrieve the current
+ * program counter value. */
+ REG_PC = CPUINFO_INT_PC - CPUINFO_INT_REGISTER,
+
+ /* This value is passed to activecpu_get_reg to retrieve the current
+ * stack pointer value. */
+ REG_SP = CPUINFO_INT_SP - CPUINFO_INT_REGISTER
+};
+
+
+/* Endianness constants */
+enum
+{
+ CPU_IS_LE = 0, /* emulated CPU is little endian */
+ CPU_IS_BE /* emulated CPU is big endian */
+};
+
+
+/* Disassembler constants */
+#define DASMFLAG_SUPPORTED 0x80000000 /* are disassembly flags supported? */
+#define DASMFLAG_STEP_OUT 0x40000000 /* this instruction should be the end of a step out sequence */
+#define DASMFLAG_STEP_OVER 0x20000000 /* this instruction should be stepped over by setting a breakpoint afterwards */
+#define DASMFLAG_OVERINSTMASK 0x18000000 /* number of extra instructions to skip when stepping over */
+#define DASMFLAG_OVERINSTSHIFT 27 /* bits to shift after masking to get the value */
+#define DASMFLAG_LENGTHMASK 0x0000ffff /* the low 16-bits contain the actual length */
+#define DASMFLAG_STEP_OVER_EXTRA(x) ((x) << DASMFLAG_OVERINSTSHIFT)
+
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+/* forward declaration of this union */
+typedef union _cpuinfo cpuinfo;
+
+
+/* define the various callback functions */
+typedef void (*cpufunc_get_info)(UINT32 state, cpuinfo *info);
+typedef void (*cpufunc_set_info)(UINT32 state, cpuinfo *info);
+typedef void (*cpufunc_get_context)(void *buffer);
+typedef void (*cpufunc_set_context)(void *buffer);
+typedef void (*cpufunc_init)(int index, int clock, const void *config, int (*irqcallback)(int));
+typedef void (*cpufunc_reset)(void);
+typedef void (*cpufunc_exit)(void);
+typedef int (*cpufunc_execute)(int cycles);
+typedef void (*cpufunc_burn)(int cycles);
+typedef offs_t (*cpufunc_disassemble)(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram);
+typedef int (*cpufunc_translate)(int space, offs_t *address);
+typedef int (*cpufunc_read)(int space, UINT32 offset, int size, UINT64 *value);
+typedef int (*cpufunc_write)(int space, UINT32 offset, int size, UINT64 value);
+typedef int (*cpufunc_readop)(UINT32 offset, int size, UINT64 *value);
+typedef void (*cpufunc_setup_commands)(void);
+
+
+/* cpuinfo union used to pass data to/from the get_info/set_info functions */
+union _cpuinfo
+{
+ INT64 i; /* generic integers */
+ void * p; /* generic pointers */
+ genf * f; /* generic function pointers */
+ char * s; /* generic strings */
+
+ cpufunc_set_info setinfo; /* CPUINFO_PTR_SET_INFO */
+ cpufunc_get_context getcontext; /* CPUINFO_PTR_GET_CONTEXT */
+ cpufunc_set_context setcontext; /* CPUINFO_PTR_SET_CONTEXT */
+ cpufunc_init init; /* CPUINFO_PTR_INIT */
+ cpufunc_reset reset; /* CPUINFO_PTR_RESET */
+ cpufunc_exit exit; /* CPUINFO_PTR_EXIT */
+ cpufunc_execute execute; /* CPUINFO_PTR_EXECUTE */
+ cpufunc_burn burn; /* CPUINFO_PTR_BURN */
+ cpufunc_disassemble disassemble; /* CPUINFO_PTR_DISASSEMBLE */
+ cpufunc_translate translate; /* CPUINFO_PTR_TRANSLATE */
+ cpufunc_read read; /* CPUINFO_PTR_READ */
+ cpufunc_write write; /* CPUINFO_PTR_WRITE */
+ cpufunc_readop readop; /* CPUINFO_PTR_READOP */
+ cpufunc_setup_commands setup_commands; /* CPUINFO_PTR_DEBUG_SETUP_COMMANDS */
+ int * icount; /* CPUINFO_PTR_INSTRUCTION_COUNTER */
+ construct_map_t internal_map; /* CPUINFO_PTR_INTERNAL_MEMORY_MAP */
+};
+
+
+typedef struct _cpu_interface cpu_interface;
+struct _cpu_interface
+{
+ /* table of core functions */
+ cpufunc_get_info get_info;
+ cpufunc_set_info set_info;
+ cpufunc_get_context get_context;
+ cpufunc_set_context set_context;
+ cpufunc_init init;
+ cpufunc_reset reset;
+ cpufunc_exit exit;
+ cpufunc_execute execute;
+ cpufunc_burn burn;
+ cpufunc_disassemble disassemble;
+ cpufunc_translate translate;
+
+ /* other info */
+ size_t context_size;
+ INT8 address_shift;
+ int * icount;
+};
+
+
+
+/***************************************************************************
+ CORE CPU INTERFACE FUNCTIONS
+***************************************************************************/
+
+/* reset the internal CPU tracking */
+void cpuintrf_init(running_machine *machine);
+
+/* set up the interface for one CPU of a given type */
+int cpuintrf_init_cpu(int cpunum, cpu_type cputype, int clock, const void *config, int (*irqcallback)(int));
+
+/* clean up the interface for one CPU */
+void cpuintrf_exit_cpu(int cpunum);
+
+/* remember the previous context and set a new one */
+void cpuintrf_push_context(int cpunum);
+
+/* restore the previous context */
+void cpuintrf_pop_context(void);
+
+/* circular string buffer */
+char *cpuintrf_temp_str(void);
+
+/* set the dasm override handler */
+void cpuintrf_set_dasm_override(int cpunum, offs_t (*dasm_override)(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram));
+
+
+
+/***************************************************************************
+ ACTIVE CPU ACCCESSORS
+***************************************************************************/
+
+/* get info accessors */
+INT64 activecpu_get_info_int(UINT32 state);
+void *activecpu_get_info_ptr(UINT32 state);
+genf *activecpu_get_info_fct(UINT32 state);
+const char *activecpu_get_info_string(UINT32 state);
+
+/* set info accessors */
+void activecpu_set_info_int(UINT32 state, INT64 data);
+void activecpu_set_info_ptr(UINT32 state, void *data);
+void activecpu_set_info_fct(UINT32 state, genf *data);
+
+/* apply a +/- to the current icount */
+void activecpu_adjust_icount(int delta);
+
+/* return the current icount */
+int activecpu_get_icount(void);
+
+/* ensure banking is reset properly */
+void activecpu_reset_banking(void);
+
+/* set the input line on a CPU -- drivers use cpu_set_input_line() */
+void activecpu_set_input_line(int irqline, int state);
+
+/* return the PC, corrected to a byte offset, on the active CPU */
+offs_t activecpu_get_physical_pc_byte(void);
+
+/* update the banking on the active CPU */
+void activecpu_set_opbase(offs_t val);
+
+/* disassemble a line at a given PC on the active CPU */
+offs_t activecpu_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram);
+
+#define activecpu_context_size() activecpu_get_info_int(CPUINFO_INT_CONTEXT_SIZE)
+#define activecpu_input_lines() activecpu_get_info_int(CPUINFO_INT_INPUT_LINES)
+#define activecpu_output_lines() activecpu_get_info_int(CPUINFO_INT_OUTPUT_LINES)
+#define activecpu_default_irq_vector() activecpu_get_info_int(CPUINFO_INT_DEFAULT_IRQ_VECTOR)
+#define activecpu_endianness() activecpu_get_info_int(CPUINFO_INT_ENDIANNESS)
+#define activecpu_clock_divider() activecpu_get_info_int(CPUINFO_INT_CLOCK_DIVIDER)
+#define activecpu_min_instruction_bytes() activecpu_get_info_int(CPUINFO_INT_MIN_INSTRUCTION_BYTES)
+#define activecpu_max_instruction_bytes() activecpu_get_info_int(CPUINFO_INT_MAX_INSTRUCTION_BYTES)
+#define activecpu_min_cycles() activecpu_get_info_int(CPUINFO_INT_MIN_CYCLES)
+#define activecpu_max_cycles() activecpu_get_info_int(CPUINFO_INT_MAX_CYCLES)
+#define activecpu_databus_width(space) activecpu_get_info_int(CPUINFO_INT_DATABUS_WIDTH + (space))
+#define activecpu_addrbus_width(space) activecpu_get_info_int(CPUINFO_INT_ADDRBUS_WIDTH + (space))
+#define activecpu_addrbus_shift(space) activecpu_get_info_int(CPUINFO_INT_ADDRBUS_SHIFT + (space))
+#define activecpu_logaddr_width(space) activecpu_get_info_int(CPUINFO_INT_LOGADDR_WIDTH + (space))
+#define activecpu_page_shift(space) activecpu_get_info_int(CPUINFO_INT_PAGE_SHIFT + (space))
+#define activecpu_get_reg(reg) activecpu_get_info_int(CPUINFO_INT_REGISTER + (reg))
+#define activecpu_debug_register_list() activecpu_get_info_ptr(CPUINFO_PTR_DEBUG_REGISTER_LIST)
+#define activecpu_name() activecpu_get_info_string(CPUINFO_STR_NAME)
+#define activecpu_core_family() activecpu_get_info_string(CPUINFO_STR_CORE_FAMILY)
+#define activecpu_core_version() activecpu_get_info_string(CPUINFO_STR_CORE_VERSION)
+#define activecpu_core_file() activecpu_get_info_string(CPUINFO_STR_CORE_FILE)
+#define activecpu_core_credits() activecpu_get_info_string(CPUINFO_STR_CORE_CREDITS)
+#define activecpu_flags() activecpu_get_info_string(CPUINFO_STR_FLAGS)
+#define activecpu_irq_string(irq) activecpu_get_info_string(CPUINFO_STR_IRQ_STATE + (irq))
+#define activecpu_reg_string(reg) activecpu_get_info_string(CPUINFO_STR_REGISTER + (reg))
+
+#define activecpu_set_reg(reg, val) activecpu_set_info_int(CPUINFO_INT_REGISTER + (reg), (val))
+
+
+
+/***************************************************************************
+ SPECIFIC CPU ACCCESSORS
+***************************************************************************/
+
+/* get info accessors */
+INT64 cpunum_get_info_int(int cpunum, UINT32 state);
+void *cpunum_get_info_ptr(int cpunum, UINT32 state);
+genf *cpunum_get_info_fct(int cpunum, UINT32 state);
+const char *cpunum_get_info_string(int cpunum, UINT32 state);
+
+/* set info accessors */
+void cpunum_set_info_int(int cpunum, UINT32 state, INT64 data);
+void cpunum_set_info_ptr(int cpunum, UINT32 state, void *data);
+void cpunum_set_info_fct(int cpunum, UINT32 state, genf *data);
+
+/* execute the requested cycles on a given CPU */
+int cpunum_execute(int cpunum, int cycles);
+
+/* signal a reset for a given CPU */
+void cpunum_reset(int cpunum);
+
+/* read a byte from another CPU's memory space */
+UINT8 cpunum_read_byte(int cpunum, offs_t address);
+
+/* write a byte from another CPU's memory space */
+void cpunum_write_byte(int cpunum, offs_t address, UINT8 data);
+
+/* return a pointer to the saved context of a given CPU, or NULL if the
+ context is active (and contained within the CPU core */
+void *cpunum_get_context_ptr(int cpunum);
+
+/* return the PC, corrected to a byte offset, on a given CPU */
+offs_t cpunum_get_physical_pc_byte(int cpunum);
+
+/* update the banking on a given CPU */
+void cpunum_set_opbase(int cpunum, offs_t val);
+
+/* disassemble a line at a given PC on a given CPU */
+offs_t cpunum_dasm(int cpunum, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram);
+
+#define cpunum_context_size(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_CONTEXT_SIZE)
+#define cpunum_input_lines(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_INPUT_LINES)
+#define cpunum_output_lines(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_OUTPUT_LINES)
+#define cpunum_default_irq_vector(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_DEFAULT_IRQ_VECTOR)
+#define cpunum_endianness(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_ENDIANNESS)
+#define cpunum_clock_divider(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_CLOCK_DIVIDER)
+#define cpunum_min_instruction_bytes(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_MIN_INSTRUCTION_BYTES)
+#define cpunum_max_instruction_bytes(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_MAX_INSTRUCTION_BYTES)
+#define cpunum_min_cycles(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_MIN_CYCLES)
+#define cpunum_max_cycles(cpunum) cpunum_get_info_int(cpunum, CPUINFO_INT_MAX_CYCLES)
+#define cpunum_databus_width(cpunum, space) cpunum_get_info_int(cpunum, CPUINFO_INT_DATABUS_WIDTH + (space))
+#define cpunum_addrbus_width(cpunum, space) cpunum_get_info_int(cpunum, CPUINFO_INT_ADDRBUS_WIDTH + (space))
+#define cpunum_addrbus_shift(cpunum, space) cpunum_get_info_int(cpunum, CPUINFO_INT_ADDRBUS_SHIFT + (space))
+#define cpunum_logaddr_width(cpunum, space) cpunum_get_info_int(cpunum, CPUINFO_INT_LOGADDR_WIDTH + (space))
+#define cpunum_page_shift(cpunum, space) cpunum_get_info_int(cpunum, CPUINFO_INT_PAGE_SHIFT + (space))
+#define cpunum_get_reg(cpunum, reg) cpunum_get_info_int(cpunum, CPUINFO_INT_REGISTER + (reg))
+#define cpunum_debug_register_list(cpunum) cpunum_get_info_ptr(cpunum, CPUINFO_PTR_DEBUG_REGISTER_LIST)
+#define cpunum_name(cpunum) cpunum_get_info_string(cpunum, CPUINFO_STR_NAME)
+#define cpunum_core_family(cpunum) cpunum_get_info_string(cpunum, CPUINFO_STR_CORE_FAMILY)
+#define cpunum_core_version(cpunum) cpunum_get_info_string(cpunum, CPUINFO_STR_CORE_VERSION)
+#define cpunum_core_file(cpunum) cpunum_get_info_string(cpunum, CPUINFO_STR_CORE_FILE)
+#define cpunum_core_credits(cpunum) cpunum_get_info_string(cpunum, CPUINFO_STR_CORE_CREDITS)
+#define cpunum_flags(cpunum) cpunum_get_info_string(cpunum, CPUINFO_STR_FLAGS)
+#define cpunum_irq_string(cpunum, irq) cpunum_get_info_string(cpunum, CPUINFO_STR_IRQ_STATE + (irq))
+#define cpunum_reg_string(cpunum, reg) cpunum_get_info_string(cpunum, CPUINFO_STR_REGISTER + (reg))
+
+#define cpunum_set_reg(cpunum, reg, val) cpunum_set_info_int(cpunum, CPUINFO_INT_REGISTER + (reg), (val))
+
+
+
+/***************************************************************************
+ CPU TYPE ACCCESSORS
+***************************************************************************/
+
+/* get info accessors */
+INT64 cputype_get_info_int(cpu_type cputype, UINT32 state);
+void *cputype_get_info_ptr(cpu_type cputype, UINT32 state);
+genf *cputype_get_info_fct(cpu_type cputype, UINT32 state);
+const char *cputype_get_info_string(cpu_type cputype, UINT32 state);
+
+#define cputype_context_size(cputype) cputype_get_info_int(cputype, CPUINFO_INT_CONTEXT_SIZE)
+#define cputype_input_lines(cputype) cputype_get_info_int(cputype, CPUINFO_INT_INPUT_LINES)
+#define cputype_output_lines(cputype) cputype_get_info_int(cputype, CPUINFO_INT_OUTPUT_LINES)
+#define cputype_default_irq_vector(cputype) cputype_get_info_int(cputype, CPUINFO_INT_DEFAULT_IRQ_VECTOR)
+#define cputype_endianness(cputype) cputype_get_info_int(cputype, CPUINFO_INT_ENDIANNESS)
+#define cputype_clock_divider(cputype) cputype_get_info_int(cputype, CPUINFO_INT_CLOCK_DIVIDER)
+#define cputype_min_instruction_bytes(cputype) cputype_get_info_int(cputype, CPUINFO_INT_MIN_INSTRUCTION_BYTES)
+#define cputype_max_instruction_bytes(cputype) cputype_get_info_int(cputype, CPUINFO_INT_MAX_INSTRUCTION_BYTES)
+#define cputype_min_cycles(cputype) cputype_get_info_int(cputype, CPUINFO_INT_MIN_CYCLES)
+#define cputype_max_cycles(cputype) cputype_get_info_int(cputype, CPUINFO_INT_MAX_CYCLES)
+#define cputype_databus_width(cputype, space) cputype_get_info_int(cputype, CPUINFO_INT_DATABUS_WIDTH + (space))
+#define cputype_addrbus_width(cputype, space) cputype_get_info_int(cputype, CPUINFO_INT_ADDRBUS_WIDTH + (space))
+#define cputype_addrbus_shift(cputype, space) cputype_get_info_int(cputype, CPUINFO_INT_ADDRBUS_SHIFT + (space))
+#define cputype_page_shift(cputype, space) cputype_get_info_int(cputype, CPUINFO_INT_PAGE_SHIFT + (space))
+#define cputype_debug_register_list(cputype) cputype_get_info_ptr(cputype, CPUINFO_PTR_DEBUG_REGISTER_LIST)
+#define cputype_name(cputype) cputype_get_info_string(cputype, CPUINFO_STR_NAME)
+#define cputype_core_family(cputype) cputype_get_info_string(cputype, CPUINFO_STR_CORE_FAMILY)
+#define cputype_core_version(cputype) cputype_get_info_string(cputype, CPUINFO_STR_CORE_VERSION)
+#define cputype_core_file(cputype) cputype_get_info_string(cputype, CPUINFO_STR_CORE_FILE)
+#define cputype_core_credits(cputype) cputype_get_info_string(cputype, CPUINFO_STR_CORE_CREDITS)
+
+
+
+/***************************************************************************
+ MACROS
+***************************************************************************/
+
+#define activecpu_get_previouspc() ((offs_t)activecpu_get_reg(REG_PREVIOUSPC))
+#define activecpu_get_pc() ((offs_t)activecpu_get_reg(REG_PC))
+#define activecpu_get_sp() activecpu_get_reg(REG_SP)
+
+
+
+/***************************************************************************
+ CPU INTERFACE ACCESSORS
+***************************************************************************/
+
+/* return a pointer to the interface struct for a given CPU type */
+INLINE const cpu_interface *cputype_get_interface(cpu_type cputype)
+{
+ extern cpu_interface cpuintrf[];
+ return &cpuintrf[cputype];
+}
+
+
+/* return a the index of the active CPU */
+INLINE int cpu_getactivecpu(void)
+{
+ extern int activecpu;
+ return activecpu;
+}
+
+
+/* return a the index of the executing CPU */
+INLINE int cpu_getexecutingcpu(void)
+{
+ extern int executingcpu;
+ return executingcpu;
+}
+
+
+/* return a the total number of registered CPUs */
+INLINE int cpu_gettotalcpu(void)
+{
+ extern int totalcpu;
+ return totalcpu;
+}
+
+
+/* return the current PC or ~0 if no CPU is active */
+INLINE offs_t safe_activecpu_get_pc(void)
+{
+ return (cpu_getactivecpu() >= 0) ? activecpu_get_pc() : ~0;
+}
+
+
+#endif /* __CPUINTRF_H__ */