CMOS_PORT equ 70h
PORT_6845 equ 63h
COLOR_PORT equ 3d4h
MONO_PORT equ 3b4h
STATUS_PORT equ 64h
SHUT_DOWN equ 0feh
INT_MASK_PORT equ 21h
VIRTUAL_MODE equ 0001
A20_PORT equ 0d1h
A20_ON equ 0dfh
A20_OFF equ 0ddh
EOI equ 20h
MASTER8259A equ 20h
SLAVE8259A equ 0a0h
KBD_PORT_A equ 60h
KBD_PORT_B equ 61h
L_SHIFT equ 0000000000000001b
NL_SHIFT equ
R_SHIFT equ 0000000000000010b
NR_SHIFT equ
L_CTRL equ 0000000000000100b
NL_CTRL equ
R_CTRL equ 0000000000001000b
NR_CTRL equ
L_ALT equ 0000000000010000b
NL_ALT equ
R_ALT equ 0000000000100000b
NR_ALT equ
CAPS_LOCK equ 0000000001000000b
SCR_LOCK equ 0000000010000000b
NUM_LOCK equ 0000000100000000b
INSERT equ 0000001000000000b
STRUC idtr_struc
idt_len dw 0
idt_low dw 0
idt_hi db 0
rsrv db 0
ENDS idtr_struc
#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; // Зарезервированные 16 бит
} 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);
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include "tos.h"
// --------------------------------
// Определения вызываемых функций
// --------------------------------
// Инициализация защищенного режима и вход в него
void Init_And_Protected_Mode_Entry(void);
void protected_mode(unsigned long gdt_ptr, unsigned int gdt_size,
word cseg, word dseg);
word load_task_register(word tss_selector);
void real_mode(void);
void jump_to_task(word tss_selector);
void load_idtr(unsigned long idt_ptr, word idt_size);
void Keyb_int(void);
void Timer_int(void);
void Int_30h_Entry(void);
extern word kb_getch(void);
void enable_interrupt(void);
void task1(void);
void task2(void);
void flipflop_task(void);
void keyb_task(void);
void init_tss(tss *t, word cs, word ds,
unsigned char *sp, func_ptr ip);
void init_gdt_descriptor(descriptor *descr, unsigned long base,
word limit, unsigned char type);
void exception_0(void); //{ prg_abort(0); }
void exception_1(void); //{ prg_abort(1); }
void exception_2(void); //{ prg_abort(2); }
void exception_3(void); //{ prg_abort(3); }
void exception_4(void); //{ prg_abort(4); }
void exception_5(void); //{ prg_abort(5); }
void exception_6(void); //{ prg_abort(6); }
void exception_7(void); //{ prg_abort(7); }
void exception_8(void); //{ prg_abort(8); }
void exception_9(void); //{ prg_abort(9); }
void exception_A(void); //{ prg_abort(0xA); }
void exception_B(void); //{ prg_abort(0xB); }
void exception_C(void); //{ prg_abort(0xC); }
void exception_D(void); //{ prg_abort(0xD); }
void exception_E(void); //{ prg_abort(0xE); }
void exception_F(void); //{ prg_abort(0xF); }
void exception_10(void); //{ prg_abort(0x10); }
void exception_11(void); //{ prg_abort(0x11); }
void exception_12(void); //{ prg_abort(0x12); }
void exception_13(void); //{ prg_abort(0x13); }
void exception_14(void); //{ prg_abort(0x14); }
void exception_15(void); //{ prg_abort(0x15); }
void exception_16(void); //{ prg_abort(0x16); }
void exception_17(void); //{ prg_abort(0x17); }
void exception_18(void); //{ prg_abort(0x18); }
void exception_19(void); //{ prg_abort(0x19); }
void exception_1A(void); //{ prg_abort(0x1A); }
void exception_1B(void); //{ prg_abort(0x1B); }
void exception_1C(void); //{ prg_abort(0x1C); }
void exception_1D(void); //{ prg_abort(0x1D); }
void exception_1E(void); //{ prg_abort(0x1E); }
void exception_1F(void); //{ prg_abort(0x1F); }
void iret0(void);
void iret1(void);
// --------------------------------------
// Глобальная таблица дескрипторов GDT
// --------------------------------------
descriptor gdt[11];
// --------------------------------------
// Дескрипторная таблица прерываний IDT
// --------------------------------------
gate idt[] =
{
// Обработчики исключений
{ (word)&exception_0, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 0
{ (word)&exception_1, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1
{ (word)&exception_2, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 2
{ (word)&exception_3, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 3 )