Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

5.1. Резидентная программа TSRDEMO

В этом разделе мы приведем исходные тексты программы TSRDEMO, которую вы можете использовать в качестве заготовки для вашей собственной разработки.

Программа TSRDEMO может работать в MS-DOS версии 4.0 и более старших версий. Мы проверили ее в среде MS-DOS версии 6.22.

Наша резидентная программа выполняет все необходимые действия, включая защиту от повторного запуска и удаление себя из оперативной памяти. Функция, которая получает управление при активизации резидентной программы, может использовать функции прерываний MS-DOS и стандартные функции библиотеки транслятора. Все это возможно благодаря правильному выбору момента для активизации программы, предварительному сохранению некоторых системных областей данных и резервированию памяти для областей стека и кучи.

Если программу TSRDEMO запустить без параметров в первый раз, она выведет сообщение и останется резидентной в памяти. При повторной попытке запуска программа выведет сообщение о том, что она уже активна. Для того чтобы деинсталлировать программу (выгрузить ее из памяти), достаточно указать при запуске параметр u.

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

Вы можете активизировать программу при помощи комбинации клавиш <Ctrl+R>. При этом раздается звуковой сигнал и содержимое текстовой части видеопамяти записывается в файл (байты атрибутов игнорируются). Этот файл создается в текущем каталоге и называется !grab<xxx>.scr, где xxx - последовательный номер копии экрана. Если нажать комбинацию клавиш <Ctrl+R> в первый раз, номер будет равен 0, во второй раз - 1 и т. д.

Когда программа TSRDEMO загружена в память, в правом верхнем углу экрана мигают символы "*" и "+". Соответствующие функции демонстрируют способ непосредственной записи кодов символов и атрибутов в видеопамять.

Полные листинги программы TSRDEMO занимают много места, поэтому мы привели их ниже в разделе, который так и называется - "Листинги программы TSRDEMO". Мы будем изучать их последовательно, рассматривая все этапы работы резидентной программы.

При запуске программы TSRDEMO управление получает функция main, исходный текст которой приведен ниже:

void main(int argc, char *argv[])
{
  int tsrsize, i;
  printf("\n\nРезидентная программа TSRDEMO,"
         " v1.1, (C) Фролов А.В., 1995\n");
  if(_osmajor < 4)
  {
    printf("\nИзвините, вы пользуетесь слишком"
           "старой версией MS-DOS");
    return;
  }

  if(argc > 1)
  {
    if(argv[1][0] == 'u') unload();
    else
      printf("\nЗапуск TSRDEMO:\n"
         "tsrdemo   : загрузка в память\n"
         "tsrdemo u : выгрузка из памяти\n"
         "<Ctrl+R>  : запись содержимого экрана"
         " в файл !grabXXX.scr");
    return;
  }
  if(tsrloaded())
  {
    printf("Программа TSRDEMO уже загружена\n"
           "Введите 'tsrdemo u' для выгрузки");
    return;
  }
  if(!tsrinit())
  {
    printf("Мало памяти для загрузки TSR");
    return;
  }
  tsrsize =  (_DS - _CS) + (_SP / 16);
  _dos_keep (0, tsrsize + 1);
}

Прежде всего, функция main проверяет параметры, переданные программе через командную строку.

Если указан параметр u, вызывается функция unload, которая удаляет резидентную программу из памяти или отключает ее (при невозможности удаления). Если же указан любой другой параметр, функция main выводит на экран инструкцию по запуску программы. В обоих случаях вслед за этим работа программы завершается.

В том случае, когда при запуске программы TSRDEMO пользователь не указал никаких параметров, функция main предпринимает попытку инициализировать программу и оставить ее резидентной в памяти. Перед этим она вызывает функцию tsrloaded, проверяющую, нет ли в памяти копии программы TSRDEMO, загруженной ранее. Попытки повторной загрузки блокируются с выводом соответствующего сообщения на экран.

Если программа запускается впервые, функция main вызывает функцию tsrinit. Последняя выполняет все необходимые инициализирующие действия, такие, например, как встраивание обработчиков аппаратных и программных прерываний.

Для завершения программы используется функция _dos_keep , которой передается размер программы. Способ вычисления этого размера зависит от модели памяти и заслуживает отдельного рассмотрения.

[Назад] [Содеожание] [Дальше]