CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник по функциям C/C++
keep
keep
Функция Осуществляет выход в DOS из программы, оставляя,
тем не менее еe резидентной.
Синтаксис #include<dos.h>
void keep(unsigned char status, unsigned size);
Файл, содержащий dos.h
прототип
Описание Функция keep осуществляет выход в DOS со статусом
выхода в переменной status. Текущая программа, тем
не менее, остается резидентной. Длина программы
устанавливается в size параграфов, и остаток
памяти освобождается.
Функция keep может быть использована для установки
резидентных программ (TSR). Функция keep
использует функцию DOS 0x31.
Возвращаемое Нет.
значение
Переносимость Функция уникальна для DOS. Функция не совместима с
Windows.
Смотрите также abort, exit.
Пример:
/* ПРИМЕЧАНИЕ:
Это программа обработки прерывания. Если вы попытаетесь
откомпилировать ее с включенной проверкой переполнения стека, то
вы не !!! получите правильно работающей программы. Формула
использованая в этой функции, вычисляющая число параграфом не
обязательно будет работать во всех случаях. Используйте с
осторожностью! Резидентные программы являются довольно сложными
продуктами, и для них не обеспечивается дополнительная поддержка.
Дополнительную информацию вы найдете в технической документации по
DOS */
#include<dos.h>
/* прерывание по таймеру */
#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;
