File:  [RetroPC.NET] / xmil / nds / patch / iocore.c
Revision 1.1: download - view: text, annotated - select for diffs
Tue Mar 24 22:52:52 2009 JST (16 years, 7 months ago) by yui
Branches: MAIN
CVS tags: HEAD
add nds-win32 simulation project

#include	"compiler.h"
#include	"pccore.h"
#include	"iocore.h"


	CMT			cmt;
	SIO			sio;


// ----

#if !defined(USE_ARMROUTINE)
static void IOOUTCALL dummy_out(UINT uPort, REG8 cValue)
{
	(void)uPort;
	(void)cValue;
}

static REG8 IOINPCALL dummy_inp(UINT uPort)
{
	(void)uPort;
	return 0xff;
}
#else	// !defined(USE_ARMROUTINE)
void IOOUTCALL dummy_out(UINT uPort, REG8 cValue);
REG8 IOINPCALL dummy_inp(UINT uPort);
#endif	// !defined(USE_ARMROUTINE)


// ----

static void IOOUTCALL port1fxx_o(UINT uPort, REG8 cValue)
{
	REG8 lsb;
	REG8 msb6;

	lsb = (UINT8)uPort;
	if (lsb == 0xd0)
	{
		scrn_o(uPort, cValue);
		return;
	}
	if (lsb < 0x80)
	{
		return;
	}
	msb6 = lsb & (~3);
	if (lsb < 0x90)
	{
		dmac_o(uPort, cValue);
		return;
	}
	if (msb6 == 0x90)
	{
		sio_o(uPort, cValue);
		return;
	}
	if ((msb6 == 0xa0) || (msb6 == 0xa8))
	{
		ctc_o(uPort, cValue);
		return;
	}
	if (lsb == 0xe0)
	{
		blackctrl_o(uPort, cValue);
		return;
	}
#if defined(SUPPORT_TURBOZ)
	if (pccore.ROM_TYPE >= 3)
	{
		if (lsb == 0xb0)
		{
			extpal_o(uPort, cValue);
			return;
		}
		if (lsb == 0xc0)
		{
			exttextdisp_o(uPort, cValue);
			return;
		}
		if (lsb == 0xc5)
		{
			extgrphpal_o(uPort, cValue);
			return;
		}
		if ((lsb >= 0xb9) && (lsb < 0xc0))
		{
			exttextpal_o(uPort, cValue);
			return;
		}
	}
#endif	// defined(SUPPORT_TURBOZ)
}

static REG8 IOINPCALL port1fxx_i(UINT uPort)
{
	REG8 lsb;
	REG8 msb6;

	lsb = (UINT8)uPort;
	if (lsb < 0x80)
	{
		return 0xff;
	}
	msb6 = lsb & (~3);
	if (lsb < 0x90)
	{
		return dmac_i(uPort);
	}
	if (msb6 == 0x90)
	{
		return sio_i(uPort);
	}
	if ((msb6 == 0xa0) || (msb6 == 0xa8))
	{
		return ctc_i(uPort);
	}
	if (lsb == 0xd0)
	{
		return scrn_i(uPort);
	}
	if (lsb >= 0xf0)
	{
		return dipsw_i(uPort);
	}
#if defined(SUPPORT_TURBOZ)
	if (pccore.ROM_TYPE >= 3)
	{
		if (lsb == 0xb0)
		{
			return extpal_i(uPort);
		}
		if (lsb == 0xc0)
		{
			return exttextdisp_i(uPort);
		}
		if (lsb == 0xc5)
		{
			return extgrphpal_i(uPort);
		}
		if ((lsb >= 0xb9) && (lsb < 0xc0))
		{
			return exttextpal_i(uPort);
		}
		if (lsb == 0xe0)
		{
			return(blackctrl_i(uPort);
		}
	}
#endif	// defined(SUPPORT_TURBOZ)

	return 0xff;
}


// ----

static const IOINP s_fnDefInp[0x20] =
{
	dummy_inp,			dummy_inp,
	dummy_inp,			dummy_inp,
	dummy_inp,			dummy_inp,
	dummy_inp,			dummy_inp,

	dummy_inp,			dummy_inp,
	dummy_inp,			dummy_inp,
	dummy_inp,			dummy_inp,
	cgrom_i,			fdc_i,

	dummy_inp,			dummy_inp,
	dummy_inp,			dummy_inp,
	pcg_i,				pcg_i,
	pcg_i,				pcg_i,

	dummy_inp,			subcpu_i,
	ppi_i,				sndboard_psgsta,
	dummy_inp,			dummy_inp,
	dummy_inp,			dummy_inp
};

static const IOOUT s_fnDefOut[0x20] =
{
	dummy_out,			dummy_out,
	dummy_out,			dummy_out,
	dummy_out,			dummy_out,
	dummy_out,			dummy_out,

	dummy_out,			dummy_out,
	dummy_out,			dummy_out,
	dummy_out,			dummy_out,
	cgrom_o,			fdc_o,

	palette_o,			palette_o,
	palette_o,			ply_o,
	dummy_out,			pcg_o,
	pcg_o,				pcg_o,

	crtc_o,				subcpu_o,
	ppi_o,				sndboard_psgdat,
	sndboard_psgreg,	memio_rom,
	memio_ram,			dummy_out
};

typedef void (*INITFN)(void);

static const INITFN s_fnInit[] =
{
	cgrom_reset,	cmt_reset,		crtc_reset,
	ctc_reset,		dmac_reset,		fdc_reset,
	memio_reset,	pcg_reset,		ppi_reset,
	sio_reset,		sndboard_reset,	subcpu_reset,
	vramio_reset
};


// ----

void iocore_reset(void)
{
	UINT i;

	ZeroMemory(&iocore, sizeof(iocore));
	CopyMemory(iocore.f.inpfn, s_fnDefInp, sizeof(s_fnDefInp));
	CopyMemory(iocore.f.outfn, s_fnDefOut, sizeof(s_fnDefOut));
	for (i=0; i<0x10; i++) {
		iocore.f.inpfn[i+0x20] = tram_atr_i;
		iocore.f.inpfn[i+0x30] = tram_ank_i;
		iocore.f.outfn[i+0x20] = tram_atr_o;
		iocore.f.outfn[i+0x30] = tram_ank_o;
	}
	if (pccore.ROM_TYPE >= 2) {
#if defined(SUPPORT_BANKMEM)
		iocore.f.inpfn[0x0b] = memio_bank_i;
		iocore.f.outfn[0x0b] = memio_bank_o;
#endif
		iocore.f.inpfn[0x1f] = port1fxx_i;
		iocore.f.outfn[0x1f] = port1fxx_o;
		for (i=0; i<8; i++) {
			iocore.f.inpfn[i+0x38] = tram_knj_i;
			iocore.f.outfn[i+0x38] = tram_knj_o;
		}
	}
#if defined(SUPPORT_TURBOZ)
	if (pccore.ROM_TYPE >= 3) {
		iocore.f.inpfn[0x10] = palette_i;
		iocore.f.inpfn[0x11] = palette_i;
		iocore.f.inpfn[0x12] = palette_i;
		iocore.f.inpfn[0x13] = ply_i;
	}
#endif	// defined(SUPPORT_TURBOZ)
#if	defined(SUPPORT_ROMEO2)
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
	if (pccore.SOUND_SW) {
		iocore.f.inpfn[0x07] = opm_i;
		iocore.f.outfn[0x07] = opm_o;
	}
#endif	// defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
#endif	// defined(SUPPORT_ROMEO2)
	for (i=0; i<NELEMENTS(s_fnInit); i++)
	{
		(s_fnInit[i])();
	}
}


// ----

#if !defined(USE_ARMROUTINE)
void IOOUTCALL iocore_out(UINT uPort, REG8 cValue)
{
	UINT msb;

	msb = uPort >> 8;
	if (iocore.s.mode)
	{
		gram2_o(uPort, cValue);
	}
	else if (msb >= 0x40)
	{
		gram_o(uPort, cValue);
	}
	else
	{
		(*iocore.f.outfn[msb])(uPort, cValue);
	}
}

REG8 IOINPCALL iocore_inp(UINT uPort)
{
	UINT msb;

	msb = uPort >> 8;
	iocore.s.mode = 0;
	if (msb >= 0x40)
	{
		return gram_i(uPort);
	}
	else
	{
		return (*iocore.f.inpfn[msb])(uPort);
	}
}
#endif	// !defined(USE_ARMROUTINE)


RetroPC.NET-CVS <cvs@retropc.net>