#include "iodefine.h"
#include "sys_ctrl.h"

void init_clk(void)
{
	/* 周波数制御レジスタ */
	CPG.FRQCR.BIT.IFC = 0;	/* 内部クロック周波数の分周率を×1倍 */
	return;
}

void resbank_enable(void)
{
	/* バンク番号レジスタ */
	INTC.IBNR.BIT.BE = 1;	/* NMI以外の全割り込みでバンクを使用する */
	return;
}

void cache_enable(void)
{
	/* キャッシュ制御レジスタ1 */
	CCNT.CCR1.BIT.ICF = 1;	/* 命令キャッシュフラッシュ */
	CCNT.CCR1.BIT.OCF = 1;	/* オペランドキャッシュフラッシュ */

	CCNT.CCR1.BIT.ICE = 1;	/* 命令キャッシュ有効 */
	CCNT.CCR1.BIT.OCE = 1;	/* オペランドキャッシュ有効 */
	CCNT.CCR1.BIT.WT = 1;	/* ライトスルー有効 */

	return;
}

void cache_disable(void)
{
	/* キャッシュ制御レジスタ1 */
	CCNT.CCR1.BIT.WT = 0;	/* ライトスルー無効 */
	CCNT.CCR1.BIT.ICE = 0;	/* 命令キャッシュ無効 */
	CCNT.CCR1.BIT.OCE = 0;	/* オペランドキャッシュ無効 */

	return;
}

//インターフェース2010年7月号Appendix5リスト5から
static void set_imask( unsigned short mask )
{
	unsigned long uh;

	mask <<= 4;
	mask &= 0x00f0;
	asm("	stc	sr,%0	":"=r"(uh):);
	uh &= 0xffffff0f;
	uh = uh | mask;
	asm("	ldc	%0,sr "::"r"(uh));
}

void irq_enable(void)
{
	set_imask(0);	/* 全レベル割込み許可 */
	return;
}

void irq_disable(void)
{
	set_imask(14);	/* HEWデバッガのSTOPのため15でなく14 */
	return;
}
