summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/m68000/m68kmame.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/cpu/m68000/m68kmame.c')
-rw-r--r--src/emu/cpu/m68000/m68kmame.c1291
1 files changed, 1291 insertions, 0 deletions
diff --git a/src/emu/cpu/m68000/m68kmame.c b/src/emu/cpu/m68000/m68kmame.c
new file mode 100644
index 00000000000..789c821c8a7
--- /dev/null
+++ b/src/emu/cpu/m68000/m68kmame.c
@@ -0,0 +1,1291 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "m68k.h"
+#include "m68000.h"
+
+/* global access */
+
+struct m68k_memory_interface m68k_memory_intf;
+offs_t m68k_encrypted_opcode_start[MAX_CPU];
+offs_t m68k_encrypted_opcode_end[MAX_CPU];
+
+
+void m68k_set_encrypted_opcode_range(int cpunum, offs_t start, offs_t end)
+{
+ m68k_encrypted_opcode_start[cpunum] = start;
+ m68k_encrypted_opcode_end[cpunum] = end;
+}
+
+/****************************************************************************
+ * 8-bit data memory interface
+ ****************************************************************************/
+
+static UINT16 readword_d8(offs_t address)
+{
+ UINT16 result = program_read_byte_8(address) << 8;
+ return result | program_read_byte_8(address + 1);
+}
+
+static void writeword_d8(offs_t address, UINT16 data)
+{
+ program_write_byte_8(address, data >> 8);
+ program_write_byte_8(address + 1, data);
+}
+
+static UINT32 readlong_d8(offs_t address)
+{
+ UINT32 result = program_read_byte_8(address) << 24;
+ result |= program_read_byte_8(address + 1) << 16;
+ result |= program_read_byte_8(address + 2) << 8;
+ return result | program_read_byte_8(address + 3);
+}
+
+static void writelong_d8(offs_t address, UINT32 data)
+{
+ program_write_byte_8(address, data >> 24);
+ program_write_byte_8(address + 1, data >> 16);
+ program_write_byte_8(address + 2, data >> 8);
+ program_write_byte_8(address + 3, data);
+}
+
+/* interface for 20/22-bit address bus, 8-bit data bus (68008) */
+static const struct m68k_memory_interface interface_d8 =
+{
+ 0,
+ program_read_byte_8,
+ readword_d8,
+ readlong_d8,
+ program_write_byte_8,
+ writeword_d8,
+ writelong_d8
+};
+
+/****************************************************************************
+ * 16-bit data memory interface
+ ****************************************************************************/
+
+static UINT32 readlong_d16(offs_t address)
+{
+ UINT32 result = program_read_word_16be(address) << 16;
+ return result | program_read_word_16be(address + 2);
+}
+
+static void writelong_d16(offs_t address, UINT32 data)
+{
+ program_write_word_16be(address, data >> 16);
+ program_write_word_16be(address + 2, data);
+}
+
+/* interface for 24-bit address bus, 16-bit data bus (68000, 68010) */
+static const struct m68k_memory_interface interface_d16 =
+{
+ 0,
+ program_read_byte_16be,
+ program_read_word_16be,
+ readlong_d16,
+ program_write_byte_16be,
+ program_write_word_16be,
+ writelong_d16
+};
+
+/****************************************************************************
+ * 32-bit data memory interface
+ ****************************************************************************/
+
+/* potentially misaligned 16-bit reads with a 32-bit data bus (and 24-bit address bus) */
+static UINT16 readword_d32(offs_t address)
+{
+ UINT16 result;
+
+ if (!(address & 1))
+ return program_read_word_32be(address);
+ result = program_read_byte_32be(address) << 8;
+ return result | program_read_byte_32be(address + 1);
+}
+
+/* potentially misaligned 16-bit writes with a 32-bit data bus (and 24-bit address bus) */
+static void writeword_d32(offs_t address, UINT16 data)
+{
+ if (!(address & 1))
+ {
+ program_write_word_32be(address, data);
+ return;
+ }
+ program_write_byte_32be(address, data >> 8);
+ program_write_byte_32be(address + 1, data);
+}
+
+/* potentially misaligned 32-bit reads with a 32-bit data bus (and 24-bit address bus) */
+static UINT32 readlong_d32(offs_t address)
+{
+ UINT32 result;
+
+ if (!(address & 3))
+ return program_read_dword_32be(address);
+ else if (!(address & 1))
+ {
+ result = program_read_word_32be(address) << 16;
+ return result | program_read_word_32be(address + 2);
+ }
+ result = program_read_byte_32be(address) << 24;
+ result |= program_read_word_32be(address + 1) << 8;
+ return result | program_read_byte_32be(address + 3);
+}
+
+/* potentially misaligned 32-bit writes with a 32-bit data bus (and 24-bit address bus) */
+static void writelong_d32(offs_t address, UINT32 data)
+{
+ if (!(address & 3))
+ {
+ program_write_dword_32be(address, data);
+ return;
+ }
+ else if (!(address & 1))
+ {
+ program_write_word_32be(address, data >> 16);
+ program_write_word_32be(address + 2, data);
+ return;
+ }
+ program_write_byte_32be(address, data >> 24);
+ program_write_word_32be(address + 1, data >> 8);
+ program_write_byte_32be(address + 3, data);
+}
+
+/* interface for 32-bit data bus (68EC020, 68020) */
+static const struct m68k_memory_interface interface_d32 =
+{
+ WORD_XOR_BE(0),
+ program_read_byte_32be,
+ readword_d32,
+ readlong_d32,
+ program_write_byte_32be,
+ writeword_d32,
+ writelong_d32
+};
+
+
+/* global access */
+struct m68k_memory_interface m68k_memory_intf;
+
+
+static void set_irq_line(int irqline, int state)
+{
+ if (irqline == INPUT_LINE_NMI)
+ irqline = 7;
+ switch(state)
+ {
+ case CLEAR_LINE:
+ m68k_set_irq(0);
+ break;
+ case ASSERT_LINE:
+ m68k_set_irq(irqline);
+ break;
+ default:
+ m68k_set_irq(irqline);
+ break;
+ }
+}
+
+
+/****************************************************************************
+ * 68000 section
+ ****************************************************************************/
+
+static void m68000_init(int index, int clock, const void *config, int (*irqcallback)(int))
+{
+ m68k_init();
+ m68k_set_cpu_type(M68K_CPU_TYPE_68000);
+ m68k_memory_intf = interface_d16;
+ m68k_state_register("m68000", index);
+ m68k_set_int_ack_callback(irqcallback);
+}
+
+static void m68000_reset(void)
+{
+ m68k_pulse_reset();
+}
+
+static void m68000_exit(void)
+{
+ /* nothing to do */
+}
+
+static int m68000_execute(int cycles)
+{
+ return m68k_execute(cycles);
+}
+
+static void m68000_get_context(void *dst)
+{
+ m68k_get_context(dst);
+}
+
+static void m68000_set_context(void *src)
+{
+ if (m68k_memory_intf.read8 != program_read_byte_16be)
+ m68k_memory_intf = interface_d16;
+ m68k_set_context(src);
+}
+
+#ifdef MAME_DEBUG
+static offs_t m68000_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
+{
+ M68K_SET_PC_CALLBACK(pc);
+ return m68k_disassemble_raw(buffer, pc, oprom, opram, M68K_CPU_TYPE_68000);
+}
+#endif /* MAME_DEBUG */
+
+/****************************************************************************
+ * M68008 section
+ ****************************************************************************/
+#if HAS_M68008
+
+static void m68008_init(int index, int clock, const void *config, int (*irqcallback)(int))
+{
+ m68k_init();
+ m68k_set_cpu_type(M68K_CPU_TYPE_68008);
+ m68k_memory_intf = interface_d8;
+ m68k_state_register("m68008", index);
+ m68k_set_int_ack_callback(irqcallback);
+}
+
+static void m68008_reset(void)
+{
+ m68k_pulse_reset();
+}
+
+static void m68008_exit(void)
+{
+ /* nothing to do */
+}
+
+static int m68008_execute(int cycles)
+{
+ return m68k_execute(cycles);
+}
+
+static void m68008_get_context(void *dst)
+{
+ m68k_get_context(dst);
+}
+
+static void m68008_set_context(void *src)
+{
+ if (m68k_memory_intf.read8 != program_read_byte_8)
+ m68k_memory_intf = interface_d8;
+ m68k_set_context(src);
+}
+
+#ifdef MAME_DEBUG
+static offs_t m68008_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
+{
+ M68K_SET_PC_CALLBACK(pc);
+ return m68k_disassemble_raw(buffer, pc, oprom, opram, M68K_CPU_TYPE_68008);
+}
+#endif /* MAME_DEBUG */
+
+#endif
+
+/****************************************************************************
+ * M68010 section
+ ****************************************************************************/
+#if HAS_M68010
+
+void m68010_init(int index, int clock, const void *config, int (*irqcallback)(int))
+{
+ m68k_init();
+ m68k_set_cpu_type(M68K_CPU_TYPE_68010);
+ m68k_memory_intf = interface_d16;
+ m68k_state_register("m68010", index);
+ m68k_set_int_ack_callback(irqcallback);
+}
+
+#ifdef MAME_DEBUG
+static offs_t m68010_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
+{
+ M68K_SET_PC_CALLBACK(pc);
+ return m68k_disassemble_raw(buffer, pc, oprom, opram, M68K_CPU_TYPE_68010);
+}
+#endif /* MAME_DEBUG */
+
+#endif /* HAS_M68010 */
+
+/****************************************************************************
+ * M68020 section
+ ****************************************************************************/
+
+static void m68020_init(int index, int clock, const void *config, int (*irqcallback)(int))
+{
+ m68k_init();
+ m68k_set_cpu_type(M68K_CPU_TYPE_68020);
+ m68k_memory_intf = interface_d32;
+ m68k_state_register("m68020", index);
+ m68k_set_int_ack_callback(irqcallback);
+}
+
+static void m68020_reset(void)
+{
+ m68k_pulse_reset();
+}
+
+static void m68020_exit(void)
+{
+ /* nothing to do */
+}
+
+static int m68020_execute(int cycles)
+{
+ return m68k_execute(cycles);
+}
+
+static void m68020_get_context(void *dst)
+{
+ m68k_get_context(dst);
+}
+
+static void m68020_set_context(void *src)
+{
+ if (m68k_memory_intf.read8 != program_read_byte_32be)
+ m68k_memory_intf = interface_d32;
+ m68k_set_context(src);
+}
+
+#ifdef MAME_DEBUG
+static offs_t m68020_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
+{
+ M68K_SET_PC_CALLBACK(pc);
+ return m68k_disassemble_raw(buffer, pc, oprom, opram, M68K_CPU_TYPE_68020);
+}
+#endif /* MAME_DEBUG */
+
+
+/****************************************************************************
+ * M680EC20 section
+ ****************************************************************************/
+#if HAS_M68EC020
+
+static void m68ec020_init(int index, int clock, const void *config, int (*irqcallback)(int))
+{
+ m68k_init();
+ m68k_set_cpu_type(M68K_CPU_TYPE_68EC020);
+ m68k_memory_intf = interface_d32;
+ m68k_state_register("m68ec020", index);
+ m68k_set_int_ack_callback(irqcallback);
+}
+
+#ifdef MAME_DEBUG
+static offs_t m68ec020_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
+{
+ M68K_SET_PC_CALLBACK(pc);
+ return m68k_disassemble_raw(buffer, pc, oprom, opram, M68K_CPU_TYPE_68EC020);
+}
+#endif /* MAME_DEBUG */
+
+#endif /* HAS_M68EC020 */
+
+/****************************************************************************
+ * M68040 section
+ ****************************************************************************/
+#if HAS_M68040
+
+static void m68040_init(int index, int clock, const void *config, int (*irqcallback)(int))
+{
+ m68k_init();
+ m68k_set_cpu_type(M68K_CPU_TYPE_68040);
+ m68k_memory_intf = interface_d32;
+ m68k_state_register("m68040", index);
+ m68k_set_int_ack_callback(irqcallback);
+}
+
+static void m68040_reset(void)
+{
+ m68k_pulse_reset();
+}
+
+static void m68040_exit(void)
+{
+ /* nothing to do */
+}
+
+static int m68040_execute(int cycles)
+{
+ return m68k_execute(cycles);
+}
+
+static void m68040_get_context(void *dst)
+{
+ m68k_get_context(dst);
+}
+
+static void m68040_set_context(void *src)
+{
+ if (m68k_memory_intf.read8 != program_read_byte_32be)
+ m68k_memory_intf = interface_d32;
+ m68k_set_context(src);
+}
+
+#ifdef MAME_DEBUG
+static offs_t m68040_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
+{
+ M68K_SET_PC_CALLBACK(pc);
+ return m68k_disassemble_raw(buffer, pc, oprom, opram, M68K_CPU_TYPE_68040);
+}
+#endif /* MAME_DEBUG */
+
+#endif /* HAS_M68040 */
+
+/**************************************************************************
+ * Generic set_info
+ **************************************************************************/
+
+static void m68000_set_info(UINT32 state, cpuinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are set as 64-bit signed integers --- */
+ case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(0, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 1: set_irq_line(1, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 2: set_irq_line(2, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 3: set_irq_line(3, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 4: set_irq_line(4, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 5: set_irq_line(5, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 6: set_irq_line(6, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 7: set_irq_line(7, info->i); break;
+
+ case CPUINFO_INT_PC: m68k_set_reg(M68K_REG_PC, info->i&0x00ffffff); break;
+ case CPUINFO_INT_REGISTER + M68K_PC: m68k_set_reg(M68K_REG_PC, info->i); break;
+ case CPUINFO_INT_SP:
+ case CPUINFO_INT_REGISTER + M68K_SP: m68k_set_reg(M68K_REG_SP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_ISP: m68k_set_reg(M68K_REG_ISP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_USP: m68k_set_reg(M68K_REG_USP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_SR: m68k_set_reg(M68K_REG_SR, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D0: m68k_set_reg(M68K_REG_D0, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D1: m68k_set_reg(M68K_REG_D1, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D2: m68k_set_reg(M68K_REG_D2, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D3: m68k_set_reg(M68K_REG_D3, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D4: m68k_set_reg(M68K_REG_D4, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D5: m68k_set_reg(M68K_REG_D5, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D6: m68k_set_reg(M68K_REG_D6, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D7: m68k_set_reg(M68K_REG_D7, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A0: m68k_set_reg(M68K_REG_A0, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A1: m68k_set_reg(M68K_REG_A1, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A2: m68k_set_reg(M68K_REG_A2, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A3: m68k_set_reg(M68K_REG_A3, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A4: m68k_set_reg(M68K_REG_A4, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A5: m68k_set_reg(M68K_REG_A5, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A6: m68k_set_reg(M68K_REG_A6, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A7: m68k_set_reg(M68K_REG_A7, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_ADDR: m68k_set_reg(M68K_REG_PREF_ADDR, info->i); break;
+
+ /* --- the following bits of info are set as pointers to data or functions --- */
+ case CPUINFO_PTR_M68K_RESET_CALLBACK: m68k_set_reset_instr_callback(info->f); break;
+ case CPUINFO_PTR_M68K_CMPILD_CALLBACK: m68k_set_cmpild_instr_callback((void (*)(unsigned int,int))(info->f)); break;
+ case CPUINFO_PTR_M68K_RTE_CALLBACK: m68k_set_rte_instr_callback(info->f); break;
+ case CPUINFO_PTR_M68K_TAS_CALLBACK: m68k_set_tas_instr_callback((int (*)(void))(info->f)); break;
+ }
+}
+
+/**************************************************************************
+ * Generic get_info
+ **************************************************************************/
+
+void m68000_get_info(UINT32 state, cpuinfo *info)
+{
+ int sr;
+
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ case CPUINFO_INT_CONTEXT_SIZE: info->i = m68k_get_context(NULL); break;
+ case CPUINFO_INT_INPUT_LINES: info->i = 8; break;
+ case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = -1; break;
+ case CPUINFO_INT_ENDIANNESS: info->i = CPU_IS_BE; break;
+ case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
+ case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 2; break;
+ case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 10; break;
+ case CPUINFO_INT_MIN_CYCLES: info->i = 4; break;
+ case CPUINFO_INT_MAX_CYCLES: info->i = 158; break;
+
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 16; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 24; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break;
+
+ case CPUINFO_INT_INPUT_STATE + 0: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 1: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 2: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 3: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 4: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 5: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 6: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 7: info->i = 0; /* fix me */ break;
+
+ case CPUINFO_INT_PREVIOUSPC: info->i = m68k_get_reg(NULL, M68K_REG_PPC); break;
+
+ case CPUINFO_INT_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC)&0x00ffffff; break;
+ case CPUINFO_INT_REGISTER + M68K_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC); break;
+ case CPUINFO_INT_SP:
+ case CPUINFO_INT_REGISTER + M68K_SP: info->i = m68k_get_reg(NULL, M68K_REG_SP); break;
+ case CPUINFO_INT_REGISTER + M68K_ISP: info->i = m68k_get_reg(NULL, M68K_REG_ISP); break;
+ case CPUINFO_INT_REGISTER + M68K_USP: info->i = m68k_get_reg(NULL, M68K_REG_USP); break;
+ case CPUINFO_INT_REGISTER + M68K_SR: info->i = m68k_get_reg(NULL, M68K_REG_SR); break;
+ case CPUINFO_INT_REGISTER + M68K_D0: info->i = m68k_get_reg(NULL, M68K_REG_D0); break;
+ case CPUINFO_INT_REGISTER + M68K_D1: info->i = m68k_get_reg(NULL, M68K_REG_D1); break;
+ case CPUINFO_INT_REGISTER + M68K_D2: info->i = m68k_get_reg(NULL, M68K_REG_D2); break;
+ case CPUINFO_INT_REGISTER + M68K_D3: info->i = m68k_get_reg(NULL, M68K_REG_D3); break;
+ case CPUINFO_INT_REGISTER + M68K_D4: info->i = m68k_get_reg(NULL, M68K_REG_D4); break;
+ case CPUINFO_INT_REGISTER + M68K_D5: info->i = m68k_get_reg(NULL, M68K_REG_D5); break;
+ case CPUINFO_INT_REGISTER + M68K_D6: info->i = m68k_get_reg(NULL, M68K_REG_D6); break;
+ case CPUINFO_INT_REGISTER + M68K_D7: info->i = m68k_get_reg(NULL, M68K_REG_D7); break;
+ case CPUINFO_INT_REGISTER + M68K_A0: info->i = m68k_get_reg(NULL, M68K_REG_A0); break;
+ case CPUINFO_INT_REGISTER + M68K_A1: info->i = m68k_get_reg(NULL, M68K_REG_A1); break;
+ case CPUINFO_INT_REGISTER + M68K_A2: info->i = m68k_get_reg(NULL, M68K_REG_A2); break;
+ case CPUINFO_INT_REGISTER + M68K_A3: info->i = m68k_get_reg(NULL, M68K_REG_A3); break;
+ case CPUINFO_INT_REGISTER + M68K_A4: info->i = m68k_get_reg(NULL, M68K_REG_A4); break;
+ case CPUINFO_INT_REGISTER + M68K_A5: info->i = m68k_get_reg(NULL, M68K_REG_A5); break;
+ case CPUINFO_INT_REGISTER + M68K_A6: info->i = m68k_get_reg(NULL, M68K_REG_A6); break;
+ case CPUINFO_INT_REGISTER + M68K_A7: info->i = m68k_get_reg(NULL, M68K_REG_A7); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_ADDR: info->i = m68k_get_reg(NULL, M68K_REG_PREF_ADDR); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_DATA: info->i = m68k_get_reg(NULL, M68K_REG_PREF_DATA); break;
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case CPUINFO_PTR_SET_INFO: info->setinfo = m68000_set_info; break;
+ case CPUINFO_PTR_GET_CONTEXT: info->getcontext = m68000_get_context; break;
+ case CPUINFO_PTR_SET_CONTEXT: info->setcontext = m68000_set_context; break;
+ case CPUINFO_PTR_INIT: info->init = m68000_init; break;
+ case CPUINFO_PTR_RESET: info->reset = m68000_reset; break;
+ case CPUINFO_PTR_EXIT: info->exit = m68000_exit; break;
+ case CPUINFO_PTR_EXECUTE: info->execute = m68000_execute; break;
+ case CPUINFO_PTR_BURN: info->burn = NULL; break;
+#ifdef MAME_DEBUG
+ case CPUINFO_PTR_DISASSEMBLE: info->disassemble = m68000_dasm; break;
+#endif /* MAME_DEBUG */
+ case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &m68k_ICount; break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case CPUINFO_STR_NAME: strcpy(info->s, "68000"); break;
+ case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Motorola 68K"); break;
+ case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "3.31"); break;
+ case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break;
+ case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright 1998-2007 Karl Stenerud. All rights reserved. (2.1 fixes HJB)"); break;
+
+ case CPUINFO_STR_FLAGS:
+ sr = m68k_get_reg(NULL, M68K_REG_SR);
+ sprintf(info->s, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
+ sr & 0x8000 ? 'T':'.',
+ sr & 0x4000 ? '?':'.',
+ sr & 0x2000 ? 'S':'.',
+ sr & 0x1000 ? '?':'.',
+ sr & 0x0800 ? '?':'.',
+ sr & 0x0400 ? 'I':'.',
+ sr & 0x0200 ? 'I':'.',
+ sr & 0x0100 ? 'I':'.',
+ sr & 0x0080 ? '?':'.',
+ sr & 0x0040 ? '?':'.',
+ sr & 0x0020 ? '?':'.',
+ sr & 0x0010 ? 'X':'.',
+ sr & 0x0008 ? 'N':'.',
+ sr & 0x0004 ? 'Z':'.',
+ sr & 0x0002 ? 'V':'.',
+ sr & 0x0001 ? 'C':'.');
+ break;
+
+ case CPUINFO_STR_REGISTER + M68K_PC: sprintf(info->s, "PC :%08X", m68k_get_reg(NULL, M68K_REG_PC)); break;
+ case CPUINFO_STR_REGISTER + M68K_SR: sprintf(info->s, "SR :%04X", m68k_get_reg(NULL, M68K_REG_SR)); break;
+ case CPUINFO_STR_REGISTER + M68K_SP: sprintf(info->s, "SP :%08X", m68k_get_reg(NULL, M68K_REG_SP)); break;
+ case CPUINFO_STR_REGISTER + M68K_ISP: sprintf(info->s, "ISP:%08X", m68k_get_reg(NULL, M68K_REG_ISP)); break;
+ case CPUINFO_STR_REGISTER + M68K_USP: sprintf(info->s, "USP:%08X", m68k_get_reg(NULL, M68K_REG_USP)); break;
+ case CPUINFO_STR_REGISTER + M68K_D0: sprintf(info->s, "D0 :%08X", m68k_get_reg(NULL, M68K_REG_D0)); break;
+ case CPUINFO_STR_REGISTER + M68K_D1: sprintf(info->s, "D1 :%08X", m68k_get_reg(NULL, M68K_REG_D1)); break;
+ case CPUINFO_STR_REGISTER + M68K_D2: sprintf(info->s, "D2 :%08X", m68k_get_reg(NULL, M68K_REG_D2)); break;
+ case CPUINFO_STR_REGISTER + M68K_D3: sprintf(info->s, "D3 :%08X", m68k_get_reg(NULL, M68K_REG_D3)); break;
+ case CPUINFO_STR_REGISTER + M68K_D4: sprintf(info->s, "D4 :%08X", m68k_get_reg(NULL, M68K_REG_D4)); break;
+ case CPUINFO_STR_REGISTER + M68K_D5: sprintf(info->s, "D5 :%08X", m68k_get_reg(NULL, M68K_REG_D5)); break;
+ case CPUINFO_STR_REGISTER + M68K_D6: sprintf(info->s, "D6 :%08X", m68k_get_reg(NULL, M68K_REG_D6)); break;
+ case CPUINFO_STR_REGISTER + M68K_D7: sprintf(info->s, "D7 :%08X", m68k_get_reg(NULL, M68K_REG_D7)); break;
+ case CPUINFO_STR_REGISTER + M68K_A0: sprintf(info->s, "A0 :%08X", m68k_get_reg(NULL, M68K_REG_A0)); break;
+ case CPUINFO_STR_REGISTER + M68K_A1: sprintf(info->s, "A1 :%08X", m68k_get_reg(NULL, M68K_REG_A1)); break;
+ case CPUINFO_STR_REGISTER + M68K_A2: sprintf(info->s, "A2 :%08X", m68k_get_reg(NULL, M68K_REG_A2)); break;
+ case CPUINFO_STR_REGISTER + M68K_A3: sprintf(info->s, "A3 :%08X", m68k_get_reg(NULL, M68K_REG_A3)); break;
+ case CPUINFO_STR_REGISTER + M68K_A4: sprintf(info->s, "A4 :%08X", m68k_get_reg(NULL, M68K_REG_A4)); break;
+ case CPUINFO_STR_REGISTER + M68K_A5: sprintf(info->s, "A5 :%08X", m68k_get_reg(NULL, M68K_REG_A5)); break;
+ case CPUINFO_STR_REGISTER + M68K_A6: sprintf(info->s, "A6 :%08X", m68k_get_reg(NULL, M68K_REG_A6)); break;
+ case CPUINFO_STR_REGISTER + M68K_A7: sprintf(info->s, "A7 :%08X", m68k_get_reg(NULL, M68K_REG_A7)); break;
+ case CPUINFO_STR_REGISTER + M68K_PREF_ADDR: sprintf(info->s, "PAR:%08X", m68k_get_reg(NULL, M68K_REG_PREF_ADDR)); break;
+ case CPUINFO_STR_REGISTER + M68K_PREF_DATA: sprintf(info->s, "PDA:%08X", m68k_get_reg(NULL, M68K_REG_PREF_DATA)); break;
+ }
+}
+
+#if HAS_M68008
+
+static void m68008_set_info(UINT32 state, cpuinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are set as 64-bit signed integers --- */
+ case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(0, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 1: set_irq_line(1, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 2: set_irq_line(2, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 3: set_irq_line(3, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 4: set_irq_line(4, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 5: set_irq_line(5, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 6: set_irq_line(6, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 7: set_irq_line(7, info->i); break;
+
+ case CPUINFO_INT_PC: m68k_set_reg(M68K_REG_PC, info->i&0x00ffffff); break;
+ case CPUINFO_INT_REGISTER + M68K_PC: m68k_set_reg(M68K_REG_PC, info->i); break;
+ case CPUINFO_INT_SP:
+ case CPUINFO_INT_REGISTER + M68K_SP: m68k_set_reg(M68K_REG_SP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_ISP: m68k_set_reg(M68K_REG_ISP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_USP: m68k_set_reg(M68K_REG_USP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_SR: m68k_set_reg(M68K_REG_SR, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D0: m68k_set_reg(M68K_REG_D0, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D1: m68k_set_reg(M68K_REG_D1, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D2: m68k_set_reg(M68K_REG_D2, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D3: m68k_set_reg(M68K_REG_D3, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D4: m68k_set_reg(M68K_REG_D4, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D5: m68k_set_reg(M68K_REG_D5, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D6: m68k_set_reg(M68K_REG_D6, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D7: m68k_set_reg(M68K_REG_D7, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A0: m68k_set_reg(M68K_REG_A0, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A1: m68k_set_reg(M68K_REG_A1, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A2: m68k_set_reg(M68K_REG_A2, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A3: m68k_set_reg(M68K_REG_A3, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A4: m68k_set_reg(M68K_REG_A4, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A5: m68k_set_reg(M68K_REG_A5, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A6: m68k_set_reg(M68K_REG_A6, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A7: m68k_set_reg(M68K_REG_A7, info->i); break;
+
+ /* --- the following bits of info are set as pointers to data or functions --- */
+ case CPUINFO_PTR_M68K_RESET_CALLBACK: m68k_set_reset_instr_callback(info->f); break;
+ case CPUINFO_PTR_M68K_CMPILD_CALLBACK: m68k_set_cmpild_instr_callback((void (*)(unsigned int,int))(info->f)); break;
+ case CPUINFO_PTR_M68K_RTE_CALLBACK: m68k_set_rte_instr_callback(info->f); break;
+ }
+}
+
+void m68008_get_info(UINT32 state, cpuinfo *info)
+{
+ int sr;
+
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ case CPUINFO_INT_CONTEXT_SIZE: info->i = m68k_get_context(NULL); break;
+ case CPUINFO_INT_INPUT_LINES: info->i = 8; break;
+ case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = -1; break;
+ case CPUINFO_INT_ENDIANNESS: info->i = CPU_IS_BE; break;
+ case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
+ case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 2; break;
+ case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 10; break;
+ case CPUINFO_INT_MIN_CYCLES: info->i = 4; break;
+ case CPUINFO_INT_MAX_CYCLES: info->i = 158; break;
+
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 8; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 22; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break;
+
+ case CPUINFO_INT_INPUT_STATE + 0: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 1: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 2: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 3: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 4: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 5: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 6: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 7: info->i = 0; /* fix me */ break;
+
+ case CPUINFO_INT_PREVIOUSPC: info->i = m68k_get_reg(NULL, M68K_REG_PPC); break;
+
+ case CPUINFO_INT_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC)&0x00ffffff; break;
+ case CPUINFO_INT_REGISTER + M68K_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC); break;
+ case CPUINFO_INT_SP:
+ case CPUINFO_INT_REGISTER + M68K_SP: info->i = m68k_get_reg(NULL, M68K_REG_SP); break;
+ case CPUINFO_INT_REGISTER + M68K_ISP: info->i = m68k_get_reg(NULL, M68K_REG_ISP); break;
+ case CPUINFO_INT_REGISTER + M68K_USP: info->i = m68k_get_reg(NULL, M68K_REG_USP); break;
+ case CPUINFO_INT_REGISTER + M68K_SR: info->i = m68k_get_reg(NULL, M68K_REG_SR); break;
+ case CPUINFO_INT_REGISTER + M68K_D0: info->i = m68k_get_reg(NULL, M68K_REG_D0); break;
+ case CPUINFO_INT_REGISTER + M68K_D1: info->i = m68k_get_reg(NULL, M68K_REG_D1); break;
+ case CPUINFO_INT_REGISTER + M68K_D2: info->i = m68k_get_reg(NULL, M68K_REG_D2); break;
+ case CPUINFO_INT_REGISTER + M68K_D3: info->i = m68k_get_reg(NULL, M68K_REG_D3); break;
+ case CPUINFO_INT_REGISTER + M68K_D4: info->i = m68k_get_reg(NULL, M68K_REG_D4); break;
+ case CPUINFO_INT_REGISTER + M68K_D5: info->i = m68k_get_reg(NULL, M68K_REG_D5); break;
+ case CPUINFO_INT_REGISTER + M68K_D6: info->i = m68k_get_reg(NULL, M68K_REG_D6); break;
+ case CPUINFO_INT_REGISTER + M68K_D7: info->i = m68k_get_reg(NULL, M68K_REG_D7); break;
+ case CPUINFO_INT_REGISTER + M68K_A0: info->i = m68k_get_reg(NULL, M68K_REG_A0); break;
+ case CPUINFO_INT_REGISTER + M68K_A1: info->i = m68k_get_reg(NULL, M68K_REG_A1); break;
+ case CPUINFO_INT_REGISTER + M68K_A2: info->i = m68k_get_reg(NULL, M68K_REG_A2); break;
+ case CPUINFO_INT_REGISTER + M68K_A3: info->i = m68k_get_reg(NULL, M68K_REG_A3); break;
+ case CPUINFO_INT_REGISTER + M68K_A4: info->i = m68k_get_reg(NULL, M68K_REG_A4); break;
+ case CPUINFO_INT_REGISTER + M68K_A5: info->i = m68k_get_reg(NULL, M68K_REG_A5); break;
+ case CPUINFO_INT_REGISTER + M68K_A6: info->i = m68k_get_reg(NULL, M68K_REG_A6); break;
+ case CPUINFO_INT_REGISTER + M68K_A7: info->i = m68k_get_reg(NULL, M68K_REG_A7); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_ADDR: info->i = m68k_get_reg(NULL, M68K_REG_PREF_ADDR); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_DATA: info->i = m68k_get_reg(NULL, M68K_REG_PREF_DATA); break;
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case CPUINFO_PTR_SET_INFO: info->setinfo = m68008_set_info; break;
+ case CPUINFO_PTR_GET_CONTEXT: info->getcontext = m68008_get_context; break;
+ case CPUINFO_PTR_SET_CONTEXT: info->setcontext = m68008_set_context; break;
+ case CPUINFO_PTR_INIT: info->init = m68008_init; break;
+ case CPUINFO_PTR_RESET: info->reset = m68008_reset; break;
+ case CPUINFO_PTR_EXIT: info->exit = m68008_exit; break;
+ case CPUINFO_PTR_EXECUTE: info->execute = m68008_execute; break;
+ case CPUINFO_PTR_BURN: info->burn = NULL; break;
+#ifdef MAME_DEBUG
+ case CPUINFO_PTR_DISASSEMBLE: info->disassemble = m68008_dasm; break;
+#endif /* MAME_DEBUG */
+ case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &m68k_ICount; break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case CPUINFO_STR_NAME: strcpy(info->s, "68008"); break;
+ case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Motorola 68K"); break;
+ case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "3.31"); break;
+ case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break;
+ case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright 1998-2007 Karl Stenerud. All rights reserved. (2.1 fixes HJB)"); break;
+
+ case CPUINFO_STR_FLAGS:
+ sr = m68k_get_reg(NULL, M68K_REG_SR);
+ sprintf(info->s, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
+ sr & 0x8000 ? 'T':'.',
+ sr & 0x4000 ? '?':'.',
+ sr & 0x2000 ? 'S':'.',
+ sr & 0x1000 ? '?':'.',
+ sr & 0x0800 ? '?':'.',
+ sr & 0x0400 ? 'I':'.',
+ sr & 0x0200 ? 'I':'.',
+ sr & 0x0100 ? 'I':'.',
+ sr & 0x0080 ? '?':'.',
+ sr & 0x0040 ? '?':'.',
+ sr & 0x0020 ? '?':'.',
+ sr & 0x0010 ? 'X':'.',
+ sr & 0x0008 ? 'N':'.',
+ sr & 0x0004 ? 'Z':'.',
+ sr & 0x0002 ? 'V':'.',
+ sr & 0x0001 ? 'C':'.');
+ break;
+
+ case CPUINFO_STR_REGISTER + M68K_PC: sprintf(info->s, "PC :%08X", m68k_get_reg(NULL, M68K_REG_PC)); break;
+ case CPUINFO_STR_REGISTER + M68K_SR: sprintf(info->s, "SR :%04X", m68k_get_reg(NULL, M68K_REG_SR)); break;
+ case CPUINFO_STR_REGISTER + M68K_SP: sprintf(info->s, "SP :%08X", m68k_get_reg(NULL, M68K_REG_SP)); break;
+ case CPUINFO_STR_REGISTER + M68K_ISP: sprintf(info->s, "ISP:%08X", m68k_get_reg(NULL, M68K_REG_ISP)); break;
+ case CPUINFO_STR_REGISTER + M68K_USP: sprintf(info->s, "USP:%08X", m68k_get_reg(NULL, M68K_REG_USP)); break;
+ case CPUINFO_STR_REGISTER + M68K_D0: sprintf(info->s, "D0 :%08X", m68k_get_reg(NULL, M68K_REG_D0)); break;
+ case CPUINFO_STR_REGISTER + M68K_D1: sprintf(info->s, "D1 :%08X", m68k_get_reg(NULL, M68K_REG_D1)); break;
+ case CPUINFO_STR_REGISTER + M68K_D2: sprintf(info->s, "D2 :%08X", m68k_get_reg(NULL, M68K_REG_D2)); break;
+ case CPUINFO_STR_REGISTER + M68K_D3: sprintf(info->s, "D3 :%08X", m68k_get_reg(NULL, M68K_REG_D3)); break;
+ case CPUINFO_STR_REGISTER + M68K_D4: sprintf(info->s, "D4 :%08X", m68k_get_reg(NULL, M68K_REG_D4)); break;
+ case CPUINFO_STR_REGISTER + M68K_D5: sprintf(info->s, "D5 :%08X", m68k_get_reg(NULL, M68K_REG_D5)); break;
+ case CPUINFO_STR_REGISTER + M68K_D6: sprintf(info->s, "D6 :%08X", m68k_get_reg(NULL, M68K_REG_D6)); break;
+ case CPUINFO_STR_REGISTER + M68K_D7: sprintf(info->s, "D7 :%08X", m68k_get_reg(NULL, M68K_REG_D7)); break;
+ case CPUINFO_STR_REGISTER + M68K_A0: sprintf(info->s, "A0 :%08X", m68k_get_reg(NULL, M68K_REG_A0)); break;
+ case CPUINFO_STR_REGISTER + M68K_A1: sprintf(info->s, "A1 :%08X", m68k_get_reg(NULL, M68K_REG_A1)); break;
+ case CPUINFO_STR_REGISTER + M68K_A2: sprintf(info->s, "A2 :%08X", m68k_get_reg(NULL, M68K_REG_A2)); break;
+ case CPUINFO_STR_REGISTER + M68K_A3: sprintf(info->s, "A3 :%08X", m68k_get_reg(NULL, M68K_REG_A3)); break;
+ case CPUINFO_STR_REGISTER + M68K_A4: sprintf(info->s, "A4 :%08X", m68k_get_reg(NULL, M68K_REG_A4)); break;
+ case CPUINFO_STR_REGISTER + M68K_A5: sprintf(info->s, "A5 :%08X", m68k_get_reg(NULL, M68K_REG_A5)); break;
+ case CPUINFO_STR_REGISTER + M68K_A6: sprintf(info->s, "A6 :%08X", m68k_get_reg(NULL, M68K_REG_A6)); break;
+ case CPUINFO_STR_REGISTER + M68K_A7: sprintf(info->s, "A7 :%08X", m68k_get_reg(NULL, M68K_REG_A7)); break;
+ case CPUINFO_STR_REGISTER + M68K_PREF_ADDR: sprintf(info->s, "PAR:%08X", m68k_get_reg(NULL, M68K_REG_PREF_ADDR)); break;
+ case CPUINFO_STR_REGISTER + M68K_PREF_DATA: sprintf(info->s, "PDA:%08X", m68k_get_reg(NULL, M68K_REG_PREF_DATA)); break;
+ }
+}
+
+#endif
+
+/**************************************************************************
+ * CPU-specific set_info
+ **************************************************************************/
+#if HAS_M68010
+
+static void m68010_set_info(UINT32 state, cpuinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are set as 64-bit signed integers --- */
+ case CPUINFO_INT_REGISTER + M68K_VBR: m68k_set_reg(M68K_REG_VBR, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_SFC: m68k_set_reg(M68K_REG_SFC, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_DFC: m68k_set_reg(M68K_REG_DFC, info->i); break;
+
+ default: m68000_set_info(state, info); break;
+ }
+}
+
+void m68010_get_info(UINT32 state, cpuinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ case CPUINFO_INT_REGISTER + M68K_VBR: info->i = m68k_get_reg(NULL, M68K_REG_VBR); break;
+ case CPUINFO_INT_REGISTER + M68K_SFC: info->i = m68k_get_reg(NULL, M68K_REG_SFC); break;
+ case CPUINFO_INT_REGISTER + M68K_DFC: info->i = m68k_get_reg(NULL, M68K_REG_DFC); break;
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case CPUINFO_PTR_SET_INFO: info->setinfo = m68010_set_info; break;
+ case CPUINFO_PTR_INIT: info->init = m68010_init; break;
+#ifdef MAME_DEBUG
+ case CPUINFO_PTR_DISASSEMBLE: info->disassemble = m68010_dasm; break;
+#endif /* MAME_DEBUG */
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case CPUINFO_STR_NAME: strcpy(info->s, "68010"); break;
+ case CPUINFO_STR_REGISTER + M68K_SFC: sprintf(info->s, "SFC:%X", m68k_get_reg(NULL, M68K_REG_SFC)); break;
+ case CPUINFO_STR_REGISTER + M68K_DFC: sprintf(info->s, "DFC:%X", m68k_get_reg(NULL, M68K_REG_DFC)); break;
+ case CPUINFO_STR_REGISTER + M68K_VBR: sprintf(info->s, "VBR:%08X", m68k_get_reg(NULL, M68K_REG_VBR)); break;
+
+ default: m68000_get_info(state, info); break;
+ }
+}
+
+#endif
+
+/**************************************************************************
+ * CPU-specific set_info
+ **************************************************************************/
+
+static void m68020_set_info(UINT32 state, cpuinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are set as 64-bit signed integers --- */
+ case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(0, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 1: set_irq_line(1, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 2: set_irq_line(2, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 3: set_irq_line(3, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 4: set_irq_line(4, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 5: set_irq_line(5, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 6: set_irq_line(6, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 7: set_irq_line(7, info->i); break;
+
+ case CPUINFO_INT_PC: m68k_set_reg(M68K_REG_PC, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_PC: m68k_set_reg(M68K_REG_PC, info->i); break;
+ case CPUINFO_INT_SP:
+ case CPUINFO_INT_REGISTER + M68K_SP: m68k_set_reg(M68K_REG_SP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_ISP: m68k_set_reg(M68K_REG_ISP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_USP: m68k_set_reg(M68K_REG_USP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_SR: m68k_set_reg(M68K_REG_SR, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D0: m68k_set_reg(M68K_REG_D0, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D1: m68k_set_reg(M68K_REG_D1, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D2: m68k_set_reg(M68K_REG_D2, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D3: m68k_set_reg(M68K_REG_D3, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D4: m68k_set_reg(M68K_REG_D4, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D5: m68k_set_reg(M68K_REG_D5, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D6: m68k_set_reg(M68K_REG_D6, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D7: m68k_set_reg(M68K_REG_D7, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A0: m68k_set_reg(M68K_REG_A0, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A1: m68k_set_reg(M68K_REG_A1, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A2: m68k_set_reg(M68K_REG_A2, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A3: m68k_set_reg(M68K_REG_A3, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A4: m68k_set_reg(M68K_REG_A4, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A5: m68k_set_reg(M68K_REG_A5, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A6: m68k_set_reg(M68K_REG_A6, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A7: m68k_set_reg(M68K_REG_A7, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_MSP: m68k_set_reg(M68K_REG_MSP, info->i); break; /* 68020+ */
+ case CPUINFO_INT_REGISTER + M68K_CACR: m68k_set_reg(M68K_REG_CACR, info->i); break; /* 68020+ */
+ case CPUINFO_INT_REGISTER + M68K_CAAR: m68k_set_reg(M68K_REG_CAAR, info->i); break; /* 68020+ */
+ case CPUINFO_INT_REGISTER + M68K_VBR: m68k_set_reg(M68K_REG_VBR, info->i); break; /* 68010+ */
+ case CPUINFO_INT_REGISTER + M68K_SFC: m68k_set_reg(M68K_REG_SFC, info->i); break; /* 68010+ */
+ case CPUINFO_INT_REGISTER + M68K_DFC: m68k_set_reg(M68K_REG_DFC, info->i); break; /* 68010+ */
+
+ /* --- the following bits of info are set as pointers to data or functions --- */
+ case CPUINFO_PTR_M68K_RESET_CALLBACK: m68k_set_reset_instr_callback(info->f); break;
+ case CPUINFO_PTR_M68K_CMPILD_CALLBACK: m68k_set_cmpild_instr_callback((void (*)(unsigned int,int))(info->f)); break;
+ case CPUINFO_PTR_M68K_RTE_CALLBACK: m68k_set_rte_instr_callback(info->f); break;
+ }
+}
+
+void m68020_get_info(UINT32 state, cpuinfo *info)
+{
+ int sr;
+
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ case CPUINFO_INT_CONTEXT_SIZE: info->i = m68k_get_context(NULL); break;
+ case CPUINFO_INT_INPUT_LINES: info->i = 8; break;
+ case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = -1; break;
+ case CPUINFO_INT_ENDIANNESS: info->i = CPU_IS_BE; break;
+ case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
+ case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 2; break;
+ case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 16; break;
+ case CPUINFO_INT_MIN_CYCLES: info->i = 4; break;
+ case CPUINFO_INT_MAX_CYCLES: info->i = 158; break;
+
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 32; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 32; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break;
+
+ case CPUINFO_INT_INPUT_STATE + 0: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 1: info->i = 1; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 2: info->i = 2; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 3: info->i = 3; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 4: info->i = 4; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 5: info->i = 5; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 6: info->i = 6; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 7: info->i = 7; /* fix me */ break;
+
+ case CPUINFO_INT_PREVIOUSPC: info->i = m68k_get_reg(NULL, M68K_REG_PPC); break;
+
+ case CPUINFO_INT_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC); break;
+ case CPUINFO_INT_REGISTER + M68K_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC); break;
+ case CPUINFO_INT_SP:
+ case CPUINFO_INT_REGISTER + M68K_SP: info->i = m68k_get_reg(NULL, M68K_REG_SP); break;
+ case CPUINFO_INT_REGISTER + M68K_ISP: info->i = m68k_get_reg(NULL, M68K_REG_ISP); break;
+ case CPUINFO_INT_REGISTER + M68K_USP: info->i = m68k_get_reg(NULL, M68K_REG_USP); break;
+ case CPUINFO_INT_REGISTER + M68K_SR: info->i = m68k_get_reg(NULL, M68K_REG_SR); break;
+ case CPUINFO_INT_REGISTER + M68K_D0: info->i = m68k_get_reg(NULL, M68K_REG_D0); break;
+ case CPUINFO_INT_REGISTER + M68K_D1: info->i = m68k_get_reg(NULL, M68K_REG_D1); break;
+ case CPUINFO_INT_REGISTER + M68K_D2: info->i = m68k_get_reg(NULL, M68K_REG_D2); break;
+ case CPUINFO_INT_REGISTER + M68K_D3: info->i = m68k_get_reg(NULL, M68K_REG_D3); break;
+ case CPUINFO_INT_REGISTER + M68K_D4: info->i = m68k_get_reg(NULL, M68K_REG_D4); break;
+ case CPUINFO_INT_REGISTER + M68K_D5: info->i = m68k_get_reg(NULL, M68K_REG_D5); break;
+ case CPUINFO_INT_REGISTER + M68K_D6: info->i = m68k_get_reg(NULL, M68K_REG_D6); break;
+ case CPUINFO_INT_REGISTER + M68K_D7: info->i = m68k_get_reg(NULL, M68K_REG_D7); break;
+ case CPUINFO_INT_REGISTER + M68K_A0: info->i = m68k_get_reg(NULL, M68K_REG_A0); break;
+ case CPUINFO_INT_REGISTER + M68K_A1: info->i = m68k_get_reg(NULL, M68K_REG_A1); break;
+ case CPUINFO_INT_REGISTER + M68K_A2: info->i = m68k_get_reg(NULL, M68K_REG_A2); break;
+ case CPUINFO_INT_REGISTER + M68K_A3: info->i = m68k_get_reg(NULL, M68K_REG_A3); break;
+ case CPUINFO_INT_REGISTER + M68K_A4: info->i = m68k_get_reg(NULL, M68K_REG_A4); break;
+ case CPUINFO_INT_REGISTER + M68K_A5: info->i = m68k_get_reg(NULL, M68K_REG_A5); break;
+ case CPUINFO_INT_REGISTER + M68K_A6: info->i = m68k_get_reg(NULL, M68K_REG_A6); break;
+ case CPUINFO_INT_REGISTER + M68K_A7: info->i = m68k_get_reg(NULL, M68K_REG_A7); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_ADDR: info->i = m68k_get_reg(NULL, M68K_REG_PREF_ADDR); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_DATA: info->i = m68k_get_reg(NULL, M68K_REG_PREF_DATA); break;
+ case CPUINFO_INT_REGISTER + M68K_MSP: info->i = m68k_get_reg(NULL, M68K_REG_MSP); /* 68020+ */ break;
+ case CPUINFO_INT_REGISTER + M68K_CACR: info->i = m68k_get_reg(NULL, M68K_REG_CACR); /* 68020+ */ break;
+ case CPUINFO_INT_REGISTER + M68K_CAAR: info->i = m68k_get_reg(NULL, M68K_REG_CAAR); /* 68020+ */ break;
+ case CPUINFO_INT_REGISTER + M68K_VBR: info->i = m68k_get_reg(NULL, M68K_REG_VBR); /* 68010+ */ break;
+ case CPUINFO_INT_REGISTER + M68K_SFC: info->i = m68k_get_reg(NULL, M68K_REG_SFC); /* 68010" */ break;
+ case CPUINFO_INT_REGISTER + M68K_DFC: info->i = m68k_get_reg(NULL, M68K_REG_DFC); /* 68010+ */ break;
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case CPUINFO_PTR_SET_INFO: info->setinfo = m68020_set_info; break;
+ case CPUINFO_PTR_GET_CONTEXT: info->getcontext = m68020_get_context; break;
+ case CPUINFO_PTR_SET_CONTEXT: info->setcontext = m68020_set_context; break;
+ case CPUINFO_PTR_INIT: info->init = m68020_init; break;
+ case CPUINFO_PTR_RESET: info->reset = m68020_reset; break;
+ case CPUINFO_PTR_EXIT: info->exit = m68020_exit; break;
+ case CPUINFO_PTR_EXECUTE: info->execute = m68020_execute; break;
+ case CPUINFO_PTR_BURN: info->burn = NULL; break;
+#ifdef MAME_DEBUG
+ case CPUINFO_PTR_DISASSEMBLE: info->disassemble = m68020_dasm; break;
+#endif /* MAME_DEBUG */
+ case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &m68k_ICount; break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case CPUINFO_STR_NAME: strcpy(info->s, "68020"); break;
+ case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Motorola 68K"); break;
+ case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "3.31"); break;
+ case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break;
+ case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright 1998-2007 Karl Stenerud. All rights reserved. (2.1 fixes HJB)"); break;
+
+ case CPUINFO_STR_FLAGS:
+ sr = m68k_get_reg(NULL, M68K_REG_SR);
+ sprintf(info->s, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
+ sr & 0x8000 ? 'T':'.',
+ sr & 0x4000 ? 't':'.',
+ sr & 0x2000 ? 'S':'.',
+ sr & 0x1000 ? 'M':'.',
+ sr & 0x0800 ? '?':'.',
+ sr & 0x0400 ? 'I':'.',
+ sr & 0x0200 ? 'I':'.',
+ sr & 0x0100 ? 'I':'.',
+ sr & 0x0080 ? '?':'.',
+ sr & 0x0040 ? '?':'.',
+ sr & 0x0020 ? '?':'.',
+ sr & 0x0010 ? 'X':'.',
+ sr & 0x0008 ? 'N':'.',
+ sr & 0x0004 ? 'Z':'.',
+ sr & 0x0002 ? 'V':'.',
+ sr & 0x0001 ? 'C':'.');
+ break;
+
+ case CPUINFO_STR_REGISTER + M68K_PC: sprintf(info->s, "PC :%08X", m68k_get_reg(NULL, M68K_REG_PC)); break;
+ case CPUINFO_STR_REGISTER + M68K_SR: sprintf(info->s, "SR :%04X", m68k_get_reg(NULL, M68K_REG_SR)); break;
+ case CPUINFO_STR_REGISTER + M68K_SP: sprintf(info->s, "SP :%08X", m68k_get_reg(NULL, M68K_REG_SP)); break;
+ case CPUINFO_STR_REGISTER + M68K_ISP: sprintf(info->s, "ISP:%08X", m68k_get_reg(NULL, M68K_REG_ISP)); break;
+ case CPUINFO_STR_REGISTER + M68K_USP: sprintf(info->s, "USP:%08X", m68k_get_reg(NULL, M68K_REG_USP)); break;
+ case CPUINFO_STR_REGISTER + M68K_D0: sprintf(info->s, "D0 :%08X", m68k_get_reg(NULL, M68K_REG_D0)); break;
+ case CPUINFO_STR_REGISTER + M68K_D1: sprintf(info->s, "D1 :%08X", m68k_get_reg(NULL, M68K_REG_D1)); break;
+ case CPUINFO_STR_REGISTER + M68K_D2: sprintf(info->s, "D2 :%08X", m68k_get_reg(NULL, M68K_REG_D2)); break;
+ case CPUINFO_STR_REGISTER + M68K_D3: sprintf(info->s, "D3 :%08X", m68k_get_reg(NULL, M68K_REG_D3)); break;
+ case CPUINFO_STR_REGISTER + M68K_D4: sprintf(info->s, "D4 :%08X", m68k_get_reg(NULL, M68K_REG_D4)); break;
+ case CPUINFO_STR_REGISTER + M68K_D5: sprintf(info->s, "D5 :%08X", m68k_get_reg(NULL, M68K_REG_D5)); break;
+ case CPUINFO_STR_REGISTER + M68K_D6: sprintf(info->s, "D6 :%08X", m68k_get_reg(NULL, M68K_REG_D6)); break;
+ case CPUINFO_STR_REGISTER + M68K_D7: sprintf(info->s, "D7 :%08X", m68k_get_reg(NULL, M68K_REG_D7)); break;
+ case CPUINFO_STR_REGISTER + M68K_A0: sprintf(info->s, "A0 :%08X", m68k_get_reg(NULL, M68K_REG_A0)); break;
+ case CPUINFO_STR_REGISTER + M68K_A1: sprintf(info->s, "A1 :%08X", m68k_get_reg(NULL, M68K_REG_A1)); break;
+ case CPUINFO_STR_REGISTER + M68K_A2: sprintf(info->s, "A2 :%08X", m68k_get_reg(NULL, M68K_REG_A2)); break;
+ case CPUINFO_STR_REGISTER + M68K_A3: sprintf(info->s, "A3 :%08X", m68k_get_reg(NULL, M68K_REG_A3)); break;
+ case CPUINFO_STR_REGISTER + M68K_A4: sprintf(info->s, "A4 :%08X", m68k_get_reg(NULL, M68K_REG_A4)); break;
+ case CPUINFO_STR_REGISTER + M68K_A5: sprintf(info->s, "A5 :%08X", m68k_get_reg(NULL, M68K_REG_A5)); break;
+ case CPUINFO_STR_REGISTER + M68K_A6: sprintf(info->s, "A6 :%08X", m68k_get_reg(NULL, M68K_REG_A6)); break;
+ case CPUINFO_STR_REGISTER + M68K_A7: sprintf(info->s, "A7 :%08X", m68k_get_reg(NULL, M68K_REG_A7)); break;
+ case CPUINFO_STR_REGISTER + M68K_PREF_ADDR: sprintf(info->s, "PAR:%08X", m68k_get_reg(NULL, M68K_REG_PREF_ADDR)); break;
+ case CPUINFO_STR_REGISTER + M68K_PREF_DATA: sprintf(info->s, "PDA:%08X", m68k_get_reg(NULL, M68K_REG_PREF_DATA)); break;
+ case CPUINFO_STR_REGISTER + M68K_MSP: sprintf(info->s, "MSP:%08X", m68k_get_reg(NULL, M68K_REG_MSP)); break;
+ case CPUINFO_STR_REGISTER + M68K_CACR: sprintf(info->s, "CCR:%08X", m68k_get_reg(NULL, M68K_REG_CACR)); break;
+ case CPUINFO_STR_REGISTER + M68K_CAAR: sprintf(info->s, "CAR:%08X", m68k_get_reg(NULL, M68K_REG_CAAR)); break;
+ case CPUINFO_STR_REGISTER + M68K_SFC: sprintf(info->s, "SFC:%X", m68k_get_reg(NULL, M68K_REG_SFC)); break;
+ case CPUINFO_STR_REGISTER + M68K_DFC: sprintf(info->s, "DFC:%X", m68k_get_reg(NULL, M68K_REG_DFC)); break;
+ case CPUINFO_STR_REGISTER + M68K_VBR: sprintf(info->s, "VBR:%08X", m68k_get_reg(NULL, M68K_REG_VBR)); break;
+ }
+}
+
+
+/**************************************************************************
+ * CPU-specific set_info
+ **************************************************************************/
+#if HAS_M68EC020
+
+static void m68ec020_set_info(UINT32 state, cpuinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are set as 64-bit signed integers --- */
+ case CPUINFO_INT_PC: m68k_set_reg(M68K_REG_PC, info->i&0x00ffffff); break;
+
+ default: m68020_set_info(state, info); break;
+ }
+}
+
+void m68ec020_get_info(UINT32 state, cpuinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 24; break;
+ case CPUINFO_INT_REGISTER + REG_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC)&0x00ffffff; break;
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case CPUINFO_PTR_SET_INFO: info->setinfo = m68ec020_set_info; break;
+ case CPUINFO_PTR_INIT: info->init = m68ec020_init; break;
+#ifdef MAME_DEBUG
+ case CPUINFO_PTR_DISASSEMBLE: info->disassemble = m68ec020_dasm; break;
+#endif /* MAME_DEBUG */
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case CPUINFO_STR_NAME: strcpy(info->s, "68EC020"); break;
+
+ default: m68020_get_info(state, info); break;
+ }
+}
+
+#endif
+
+/**************************************************************************
+ * CPU-specific set_info
+ **************************************************************************/
+
+#if HAS_M68040
+static void m68040_set_info(UINT32 state, cpuinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are set as 64-bit signed integers --- */
+ case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(0, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 1: set_irq_line(1, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 2: set_irq_line(2, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 3: set_irq_line(3, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 4: set_irq_line(4, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 5: set_irq_line(5, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 6: set_irq_line(6, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + 7: set_irq_line(7, info->i); break;
+
+ case CPUINFO_INT_PC: m68k_set_reg(M68K_REG_PC, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_PC: m68k_set_reg(M68K_REG_PC, info->i); break;
+ case CPUINFO_INT_SP:
+ case CPUINFO_INT_REGISTER + M68K_SP: m68k_set_reg(M68K_REG_SP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_ISP: m68k_set_reg(M68K_REG_ISP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_USP: m68k_set_reg(M68K_REG_USP, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_SR: m68k_set_reg(M68K_REG_SR, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D0: m68k_set_reg(M68K_REG_D0, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D1: m68k_set_reg(M68K_REG_D1, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D2: m68k_set_reg(M68K_REG_D2, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D3: m68k_set_reg(M68K_REG_D3, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D4: m68k_set_reg(M68K_REG_D4, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D5: m68k_set_reg(M68K_REG_D5, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D6: m68k_set_reg(M68K_REG_D6, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_D7: m68k_set_reg(M68K_REG_D7, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A0: m68k_set_reg(M68K_REG_A0, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A1: m68k_set_reg(M68K_REG_A1, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A2: m68k_set_reg(M68K_REG_A2, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A3: m68k_set_reg(M68K_REG_A3, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A4: m68k_set_reg(M68K_REG_A4, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A5: m68k_set_reg(M68K_REG_A5, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A6: m68k_set_reg(M68K_REG_A6, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_A7: m68k_set_reg(M68K_REG_A7, info->i); break;
+ case CPUINFO_INT_REGISTER + M68K_MSP: m68k_set_reg(M68K_REG_MSP, info->i); break; /* 68020+ */
+ case CPUINFO_INT_REGISTER + M68K_CACR: m68k_set_reg(M68K_REG_CACR, info->i); break; /* 68020+ */
+ case CPUINFO_INT_REGISTER + M68K_CAAR: m68k_set_reg(M68K_REG_CAAR, info->i); break; /* 68020+ */
+ case CPUINFO_INT_REGISTER + M68K_VBR: m68k_set_reg(M68K_REG_VBR, info->i); break; /* 68010+ */
+ case CPUINFO_INT_REGISTER + M68K_SFC: m68k_set_reg(M68K_REG_SFC, info->i); break; /* 68010+ */
+ case CPUINFO_INT_REGISTER + M68K_DFC: m68k_set_reg(M68K_REG_DFC, info->i); break; /* 68010+ */
+
+ /* --- the following bits of info are set as pointers to data or functions --- */
+ case CPUINFO_PTR_M68K_RESET_CALLBACK: m68k_set_reset_instr_callback(info->f); break;
+ case CPUINFO_PTR_M68K_CMPILD_CALLBACK: m68k_set_cmpild_instr_callback((void (*)(unsigned int,int))(info->f)); break;
+ case CPUINFO_PTR_M68K_RTE_CALLBACK: m68k_set_rte_instr_callback(info->f); break;
+ }
+}
+
+void m68040_get_info(UINT32 state, cpuinfo *info)
+{
+ int sr;
+
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ case CPUINFO_INT_CONTEXT_SIZE: info->i = m68k_get_context(NULL); break;
+ case CPUINFO_INT_INPUT_LINES: info->i = 8; break;
+ case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = -1; break;
+ case CPUINFO_INT_ENDIANNESS: info->i = CPU_IS_BE; break;
+ case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
+ case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 2; break;
+ case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 16; break;
+ case CPUINFO_INT_MIN_CYCLES: info->i = 4; break;
+ case CPUINFO_INT_MAX_CYCLES: info->i = 158; break;
+
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 32; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 32; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break;
+
+ case CPUINFO_INT_INPUT_STATE + 0: info->i = 0; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 1: info->i = 1; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 2: info->i = 2; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 3: info->i = 3; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 4: info->i = 4; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 5: info->i = 5; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 6: info->i = 6; /* fix me */ break;
+ case CPUINFO_INT_INPUT_STATE + 7: info->i = 7; /* fix me */ break;
+
+ case CPUINFO_INT_PREVIOUSPC: info->i = m68k_get_reg(NULL, M68K_REG_PPC); break;
+
+ case CPUINFO_INT_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC); break;
+ case CPUINFO_INT_REGISTER + M68K_PC: info->i = m68k_get_reg(NULL, M68K_REG_PC); break;
+ case CPUINFO_INT_SP:
+ case CPUINFO_INT_REGISTER + M68K_SP: info->i = m68k_get_reg(NULL, M68K_REG_SP); break;
+ case CPUINFO_INT_REGISTER + M68K_ISP: info->i = m68k_get_reg(NULL, M68K_REG_ISP); break;
+ case CPUINFO_INT_REGISTER + M68K_USP: info->i = m68k_get_reg(NULL, M68K_REG_USP); break;
+ case CPUINFO_INT_REGISTER + M68K_SR: info->i = m68k_get_reg(NULL, M68K_REG_SR); break;
+ case CPUINFO_INT_REGISTER + M68K_D0: info->i = m68k_get_reg(NULL, M68K_REG_D0); break;
+ case CPUINFO_INT_REGISTER + M68K_D1: info->i = m68k_get_reg(NULL, M68K_REG_D1); break;
+ case CPUINFO_INT_REGISTER + M68K_D2: info->i = m68k_get_reg(NULL, M68K_REG_D2); break;
+ case CPUINFO_INT_REGISTER + M68K_D3: info->i = m68k_get_reg(NULL, M68K_REG_D3); break;
+ case CPUINFO_INT_REGISTER + M68K_D4: info->i = m68k_get_reg(NULL, M68K_REG_D4); break;
+ case CPUINFO_INT_REGISTER + M68K_D5: info->i = m68k_get_reg(NULL, M68K_REG_D5); break;
+ case CPUINFO_INT_REGISTER + M68K_D6: info->i = m68k_get_reg(NULL, M68K_REG_D6); break;
+ case CPUINFO_INT_REGISTER + M68K_D7: info->i = m68k_get_reg(NULL, M68K_REG_D7); break;
+ case CPUINFO_INT_REGISTER + M68K_A0: info->i = m68k_get_reg(NULL, M68K_REG_A0); break;
+ case CPUINFO_INT_REGISTER + M68K_A1: info->i = m68k_get_reg(NULL, M68K_REG_A1); break;
+ case CPUINFO_INT_REGISTER + M68K_A2: info->i = m68k_get_reg(NULL, M68K_REG_A2); break;
+ case CPUINFO_INT_REGISTER + M68K_A3: info->i = m68k_get_reg(NULL, M68K_REG_A3); break;
+ case CPUINFO_INT_REGISTER + M68K_A4: info->i = m68k_get_reg(NULL, M68K_REG_A4); break;
+ case CPUINFO_INT_REGISTER + M68K_A5: info->i = m68k_get_reg(NULL, M68K_REG_A5); break;
+ case CPUINFO_INT_REGISTER + M68K_A6: info->i = m68k_get_reg(NULL, M68K_REG_A6); break;
+ case CPUINFO_INT_REGISTER + M68K_A7: info->i = m68k_get_reg(NULL, M68K_REG_A7); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_ADDR: info->i = m68k_get_reg(NULL, M68K_REG_PREF_ADDR); break;
+ case CPUINFO_INT_REGISTER + M68K_PREF_DATA: info->i = m68k_get_reg(NULL, M68K_REG_PREF_DATA); break;
+ case CPUINFO_INT_REGISTER + M68K_MSP: info->i = m68k_get_reg(NULL, M68K_REG_MSP); /* 68020+ */ break;
+ case CPUINFO_INT_REGISTER + M68K_CACR: info->i = m68k_get_reg(NULL, M68K_REG_CACR); /* 68020+ */ break;
+ case CPUINFO_INT_REGISTER + M68K_CAAR: info->i = m68k_get_reg(NULL, M68K_REG_CAAR); /* 68020+ */ break;
+ case CPUINFO_INT_REGISTER + M68K_VBR: info->i = m68k_get_reg(NULL, M68K_REG_VBR); /* 68010+ */ break;
+ case CPUINFO_INT_REGISTER + M68K_SFC: info->i = m68k_get_reg(NULL, M68K_REG_SFC); /* 68010" */ break;
+ case CPUINFO_INT_REGISTER + M68K_DFC: info->i = m68k_get_reg(NULL, M68K_REG_DFC); /* 68010+ */ break;
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case CPUINFO_PTR_SET_INFO: info->setinfo = m68040_set_info; break;
+ case CPUINFO_PTR_GET_CONTEXT: info->getcontext = m68040_get_context; break;
+ case CPUINFO_PTR_SET_CONTEXT: info->setcontext = m68040_set_context; break;
+ case CPUINFO_PTR_INIT: info->init = m68040_init; break;
+ case CPUINFO_PTR_RESET: info->reset = m68040_reset; break;
+ case CPUINFO_PTR_EXIT: info->exit = m68040_exit; break;
+ case CPUINFO_PTR_EXECUTE: info->execute = m68040_execute; break;
+ case CPUINFO_PTR_BURN: info->burn = NULL; break;
+#ifdef MAME_DEBUG
+ case CPUINFO_PTR_DISASSEMBLE: info->disassemble = m68040_dasm; break;
+#endif /* MAME_DEBUG */
+ case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &m68k_ICount; break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case CPUINFO_STR_NAME: strcpy(info->s, "68040"); break;
+ case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Motorola 68K"); break;
+ case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "3.31"); break;
+ case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break;
+ case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright 1998-2007 Karl Stenerud. All rights reserved. (2.1 fixes HJB)"); break;
+
+ case CPUINFO_STR_FLAGS:
+ sr = m68k_get_reg(NULL, M68K_REG_SR);
+ sprintf(info->s, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
+ sr & 0x8000 ? 'T':'.',
+ sr & 0x4000 ? 't':'.',
+ sr & 0x2000 ? 'S':'.',
+ sr & 0x1000 ? 'M':'.',
+ sr & 0x0800 ? '?':'.',
+ sr & 0x0400 ? 'I':'.',
+ sr & 0x0200 ? 'I':'.',
+ sr & 0x0100 ? 'I':'.',
+ sr & 0x0080 ? '?':'.',
+ sr & 0x0040 ? '?':'.',
+ sr & 0x0020 ? '?':'.',
+ sr & 0x0010 ? 'X':'.',
+ sr & 0x0008 ? 'N':'.',
+ sr & 0x0004 ? 'Z':'.',
+ sr & 0x0002 ? 'V':'.',
+ sr & 0x0001 ? 'C':'.');
+ break;
+
+ case CPUINFO_STR_REGISTER + M68K_PC: sprintf(info->s, "PC :%08X", m68k_get_reg(NULL, M68K_REG_PC)); break;
+ case CPUINFO_STR_REGISTER + M68K_SR: sprintf(info->s, "SR :%04X", m68k_get_reg(NULL, M68K_REG_SR)); break;
+ case CPUINFO_STR_REGISTER + M68K_SP: sprintf(info->s, "SP :%08X", m68k_get_reg(NULL, M68K_REG_SP)); break;
+ case CPUINFO_STR_REGISTER + M68K_ISP: sprintf(info->s, "ISP:%08X", m68k_get_reg(NULL, M68K_REG_ISP)); break;
+ case CPUINFO_STR_REGISTER + M68K_USP: sprintf(info->s, "USP:%08X", m68k_get_reg(NULL, M68K_REG_USP)); break;
+ case CPUINFO_STR_REGISTER + M68K_D0: sprintf(info->s, "D0 :%08X", m68k_get_reg(NULL, M68K_REG_D0)); break;
+ case CPUINFO_STR_REGISTER + M68K_D1: sprintf(info->s, "D1 :%08X", m68k_get_reg(NULL, M68K_REG_D1)); break;
+ case CPUINFO_STR_REGISTER + M68K_D2: sprintf(info->s, "D2 :%08X", m68k_get_reg(NULL, M68K_REG_D2)); break;
+ case CPUINFO_STR_REGISTER + M68K_D3: sprintf(info->s, "D3 :%08X", m68k_get_reg(NULL, M68K_REG_D3)); break;
+ case CPUINFO_STR_REGISTER + M68K_D4: sprintf(info->s, "D4 :%08X", m68k_get_reg(NULL, M68K_REG_D4)); break;
+ case CPUINFO_STR_REGISTER + M68K_D5: sprintf(info->s, "D5 :%08X", m68k_get_reg(NULL, M68K_REG_D5)); break;
+ case CPUINFO_STR_REGISTER + M68K_D6: sprintf(info->s, "D6 :%08X", m68k_get_reg(NULL, M68K_REG_D6)); break;
+ case CPUINFO_STR_REGISTER + M68K_D7: sprintf(info->s, "D7 :%08X", m68k_get_reg(NULL, M68K_REG_D7)); break;
+ case CPUINFO_STR_REGISTER + M68K_A0: sprintf(info->s, "A0 :%08X", m68k_get_reg(NULL, M68K_REG_A0)); break;
+ case CPUINFO_STR_REGISTER + M68K_A1: sprintf(info->s, "A1 :%08X", m68k_get_reg(NULL, M68K_REG_A1)); break;
+ case CPUINFO_STR_REGISTER + M68K_A2: sprintf(info->s, "A2 :%08X", m68k_get_reg(NULL, M68K_REG_A2)); break;
+ case CPUINFO_STR_REGISTER + M68K_A3: sprintf(info->s, "A3 :%08X", m68k_get_reg(NULL, M68K_REG_A3)); break;
+ case CPUINFO_STR_REGISTER + M68K_A4: sprintf(info->s, "A4 :%08X", m68k_get_reg(NULL, M68K_REG_A4)); break;
+ case CPUINFO_STR_REGISTER + M68K_A5: sprintf(info->s, "A5 :%08X", m68k_get_reg(NULL, M68K_REG_A5)); break;
+ case CPUINFO_STR_REGISTER + M68K_A6: sprintf(info->s, "A6 :%08X", m68k_get_reg(NULL, M68K_REG_A6)); break;
+ case CPUINFO_STR_REGISTER + M68K_A7: sprintf(info->s, "A7 :%08X", m68k_get_reg(NULL, M68K_REG_A7)); break;
+ case CPUINFO_STR_REGISTER + M68K_PREF_ADDR: sprintf(info->s, "PAR:%08X", m68k_get_reg(NULL, M68K_REG_PREF_ADDR)); break;
+ case CPUINFO_STR_REGISTER + M68K_PREF_DATA: sprintf(info->s, "PDA:%08X", m68k_get_reg(NULL, M68K_REG_PREF_DATA)); break;
+ case CPUINFO_STR_REGISTER + M68K_MSP: sprintf(info->s, "MSP:%08X", m68k_get_reg(NULL, M68K_REG_MSP)); break;
+ case CPUINFO_STR_REGISTER + M68K_CACR: sprintf(info->s, "CCR:%08X", m68k_get_reg(NULL, M68K_REG_CACR)); break;
+ case CPUINFO_STR_REGISTER + M68K_CAAR: sprintf(info->s, "CAR:%08X", m68k_get_reg(NULL, M68K_REG_CAAR)); break;
+ case CPUINFO_STR_REGISTER + M68K_SFC: sprintf(info->s, "SFC:%X", m68k_get_reg(NULL, M68K_REG_SFC)); break;
+ case CPUINFO_STR_REGISTER + M68K_DFC: sprintf(info->s, "DFC:%X", m68k_get_reg(NULL, M68K_REG_DFC)); break;
+ case CPUINFO_STR_REGISTER + M68K_VBR: sprintf(info->s, "VBR:%08X", m68k_get_reg(NULL, M68K_REG_VBR)); break;
+ }
+}
+
+#endif
+