18.2. Правила оформления оверлейных программ
Турбо Паскаль позволяет создавать оверлеи только на уровне модулей. Это значит, что минимальным программным блоком перекрывающихся процедур и функций, который может быть оверлейным, является модуль (UNIT). Оверлей оформляется как модуль за исключением некоторых особенностей. Поэтому, если большая программа построена на модулях, а не на подключаемых директивой компилятора {$I ИмяФайла} файлах, очень просто любой из них преобразовать в оверлей.
Оверлеи, как и обычные модули, имеют раздел объявлений (INTERFACE) и раздел реализации (IMPLEMENTATION), а также могут иметь инициализирующую часть. Однако здесь необходимо соблюдать следующие условия:
1. В начале всех оверлейных модулей должны быть заданы режимы компиляции {$О+}, разрешающие модулю быть оверлейным.
2. Все процедуры и функции, прямо или косвенно вызывающие оверлейные подпрограммы, должны быть откомпилированы в режиме {$F+} (модель вызова FAR).
Эти условия реализуются обычно следующим образом. В начале оверлейного модуля устанавливаются директивы {$F+,O+}, а основная программа содержит в первых строках ключ режима компиляции {$F+}.
Кроме этого, в основной программе необходимо подключить модуль Overlay и указать, какие модули из перечисленных в директиве USES будут оверлейными. На рис. 18.1 показано такое объявление оверлеев на примере программы, использующей оверлейный набор отдельно реализованных математических процедур.
| PROGRAM MultiCalc:
| {$F+ все вызовы процедур и функций имеют модель FAR }
| USES
| CRT, DOS, Overlay, MultCalc, DivCalc, AddCalc, SubCalc;
| {$O MultCalc} { модуль MultCalc - оверлей }
| {$O DivCalc} { модуль DivCalc - оверлей }
| {$O AddCalc} { модуль AddCalc - оверлей }
| {$O SubCalc} { модуль SubCalc - оверлей }
| ...
| {============ текст основной программы =============}
Рис. 18.1
- 395 -
Директива {$O ИмяМодуля} обязательна для указания оверлейных модулей. Обратите внимание на расположение этой директивы в тексте программы. Добавим также, что в списке директивы USES модуль Overlay должен стоять до первого модуля, который будет оверлейным. В остальном текст оверлейной программы практически не отличается от обычной (не считая операторов управления администратором оверлеев).
Программы с оверлеями уже не могут компилироваться в память и всегда должны создаваться на диске. В результате компиляции программы (пусть она имеет имя MULTICAL.PAS) будет получен выполнимый файл MULTICAL.EXE и сопутствующий ему файл MULTICAL.OVR, хранящий коды процедур из всех модулей, объявленных оверлейными.
Определенные ограничения накладываются на раздел инициализации оверлейного модуля (если, конечно, таковой имеется) . В нем запрещено включать администратор оверлеев. Кроме того, в разделе инициализации нельзя производить какие-либо действия до включения администратора. Может показаться, что возникает замкнутый круг: раздел инициализации выполняется перед действиями основной программы, но после включения администратора, а последний можно включить лишь в основной программе! Решение просто. Надо ввести в построение программы дополнительный неоверлейный модуль, в разделе инициализации которого и будет включаться администратор оверлеев, и подключить его в директиве USES перед оверлейными модулями.
Все системные библиотечные модули являются неоверлейными. Также не могут быть оверлейными модули, которые содержат обработку прерываний. Таким модулем, например, является CRT, так как он содержит обработку прерываний по нажатию клавиш Ctrl+Break.