マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

タイマ割り込みのソースコード

タイマハンドラ呼び出し部分(NASM)

asmTimerHandler:
_asmTimerHandler:

	PUSHAD

	CALL	timerHandler

	POPAD
	IRETD

タスクを切り替えてる部分

void timerHandler(){
	int* stack;

	asm ("mov %%ebp, %0 \n" : "=g"(stack));

        //今,動いているタスクのレジスタの保存
	taskData[currentTask].eax     = stack[9];
	taskData[currentTask].ecx     = stack[8];
	taskData[currentTask].edx     = stack[7];
	taskData[currentTask].ebx     = stack[6];
	taskData[currentTask].esp2    = stack[5];
	taskData[currentTask].ebp     = stack[4];
	taskData[currentTask].esi     = stack[3];
	taskData[currentTask].edi     = stack[2];

	taskData[currentTask].cs      = stack[11];
	taskData[currentTask].eflags = stack[12];
	taskData[currentTask].esp     = stack[13];

	taskData[currentTask].eip = stack[10];


        //ここでタスク切り替え
	currentTask = (currentTask + 1) % taskCount;
	stack[10] = taskData[currentTask].eip;

        //これから動かすタスクのデータをレジスタに保存
	stack[9] = taskData[currentTask].eax;
	stack[8] = taskData[currentTask].ecx;
	stack[7] = taskData[currentTask].edx;
	stack[6] = taskData[currentTask].ebx;
	stack[5] = taskData[currentTask].esp2;
	stack[4] = taskData[currentTask].ebp;
	stack[3] = taskData[currentTask].esi;
	stack[2] = taskData[currentTask].edi;

	stack[11] = taskData[currentTask].cs;
	stack[12] = taskData[currentTask].eflags;
	stack[13] = taskData[currentTask].esp;

	IO::writePort8(PIC0_OCW2, 0x60);
}