Функцiя main контролює чи була повторна iнсталяція резидентної програми. Якщо програма не запускалася ранiше, то вона залишається в пам'ятi резидентною, iнакше видає повiдомлення про те, що вона вже є в пам'ятi. Функцiя my_context (void) зберігає контекст Tsr, а саме : збереження свого сегменту стеку, збереження адреси своєї Dta, збереження свого Pid. Функцiя readvect ( ) читає вектор заданого переривання. Для читання вектору використаємо функцiю 35h Dos ( переривання 21h ) : Вхiд : Ah = 35h; Al = номер вектору переривання. Вихiд : Es : Bx = адреса програми обробки переривання. Функцiя writevect ( ) влаштовує новий вектор переривання на задану адресу. Для запису вектору використаємо функцiю 25h Dos : Вхiд : Ah = 25h; Al = номер вектору переривання; Ds : Bx = четирибайтна адреса нового обробника переривання. Функцiя text_print (void) видає на екран повiдомлення про завантаження резидентної програми i iнструкцiю по клавiшам управлiння. Функцiя check_tsr функцiя перевiряє наявнiсть Tsr-програми в пам'ятi шляхом пошуку вiльних функцiй 2f чи функцiї, зайнятої tc_lab16. Вертає 0, якщо програма уже резидентна. Функцiя old9 виконує системну обробку натиснутих клавiш. Функцiя new9 виконує обробку натиснутих клавiш i якщо була натиснута наша " гаряча комбiнацiя ", робить висновок . Пiсля цього вона викликає функцiю old9.Функцiя old2f виконує обробку системного переривання 2f. Функцiя new2f використовується для пошуку вже резидентної в пам'ятi нашої програми. Функцiя restore_vectors замiсть нових векторiв new9 i new2F встановлює старi вектори old9 i old2F Функцiя tsr_kill звільнює резидентну програму з пам`ятi. Спочатку вона визначає адресу ланцюжка MCB i якщо там є елементи - то,якщо PID програми-Хозяїна спiвпадає з нашим то цей блок пам`ятi звiльнюється.
Текст програми:
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define byte unsigned char
#define word unsigned int
/* Адрес в виде сегмент:смещение */
typedef struct
{
word segm,
offs;
}addr;
/* описания функций */
void my_context(void); /* cохранение контекста TSR */
void far *readvect(int in); /* чтение вектора */
void writevect(int in, void far *vect); /* запись вектора */
void text_print(void); /* сообщение о установке
резидентной программы */
byte check_tsr(void); /* проверка наличия TSR-программы
в памяти */
void interrupt new_2F(...);
/* Обработчики 9-го прерывания */
void interrupt (*old9)(...); /* старый */
void interrupt new9(...); /* новый */
/* Обработчики прерывания 2F */
void interrupt (*old2F)(...); /* старый */
void interrupt new2F(word bp,word di,word si,word ds,word es,
word dx,word cx,word bx,word ax,word ip,
word cs,word fl); /* новый */
unsigned char F1_code=59; /* scan-code "F3" */
unsigned char key1_code=2; /* scan-code "3" */
char f=0; /* Флаг нажатой комбинации */
word tsr_pid; /* PID TSR-программы */
addr tsr_dta; /* Адрес DTA программы */
addr tsr_stack; /* Адрес стека TSR-программы */
word TSR_size=20000/16;/* Размер (программы в параграфах) */
addr a_2F; /* адрес старого обработчика INT 2F */
struct far_jmp {
byte jmp; /* код команды */
void interrupt (* int_h)(...); /* адрес */
} far *jmpar;
word jmp_segm; /* сегм.адрес блока команд перехода */
char tsr_mark[] = "TSR-программа tc_lab16 загружена"; /* опо-
знавательная строка символов */
char far *mark;
byte com_func; /* номер коммуникационной функции
прерывания 2F */
word far *ast; /* адрес в стеке */
union REGS rr;
struct SREGS sr;
int main()
{
mark=(char far *) tsr_mark;
if(!check_tsr())
{ /* Программа уже резидентна */
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.