в пам'яті резидентної частини здійснюється за схемою запит-відгук raquo ;: нерезидентна частина заповнює регістр AX (в регістр AH поміщається номер функції, причому номери 00h - 0BFh зарезервовані для MS DOS, а номери 0C0h - 0FFh надаються для прикладних програм; в регістр AL поміщається номер підфункції) і викликає переривання 2Fh. Якщо резидентная частина вже встановлена ??і її повторна установка не потрібно, необхідно повернути в регістрі AL сигнальне значення 0FFh. Таким чином, резидентна частина повинна в своєму складі мати також обробник переривання 2Fh, а нерезидентна частина повинна для перевірки наявності резидентної програми в пам'яті викликати це переривання і аналізувати результат.
Крім цього, для реалізації вимоги про включенні і виключенні резидентної програми, найбільш доцільним є введення в області даних резидентної частини програми спеціального байт-маркера активності резидентної частини. При неактивному стані програми вона не робить ніякого впливу на роботу комп'ютера, а при активному стані виконує заданий функціонал.
Оскільки резидентна програма повинна займати мінімум пам'яті, обрано рішення, при якому програма компілюється в COM файл.
Загальна структура програми приведена на малюнку.
. Розробка алгоритму резидентної програми
У додатку А представлена ??блок-схема роботи инициализирующей частини програми. У додатку Б - блок-схема роботи переривання 2FH. У додатку В - блок-схема роботи переривання 09H.
При запуску програми управління передається нерезидентної частини програми. Нерезидентна частина виконує ініціалізацію програми так:
. Перевіряє, чи не встановлена ??вже резидентна програма, поміщаючи в регістр AX магічне значення 0CDBAh (функція 0CDh, подфункция 0BAh), виконуючи програмне переривання 2Fh і перевіряючи повернення - якщо програма вже встановлена, в регістрі AL при поверненні з переривання повинно виявитися сигнальне значення 0FFh;
. Якщо програма вже встановлена, то проводиться вивід повідомлення Програма вже встановлена! Raquo; і негайне завершення програми без залишення резидентної частини в пам'яті;
3. Якщо програма ще не встановлена ??(значення в регістрі AL відрізняється від 0FFh), проводиться перехоплення використовуваних векторів переривань 09h і 2Fh із збереженням старих значень цих векторів в області даних резидентної частини програми;
4. Проводиться вивід повідомлення про успішну установку резидентної частини і резидентное завершення програми викликом функції 31h системного переривання 21h. Для того, щоб резидентна частина програми займала в пам'яті якомога менше місця, проводиться обчислення мінімального необхідного обсягу пам'яті, займаного тільки резидентної частиною. Пам'ять, займана нерезидентної частиною (ініціалізувалися код), для роботи резидентної частини не потрібна і повертається системі.
Резидентна частина програми отримує управління допомогою програмних або апаратних переривань. Використовуються два переривання - 09h і 2Fh.
Оброблювач мультиплексного переривання 2Fh резидентної частини програми виконує наступні дії:
. Перевіряє значення в регістрі AX на відповідність значенню 0CDBAh. Якщо значення співпало, це свідчить про те, що виконаний ще один запуск програми, і инициализирующая частина перевіряє, чи не встановлена ??вже резидентна програма. У цьому випадку слід в регістр AL записати сигнальне значення 0FFh і негайно завершити обробку переривання і повернути управління викликає програмі. В іншому випадку, слід передати управління далі по ланцюжку raquo ;, використовуючи збережений обробник цього переривання.
Обробник переривання 09h (клавіатури) отримує управління при кожному натисканні клавіші на клавіатурі. Особливістю цього обробника є те, що він отримує управління двічі: перший раз при натисканні клавіші, другий раз - при відпуску клавіші. Для правильної обробки натискань клавіш в програмі організований спеціальний байт-маркер - прапорець raquo ;, який зводиться при натисканні клавіші і скидається при відпуску клавіші. Стан цього прапорця дозволяє розрізнити натискання і відпускання клавіш. Обробник переривання 09h виконує наступні дії:
. Перевіряє стан активності резидентної частини. Якщо резидентная частина не активна (вимкнена), управління передається збереженому оброблювачу переривання 09h для звичайної обробки натискань клавіатури.
. Якщо резидентная частина активна raquo ;, проводиться перевірка - натиснута клавіша або відпущена. Якщо клавіша натиснута, проводиться зрушення палаючої лампочки клавіатури на 1 (по кільцю) і установка стану ла...