#include "compiler.h"
#include "libnds.h"
#include "z80core.h"
#include "pccore.h"
#include "ipcxfer.h"
#include "nds9psg.h"
#if !defined(USE_ARMROUTINE)
void nds9psg_setreg(PNDS9PSG pPsg, REG8 cReg, REG8 cValue)
{
	if (cReg >= 14)
	{
		return;
	}
	if (cReg == 13)
	{
		pPsg->reg.b[cReg] = cValue;
		pPsg->cUpdateEnv = 1;
	}
	else if (pPsg->reg.b[cReg] != cValue)
	{
		pPsg->reg.b[cReg] = cValue;
		pPsg->cUpdateReg = 1;
	}
}
REG8 nds9psg_getreg(PNDS9PSG pPsg, REG8 cReg)
{
	return pPsg->reg.b[cReg & 15];
}
#endif	// !defined(USE_ARMROUTINE)
// ----
void nds9psg_reset(PNDS9PSG pPsg)
{
	ZeroMemory(pPsg, sizeof(*pPsg));
	pPsg->reg.r.cMixer = 0x3f;
	pPsg->reg.r.cIo1 = 0xff;
	pPsg->reg.r.cIo2 = 0xff;
	pPsg->uClock = CPU_CLOCK;
}
void nds9psg_sync(PNDS9PSG pPsg)
{
	const UINT uClock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK;
	const UINT uPast = uClock - pPsg->uClock;
	if (uPast)
	{
		PNDSPSGXFER pXfer = IPCPSGXFER;
		if (!pXfer->uClock)
		{
			CopyMemory(pXfer->reg.b, pPsg->reg.b, sizeof(pXfer->reg));
			pXfer->cUpdateReg = pPsg->cUpdateReg;
			pXfer->cUpdateEnv = pPsg->cUpdateEnv;
			pXfer->uClock = uPast;
			pPsg->uClock = uClock;
			pPsg->cUpdateReg = 0;
			pPsg->cUpdateEnv = 0;
		}
	}
}
RetroPC.NET-CVS <cvs@retropc.net>