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); 
}