keep

 Функция            Осуществляет выход в DOS из программы, оставляя,
                    тем не менее еe резидентной.

 Синтаксис          #include
                    void keep(unsigned char status, unsigned size);

 Файл, содержащий   dos.h
 прототип

 Описание           Функция keep осуществляет выход в DOS со статусом
                    выхода в переменной status. Текущая программа,
                    тем не менее, остается резидентной. Длина прог-
                    раммы устанавливается в size параграфов, и оста-
                    ток памяти освобождается. Функция keep может быть
                    использована для установки резидентных программ
                    (TSR). Функция keep использует функцию DOS 0x31.

 Возвращаемое       Отсутствует.
 значение

 Переносимость      Функция уникальна для DOS.

 Смотрите также     abort exit

 Пример:

 /* ПРИМЕЧАНИЕ:
    Это программа обработки прерывания. Если вы попытаетесь
    откомпилировать ее с включенной проверкой переполнения
    стека, то вы не !!! получите правильно работающей прог-
    раммы. Формула использованая в этой функции, вычисляю-
    щая число параграфом не обязательно будет работать во
    всех случаях. Используйте с осторожностью! Резидентные
    программы являются довольно сложными продуктами, и для
    них не обеспечивается дополнительная поддержка. Допол-
    нительную информацию вы найдете в технической докумен-
    тации по DOS */

 #include
 /* прерывание по таймеру */
 #define INTR 0x1c
 /* атрибут экрана (голубой или серый) */
 #define ATTR 0x7900
 /* уменьшить размер стека и локальной памяти, чтобы
    сделать программу меньше */
 extern unsigned _heaplen = 1024;
 extern unsigned _stklen = 512;

 void interrupt (*oldhandler)();

 void interrupt handler(void)
 {
    unsigned int (far *screen)[80];
    static int count;
    /* для цветного адаптера адрес видеопамяти
       B800:0000, для монохромного B000:0000 */
    screen = MK_FP(0x8000,0);
    /* увеличить счетчик, и взять его по модклю 10 */
    count++;
    count %= 10;
    /* вывести число на экран */
    screen[0][79] = count+'0'+ATTR;
    /* вызвать старую функцию обработки прерывания */
    oldhandler();
 }
 int main(void)
 {
    /* получить адрес текущей программы обработки прерываний
       по таймеру */
    oldhandler = getvect(INTR);
    /* установить свою программу обработки прерывания */
    setvect(INTR,handler);
    /* _psp содержит начальный адрес области памяти, в которой
       расположена ваша программа. Вершина стека определяет
       конец вашей программы. _SS и SP вместе дают конец стека.
       Возможно вам будет нужно добавить локальную память для
       собственных нужд, что делается следующим образом:
       (_SS + ((_SP + локальная память)/16) - _psp) */

    keep(0,_SS+(_SP/16)-_psp);
    return 0;
 }