MCUME/MCUME_teensy41/teensycastaway/fame.h

191 wiersze
4.3 KiB
C

/******************************************************************************/
/* FAME Fast and Accurate Motorola 68000 Emulation Core */
/* (c) 2002 Oscar Orallo Pelaez / Daniel Lancha Garcia */
/* Version: 2.1 */
/* Date: 11-26-2006 */
/* See FAME.HTML for documentation and license information */
/******************************************************************************/
#ifndef __FAME_H__
#define __FAME_H__
#if defined(__cplusplus) && !defined(USE_FAME_CORE_C)
extern "C" {
#endif
/************************************/
/* General library defines */
/************************************/
#ifndef M68K_OK
#define M68K_OK 0
#endif
#ifndef M68K_RUNNING
#define M68K_RUNNING 1
#endif
#ifndef M68K_NO_SUP_ADDR_SPACE
#define M68K_NO_SUP_ADDR_SPACE 2
#endif
#ifndef M68K_INV_REG
#define M68K_INV_REG -1
#endif
/* Hardware interrupt state */
#ifndef M68K_IRQ_LEVEL_ERROR
#define M68K_IRQ_LEVEL_ERROR -1
#endif
#ifndef M68K_IRQ_INV_PARAMS
#define M68K_IRQ_INV_PARAMS -2
#endif
/* Defines to specify hardware interrupt type */
#ifndef M68K_AUTOVECTORED_IRQ
#define M68K_AUTOVECTORED_IRQ -1
#endif
#ifndef M68K_SPURIOUS_IRQ
#define M68K_SPURIOUS_IRQ -2
#endif
/* Defines to specify address space */
#ifndef M68K_SUP_ADDR_SPACE
#define M68K_SUP_ADDR_SPACE 0
#endif
#ifndef M68K_USER_ADDR_SPACE
#define M68K_USER_ADDR_SPACE 2
#endif
#ifndef M68K_PROG_ADDR_SPACE
#define M68K_PROG_ADDR_SPACE 0
#endif
#ifndef M68K_DATA_ADDR_SPACE
#define M68K_DATA_ADDR_SPACE 1
#endif
/*******************/
/* Data definition */
/*******************/
/* M68K registers */
typedef enum
{
M68K_REG_D0=0,
M68K_REG_D1,
M68K_REG_D2,
M68K_REG_D3,
M68K_REG_D4,
M68K_REG_D5,
M68K_REG_D6,
M68K_REG_D7,
M68K_REG_A0,
M68K_REG_A1,
M68K_REG_A2,
M68K_REG_A3,
M68K_REG_A4,
M68K_REG_A5,
M68K_REG_A6,
M68K_REG_A7,
M68K_REG_ASP,
M68K_REG_PC,
M68K_REG_SR
} m68k_register;
/* The memory blocks must be in native (Motorola) format */
typedef struct
{
unsigned low_addr;
unsigned high_addr;
unsigned offset;
} M68K_PROGRAM;
/* The memory blocks must be in native (Motorola) format */
typedef struct
{
unsigned low_addr;
unsigned high_addr;
void *mem_handler;
void *data;
} M68K_DATA;
/* M68K CPU CONTEXT */
typedef struct
{
M68K_PROGRAM *fetch;
M68K_DATA *read_byte;
M68K_DATA *read_word;
M68K_DATA *write_byte;
M68K_DATA *write_word;
M68K_PROGRAM *sv_fetch;
M68K_DATA *sv_read_byte;
M68K_DATA *sv_read_word;
M68K_DATA *sv_write_byte;
M68K_DATA *sv_write_word;
M68K_PROGRAM *user_fetch;
M68K_DATA *user_read_byte;
M68K_DATA *user_read_word;
M68K_DATA *user_write_byte;
M68K_DATA *user_write_word;
void (*reset_handler)(void);
void (*iack_handler)(unsigned level);
unsigned * icust_handler;
unsigned dreg[8];
unsigned areg[8];
unsigned asp;
unsigned pc;
unsigned cycles_counter;
unsigned char interrupts[8];
unsigned short sr;
unsigned short execinfo;
} M68K_CONTEXT;
/************************/
/* Function definition */
/************************/
/* General purpose functions */
void m68k_init(void);
unsigned m68k_reset(void);
void m68k_emulate(int n);
unsigned m68k_get_pc(void);
unsigned m68k_get_cpu_state(void);
int m68k_fetch(unsigned address, unsigned memory_space);
/* Interrupt handling functions */
int m68k_raise_irq(int level, int vector);
int m68k_lower_irq(int level);
int m68k_get_irq_vector(int level);
int m68k_change_irq_vector(int level, int vector);
/* CPU context handling functions */
int m68k_get_context_size(void);
void m68k_get_context(void *context);
void m68k_set_context(void *context);
int m68k_get_register(m68k_register reg);
int m68k_set_register(m68k_register reg, unsigned value);
/* Timing functions */
unsigned m68k_get_cycles_counter(void);
unsigned m68k_trip_cycles_counter(void);
unsigned m68k_control_cycles_counter(int n);
void m68k_release_timeslice(void);
void m68k_stop_emulating(void);
void m68k_add_cycles(int cycles);
void m68k_release_cycles(int cycles);
#if defined(__cplusplus) && !defined(USE_FAME_CORE_C)
}
#endif
#endif