improve 64bit portability
[picodrive.git] / cpu / fame / fame.h
CommitLineData
70357ce5 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
48c9e01b 12// uintptr_t\r
13#include <stdlib.h>\r
14#ifndef _MSC_VER\r
15#include <stdint.h>\r
16#endif\r
17\r
70357ce5 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
03e4f2a3 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
70357ce5 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
70357ce5 101typedef union\r
102{\r
103 unsigned char B;\r
104 signed char SB;\r
105 unsigned short W;\r
106 signed short SW;\r
107 unsigned int D;\r
108 signed int SD;\r
109} famec_union32;\r
110\r
70357ce5 111/* M68K CPU CONTEXT */\r
112typedef struct\r
113{\r
114 unsigned int (*read_byte )(unsigned int a);\r
115 unsigned int (*read_word )(unsigned int a);\r
116 unsigned int (*read_long )(unsigned int a);\r
117 void (*write_byte)(unsigned int a,unsigned char d);\r
118 void (*write_word)(unsigned int a,unsigned short d);\r
119 void (*write_long)(unsigned int a,unsigned int d);\r
120 void (*reset_handler)(void);\r
121 void (*iack_handler)(unsigned level);\r
122 famec_union32 dreg[8];\r
123 famec_union32 areg[8];\r
124 unsigned asp;\r
125 unsigned pc;\r
126 unsigned char interrupts[8];\r
127 unsigned short sr;\r
128 unsigned short execinfo;\r
129 // PD extension\r
130 int io_cycle_counter; // cycles left\r
95049eea 131\r
132 unsigned int Opcode;\r
133 signed int cycles_needed;\r
ecc8036e 134\r
95049eea 135 unsigned short *PC;\r
48c9e01b 136 uintptr_t BasePC;\r
95049eea 137 unsigned int flag_C;\r
138 unsigned int flag_V;\r
139 unsigned int flag_NotZ;\r
140 unsigned int flag_N;\r
141 unsigned int flag_X;\r
142 unsigned int flag_T;\r
143 unsigned int flag_S;\r
144 unsigned int flag_I;\r
145\r
ecc8036e 146 unsigned char not_polling;\r
147 unsigned char pad[3];\r
148\r
48c9e01b 149 uintptr_t Fetch[M68K_FETCHBANK1];\r
70357ce5 150} M68K_CONTEXT;\r
151\r
12f23dac 152typedef enum\r
153{\r
154 fm68k_reason_emulate = 0,\r
155 fm68k_reason_init,\r
156 fm68k_reason_idle_install,\r
157 fm68k_reason_idle_remove,\r
158} fm68k_call_reason;\r
159\r
70357ce5 160/************************/\r
161/* Function definition */\r
162/************************/\r
163\r
164/* General purpose functions */\r
03e4f2a3 165void fm68k_init(void);\r
12f23dac 166int fm68k_reset(M68K_CONTEXT *ctx);\r
167int fm68k_emulate(M68K_CONTEXT *ctx, int n, fm68k_call_reason reason);\r
168int fm68k_would_interrupt(M68K_CONTEXT *ctx); // to be called from fm68k_emulate()\r
70357ce5 169\r
7669591e 170unsigned int fm68k_get_pc(const M68K_CONTEXT *ctx);\r
70357ce5 171\r
12f23dac 172// PICODRIVE_HACK\r
173int fm68k_idle_install(void);\r
174int fm68k_idle_remove(void);\r
70357ce5 175\r
176#ifdef __cplusplus\r
177}\r
178#endif\r
179\r
180#endif\r