#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <piece.h>
#include <s1c33cpu.h>
#include "c33209.h"
//------------------------------------------------------------------------------
unsigned char vbuff[DISP_X * DISP_Y];
//------------------------------------------------------------------------------
void pceAppInit() {
	pceAppSetProcPeriod(1);
	pceLCDSetBuffer(vbuff);
	pceLCDDispStart();
}
//------------------------------------------------------------------------------
void pceAppProc(int cnt) {
	int t, u, v, dummy;
	memset(vbuff, 0, sizeof vbuff);
	pceFontSetPos(0, 0);
	pceFontSetTxColor(3);
	pceFontSetBkColor(0);
	pceFontPrintf("割込許可 %d", cnt);
	pceLCDTrans();
	//Aボタンが押されたら、割り込みを禁止して、5秒間待つ。
	//・USB SUSPEND信号がオフ⇒オンに変化した後、USBコントローラの割り込みを解除する処理を行うまでに、2000μ秒の遅れを入れてみた。
	//  すると、その後でUSBコントローラの割り込みを解除する処理を行っているにもかかわらず、割り込みが解除されずハングアップした。
	//・遅れの時間をいろいろ変えて試してみたところ、2ミリ秒ぐらいに境界があるようだ。結論としては、
	//  『USB SUSPEND信号がオフ⇒オンに変化した後、2ミリ秒以内にUSBコントローラの割り込みを解除する処理を行わないと、割り込みが解除できなくなる。』
	if(pcePadGet() & TRG_A) {
DISABLE;
		memset(vbuff, 3, sizeof vbuff);
		pceFontSetPos(0, 0);
		pceFontSetTxColor(0);
		pceFontSetBkColor(3);
		pceFontPrintf("割込禁止開始");
		pceLCDTrans();
		t = pceTimerGetCount();
		u = bK5_K5D_K50D;
		do {
			//割り込み禁止中は、常にUSB SUSPEND信号を監視して、USB SUSPEND信号が変化したら…
			if(u ^ bK5_K5D_K50D) {
				//USB SUSPEND信号がオフ⇒オンに変化したら、USBコントローラの割り込みを解除する処理を行う。
				if((u ^= 1)) {
					//USBコントローラの割り込みを解除する処理を行う前に、2000μ秒の遅れを入れる。
					//すると、その後でUSBコントローラの割り込みを解除する処理を行っているにもかかわらず、割り込みが解除されずハングアップする。
					v = pceTimerGetPrecisionCount();
					do { /** no job **/ } while(pceTimerAdjustPrecisionCount(v, pceTimerGetPrecisionCount()) < 2000);	//いろいろ試してみたところ、1960μ秒以下⇒セーフ，1970μ秒以上⇒アウト、となりました。
					//□Read Interrupt Register (PDIUSBD12.pdf「11.3.1 Read interrupt register」参照)
					(*(volatile unsigned char *)0x400004) = 0xF4;	//@	┐厳密には@ABでワンセットなのだが、@AだけでもUSBコントローラの割り込みを解除できる。
					dummy = (*(volatile unsigned char *)0x400000);	//A	│@だけではUSBコントローラの割り込みを解除できず、割り込み禁止終了後にハングアップする。
				//	dummy = (*(volatile unsigned char *)0x400000);	//B	┘@Aならばok。@ABでもok。ここでは必要最小限の、@Aとしておくことにする。
				}
			}
		} while((pceTimerGetCount() - t) < 5000);
		memset(vbuff, 3, sizeof vbuff);
		pceFontSetPos(0, 0);
		pceFontSetTxColor(0);
		pceFontSetBkColor(3);
		pceFontPrintf("割込禁止終了");
		pceLCDTrans();
ENABLE;
	}
	//SELECTボタンが押されたら終了する。
	if(pcePadGet() & TRG_SELECT) { pceAppReqExit(0); }
}
//------------------------------------------------------------------------------
void pceAppExit() {
}
