/***************************************************************
	CPUバス初期化処理
***************************************************************/

/* CPU固有レジスタ定義ヘッダ */
#include "cpu.h"

/* CPU初期化/割り込み制御関数ヘッダ */
#include "cpu_init.h"


/* CPU固有初期化処理 */
void CPU_BusInitialize()
{
	/* クロック設定 */
	*FRQCR  = 0x1104;	/* Bφ=48M Iφ=144M Pφ=24M */
}


/* CPU割り込み初期化処理 */
void CPU_IRQInitialize(void)
{
	/* 外部割り込み入力有効 */
//	*PECR0 = (*PECR0 & 0x0000) | 0x3333; /* IRQ3〜0 */

	/* 割り込みレベル設定(0:最低 15:最高) */
	/*       IRQ0     IRQ1     IRQ2   IRQ3 */
//	*IPR01 = (15<<12)|(15<<8)|(15<<4)| 15;
	/* 割り込み入力信号設定(0:'L'レベル) */
	/* 割り込み入力信号設定(1:立ち下りエッジ) */
	/* 割り込み入力信号設定(2:立ち上りエッジ) */
	/*       IRQ3     IRQ2     IRQ1   IRQ0 */
//	*ICR1  = ( 2<<6)|( 2<<4)|( 1<<2)| 1;
	/* エッジ割り込み設定時 */
//	*IRQRR = 0x00F0;	/* IRQ3〜0割り込みクリア */
}

/* CPU割り込み処理 */
void CPU_IRQInterrupt(void)
{
	int stat;
	stat = *IRQRR;
//	if (stat & 1) { /* IRQ0割り込み発生 */
//	if (stat & 2) { /* IRQ1割り込み発生 */
//	if (stat & 4) { /* IRQ2割り込み発生 */
//	if (stat & 8) { /* IRQ3割り込み発生 */

		/* 割り込み処理関数呼び出し */

//	}
	/* 割り込み要求クリア(エッジ割り込み設定時のみ) */
	*IRQRR = 0x00F0;	/* IRQ3〜0クリア */
}



/* DMA転送実行 */
void CPU_DMAtransfer(unsigned int sar, unsigned int dar, unsigned int word)
{
	if (word == 0) return;
	*DMA_SAR = sar;
	*DMA_DAR = dar;
	*DMA_TCR = word;
	/* TC=1,先元アドレス増加,オートリクエスト,TB=1,TS=10,DMA起動 */
	*DMA_CHCR = 0x80005431;
	*DMA_DMAOR = 1;
	while(1){
		if (*DMA_CHCR & 2) {
			*DMA_CHCR = 0x80005430;
			break;
		}
	}
	/* ↑バースト転送かつポーリングで完了待ち */
	/* マルチタスク処理時は要改良 */
}


/* 割り込み許可(CPU割り込み受け付けレベル14固定/多重割り込み無し) */
void CPU_EnableInterrupt(void)
{
	int IntLvOld;
	int IntLvNew;
	asm volatile ("stc sr,%0" : "=r" (IntLvOld));
	IntLvNew = (IntLvOld & ~0xF0) | (14<<4);
	asm volatile ("ldc %0,sr" : : "r" (IntLvNew));
}

/* 割り込み禁止(CPU割り込み受け付けレベル14固定/多重割り込み無し) */
int CPU_DisableInterrupt(void)
{
	int IntLvOld;
	int IntLvNew;
	asm volatile ("stc sr,%0" : "=r" (IntLvOld));
	IntLvNew = IntLvOld | 0xF0;
	asm volatile ("ldc %0,sr" : : "r" (IntLvNew));
	return IntLvOld;
}
