TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

ПРИЛОЖЕНИЕ  5

ОСОБЕННОСТИ РЕАЛИЗАЦИИ ТЕКСТОВОГО ВЫВОДА

(модуль CRT)

С модулем CRT, содержащем константы, переменные и подпрограммы управления текстовым выводом, мы уже знакомились в методических указаниях, часть 1 [4, Прил. 9].  Теперь рассмотрим особенности программно-аппаратной реализации текстового вывода.

Текстовый режим работы дисплейных адаптеров в IBM-совместимых компьютерах использует часть оперативной памяти для  видеопамяти. Адрес ее начала зависит от типа адаптера. Для  CGA, EGA и VGA это $B800:0000. Видеопамять содержит "карту" текстового экрана: коды отображаемых символов и их атрибуты.  Прямое обращение к  видеопамяти  обеспечивает  максимально  возможную скорость изменения изображения на  экране,  потому  что  любой символ, попадающий в видеопамять, отображается на  экране  немедленно.

Экран в текстовом режиме хранится как  последовательность пар байт, где первый байт в каждой паре - любой из 256  символов ASCII , а второй байт - атрибут его вывода. Для  адаптеров цветной графики в текстовом режиме атрибут  определен  следующим образом:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ормула для вычисления атрибута:

       16 * цвет фона + цвет символов (+ 128  для мерцания)

Например, установить атрибут "желтый на красном" с мерцанием:

              TextAttr := Blink + Yellow + 16*Red;

или в шестнадцатеричной системе счисления:

                       TextAttr := $CE.


п.5.1. Пример использования переменной TextAttr

uses Crt;

var TA,TA1: byte;

              f     : text;

begin

     ClrScr;

               {белые символы на черном фоне - стандарт для среды Turbo PASCAL}

      TA:=$0F;

                { вывод через устройство CRT (см. [5, П.4.3.5])}

     AssignCrt (f);

     Rewrite (f);

       Repeat

             Window(3,3,10,4);      { одно окно }

                         { желтые символы на синем фоне с миганием }

             TextAttr:=$9E;  {Yellow + 16*Blue +Blink}

             TA1:=TextAttr;

          Writeln (f, 'HELLO!');

             Window(1,1,80,25);      { другое окно }

                          {белые символы на красном фоне}

             TextAttr := White + 16*Red;

             GoToXY(40,10);

          Writeln (f, 'continue');

             Window(23,3,40,4);      { третье окно }

                            { установка реверсного атрибута }

             TextAttr:= not (TA1);  {Blue + 16*Yellow}

          Writeln (f, 'До встречи!!!');

       Until KeyPressed;

{Очистка активного окна и восстановление стандартных атрибутов}

     Window(1,1,80,25);

      TextAttr:=TA;

      ClrScr;

     Close (f)

end.

П.5.2. ДЕМОНСТРАЦИОННЫЙ ПРИМЕР

{ Демонстрационный пример использования:

   -  процедур и функций модуля Crt:

       ClrScr,  DelLine, GoToXY,  InsLine, KeyPressed, ReadKey,

       TextBackground, TextColor, TextMode, WhereX, WhereY,

                                            Window, Write, WriteLn;

   - переменных LastMode, WindMax;

   - подстройки к адаптерам EGA или VGA;

   - реакций на клавиши:

       <Ins>, <Del>, <Up>, <Down>, <Right>, <Left>,<Alt-R>, <Alt-W>, <Alt-X>,

                                                      <Ctrl-C>, <Enter>, <ESC> }

program CrtDemo;

uses Crt;

var

  OrigMode, LastCol, LastRow: Word;

  Ch: Char;

  Done: Boolean;

{Инициализация текстового режима для текущего адаптера CGA/EGA/VGA}

procedure Initialize;

begin

     CheckBreak:=False;              { нет реакции на Contrl-C }

     OrigMode:=LastMode;             { запоминание текущего видеорежима }

     TextMode(Lo(LastMode)+Font8x8); { использование видеоадаптера EGA/VGA }

     LastCol:=Lo(WindMax)+1;   {Запоминание максимальной позиции курсора <X, Y> }

     LastRow:=Hi(WindMax)+1;

     GoToXY(1,LastRow);

     TextBackground(Black);

     TextColor(White);

     Write (' Ins-InsLine  ',   'Del-DelLine  ',

                  #27#24#25#26'-Cursor  ',           {клавиши   ?  ?  ?  ?}

                'Alt-W-Window  ',    'Alt-R-Random  ',        'Esc-Exit');

     Dec(LastRow,80 div LastCol);

     Randomize;

end; { Initialize }

                                {Создание текстового окна со случайными размерами}

procedure MakeWindow;

var  X, Y, Width, Height: Word;

begin

    {генерация  окна со случайными размерами}

     Width:=Random(LastCol-2)+2;

     Height:=Random(LastRow-2)+2;

     X:=Random(LastCol -Width)+1;

     Y:=Random(LastRow -Height)+1;

     Window(X, Y, X + Width, Y +Height);

      if OrigMode = Mono then                  {для черно-белого монитора}

         begin

               TextBackground(White);

               TextColor(Black);

               ClrScr;

               Window(X+1,Y+1,X+Width-1,Y+Height-1);

               TextBackground(Black);

               TextColor(White);

               ClrScr;

         end

                           else                            {для цветного монитора}

         begin

             {генерация случайных цветов фона и символа}

               TextBackground(Random(8));

               TextColor(Random(7)+9);

         end;

      ClrScr;

end; { MakeWindow }

{ Генерация случайных символов }

procedure RandomText;

begin

     repeat     Write(Chr(Random(256-32)+32));  until KeyPressed;

end; { RandomText }

                      {Главная программа}

begin

     Initialize;

     MakeWindow; Done:=False;

     repeat

           Ch:=ReadKey;

           case Ch of

                #0:                       { обработка функциональных клавиш }

                    begin

                         Ch:=ReadKey;  {чтение вторичного (расширенного) кода}

                         case Ch of

                             #17: MakeWindow;          { сочетание клавиш Alt-W }

                             #19: RandomText;                { сочетание клавиш Alt-R }

                             #45: Done:=True;             { сочетание клавиш Alt-X - выход}

                             #72: GotoXY(WhereX,WhereY-1); { Up - стрелка ? }

                             #75: GotoXY(WhereX-1,WhereY); { Left - стрелка ?}

                             #77: GotoXY(WhereX+1,WhereY); { Right - стрелка ?}

                             #80: GotoXY(WhereX,WhereY+1); { Down - стрелка ?}

                             #82: InsLine;                 { клавиша Ins }

                             #83: DelLine;                { клавиша Del }

                         end; {case для функциональных клавиш}

                    end; 

                               {Клавиши обычных ASCII - символов }

                #3:   Done:=True;              { Ctrl-C - выход }

            #13: WriteLn;                         { Enter }

                #27: Done:=True;                  { ESC - выход }

                else Write(Ch);

           end;

     until Done;

     TextMode(OrigMode);     { восстановление текущего видеорежима }

end.

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz