Подсистема прерываний. Лабораторная работа №3

Слайд 2

К теме: Организация подсистемы прерываний. Контроллер прерываний. ЦЕЛЬ РАБОТЫ Изучить организацию

К теме: Организация подсистемы прерываний. Контроллер прерываний.

ЦЕЛЬ РАБОТЫ
Изучить организацию прерываний в IBM

PC с использованием контроллера прерываний.
Продолжительность работы - 4 часа.
Слайд 3

Контроллер прерываний 0x21 0x20, 0Ah 0x20, 0Bh 0xA1 0xA0, 0Ah 0xA0, 0Bh

Контроллер прерываний

0x21

0x20, 0Ah

0x20, 0Bh

0xA1

0xA0, 0Ah

0xA0, 0Bh

Слайд 4

Задание Под MS DOS написать программу, которая: 1) выполняет инициализацию контроллера прерываний;

Задание

Под MS DOS написать программу, которая:
1) выполняет инициализацию контроллера прерываний;

Слайд 5

Задание Под MS DOS написать программу, которая: 1) выполняет инициализацию контроллера

Задание

Под MS DOS написать программу, которая:
1) выполняет инициализацию контроллера прерываний;
2) выводит

на экран содержимое регистров запросов, обслуживаний и масок для ведущего и ведомого контроллеров (через видеобуфер).
Слайд 6

Задание Под MS DOS написать программу, которая: 1) выполняет инициализацию контроллера

Задание

Под MS DOS написать программу, которая:
1) выполняет инициализацию контроллера прерываний;
2) выводит

на экран содержимое регистров запросов, обслуживаний и масок для ведущего и ведомого контроллеров (через видеобуфер).
*При нажатии на клавиши меняется цвет или фон выводимой информации.

Программа должна быть резидентной. Все векторы прерываний переопределяются, новый базовый адрес выбирается в соответствии с вариантом.

Слайд 7

int main() { unsigned far *fp; //объявляем указатель init(); FP_SEG (fp)

int main()
{
unsigned far *fp; //объявляем указатель
init();
FP_SEG (fp) = _psp; // получаем

сегмент
FP_OFF (fp) = 0x2c; // и смещение сегмента данных //с переменными среды,
_dos_freemem(*fp); //чтобы освободить память
_dos_keep(0,(_DS -_CS)+(_SP/16)+1);
//оставляем резидентной
return 0;
}

Пример (test3.cpp)

Слайд 8

Пример (test3.cpp) void init() { intOld = getvect(0x__);//старые обработчики 08-0F, 70-77

Пример (test3.cpp)

void init()
{
intOld = getvect(0x__);//старые обработчики 08-0F, 70-77
...
setvect(0x__, intNew); // свои

обработчики
...
_disable(); // запретить прерывания (cli)
outp(0x20, 0x11); // ICW1
outp(0x21, 0x70); // ICW2
outp(0x21, 0x04); // ICW3
outp(0x21, 0x01); // ICW4
...
_enable(); // разрешить прерывания (sti)
}