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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
|
/***************************************************************************
cpuintrf.h
Core CPU interface functions and definitions.
Copyright Nicola Salmoria and the MAME Team.
Visit http://mamedev.org for licensing and usage restrictions.
***************************************************************************/
#pragma once
#ifndef __EMU_H__
#error Dont include this file directly; include emu.h instead.
#endif
#ifndef __CPUINTRF_H__
#define __CPUINTRF_H__
/***************************************************************************
CONSTANTS
***************************************************************************/
#define MAX_INPUT_EVENTS 32
/* alternate address space names for common use */
enum
{
ADDRESS_SPACE_PROGRAM = ADDRESS_SPACE_0, /* program address space */
ADDRESS_SPACE_DATA = ADDRESS_SPACE_1, /* data address space */
ADDRESS_SPACE_IO = ADDRESS_SPACE_2 /* I/O address space */
};
/* I/O line states */
enum
{
CLEAR_LINE = 0, /* clear (a fired or held) line */
ASSERT_LINE, /* assert an interrupt immediately */
HOLD_LINE, /* hold interrupt line until acknowledged */
PULSE_LINE /* pulse interrupt line instantaneously (only for NMI, RESET) */
};
/* I/O line definitions */
enum
{
/* input lines */
MAX_INPUT_LINES = 32+3,
INPUT_LINE_IRQ0 = 0,
INPUT_LINE_IRQ1 = 1,
INPUT_LINE_IRQ2 = 2,
INPUT_LINE_IRQ3 = 3,
INPUT_LINE_IRQ4 = 4,
INPUT_LINE_IRQ5 = 5,
INPUT_LINE_IRQ6 = 6,
INPUT_LINE_IRQ7 = 7,
INPUT_LINE_IRQ8 = 8,
INPUT_LINE_IRQ9 = 9,
INPUT_LINE_NMI = MAX_INPUT_LINES - 3,
/* special input lines that are implemented in the core */
INPUT_LINE_RESET = MAX_INPUT_LINES - 2,
INPUT_LINE_HALT = MAX_INPUT_LINES - 1,
/* output lines */
MAX_OUTPUT_LINES = 32
};
/* register definitions */
enum
{
MAX_REGS = 256,
REG_GENPCBASE = MAX_REGS - 1, /* generic "base" PC, should point to start of current opcode */
REG_GENPC = MAX_REGS - 2, /* generic PC, may point within an opcode */
REG_GENSP = MAX_REGS - 3 /* generic SP, or closest equivalent */
};
/* CPU information constants */
enum
{
/* --- the following bits of info are returned as 64-bit signed integers --- */
CPUINFO_INT_FIRST = DEVINFO_INT_FIRST,
/* useful aliases */
CPUINFO_INT_DATABUS_WIDTH_PROGRAM = DEVINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM,
CPUINFO_INT_DATABUS_WIDTH_DATA = DEVINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA,
CPUINFO_INT_DATABUS_WIDTH_IO = DEVINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO,
CPUINFO_INT_ADDRBUS_WIDTH_PROGRAM = DEVINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM,
CPUINFO_INT_ADDRBUS_WIDTH_DATA = DEVINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA,
CPUINFO_INT_ADDRBUS_WIDTH_IO = DEVINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO,
CPUINFO_INT_ADDRBUS_SHIFT_PROGRAM = DEVINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM,
CPUINFO_INT_ADDRBUS_SHIFT_DATA = DEVINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA,
CPUINFO_INT_ADDRBUS_SHIFT_IO = DEVINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO,
/* CPU-specific additions */
CPUINFO_INT_CONTEXT_SIZE = DEVINFO_INT_CLASS_SPECIFIC, /* R/O: size of CPU context in bytes */
CPUINFO_INT_INPUT_LINES, /* R/O: number of input lines */
CPUINFO_INT_OUTPUT_LINES, /* R/O: number of output lines */
CPUINFO_INT_DEFAULT_IRQ_VECTOR, /* R/O: default IRQ vector */
CPUINFO_INT_CLOCK_MULTIPLIER, /* R/O: internal clock multiplier */
CPUINFO_INT_CLOCK_DIVIDER, /* R/O: internal clock divider */
CPUINFO_INT_MIN_INSTRUCTION_BYTES, /* R/O: minimum bytes per instruction */
CPUINFO_INT_MAX_INSTRUCTION_BYTES, /* R/O: maximum bytes per instruction */
CPUINFO_INT_MIN_CYCLES, /* R/O: minimum cycles for a single instruction */
CPUINFO_INT_MAX_CYCLES, /* R/O: maximum cycles for a single instruction */
CPUINFO_INT_LOGADDR_WIDTH, /* R/O: address bus size for logical accesses in each space (0=same as physical) */
CPUINFO_INT_LOGADDR_WIDTH_PROGRAM = CPUINFO_INT_LOGADDR_WIDTH + ADDRESS_SPACE_PROGRAM,
CPUINFO_INT_LOGADDR_WIDTH_DATA = CPUINFO_INT_LOGADDR_WIDTH + ADDRESS_SPACE_DATA,
CPUINFO_INT_LOGADDR_WIDTH_IO = CPUINFO_INT_LOGADDR_WIDTH + ADDRESS_SPACE_IO,
CPUINFO_INT_LOGADDR_WIDTH_LAST = CPUINFO_INT_LOGADDR_WIDTH + ADDRESS_SPACES - 1,
CPUINFO_INT_PAGE_SHIFT, /* R/O: size of a page log 2 (i.e., 12=4096), or 0 if paging not supported */
CPUINFO_INT_PAGE_SHIFT_PROGRAM = CPUINFO_INT_PAGE_SHIFT + ADDRESS_SPACE_PROGRAM,
CPUINFO_INT_PAGE_SHIFT_DATA = CPUINFO_INT_PAGE_SHIFT + ADDRESS_SPACE_DATA,
CPUINFO_INT_PAGE_SHIFT_IO = CPUINFO_INT_PAGE_SHIFT + ADDRESS_SPACE_IO,
CPUINFO_INT_PAGE_SHIFT_LAST = CPUINFO_INT_PAGE_SHIFT + ADDRESS_SPACES - 1,
CPUINFO_INT_INPUT_STATE, /* R/W: states for each input line */
CPUINFO_INT_INPUT_STATE_LAST = CPUINFO_INT_INPUT_STATE + MAX_INPUT_LINES - 1,
CPUINFO_INT_OUTPUT_STATE, /* R/W: states for each output line */
CPUINFO_INT_OUTPUT_STATE_LAST = CPUINFO_INT_OUTPUT_STATE + MAX_OUTPUT_LINES - 1,
CPUINFO_INT_REGISTER, /* R/W: values of up to MAX_REGs registers */
CPUINFO_INT_SP = CPUINFO_INT_REGISTER + REG_GENSP, /* R/W: the current stack pointer value */
CPUINFO_INT_PC = CPUINFO_INT_REGISTER + REG_GENPC, /* R/W: the current PC value */
CPUINFO_INT_PREVIOUSPC = CPUINFO_INT_REGISTER + REG_GENPCBASE, /* R/W: the previous PC value */
CPUINFO_INT_REGISTER_LAST = CPUINFO_INT_REGISTER + MAX_REGS - 1,
CPUINFO_INT_CPU_SPECIFIC = 0x08000, /* R/W: CPU-specific values start here */
/* --- the following bits of info are returned as pointers to data or functions --- */
CPUINFO_PTR_FIRST = DEVINFO_PTR_FIRST,
/* useful aliases */
CPUINFO_PTR_INTERNAL_MEMORY_MAP_PROGRAM = DEVINFO_PTR_INTERNAL_MEMORY_MAP + ADDRESS_SPACE_PROGRAM,
CPUINFO_PTR_INTERNAL_MEMORY_MAP_DATA = DEVINFO_PTR_INTERNAL_MEMORY_MAP + ADDRESS_SPACE_DATA,
CPUINFO_PTR_INTERNAL_MEMORY_MAP_IO = DEVINFO_PTR_INTERNAL_MEMORY_MAP + ADDRESS_SPACE_IO,
/* CPU-specific additions */
CPUINFO_PTR_INSTRUCTION_COUNTER = DEVINFO_PTR_CLASS_SPECIFIC,
/* R/O: int *icount */
CPUINFO_PTR_STATE_TABLE, /* R/O: cpu_state_table *state */
CPUINFO_PTR_CPU_SPECIFIC = DEVINFO_PTR_DEVICE_SPECIFIC, /* R/W: CPU-specific values start here */
/* --- the following bits of info are returned as pointers to functions --- */
CPUINFO_FCT_FIRST = DEVINFO_FCT_FIRST,
/* CPU-specific additions */
CPUINFO_FCT_SET_INFO = DEVINFO_FCT_CLASS_SPECIFIC, /* R/O: void (*set_info)(const device_config *device, UINT32 state, INT64 data, void *ptr) */
CPUINFO_FCT_INIT, /* R/O: void (*init)(const device_config *device, int index, int clock, int (*irqcallback)(const device_config *device, int)) */
CPUINFO_FCT_RESET, /* R/O: void (*reset)(const device_config *device) */
CPUINFO_FCT_EXIT, /* R/O: void (*exit)(const device_config *device) */
CPUINFO_FCT_EXECUTE, /* R/O: int (*execute)(const device_config *device, int cycles) */
CPUINFO_FCT_BURN, /* R/O: void (*burn)(const device_config *device, int cycles) */
CPUINFO_FCT_DISASSEMBLE, /* R/O: offs_t (*disassemble)(const device_config *device, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, int options) */
CPUINFO_FCT_TRANSLATE, /* R/O: int (*translate)(const device_config *device, int space, int intention, offs_t *address) */
CPUINFO_FCT_READ, /* R/O: int (*read)(const device_config *device, int space, UINT32 offset, int size, UINT64 *value) */
CPUINFO_FCT_WRITE, /* R/O: int (*write)(const device_config *device, int space, UINT32 offset, int size, UINT64 value) */
CPUINFO_FCT_READOP, /* R/O: int (*readop)(const device_config *device, UINT32 offset, int size, UINT64 *value) */
CPUINFO_FCT_DEBUG_INIT, /* R/O: void (*debug_init)(const device_config *device) */
CPUINFO_FCT_VALIDITY_CHECK, /* R/O: int (*validity_check)(const game_driver *driver, const void *config) */
CPUINFO_FCT_IMPORT_STATE, /* R/O: void (*import_state)(const device_config *device, void *baseptr, const cpu_state_entry *entry) */
CPUINFO_FCT_EXPORT_STATE, /* R/O: void (*export_state)(const device_config *device, void *baseptr, const cpu_state_entry *entry) */
CPUINFO_FCT_IMPORT_STRING, /* R/O: void (*import_string)(const device_config *device, void *baseptr, const cpu_state_entry *entry, const char *format, char *string) */
CPUINFO_FCT_EXPORT_STRING, /* R/O: void (*export_string)(const device_config *device, void *baseptr, const cpu_state_entry *entry, const char *format, char *string) */
CPUINFO_FCT_CPU_SPECIFIC = DEVINFO_FCT_DEVICE_SPECIFIC, /* R/W: CPU-specific values start here */
/* --- the following bits of info are returned as NULL-terminated strings --- */
CPUINFO_STR_FIRST = DEVINFO_STR_FIRST,
/* CPU-specific additions */
CPUINFO_STR_FLAGS = DEVINFO_STR_CLASS_SPECIFIC, /* R/O: string representation of the main flags value */
CPUINFO_STR_REGISTER, /* R/O: string representation of up to MAX_REGs registers */
CPUINFO_STR_REGISTER_LAST = CPUINFO_STR_REGISTER + MAX_REGS - 1,
CPUINFO_STR_CPU_SPECIFIC = DEVINFO_STR_DEVICE_SPECIFIC /* R/W: CPU-specific values start here */
};
/* Translation intentions */
#define TRANSLATE_TYPE_MASK 0x03 /* read write or fetch */
#define TRANSLATE_USER_MASK 0x04 /* user mode or fully privileged */
#define TRANSLATE_DEBUG_MASK 0x08 /* debug mode (no side effects) */
#define TRANSLATE_READ 0 /* translate for read */
#define TRANSLATE_WRITE 1 /* translate for write */
#define TRANSLATE_FETCH 2 /* translate for instruction fetch */
#define TRANSLATE_READ_USER (TRANSLATE_READ | TRANSLATE_USER_MASK)
#define TRANSLATE_WRITE_USER (TRANSLATE_WRITE | TRANSLATE_USER_MASK)
#define TRANSLATE_FETCH_USER (TRANSLATE_FETCH | TRANSLATE_USER_MASK)
#define TRANSLATE_READ_DEBUG (TRANSLATE_READ | TRANSLATE_DEBUG_MASK)
#define TRANSLATE_WRITE_DEBUG (TRANSLATE_WRITE | TRANSLATE_DEBUG_MASK)
#define TRANSLATE_FETCH_DEBUG (TRANSLATE_FETCH | TRANSLATE_DEBUG_MASK)
/* Disassembler constants */
#define DASMFLAG_SUPPORTED 0x80000000 /* are disassembly flags supported? */
#define DASMFLAG_STEP_OUT 0x40000000 /* this instruction should be the end of a step out sequence */
#define DASMFLAG_STEP_OVER 0x20000000 /* this instruction should be stepped over by setting a breakpoint afterwards */
#define DASMFLAG_OVERINSTMASK 0x18000000 /* number of extra instructions to skip when stepping over */
#define DASMFLAG_OVERINSTSHIFT 27 /* bits to shift after masking to get the value */
#define DASMFLAG_LENGTHMASK 0x0000ffff /* the low 16-bits contain the actual length */
#define DASMFLAG_STEP_OVER_EXTRA(x) ((x) << DASMFLAG_OVERINSTSHIFT)
/* state table flags */
#define CPUSTATE_NOSHOW 0x01 /* don't display this entry in the registers view */
#define CPUSTATE_IMPORT 0x02 /* call the import function after writing new data */
#define CPUSTATE_IMPORT_SEXT 0x04 /* sign-extend the data when writing new data */
#define CPUSTATE_EXPORT 0x08 /* call the export function prior to fetching the data */
/***************************************************************************
MACROS
***************************************************************************/
/* device iteration helpers */
#define cpu_count(config) device_list_items(&(config)->devicelist, CPU)
#define cpu_first(config) device_list_first(&(config)->devicelist, CPU)
#define cpu_next(previous) ((previous)->typenext)
#define cpu_get_index(cpu) device_list_index(&(cpu)->machine->config->devicelist, CPU, (cpu)->tag)
/* IRQ callback to be called by CPU cores when an IRQ is actually taken */
#define IRQ_CALLBACK(func) int func(const device_config *device, int irqline)
/* CPU interface functions */
#define CPU_GET_INFO_NAME(name) cpu_get_info_##name
#define CPU_GET_INFO(name) void CPU_GET_INFO_NAME(name)(const device_config *device, UINT32 state, cpuinfo *info)
#define CPU_GET_INFO_CALL(name) CPU_GET_INFO_NAME(name)(device, state, info)
#define CPU_SET_INFO_NAME(name) cpu_set_info_##name
#define CPU_SET_INFO(name) void CPU_SET_INFO_NAME(name)(const device_config *device, UINT32 state, cpuinfo *info)
#define CPU_SET_INFO_CALL(name) CPU_SET_INFO_NAME(name)(device, state, info)
#define CPU_INIT_NAME(name) cpu_init_##name
#define CPU_INIT(name) void CPU_INIT_NAME(name)(const device_config *device, cpu_irq_callback irqcallback)
#define CPU_INIT_CALL(name) CPU_INIT_NAME(name)(device, irqcallback)
#define CPU_RESET_NAME(name) cpu_reset_##name
#define CPU_RESET(name) void CPU_RESET_NAME(name)(const device_config *device)
#define CPU_RESET_CALL(name) CPU_RESET_NAME(name)(device)
#define CPU_EXIT_NAME(name) cpu_exit_##name
#define CPU_EXIT(name) void CPU_EXIT_NAME(name)(const device_config *device)
#define CPU_EXIT_CALL(name) CPU_EXIT_NAME(name)(device)
#define CPU_EXECUTE_NAME(name) cpu_execute_##name
#define CPU_EXECUTE(name) int CPU_EXECUTE_NAME(name)(const device_config *device, int cycles)
#define CPU_EXECUTE_CALL(name) CPU_EXECUTE_NAME(name)(device, cycles)
#define CPU_BURN_NAME(name) cpu_burn_##name
#define CPU_BURN(name) void CPU_BURN_NAME(name)(const device_config *device, int cycles)
#define CPU_BURN_CALL(name) CPU_BURN_NAME(name)(device, cycles)
#define CPU_TRANSLATE_NAME(name) cpu_translate_##name
#define CPU_TRANSLATE(name) int CPU_TRANSLATE_NAME(name)(const device_config *device, int space, int intention, offs_t *address)
#define CPU_TRANSLATE_CALL(name) CPU_TRANSLATE_NAME(name)(device, space, intention, address)
#define CPU_READ_NAME(name) cpu_read_##name
#define CPU_READ(name) int CPU_READ_NAME(name)(const device_config *device, int space, UINT32 offset, int size, UINT64 *value)
#define CPU_READ_CALL(name) CPU_READ_NAME(name)(device, space, offset, size, value)
#define CPU_WRITE_NAME(name) cpu_write_##name
#define CPU_WRITE(name) int CPU_WRITE_NAME(name)(const device_config *device, int space, UINT32 offset, int size, UINT64 value)
#define CPU_WRITE_CALL(name) CPU_WRITE_NAME(name)(device, space, offset, size, value)
#define CPU_READOP_NAME(name) cpu_readop_##name
#define CPU_READOP(name) int CPU_READOP_NAME(name)(const device_config *device, UINT32 offset, int size, UINT64 *value)
#define CPU_READOP_CALL(name) CPU_READOP_NAME(name)(device, offset, size, value)
#define CPU_DEBUG_INIT_NAME(name) cpu_debug_init_##name
#define CPU_DEBUG_INIT(name) void CPU_DEBUG_INIT_NAME(name)(const device_config *device)
#define CPU_DEBUG_INIT_CALL(name) CPU_DEBUG_INIT_NAME(name)(device)
#define CPU_DISASSEMBLE_NAME(name) cpu_disassemble_##name
#define CPU_DISASSEMBLE(name) offs_t CPU_DISASSEMBLE_NAME(name)(const device_config *device, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, int options)
#define CPU_DISASSEMBLE_CALL(name) CPU_DISASSEMBLE_NAME(name)(device, buffer, pc, oprom, opram, options)
#define CPU_VALIDITY_CHECK_NAME(name) cpu_validity_check_##name
#define CPU_VALIDITY_CHECK(name) int CPU_VALIDITY_CHECK_NAME(name)(const game_driver *driver, const void *config)
#define CPU_VALIDITY_CHECK_CALL(name) CPU_VALIDITY_CHECK_NAME(name)(driver, config)
#define CPU_IMPORT_STATE_NAME(name) cpu_state_import_##name
#define CPU_IMPORT_STATE(name) void CPU_IMPORT_STATE_NAME(name)(const device_config *device, void *baseptr, const cpu_state_entry *entry)
#define CPU_IMPORT_STATE_CALL(name) CPU_IMPORT_STATE_NAME(name)(device, baseptr, entry)
#define CPU_EXPORT_STATE_NAME(name) cpu_state_export_##name
#define CPU_EXPORT_STATE(name) void CPU_EXPORT_STATE_NAME(name)(const device_config *device, void *baseptr, const cpu_state_entry *entry)
#define CPU_EXPORT_STATE_CALL(name) CPU_EXPORT_STATE_NAME(name)(device, baseptr, entry)
#define CPU_IMPORT_STRING_NAME(name) cpu_string_import_##name
#define CPU_IMPORT_STRING(name) void CPU_IMPORT_STRING_NAME(name)(const device_config *device, void *baseptr, const cpu_state_entry *entry, char *string)
#define CPU_IMPORT_STRING_CALL(name) CPU_IMPORT_STRING_NAME(name)(device, baseptr, entry, string)
#define CPU_EXPORT_STRING_NAME(name) cpu_string_export_##name
#define CPU_EXPORT_STRING(name) void CPU_EXPORT_STRING_NAME(name)(const device_config *device, void *baseptr, const cpu_state_entry *entry, char *string)
#define CPU_EXPORT_STRING_CALL(name) CPU_EXPORT_STRING_NAME(name)(device, baseptr, entry, string)
/* base macro for defining CPU state entries */
#define CPU_STATE_ENTRY(_index, _symbol, _format, _struct, _member, _datamask, _validmask, _flags) \
{ _index, _validmask, offsetof(_struct, _member), _datamask, sizeof(((_struct *)0)->_member), _flags, _symbol, _format },
/* helpers for accessing common CPU state */
#define cpu_get_context_size(cpu) device_get_info_int(cpu, CPUINFO_INT_CONTEXT_SIZE)
#define cpu_get_input_lines(cpu) device_get_info_int(cpu, CPUINFO_INT_INPUT_LINES)
#define cpu_get_output_lines(cpu) device_get_info_int(cpu, CPUINFO_INT_OUTPUT_LINES)
#define cpu_get_default_irq_vector(cpu) device_get_info_int(cpu, CPUINFO_INT_DEFAULT_IRQ_VECTOR)
#define cpu_get_clock_multiplier(cpu) device_get_info_int(cpu, CPUINFO_INT_CLOCK_MULTIPLIER)
#define cpu_get_clock_divider(cpu) device_get_info_int(cpu, CPUINFO_INT_CLOCK_DIVIDER)
#define cpu_get_min_opcode_bytes(cpu) device_get_info_int(cpu, CPUINFO_INT_MIN_INSTRUCTION_BYTES)
#define cpu_get_max_opcode_bytes(cpu) device_get_info_int(cpu, CPUINFO_INT_MAX_INSTRUCTION_BYTES)
#define cpu_get_min_cycles(cpu) device_get_info_int(cpu, CPUINFO_INT_MIN_CYCLES)
#define cpu_get_max_cycles(cpu) device_get_info_int(cpu, CPUINFO_INT_MAX_CYCLES)
#define cpu_get_logaddr_width(cpu, space) device_get_info_int(cpu, CPUINFO_INT_LOGADDR_WIDTH + (space))
#define cpu_get_page_shift(cpu, space) device_get_info_int(cpu, CPUINFO_INT_PAGE_SHIFT + (space))
#define cpu_get_reg(cpu, reg) device_get_info_int(cpu, CPUINFO_INT_REGISTER + (reg))
#define cpu_get_previouspc(cpu) ((offs_t)cpu_get_reg(cpu, REG_GENPCBASE))
#define cpu_get_pc(cpu) ((offs_t)cpu_get_reg(cpu, REG_GENPC))
#define cpu_get_sp(cpu) cpu_get_reg(cpu, REG_GENSP)
#define cpu_get_icount_ptr(cpu) (int *)device_get_info_ptr(cpu, CPUINFO_PTR_INSTRUCTION_COUNTER)
#define cpu_get_state_table(cpu) (const cpu_state_table *)device_get_info_ptr(cpu, CPUINFO_PTR_STATE_TABLE)
#define cpu_get_flags_string(cpu) device_get_info_string(cpu, CPUINFO_STR_FLAGS)
#define cpu_get_irq_string(cpu, irq) device_get_info_string(cpu, CPUINFO_STR_IRQ_STATE + (irq))
#define cpu_get_reg_string(cpu, reg) device_get_info_string(cpu, CPUINFO_STR_REGISTER + (reg))
#define cpu_set_reg(cpu, reg, val) cpu_set_info(cpu, CPUINFO_INT_REGISTER + (reg), (val))
/* helpers that map directly to device helpers */
#define cpu_get_endianness(cpu) device_get_endianness(cpu)
#define cpu_get_databus_width(cpu, space) device_get_databus_width(cpu, space)
#define cpu_get_addrbus_width(cpu, space) device_get_addrbus_width(cpu, space)
#define cpu_get_addrbus_shift(cpu, space) device_get_addrbus_shift(cpu, space)
#define cpu_get_name(cpu) device_get_name(cpu)
#define cpu_get_core_family(cpu) device_get_family(cpu)
#define cpu_get_core_version(cpu) device_get_version(cpu)
#define cpu_get_core_file(cpu) device_get_source_file(cpu)
#define cpu_get_core_credits(cpu) device_get_credits(cpu)
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
/* forward declaration of types */
typedef union _cpuinfo cpuinfo;
typedef struct _cpu_state_entry cpu_state_entry;
/* IRQ callback to be called by CPU cores when an IRQ is actually taken */
typedef int (*cpu_irq_callback)(const device_config *device, int irqnum);
/* CPU interface functions */
typedef void (*cpu_get_info_func)(const device_config *device, UINT32 state, cpuinfo *info);
typedef void (*cpu_set_info_func)(const device_config *device, UINT32 state, cpuinfo *info);
typedef void (*cpu_init_func)(const device_config *device, cpu_irq_callback irqcallback);
typedef void (*cpu_reset_func)(const device_config *device);
typedef void (*cpu_exit_func)(const device_config *device);
typedef int (*cpu_execute_func)(const device_config *device, int cycles);
typedef void (*cpu_burn_func)(const device_config *device, int cycles);
typedef int (*cpu_translate_func)(const device_config *device, int space, int intention, offs_t *address);
typedef int (*cpu_read_func)(const device_config *device, int space, UINT32 offset, int size, UINT64 *value);
typedef int (*cpu_write_func)(const device_config *device, int space, UINT32 offset, int size, UINT64 value);
typedef int (*cpu_readop_func)(const device_config *device, UINT32 offset, int size, UINT64 *value);
typedef void (*cpu_debug_init_func)(const device_config *device);
typedef offs_t (*cpu_disassemble_func)(const device_config *device, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, int options);
typedef int (*cpu_validity_check_func)(const game_driver *driver, const void *config);
typedef void (*cpu_state_io_func)(const device_config *device, void *baseptr, const cpu_state_entry *entry);
typedef void (*cpu_string_io_func)(const device_config *device, void *baseptr, const cpu_state_entry *entry, char *string);
/* a cpu_type is just a pointer to the CPU's get_info function */
typedef cpu_get_info_func cpu_type;
/* structure describing a single item of exposed CPU state */
struct _cpu_state_entry
{
UINT32 index; /* state index this entry applies to */
UINT32 validmask; /* mask for which CPU subtypes this entry is valid */
FPTR dataoffs; /* offset to the data, relative to the baseptr */
UINT64 mask; /* mask applied to the data */
UINT8 datasize; /* size of the data item in memory */
UINT8 flags; /* flags */
const char * symbol; /* symbol for display; all lower-case version for expressions */
const char * format; /* supported formats */
};
/* structure describing a table of exposed CPU state */
typedef struct _cpu_state_table cpu_state_table;
struct _cpu_state_table
{
void * baseptr; /* pointer to the base of state (offsets are relative to this) */
UINT32 subtypemask; /* mask of subtypes that apply to this CPU */
UINT32 entrycount; /* number of entries */
const cpu_state_entry * entrylist; /* array of entries */
};
/* cpuinfo union used to pass data to/from the get_info/set_info functions */
union _cpuinfo
{
INT64 i; /* generic integers */
void * p; /* generic pointers */
genf * f; /* generic function pointers */
char * s; /* generic strings */
cpu_set_info_func setinfo; /* CPUINFO_FCT_SET_INFO */
cpu_init_func init; /* CPUINFO_FCT_INIT */
cpu_reset_func reset; /* CPUINFO_FCT_RESET */
cpu_exit_func exit; /* CPUINFO_FCT_EXIT */
cpu_execute_func execute; /* CPUINFO_FCT_EXECUTE */
cpu_burn_func burn; /* CPUINFO_FCT_BURN */
cpu_translate_func translate; /* CPUINFO_FCT_TRANSLATE */
cpu_read_func read; /* CPUINFO_FCT_READ */
cpu_write_func write; /* CPUINFO_FCT_WRITE */
cpu_readop_func readop; /* CPUINFO_FCT_READOP */
cpu_debug_init_func debug_init; /* CPUINFO_FCT_DEBUG_INIT */
cpu_disassemble_func disassemble; /* CPUINFO_FCT_DISASSEMBLE */
cpu_validity_check_func validity_check; /* CPUINFO_FCT_VALIDITY_CHECK */
cpu_state_io_func import_state; /* CPUINFO_FCT_IMPORT_STATE */
cpu_state_io_func export_state; /* CPUINFO_FCT_EXPORT_STATE */
cpu_string_io_func import_string; /* CPUINFO_FCT_IMPORT_STRING */
cpu_string_io_func export_string; /* CPUINFO_FCT_EXPORT_STRING */
int * icount; /* CPUINFO_PTR_INSTRUCTION_COUNTER */
const cpu_state_table * state_table; /* CPUINFO_PTR_STATE_TABLE */
const addrmap8_token * internal_map8; /* DEVINFO_PTR_INTERNAL_MEMORY_MAP */
const addrmap16_token * internal_map16; /* DEVINFO_PTR_INTERNAL_MEMORY_MAP */
const addrmap32_token * internal_map32; /* DEVINFO_PTR_INTERNAL_MEMORY_MAP */
const addrmap64_token * internal_map64; /* DEVINFO_PTR_INTERNAL_MEMORY_MAP */
const addrmap8_token * default_map8; /* DEVINFO_PTR_DEFAULT_MEMORY_MAP */
const addrmap16_token * default_map16; /* DEVINFO_PTR_DEFAULT_MEMORY_MAP */
const addrmap32_token * default_map32; /* DEVINFO_PTR_DEFAULT_MEMORY_MAP */
const addrmap64_token * default_map64; /* DEVINFO_PTR_DEFAULT_MEMORY_MAP */
};
void cpu_set_info(const device_config *device, UINT32 state, UINT64 value);
#endif /* __CPUINTRF_H__ */
|