#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
#include "tos.h"

// -------------------------------------------
//	Модуль обслуживания таймера
// -------------------------------------------

#define EOI 0x20
#define MASTER8259A 0x20

extern void beep(void);
extern void flipflop_task(void);
void Timer_int(void);
word dispatcher(void);

word			timer_cnt;

// ------------------------------------------
// Обработчик аппаратного прерывания таймера
// ------------------------------------------

void Timer_int(void) {

	asm pop bp

// Периодически выдаём звуковой сигнал

	timer_cnt += 1;
	if((timer_cnt & 0xf) == 0xf) {
		beep();
	}

// Выдаём в контроллер команду конца
// прерывания

	asm mov	al,EOI
	asm out	MASTER8259A,al

// Переключаемся на следующую задачу,
// селектор TSS которой получаем от
// диспетчера задач dispatcher()

	jump_to_task(dispatcher());
	asm iret
}

// --------------------------------------
// Диспетчер задач
// --------------------------------------

// Массив селекторов, указывающих на TSS
// задач, участвующих в параллельной работе,
// т.е. диспетчеризуемых задач

word task_list[] = {
	MAIN_TASK_SELECTOR,
	FLIP_TASK_SELECTOR,
	KEYBIN_TASK_SELECTOR,
	TASK_2_SELECTOR
};

word current_task = 0; // текущая задача
word max_task = 3;     // количество задач - 1

// Используем простейший алгоритм диспетчеризации -
// выполняем последовательное переключение на все
// задачи, селекторы TSS которых находятся
// в массиве task_list[].

word dispatcher(void) {

	if(current_task < max_task) current_task++;
	else current_task = 0;
	return(task_list[current_task]);

}