Элементарная графика на БЕЙСИКе - раскладка экрана. Раскладка алфавитно-цифрового экрана. Раскладка экрана в графике высокого разрешения. Раскладка экрана цветовых атрибутов. Основные проблемы при работе с графикой.

Элементарная графика
                          1.2   РАСКЛАДКА  ЭКРАНА

                 1.2.1. Раскладка алфавитно-цифрового экрана.
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              Выше мы сказали, что на экране может быть до 22-х символь-
         ных рядов. Это  не совсем так.  На самом деле  на полном экране
         может быть конечно до 24-х символьных рядов, но если Вы работа-
         ете на БЕЙСИКе,  то подчиняетесь той  программе-интерпретатору,
         которая "зашита" в  ПЗУ компьютера, а  она использует нижние  2
         ряда для собственных сообщений к Вам. Это могут быть  сообщения
         об ошибках или более приятное сообщение "O.K." о том, что все в
         порядке. Эти нижние два ряда называют системным окном, а  верх-
         ние 22 строки - Главным экраном.
                  -----------------------------------------¬
                  ¦                                        ¦
                  ¦            Главный  экран              ¦
                  ¦                                        ¦
                  ¦          (22 символьных ряда)          ¦
                  ¦                                        ¦
                  ¦                                        ¦
                  ¦                                        ¦
                  +----------------------------------------+
                  ¦  Системное окно (2 символьных ряда)    ¦
                  L-----------------------------------------
                                   Рис. 1

              Вот поэтому-то и получается, что при работе на БЕЙСИКе Вам
         доступны только 22 символьных ряда или  176 точек по  вертикали
         при работе с графикой.

              Если бы Вы  работали в машинном  коде, то могли  бы отклю-
         читься от ПЗУ компьютера и  тогда могли бы использовать все  24
         символьных ряда или 192 точки по вертикали при работе с  графи-
         кой высокого разрешения, но при этом не смогли бы получать  со-
         общений от компьютера  о ходе работы  программы и любая  ошибка
         приводила бы либо к "зависанию" программы, либо к ее сбросу.

              Возможен еще третий вариант, когда Вы работает в  БЕЙСИКе,
         но для ускорения тех  или иных операций над  экраном применяете
         свои процедуры, написанные в машинном коде, а потом опять  воз-
         вращаетесь в БЕЙСИК (такой подход  мы рассмотрим в Главе 3).  В
         этом случае Вам также лучше оставить нижние 2 ряда в покое и не
         трогать их.

              Есть еще  и четвертый  подход, когда  написанная Вами про-
         грамма может быть полностью независимой от БЕЙСИКа и  исполнена
         в машинном коде, но для упрощения изображения графических  при-
         митивов (точек, линий,  дуг, окружностей) Вы  используете стан-
         дартные процедуры из ПЗУ,  вызывая их по известному  Вам адресу
         (приемы будут даны в Главе 2). В этом случае Вам лучше также не
         вторгаться  в  системное  окно,  поскольку  эти процедуры могут
         проверять координаты позиции  печати и не  работать с тем,  что
         для них не предусмотрено.

              Далее мы  будем рассматривать  экран состоящим  как бы  из
         24-х рядов, помня, что на БЕЙСИКе нам доступны только 22.

                   0 ---------------------X------------¬
                     ¦                    X            ¦
                     ¦XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX¦ - РЯД
                     ¦                    X            ¦
                     ¦                    X            ¦
                     ¦                    X            ¦
                     ¦                    X            ¦
                  23 ¦                    X            ¦
                     L--------------------X-------------
                     0                    ¦           31
                                          L--  СТОЛБЕЦ
                                  Рис. 2

              Итак, экран состоит из 24-х символьных рядов по 32 символа
         в каждом. Ряды нумеруются сверху  вниз от 0 до 23-го.  С другой
         стороны, мы можем считать, что экран состоит из 32-х  столбцов,
         которые нумеруются слева направо от 0 до 31-го. Таким  образом,
         позиция с  координатами (0,0)  для экрана  с низким разрешением
         находится в левом верхнем углу.

              Поскольку в одном ряду можно расположить до 32-х символов,
         то говорят, что в ряду содержится 32 знакоместа.

                  ----T---T-----------T---T---------------------¬
                  ¦ X ¦ X ¦...........¦ X ¦ ................... ¦
                  L---+---+-----------+---+----------------------
                  0     1               ¦                      31
                                        L--  ЗНАКОМЕСТО
                                  Рис. 3

              Рассмотрим теперь, что же представляет из себя каждое зна-
         коместо. Оно состоит из 8 линий по 8 точек в каждой. Эти  точки
         называют пикселами (PICture CELL).
                  ----T---T---T---T---T---T---T---¬
                  ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦  ------  ЛИНИЯ
                  +---+---+---+---+---+---+---+---+
                  ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦
                  +---+---+---+---+---+---+---+---+
                  ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦
                  +---+---+---+---+---+---+---+---+
                  ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦
                  +---+---+---+---+---+---+---+---+
                  ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦
                  +---+---+---+---+---+---+---+---+
                  ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦
                  +---+---+---+---+---+---+---+---+
                  ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦   ¦
                  +---+---+---+---+---+---+---+---+
                  ¦   ¦   ¦ X ¦   ¦   ¦   ¦   ¦   ¦
                  L---+---+-T-+---+---+---+---+----
                            ¦
                            L-----  ПИКСЕЛ
                               Рис.4

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

         ративной памяти.  С другой  стороны, чтобы  заполнить на экране
         одно знакоместо, должно быть прочитано содержимое восьми байтов
         памяти. Заметьте, что здесь мы уже не говорим ОПЕРАТИВНОЙ ПАМЯ-
         ТИ, поскольку читать  можно не только  из нее, но  и из ПЗУ,  а
         именно оттуда и берутся 8 байтов, когда на экране  изображается
         стандартный символ, например буква "A". Эти 8 байтов, из  кото-
         рых строится изображение  символа, часто еще  называют ШАБЛОНОМ
         символа.

              Если линия - это байт в памяти, то что же такое пиксел? Вы
         наверное знаете, что  байт состоит из  восьми битов, каждый  из
         которых может быть включен или выключен (равен единице или  ну-
         лю). Поэтому каждому пикселу  в линии соответствует один  бит в
         байте. Получается,  что карта  включения битов  определяет рас-
         кладку включенных пикселов в линии.

              Если, например, байт равен 175, то его побитовая раскладка
         такова:
                        128 64  32   16  8   4   2   1
                       ----T---T---T---T---T---T---T---¬
                       ¦ 1 ¦ 0 ¦ 1 ¦ 0 ¦ 1 ¦ 1 ¦ 1 ¦ 1 ¦
                       L---+---+---+---+---+---+---+----
                 175 =  128  +  32  +    8 + 4 + 2 + 1

                                   Рис. 5

              Совершенно естественно,  что линия  в знакоместе,  которой
         соответствует байт 175, будет иметь вид:

                       ----T---T---T---T---T---T---T---¬
                       ¦ X ¦   ¦ X ¦   ¦ X ¦ X ¦ X ¦ X ¦
                       L---+---+---+---+---+---+---+----
                                     ¦       ¦
               Выключенный пиксел  ---       L-- Включенный пиксел

                                    Рис. 6

              Сравните Рис.5 и Рис. 6 и убедитесь в их соответствии.

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

              Обратите внимание на интересное обстоятельство,  связанное
         с особенностью шаблонов стандартных  символов. Дело в том,  что
         для того, чтобы текст на экране хорошо читался, между символами
         должны быть какие-то зазоры. Поэтому в знакоместе 8 X 8  правая
         колонка пикселов у символов  как правило выключена. А  это зна-
         чит, что во всех линиях правый пиксел выключен и в соответству-
         ющих им байтах самый младший бит равен нулю (см.рис.5). Если же
         этот бит равен нулю, то  байт будет иметь только четное  значе-
         ние. Поэтому, если при просмотре машинного кода фирменных  про-
         грамм Вы найдете последовательность из нескольких сотен  четных
         байтов, то можно почти уверенно предположить, что здесь  распо-
         ложены  шаблоны  шрифтового  набора.   Совсем нетрудно написать
         БЕЙСИК-программу для  поиска, скажем,  пятидесяти встретившихся
         подряд четных байтов и быстро определить, где может  находиться
         шрифт  (в  этом  случае  нулевой  байт  тоже  условно отнесем к
         четным).

              Остался еще неисследованным вопрос о том, какой цвет имеет
         включенный пиксел и какой цвет имеет на экране пиксел,  который
         выключен. Укажем пока только, что включенный пиксел имеет  цвет
         INK, а  выключенный -  цвет PAPER  и вернемся  к этому вопросу,
         когда будем заниматься цветом.

              1.2.2. Раскладка экрана в графике высокого разрешения.
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              Тридцать два знакоместа по ширине экрана дают 256 (32 X 8)
         пикселов - такова ширина экрана в "высокой" графике.

              Двадцать четыре ряда по восемь пикселов в каждом знакомес-
         те дают нам 192 пиксела  по вертикали, но поскольку нижние  две
         строки в БЕЙСИКе недоступны, то считают, что предельный  размер
         по вертикали равен 22 X 8 = 176 пикселов.

              За начало отсчета принимают левый нижний угол Главного эк-
         рана (обратите внимание на слово "Главного", то есть системное
         окно отбрасывается).

             175  -----------------------------------------¬
                  ¦ .                                      ¦
                  ¦ .          Главный  экран              ¦
                  ¦ .                                      ¦
                  ¦ .    (176 точек по вертикали,          ¦
                  ¦ .     256 точек по горизонтали)        ¦
                  ¦ .                                      ¦
               0  ¦ . .................................... ¦
                  +----------------------------------------+
                  ¦  Системное окно (2 символьных ряда)    ¦
                  L-                                      --
                   0                                      255
                               Рис. 7

              Таким образом, точка с координатами (0,0), если они заданы
         в пикселах, определяет левый  нижний угол Главного экрана.  Тот
         факт, что вертикальная  координата в знакоместах  отсчитывается
         сверху вниз, а в пикселах - наоборот снизу вверх иногда  приво-
         дит к путанице начинающих программистов, впрочем с набором пра-
         ктики это быстро проходит.

              В заключение этого параграфа давайте для справки  прикинем
         сколько байтов оперативной памяти необходимо для хранения  пик-
         сельного (монохромного -  без цвета) изображения  всего экрана.
         Если на каждое знакоместо  нам необходимо восемь байтов,  то на
         экранный ряд - 32 X 8 = 256 байтов, а на весь экран - 24 X  256
         = 6144 байта.

                  1.2.3. Раскладка экрана цветовых атрибутов.
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              Еще одной  особенностью "Синклер"-совместимых  компьютеров
         является необычный  подход К.Синклера  к вопросам,  связанным с
         цветом. Дело в том, что если каждую точку красить в свой  цвет,
         то  оперативной  памяти  компьютера  уже  ни  на что хорошее не

         останется. Поэтому  им было  принято гениальное  решение - цвет
         сделать с  низким разрешением.  То есть  для каждого знакоместа
         возможен только один цвет INK (для включенных пикселов) и  один
         цвет PAPER (для выключенных). Иначе говоря, Вы не можете  иметь
         в одном знакоместе более  двух цветов одновременно. Что  же это
         дало?

              Поскольку  всего возможно только 8 цветов, то для  задания
         цвета INK в одном знакоместе достаточно трех битов:

                                                  Таблица 1
               --------------------------------------------------¬
               ¦  0  =     000     -  черный           BLACK     ¦
               ¦  1  =     001     -  синий            BLUE      ¦
               ¦  2  =     010     -  красный          RED       ¦
               ¦  3  =     011     -  пурпурный        MAGENTA   ¦
               ¦  4  =     100     -  зеленый          GREEN     ¦
               ¦  5  =     101     -  голубой          CYAN      ¦
               ¦  6  =     110     -  желтый           YELLOW    ¦
               ¦  7  =     111     -  белый            WHITE     ¦
               L--------------------------------------------------
              Цвета были  выбраны отнюдь  не случайно,  а исходя  из тех
         соображений, что на  экране черно-белого телевизора  они должны
         во-первых  хорошо  различаться,  как  разные  оттенки серого, а
         во-вторых, их  яркость от  черного до  белого должна постепенно
         возрастать.

              Точно так же  для задания  8 цветов PAPER нам тоже  доста-
         точно трех битов на одно знакоместо. Если теперь каждому знако-
         месту отвести по одному байту для хранения параметров цвета  (а
         в байте 8 битов), то остается еще пара свободных битов, один из
         которых отдан  признаку яркости  (BRIGHT), а  другой - признаку
         мигания (FLASH).  Таким образом,  для каждого  знакоместа может
         быть установлен свой  цвет INK, свой  цвет PAPER и  свои режимы
         BRIGHT  и  FLASH.  Эти  четыре  параметра  называют   цветовыми
         AТРИБУТАМИ.

              Использование  атрибута  BRIGHT  эквивалентно   расширению

         палитры цветов в  два раза, то  есть компьютер имеет  как бы 16
         цветов. Оценим теперь расход памяти на цветовые атрибуты:
              24 ряда по 32 знакоместа = 768 байтов - совершенно ничтож-
         ный расход памяти для  такого богатства красок, которое  мы не-
         редко видим в хороших игровых программах.

              После выхода первых "Спектрумов" не было пределов  востор-
         женным отзывам. Добиться имитации многоцветной графики высокого
         разрешения  с  таким  ничтожным  расходом  памяти - это великое
         достижение (за  которым конечно  скрывается иллюзия,  т.к. цвет
         не имеет высокого  разрешения, а только  имитирует его за  счет
         высокого разрешения пиксельной графики).

              Общий расход  памяти на  весь экран  с цветом  составляет:
         6144  +  768  =  6912  байтов,  -  что очень и очень немного по
         сравнению с машинами конкурентов.

              За этим фактом быстро открылась еще одна особенность.  По-
         скольку процессор имеет ограниченную скорость работы, то обслу-
         жить (перестроить) экран он может тем быстрее, чем меньшую  па-
         мять имеет  экранная область  и потому  фирмы, выпускающие про-
         граммное обеспечение, легко смогли освоить динамическую графику
         и  добиться  превосходных  по  тем  временам успехов в анимации
         изображений (так на Западе называют мультипликацию).

              Итак, каждый байт атрибутов соответствует одному знакомес-
         ту экрана и  несет информацию о  цветах INK, PAPER  и признаках
         BRIGHT и FLASH. При этом побитовая раскладка этих параметров  в
         байте выглядит так:

         Номер бита      7   6   5   4   3   2   1   0
                       г===T===T===T===T===T===T===T===¬
         Параметр      ¦ F ¦ B ¦ P ¦ P ¦ P ¦ I ¦ I ¦ I ¦
                       L===¦===¦===¦===¦===¦===¦===¦===-

                                 Рис.  8

                  1.2.4. Основные проблемы при работе с графикой.
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              Конечно же самая главная проблема при работе с графикой  -
         где  взять  художественный талант и  творческое вдохновение но,
         здесь мы Вам помочь ничем не сможем - сами их не имеем, так что
         на первых порах будем считать, что у Вас все это есть, а если и
         нет, то попробуем обойтись без них, заменив творческое  вдохно-
         вение на кропотливый поиск методом проб и ошибок. Мы же остано-
         вимся на чисто программистских проблемах, связанных с графикой.

              1. Быстродействие. Работа  с графикой требует  быстрой пе-
         реброски значительных объемов информации (килобайтов) из  одних
         участков оперативной памяти в другие. Здесь Вам поможет  приме-
         нение процедур, записанных в машинном коде или прямое обращение
         к процедурам, содержащимся в ПЗУ.

              2. Вторая проблема - ограниченный объем памяти компьютера.
         Так как графические изображения требуют больших объемов памяти,
         приходится решать и этот вопрос.  Есть приемы по борьбе с  этой
         проблемой.  Во-первых,  стараются  использовать  для графики не
         весь экран, а только  его часть (необходимую и  достаточную для
         достижения поставленной  задачи). Во-вторых,  стараются по-воз-
         можности шире  применять вычислительные  процессы для  создания
         графических образов - в этом случае графическое изображение  не
         хранится в  памяти для  выдачи его  в нужное  время на экран, а
         строится по  заданному алгоритму  (векторная графика)  именно в
         тот момент, когда это надо. В-третьих, когда все-таки надо хра-
         нить десятки  изображений, ранее  подготовленных в  графическом
         редакторе, применяют методы компрессии при сохранении рисунка и
         декомпрессии при выдаче его на экран.

              3.  Третья  проблема  является  чисто программистской. Она
         состоит  в  том,  что  надо  хорошо  знать как структура экрана
         соответствует структуре оперативной памяти. Грубо говоря,  надо
         знать  какие  адреса  в  памяти  каким  координатам  на  экране
         соответствуют.  А  поскольку  координаты  могут  быть  заданы в
         знакоместах или  в пикселах,  то фактически  эту проблему  надо
         решать  дважды,  а  если  еще  добавить цветовые атрибуты, то и
         трижды.

              Однако, знать это соответствие еще не достаточно. Надо еще
         знать методы и приемы, с помощью которых компьютер может   рас-
         считать эти адреса по заданным координатам, надо знать приемы и
         алгоритмы, с помощью которых данные извлекаются из недр  опера-
         тивной памяти и распределяются по этим адресам.

              К счастью, если Вы  работаете в БЕЙСИКе, то  забивать себе
         этим голову не надо. Смело давайте команду PRINT AT, PLOT  x,y,
         DRAW... и т.п.  и интерпретатор БЕЙСИКа,  "зашитый" в ПЗУ,  сам
         рассчитает, что нужно в  какие ячейки памяти заслать,  чтобы Вы
         на экране получили  то, что хотите.  Совсем иное дело,  если Вы
         будете работать в машинных кодах - тогда читайте вторую и  тре-
         тью главы этой книги, а пока вернемся к БЕЙСИКу.