#ifndef CPUINTRF_H
#define CPUINTRF_H
#include "osd_cpu.h"
#define NEW_INTERRUPT_SYSTEM 1
#define MAX_IRQ_LINES 8
#define CLEAR_LINE 0
#define ASSERT_LINE 1
#define HOLD_LINE 2
#define PULSE_LINE 3
#define MAX_REGS 64
#define IRQ_LINE_NMI 10
enum {
CPU_INFO_REG,
CPU_INFO_FLAGS=MAX_REGS,
CPU_INFO_NAME,
CPU_INFO_FAMILY,
CPU_INFO_VERSION,
CPU_INFO_FILE,
CPU_INFO_CREDITS,
CPU_INFO_REG_LAYOUT,
CPU_INFO_WIN_LAYOUT
};
#define CPU_IS_LE 0
#define CPU_IS_BE 1
#define REG_PREVIOUSPC -1
#define REG_SP_CONTENTS -2
#ifndef HAS_GENSYNC
#define HAS_GENSYNC 0
#endif
#ifndef HAS_Z80
#define HAS_Z80 0
#endif
#ifndef HAS_Z80_VM
#define HAS_Z80_VM 0
#endif
#ifndef HAS_8080
#define HAS_8080 0
#endif
#ifndef HAS_8085A
#define HAS_8085A 0
#endif
#ifndef HAS_M6502
#define HAS_M6502 0
#endif
#ifndef HAS_M65C02
#define HAS_M65C02 0
#endif
#ifndef HAS_M65SC02
#define HAS_M65SC02 0
#endif
#ifndef HAS_M65CE02
#define HAS_M65CE02 0
#endif
#ifndef HAS_M6509
#define HAS_M6509 0
#endif
#ifndef HAS_M6510
#define HAS_M6510 0
#endif
#ifndef HAS_N2A03
#define HAS_N2A03 0
#endif
#ifndef HAS_H6280
#define HAS_H6280 0
#endif
#ifndef HAS_I86
#define HAS_I86 0
#endif
#ifndef HAS_V20
#define HAS_V20 0
#endif
#ifndef HAS_V30
#define HAS_V30 0
#endif
#ifndef HAS_V33
#define HAS_V33 0
#endif
#ifndef HAS_I8035
#define HAS_I8035 0
#endif
#ifndef HAS_I8039
#define HAS_I8039 0
#endif
#ifndef HAS_I8048
#define HAS_I8048 0
#endif
#ifndef HAS_N7751
#define HAS_N7751 0
#endif
#ifndef HAS_M6800
#define HAS_M6800 0
#endif
#ifndef HAS_M6801
#define HAS_M6801 0
#endif
#ifndef HAS_M6802
#define HAS_M6802 0
#endif
#ifndef HAS_M6803
#define HAS_M6803 0
#endif
#ifndef HAS_M6808
#define HAS_M6808 0
#endif
#ifndef HAS_HD63701
#define HAS_HD63701 0
#endif
#ifndef HAS_M6805
#define HAS_M6805 0
#endif
#ifndef HAS_M68705
#define HAS_M68705 0
#endif
#ifndef HAS_HD63705
#define HAS_HD63705 0
#endif
#ifndef HAS_HD6309
#define HAS_HD6309 0
#endif
#ifndef HAS_M6809
#define HAS_M6809 0
#endif
#ifndef HAS_KONAMI
#define HAS_KONAMI 0
#endif
#ifndef HAS_M68000
#define HAS_M68000 0
#endif
#ifndef HAS_M68010
#define HAS_M68010 0
#endif
#ifndef HAS_M68020
#define HAS_M68020 0
#endif
#ifndef HAS_T11
#define HAS_T11 0
#endif
#ifndef HAS_S2650
#define HAS_S2650 0
#endif
#ifndef HAS_TMS34010
#define HAS_TMS34010 0
#endif
#ifndef HAS_TMS9900
#define HAS_TMS9900 0
#endif
#ifndef HAS_TMS9940
#define HAS_TMS9940 0
#endif
#ifndef HAS_TMS9980
#define HAS_TMS9980 0
#endif
#ifndef HAS_TMS9985
#define HAS_TMS9985 0
#endif
#ifndef HAS_TMS9989
#define HAS_TMS9989 0
#endif
#ifndef HAS_TMS9995
#define HAS_TMS9995 0
#endif
#ifndef HAS_TMS99105A
#define HAS_TMS99105A 0
#endif
#ifndef HAS_TMS99110A
#define HAS_TMS99110A 0
#endif
#ifndef HAS_Z8000
#define HAS_Z8000 0
#endif
#ifndef HAS_TMS320C10
#define HAS_TMS320C10 0
#endif
#ifndef HAS_CCPU
#define HAS_CCPU 0
#endif
#ifndef HAS_PDP1
#define HAS_PDP1 0
#endif
#ifndef HAS_ADSP2100
#define HAS_ADSP2100 0
#endif
struct cpu_interface
{
unsigned cpu_num;
void (*reset)(void *param);
void (*exit)(void);
int (*execute)(int cycles);
void (*burn)(int cycles);
unsigned (*get_context)(void *reg);
void (*set_context)(void *reg);
unsigned (*get_pc)(void);
void (*set_pc)(unsigned val);
unsigned (*get_sp)(void);
void (*set_sp)(unsigned val);
unsigned (*get_reg)(int regnum);
void (*set_reg)(int regnum, unsigned val);
void (*set_nmi_line)(int linestate);
void (*set_irq_line)(int irqline, int linestate);
void (*set_irq_callback)(int(*callback)(int irqline));
void (*internal_interrupt)(int type);
void (*cpu_state_save)(void *file);
void (*cpu_state_load)(void *file);
const char* (*cpu_info)(void *context,int regnum);
unsigned (*cpu_dasm)(char *buffer,unsigned pc);
unsigned num_irqs;
int default_vector;
int *icount;
double overclock;
int no_int, irq_int, nmi_int;
int (*memory_read)(int offset);
void (*memory_write)(int offset, int data);
void (*set_op_base)(int pc);
int address_shift;
unsigned address_bits, endianess, align_unit, max_inst_len;
unsigned abits1, abits2, abitsmin;
};
extern struct cpu_interface cpuintf[];
void cpu_init(void);
void cpu_run(void);
void watchdog_reset_w(int offset,int data);
int watchdog_reset_r(int offset);
void machine_reset(void);
void cpu_set_reset_line(int cpu,int state);
void cpu_set_halt_line(int cpu,int state);
int cpu_getstatus(int cpunum);
int cpu_gettotalcpu(void);
int cpu_getactivecpu(void);
void cpu_setactivecpu(int cpunum);
unsigned cpu_get_pc(void);
void cpu_set_pc(unsigned val);
unsigned cpu_get_sp(void);
void cpu_set_sp(unsigned val);
unsigned cpu_get_context(void *context);
void cpu_set_context(void *context);
unsigned cpu_get_reg(int regnum);
void cpu_set_reg(int regnum, unsigned val);
#define cpu_getpreviouspc() cpu_get_reg(REG_PREVIOUSPC)
#define cpu_geturnpc() cpu_get_reg(REG_SP_CONTENTS)
int cycles_currently_ran(void);
int cycles_left_to_run(void);
int cpu_gettotalcycles(void);
int cpu_geticount(void);
int cpu_getfcount(void);
int cpu_getfperiod(void);
int cpu_scalebyfcount(int value);
int cpu_getscanline(void);
double cpu_getscanlinetime(int scanline);
double cpu_getscanlineperiod(void);
int cpu_getscanlinecycles(void);
int cpu_getcurrentcycles(void);
int cpu_gethorzbeampos(void);
int cpu_getiloops(void);
int cpu_getvblank(void);
int cpu_getcurrentframe(void);
void cpu_triggertime (double duration, int trigger);
void cpu_trigger (int trigger);
void cpu_spinuntil_trigger (int trigger);
void cpu_spinuntil_int (void);
void cpu_spin (void);
void cpu_spinuntil_time (double duration);
void cpu_yielduntil_trigger (int trigger);
void cpu_yielduntil_int (void);
void cpu_yield (void);
void cpu_yielduntil_time (double duration);
void cpu_set_nmi_line(int cpunum, int state);
void cpu_set_irq_line(int cpunum, int irqline, int state);
void cpu_generate_internal_interrupt(int cpunum, int type);
void cpu_irq_line_vector_w(int cpunum, int irqline, int vector);
void cpu_0_irq_line_vector_w(int offset, int data);
void cpu_1_irq_line_vector_w(int offset, int data);
void cpu_2_irq_line_vector_w(int offset, int data);
void cpu_3_irq_line_vector_w(int offset, int data);
void cpu_4_irq_line_vector_w(int offset, int data);
void cpu_5_irq_line_vector_w(int offset, int data);
void cpu_6_irq_line_vector_w(int offset, int data);
void cpu_7_irq_line_vector_w(int offset, int data);
void cpu_cause_interrupt(int cpu,int type);
void cpu_clear_pending_interrupts(int cpu);
void interrupt_enable_w(int offset,int data);
void interrupt_vector_w(int offset,int data);
int interrupt(void);
int nmi_interrupt(void);
int m68_level1_irq(void);
int m68_level2_irq(void);
int m68_level3_irq(void);
int m68_level4_irq(void);
int m68_level5_irq(void);
int m68_level6_irq(void);
int m68_level7_irq(void);
int ignore_interrupt(void);
void* cpu_getcontext (int _activecpu);
int cpu_is_saving_context(int _activecpu);
unsigned cpu_address_bits(void);
unsigned cpu_address_mask(void);
int cpu_address_shift(void);
unsigned cpu_endianess(void);
unsigned cpu_align_unit(void);
unsigned cpu_max_inst_len(void);
const char *cpu_name(void);
const char *cpu_core_family(void);
const char *cpu_core_version(void);
const char *cpu_core_file(void);
const char *cpu_core_credits(void);
const char *cpu_reg_layout(void);
const char *cpu_win_layout(void);
unsigned cpu_dasm(char *buffer, unsigned pc);
const char *cpu_flags(void);
const char *cpu_dump_reg(int regnum);
const char *cpu_dump_state(void);
int cputype_address_shift(int cputype);
unsigned cputype_address_bits(int cputype);
unsigned cputype_address_mask(int cputype);
unsigned cputype_endianess(int cputype);
unsigned cputype_align_unit(int cputype);
unsigned cputype_max_inst_len(int cputype);
const char *cputype_name(int cputype);
const char *cputype_core_family(int cputype);
const char *cputype_core_version(int cputype);
const char *cputype_core_file(int cputype);
const char *cputype_core_credits(int cputype);
const char *cputype_reg_layout(int cputype);
const char *cputype_win_layout(int cputype);
unsigned cpunum_address_bits(int cputype);
unsigned cpunum_address_mask(int cputype);
unsigned cpunum_endianess(int cputype);
unsigned cpunum_align_unit(int cputype);
unsigned cpunum_max_inst_len(int cputype);
unsigned cpunum_get_reg(int cpunum, int regnum);
void cpunum_set_reg(int cpunum, int regnum, unsigned val);
const char *cpunum_reg_layout(int cpunum);
const char *cpunum_win_layout(int cpunum);
unsigned cpunum_dasm(int cpunum,char *buffer,unsigned pc);
const char *cpunum_flags(int cpunum);
const char *cpunum_dump_reg(int cpunum, int regnum);
const char *cpunum_dump_state(int cpunum);
const char *cpunum_name(int cpunum);
const char *cpunum_core_family(int cpunum);
const char *cpunum_core_version(int cpunum);
const char *cpunum_core_file(int cpunum);
const char *cpunum_core_credits(int cpunum);
void cpu_dump_states(void);
typedef struct {
void (*reset)(int);
int (*interrupt_entry)(int);
void (*interrupt_reti)(int);
int irq_param;
} Z80_DaisyChain;
#define Z80_MAXDAISY 4
#define Z80_INT_REQ 0x01
#define Z80_INT_IEO 0x02
#define Z80_VECTOR(device,state) (((device)<<8)|(state))
#ifndef INLINE
#define INLINE inline
#endif
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define cpu_readmem16 memory_read
#define cpu_readport16 memory_readport
#define cpu_writeport16 memory_writeport
#define cpu_writemem16 memory_write
#define cpu_readop memory_readop
#define cpu_readop_arg memory_read
#define logerror(x, ...)
#define change_pc16(x)
#define CALL_MAME_DEBUG
#define ADDRESS_SPACES 3
#define ADDRESS_SPACE_PROGRAM 0
#define ADDRESS_SPACE_DATA 1
#define ADDRESS_SPACE_IO 2
enum
{
INTERNAL_CLEAR_LINE = 100 + CLEAR_LINE,
INTERNAL_ASSERT_LINE = 100 + ASSERT_LINE,
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,
INPUT_LINE_RESET = MAX_INPUT_LINES - 2,
INPUT_LINE_HALT = MAX_INPUT_LINES - 1,
MAX_OUTPUT_LINES = 32
};
enum
{
CPUINFO_INT_FIRST = 0x00000,
CPUINFO_INT_CONTEXT_SIZE = CPUINFO_INT_FIRST,
CPUINFO_INT_INPUT_LINES,
CPUINFO_INT_OUTPUT_LINES,
CPUINFO_INT_DEFAULT_IRQ_VECTOR,
CPUINFO_INT_ENDIANNESS,
CPUINFO_INT_CLOCK_DIVIDER,
CPUINFO_INT_MIN_INSTRUCTION_BYTES,
CPUINFO_INT_MAX_INSTRUCTION_BYTES,
CPUINFO_INT_MIN_CYCLES,
CPUINFO_INT_MAX_CYCLES,
CPUINFO_INT_DATABUS_WIDTH,
CPUINFO_INT_DATABUS_WIDTH_LAST = CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACES - 1,
CPUINFO_INT_ADDRBUS_WIDTH,
CPUINFO_INT_ADDRBUS_WIDTH_LAST = CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACES - 1,
CPUINFO_INT_ADDRBUS_SHIFT,
CPUINFO_INT_ADDRBUS_SHIFT_LAST = CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACES - 1,
CPUINFO_INT_SP,
CPUINFO_INT_PC,
CPUINFO_INT_PREVIOUSPC,
CPUINFO_INT_INPUT_STATE,
CPUINFO_INT_INPUT_STATE_LAST = CPUINFO_INT_INPUT_STATE + MAX_INPUT_LINES - 1,
CPUINFO_INT_OUTPUT_STATE,
CPUINFO_INT_OUTPUT_STATE_LAST = CPUINFO_INT_OUTPUT_STATE + MAX_OUTPUT_LINES - 1,
CPUINFO_INT_REGISTER,
CPUINFO_INT_REGISTER_LAST = CPUINFO_INT_REGISTER + MAX_REGS - 1,
CPUINFO_INT_CPU_SPECIFIC = 0x08000,
CPUINFO_PTR_FIRST = 0x10000,
CPUINFO_PTR_SET_INFO = CPUINFO_PTR_FIRST,
CPUINFO_PTR_GET_CONTEXT,
CPUINFO_PTR_SET_CONTEXT,
CPUINFO_PTR_INIT,
CPUINFO_PTR_RESET,
CPUINFO_PTR_EXIT,
CPUINFO_PTR_EXECUTE,
CPUINFO_PTR_BURN,
CPUINFO_PTR_DISASSEMBLE,
CPUINFO_PTR_IRQ_CALLBACK,
CPUINFO_PTR_INSTRUCTION_COUNTER,
CPUINFO_PTR_REGISTER_LAYOUT,
CPUINFO_PTR_WINDOW_LAYOUT,
CPUINFO_PTR_INTERNAL_MEMORY_MAP,
CPUINFO_PTR_INTERNAL_MEMORY_MAP_LAST = CPUINFO_PTR_INTERNAL_MEMORY_MAP + ADDRESS_SPACES - 1,
CPUINFO_PTR_DEBUG_REGISTER_LIST,
CPUINFO_PTR_CPU_SPECIFIC = 0x18000,
CPUINFO_STR_FIRST = 0x20000,
CPUINFO_STR_NAME = CPUINFO_STR_FIRST,
CPUINFO_STR_CORE_FAMILY,
CPUINFO_STR_CORE_VERSION,
CPUINFO_STR_CORE_FILE,
CPUINFO_STR_CORE_CREDITS,
CPUINFO_STR_FLAGS,
CPUINFO_STR_REGISTER,
CPUINFO_STR_REGISTER_LAST = CPUINFO_STR_REGISTER + MAX_REGS - 1,
CPUINFO_STR_CPU_SPECIFIC = 0x28000
};
#endif