1 /*****************************************************************************/
\r
2 /* FAME Fast and Accurate Motorola 68000 Emulation Core */
\r
3 /* (c) 2005 Oscar Orallo Pelaez */
\r
5 /* Date: 08-20-2005 */
\r
6 /* See FAME.HTML for documentation and license information */
\r
7 /*****************************************************************************/
\r
23 #define FAMEC_FETCHBITS 8
\r
24 #define M68K_FETCHBANK1 (1 << FAMEC_FETCHBITS)
\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
36 /************************************/
\r
37 /* General library defines */
\r
38 /************************************/
\r
43 #ifndef M68K_RUNNING
\r
44 #define M68K_RUNNING 1
\r
46 #ifndef M68K_NO_SUP_ADDR_SPACE
\r
47 #define M68K_NO_SUP_ADDR_SPACE 2
\r
49 #ifndef M68K_DOUBLE_BUS_FAULT
\r
50 #define M68K_DOUBLE_BUS_FAULT -1
\r
52 #ifndef M68K_INV_REG
\r
53 #define M68K_INV_REG -1
\r
56 /* Hardware interrupt state */
\r
58 #ifndef M68K_IRQ_LEVEL_ERROR
\r
59 #define M68K_IRQ_LEVEL_ERROR -1
\r
61 #ifndef M68K_IRQ_INV_PARAMS
\r
62 #define M68K_IRQ_INV_PARAMS -2
\r
65 /* Defines to specify hardware interrupt type */
\r
67 #ifndef M68K_AUTOVECTORED_IRQ
\r
68 #define M68K_AUTOVECTORED_IRQ -1
\r
70 #ifndef M68K_SPURIOUS_IRQ
\r
71 #define M68K_SPURIOUS_IRQ -2
\r
74 #ifndef M68K_AUTO_LOWER_IRQ
\r
75 #define M68K_AUTO_LOWER_IRQ 1
\r
77 #ifndef M68K_MANUAL_LOWER_IRQ
\r
78 #define M68K_MANUAL_LOWER_IRQ 0
\r
81 /* Defines to specify address space */
\r
83 #ifndef M68K_SUP_ADDR_SPACE
\r
84 #define M68K_SUP_ADDR_SPACE 0
\r
86 #ifndef M68K_USER_ADDR_SPACE
\r
87 #define M68K_USER_ADDR_SPACE 2
\r
89 #ifndef M68K_PROG_ADDR_SPACE
\r
90 #define M68K_PROG_ADDR_SPACE 0
\r
92 #ifndef M68K_DATA_ADDR_SPACE
\r
93 #define M68K_DATA_ADDR_SPACE 1
\r
97 /*******************/
\r
98 /* Data definition */
\r
99 /*******************/
\r
111 /* M68K CPU CONTEXT */
\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
126 unsigned char interrupts[8];
\r
128 unsigned short execinfo;
\r
130 int io_cycle_counter; // cycles left
\r
132 unsigned int Opcode;
\r
133 signed int cycles_needed;
\r
135 unsigned short *PC;
\r
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
146 unsigned char not_polling;
\r
147 unsigned char pad[3];
\r
149 uintptr_t Fetch[M68K_FETCHBANK1];
\r
154 fm68k_reason_emulate = 0,
\r
156 fm68k_reason_idle_install,
\r
157 fm68k_reason_idle_remove,
\r
158 } fm68k_call_reason;
\r
160 /************************/
\r
161 /* Function definition */
\r
162 /************************/
\r
164 /* General purpose functions */
\r
165 void fm68k_init(void);
\r
166 int fm68k_reset(M68K_CONTEXT *ctx);
\r
167 int fm68k_emulate(M68K_CONTEXT *ctx, int n, fm68k_call_reason reason);
\r
168 int fm68k_would_interrupt(M68K_CONTEXT *ctx); // to be called from fm68k_emulate()
\r
170 unsigned int fm68k_get_pc(const M68K_CONTEXT *ctx);
\r
173 int fm68k_idle_install(void);
\r
174 int fm68k_idle_remove(void);
\r