С для профессиональных программистов




Прикладная часть TSR-программы


Точкой входа в прикладную часть TSR-программы должна быть функция типа interrupt. В представленном ниже примере запуск прикладной части выполняется путем вызова функции window_main().

/* Точка входа в прикладную часть TSR-программы */

void interrupt tsr_ap()

if(!busy)

busy = !busy;

window_main();

busy = !busy;

Глобальная переменная  busy  первоначально устанавливается в

0. Прикладная часть TSR-программы не является повторно входимой, следовательно, она не должна запускаться дважды за время одного использования. Переменная busy используется как раз для того, чтобы предотвратить это. (Некоторые компиляторы Си могут создавать реентерабельные программы, но безопаснее для вас не обсуждать здесь этого вопроса).

В программы управления окнами необходимо внести некоторые изменения для того, чтобы их можно было использовать в TSR-программах. Во-первых, необходимо статически распределять память, необходимую для хранения текущего содержимого экрана, путем использования глобального массива. Вы могли привыкнуть к тому, что эта память распределялась динамически, но данный способ здесь непригоден, вследствие того, что функции динамического распределения используют системный вызов, который недопустим в TSR-программах. По этой же причине функция go_to_xy() не может быть использована для позиционирования курсора. Наконец, стандартные Си-функции sscanf() и sprintf() также не могут быть использованы (по крайней мере, в Турбо Си), потому что также осуществляют обращения к DOS. Вместо них используются функции атоi() и itoa(). Полный текст программы резидентного калькулятора представлен ниже.

/* TSR-программа, использующая прерывание печати экрана */

#include "dos.h"

#include "stdlib.h"

#define BORDER 1

#define ESC 27

#define MAX_FRAME 1

#define REV_VID 0x70

#define NORM_VID 7

#define BKSP 8

void interrupt tsr_ap();

void save_video(), restore_video();

void write_string(), write_char();

void     display_header(), draw_border();




Содержание  Назад  Вперед