                             ГЛАВА 15.

                            МОДУЛЬ CRT.

     Модуль Crt реализует ряд мощных  программ,  которые  дают  Вам
полный   контроль   над  возможностями  Вашей  машины,  такими  как
управление режимами экрана,  расширенные  коды  клавиатуры,  цвета,
окна и звук.
     Crt может  быть  использован  только  в  программах,   которые
выполняются на IBM PC, AT, PS/2 и совместимых с ними.
     Одна из  основных  особенностей  Crt  -   достижение   высокой
скорости и гибкости операций вывода на экран. Программы, которые не
используют модуль Crt посылают выходные данные на экран  через DOS,
что   гораздо   медленнее.  С  использованием  модуля  Crt,  данные
посылаются прямо в BIOS,  или,  для более быстрых операций, прямо в
видеопамять.


                       Файлы ввода и вывода.

     Инициализационный код модуля  Crt  назначает  текстовые  файлы
Input и Output на монитор, вместо стандартных файлов вводы и вывода
DOS.  Это соответствует выполнению следующих  операторов  в  начале
программы:

       AssignCrt(Input); Reset(Input);
       AssignCrt(Output); Reset(Output);

     Это означает, что переназначение В/В для файлов Input и Output
невозможно до  тех  пор,  пока  не  будет явного назначения ввода и
вывода обратно перед выполнением

       Assign(Input,''); Reset(Input);
       Assign(Output,''); Reset(Output);


                               Окна.

     Crt поддерживает простую,  но  мощную  форму  окон.  Процедура
Window позволяет Вам определить окно в любом месте экрана. Когда Вы
пишете в такое окно, окно представлено, как если бы Вы использовали
весь экран,    оставляя   часть   экрана   не   тронутой.   Другими
словами, экран за пределами окна  недоступен.  Внутри  окна  строки
могут быть  вставлены и удалены,  курсор переносится при достижении
правого края и  текст  сдвигается  вверх  при  достижении  курсором
нижней линии.
     Все экранные   координаты,   за   исключением   тех,   которые
используются  для определения окна,  задаются относительно текущего
окна и экранные координаты (1,1) соответствуют верхнему левому углу
экрана.
     Окном по умолчанию является весь экран.
     Также поддерживаются  режимы  для  EGA  (43  строки) и VGA (50
строк) (См. описание TextMode в главе 15).


                       Специальные символы.

     Когда идет  запись  в  Output или в файл,  который назначен на
экран, следующие управляющие символы имеют специальное значение:

———————————————————————————————————————————————————————————————————
   Символ      Имя                         Описание
———————————————————————————————————————————————————————————————————
   #7      Сигнал         Звуковой сигнал через внутренний
                          громкоговоритель.

   #8      Символ назад   Передвигает курсор на один символ назад.
                          Если курсор уже на левой границе текущего
                          окна, ничего не случается.

   #10     Новая строка   Передвигает курсор на одну строку вниз.
                          Если курсор уже внизу текущего окна,
                          текст сдвигается на одну строку вверх.

   #13     Возврат        Возвращает курсор на левый край
           каретки        текущего окна.
———————————————————————————————————————————————————————————————————

     Все другие  символы  будут  появляться  на  экране  когда  они
написаны.


                           Ввод строки.

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

———————————————————————————————————————————————————————————————————
  Ключ редактирования                  Описание
———————————————————————————————————————————————————————————————————
     BackSpace         Удаляет последний введенный символ.

     ESC               Удаляет всю входную строку.

     Enter             Завершает входную строку и запоминает маркер
                       конца строки в буфере.
                       (carriage return / line feed)
                       (возврат каретки / новая строка)

     Ctrl-S            Тоже, что и BackSpace.

     Ctrl-A            Тоже, что и ESC.

     Ctrl-D            Выбирает один символ из последней входной
                       строки.

     Ctrl-F            Выбирает последнюю входную строку.

     Ctrl-Z            Завершает входную строку и генерирует
                       маркер конца файла.
———————————————————————————————————————————————————————————————————

     Ctrl-Z будет  только  генерировать  маркер  конца файла,  если
переменная CheckEof установлена в  True,  по  умолчанию  она  равна
False.

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


                  Константы, типы и переменные.

     Каждая из констант,  типов и переменных, определенных в модуле
Crt, кратко обсуждена в этом разделе.


                            Константы.

                       Константы режима Crt.

     Следующие константы  используются  как   параметры   процедуры
TextMode:

———————————————————————————————————————————————————————————————————
 Константа     Значение                   Описание
———————————————————————————————————————————————————————————————————
 BW40            0       40*25 B/W (черно-белый) на цветном
                         адаптере
 BW80            2       80*25 B/W на цветном адаптере
 MONO            7       80*25 B/W на нецветном адаптере
 CO40            1       40*25 цветной
 CO80            3       80*25 цветной
 FONT8x8       256       для EGA/VGA 43 и 50 строк
 C40          CO40       для совместимости с 3.0
 C80          CO80       для совместимости с 3.0
———————————————————————————————————————————————————————————————————

     BW40, CO40,  BW80  и  CO80  представляют  4  цветных текстовых
режима, поддерживаемые  цветным  графическим  адаптером  CGA.  MONO
представляет     единственный    черно-белый    текстовый    режим,
поддерживаемый монохромным адаптером.  FONT8x8 представляет 43 и 50
строковые  режимы  для EGA/VGA.  Константы С40 и С80 используются в
режиме совместимости с Turbo  Pascal  3.0.  LastMode  возвращает  в
последний активный текстовый режим после использования графики.


                     Константы цветов текста.

     Следующие константы  используются  в  процедурах  TextColor  и
TextBackground:

   ——————————————————————————————————
     Константа         Значение
   ——————————————————————————————————
      Black              0
      Blue               1
      Green              2
      Cyan               3
      Red                4
      Magenta            5
      Brown              6
      LightGray          7
      DarkGray           8
      LightBlue          9
      LightGreen        10
      LightCyan         11
      LightRed          12
      LightMagenta      13
      Yellow            14
      White             15
      Blink            128
   ——————————————————————————————————

     Цвета представлены  числами  с  0  до  15 ,  для более легкого
использования цветов можно использовать эти константы вместо чисел.
В  цветовых текстовых режимах цвет символов выбирается из 16 цветов
и фоновый цвет из 8 цветов.  Цвет символов может быть также  выбран
блинкующий.


                            Переменные.

     В Crt определены переменные:

   ——————————————————————————————————
     Переменная        Тип
   ——————————————————————————————————
     CheckBreak    Boolean
     CheckEof      Boolean
     CheckSnow     Boolean
     DirectVideo   Boolean
     LastMode      Word
     TextAttr      Byte
     WindMin       Word
     WindMax       Word
   ——————————————————————————————————


                            CheckBreak.

     Разрешает или запрещает проверки для Ctrl-Break.

     var CheckBreak : Вoolean;

     Когда CheckBreak в True,  нажатие Ctrl-Break  будет  завершать
программу во время ее очередного вывода на экран.  Когда CheckBreak
в False,  нажатие  Ctrl-Break  не  дает   эффекта.   По   умолчанию
CheakBreak  в  True.  (Во  время  выполнения  Crt запоминает старый
вектор прерывания по ControlBreak,  $1B,  в  глобальную  переменную
типа pointer-SaveInt1B).


                             CheckEof.

     Разрешает или запрещает символ конца файла:

     var CheckEof : Вoolean;

     Когда CheckEof   в   True,   символ    конца    файла    будет
генерироваться, если   Вы   нажмете   Ctrl-Z  во  время  чтения  из
файла, назначенного на экран.  Когда CheckEof равна False,  нажатие
Ctrl-Z не дает эффекта. По умолчанию CheckEof в False.


                            CheckSnow.

     Разрешает или  запрещает  "контроль  снега"  при   запоминании
символов прямо в видеопамяти.

     var CheckSnow : Вoolean;

     На большинстве  типов  CGA  на  экране будут появляться помехи
("снег")  при  запоминании  символов  в  видеопамяти  не  во  время
обратного хода   луча   трубки  терминала.  Этого  не  случится  на
монохромных адаптерах или адаптерах типа EGA.
     Когда выбран цветной режим и CheckSnow в True, прямая запись в
видеопамять будет производится только во время обратного хода луча.
Если  Вы  работаете  с новым исполнением CGA,  Вы можете установить
CheckSnow в False в начале Вашей программы и после  каждого  вызова
TextMode. Это будет запрещать проверку на "снег", в результате чего
скорость вывода значительно возрастает.
     CheckSnow не оказывает действие, если DirectVideo в False.


                           DirectVideo.

     Разрешает и запрещает прямой  доступ  к  памяти  для  Write  и
Writeln при выводе на экран.

     var DirectVideo : Boolean;

     Когда DirectVideo  в  True,  Write  и  Writeln  при  выводе  в
файлы, назначенные на экран, будут запоминать символы в видеопамяти
вместо вызова BIOS.  Когда DirectVideo в False ,  все символы будут
записываться через вызовы BIOS, что значительно медленнее.
     DirectVideo по  умолчанию  всегда  в True.  Если по каким-либо
причинам, Вы хотите выводить символы через вызовы  BIOS, установите
DirectVideo в False в начале Вашей программы и после каждого вызова
TextMode.


                             LastMode.

     Каждый раз   когда  вызывается  TextMode,  текущий  видеорежим
запоминается в LastMode.  Кроме того, LastMode инициализируется при
запуске программы в текущий видеорежим.

        var LastMode : Word;


                             TextAttr.

     Содержит текущие атрибуты текста.

     var TextAttr : Byte;

     Атрибуты текста обычно устанавливаются через  вызовы TextColor
и TextBackground.   Однако,   Вы   можете   установить   их  прямым
запоминанием значения в TextAttr.  Информация о цвете кодируется  в
TextAttr следующим образом:

     бит       7   6   5   4   3   2   1   0
             +———+———+———+———+———+———+———+———+
             | B | b | b | b | f | f | f | f |
             +———+———+———+———+———+———+———+———+

     где ffff - 4 битовый цвет символа,  bbb - 3 битовый цвет фона,
В -  бит  установки  блинкования  (мигания).  Если  Вы  используете
константы цветов для создания значений TextAttr,  помните, что цвет
фона может быть выбран только из первых 8 цветов  и что  он  должен
быть  умножен на 16 для установки его в правильную битовую позицию.
Следующий пример выбирает блинкующие желтые символы на  синем фоне:

         TextAttr := Yellow + Blue * 16 + Blink;


                        WindMin и WindMax.

     Содержат экранные координаты текущего окна.

          var WindMin, WindMax : Word;

     Эти переменные   устанавливаются   вызовом  процедуры  Window.
WindMin определяет верхний левый угол и WindMax  определяет  нижний
правый угол.  Координата Х запомнена в младшем байте и координата Y
запомнена в старшем байте.  Например, Lo(WindMin) выдает координату
Х  левой  границы  и Hi(WindMax) выдает координату Y нижней границы
окна. Верхний левый угол экрана соответствует (X,Y)=(0,0). Заметим,
однако, что для координат,  передаваемых в Window и GotoXY, верхний
левый угол соответствует (1,1).


                       Процедуры и фуннкции.

———————————————————————————————————————————————————————————————————
     Функция                       Описание
———————————————————————————————————————————————————————————————————
     KeyPressed     Возвращает True, если на клавиатуре была нажата
                    клавиша, и False в противном случае.

     ReadKey        Читает символ с клавиатуры.

     WhereX         Возвращает Х координату текущей позиции курсора
                    относительно текущего окна. Х - горизонтальная
                    позиция.

     WhereY         Возвращает Y координату текущей позиции курсора
                    относительно текущего окна. Y - вертикальная
                    позиция.
———————————————————————————————————————————————————————————————————

———————————————————————————————————————————————————————————————————
     Процедура                     Описание
———————————————————————————————————————————————————————————————————
     AssignCrt       Назначает текстовый файл на экран.

     ClrEol          Удаляет все символы от текущей позиции курсора
                     до конца строки без передвижения курсора.

     ClrScr          Очищает экран и помещает курсор в верхний
                     левый угол.

     Delay           Задержка на указанное число миллисекунд.

     DelLine         Удаляет строку на которой находится курсор и
                     перемещает все строки ниже этой строки на
                     строку вверх. Нижняя строка очищается.

     GotoXY          Позиционирует курсор. Х - горизонтальная
                     позиция и Y - вертикальная позиция.

     HighVideo       Устанавливает высокую интенсивность символов.

     InsLine         Вставляет пустую строку в позиции курсора.

     LowVideo        Устанавливает низкую интенсивность символов.

     NormVideo       Устанавливает нормальную интенсивность
                     символов.

     NoSound         Выключает внутренний громкоговоритель.

     Sound           Включает внутренний громкоговоритель.

     TextBackground  Устанавливает цвет фона.

     TextColor       Устанавливает цвет символов.

     TextMode        Устанавливает текстовый режим.

     Window          Определяет текстовое окно на экране.
———————————————————————————————————————————————————————————————————
