/* タイマ関係 */

#include "bootpack.h"
#include "timer.h"
#include "naskfunc.h"
#include "pic.h"
#include "screen.h"
#include "ThreadMan.h"
#define PIT_CTRL	0x0043
#define PIT_CNT0	0x0040

TIMERCTL timerctl;

void init_pit(void)
{
	io_out8(PIT_CTRL, 0x34);

	//0x04A9で約1msに一回int0x20が発行される
	//がqemuでは10ms以下の周期に設定できないらしい
	io_out8(PIT_CNT0, 0xA9);
	io_out8(PIT_CNT0, 0x04);
	//io_out8(PIT_CNT0, 0x0);
	//io_out8(PIT_CNT0, 0x0);
	timerctl.count = 0;
	timerctl.subcount = 0;
	return;
}

extern "C" void inthandler20(int *esp)
{
	io_out8(PIC0_OCW2, 0x60);	/* IRQ-00受付完了をPICに通知 */
	timerctl.subcount++;
	if(timerctl.subcount >= 55){
		timerctl.subcount = 0;
		timerctl.count++;
		//Screen::Inst().printf("t, %d\n", timerctl.count);
	
	if(timerctl.count == 50){
		WORD tr = 2;
		asm("str [eax]": :"a"(&tr));
		Screen::Inst().printf("test, %d\n", tr);
		ThreadMan::Inst().SwitchThread();
	}
	}
	return;
}

unsigned long long timer_getbiostimer(){
	return timerctl.count;//約55smごとに増やせばよい
}
