www.pudn.com > ncdzsrc.rar > m68kncdz.c
#include "m68k.h"
#include "neogeocd.h"
/* interface for 24-bit address bus, 16-bit data bus */
struct m68k_memory_interface m68k_memory_intf =
{
0,
m68000_read_memory_8,
m68000_read_memory_16,
m68000_read_memory_32,
m68000_write_memory_8,
m68000_write_memory_16,
m68000_write_memory_32,
m68000_setopbase,
m68000_read_memory_8, /* Encrypted Versions - not use */
m68000_read_memory_16,
m68000_read_memory_32,
m68000_read_memory_16,
m68000_read_memory_32
};
void m68000_init(void)
{
m68k_init();
m68k_set_cpu_type(M68K_CPU_TYPE_68000);
}
void m68000_reset(int param)
{
UINT32 m68k_opbase = param ? 0x000000 : 0xc00000;
m68k_pulse_reset(m68k_opbase);
}
void m68000_exit(void)
{
/* nothing to do */
}
int m68000_execute(int cycles)
{
return m68k_execute(cycles);
}
unsigned m68000_get_reg(int regnum)
{
switch( regnum )
{
case REG_PC: return m68k_get_reg(NULL, M68K_REG_PC)&0x00ffffff;
case M68K_PC: return m68k_get_reg(NULL, M68K_REG_PC);
case REG_SP:
case M68K_SP: return m68k_get_reg(NULL, M68K_REG_SP);
case M68K_ISP: return m68k_get_reg(NULL, M68K_REG_ISP);
case M68K_USP: return m68k_get_reg(NULL, M68K_REG_USP);
case M68K_SR: return m68k_get_reg(NULL, M68K_REG_SR);
case M68K_D0: return m68k_get_reg(NULL, M68K_REG_D0);
case M68K_D1: return m68k_get_reg(NULL, M68K_REG_D1);
case M68K_D2: return m68k_get_reg(NULL, M68K_REG_D2);
case M68K_D3: return m68k_get_reg(NULL, M68K_REG_D3);
case M68K_D4: return m68k_get_reg(NULL, M68K_REG_D4);
case M68K_D5: return m68k_get_reg(NULL, M68K_REG_D5);
case M68K_D6: return m68k_get_reg(NULL, M68K_REG_D6);
case M68K_D7: return m68k_get_reg(NULL, M68K_REG_D7);
case M68K_A0: return m68k_get_reg(NULL, M68K_REG_A0);
case M68K_A1: return m68k_get_reg(NULL, M68K_REG_A1);
case M68K_A2: return m68k_get_reg(NULL, M68K_REG_A2);
case M68K_A3: return m68k_get_reg(NULL, M68K_REG_A3);
case M68K_A4: return m68k_get_reg(NULL, M68K_REG_A4);
case M68K_A5: return m68k_get_reg(NULL, M68K_REG_A5);
case M68K_A6: return m68k_get_reg(NULL, M68K_REG_A6);
case M68K_A7: return m68k_get_reg(NULL, M68K_REG_A7);
case M68K_PREF_ADDR: return m68k_get_reg(NULL, M68K_REG_PREF_ADDR);
case M68K_PREF_DATA: return m68k_get_reg(NULL, M68K_REG_PREF_DATA);
case REG_PREVIOUSPC: return m68k_get_reg(NULL, M68K_REG_PPC);
/* TODO: return contents of [SP + wordsize * (REG_SP_CONTENTS-regnum)] */
default:
if( regnum < REG_SP_CONTENTS )
{
unsigned offset = m68k_get_reg(NULL, M68K_REG_SP) + 4 * (REG_SP_CONTENTS - regnum);
if( offset < 0xfffffd )
return m68k_read_memory_32( offset );
}
}
return 0;
}
void m68000_set_reg(int regnum, unsigned val)
{
switch( regnum )
{
case REG_PC:
case M68K_PC: m68k_set_reg(M68K_REG_PC, val & 0x00ffffff); break;
case REG_SP:
case M68K_SP: m68k_set_reg(M68K_REG_SP, val); break;
case M68K_ISP: m68k_set_reg(M68K_REG_ISP, val); break;
case M68K_USP: m68k_set_reg(M68K_REG_USP, val); break;
case M68K_SR: m68k_set_reg(M68K_REG_SR, val); break;
case M68K_D0: m68k_set_reg(M68K_REG_D0, val); break;
case M68K_D1: m68k_set_reg(M68K_REG_D1, val); break;
case M68K_D2: m68k_set_reg(M68K_REG_D2, val); break;
case M68K_D3: m68k_set_reg(M68K_REG_D3, val); break;
case M68K_D4: m68k_set_reg(M68K_REG_D4, val); break;
case M68K_D5: m68k_set_reg(M68K_REG_D5, val); break;
case M68K_D6: m68k_set_reg(M68K_REG_D6, val); break;
case M68K_D7: m68k_set_reg(M68K_REG_D7, val); break;
case M68K_A0: m68k_set_reg(M68K_REG_A0, val); break;
case M68K_A1: m68k_set_reg(M68K_REG_A1, val); break;
case M68K_A2: m68k_set_reg(M68K_REG_A2, val); break;
case M68K_A3: m68k_set_reg(M68K_REG_A3, val); break;
case M68K_A4: m68k_set_reg(M68K_REG_A4, val); break;
case M68K_A5: m68k_set_reg(M68K_REG_A5, val); break;
case M68K_A6: m68k_set_reg(M68K_REG_A6, val); break;
case M68K_A7: m68k_set_reg(M68K_REG_A7, val); break;
/* TODO: set contents of [SP + wordsize * (REG_SP_CONTENTS-regnum)] */
default:
if( regnum < REG_SP_CONTENTS )
{
unsigned offset = m68k_get_reg(NULL, M68K_REG_SP) + 4 * (REG_SP_CONTENTS - regnum);
if( offset < 0xfffffd )
m68k_write_memory_16( offset, val );
}
}
}
void m68000_set_irq_line(int irqline, int state)
{
if (irqline == IRQ_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;
}
}
void m68000_set_irq_callback(int (*callback)(int irqline))
{
m68k_set_int_ack_callback(callback);
}