pandora: fix readme and pxml version
[picodrive.git] / cpu / fame / fame.h
... / ...
CommitLineData
1/*****************************************************************************/\r
2/* FAME Fast and Accurate Motorola 68000 Emulation Core */\r
3/* (c) 2005 Oscar Orallo Pelaez */\r
4/* Version: 1.24 */\r
5/* Date: 08-20-2005 */\r
6/* See FAME.HTML for documentation and license information */\r
7/*****************************************************************************/\r
8\r
9#ifndef __FAME_H__\r
10#define __FAME_H__\r
11\r
12// uintptr_t\r
13#include <stdlib.h>\r
14#ifndef _MSC_VER\r
15#include <stdint.h>\r
16#endif\r
17\r
18#ifdef __cplusplus\r
19extern "C" {\r
20#endif\r
21\r
22// PicoDrive hacks\r
23#define FAMEC_FETCHBITS 8\r
24#define M68K_FETCHBANK1 (1 << FAMEC_FETCHBITS)\r
25\r
26//#define M68K_RUNNING 0x01\r
27#define FM68K_HALTED 0x80\r
28//#define M68K_WAITING 0x04\r
29//#define M68K_DISABLE 0x20\r
30//#define M68K_FAULTED 0x40\r
31#define FM68K_EMULATE_GROUP_0 0x02\r
32#define FM68K_EMULATE_TRACE 0x08\r
33#define FM68K_DO_TRACE 0x10\r
34\r
35\r
36/************************************/\r
37/* General library defines */\r
38/************************************/\r
39\r
40#ifndef M68K_OK\r
41 #define M68K_OK 0\r
42#endif\r
43#ifndef M68K_RUNNING\r
44 #define M68K_RUNNING 1\r
45#endif\r
46#ifndef M68K_NO_SUP_ADDR_SPACE\r
47 #define M68K_NO_SUP_ADDR_SPACE 2\r
48#endif\r
49#ifndef M68K_DOUBLE_BUS_FAULT\r
50 #define M68K_DOUBLE_BUS_FAULT -1\r
51#endif\r
52#ifndef M68K_INV_REG\r
53 #define M68K_INV_REG -1\r
54#endif\r
55\r
56/* Hardware interrupt state */\r
57\r
58#ifndef M68K_IRQ_LEVEL_ERROR\r
59 #define M68K_IRQ_LEVEL_ERROR -1\r
60#endif\r
61#ifndef M68K_IRQ_INV_PARAMS\r
62 #define M68K_IRQ_INV_PARAMS -2\r
63#endif\r
64\r
65/* Defines to specify hardware interrupt type */\r
66\r
67#ifndef M68K_AUTOVECTORED_IRQ\r
68 #define M68K_AUTOVECTORED_IRQ -1\r
69#endif\r
70#ifndef M68K_SPURIOUS_IRQ\r
71 #define M68K_SPURIOUS_IRQ -2\r
72#endif\r
73\r
74#ifndef M68K_AUTO_LOWER_IRQ\r
75 #define M68K_AUTO_LOWER_IRQ 1\r
76#endif\r
77#ifndef M68K_MANUAL_LOWER_IRQ\r
78 #define M68K_MANUAL_LOWER_IRQ 0\r
79#endif\r
80\r
81/* Defines to specify address space */\r
82\r
83#ifndef M68K_SUP_ADDR_SPACE\r
84 #define M68K_SUP_ADDR_SPACE 0\r
85#endif\r
86#ifndef M68K_USER_ADDR_SPACE\r
87 #define M68K_USER_ADDR_SPACE 2\r
88#endif\r
89#ifndef M68K_PROG_ADDR_SPACE\r
90 #define M68K_PROG_ADDR_SPACE 0\r
91#endif\r
92#ifndef M68K_DATA_ADDR_SPACE\r
93 #define M68K_DATA_ADDR_SPACE 1\r
94#endif\r
95\r
96\r
97/*******************/\r
98/* Data definition */\r
99/*******************/\r
100\r
101#include <pico/pico_port.h>\r
102\r
103/*\r
104typedef unsigned char u8;\r
105typedef signed char s8;\r
106typedef unsigned short u16;\r
107typedef signed short s16;\r
108typedef unsigned int u32;\r
109typedef signed int s32;\r
110*/\r
111\r
112typedef union\r
113{\r
114 u8 B[4];\r
115 s8 SB[4];\r
116 u16 W[2];\r
117 s16 SW[2];\r
118 u32 D;\r
119 s32 SD;\r
120} famec_union32;\r
121\r
122/* M68K CPU CONTEXT */\r
123typedef struct\r
124{\r
125 unsigned int (*read_byte )(unsigned int a);\r
126 unsigned int (*read_word )(unsigned int a);\r
127 unsigned int (*read_long )(unsigned int a);\r
128 void (*write_byte)(unsigned int a,unsigned char d);\r
129 void (*write_word)(unsigned int a,unsigned short d);\r
130 void (*write_long)(unsigned int a,unsigned int d);\r
131 void (*reset_handler)(void);\r
132 void (*iack_handler)(unsigned level);\r
133 famec_union32 dreg[8];\r
134 famec_union32 areg[8];\r
135 unsigned asp;\r
136 unsigned pc;\r
137 unsigned char interrupts[8];\r
138 unsigned short sr;\r
139 unsigned short execinfo;\r
140 // PD extension\r
141 int io_cycle_counter; // cycles left\r
142\r
143 unsigned int Opcode;\r
144 signed int cycles_needed;\r
145\r
146 unsigned short *PC;\r
147 uintptr_t BasePC;\r
148 unsigned int flag_C;\r
149 unsigned int flag_V;\r
150 unsigned int flag_NotZ;\r
151 unsigned int flag_N;\r
152 unsigned int flag_X;\r
153 unsigned int flag_T;\r
154 unsigned int flag_S;\r
155 unsigned int flag_I;\r
156\r
157 unsigned char not_polling;\r
158 unsigned char pad[3];\r
159\r
160 uintptr_t Fetch[M68K_FETCHBANK1];\r
161} M68K_CONTEXT;\r
162\r
163typedef enum\r
164{\r
165 fm68k_reason_emulate = 0,\r
166 fm68k_reason_init,\r
167 fm68k_reason_idle_install,\r
168 fm68k_reason_idle_remove,\r
169} fm68k_call_reason;\r
170\r
171/************************/\r
172/* Function definition */\r
173/************************/\r
174\r
175/* General purpose functions */\r
176void fm68k_init(void);\r
177int fm68k_reset(M68K_CONTEXT *ctx);\r
178int fm68k_emulate(M68K_CONTEXT *ctx, int n, fm68k_call_reason reason);\r
179int fm68k_would_interrupt(M68K_CONTEXT *ctx); // to be called from fm68k_emulate()\r
180\r
181u32 fm68k_get_pc(const M68K_CONTEXT *ctx);\r
182\r
183// PICODRIVE_HACK\r
184int fm68k_idle_install(void);\r
185int fm68k_idle_remove(void);\r
186\r
187#ifdef __cplusplus\r
188}\r
189#endif\r
190\r
191#endif\r