Dklab, статті, основи роботи з векторами переривань

Запустивши подібну програму, ми будемо чути випадковий звук кожен раз, коли натискаємо або відпускаємо клавіші.

4. Setup »не-латки" на обробники IRQ

Якщо ми встановлюємо нову процедуру обробки на одне з переривань, що генеруються зовнішніми пристроями (тобто на такі переривання, яким відповідає запит IRQ, наприклад, таймер, клавіатура і т.д), і ця процедура не є "латкою", то необхідно пам'ятати одну річ. В кінці такої процедури обов'язково потрібно виконувати команду запису значення 20h в порт 20h, що вирішує такі переривання для даного каналу IRQ.
Наведемо приклад на Паскалі такій ситуації. Тут ми встановлюємо «не-латку" на переривання клавіатури (номер 9), при цьому функції клавіатури, звичайно, тимчасово блокуються.

Спробуйте прибрати висновок значення в порт. Після першого ж натискання на клавішу клавіатура перестане реагувати. Причому після виходу з програми вона як і раніше буде заблокована.
На Сі для виведення в порт 20h використовується функція outportb (0x20,0x20).

5. Засоби для обесперенія гарантованого відновлення старих векторів переривань

Хоча це практично ніде і не описується, в Паскалі, як і в Сі, можна встановити процедуру, яка буде викликатися при завершенні програми (неважливо, при аварійному чи завершенні або ж при нормальному). Це виявляється дуже корисним при роботі з векторами переривань, так як їх необхідно відновлювати в будь-якому випадку при завершенні програми. У таку процедуру потрібно помістити команди відновлення старих векторів, а потім зареєструвати її як процедуру завершення. Наведемо приклади: