mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
191 lines
4.5 KiB
C
191 lines
4.5 KiB
C
/*****************************************************************************/
|
|
/* FAME Fast and Accurate Motorola 68000 Emulation Core */
|
|
/* (c) 2005 Oscar Orallo Pelaez */
|
|
/* Version: 1.24 */
|
|
/* Date: 08-20-2005 */
|
|
/* See FAME.HTML for documentation and license information */
|
|
/*****************************************************************************/
|
|
|
|
#ifndef __FAME_H__
|
|
#define __FAME_H__
|
|
|
|
// uintptr_t
|
|
#include <stdlib.h>
|
|
#ifndef _MSC_VER
|
|
#include <stdint.h>
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// PicoDrive hacks
|
|
#define FAMEC_FETCHBITS 8
|
|
#define M68K_FETCHBANK1 (1 << FAMEC_FETCHBITS)
|
|
|
|
//#define M68K_RUNNING 0x01
|
|
#define FM68K_HALTED 0x80
|
|
//#define M68K_WAITING 0x04
|
|
//#define M68K_DISABLE 0x20
|
|
//#define M68K_FAULTED 0x40
|
|
#define FM68K_EMULATE_GROUP_0 0x02
|
|
#define FM68K_EMULATE_TRACE 0x08
|
|
#define FM68K_DO_TRACE 0x10
|
|
|
|
|
|
/************************************/
|
|
/* 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_DOUBLE_BUS_FAULT
|
|
#define M68K_DOUBLE_BUS_FAULT -1
|
|
#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
|
|
|
|
#ifndef M68K_AUTO_LOWER_IRQ
|
|
#define M68K_AUTO_LOWER_IRQ 1
|
|
#endif
|
|
#ifndef M68K_MANUAL_LOWER_IRQ
|
|
#define M68K_MANUAL_LOWER_IRQ 0
|
|
#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 */
|
|
/*******************/
|
|
|
|
#include <pico/pico_port.h>
|
|
|
|
/*
|
|
typedef unsigned char u8;
|
|
typedef signed char s8;
|
|
typedef unsigned short u16;
|
|
typedef signed short s16;
|
|
typedef unsigned int u32;
|
|
typedef signed int s32;
|
|
*/
|
|
|
|
typedef union
|
|
{
|
|
u8 B[4];
|
|
s8 SB[4];
|
|
u16 W[2];
|
|
s16 SW[2];
|
|
u32 D;
|
|
s32 SD;
|
|
} famec_union32;
|
|
|
|
/* M68K CPU CONTEXT */
|
|
typedef struct
|
|
{
|
|
unsigned int (*read_byte )(unsigned int a);
|
|
unsigned int (*read_word )(unsigned int a);
|
|
unsigned int (*read_long )(unsigned int a);
|
|
void (*write_byte)(unsigned int a,unsigned char d);
|
|
void (*write_word)(unsigned int a,unsigned short d);
|
|
void (*write_long)(unsigned int a,unsigned int d);
|
|
void (*reset_handler)(void);
|
|
void (*iack_handler)(unsigned level);
|
|
famec_union32 dreg[8];
|
|
famec_union32 areg[8];
|
|
unsigned asp;
|
|
unsigned pc;
|
|
unsigned char interrupts[8];
|
|
unsigned short sr;
|
|
unsigned short execinfo;
|
|
// PD extension
|
|
int io_cycle_counter; // cycles left
|
|
|
|
unsigned int Opcode;
|
|
signed int cycles_needed;
|
|
|
|
unsigned short *PC;
|
|
uintptr_t BasePC;
|
|
unsigned int flag_C;
|
|
unsigned int flag_V;
|
|
unsigned int flag_NotZ;
|
|
unsigned int flag_N;
|
|
unsigned int flag_X;
|
|
unsigned int flag_T;
|
|
unsigned int flag_S;
|
|
unsigned int flag_I;
|
|
|
|
unsigned char not_polling;
|
|
unsigned char pad[3];
|
|
|
|
uintptr_t Fetch[M68K_FETCHBANK1];
|
|
} M68K_CONTEXT;
|
|
|
|
typedef enum
|
|
{
|
|
fm68k_reason_emulate = 0,
|
|
fm68k_reason_init,
|
|
fm68k_reason_idle_install,
|
|
fm68k_reason_idle_remove,
|
|
} fm68k_call_reason;
|
|
|
|
/************************/
|
|
/* Function definition */
|
|
/************************/
|
|
|
|
/* General purpose functions */
|
|
void fm68k_init(void);
|
|
int fm68k_reset(M68K_CONTEXT *ctx);
|
|
int fm68k_emulate(M68K_CONTEXT *ctx, int n, fm68k_call_reason reason);
|
|
int fm68k_would_interrupt(M68K_CONTEXT *ctx); // to be called from fm68k_emulate()
|
|
|
|
u32 fm68k_get_pc(const M68K_CONTEXT *ctx);
|
|
|
|
// PICODRIVE_HACK
|
|
int fm68k_idle_install(void);
|
|
int fm68k_idle_remove(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|