Списки в оперативній пам'яті, операції над списками. Керування програмами. Керування таймером. Системні керуючі блоки. Управління пам’яттю: таблиця векторів переривань, страница 23

Функц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())

 {       /* Программа уже резидентна */