Элементарная графика 1993 г.

Элементарная графика в машинных кодах - использование управляющих кодов. Другие приемы управления печатью. Организация экранной памяти.


                     2.3  ИСПОЛЬЗОВАНИЕ УПРАВЛЯЮЩИХ КОДОВ

              Набор  символов  "Спектрума"  включает  в себя стандартные
         символы ASCII - их коды с 20H (32) по 7FH (127), символы  блоч-
         ной  графики,  графики  пользователя  и  токены  ключевых  слов
         БЕЙСИКа - коды с 80H (128) по FFH (255). Это оставляет вне поля
         нашего зрения символы с 0 по 1FH (31). Что же расположено там?

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

              Мы  начнем  с  управляющего  кода  16H.  Он  называется AT
         CONTROL и определяет координаты  позиции печати  так же,  как и
         оператор AT в БЕЙСИКе.

              Задействуются управляющие коды, как и любые другие символы
         путем выставления этого кода в аккумуляторе процессора и  пода-
         чей команды RST  10H. Это означает,  что они могут  быть как бы
         "напечатаны" вместе с прочими символами и могут быть включены в
         длинные символьные строки.

              БЕЙСИКовский оператор AT требует после себя указания  двух
         параметров - координат позиции  печати по вертикали и  горизон-
         тали. Управляющий  код AT  требует то  же самое.  Оба параметра
         вводятся тем  же способом  - вводом  параметра в  аккумулятор и
         выдачей команды RST 10H.

              Приведенная  распечатка  показывает  машиннокодовый аналог
         оператора БЕЙСИКа PRINT AT 5,4; .

                           DEMO AT_5_4

              3E16        LD A,16H
              D7          RST 10H     ; PRINT AT ...
              3E05        LD A,05
              D7          RST 10H     ; 5,.....
              3E04        LD A,04
              D7          RST 10H     ; 4, ....

              Не имеет никакого значения сколько и каких  машиннокодовых
         команд будет выдано между тремя вышеприведенными командами  RST
         10H. "Спектрум", если выдал  управляющий код 16H, далее  всегда
         будет помнить,  что два  ближайших числа,  проходящих через RST
         10H являются параметрами управляющего кода AT_CONTOL.

              Более часто этот управляющий код находит применение, когда
         речь идет не о печати в фиксированной позиции, а в позиции, за-
         данной  программными  переменными.  Ниже показан машиннокодовый
         аналог команды PRINT AT D,E (здесь D и E - содержимое  соответ-
         ствующих регистров процессора.)

                           DEMO AT_D_E

              3E16        LD A,16H
              D7          RST 10H     ; PRINT AT ...
              7A          LD A,D
              D7          RST 10H     ; D,.....
              7B          LD A,E
              D7          RST 10H     ; E, ....

              Следующий управляющий код, который мы рассмотрим - это код
         17H. Он называется TAB_CONTROL - код управления табуляцией.  До
         некоторой степени  он тоже  аналогичен оператору  БЕЙСИКа TAB и
         указывает на номер позиции печати в текущей строке.

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

              Но мы имеем дело все  же с экраном, поскольку речь  идет о
         графике, и  для печати  на экране  то, что  находится в старшем
         байте, не  имеет никакого  значения. Дело  в том,  что когда Вы
         задаете параметр TAB, компьютер берет из него остаток от  деле-
         ния на 32, а старший байт кратен 256 и, естественно, кратен 32,
         поэтому  его  содержимое  влияние  при  печати  на  экран  и не
         оказывает.
              Нижеприведенная процедура показывает управляющий код   TAB
         CONTROL в действии.  Первый параметр предполагается  переменным
         и берется из регистра  E. Выдавая второй параметр,  мы обнулили
         его, использовав для этого обнуление аккумулятора через XOR  A,
         но раз этот байт роли не играет, можно было XOR A и не  давать,
         а отправить в этот параметр то, что было в аккумуляторе к этому
         моменту, неважно, что это было.

                              DEMO TAB_E
              3E17        LD A,17
              D7          RST 10H          ; PRINT TAB...
              7B          LD A,E
              D7          RST 10H          ; E, ...
              AF          XOR A
              D7          RST 10H          ; 0 ...

              Код CHR 6 называется COMMA_CONTROL и выполняет то же,  что
         и запятая  оператора PRINT.  Код подается  точно так  же, как и
         прочие, введением числа 6 в аккумулятор и выдачей его через RST
         10H. В результате его действия в качестве позиции печати  уста-
         навливается 0 или 16, в  зависимости от того, в какой  половине
         экрана печаталось последнее знакоместо.

              Код 0DH (13) - аналогичен ENTER. Выдается так же и обеспе-
         чивает прекращение печати в  текушей строке и переход  в начало
         следующей.

              Код 08 - называется BACKSPACE_CONTROL. Он выполняет смеще-
         ние позиции печати на одно знакоместо влево.

              Команда процессора RST 10H - довольно гибкая и имеет самое
         разнообразное действие. С ее помощью можно не только  управлять
         позицией  печати  символов  на  экране,  но и управлять цветами
         того,  что  Вы  воспроизводите,  т.е.  выдавать  коды  цветовых
         атрибутов. Выполняется это  точно так же  путем предварительной
         установки в аккумуляторе управляющего  кода и передачей его,  а
         затем передачей параметра. Мы не будем подробно останавливаться
         на цветовых атрибутах и привели их в Таблице 4.
              Пример  применения  кодов  управления цветовыми атрибутами
         показывает, как выполняется печать красной звездочки на  желтом
         фоне. Обратите внимание на то, что установленные таким способом
         цветовые атрибуты остаются действующими до того, как будут  из-
         менены или до окончания действия оператора БЕЙСИКа, из которого
         вызывалась данная процедура в машинных кодах.
              3E10             LD A,10H
              D7               RST 10H     ; PRINT INK...
              3E02             LD A,02
              D7               RST 10H     ; 2;....
              3E11             LD A,11H
              D7               RST 10H     ; PAPER...
              3E06             LD A,06
              D7               RST 10H     ; 6;....
              3E2A             LD A,2A
              D7               RST 10H     ; "*";

                                                     Таблица 4.
         ------------------T------------------T------------------------¬
         ¦ Управляющий код ¦ Параметры        ¦    Комментарии         ¦
         +-----------------+------------------+------------------------+
         ¦ 06 СOMMA_CONTR  ¦     -            ¦                        ¦
         ¦ 08 BACKSPACE    ¦     -            ¦                        ¦
         ¦ 0D ENTER        ¦     -            ¦                        ¦
         +-----------------+------------------+------------------------+
         ¦ 10 INK_CONTROL  ¦00-черный         ¦  Параметр 08 (транспа- ¦
         ¦ 11 PAPER_CONTR  ¦01-синий          ¦рантный) означает, что  ¦
         ¦                 ¦02-красный        ¦цвет печати не устанав- ¦
         ¦                 ¦03-пурпурн.       ¦ливается, а берется тот,¦
         ¦                 ¦04-зеленый        ¦который уже есть в дан- ¦
         ¦                 ¦05-голубой        ¦ной позиции печати.     ¦
         ¦                 ¦06-желтый         ¦  Параметр 09 (контраст-¦
         ¦                 ¦07-белый          ¦ный) устанавливает цвет ¦
         ¦                 ¦08-транспарантный ¦INK или PAPER контраст- ¦
         ¦                 ¦09-контрастный    ¦ным к уже существующему ¦
         ¦                 ¦                  ¦в данной позиции проти- ¦
         ¦                 ¦                  ¦воположному цвету.      ¦
         +-----------------+------------------+------------------------+
         ¦ 12 FLASH_CONTROL¦00-выключен       ¦                        ¦
         ¦ 13 BRIGHT_CONTR ¦01-включен        ¦                        ¦
         ¦                 ¦08-транспарантный ¦  См. выше.             ¦
         +-----------------+------------------+------------------------+
         ¦ 14 INVERSE_CONTR¦00-выключен       ¦                        ¦
         ¦ 15 OVER_CONTROL ¦01-включен        ¦                        ¦
         +-----------------+------------------+------------------------+
         ¦ 16 AT_CONTROL   ¦Строка, столбец.  ¦                        ¦
         ¦ 17 TAB_CONTROL  ¦Младший байт,     ¦  При выдаче на экран   ¦
         ¦                 ¦   старший байт.  ¦старший байт может быть ¦
         ¦                 ¦                  ¦любым. Можете, например ¦
         ¦                 ¦                  ¦использовать эту ячейку ¦
         ¦                 ¦                  ¦памяти для хранения ка- ¦
         ¦                 ¦                  ¦кой-либо однобайтной пе-¦
         ¦                 ¦                  ¦ременной.               ¦
         L-----------------+------------------+-------------------------

                      2.4. ДРУГИЕ ПРИЕМЫ УПРАВЛЕНИЯ ПЕЧАТЬЮ

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

              PRINT AT B,C (где B и C -содержимое одноименных  регистров
         процессора)  может  быть  выполнено  вызовом  процедуры AT_B_C,
         находящейся по адресу 0A9BH (2715).

              PRINT TAB  A (где  А -  содержимое аккумулятора) выполнимо
         вызовом процедуры TAB_A (0AC3H=2755).

              Управляющий  код  06  (COMMA_CONTROL)  эмулируется вызовом
         PO_COMMA (0A5FH=2655).

              Эти три приема действуют не  только на канал "S", но  и на
         канал "K",  т.е. с  их помощью  можно печатать  информацию и  в
         INPUT-строке.

              У  Вас  есть  также  достаточно  простой  способ управлять
         цветовыми атрибутами  INK, PAPER,  BRIGHT, FLASH.  Все, что для
         этого  требуется  -  внести  изменения  в  системную переменную
         ATTR_T  (5C8FH  =  23695),   отвечающую  за  статус   временных
         атрибутов  экрана.  Эта  системная  переменная  имеет следующую
         раскладку:

                       Биты 0...2 - цвет INK (от 0 до 7)
                       Биты 3...5 - цвет PAPER (от 0 до 7)
                       Бит 6 - статус BRIGHT (0 или 1)
                       Бит 7 - статус FLASH (0 или 1)

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

                       128*F + 64*B + 8*P + I, где:

              - F - статус FLASH;
              - B - статус BRIGHT;
              - P - номер цвета PAPER;
              - I - номер цвета INK.

              Если же Вы хотите,  чтобы какие-то цветовые атрибуты  были
         транспарантными, системной переменной  ATTR_T Вам уже  недоста-
         точно и надо воспользоваться системной переменной MASK_T (5C90H
         = 23696). Ее раскладка точно та же, что и у ATTR_T.  Биты,  со-
         ответствующие атрибуту, который Вы хотите сделать  транспарант-
         ным, надо включить.

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

                        2.5.  ОРГАНИЗАЦИЯ ЭКРАННОЙ ПАМЯТИ

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

              Эта область занимает адреса с  4000H по 5AFFH (с 16384  по
         23295). Причем, она состоит из двух областей. В первой с  4000H
         по 57FFH (с 16384  по 22527 расположено растровое  изображение,
         состоящее  из  черных  и  белых  неокрашенных точек (дисплейный
         файл). Во второй, с 5800H по  5AFFH (с 22528 по 23295) -   цве-
         товая информация (файл атрибутов).

              Размер всей экранной  области - 6912  байтов. Из них  6144
         байта  -  дисплейный  файл  (черно-белый)  и  768 байтов - файл
         атрибутов (цвет).

              Как получены эти числа 6144 и 728?

              Вы знаете, что полный экран "Спектрума" может иметь 24 ря-
         да по 32 символа в ряду, т.е. всего 24*32=728 знакомест. Каждое
         знакоместо образовано из 64-х пикселов (8 линий по 8 точек). На
         каждую линию достаточно одного  байта (8 битов соответствуют  8
         точкам) и, следовательно,  для растровой графики  одного знако-
         места необходимы  8 байтов.  Так, на  728 знакомест  необходимо
         728*8=6144 байта для хранения монохромной информации.

              Информация о цвете хранится более экономно. Каждому знако-
         месту отдан один байт, определяющий окраску всех 64 его  пиксе-
         лов. Три младших бита определяют цвет INK этого знакоместа, еще
         три бита определяют цвет PAPER и по одному биту отдано  призна-
         кам BRIGHT и  FLASH. Отсюда вытекает  одно из самых  неприятных
         ограничений графики "Спектрума" - в пределах одного  знакоместа
         невозможно иметь одновременно более 2-х цветов.

              А  теперь  давайте  немного  поэкспериментируем.  Очистите
         экран -  CLS. Окрасьте  бордюр в  голубой цвет  - BORDER 5. Это
         нужно,  чтобы  точно  видеть  результат следующих манипуляций и
         дайте команду, задающую самый первый байт экранной области:

                               POKE 16384,255
                               POKE 16384,15
                               POKE 16384,85

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

              Теперь попробуем закрасить вторую линию в первом знакомес-
         те. Логично  предположить, что  POKE в  следующую ячейку памяти
         сдедает это.  Дайте POKE  16385,85. Получилось  совсем не  то -
         включилась первая линия второго знакоместа. Далее - третьего  и
         так  далее,  до  32-го.  Может  быть, попробуем их пропустить и
         дадим POKE сразу в 33-ий адрес:

                          POKE (16384+32),85

              И опять ничего не получилось. Вместо второй линии в первом
         знакоместе включается первая линия  в первом знакоместе, но  во
         втором ряду. И так будет  продожаться, пока Вы не пройдете  все
         32 знакоместа в 8  рядах экрана, т.е. 32*8=256  адресов. Только
         дав POKE  (16384+256), Вы  получите то,  что хотели.  На первый
         взгляд  такое  соответствие  между  точками  экрана  и ячейками
         экранной памяти  выглядит достаточно  нелепым и  нелогичным. Но
         это не  совсем так.  Как окажется  чуть ниже,  это не только не
         усложняет жизнь, а при работе из машинного кода даже упрощает -
         надо только хорошо все понять.

              Теперь, покопавшись в памяти, Вы наверняка вспомните,  что
         уже много  раз видели  при загрузке  заставок игровых программ,
         как  экран  прорисовывается  постепенно  строчка за строчкой. В
         этот момент Вы и видели соответствие между структурой экрана  и
         экранной памятью. Хотите повторить, пожалуйста:

                       10 CLS: BORDER 5
                       20 FOR i=16384 TO (16384+256*8)
                       30 POKE i,255
                       40 NEXT i

              Чтобы не утомлять Вас длительным ожиданием, мы сделали это
         только для 8 первых рядов экрана.

              Научившись изображать  на экране  точки и  тире без помощи
         операторов PRINT и PLOT, мы уже сделали большое дело и развяза-
         ли  себе  руки,  т,к.  мы  теперь  умеем манипулируя с ячейками
         памяти делать  графику, а  машинный код  именно и  хорош, когда
         дело доходит до манипуляций с большими объемами памяти.

              Но как насчет того, чтобы получить нормальный  графический
         образ? Нет  проблем, этот  образ сначала  надо где-то  в памяти
         создать. Давайте воспользуемся готовым. Вы, конечно знаете, что
         в  ПЗУ  компьютера  где-то  имеется  набор  символов, в котором
         хранятся  графические  образы  (шаблоны)  всех  букв  и  прочих
         знаков. Вот мы возьмем оттуда образ буквы "A" и нарисуем ее  на
         экране без PLOT или PRINT.

              В адресах 23606, 23607  (5C36H) хранится 2-х байтная  сис-
         темная переменная CHARS, которая указывает на 256 байтов  ниже,
         чем адрес,  с которого  начинается набор  символов.  Во-первых,
         давайте разберемся, почему она указывает ниже на 256 байтов,  а
         не туда, куда  надо. Все очень  просто. Мы уже  говорили о том,
         что первые 32 символа вовсе и не символы, а управляющие коды  и
         им графические образы не нужны, все равно они не печатаются.  А
         т.к. символы занимают по 8 байтов каждый, то на пропуск этих 32
         управляющих  кодов  и  ушло  это  снижение  на 256 байтов. Зато
         теперь мы можем искать образ буквы  A по ее номеру (по ее  коду
         ASCII, который, кстати, равен 65(41H) ).

                     10 LET base=PEEK 23606 + 256*PEEK 23607
                     20 LET addr = base+8*65
                     25 LET screen=16384
                     30 FOR i=0 TO 7
                     40 LET pic=PEEK (addr+i)
                     50 POKE (screen+256*i),pic
                     60 NEXT i

              Мы с Вами только  что нарисовали букву "А",  причем именно
         нарисовали, а  не напечатали,  да к  тому же  работали при этом
         только с переброской данных из одних участков памяти в  другие.
         Вы  обратили  внимание  на  то,  что  засылали  мы  графику   в
         дисплейный файл в строке 50 с шагом через 256 адресов?  Давайте
         теперь рассмотрим, как то  же самое будет выглядеть  в машинном
         коде  и  почему  так  сложно,  на  первый  взгляд,  организован
         дисплейный файл.

              Адреса экранной памяти обычно при работе с экраном хранят-
         ся в регистровой  паре HL. При  этом в H  хранится старший байт
         адреса (High - старший), а в L - младший (Low). Для того, чтобы
         увеличить адрес на 256 и  перейти к нижележащей линии в  том же
         знакоместе оказывается достаточно увеличить на единицу  старший
         байт.  С  этой  задачей  изящно  справляется  простая   команда
         АССЕМБЛЕРа  INC  H.  Увеличение  же  на  единицу младшего байта
         адреса (INC L) переместит  Ваc на соседнее знакоместо  вправо в
         той  же  линии.  Видите,  как  все  просто.  И   преобразование
         вышеприведенной БЕЙСИК-программы в машинный код выглядит так:

                     LD DE,(23606)      ; Загрузили в DE содержимое
                                        ; системной переменной CHARS.
                     LD HL,0041H        ; Загрузили в HL код буквы A.
                     ADD HL,HL          ; Умножили его на 2.
                     ADD HL,HL          ; Умножили его на 4.
                     ADD HL,HL          ; Умножили его на 8.
                     ADD HL,DE          ; Теперь HL указывает на начало
                                        ; шаблона буквы A.
                     EX DE,HL           ; Освободили HL для работы с
                                        ; экраном.
                     LD HL,4000H        ; Загрузили в HL адрес начала
                                        ; экранного файла.
                     LD B,08            ; Организуем счетчик на 8
                                        ; шагов.
             LOOP    LD A,(DE)          ; Переброска содержимого из
                     LD (HL),A          ; DE в экранный файл через
                                        ; аккумулятор.
                     INC H              ; Переход к новой линии экрана.
                     INC DE             ; Переход к новой линии шаблона.
                     DJNZ LOOP          ; Окончание цикла из 8-ми шагов.
                     RET                ; Возврат.

              Итак, все вроде бы просто и понятно, но Вы, конечно, обра-
         тили внимание на то, что все,  что мы до сих пор делали,  отно-
         сится только к восьми первым символьным рядам экрана, а что  же
         дальше? Ведь их всего 24.

              Здесь тоже  все просто,  если представить  себе, что экран
         состоит из  трех несвязанных  между собой  областей, каждая  из
         которых имеет по 8 рядов. Назовем эти трети экрана  СЕГМЕНТАМи.
         Итак, экран состоит из трех сегментов, каждый из которых состо-
         ит из восьми рядов, каждый из которых состоит из тридцати  двух
         знакомест, каждое из которых состоит из восьми линий, каждая из
         которых состоит из восьми пикселов.

              Первый сегмент - 16384 - 18431 (4000H - 47FFH)
              Второй сегмент - 18432 - 20479 (4800H - 4FFFH)
              Третий сегмент - 20480 - 22527 (5000H - 57FFH)
              Каждый сегмент занимает по 8*32*8=2048 байтов.

              Если теперь развернуть регистровую пару HL  виде  шестнад-
         цати  битов,  то  получится  любопытная  побитовая  карта   для
         дисплейного файла (Рис. 11).

              Однажды,  в  1985  году  сэра  К.Синклера спросили, чем он
         объясняет столь невероятный успех своих компьютеров по  сравне-
         нию с главными конкуретами "Коммодором",  "Атари",  "Амстрадом"
         и "Би-Би-Си  Микро", если  известно, что  графика у  них лучше,
         музыка богаче, надежность выше и дополнительных внешних  портов
         больше?  На  это  он  ответил:  "У  меня гораздо проще доступ к
         памяти". И этим сказано все. В частности, организация  экранной
         памяти в "Спектруме"  была не последним  моментом, обеспечившим

                        H                               L
           -------------+-------------¬   --------------+-------------¬
           ¦                          ¦   ¦                           ¦
         г==T===T===T===T===T===T===T===T===T===T===T===T===T===T===T==¬
         ¦0 ¦ 1 ¦ 0 ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X¦
         L==¦=T=¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦==-
              ¦       ¦    ¦  ¦       ¦   ¦       ¦   ¦               ¦
                      L-----  L--------   L--------   L----------------
         Адрес 16384   Номер    Номер      Номер        Номер столбца
                      сегмента  линии      ряда
                       0...2    0...7       0...7         0 ... 31

                                    Рис. 11

         ему поддержку  со стороны  сотен фирм,  выпускающих программное
         обеспечение.

              Давайте рассмотрим эти преимущества.

              1.  В  отличие  от  многих  других разработчиков К.Синклер
         нашел  удачное  решение,  объединив  в  едином экране и графику
         высокого  разрешения  и  символьную  графику. Нет необходимости
         переключаться на  другой экран  всякий раз,  как надо построить
         диаграмму   или   написать    текст.   Это   большой    подарок
         программистам.

              2. Решение  о разделении  черно-белой информации  высокого
         разрешения и  цветовой информации  низкого разрешения  в разные
         файлы позволило ему в 4-5 раз уменьшить объем экранной памяти и
         выделить  много  места  для  пользователя.  Практически   здесь
         имитируется  цветная  графика  высокого  разрешения,  хотя  она
         таковой строго говоря и не  является - это был гениальный  ход,
         высоко оцененный специалистами.

              3. Эти решения позволили в значительной степени  сократить
         размеры программ ПЗУ. Действительно, по отношению  возможностей
         ПЗУ к его размерам вряд ли найдется машина, равная "Спектруму",
         хотя  и  у  этого  ПЗУ,  как  показал дальнейший опыт, еще были
         огромные резервы.

              Теперь посмотрим, как на практике ухватились  программисты
         например за такой  простой элемент, как  сегментирование экрана
         на три зоны при том,  что экран является одновременно и  графи-
         ческим и символьным.

              Во-первых, множество первоклассных программ используют для
         своей графики только один  сегмент, оставив прочее на  диалог с
         пользователем. Ведь  стоит только  вдуматься, что  в таких про-
         граммах, как TIR-NA-NOG,  DUN DARACH, MARSPORT  фирмы "GARGOYLE
         GAMES" огромные события  происходят на участке  памяти размером
         всего лишь 2К.

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

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

                                   Файл атрибутов.
                                   ~~~~~~~~~~~~~~~
              Теперь, рассмотрев работу с дисплейным файлом, перейдем  к
         файлу атрибутов и посмотрим работу следующей программы:

              10 PAPER 6: INK 0: BORDER 6: CLS
              20 FOR i=1 TO 22
              30 PRINT, "ZX-SPECTRUM"
              40 NEXT i
              50 FOR i=22528 TO 23295
              60 POKE i,15
              70 NEXT i

              Посмотрите, что  произойдет, когда  Вы запустите  эту про-
         грамму.  Во-первых,  на  экране  будет  напечатан текст (черным
         цветом по желтому фону). Во-вторых, знакоместо за  знакоместом,
         начнется  изменение  его  цвета  (белые  буквы по синему фону).
         Чтобы понять  почему так  происходит, нам  надо изучить область
         памяти от адреса 22528 до адреса 23295 (5800H - 5AFFH), которая
         и называется файлом атрибутов.  Содержимое ячеек памяти в  этой
         области определяет то, каким цветом будет окрашено то или  иное
         знакоместо.

              Структура  этого  файла  очень  проста. Каждому знакоместу
         экрана соответствует один байт памяти, а значение этого байта и
         определяет цвета этого знакоместа.  Это означает, что когда  Вы
         засылаете (POKE) какое-либо число в ячейку памяти этой области,
         Вы изменяете цвет  одного из знакомест  экрана. Каждый байт  из
         файла  атрибутов  хранит  информацию  о  параметрах INK, PAPER,
         BRIGHT и FLASH.

                       Биты 0...2 - цвет INK (от 0 до 7)
                       Биты 3...5 - цвет PAPER (от 0 до 7)
                       Бит 6 - статус BRIGHT (0 или 1)
                       Бит 7 - статус FLASH (0 или 1)

                         7   6   5   4   3   2   1   0
                       г===T===T===T===T===T===T===T===¬
                       ¦ F ¦ B ¦ P ¦ P ¦ P ¦ I ¦ I ¦ I ¦
                       L===¦===¦===¦===¦===¦===¦===¦===-
                                   Рис. 12

              Для программирующего в машинном коде, конечно, чрезвычайно
         важно знать точно, какому знакоместу экрана соответствует какой
         байт файла атрибутов.  Зная, что в  каждом ряду 32  знакоместа,
         этот адрес вычислить нетрудно:   22528 + 32*Y + X.

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

              Если теперь развернуть регистровую пару HL  виде  шестнад-
         цати битов, то побитовая  карта для файла атрибутов  имеет сле-
         дующий вид:

                        H                               L
           -------------+-------------¬   --------------+-------------¬
           ¦                          ¦   ¦                           ¦
         г==T===T===T===T===T===T===T===T===T===T===T===T===T===T===T==¬
         ¦0 ¦ 1 ¦ 0 ¦ 1 ¦ 1 ¦ 0 ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X¦
         LT=¦===¦===¦===¦=T=¦===¦=T=¦===¦===¦===¦===¦===¦===¦===¦===¦==-
          L------T---------       ¦               ¦   ¦               ¦
                 ¦                L----------------   L----------------
              адрес 22528               Номер           Номер столбца
                                        ряда
                                       0...23           0 ... 31

                                      Рис. 13



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Лит. страничка - Гриф "Y" (Дневник Лаборанта Ж. Скальпив - продолжение).
Начало - Вот ведь, блядь, как плохо на душе!
Железо - IBM PC Keyboard (часть 2).
Партийная зона - Результаты очного голосования на DI-HALT'99.
Бук - Житие великого митька Иисуса по кликухе Хpистос.

В этот день...   21 ноября