1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
#ifndef M68KMAME__HEADER
#define M68KMAME__HEADER
/* ======================================================================== */
/* ============================== MAME STUFF ============================== */
/* ======================================================================== */
#include "debugger.h"
#include "m68000.h"
/* Configuration switches (see m68kconf.h for explanation) */
#define M68K_SEPARATE_READS OPT_ON
#define M68K_SIMULATE_PD_WRITES OPT_ON
#define M68K_EMULATE_INT_ACK OPT_ON
#define M68K_INT_ACK_CALLBACK(A)
#define M68K_EMULATE_BKPT_ACK OPT_OFF
#define M68K_BKPT_ACK_CALLBACK()
#define M68K_EMULATE_TRACE OPT_OFF
#define M68K_EMULATE_RESET OPT_ON
#define M68K_RESET_CALLBACK()
#define M68K_CMPILD_HAS_CALLBACK OPT_ON
#define M68K_CMPILD_CALLBACK()
#define M68K_RTE_HAS_CALLBACK OPT_ON
#define M68K_RTE_CALLBACK()
#define M68K_TAS_HAS_CALLBACK OPT_ON
#define M68K_TAS_CALLBACK()
#define M68K_EMULATE_FC OPT_OFF
#define M68K_SET_FC_CALLBACK(A)
#define M68K_MONITOR_PC OPT_SPECIFY_HANDLER
#define M68K_SET_PC_CALLBACK(A) change_pc(A)
#define M68K_INSTRUCTION_HOOK OPT_SPECIFY_HANDLER
#define M68K_INSTRUCTION_CALLBACK(A) CALL_DEBUGGER(A)
#define M68K_EMULATE_PREFETCH OPT_ON
#define M68K_LOG_ENABLE OPT_OFF
#define M68K_LOG_1010_1111 OPT_OFF
#define M68K_LOG_FILEHANDLE errorlog
#define M68K_EMULATE_ADDRESS_ERROR OPT_ON
#define M68K_USE_64_BIT OPT_OFF
#define m68ki_remaining_cycles m68k_ICount
extern struct m68k_memory_interface m68k_memory_intf;
extern offs_t m68k_encrypted_opcode_start[MAX_CPU];
extern offs_t m68k_encrypted_opcode_end[MAX_CPU];
#define m68k_read_memory_8(address) (*m68k_memory_intf.read8)(address)
#define m68k_read_memory_16(address) (*m68k_memory_intf.read16)(address)
#define m68k_read_memory_32(address) (*m68k_memory_intf.read32)(address)
#define m68k_read_immediate_16(address) (*m68k_memory_intf.readimm16)(address)
#define m68k_read_immediate_32(address) m68kx_read_immediate_32(address)
#define m68k_read_pcrelative_8(address) m68kx_read_pcrelative_8(address)
#define m68k_read_pcrelative_16(address) m68kx_read_pcrelative_16(address)
#define m68k_read_pcrelative_32(address) m68kx_read_pcrelative_32(address)
#define m68k_read_disassembler_16(address) m68k_read_immediate_16(address)
#define m68k_read_disassembler_32(address) m68kx_read_immediate_32(address)
#define m68k_write_memory_8(address, value) (*m68k_memory_intf.write8)(address, value)
#define m68k_write_memory_16(address, value) (*m68k_memory_intf.write16)(address, value)
#define m68k_write_memory_32(address, value) (*m68k_memory_intf.write32)(address, value)
#define m68k_write_memory_32_pd(address, value) m68kx_write_memory_32_pd(address, value)
INLINE unsigned int m68k_read_immediate_32(unsigned int address);
INLINE unsigned int m68k_read_pcrelative_8(unsigned int address);
INLINE unsigned int m68k_read_pcrelative_16(unsigned int address);
INLINE unsigned int m68k_read_pcrelative_32(unsigned int address);
INLINE void m68k_write_memory_32_pd(unsigned int address, unsigned int value);
INLINE unsigned int m68kx_read_immediate_32(unsigned int address)
{
return ((m68k_read_immediate_16(address) << 16) | m68k_read_immediate_16((address)+2));
}
INLINE unsigned int m68kx_read_pcrelative_8(unsigned int address)
{
if (address >= m68k_encrypted_opcode_start[cpu_getactivecpu()] &&
address < m68k_encrypted_opcode_end[cpu_getactivecpu()])
return ((m68k_read_immediate_16(address&~1)>>(8*(1-(address & 1))))&0xff);
else
return m68k_read_memory_8(address);
}
INLINE unsigned int m68kx_read_pcrelative_16(unsigned int address)
{
if (address >= m68k_encrypted_opcode_start[cpu_getactivecpu()] &&
address < m68k_encrypted_opcode_end[cpu_getactivecpu()])
return m68k_read_immediate_16(address);
else
return m68k_read_memory_16(address);
}
INLINE unsigned int m68kx_read_pcrelative_32(unsigned int address)
{
if (address >= m68k_encrypted_opcode_start[cpu_getactivecpu()] &&
address < m68k_encrypted_opcode_end[cpu_getactivecpu()])
return m68k_read_immediate_32(address);
else
return m68k_read_memory_32(address);
}
/* Special call to simulate undocumented 68k behavior when move.l with a
* predecrement destination mode is executed.
* A real 68k first writes the high word to [address+2], and then writes the
* low word to [address].
*/
INLINE void m68kx_write_memory_32_pd(unsigned int address, unsigned int value)
{
(*m68k_memory_intf.write16)(address+2, value>>16);
(*m68k_memory_intf.write16)(address, value&0xffff);
}
void m68k_set_encrypted_opcode_range(int cpunum, offs_t start, offs_t end);
/* M68K Variants */
#if HAS_M68008
#define M68K_EMULATE_008 OPT_ON
#else
#define M68K_EMULATE_008 OPT_OFF
#endif
#if HAS_M68010
#define M68K_EMULATE_010 OPT_ON
#else
#define M68K_EMULATE_010 OPT_OFF
#endif
#undef M68K_EMULATE_010
#define M68K_EMULATE_010 OPT_ON
#if HAS_M68EC020
#define M68K_EMULATE_EC020 OPT_ON
#else
#define M68K_EMULATE_EC020 OPT_OFF
#endif
#if HAS_M68020
#define M68K_EMULATE_020 OPT_ON
#else
#define M68K_EMULATE_020 OPT_OFF
#endif
#if HAS_M68040
#define M68K_EMULATE_040 OPT_ON
#else
#define M68K_EMULATE_040 OPT_OFF
#endif
/* ======================================================================== */
/* ============================== END OF FILE ============================= */
/* ======================================================================== */
#endif /* M68KMAME__HEADER */
|