Significantly pared down the 68k core. Merged outer MAME shell

into the core proper and removed unused macros. Changed all
external interfaces to pass the CPU device. Enabled 64-bit
operations by default. Re-derived the interface functions to
cascade and share code more aggressively.

These changes also seem to have cured the taito_f3 issues as
far as I can tell (at least pbobble3 seems right now).
This commit is contained in:
Aaron Giles 2008-11-17 09:39:11 +00:00
parent 8b4ee77ef0
commit 5a9c7e2d2d
36 changed files with 1008 additions and 2900 deletions

3
.gitattributes vendored
View File

@ -236,15 +236,12 @@ src/emu/cpu/m6800/6800tbl.c svneol=native#text/plain
src/emu/cpu/m6800/m6800.c svneol=native#text/plain src/emu/cpu/m6800/m6800.c svneol=native#text/plain
src/emu/cpu/m6800/m6800.h svneol=native#text/plain src/emu/cpu/m6800/m6800.h svneol=native#text/plain
src/emu/cpu/m68000/m68000.h svneol=native#text/plain src/emu/cpu/m68000/m68000.h svneol=native#text/plain
src/emu/cpu/m68000/m68k.h svneol=native#text/plain
src/emu/cpu/m68000/m68k_in.c svneol=native#text/plain src/emu/cpu/m68000/m68k_in.c svneol=native#text/plain
src/emu/cpu/m68000/m68kcpu.c svneol=native#text/plain src/emu/cpu/m68000/m68kcpu.c svneol=native#text/plain
src/emu/cpu/m68000/m68kcpu.h svneol=native#text/plain src/emu/cpu/m68000/m68kcpu.h svneol=native#text/plain
src/emu/cpu/m68000/m68kdasm.c svneol=native#text/plain src/emu/cpu/m68000/m68kdasm.c svneol=native#text/plain
src/emu/cpu/m68000/m68kfpu.c svneol=native#text/plain src/emu/cpu/m68000/m68kfpu.c svneol=native#text/plain
src/emu/cpu/m68000/m68kmake.c svneol=native#text/plain src/emu/cpu/m68000/m68kmake.c svneol=native#text/plain
src/emu/cpu/m68000/m68kmame.c svneol=native#text/plain
src/emu/cpu/m68000/m68kmame.h svneol=native#text/plain
src/emu/cpu/m6805/6805dasm.c svneol=native#text/plain src/emu/cpu/m6805/6805dasm.c svneol=native#text/plain
src/emu/cpu/m6805/6805ops.c svneol=native#text/plain src/emu/cpu/m6805/6805ops.c svneol=native#text/plain
src/emu/cpu/m6805/m6805.c svneol=native#text/plain src/emu/cpu/m6805/m6805.c svneol=native#text/plain

View File

@ -1097,16 +1097,11 @@ $(CPUOBJ)/mc68hc11/mc68hc11.o: $(CPUSRC)/mc68hc11/mc68hc11.c \
# Motorola 68000 series # Motorola 68000 series
#------------------------------------------------- #-------------------------------------------------
CPUDEFS += -DHAS_M68000=$(if $(filter M68000,$(CPUS)),1,0) CPUDEFS += -DHAS_M680X0=$(if $(filter M680X0,$(CPUS)),1,0)
CPUDEFS += -DHAS_M68008=$(if $(filter M68008,$(CPUS)),1,0)
CPUDEFS += -DHAS_M68010=$(if $(filter M68010,$(CPUS)),1,0)
CPUDEFS += -DHAS_M68EC020=$(if $(filter M68EC020,$(CPUS)),1,0)
CPUDEFS += -DHAS_M68020=$(if $(filter M68020,$(CPUS)),1,0)
CPUDEFS += -DHAS_M68040=$(if $(filter M68040,$(CPUS)),1,0)
ifneq ($(filter M68000 M68008 M68010 M68EC020 M68020 M68040,$(CPUS)),) ifneq ($(filter M680X0,$(CPUS)),)
OBJDIRS += $(CPUOBJ)/m68000 OBJDIRS += $(CPUOBJ)/m68000
CPUOBJS += $(CPUOBJ)/m68000/m68kcpu.o $(CPUOBJ)/m68000/m68kmame.o $(CPUOBJ)/m68000/m68kops.o CPUOBJS += $(CPUOBJ)/m68000/m68kcpu.o $(CPUOBJ)/m68000/m68kops.o
DBGOBJS += $(CPUOBJ)/m68000/m68kdasm.o DBGOBJS += $(CPUOBJ)/m68000/m68kdasm.o
M68KMAKE = $(BUILDOUT)/m68kmake$(BUILD_EXE) M68KMAKE = $(BUILDOUT)/m68kmake$(BUILD_EXE)
endif endif
@ -1140,9 +1135,6 @@ endif
$(CPUOBJ)/m68000/m68kcpu.o: $(CPUOBJ)/m68000/m68kops.c \ $(CPUOBJ)/m68000/m68kcpu.o: $(CPUOBJ)/m68000/m68kops.c \
$(CPUSRC)/m68000/m68kcpu.h $(CPUSRC)/m68000/m68kcpu.h
$(CPUOBJ)/m68000/m68kmame.o: $(CPUSRC)/m68000/m68kmame.c \
$(CPUSRC)/m68000/m68kcpu.h
#------------------------------------------------- #-------------------------------------------------

View File

@ -17,6 +17,19 @@
#define M68K_IRQ_6 6 #define M68K_IRQ_6 6
#define M68K_IRQ_7 7 #define M68K_IRQ_7 7
/* CPU types for use in m68k_set_cpu_type() */
enum
{
M68K_CPU_TYPE_INVALID,
M68K_CPU_TYPE_68000,
M68K_CPU_TYPE_68008,
M68K_CPU_TYPE_68010,
M68K_CPU_TYPE_68EC020,
M68K_CPU_TYPE_68020,
M68K_CPU_TYPE_68030, /* Supported by disassembler ONLY */
M68K_CPU_TYPE_68040 /* Supported by disassembler ONLY */
};
/* Special interrupt acknowledge values. /* Special interrupt acknowledge values.
* Use these as special returns from the interrupt acknowledge callback * Use these as special returns from the interrupt acknowledge callback
@ -52,135 +65,22 @@ enum
CPUINFO_PTR_M68K_TAS_CALLBACK CPUINFO_PTR_M68K_TAS_CALLBACK
}; };
/* Redirect memory calls */ typedef void (*m68k_bkpt_ack_func)(const device_config *device, UINT32 data);
typedef void (*m68k_reset_func)(const device_config *device);
typedef void (*m68k_cmpild_func)(const device_config *device, UINT32 data, UINT8 reg);
typedef void (*m68k_rte_func)(const device_config *device);
typedef int (*m68k_tas_func)(const device_config *device);
typedef struct _m68k_memory_interface m68k_memory_interface;
struct _m68k_memory_interface
{
offs_t opcode_xor; // Address Calculation
UINT16 (*readimm16)(const address_space *, offs_t); // Immediate read 16 bit
UINT8 (*read8)(const address_space *, offs_t); // Normal read 8 bit
UINT16 (*read16)(const address_space *, offs_t); // Normal read 16 bit
UINT32 (*read32)(const address_space *, offs_t); // Normal read 32 bit
void (*write8)(const address_space *, offs_t, UINT8); // Write 8 bit
void (*write16)(const address_space *, offs_t, UINT16); // Write 16 bit
void (*write32)(const address_space *, offs_t, UINT32); // Write 32 bit
};
typedef struct _m68k_encryption_interface m68k_encryption_interface;
struct _m68k_encryption_interface
{
UINT8 (*read8pc)(offs_t); // PC Relative read 8 bit
UINT16 (*read16pc)(offs_t); // PC Relative read 16 bit
UINT32 (*read32pc)(offs_t); // PC Relative read 32 bit
UINT16 (*read16d)(offs_t); // Direct read 16 bit
UINT32 (*read32d)(offs_t); // Direct read 32 bit
};
/* The MAME API for MC68000 */
#define MC68000_IRQ_1 1
#define MC68000_IRQ_2 2
#define MC68000_IRQ_3 3
#define MC68000_IRQ_4 4
#define MC68000_IRQ_5 5
#define MC68000_IRQ_6 6
#define MC68000_IRQ_7 7
#define MC68000_INT_ACK_AUTOVECTOR -1
#define MC68000_INT_ACK_SPURIOUS -2
CPU_GET_INFO( m68000 ); CPU_GET_INFO( m68000 );
extern void m68000_memory_interface_set(int Entry,void * memory_routine);
/****************************************************************************
* M68008 section
****************************************************************************/
#if HAS_M68008
#define MC68008_IRQ_1 MC68000_IRQ_1
#define MC68008_IRQ_2 MC68000_IRQ_2
#define MC68008_IRQ_3 MC68000_IRQ_3
#define MC68008_IRQ_4 MC68000_IRQ_4
#define MC68008_IRQ_5 MC68000_IRQ_5
#define MC68008_IRQ_6 MC68000_IRQ_6
#define MC68008_IRQ_7 MC68000_IRQ_7
#define MC68008_INT_ACK_AUTOVECTOR MC68000_INT_ACK_AUTOVECTOR
#define MC68008_INT_ACK_SPURIOUS MC68000_INT_ACK_SPURIOUS
CPU_GET_INFO( m68008 ); CPU_GET_INFO( m68008 );
#endif
/****************************************************************************
* M68010 section
****************************************************************************/
#if HAS_M68010
#define MC68010_IRQ_1 MC68000_IRQ_1
#define MC68010_IRQ_2 MC68000_IRQ_2
#define MC68010_IRQ_3 MC68000_IRQ_3
#define MC68010_IRQ_4 MC68000_IRQ_4
#define MC68010_IRQ_5 MC68000_IRQ_5
#define MC68010_IRQ_6 MC68000_IRQ_6
#define MC68010_IRQ_7 MC68000_IRQ_7
#define MC68010_INT_ACK_AUTOVECTOR MC68000_INT_ACK_AUTOVECTOR
#define MC68010_INT_ACK_SPURIOUS MC68000_INT_ACK_SPURIOUS
CPU_GET_INFO( m68010 ); CPU_GET_INFO( m68010 );
#endif
/****************************************************************************
* M68EC020 section
****************************************************************************/
#if HAS_M68EC020
#define MC68EC020_IRQ_1 MC68000_IRQ_1
#define MC68EC020_IRQ_2 MC68000_IRQ_2
#define MC68EC020_IRQ_3 MC68000_IRQ_3
#define MC68EC020_IRQ_4 MC68000_IRQ_4
#define MC68EC020_IRQ_5 MC68000_IRQ_5
#define MC68EC020_IRQ_6 MC68000_IRQ_6
#define MC68EC020_IRQ_7 MC68000_IRQ_7
#define MC68EC020_INT_ACK_AUTOVECTOR MC68000_INT_ACK_AUTOVECTOR
#define MC68EC020_INT_ACK_SPURIOUS MC68000_INT_ACK_SPURIOUS
CPU_GET_INFO( m68ec020 ); CPU_GET_INFO( m68ec020 );
#endif
/****************************************************************************
* M68020 section
****************************************************************************/
#if HAS_M68020
#define MC68020_IRQ_1 MC68000_IRQ_1
#define MC68020_IRQ_2 MC68000_IRQ_2
#define MC68020_IRQ_3 MC68000_IRQ_3
#define MC68020_IRQ_4 MC68000_IRQ_4
#define MC68020_IRQ_5 MC68000_IRQ_5
#define MC68020_IRQ_6 MC68000_IRQ_6
#define MC68020_IRQ_7 MC68000_IRQ_7
#define MC68020_INT_ACK_AUTOVECTOR MC68000_INT_ACK_AUTOVECTOR
#define MC68020_INT_ACK_SPURIOUS MC68000_INT_ACK_SPURIOUS
CPU_GET_INFO( m68020 ); CPU_GET_INFO( m68020 );
#endif
/****************************************************************************
* M68040 section
****************************************************************************/
#if HAS_M68040
#define MC68040_IRQ_1 MC68000_IRQ_1
#define MC68040_IRQ_2 MC68000_IRQ_2
#define MC68040_IRQ_3 MC68000_IRQ_3
#define MC68040_IRQ_4 MC68000_IRQ_4
#define MC68040_IRQ_5 MC68000_IRQ_5
#define MC68040_IRQ_6 MC68000_IRQ_6
#define MC68040_IRQ_7 MC68000_IRQ_7
#define MC68040_INT_ACK_AUTOVECTOR MC68000_INT_ACK_AUTOVECTOR
#define MC68040_INT_ACK_SPURIOUS MC68000_INT_ACK_SPURIOUS
CPU_GET_INFO( m68040 ); CPU_GET_INFO( m68040 );
#endif
// C Core header void m68k_set_encrypted_opcode_range(const device_config *device, offs_t start, offs_t end);
#include "m68kmame.h"
unsigned int m68k_disassemble_raw(char* str_buff, unsigned int pc, const unsigned char* opdata, const unsigned char* argdata, unsigned int cpu_type);
#endif /* __M68000_H__ */ #endif /* __M68000_H__ */

View File

@ -1,266 +0,0 @@
#pragma once
#ifndef __M68K_H__
#define __M68K_H__
/* ======================================================================== */
/* ========================= LICENSING & COPYRIGHT ======================== */
/* ======================================================================== */
/*
* MUSASHI
* Version 3.32
*
* A portable Motorola M680x0 processor emulation engine.
* Copyright Karl Stenerud. All rights reserved.
*
* This code may be freely used for non-commercial purposes as long as this
* copyright notice remains unaltered in the source code and any binary files
* containing this code in compiled form.
*
* All other licensing terms must be negotiated with the author
* (Karl Stenerud).
*
* The latest version of this code can be obtained at:
* http://kstenerud.cjb.net
*/
/* ======================================================================== */
/* ============================ GENERAL DEFINES =========================== */
/* ======================================================================== */
/* CPU types for use in m68k_set_cpu_type() */
enum
{
M68K_CPU_TYPE_INVALID,
M68K_CPU_TYPE_68000,
M68K_CPU_TYPE_68008,
M68K_CPU_TYPE_68010,
M68K_CPU_TYPE_68EC020,
M68K_CPU_TYPE_68020,
M68K_CPU_TYPE_68030, /* Supported by disassembler ONLY */
M68K_CPU_TYPE_68040 /* Supported by disassembler ONLY */
};
/* Registers used by m68k_get_reg() and m68k_set_reg() */
enum _m68k_register_t
{
/* Real registers */
M68K_REG_D0, /* Data registers */
M68K_REG_D1,
M68K_REG_D2,
M68K_REG_D3,
M68K_REG_D4,
M68K_REG_D5,
M68K_REG_D6,
M68K_REG_D7,
M68K_REG_A0, /* Address registers */
M68K_REG_A1,
M68K_REG_A2,
M68K_REG_A3,
M68K_REG_A4,
M68K_REG_A5,
M68K_REG_A6,
M68K_REG_A7,
M68K_REG_PC, /* Program Counter */
M68K_REG_SR, /* Status Register */
M68K_REG_SP, /* The current Stack Pointer (located in A7) */
M68K_REG_USP, /* User Stack Pointer */
M68K_REG_ISP, /* Interrupt Stack Pointer */
M68K_REG_MSP, /* Master Stack Pointer */
M68K_REG_SFC, /* Source Function Code */
M68K_REG_DFC, /* Destination Function Code */
M68K_REG_VBR, /* Vector Base Register */
M68K_REG_CACR, /* Cache Control Register */
M68K_REG_CAAR, /* Cache Address Register */
/* Assumed registers */
/* These are cheat registers which emulate the 1-longword prefetch
* present in the 68000 and 68010.
*/
M68K_REG_PREF_ADDR, /* Last prefetch address */
M68K_REG_PREF_DATA, /* Last prefetch data */
/* Convenience registers */
M68K_REG_PPC, /* Previous value in the program counter */
M68K_REG_IR, /* Instruction register */
M68K_REG_CPU_TYPE /* Type of CPU being run */
};
typedef enum _m68k_register_t m68k_register_t;
/* ======================================================================== */
/* ============================== CALLBACKS =============================== */
/* ======================================================================== */
/* These functions allow you to set callbacks to the host when specific events
* occur. Note that you must enable the corresponding value in m68kconf.h
* in order for these to do anything useful.
* Note: I have defined default callbacks which are used if you have enabled
* the corresponding #define in m68kconf.h but either haven't assigned a
* callback or have assigned a callback of NULL.
*/
/* Set the callback for an interrupt acknowledge.
* The CPU will call the callback with the interrupt level being acknowledged.
* The host program must return either a vector from 0x02-0xff, or one of the
* special interrupt acknowledge values specified earlier in this header.
* If this is not implemented, the CPU will always assume an autovectored
* interrupt, and will automatically clear the interrupt request when it
* services the interrupt.
* Default behavior: return M68K_INT_ACK_AUTOVECTOR.
*/
void m68k_set_int_ack_callback(m68ki_cpu_core *m68k, void *param, int (*callback)(void *param, int int_level));
/* Set the callback for a breakpoint acknowledge (68010+).
* The CPU will call the callback with whatever was in the data field of the
* BKPT instruction for 68020+, or 0 for 68010.
* Default behavior: do nothing.
*/
void m68k_set_bkpt_ack_callback(m68ki_cpu_core *m68k, void (*callback)(unsigned int data));
/* Set the callback for the RESET instruction.
* The CPU calls this callback every time it encounters a RESET instruction.
* Default behavior: do nothing.
*/
void m68k_set_reset_instr_callback(m68ki_cpu_core *m68k, void (*callback)(void));
/* Set the callback for the CMPI.L #v, Dn instruction.
* The CPU calls this callback every time it encounters a CMPI.L #v, Dn instruction.
* Default behavior: do nothing.
*/
void m68k_set_cmpild_instr_callback(m68ki_cpu_core *m68k, void (*callback)(unsigned int val, int reg));
/* Set the callback for the RTE instruction.
* The CPU calls this callback every time it encounters a RTE instruction.
* Default behavior: do nothing.
*/
void m68k_set_rte_instr_callback(m68ki_cpu_core *m68k, void (*callback)(void));
/* Set the callback for the TAS instruction.
* The CPU calls this callback every time it encounters a TAS instruction.
* Default behavior: return 1, allow writeback.
*/
void m68k_set_tas_instr_callback(m68ki_cpu_core *m68k, int (*callback)(void));
/* Set the callback for CPU function code changes.
* You must enable M68K_EMULATE_FC in m68kconf.h.
* The CPU calls this callback with the function code before every memory
* access to set the CPU's function code according to what kind of memory
* access it is (supervisor/user, program/data and such).
* Default behavior: do nothing.
*/
void m68k_set_fc_callback(m68ki_cpu_core *m68k, void (*callback)(unsigned int new_fc));
/* ======================================================================== */
/* ====================== FUNCTIONS TO ACCESS THE CPU ===================== */
/* ======================================================================== */
/* Use this function to set the CPU type you want to emulate.
* Currently supported types are: M68K_CPU_TYPE_68000, M68K_CPU_TYPE_68008,
* M68K_CPU_TYPE_68010, M68K_CPU_TYPE_EC020, and M68K_CPU_TYPE_68020.
*/
void m68k_set_cpu_type(m68ki_cpu_core *m68k, unsigned int cpu_type);
/* Do whatever initialisations the core requires. Should be called
* at least once at init time.
*/
void m68k_init(m68ki_cpu_core *m68k);
/* Pulse the RESET pin on the CPU.
* You *MUST* reset the CPU at least once to initialize the emulation
* Note: If you didn't call m68k_set_cpu_type() before resetting
* the CPU for the first time, the CPU will be set to
* M68K_CPU_TYPE_68000.
*/
void m68k_pulse_reset(m68ki_cpu_core *m68k);
/* execute num_cycles worth of instructions. returns number of cycles used */
int m68k_execute(m68ki_cpu_core *m68k, int num_cycles);
/* These functions let you read/write/modify the number of cycles left to run
* while m68k_execute() is running.
* These are useful if the 68k accesses a memory-mapped port on another device
* that requires immediate processing by another CPU.
*/
int m68k_cycles_run(m68ki_cpu_core *m68k); /* Number of cycles run so far */
int m68k_cycles_remaining(m68ki_cpu_core *m68k); /* Number of cycles left */
void m68k_modify_timeslice(m68ki_cpu_core *m68k, int cycles); /* Modify cycles left */
void m68k_end_timeslice(m68ki_cpu_core *m68k); /* End timeslice now */
/* Set the IPL0-IPL2 pins on the CPU (IRQ).
* A transition from < 7 to 7 will cause a non-maskable interrupt (NMI).
* Setting IRQ to 0 will clear an interrupt request.
*/
void m68k_set_irq(m68ki_cpu_core *m68k, unsigned int int_level);
/* Set the virtual irq lines, where the highest level
* active line is automatically selected. If you use this function,
* do not use m68k_set_irq.
*/
void m68k_set_virq(m68ki_cpu_core *m68k, unsigned int level, unsigned int active);
unsigned int m68k_get_virq(m68ki_cpu_core *m68k, unsigned int level);
/* Halt the CPU as if you pulsed the HALT pin. */
void m68k_pulse_halt(m68ki_cpu_core *m68k);
/* Context switching to allow multiple CPUs */
/* Get the size of the cpu context in bytes */
unsigned int m68k_context_size(void);
/* Get a cpu context */
unsigned int m68k_get_context(void* dst);
/* set the current cpu context */
void m68k_set_context(void* dst);
/* Register the CPU state information */
void m68k_state_register(m68ki_cpu_core *m68k, const char *type);
/* Peek at the internals of a CPU context. This can either be a context
* retrieved using m68k_get_context() or the currently running context.
* If context is NULL, the currently running CPU context will be used.
*/
unsigned int m68k_get_reg(m68ki_cpu_core *m68k, m68k_register_t regnum);
/* Poke values into the internals of the currently running CPU context */
void m68k_set_reg(m68ki_cpu_core *m68k, m68k_register_t reg, unsigned int value);
/* Check if an instruction is valid for the specified CPU type */
unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cpu_type);
/* Disassemble 1 instruction using the epecified CPU type at pc. Stores
* disassembly in str_buff and returns the size of the instruction in bytes.
*/
unsigned int m68k_disassemble(char* str_buff, unsigned int pc, unsigned int cpu_type);
/* Same as above but accepts raw opcode data directly rather than fetching
* via the read/write interfaces.
*/
unsigned int m68k_disassemble_raw(char* str_buff, unsigned int pc, const unsigned char* opdata, const unsigned char* argdata, unsigned int cpu_type);
/* ======================================================================== */
/* ============================== MAME STUFF ============================== */
/* ======================================================================== */
#include "m68kmame.h"
/* ======================================================================== */
/* ============================== END OF FILE ============================= */
/* ======================================================================== */
#endif /* __M68K_H__ */

View File

@ -259,6 +259,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
M68KMAKE_OPCODE_HANDLER_HEADER M68KMAKE_OPCODE_HANDLER_HEADER
#include "m68kcpu.h" #include "m68kcpu.h"
#include "mame.h"
extern void m68040_fpu_op0(m68ki_cpu_core *m68k); extern void m68040_fpu_op0(m68ki_cpu_core *m68k);
extern void m68040_fpu_op1(m68ki_cpu_core *m68k); extern void m68040_fpu_op1(m68ki_cpu_core *m68k);
@ -3119,7 +3120,8 @@ M68KMAKE_OP(bkpt, 0, ., .)
{ {
if(CPU_TYPE_IS_010_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_010_PLUS(m68k->cpu_type))
{ {
(*m68k->bkpt_ack_callback)(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type) ? m68k->ir & 7 : 0); if (m68k->bkpt_ack_callback != NULL)
(*m68k->bkpt_ack_callback)(m68k->device, CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type) ? m68k->ir & 7 : 0);
} }
m68ki_exception_illegal(m68k); m68ki_exception_illegal(m68k);
} }
@ -3283,9 +3285,8 @@ M68KMAKE_OP(callm, 32, ., .)
m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
REG_PC += 2; REG_PC += 2;
(void)ea; /* just to avoid an 'unused variable' warning */ (void)ea; /* just to avoid an 'unused variable' warning */
M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", logerror("%s at %08x: called unimplemented instruction %04x (callm)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PC - 2, m68k->ir, m68k->device->tag, REG_PC - 2, m68k->ir);
m68k_disassemble_quick(REG_PC - 2)));
return; return;
} }
m68ki_exception_illegal(m68k); m68ki_exception_illegal(m68k);
@ -4221,7 +4222,8 @@ M68KMAKE_OP(cmpi, 32, ., d)
UINT32 dst = DY; UINT32 dst = DY;
UINT32 res = dst - src; UINT32 res = dst - src;
(*m68k->cmpild_instr_callback)(src, m68k->ir & 7); /* auto-disable (see m68kcpu.h) */ if (m68k->cmpild_instr_callback != NULL)
(*m68k->cmpild_instr_callback)(m68k->device, src, m68k->ir & 7);
m68k->n_flag = NFLAG_32(res); m68k->n_flag = NFLAG_32(res);
m68k->not_z_flag = MASK_OUT_ABOVE_32(res); m68k->not_z_flag = MASK_OUT_ABOVE_32(res);
@ -4361,9 +4363,8 @@ M68KMAKE_OP(cpbcc, 32, ., .)
{ {
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", logerror( "%s at %08x: called unimplemented instruction %04x (cpbcc)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PC - 2, m68k->ir, m68k->device->tag, REG_PC - 2, m68k->ir);
m68k_disassemble_quick(REG_PC - 2)));
return; return;
} }
m68ki_exception_1111(m68k); m68ki_exception_1111(m68k);
@ -4374,9 +4375,8 @@ M68KMAKE_OP(cpdbcc, 32, ., .)
{ {
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", logerror("%s at %08x: called unimplemented instruction %04x (cpdbcc)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PC - 2, m68k->ir, m68k->device->tag, REG_PC - 2, m68k->ir);
m68k_disassemble_quick(REG_PC - 2)));
return; return;
} }
m68ki_exception_1111(m68k); m68ki_exception_1111(m68k);
@ -4387,9 +4387,8 @@ M68KMAKE_OP(cpgen, 32, ., .)
{ {
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", logerror("%s at %08x: called unimplemented instruction %04x (cpgen)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PC - 2, m68k->ir, m68k->device->tag, REG_PC - 2, m68k->ir);
m68k_disassemble_quick(REG_PC - 2)));
return; return;
} }
m68ki_exception_1111(m68k); m68ki_exception_1111(m68k);
@ -4400,9 +4399,8 @@ M68KMAKE_OP(cpscc, 32, ., .)
{ {
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", logerror("%s at %08x: called unimplemented instruction %04x (cpscc)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PC - 2, m68k->ir, m68k->device->tag, REG_PC - 2, m68k->ir);
m68k_disassemble_quick(REG_PC - 2)));
return; return;
} }
m68ki_exception_1111(m68k); m68ki_exception_1111(m68k);
@ -4413,9 +4411,8 @@ M68KMAKE_OP(cptrapcc, 32, ., .)
{ {
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", logerror("%s at %08x: called unimplemented instruction %04x (cptrapcc)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PC - 2, m68k->ir, m68k->device->tag, REG_PC - 2, m68k->ir);
m68k_disassemble_quick(REG_PC - 2)));
return; return;
} }
m68ki_exception_1111(m68k); m68ki_exception_1111(m68k);
@ -4603,8 +4600,6 @@ M68KMAKE_OP(divu, 16, ., .)
M68KMAKE_OP(divl, 32, ., d) M68KMAKE_OP(divl, 32, ., d)
{ {
#if M68K_USE_64_BIT
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
UINT32 word2 = OPER_I_16(m68k); UINT32 word2 = OPER_I_16(m68k);
@ -4670,152 +4665,11 @@ M68KMAKE_OP(divl, 32, ., d)
return; return;
} }
m68ki_exception_illegal(m68k); m68ki_exception_illegal(m68k);
#else
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{
UINT32 word2 = OPER_I_16(m68k);
UINT32 divisor = DY;
UINT32 dividend_hi = REG_D[word2 & 7];
UINT32 dividend_lo = REG_D[(word2 >> 12) & 7];
UINT32 quotient = 0;
UINT32 remainder = 0;
UINT32 dividend_neg = 0;
UINT32 divisor_neg = 0;
INT32 i;
UINT32 overflow;
if(divisor != 0)
{
/* quad / long : long quotient, long remainder */
if(BIT_A(word2))
{
if(BIT_B(word2)) /* signed */
{
/* special case in signed divide */
if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
{
REG_D[word2 & 7] = 0;
REG_D[(word2 >> 12) & 7] = 0x80000000;
m68k->n_flag = NFLAG_SET;
m68k->not_z_flag = ZFLAG_CLEAR;
m68k->v_flag = VFLAG_CLEAR;
m68k->c_flag = CFLAG_CLEAR;
return;
}
if(GET_MSB_32(dividend_hi))
{
dividend_neg = 1;
dividend_hi = (UINT32)MASK_OUT_ABOVE_32((-(INT32)dividend_hi) - (dividend_lo != 0));
dividend_lo = (UINT32)MASK_OUT_ABOVE_32(-(INT32)dividend_lo);
}
if(GET_MSB_32(divisor))
{
divisor_neg = 1;
divisor = (UINT32)MASK_OUT_ABOVE_32(-(INT32)divisor);
}
}
/* if the upper long is greater than the divisor, we're overflowing. */
if(dividend_hi >= divisor)
{
m68k->v_flag = VFLAG_SET;
return;
}
for(i = 31; i >= 0; i--)
{
quotient <<= 1;
remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
if(remainder >= divisor)
{
remainder -= divisor;
quotient++;
}
}
for(i = 31; i >= 0; i--)
{
quotient <<= 1;
overflow = GET_MSB_32(remainder);
remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
if(remainder >= divisor || overflow)
{
remainder -= divisor;
quotient++;
}
}
if(BIT_B(word2)) /* signed */
{
if(quotient > 0x7fffffff)
{
m68k->v_flag = VFLAG_SET;
return;
}
if(dividend_neg)
{
remainder = (UINT32)MASK_OUT_ABOVE_32(-(INT32)remainder);
quotient = (UINT32)MASK_OUT_ABOVE_32(-(INT32)quotient);
}
if(divisor_neg)
quotient = (UINT32)MASK_OUT_ABOVE_32(-(INT32)quotient);
}
REG_D[word2 & 7] = remainder;
REG_D[(word2 >> 12) & 7] = quotient;
m68k->n_flag = NFLAG_32(quotient);
m68k->not_z_flag = quotient;
m68k->v_flag = VFLAG_CLEAR;
m68k->c_flag = CFLAG_CLEAR;
return;
}
/* long / long: long quotient, maybe long remainder */
if(BIT_B(word2)) /* signed */
{
/* Special case in divide */
if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
{
m68k->n_flag = NFLAG_SET;
m68k->not_z_flag = ZFLAG_CLEAR;
m68k->v_flag = VFLAG_CLEAR;
m68k->c_flag = CFLAG_CLEAR;
REG_D[(word2 >> 12) & 7] = 0x80000000;
REG_D[word2 & 7] = 0;
return;
}
REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
}
else
{
REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
}
m68k->n_flag = NFLAG_32(quotient);
m68k->not_z_flag = quotient;
m68k->v_flag = VFLAG_CLEAR;
m68k->c_flag = CFLAG_CLEAR;
return;
}
m68ki_exception_trap(m68k, EXCEPTION_ZERO_DIVIDE);
return;
}
m68ki_exception_illegal(m68k);
#endif
} }
M68KMAKE_OP(divl, 32, ., .) M68KMAKE_OP(divl, 32, ., .)
{ {
#if M68K_USE_64_BIT
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
UINT32 word2 = OPER_I_16(m68k); UINT32 word2 = OPER_I_16(m68k);
@ -4881,145 +4735,6 @@ M68KMAKE_OP(divl, 32, ., .)
return; return;
} }
m68ki_exception_illegal(m68k); m68ki_exception_illegal(m68k);
#else
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{
UINT32 word2 = OPER_I_16(m68k);
UINT32 divisor = M68KMAKE_GET_OPER_AY_32;
UINT32 dividend_hi = REG_D[word2 & 7];
UINT32 dividend_lo = REG_D[(word2 >> 12) & 7];
UINT32 quotient = 0;
UINT32 remainder = 0;
UINT32 dividend_neg = 0;
UINT32 divisor_neg = 0;
INT32 i;
UINT32 overflow;
if(divisor != 0)
{
/* quad / long : long quotient, long remainder */
if(BIT_A(word2))
{
if(BIT_B(word2)) /* signed */
{
/* special case in signed divide */
if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
{
REG_D[word2 & 7] = 0;
REG_D[(word2 >> 12) & 7] = 0x80000000;
m68k->n_flag = NFLAG_SET;
m68k->not_z_flag = ZFLAG_CLEAR;
m68k->v_flag = VFLAG_CLEAR;
m68k->c_flag = CFLAG_CLEAR;
return;
}
if(GET_MSB_32(dividend_hi))
{
dividend_neg = 1;
dividend_hi = (UINT32)MASK_OUT_ABOVE_32((-(INT32)dividend_hi) - (dividend_lo != 0));
dividend_lo = (UINT32)MASK_OUT_ABOVE_32(-(INT32)dividend_lo);
}
if(GET_MSB_32(divisor))
{
divisor_neg = 1;
divisor = (UINT32)MASK_OUT_ABOVE_32(-(INT32)divisor);
}
}
/* if the upper long is greater than the divisor, we're overflowing. */
if(dividend_hi >= divisor)
{
m68k->v_flag = VFLAG_SET;
return;
}
for(i = 31; i >= 0; i--)
{
quotient <<= 1;
remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
if(remainder >= divisor)
{
remainder -= divisor;
quotient++;
}
}
for(i = 31; i >= 0; i--)
{
quotient <<= 1;
overflow = GET_MSB_32(remainder);
remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
if(remainder >= divisor || overflow)
{
remainder -= divisor;
quotient++;
}
}
if(BIT_B(word2)) /* signed */
{
if(quotient > 0x7fffffff)
{
m68k->v_flag = VFLAG_SET;
return;
}
if(dividend_neg)
{
remainder = (UINT32)MASK_OUT_ABOVE_32(-(INT32)remainder);
quotient = (UINT32)MASK_OUT_ABOVE_32(-(INT32)quotient);
}
if(divisor_neg)
quotient = (UINT32)MASK_OUT_ABOVE_32(-(INT32)quotient);
}
REG_D[word2 & 7] = remainder;
REG_D[(word2 >> 12) & 7] = quotient;
m68k->n_flag = NFLAG_32(quotient);
m68k->not_z_flag = quotient;
m68k->v_flag = VFLAG_CLEAR;
m68k->c_flag = CFLAG_CLEAR;
return;
}
/* long / long: long quotient, maybe long remainder */
if(BIT_B(word2)) /* signed */
{
/* Special case in divide */
if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
{
m68k->n_flag = NFLAG_SET;
m68k->not_z_flag = ZFLAG_CLEAR;
m68k->v_flag = VFLAG_CLEAR;
m68k->c_flag = CFLAG_CLEAR;
REG_D[(word2 >> 12) & 7] = 0x80000000;
REG_D[word2 & 7] = 0;
return;
}
REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
}
else
{
REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
}
m68k->n_flag = NFLAG_32(quotient);
m68k->not_z_flag = quotient;
m68k->v_flag = VFLAG_CLEAR;
m68k->c_flag = CFLAG_CLEAR;
return;
}
m68ki_exception_trap(m68k, EXCEPTION_ZERO_DIVIDE);
return;
}
m68ki_exception_illegal(m68k);
#endif
} }
@ -7541,8 +7256,6 @@ M68KMAKE_OP(mulu, 16, ., .)
M68KMAKE_OP(mull, 32, ., d) M68KMAKE_OP(mull, 32, ., d)
{ {
#if M68K_USE_64_BIT
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
UINT32 word2 = OPER_I_16(m68k); UINT32 word2 = OPER_I_16(m68k);
@ -7588,85 +7301,11 @@ M68KMAKE_OP(mull, 32, ., d)
return; return;
} }
m68ki_exception_illegal(m68k); m68ki_exception_illegal(m68k);
#else
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{
UINT32 word2 = OPER_I_16(m68k);
UINT32 src = DY;
UINT32 dst = REG_D[(word2 >> 12) & 7];
UINT32 neg = GET_MSB_32(src ^ dst);
UINT32 src1;
UINT32 src2;
UINT32 dst1;
UINT32 dst2;
UINT32 r1;
UINT32 r2;
UINT32 r3;
UINT32 r4;
UINT32 lo;
UINT32 hi;
m68k->c_flag = CFLAG_CLEAR;
if(BIT_B(word2)) /* signed */
{
if(GET_MSB_32(src))
src = (UINT32)MASK_OUT_ABOVE_32(-(INT32)src);
if(GET_MSB_32(dst))
dst = (UINT32)MASK_OUT_ABOVE_32(-(INT32)dst);
}
src1 = MASK_OUT_ABOVE_16(src);
src2 = src>>16;
dst1 = MASK_OUT_ABOVE_16(dst);
dst2 = dst>>16;
r1 = src1 * dst1;
r2 = src1 * dst2;
r3 = src2 * dst1;
r4 = src2 * dst2;
lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
if(BIT_B(word2) && neg)
{
hi = (UINT32)MASK_OUT_ABOVE_32((-(INT32)hi) - (lo != 0));
lo = (UINT32)MASK_OUT_ABOVE_32(-(INT32)lo);
}
if(BIT_A(word2))
{
REG_D[word2 & 7] = hi;
REG_D[(word2 >> 12) & 7] = lo;
m68k->n_flag = NFLAG_32(hi);
m68k->not_z_flag = hi | lo;
m68k->v_flag = VFLAG_CLEAR;
return;
}
REG_D[(word2 >> 12) & 7] = lo;
m68k->n_flag = NFLAG_32(lo);
m68k->not_z_flag = lo;
if(BIT_B(word2))
m68k->v_flag = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
else
m68k->v_flag = (hi != 0) << 7;
return;
}
m68ki_exception_illegal(m68k);
#endif
} }
M68KMAKE_OP(mull, 32, ., .) M68KMAKE_OP(mull, 32, ., .)
{ {
#if M68K_USE_64_BIT
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type)) if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{ {
UINT32 word2 = OPER_I_16(m68k); UINT32 word2 = OPER_I_16(m68k);
@ -7712,78 +7351,6 @@ M68KMAKE_OP(mull, 32, ., .)
return; return;
} }
m68ki_exception_illegal(m68k); m68ki_exception_illegal(m68k);
#else
if(CPU_TYPE_IS_EC020_PLUS(m68k->cpu_type))
{
UINT32 word2 = OPER_I_16(m68k);
UINT32 src = M68KMAKE_GET_OPER_AY_32;
UINT32 dst = REG_D[(word2 >> 12) & 7];
UINT32 neg = GET_MSB_32(src ^ dst);
UINT32 src1;
UINT32 src2;
UINT32 dst1;
UINT32 dst2;
UINT32 r1;
UINT32 r2;
UINT32 r3;
UINT32 r4;
UINT32 lo;
UINT32 hi;
m68k->c_flag = CFLAG_CLEAR;
if(BIT_B(word2)) /* signed */
{
if(GET_MSB_32(src))
src = (UINT32)MASK_OUT_ABOVE_32(-(INT32)src);
if(GET_MSB_32(dst))
dst = (UINT32)MASK_OUT_ABOVE_32(-(INT32)dst);
}
src1 = MASK_OUT_ABOVE_16(src);
src2 = src>>16;
dst1 = MASK_OUT_ABOVE_16(dst);
dst2 = dst>>16;
r1 = src1 * dst1;
r2 = src1 * dst2;
r3 = src2 * dst1;
r4 = src2 * dst2;
lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
if(BIT_B(word2) && neg)
{
hi = (UINT32)MASK_OUT_ABOVE_32((-(INT32)hi) - (lo != 0));
lo = (UINT32)MASK_OUT_ABOVE_32(-(INT32)lo);
}
if(BIT_A(word2))
{
REG_D[word2 & 7] = hi;
REG_D[(word2 >> 12) & 7] = lo;
m68k->n_flag = NFLAG_32(hi);
m68k->not_z_flag = hi | lo;
m68k->v_flag = VFLAG_CLEAR;
return;
}
REG_D[(word2 >> 12) & 7] = lo;
m68k->n_flag = NFLAG_32(lo);
m68k->not_z_flag = lo;
if(BIT_B(word2))
m68k->v_flag = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
else
m68k->v_flag = (hi != 0) << 7;
return;
}
m68ki_exception_illegal(m68k);
#endif
} }
@ -8437,7 +8004,8 @@ M68KMAKE_OP(reset, 0, ., .)
{ {
if(m68k->s_flag) if(m68k->s_flag)
{ {
(*m68k->reset_instr_callback)(); if (m68k->reset_instr_callback != NULL)
(*m68k->reset_instr_callback)(m68k->device);
USE_CYCLES(m68k, m68k->cyc_reset); USE_CYCLES(m68k, m68k->cyc_reset);
return; return;
} }
@ -8814,8 +8382,6 @@ M68KMAKE_OP(roxr, 16, s, .)
M68KMAKE_OP(roxr, 32, s, .) M68KMAKE_OP(roxr, 32, s, .)
{ {
#if M68K_USE_64_BIT
UINT32* r_dst = &DY; UINT32* r_dst = &DY;
UINT32 shift = (((m68k->ir >> 9) - 1) & 7) + 1; UINT32 shift = (((m68k->ir >> 9) - 1) & 7) + 1;
UINT64 src = *r_dst; UINT64 src = *r_dst;
@ -8834,26 +8400,6 @@ M68KMAKE_OP(roxr, 32, s, .)
m68k->n_flag = NFLAG_32(res); m68k->n_flag = NFLAG_32(res);
m68k->not_z_flag = res; m68k->not_z_flag = res;
m68k->v_flag = VFLAG_CLEAR; m68k->v_flag = VFLAG_CLEAR;
#else
UINT32* r_dst = &DY;
UINT32 shift = (((m68k->ir >> 9) - 1) & 7) + 1;
UINT32 src = *r_dst;
UINT32 res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1(m68k) << (32 - shift)));
UINT32 new_x_flag = src & (1 << (shift - 1));
if(shift != 0)
USE_CYCLES(m68k, shift<<m68k->cyc_shift);
*r_dst = res;
m68k->c_flag = m68k->x_flag = (new_x_flag != 0)<<8;
m68k->n_flag = NFLAG_32(res);
m68k->not_z_flag = res;
m68k->v_flag = VFLAG_CLEAR;
#endif
} }
@ -8919,8 +8465,6 @@ M68KMAKE_OP(roxr, 16, r, .)
M68KMAKE_OP(roxr, 32, r, .) M68KMAKE_OP(roxr, 32, r, .)
{ {
#if M68K_USE_64_BIT
UINT32* r_dst = &DY; UINT32* r_dst = &DY;
UINT32 orig_shift = DX & 0x3f; UINT32 orig_shift = DX & 0x3f;
@ -8948,32 +8492,6 @@ M68KMAKE_OP(roxr, 32, r, .)
m68k->n_flag = NFLAG_32(*r_dst); m68k->n_flag = NFLAG_32(*r_dst);
m68k->not_z_flag = *r_dst; m68k->not_z_flag = *r_dst;
m68k->v_flag = VFLAG_CLEAR; m68k->v_flag = VFLAG_CLEAR;
#else
UINT32* r_dst = &DY;
UINT32 orig_shift = DX & 0x3f;
UINT32 shift = orig_shift % 33;
UINT32 src = *r_dst;
UINT32 res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1(m68k) << (32 - shift)));
UINT32 new_x_flag = src & (1 << (shift - 1));
if(orig_shift != 0)
USE_CYCLES(m68k, orig_shift<<m68k->cyc_shift);
if(shift != 0)
{
*r_dst = res;
m68k->x_flag = (new_x_flag != 0)<<8;
}
else
res = src;
m68k->c_flag = m68k->x_flag;
m68k->n_flag = NFLAG_32(res);
m68k->not_z_flag = res;
m68k->v_flag = VFLAG_CLEAR;
#endif
} }
@ -9038,8 +8556,6 @@ M68KMAKE_OP(roxl, 16, s, .)
M68KMAKE_OP(roxl, 32, s, .) M68KMAKE_OP(roxl, 32, s, .)
{ {
#if M68K_USE_64_BIT
UINT32* r_dst = &DY; UINT32* r_dst = &DY;
UINT32 shift = (((m68k->ir >> 9) - 1) & 7) + 1; UINT32 shift = (((m68k->ir >> 9) - 1) & 7) + 1;
UINT64 src = *r_dst; UINT64 src = *r_dst;
@ -9058,26 +8574,6 @@ M68KMAKE_OP(roxl, 32, s, .)
m68k->n_flag = NFLAG_32(res); m68k->n_flag = NFLAG_32(res);
m68k->not_z_flag = res; m68k->not_z_flag = res;
m68k->v_flag = VFLAG_CLEAR; m68k->v_flag = VFLAG_CLEAR;
#else
UINT32* r_dst = &DY;
UINT32 shift = (((m68k->ir >> 9) - 1) & 7) + 1;
UINT32 src = *r_dst;
UINT32 res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1(m68k) << (shift - 1)));
UINT32 new_x_flag = src & (1 << (32 - shift));
if(shift != 0)
USE_CYCLES(m68k, shift<<m68k->cyc_shift);
*r_dst = res;
m68k->c_flag = m68k->x_flag = (new_x_flag != 0)<<8;
m68k->n_flag = NFLAG_32(res);
m68k->not_z_flag = res;
m68k->v_flag = VFLAG_CLEAR;
#endif
} }
@ -9144,8 +8640,6 @@ M68KMAKE_OP(roxl, 16, r, .)
M68KMAKE_OP(roxl, 32, r, .) M68KMAKE_OP(roxl, 32, r, .)
{ {
#if M68K_USE_64_BIT
UINT32* r_dst = &DY; UINT32* r_dst = &DY;
UINT32 orig_shift = DX & 0x3f; UINT32 orig_shift = DX & 0x3f;
@ -9173,32 +8667,6 @@ M68KMAKE_OP(roxl, 32, r, .)
m68k->n_flag = NFLAG_32(*r_dst); m68k->n_flag = NFLAG_32(*r_dst);
m68k->not_z_flag = *r_dst; m68k->not_z_flag = *r_dst;
m68k->v_flag = VFLAG_CLEAR; m68k->v_flag = VFLAG_CLEAR;
#else
UINT32* r_dst = &DY;
UINT32 orig_shift = DX & 0x3f;
UINT32 shift = orig_shift % 33;
UINT32 src = *r_dst;
UINT32 res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1(m68k) << (shift - 1)));
UINT32 new_x_flag = src & (1 << (32 - shift));
if(orig_shift != 0)
USE_CYCLES(m68k, orig_shift<<m68k->cyc_shift);
if(shift != 0)
{
*r_dst = res;
m68k->x_flag = (new_x_flag != 0)<<8;
}
else
res = src;
m68k->c_flag = m68k->x_flag;
m68k->n_flag = NFLAG_32(res);
m68k->not_z_flag = res;
m68k->v_flag = VFLAG_CLEAR;
#endif
} }
@ -9242,7 +8710,8 @@ M68KMAKE_OP(rte, 32, ., .)
UINT32 new_pc; UINT32 new_pc;
UINT32 format_word; UINT32 format_word;
(*m68k->rte_instr_callback)(); if (m68k->rte_instr_callback != NULL)
(*m68k->rte_instr_callback)(m68k->device);
m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
if(CPU_TYPE_IS_000(m68k->cpu_type)) if(CPU_TYPE_IS_000(m68k->cpu_type))
@ -9325,9 +8794,8 @@ M68KMAKE_OP(rtm, 32, ., .)
if(CPU_TYPE_IS_020_VARIANT(m68k->cpu_type)) if(CPU_TYPE_IS_020_VARIANT(m68k->cpu_type))
{ {
m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n", logerror("%s at %08x: called unimplemented instruction %04x (rtm)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PC - 2, m68k->ir, m68k->device->tag, REG_PC - 2, m68k->ir);
m68k_disassemble_quick(REG_PC - 2)));
return; return;
} }
m68ki_exception_illegal(m68k); m68ki_exception_illegal(m68k);
@ -10192,7 +9660,7 @@ M68KMAKE_OP(tas, 8, ., .)
{ {
UINT32 ea = M68KMAKE_GET_EA_AY_8; UINT32 ea = M68KMAKE_GET_EA_AY_8;
UINT32 dst = m68ki_read_8(m68k, ea); UINT32 dst = m68ki_read_8(m68k, ea);
UINT32 allow_writeback; UINT32 allow_writeback = TRUE;
m68k->not_z_flag = dst; m68k->not_z_flag = dst;
m68k->n_flag = NFLAG_8(dst); m68k->n_flag = NFLAG_8(dst);
@ -10203,9 +9671,11 @@ M68KMAKE_OP(tas, 8, ., .)
disabled in order to function properly. Some Amiga software may also rely disabled in order to function properly. Some Amiga software may also rely
on this, but only when accessing specific addresses so additional functionality on this, but only when accessing specific addresses so additional functionality
will be needed. */ will be needed. */
allow_writeback = (*m68k->tas_instr_callback)(); if (m68k->tas_instr_callback != NULL)
allow_writeback = (*m68k->tas_instr_callback)(m68k->device);
if (allow_writeback==1) m68ki_write_8(m68k, ea, dst | 0x80); if (allow_writeback)
m68ki_write_8(m68k, ea, dst | 0x80);
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,9 @@
#include <stdio.h>
/* ======================================================================== */ /* ======================================================================== */
/* ========================= LICENSING & COPYRIGHT ======================== */ /* ========================= LICENSING & COPYRIGHT ======================== */
/* ======================================================================== */ /* ======================================================================== */
/* /*
* MUSASHI * MUSASHI
* Version 3.32 * Version 4.00
* *
* A portable Motorola M680x0 processor emulation engine. * A portable Motorola M680x0 processor emulation engine.
* Copyright Karl Stenerud. All rights reserved. * Copyright Karl Stenerud. All rights reserved.
@ -28,8 +27,9 @@
typedef struct _m68ki_cpu_core m68ki_cpu_core; typedef struct _m68ki_cpu_core m68ki_cpu_core;
#include "devintrf.h" #include "cpuintrf.h"
#include "m68k.h" #include "m68000.h"
#include <limits.h> #include <limits.h>
#include <setjmp.h> #include <setjmp.h>
@ -140,9 +140,7 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core;
#define GET_MSB_16(A) ((A) & 0x8000) #define GET_MSB_16(A) ((A) & 0x8000)
#define GET_MSB_17(A) ((A) & 0x10000) #define GET_MSB_17(A) ((A) & 0x10000)
#define GET_MSB_32(A) ((A) & 0x80000000) #define GET_MSB_32(A) ((A) & 0x80000000)
#if M68K_USE_64_BIT #define GET_MSB_33(A) ((A) & U64(0x100000000))
#define GET_MSB_33(A) ((A) & 0x100000000)
#endif /* M68K_USE_64_BIT */
/* Isolate nibbles */ /* Isolate nibbles */
#define LOW_NIBBLE(A) ((A) & 0x0f) #define LOW_NIBBLE(A) ((A) & 0x0f)
@ -157,13 +155,8 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core;
#define MASK_OUT_BELOW_16(A) ((A) & ~0xffff) #define MASK_OUT_BELOW_16(A) ((A) & ~0xffff)
/* No need to mask if we are 32 bit */ /* No need to mask if we are 32 bit */
#if M68K_USE_64_BIT #define MASK_OUT_ABOVE_32(A) ((A) & U64(0xffffffff))
#define MASK_OUT_ABOVE_32(A) ((A) & 0xffffffff) #define MASK_OUT_BELOW_32(A) ((A) & ~U64(0xffffffff))
#define MASK_OUT_BELOW_32(A) ((A) & ~0xffffffff)
#else
#define MASK_OUT_ABOVE_32(A) (A)
#define MASK_OUT_BELOW_32(A) 0
#endif /* M68K_INT_GT_32_BIT || M68K_USE_64_BIT */
/* Shift & Rotate Macros. */ /* Shift & Rotate Macros. */
#define LSL(A, C) ((A) << (C)) #define LSL(A, C) ((A) << (C))
@ -175,12 +168,10 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core;
#define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0) #define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0)
#define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0) #define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0)
#if M68K_USE_64_BIT #define LSL_32_64(A, C) ((A) << (C))
#define LSL_32_64(A, C) ((A) << (C)) #define LSR_32_64(A, C) ((A) >> (C))
#define LSR_32_64(A, C) ((A) >> (C)) #define ROL_33_64(A, C) (LSL_32_64(A, C) | LSR_32_64(A, 33-(C)))
#define ROL_33_64(A, C) (LSL_32_64(A, C) | LSR_32_64(A, 33-(C))) #define ROR_33_64(A, C) (LSR_32_64(A, C) | LSL_32_64(A, 33-(C)))
#define ROR_33_64(A, C) (LSR_32_64(A, C) | LSL_32_64(A, 33-(C)))
#endif /* M68K_USE_64_BIT */
#define ROL_8(A, C) MASK_OUT_ABOVE_8(LSL(A, C) | LSR(A, 8-(C))) #define ROL_8(A, C) MASK_OUT_ABOVE_8(LSL(A, C) | LSR(A, 8-(C)))
#define ROL_9(A, C) (LSL(A, C) | LSR(A, 9-(C))) #define ROL_9(A, C) (LSL(A, C) | LSR(A, 9-(C)))
@ -223,70 +214,26 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core;
/* These defines are dependant on the configuration defines in m68kconf.h */ /* These defines are dependant on the configuration defines in m68kconf.h */
/* Disable certain comparisons if we're not using all CPU types */ /* Disable certain comparisons if we're not using all CPU types */
#if HAS_M68040 #define CPU_TYPE_IS_040_PLUS(A) ((A) & CPU_TYPE_040)
#define CPU_TYPE_IS_040_PLUS(A) ((A) & CPU_TYPE_040) #define CPU_TYPE_IS_040_LESS(A) 1
#define CPU_TYPE_IS_040_LESS(A) 1
#else
#define CPU_TYPE_IS_040_PLUS(A) 0
#define CPU_TYPE_IS_040_LESS(A) 1
#endif
#if HAS_M68020 #define CPU_TYPE_IS_020_PLUS(A) ((A) & (CPU_TYPE_020 | CPU_TYPE_040))
#define CPU_TYPE_IS_020_PLUS(A) ((A) & (CPU_TYPE_020 | CPU_TYPE_040)) #define CPU_TYPE_IS_020_LESS(A) 1
#define CPU_TYPE_IS_020_LESS(A) 1
#else
#define CPU_TYPE_IS_020_PLUS(A) 0
#define CPU_TYPE_IS_020_LESS(A) 1
#endif
#if HAS_M68EC020 #define CPU_TYPE_IS_020_VARIANT(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020))
#define CPU_TYPE_IS_EC020_PLUS(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_040))
#define CPU_TYPE_IS_EC020_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020))
#else
#define CPU_TYPE_IS_EC020_PLUS(A) CPU_TYPE_IS_020_PLUS(A)
#define CPU_TYPE_IS_EC020_LESS(A) CPU_TYPE_IS_020_LESS(A)
#endif
#if HAS_M68010 #define CPU_TYPE_IS_EC020_PLUS(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_040))
#define CPU_TYPE_IS_010(A) ((A) == CPU_TYPE_010) #define CPU_TYPE_IS_EC020_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020))
#define CPU_TYPE_IS_010_PLUS(A) ((A) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_040))
#define CPU_TYPE_IS_010_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010))
#else
#define CPU_TYPE_IS_010(A) 0
#define CPU_TYPE_IS_010_PLUS(A) CPU_TYPE_IS_EC020_PLUS(A)
#define CPU_TYPE_IS_010_LESS(A) CPU_TYPE_IS_EC020_LESS(A)
#endif
#if HAS_M68020 || HAS_M68EC020 #define CPU_TYPE_IS_010(A) ((A) == CPU_TYPE_010)
#define CPU_TYPE_IS_020_VARIANT(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020)) #define CPU_TYPE_IS_010_PLUS(A) ((A) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_040))
#else #define CPU_TYPE_IS_010_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010))
#define CPU_TYPE_IS_020_VARIANT(A) 0
#endif
#if HAS_M68040 || HAS_M68020 || HAS_M68EC020 || HAS_M68010 #define CPU_TYPE_IS_000(A) ((A) == CPU_TYPE_000 || (A) == CPU_TYPE_008)
#define CPU_TYPE_IS_000(A) ((A) == CPU_TYPE_000 || (A) == CPU_TYPE_008)
#else
#define CPU_TYPE_IS_000(A) 1
#endif
/* Enable or disable function code emulation */ /* Configuration switches (see m68kconf.h for explanation) */
#if M68K_EMULATE_FC #define M68K_EMULATE_TRACE 0
#if M68K_EMULATE_FC == OPT_SPECIFY_HANDLER
#define m68ki_set_fc(A) M68K_SET_FC_CALLBACK(A)
#else
#define m68ki_set_fc(A) m68k->set_fc_callback(A)
#endif
#define m68ki_use_data_space(M) (M)->address_space = FUNCTION_CODE_USER_DATA
#define m68ki_use_program_space(M) (M)->address_space = FUNCTION_CODE_USER_PROGRAM
#define m68ki_get_address_space(M) (M)->address_space
#else
#define m68ki_set_fc(A)
#define m68ki_use_data_space(M)
#define m68ki_use_program_space(M)
#define m68ki_get_address_space(M) FUNCTION_CODE_USER_DATA
#endif /* M68K_EMULATE_FC */
/* Enable or disable trace emulation */ /* Enable or disable trace emulation */
#if M68K_EMULATE_TRACE #if M68K_EMULATE_TRACE
@ -328,23 +275,6 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core;
longjmp(m68k->aerr_trap, 1); \ longjmp(m68k->aerr_trap, 1); \
} }
/* Logging */
#if M68K_LOG_ENABLE
#include <stdio.h>
extern FILE* M68K_LOG_FILEHANDLE
extern const char *const m68ki_cpu_get_names[];
#define M68K_DO_LOG(A) if(M68K_LOG_FILEHANDLE) fprintf A
#if M68K_LOG_1010_1111
#define M68K_DO_LOG_EMU(A) if(M68K_LOG_FILEHANDLE) fprintf A
#else
#define M68K_DO_LOG_EMU(A)
#endif
#else
#define M68K_DO_LOG(A)
#define M68K_DO_LOG_EMU(A)
#endif
/* -------------------------- EA / Operand Access ------------------------- */ /* -------------------------- EA / Operand Access ------------------------- */
@ -537,9 +467,9 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core;
/* ----------------------------- Read / Write ----------------------------- */ /* ----------------------------- Read / Write ----------------------------- */
/* Read from the current address space */ /* Read from the current address space */
#define m68ki_read_8(M, A) m68ki_read_8_fc (M, A, m68k->s_flag | m68ki_get_address_space(M)) #define m68ki_read_8(M, A) m68ki_read_8_fc (M, A, m68k->s_flag | FUNCTION_CODE_USER_DATA)
#define m68ki_read_16(M, A) m68ki_read_16_fc(M, A, m68k->s_flag | m68ki_get_address_space(M)) #define m68ki_read_16(M, A) m68ki_read_16_fc(M, A, m68k->s_flag | FUNCTION_CODE_USER_DATA)
#define m68ki_read_32(M, A) m68ki_read_32_fc(M, A, m68k->s_flag | m68ki_get_address_space(M)) #define m68ki_read_32(M, A) m68ki_read_32_fc(M, A, m68k->s_flag | FUNCTION_CODE_USER_DATA)
/* Write to the current data space */ /* Write to the current data space */
#define m68ki_write_8(M, A, V) m68ki_write_8_fc (M, A, m68k->s_flag | FUNCTION_CODE_USER_DATA, V) #define m68ki_write_8(M, A, V) m68ki_write_8_fc (M, A, m68k->s_flag | FUNCTION_CODE_USER_DATA, V)
@ -578,10 +508,25 @@ union _fp_reg
double f; double f;
}; };
/* Redirect memory calls */
typedef struct _m68k_memory_interface m68k_memory_interface;
struct _m68k_memory_interface
{
offs_t opcode_xor; // Address Calculation
UINT16 (*readimm16)(const address_space *, offs_t); // Immediate read 16 bit
UINT8 (*read8)(const address_space *, offs_t); // Normal read 8 bit
UINT16 (*read16)(const address_space *, offs_t); // Normal read 16 bit
UINT32 (*read32)(const address_space *, offs_t); // Normal read 32 bit
void (*write8)(const address_space *, offs_t, UINT8); // Write 8 bit
void (*write16)(const address_space *, offs_t, UINT16); // Write 16 bit
void (*write32)(const address_space *, offs_t, UINT32); // Write 32 bit
};
struct _m68ki_cpu_core struct _m68ki_cpu_core
{ {
UINT32 cpu_type; /* CPU Type: 68000, 68008, 68010, 68EC020, or 68020 */ UINT32 cpu_type; /* CPU Type: 68000, 68008, 68010, 68EC020, or 68020 */
UINT32 dasm_type; /* disassembly type */
UINT32 dar[16]; /* Data and Address Registers */ UINT32 dar[16]; /* Data and Address Registers */
UINT32 ppc; /* Previous program counter */ UINT32 ppc; /* Previous program counter */
UINT32 pc; /* Program Counter */ UINT32 pc; /* Program Counter */
@ -643,20 +588,23 @@ struct _m68ki_cpu_core
const UINT8* cyc_exception; const UINT8* cyc_exception;
/* Callbacks to host */ /* Callbacks to host */
int (*int_ack_callback)(void *param, int int_line);/* Interrupt Acknowledge */ cpu_irq_callback int_ack_callback; /* Interrupt Acknowledge */
void *int_ack_param; m68k_bkpt_ack_func bkpt_ack_callback; /* Breakpoint Acknowledge */
void (*bkpt_ack_callback)(unsigned int data); /* Breakpoint Acknowledge */ m68k_reset_func reset_instr_callback; /* Called when a RESET instruction is encountered */
void (*reset_instr_callback)(void); /* Called when a RESET instruction is encountered */ m68k_cmpild_func cmpild_instr_callback; /* Called when a CMPI.L #v, Dn instruction is encountered */
void (*cmpild_instr_callback)(unsigned int, int); /* Called when a CMPI.L #v, Dn instruction is encountered */ m68k_rte_func rte_instr_callback; /* Called when a RTE instruction is encountered */
void (*rte_instr_callback)(void); /* Called when a RTE instruction is encountered */ m68k_tas_func tas_instr_callback; /* Called when a TAS instruction is encountered, allows / disallows writeback */
int (*tas_instr_callback)(void); /* Called when a TAS instruction is encountered, allows / disallows writeback */
void (*set_fc_callback)(unsigned int new_fc); /* Called when the CPU function code changes */
const device_config *device; const device_config *device;
const address_space *program; const address_space *program;
m68k_memory_interface memory; m68k_memory_interface memory;
offs_t encrypted_start; offs_t encrypted_start;
offs_t encrypted_end; offs_t encrypted_end;
/* save state data */
UINT16 save_sr;
UINT8 save_stopped;
UINT8 save_halted;
}; };
@ -840,7 +788,6 @@ INLINE UINT32 m68ki_read_imm_16(m68ki_cpu_core *m68k)
{ {
UINT32 result; UINT32 result;
m68ki_set_fc(m68k->s_flag | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
m68ki_check_address_error(m68k, REG_PC, MODE_READ, m68k->s_flag | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ m68ki_check_address_error(m68k, REG_PC, MODE_READ, m68k->s_flag | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
if(REG_PC != m68k->pref_addr) if(REG_PC != m68k->pref_addr)
@ -859,7 +806,6 @@ INLINE UINT32 m68ki_read_imm_32(m68ki_cpu_core *m68k)
{ {
UINT32 temp_val; UINT32 temp_val;
m68ki_set_fc(m68k->s_flag | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
m68ki_check_address_error(m68k, REG_PC, MODE_READ, m68k->s_flag | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */ m68ki_check_address_error(m68k, REG_PC, MODE_READ, m68k->s_flag | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
if(REG_PC != m68k->pref_addr) if(REG_PC != m68k->pref_addr)
@ -892,12 +838,10 @@ INLINE UINT32 m68ki_read_imm_32(m68ki_cpu_core *m68k)
*/ */
INLINE UINT32 m68ki_read_8_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc) INLINE UINT32 m68ki_read_8_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
{ {
m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
return (*m68k->memory.read8)(m68k->program, address); return (*m68k->memory.read8)(m68k->program, address);
} }
INLINE UINT32 m68ki_read_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc) INLINE UINT32 m68ki_read_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
{ {
m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
if (CPU_TYPE_IS_010_LESS(m68k->cpu_type)) if (CPU_TYPE_IS_010_LESS(m68k->cpu_type))
{ {
m68ki_check_address_error(m68k, address, MODE_READ, fc); m68ki_check_address_error(m68k, address, MODE_READ, fc);
@ -906,7 +850,6 @@ INLINE UINT32 m68ki_read_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
} }
INLINE UINT32 m68ki_read_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc) INLINE UINT32 m68ki_read_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
{ {
m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
if (CPU_TYPE_IS_010_LESS(m68k->cpu_type)) if (CPU_TYPE_IS_010_LESS(m68k->cpu_type))
{ {
m68ki_check_address_error(m68k, address, MODE_READ, fc); m68ki_check_address_error(m68k, address, MODE_READ, fc);
@ -916,12 +859,10 @@ INLINE UINT32 m68ki_read_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
INLINE void m68ki_write_8_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value) INLINE void m68ki_write_8_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value)
{ {
m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
(*m68k->memory.write8)(m68k->program, address, value); (*m68k->memory.write8)(m68k->program, address, value);
} }
INLINE void m68ki_write_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value) INLINE void m68ki_write_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value)
{ {
m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
if (CPU_TYPE_IS_010_LESS(m68k->cpu_type)) if (CPU_TYPE_IS_010_LESS(m68k->cpu_type))
{ {
m68ki_check_address_error(m68k, address, MODE_WRITE, fc); m68ki_check_address_error(m68k, address, MODE_WRITE, fc);
@ -930,7 +871,6 @@ INLINE void m68ki_write_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, U
} }
INLINE void m68ki_write_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value) INLINE void m68ki_write_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value)
{ {
m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
if (CPU_TYPE_IS_010_LESS(m68k->cpu_type)) if (CPU_TYPE_IS_010_LESS(m68k->cpu_type))
{ {
m68ki_check_address_error(m68k, address, MODE_WRITE, fc); m68ki_check_address_error(m68k, address, MODE_WRITE, fc);
@ -945,7 +885,6 @@ INLINE void m68ki_write_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, U
*/ */
INLINE void m68ki_write_32_pd_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value) INLINE void m68ki_write_32_pd_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value)
{ {
m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
if (CPU_TYPE_IS_010_LESS(m68k->cpu_type)) if (CPU_TYPE_IS_010_LESS(m68k->cpu_type))
{ {
m68ki_check_address_error(m68k, address, MODE_WRITE, fc); m68ki_check_address_error(m68k, address, MODE_WRITE, fc);
@ -963,14 +902,12 @@ INLINE void m68ki_write_32_pd_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc
INLINE UINT32 m68ki_get_ea_pcdi(m68ki_cpu_core *m68k) INLINE UINT32 m68ki_get_ea_pcdi(m68ki_cpu_core *m68k)
{ {
UINT32 old_pc = REG_PC; UINT32 old_pc = REG_PC;
m68ki_use_program_space(m68k); /* auto-disable */
return old_pc + MAKE_INT_16(m68ki_read_imm_16(m68k)); return old_pc + MAKE_INT_16(m68ki_read_imm_16(m68k));
} }
INLINE UINT32 m68ki_get_ea_pcix(m68ki_cpu_core *m68k) INLINE UINT32 m68ki_get_ea_pcix(m68ki_cpu_core *m68k)
{ {
m68ki_use_program_space(m68k); /* auto-disable */
return m68ki_get_ea_ix(m68k, REG_PC); return m68ki_get_ea_ix(m68k, REG_PC);
} }
@ -1645,11 +1582,6 @@ INLINE void m68ki_exception_privilege_violation(m68ki_cpu_core *m68k)
INLINE void m68ki_exception_1010(m68ki_cpu_core *m68k) INLINE void m68ki_exception_1010(m68ki_cpu_core *m68k)
{ {
UINT32 sr; UINT32 sr;
#if M68K_LOG_1010_1111 == OPT_ON
M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1010 instruction %04x (%s)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PPC, m68k->ir,
m68ki_disassemble_quick(REG_PPC)));
#endif
sr = m68ki_init_exception(m68k); sr = m68ki_init_exception(m68k);
m68ki_stack_frame_0000(m68k, REG_PPC, sr, EXCEPTION_1010); m68ki_stack_frame_0000(m68k, REG_PPC, sr, EXCEPTION_1010);
@ -1664,12 +1596,6 @@ INLINE void m68ki_exception_1111(m68ki_cpu_core *m68k)
{ {
UINT32 sr; UINT32 sr;
#if M68K_LOG_1010_1111 == OPT_ON
M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1111 instruction %04x (%s)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PPC, m68k->ir,
m68ki_disassemble_quick(REG_PPC)));
#endif
sr = m68ki_init_exception(m68k); sr = m68ki_init_exception(m68k);
m68ki_stack_frame_0000(m68k, REG_PPC, sr, EXCEPTION_1111); m68ki_stack_frame_0000(m68k, REG_PPC, sr, EXCEPTION_1111);
m68ki_jump_vector(m68k, EXCEPTION_1111); m68ki_jump_vector(m68k, EXCEPTION_1111);
@ -1683,10 +1609,6 @@ INLINE void m68ki_exception_illegal(m68ki_cpu_core *m68k)
{ {
UINT32 sr; UINT32 sr;
M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: illegal instruction %04x (%s)\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PPC, m68k->ir,
m68ki_disassemble_quick(REG_PPC)));
sr = m68ki_init_exception(m68k); sr = m68ki_init_exception(m68k);
if(CPU_TYPE_IS_000(m68k->cpu_type)) if(CPU_TYPE_IS_000(m68k->cpu_type))
@ -1759,7 +1681,7 @@ void m68ki_exception_interrupt(m68ki_cpu_core *m68k, UINT32 int_level)
return; return;
/* Acknowledge the interrupt */ /* Acknowledge the interrupt */
vector = (*m68k->int_ack_callback)(m68k->int_ack_param, int_level); vector = (*m68k->int_ack_callback)(m68k->device, int_level);
/* Get the interrupt vector */ /* Get the interrupt vector */
if(vector == M68K_INT_ACK_AUTOVECTOR) if(vector == M68K_INT_ACK_AUTOVECTOR)
@ -1769,11 +1691,7 @@ void m68ki_exception_interrupt(m68ki_cpu_core *m68k, UINT32 int_level)
/* Called if no devices respond to the interrupt acknowledge */ /* Called if no devices respond to the interrupt acknowledge */
vector = EXCEPTION_SPURIOUS_INTERRUPT; vector = EXCEPTION_SPURIOUS_INTERRUPT;
else if(vector > 255) else if(vector > 255)
{
M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: Interrupt acknowledge returned invalid vector $%x\n",
m68ki_cpu_get_names[m68k->cpu_type], REG_PC, vector));
return; return;
}
/* Start exception processing */ /* Start exception processing */
sr = m68ki_init_exception(m68k); sr = m68ki_init_exception(m68k);

View File

@ -30,7 +30,7 @@
#include <string.h> #include <string.h>
#define m68ki_cpu_core void #define m68ki_cpu_core void
#include "m68k.h" #include "m68000.h"
#ifndef DECL_SPEC #ifndef DECL_SPEC
#define DECL_SPEC #define DECL_SPEC

View File

@ -1,4 +1,4 @@
#include "cpuintrf.h" #include <math.h>
#define FPCC_N 0x08000000 #define FPCC_N 0x08000000
#define FPCC_Z 0x04000000 #define FPCC_Z 0x04000000

File diff suppressed because it is too large Load Diff

View File

@ -1,37 +0,0 @@
#pragma once
#ifndef __M68KMAME_H__
#define __M68KMAME_H__
/* ======================================================================== */
/* ============================== MAME STUFF ============================== */
/* ======================================================================== */
#include "debugger.h"
#include "deprecat.h"
#include "m68000.h"
#define OPT_ON 1
#define OPT_OFF 0
/* Configuration switches (see m68kconf.h for explanation) */
#define M68K_EMULATE_TRACE OPT_OFF
#define M68K_EMULATE_FC OPT_OFF
#define M68K_SET_FC_CALLBACK(A)
#define M68K_LOG_ENABLE OPT_OFF
#define M68K_LOG_1010_1111 OPT_OFF
#define M68K_LOG_FILEHANDLE errorlog
#define M68K_USE_64_BIT OPT_OFF
void m68k_set_encrypted_opcode_range(const device_config *device, offs_t start, offs_t end);
/* ======================================================================== */
/* ============================== END OF FILE ============================= */
/* ======================================================================== */
#endif /* __M68KMAME_H__ */

View File

@ -492,22 +492,12 @@ static const struct
#if (HAS_KONAMI) #if (HAS_KONAMI)
{ CPU_KONAMI, CPU_GET_INFO_NAME(konami) }, { CPU_KONAMI, CPU_GET_INFO_NAME(konami) },
#endif #endif
#if (HAS_M68000) #if (HAS_M680X0)
{ CPU_M68000, CPU_GET_INFO_NAME(m68000) }, { CPU_M68000, CPU_GET_INFO_NAME(m68000) },
#endif
#if (HAS_M68008)
{ CPU_M68008, CPU_GET_INFO_NAME(m68008) }, { CPU_M68008, CPU_GET_INFO_NAME(m68008) },
#endif
#if (HAS_M68010)
{ CPU_M68010, CPU_GET_INFO_NAME(m68010) }, { CPU_M68010, CPU_GET_INFO_NAME(m68010) },
#endif
#if (HAS_M68EC020)
{ CPU_M68EC020, CPU_GET_INFO_NAME(m68ec020) }, { CPU_M68EC020, CPU_GET_INFO_NAME(m68ec020) },
#endif
#if (HAS_M68020)
{ CPU_M68020, CPU_GET_INFO_NAME(m68020) }, { CPU_M68020, CPU_GET_INFO_NAME(m68020) },
#endif
#if (HAS_M68040)
{ CPU_M68040, CPU_GET_INFO_NAME(m68040) }, { CPU_M68040, CPU_GET_INFO_NAME(m68040) },
#endif #endif
#if (HAS_T11) #if (HAS_T11)

View File

@ -128,11 +128,11 @@ static INTERRUPT_GEN(bishi_interrupt)
switch (cpu_getiloops(device)) switch (cpu_getiloops(device))
{ {
case 0: case 0:
cpu_set_input_line(device, MC68000_IRQ_3, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_3, HOLD_LINE);
break; break;
case 1: case 1:
cpu_set_input_line(device, MC68000_IRQ_4, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_4, HOLD_LINE);
break; break;
} }
} }
@ -302,9 +302,9 @@ static MACHINE_RESET( bishi )
static void sound_irq_gen(running_machine *machine, int state) static void sound_irq_gen(running_machine *machine, int state)
{ {
if (state) if (state)
cpu_set_input_line(machine->cpu[0], MC68000_IRQ_1, ASSERT_LINE); cpu_set_input_line(machine->cpu[0], M68K_IRQ_1, ASSERT_LINE);
else else
cpu_set_input_line(machine->cpu[0], MC68000_IRQ_1, CLEAR_LINE); cpu_set_input_line(machine->cpu[0], M68K_IRQ_1, CLEAR_LINE);
} }
static const ymz280b_interface ymz280b_intf = static const ymz280b_interface ymz280b_intf =

View File

@ -77,12 +77,12 @@ static INTERRUPT_GEN( dbz_interrupt )
switch (cpu_getiloops(device)) switch (cpu_getiloops(device))
{ {
case 0: case 0:
cpu_set_input_line(device, MC68000_IRQ_2, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_2, HOLD_LINE);
break; break;
case 1: case 1:
if (K053246_is_IRQ_enabled()) if (K053246_is_IRQ_enabled())
cpu_set_input_line(device, MC68000_IRQ_4, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_4, HOLD_LINE);
break; break;
} }
} }

View File

@ -141,9 +141,9 @@ static VIDEO_START( ddealer )
back_tilemap = tilemap_create(get_back_tile_info,tilemap_scan_cols,8,8,64,32); back_tilemap = tilemap_create(get_back_tile_info,tilemap_scan_cols,8,8,64,32);
} }
static void ddealer_draw_video_layer( UINT16* vreg_base, UINT16* top, UINT16* bottom, bitmap_t* bitmap, const rectangle *cliprect, int flipy) static void ddealer_draw_video_layer( running_machine *machine, UINT16* vreg_base, UINT16* top, UINT16* bottom, bitmap_t* bitmap, const rectangle *cliprect, int flipy)
{ {
const gfx_element *gfx = Machine->gfx[1]; const gfx_element *gfx = machine->gfx[1];
{ {
INT16 sx, sy; INT16 sx, sy;
@ -244,24 +244,24 @@ static VIDEO_UPDATE( ddealer )
{ {
if (ddealer_vregs[0xcc/2] & 0x80) if (ddealer_vregs[0xcc/2] & 0x80)
{ {
ddealer_draw_video_layer(&ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen);
ddealer_draw_video_layer(&ddealer_vregs[0xcc/2], right_fg_vram_top, right_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0xcc/2], right_fg_vram_top, right_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen);
} }
else else
{ {
ddealer_draw_video_layer(&ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen);
} }
} }
else else
{ {
if (ddealer_vregs[0xcc/2] & 0x80) if (ddealer_vregs[0xcc/2] & 0x80)
{ {
ddealer_draw_video_layer(&ddealer_vregs[0xcc/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0xcc/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen);
ddealer_draw_video_layer(&ddealer_vregs[0x1e0/2], right_fg_vram_top, right_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0x1e0/2], right_fg_vram_top, right_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen);
} }
else else
{ {
ddealer_draw_video_layer(&ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen);
} }
} }

View File

@ -258,7 +258,7 @@ static WRITE32_HANDLER( v_ctrl_w )
if (pending_vb_int && !DISABLE_VB_INT) if (pending_vb_int && !DISABLE_VB_INT)
{ {
pending_vb_int = 0; pending_vb_int = 0;
cpu_set_input_line(space->machine->cpu[0], MC68000_IRQ_4, HOLD_LINE); cpu_set_input_line(space->machine->cpu[0], M68K_IRQ_4, HOLD_LINE);
} }
} }
} }
@ -449,7 +449,7 @@ static INTERRUPT_GEN( vb_interrupt )
} }
//logerror("V-Blank interrupt\n"); //logerror("V-Blank interrupt\n");
cpu_set_input_line(device, MC68000_IRQ_4, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_4, HOLD_LINE);
} }
@ -458,12 +458,12 @@ static void ide_interrupt(const device_config *device, int state)
if (state != CLEAR_LINE) if (state != CLEAR_LINE)
{ {
//logerror("IDE interrupt asserted\n"); //logerror("IDE interrupt asserted\n");
cpu_set_input_line(device->machine->cpu[0], MC68000_IRQ_1, HOLD_LINE); cpu_set_input_line(device->machine->cpu[0], M68K_IRQ_1, HOLD_LINE);
} }
else else
{ {
//logerror("IDE interrupt cleared\n"); //logerror("IDE interrupt cleared\n");
cpu_set_input_line(device->machine->cpu[0], MC68000_IRQ_1, CLEAR_LINE); cpu_set_input_line(device->machine->cpu[0], M68K_IRQ_1, CLEAR_LINE);
} }
} }

View File

@ -33,7 +33,7 @@ from 2.bin to 9.bin program eproms
*/ */
#include "driver.h" #include "driver.h"
#include "cpu/m68000/m68kmame.h" #include "cpu/m68000/m68000.h"
#include "cps1.h" #include "cps1.h"
#include "sound/2203intf.h" #include "sound/2203intf.h"
#include "sound/msm5205.h" #include "sound/msm5205.h"

View File

@ -399,7 +399,7 @@ static VIDEO_UPDATE( jalmah )
tilemap_set_scrolly( sc3_tilemap_2, 0, jm_scrollram[7] & 0x1ff); tilemap_set_scrolly( sc3_tilemap_2, 0, jm_scrollram[7] & 0x1ff);
tilemap_set_scrolly( sc3_tilemap_3, 0, jm_scrollram[7] & 0x3ff); tilemap_set_scrolly( sc3_tilemap_3, 0, jm_scrollram[7] & 0x3ff);
fillbitmap(bitmap, Machine->pens[0x10f], cliprect);//selectable by a ram address? fillbitmap(bitmap, screen->machine->pens[0x10f], cliprect);//selectable by a ram address?
for(cur_prin=0;cur_prin<4;cur_prin++) for(cur_prin=0;cur_prin<4;cur_prin++)
{ {
@ -420,7 +420,7 @@ static VIDEO_UPDATE( urashima )
tilemap_set_scrolly( sc0_tilemap_0, 0, jm_scrollram[4]); tilemap_set_scrolly( sc0_tilemap_0, 0, jm_scrollram[4]);
tilemap_set_scrolly( sc3_tilemap_0, 0, jm_scrollram[7]); tilemap_set_scrolly( sc3_tilemap_0, 0, jm_scrollram[7]);
fillbitmap(bitmap, Machine->pens[0x1ff], cliprect);//selectable by a ram address? fillbitmap(bitmap, screen->machine->pens[0x1ff], cliprect);//selectable by a ram address?
if(jm_vregs[0] & 1) { tilemap_draw(bitmap,cliprect,sc0_tilemap_0,0,0); } if(jm_vregs[0] & 1) { tilemap_draw(bitmap,cliprect,sc0_tilemap_0,0,0); }
if(jm_vregs[3] & 1) { tilemap_draw(bitmap,cliprect,sc3_tilemap_0,0,0); } if(jm_vregs[3] & 1) { tilemap_draw(bitmap,cliprect,sc3_tilemap_0,0,0); }
return 0; return 0;

View File

@ -6421,7 +6421,7 @@ static IRQ_CALLBACK(genesis_int_callback)
return (0x60+irqline*4)/4; // vector address return (0x60+irqline*4)/4; // vector address
} }
static int megadriv_tas_callback(void) static int megadriv_tas_callback(const device_config *device)
{ {
return 0; // writeback not allowed return 0; // writeback not allowed
} }

View File

@ -201,15 +201,15 @@ static INTERRUPT_GEN(mystwarr_interrupt)
switch (cpu_getiloops(device)) switch (cpu_getiloops(device))
{ {
case 0: case 0:
cpu_set_input_line(device, MC68000_IRQ_2, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_2, HOLD_LINE);
break; break;
case 1: case 1:
cpu_set_input_line(device, MC68000_IRQ_4, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_4, HOLD_LINE);
break; break;
case 2: case 2:
cpu_set_input_line(device, MC68000_IRQ_6, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_6, HOLD_LINE);
break; break;
} }
} }
@ -219,15 +219,15 @@ static INTERRUPT_GEN(metamrph_interrupt)
switch (cpu_getiloops(device)) switch (cpu_getiloops(device))
{ {
case 0: case 0:
cpu_set_input_line(device, MC68000_IRQ_4, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_4, HOLD_LINE);
break; break;
case 15: case 15:
cpu_set_input_line(device, MC68000_IRQ_6, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_6, HOLD_LINE);
break; break;
case 39: case 39:
if (K053246_is_IRQ_enabled()) cpu_set_input_line(device, MC68000_IRQ_5, HOLD_LINE); if (K053246_is_IRQ_enabled()) cpu_set_input_line(device, M68K_IRQ_5, HOLD_LINE);
break; break;
} }
} }
@ -239,18 +239,18 @@ static INTERRUPT_GEN(mchamp_interrupt)
switch (cpu_getiloops(device)) switch (cpu_getiloops(device))
{ {
case 0: case 0:
if (K053246_is_IRQ_enabled()) cpu_set_input_line(device, MC68000_IRQ_6, HOLD_LINE); if (K053246_is_IRQ_enabled()) cpu_set_input_line(device, M68K_IRQ_6, HOLD_LINE);
break; break;
case 1: case 1:
cpu_set_input_line(device, MC68000_IRQ_2, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_2, HOLD_LINE);
break; break;
} }
} }
static INTERRUPT_GEN(ddd_interrupt) static INTERRUPT_GEN(ddd_interrupt)
{ {
cpu_set_input_line(device, MC68000_IRQ_5, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_5, HOLD_LINE);
} }

View File

@ -156,7 +156,7 @@ static READ32_HANDLER( psac_rom_r )
static INTERRUPT_GEN(polygonet_interrupt) static INTERRUPT_GEN(polygonet_interrupt)
{ {
cpu_set_input_line(device, MC68000_IRQ_5, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_5, HOLD_LINE);
} }
/* sound CPU communications */ /* sound CPU communications */

View File

@ -162,7 +162,7 @@ static WRITE16_HANDLER( rng_sysregs_w )
} }
if (!(data & 0x40)) if (!(data & 0x40))
cpu_set_input_line(space->machine->cpu[0], MC68000_IRQ_5, CLEAR_LINE); cpu_set_input_line(space->machine->cpu[0], M68K_IRQ_5, CLEAR_LINE);
break; break;
case 0x0c/2: case 0x0c/2:
@ -206,7 +206,7 @@ static READ16_HANDLER( sound_status_msb_r )
static INTERRUPT_GEN(rng_interrupt) static INTERRUPT_GEN(rng_interrupt)
{ {
if (rng_sysreg[0x0c/2] & 0x09) if (rng_sysreg[0x0c/2] & 0x09)
cpu_set_input_line(device, MC68000_IRQ_5, ASSERT_LINE); cpu_set_input_line(device, M68K_IRQ_5, ASSERT_LINE);
} }
static ADDRESS_MAP_START( rngreadmem, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( rngreadmem, ADDRESS_SPACE_PROGRAM, 16 )

View File

@ -241,9 +241,9 @@ static TIMER_CALLBACK( scanline_callback )
* *
*************************************/ *************************************/
static void outrun_reset(void) static void outrun_reset(const device_config *device)
{ {
cpu_set_input_line(Machine->cpu[1], INPUT_LINE_RESET, PULSE_LINE); cpu_set_input_line(device->machine->cpu[1], INPUT_LINE_RESET, PULSE_LINE);
} }

View File

@ -198,10 +198,10 @@ static READ8_HANDLER( sound_data_r )
* *
*************************************/ *************************************/
static void xboard_reset(void) static void xboard_reset(const device_config *device)
{ {
cpu_set_input_line(Machine->cpu[1], INPUT_LINE_RESET, PULSE_LINE); cpu_set_input_line(device->machine->cpu[1], INPUT_LINE_RESET, PULSE_LINE);
cpuexec_boost_interleave(Machine, attotime_zero, ATTOTIME_IN_USEC(100)); cpuexec_boost_interleave(device->machine, attotime_zero, ATTOTIME_IN_USEC(100));
} }

View File

@ -81,7 +81,7 @@ static WRITE8_HANDLER( m6809_irq_disable_w )
static INTERRUPT_GEN( m68k_vb_interrupt ) static INTERRUPT_GEN( m68k_vb_interrupt )
{ {
if (m68k_irq_enable) if (m68k_irq_enable)
cpu_set_input_line(device, MC68000_IRQ_1, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_1, HOLD_LINE);
} }
static WRITE16_HANDLER( m68k_irq_enable_w ) static WRITE16_HANDLER( m68k_irq_enable_w )

View File

@ -168,12 +168,12 @@ static INTERRUPT_GEN(cuebrick_interrupt)
switch (cpu_getiloops(device)) switch (cpu_getiloops(device))
{ {
case 0: case 0:
cpu_set_input_line(device, MC68000_IRQ_5, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_5, HOLD_LINE);
break; break;
default: default:
if (cuebrick_snd_irqlatch) if (cuebrick_snd_irqlatch)
cpu_set_input_line(device, MC68000_IRQ_6, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_6, HOLD_LINE);
break; break;
} }
} }

View File

@ -294,10 +294,10 @@ static WRITE16_HANDLER( batsugun_share2_w );
Initialisation handlers Initialisation handlers
***************************************************************************/ ***************************************************************************/
static void toaplan2_reset(void) static void toaplan2_reset(const device_config *device)
{ {
if (Machine->cpu[1] != NULL) if (device->machine->cpu[1] != NULL)
cpu_set_input_line(Machine->cpu[1], INPUT_LINE_RESET, PULSE_LINE); cpu_set_input_line(device->machine->cpu[1], INPUT_LINE_RESET, PULSE_LINE);
} }
static MACHINE_RESET( toaplan2 ) static MACHINE_RESET( toaplan2 )

View File

@ -163,7 +163,7 @@ static WRITE16_HANDLER( twin16_CPUA_register_w )
twin16_spriteram_process(); twin16_spriteram_process();
if( (old&0x10)==0 && (twin16_CPUA_register&0x10) ) if( (old&0x10)==0 && (twin16_CPUA_register&0x10) )
cpu_set_input_line(space->machine->cpu[CPU_B], MC68000_IRQ_6, HOLD_LINE ); cpu_set_input_line(space->machine->cpu[CPU_B], M68K_IRQ_6, HOLD_LINE );
coin_counter_w( 0, twin16_CPUA_register&0x01 ); coin_counter_w( 0, twin16_CPUA_register&0x01 );
coin_counter_w( 1, twin16_CPUA_register&0x02 ); coin_counter_w( 1, twin16_CPUA_register&0x02 );
@ -185,7 +185,7 @@ static WRITE16_HANDLER( twin16_CPUB_register_w )
{ {
if( (old&0x01)==0 && (twin16_CPUB_register&0x1) ) if( (old&0x01)==0 && (twin16_CPUB_register&0x1) )
{ {
cpu_set_input_line(space->machine->cpu[CPU_A], MC68000_IRQ_6, HOLD_LINE ); cpu_set_input_line(space->machine->cpu[CPU_A], M68K_IRQ_6, HOLD_LINE );
} }
} }
} }

View File

@ -304,9 +304,9 @@ void amiga_machine_config(running_machine *machine, const amiga_machine_interfac
} }
static void amiga_m68k_reset(void) static void amiga_m68k_reset(const device_config *device)
{ {
const address_space *space = cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM); const address_space *space = cpu_get_address_space(device, ADDRESS_SPACE_PROGRAM);
logerror("Executed RESET at PC=%06x\n", cpu_get_pc(space->cpu)); logerror("Executed RESET at PC=%06x\n", cpu_get_pc(space->cpu));
@ -337,7 +337,7 @@ MACHINE_RESET( amiga )
/* set m68k reset function */ /* set m68k reset function */
cpu_set_info_fct(machine->cpu[0], CPUINFO_PTR_M68K_RESET_CALLBACK, (genf *)amiga_m68k_reset); cpu_set_info_fct(machine->cpu[0], CPUINFO_PTR_M68K_RESET_CALLBACK, (genf *)amiga_m68k_reset);
amiga_m68k_reset(); amiga_m68k_reset(machine->cpu[0]);
/* call the system-specific callback */ /* call the system-specific callback */
if (amiga_intf->reset_callback) if (amiga_intf->reset_callback)

View File

@ -111,7 +111,7 @@ the decryption keys.
*******************************************************************************/ *******************************************************************************/
#include "driver.h" #include "driver.h"
#include "cpu/m68000/m68kmame.h" #include "cpu/m68000/m68000.h"
#include "ui.h" #include "ui.h"
#include "includes/cps1.h" #include "includes/cps1.h"

View File

@ -109,7 +109,7 @@ static void fd1094_setstate_and_decrypt(int state)
} }
/* Callback for CMP.L instructions (state change) */ /* Callback for CMP.L instructions (state change) */
static void fd1094_cmp_callback(UINT32 val, int reg) static void fd1094_cmp_callback(const device_config *device, UINT32 val, int reg)
{ {
if (reg == 0 && (val & 0x0000ffff) == 0x0000ffff) // ? if (reg == 0 && (val & 0x0000ffff) == 0x0000ffff) // ?
{ {
@ -124,7 +124,7 @@ static IRQ_CALLBACK(fd1094_int_callback)
return (0x60+irqline*4)/4; // vector address return (0x60+irqline*4)/4; // vector address
} }
static void fd1094_rte_callback (void) static void fd1094_rte_callback (const device_config *device)
{ {
fd1094_setstate_and_decrypt(FD1094_STATE_RTE); fd1094_setstate_and_decrypt(FD1094_STATE_RTE);
} }

View File

@ -91,7 +91,7 @@ static void s24_fd1094_setstate_and_decrypt(int state)
} }
/* Callback for CMP.L instructions (state change) */ /* Callback for CMP.L instructions (state change) */
static void s24_fd1094_cmp_callback(UINT32 val, int reg) static void s24_fd1094_cmp_callback(const device_config *device, UINT32 val, int reg)
{ {
if (reg == 0 && (val & 0x0000ffff) == 0x0000ffff) // ? if (reg == 0 && (val & 0x0000ffff) == 0x0000ffff) // ?
{ {
@ -106,7 +106,7 @@ static IRQ_CALLBACK(s24_fd1094_int_callback)
return (0x60+irqline*4)/4; // vector address return (0x60+irqline*4)/4; // vector address
} }
static void s24_fd1094_rte_callback (void) static void s24_fd1094_rte_callback (const device_config *device)
{ {
s24_fd1094_setstate_and_decrypt(FD1094_STATE_RTE); s24_fd1094_setstate_and_decrypt(FD1094_STATE_RTE);
} }

View File

@ -34,7 +34,7 @@ INTERRUPT_GEN( twincobr_interrupt )
{ {
if (twincobr_intenable) { if (twincobr_intenable) {
twincobr_intenable = 0; twincobr_intenable = 0;
cpu_set_input_line(device, MC68000_IRQ_4, HOLD_LINE); cpu_set_input_line(device, M68K_IRQ_4, HOLD_LINE);
} }
} }

View File

@ -111,12 +111,7 @@ CPUS += HD6309
CPUS += M6809 CPUS += M6809
CPUS += M6809E CPUS += M6809E
CPUS += KONAMI CPUS += KONAMI
CPUS += M68000 CPUS += M680X0
#CPUS += M68008
CPUS += M68010
CPUS += M68EC020
CPUS += M68020
CPUS += M68040
CPUS += T11 CPUS += T11
CPUS += S2650 CPUS += S2650
CPUS += TMS340X0 CPUS += TMS340X0

View File

@ -329,9 +329,9 @@ void jaguar_gpu_resume(running_machine *machine)
static void update_cpu_irq(running_machine *machine) static void update_cpu_irq(running_machine *machine)
{ {
if (cpu_irq_state & gpu_regs[INT1] & 0x1f) if (cpu_irq_state & gpu_regs[INT1] & 0x1f)
cpu_set_input_line(machine->cpu[0], cojag_is_r3000 ? R3000_IRQ4 : MC68000_IRQ_6, ASSERT_LINE); cpu_set_input_line(machine->cpu[0], cojag_is_r3000 ? R3000_IRQ4 : M68K_IRQ_6, ASSERT_LINE);
else else
cpu_set_input_line(machine->cpu[0], cojag_is_r3000 ? R3000_IRQ4 : MC68000_IRQ_6, CLEAR_LINE); cpu_set_input_line(machine->cpu[0], cojag_is_r3000 ? R3000_IRQ4 : M68K_IRQ_6, CLEAR_LINE);
} }

View File

@ -1247,5 +1247,5 @@ VIDEO_EOF( samesame )
const address_space *space = cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM); const address_space *space = cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM);
buffer_spriteram16_w(space, 0, 0, 0xffff); buffer_spriteram16_w(space, 0, 0, 0xffff);
memcpy(toaplan1_buffered_spritesizeram16, toaplan1_spritesizeram16, TOAPLAN1_SPRITESIZERAM_SIZE); memcpy(toaplan1_buffered_spritesizeram16, toaplan1_spritesizeram16, TOAPLAN1_SPRITESIZERAM_SIZE);
cpu_set_input_line(machine->cpu[0], MC68000_IRQ_2, HOLD_LINE); /* Frame done */ cpu_set_input_line(machine->cpu[0], M68K_IRQ_2, HOLD_LINE); /* Frame done */
} }