/*
	SH4/mod/intc

	Implements the register interface of the sh4 interrupt controller.
	For the actual implementation of interrupt caching/handling logic, look at sh4_interrupts.cpp

	--
*/

#include "types.h"
#include "../sh4_interrupts.h"
#include "../sh4_mmr.h"

//Register writes need interrupt re-testing !

static void write_INTC_IPRA(u32 addr, u32 data)
{
	if (INTC_IPRA.reg_data != (u16)data)
	{
		INTC_IPRA.reg_data = (u16)data;
		SIIDRebuild();	//we need to rebuild the table
	}
}

static void write_INTC_IPRB(u32 addr, u32 data)
{
	if (INTC_IPRB.reg_data != (u16)data)
	{
		INTC_IPRB.reg_data = (u16)data;
		SIIDRebuild(); //we need to rebuild the table
	}
}

static void write_INTC_IPRC(u32 addr, u32 data)
{
	if (INTC_IPRC.reg_data != (u16)data)
	{
		INTC_IPRC.reg_data = (u16)data;
		SIIDRebuild(); //we need to rebuild the table
	}
}

static u32 read_INTC_IPRD(u32 addr)
{
	return 0;
}

//Init/Res/Term
void intc_init()
{
	//INTC ICR 0xFFD00000 0x1FD00000 16 0x0000 0x0000 Held Held Pclk
	sh4_rio_reg_wmask<INTC, INTC_ICR_addr, 0x4380>();

	//INTC IPRA 0xFFD00004 0x1FD00004 16 0x0000 0x0000 Held Held Pclk
	sh4_rio_reg(INTC, INTC_IPRA_addr, RIO_WF, nullptr, write_INTC_IPRA);

	//INTC IPRB 0xFFD00008 0x1FD00008 16 0x0000 0x0000 Held Held Pclk
	sh4_rio_reg(INTC, INTC_IPRB_addr, RIO_WF, nullptr, write_INTC_IPRB);

	//INTC IPRC 0xFFD0000C 0x1FD0000C 16 0x0000 0x0000 Held Held Pclk
	sh4_rio_reg(INTC, INTC_IPRC_addr, RIO_WF, nullptr, write_INTC_IPRC);

	//INTC IPRD 0xFFD00010 0x1FD00010 16 0xDA74 0xDA74 Held Held Pclk	(SH7750S, SH7750R only)
	sh4_rio_reg(INTC, INTC_IPRD_addr, RIO_RO_FUNC, read_INTC_IPRD);

	interrupts_init();
}

void intc_reset()
{
	INTC_ICR.reg_data = 0;
	INTC_IPRA.reg_data = 0;
	INTC_IPRB.reg_data = 0;
	INTC_IPRC.reg_data = 0;

	interrupts_reset();
}

void intc_term()
{
	interrupts_term();
}

