#define word unsigned int

// Селекторы, определённые в GDT

#define CODE_SELECTOR      	0x08 // сегмент кода
#define DATA_SELECTOR      	0x10 // сегмент данных

#define TASK_1_SELECTOR    	0x18 // задача TASK_1
#define TASK_2_SELECTOR    	0x20 // задача TASK_2
#define MAIN_TASK_SELECTOR 	0x28 // главная задача

#define VID_MEM_SELECTOR   	0x30 // сегмент видеопамяти
#define IDT_SELECTOR				0x38 // талица IDT

#define KEYBIN_TASK_SELECTOR 	0x40 // задача ввода с клавиатуры
#define KEYB_TASK_SELECTOR  	0x48 // задача обработки
											  // клавиатурного прерывания
#define FLIP_TASK_SELECTOR  	0x50 // задача FLIP_TASK

// Байт доступа

typedef struct {
	 unsigned accessed   : 1;
	 unsigned read_write : 1;
	 unsigned conf_exp   : 1;
	 unsigned code       : 1;
	 unsigned xsystem    : 1;
	 unsigned dpl      	: 2;
	 unsigned present    : 1;
	 } ACCESS;

// Структура дескриптора

typedef struct descriptor {
	word limit;
	word base_lo;
	unsigned char base_hi;
	unsigned char type_dpl;
	unsigned reserved;
} descriptor;

// Структура вентиля вызова, задачи, прерывания,
// исключения

typedef struct gate {
	word offset;
	word selector;
	unsigned char count;
	unsigned char type_dpl;
	word reserved;
} gate;

// Структура сегмента состояния задачи TSS

typedef struct tss {
	word link;		// поле обратной связи

	word sp0;		// указатель стека кольца 0
	word ss0;
	word sp1;		// указатель стека кольца 1
	word ss1;
	word sp2;		// указатель стека кольца 1
	word ss2;

	word ip;			// регистры процессора
	word flags;
	word ax;
	word cx;
	word dx;
	word bx;
	word sp;
	word bp;
	word si;
	word di;
	word es;
	word cs;
	word ss;
	word ds;
	word ldtr;
} tss;

// Размеры сегментов и структур

#define TSS_SIZE            (sizeof(tss))
#define DESCRIPTOR_SIZE     (sizeof(descriptor))
#define GATE_SIZE           (sizeof(gate))
#define IDT_SIZE            (sizeof(idt))

// Физические адреса видеопамяти для цветного
// и монохромного видеоадаптеров

#define COLOR_VID_MEM       0xb8000L
#define MONO_VID_MEM        0xb0000L

// Видеоржеимы

#define MONO_MODE           0x07 // монохромный
#define BW_80_MODE          0x02 // монохромный, 80 символов
#define COLOR_80_MODE       0x03 // цветной, 80 символов

// Значения для поля доступа

#define TYPE_CODE_DESCR     0x18
#define TYPE_DATA_DESCR     0x10
#define TYPE_TSS_DESCR      0x01
#define TYPE_CALL_GATE      0x04
#define TYPE_TASK_GATE      0x85
#define TYPE_INTERRUPT_GATE 0x86
#define TYPE_TRAP_GATE      0x87

#define SEG_WRITABLE        0x02
#define SEG_READABLE        0x02
#define SEG_PRESENT_BIT     0x80

// Константы для обработки аппаратных
// прерываний

#define EOI 					0x20
#define MASTER8259A 			0x20
#define SLAVE8259A 			0xa0

// Макро для формирования физического
// адреса из компонент сегменоного адреса
// и смещения

#define MK_LIN_ADDR(seg,off) (((unsigned long)(seg))<<4)+(word)(off)

// Тип указателя на функцию типа void без параметров

typedef void (func_ptr)(void);
