Polesse #06
19 мая 1999

Ассемблер - Строение экрана.

<b>Ассемблер</b> - Строение экрана.
┌──────────────────────────────────────────────────────────────┐
│ ████▓▓▓▓▒▒▒▒░░░░ АССЕМБЛЕР ДЛЯ НАЧИНАЮЩИХ  ░░░░▒▒▒▒▓▓▓▓█████ │
└──────────────────────────────────────────────────────────────┘

(C) THINKER
───────────

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

   Как Вы уже наверное поняли,  если не отказываться от Бейсика,
то  работа  Вашей  программы  будет подобна  работе "Windows" на
286-м IBM процессоре.  Для того, чтобы избавиться от уз Бейсика,
необходимо напрямую работать с экраном, для чего нужно знать его
строение, а строение у него непростое! Экран делится на 3 части,
вот их адреса:  1-я - 16384 (#4000),  2-я - 18432 (#4800), 3-я -
20480 (#5000). (Напомню, что символ "#"  перед  цифрой означает,
что  число  переведено в шестнадцатиричную систему, а символ "%"
означает, что число в двоичной)  Так, как это адреса ОЗУ, мы мо-
жем посылать туда различные значения  (помните что такое 'LD'?).
Как же представляются на мониторе байты,  которые  мы помещаем в
область  экрана? Очень просто: как числа в двоичной системе, где
0 - выключеный пиксель (точка),  а  1 - включеный. Например, не-
обходимо  вывести точку в верхний левый угол экрана.  Для начала
рассчитаем адрес экрана: это начало первой трети, значит адрес -
16384 (#4000).

   Вот как будет выглядеть угол:

   ┌─────────────   █-включеный пиксель     ░-выключеный
   │█░░░░░░░░░░
   │░░░░░░░░░    Вот какой байт мы должны послать в экран:
   │░░░░░░░                █░░░░░░ = %10000000 = 128
   │░░░░                   └──√──┘
                         8  пикселей

   Значит мы должны послать число "128" по адресу 16384 (#4000),
после чего в верхнем левом углу будет стоять точка. Вот програм-
мка на ассемблере, которая отражает это:

                        LD  A,128
                        LD  (16384),A
                        RET

   Теперь сделаем вот что:

   ┌────────────
   │░█░█░█░█░░░    ░█░█░█░█ = %01010101 = 85 
   │░░░░░░░░░
   │░░░░░░░
   │░░░░

                        LD  A,85
                        LD  (16384),A
                        RET

   Скажу, что обычно в ассемблере  можно  писать  сразу двоичное
число, не переводя его в десятичное.
   Теперь о том, как располагаются байты в каждой трети.  Помни-
те, как грузились экраны с магнитофона? Сначала заполняется  са-
мая верхняя строчка пикселей,  потом начинает заполнятся  строка
на 8  пикселей ниже и  так 8 раз,  после чего заполняется вторая
строка пикселей и все повторяется до того момента,  когда  будет
заполнена первая треть, потом все повториться для 2-й и 3-й. Для
ого, чтобы понять все это,  наберите следующую программы на Бей-
сике, которая заполняет область экрана значением 255:

                    10 FOR F=16384 TO 22528
                    20 POKE F,255
                    30 NEXT F

   Как Вы уже, возможно, успели заметить,  прежде чем перейти от
первой  строчки пикселей  ко  второй,  вышепреведенная программа
заполняет 256 байт  (то есть 8*32). Значит, для  того, чтобы уз-
нать  адрес  начала 2-й  строки  пикселей,  необходимо  к  16384
(#4000) прибавить 256. Так же найдем адрес 3-й, 4-й...8-й.  Вот,
как располагаются байты в экране:


  Адреса в десятичной системе:     В шестнадцатиричной системе:
 ┌─────┬─────┬─────┬─────┬─────  ┌─────┬─────┬─────┬─────┬─────
 │16384│16385│16386│16387│16388  │#4000│#4001│#4002│#4003│#4004
 ├─────┼─────┼─────┼─────┼─────  ├─────┼─────┼─────┼─────┼─────
 │16640│16641│16642│16643│       │#4100│#4101│#4102│#4103│
 ├─────┼─────┼─────┼─────┼─      ├─────┼─────┼─────┼─────┼─
 │16896│16897│16898│16899│       │#4200│#4201│#4202│#4203│
 ├─────┼─────┼─────┼─────┼       ├─────┼─────┼─────┼─────┼
 │17152│17153│17154│             │#4300│#4301│#4302│
 ├─────┼─────┼─────┼             ├─────┼─────┼─────┼

   Заметили зависимость в правой таблице?  Возьмем адрес  #4001.
Это  двухбайтовое (шестнадцатибитное) число, которое при занесе-
нии в рег.пару, например  'HL',  представится следующим образом:
первый рег. будет содержать значение #40 (в нашем случае H=#40),
а второй-#01 (L=#01):

                 LD  HL,#4001;   H=#40, L=#01

   Теперь понятно:  для того,  чтобы перейти  к следующей строке
пикселей,  необходимо  к текущему адресу прибавить 256 байт или,
что тоже самое, увеличить старший байт на 1. Однако, это работа-
ет только в пределах одной  строки  знакомест,  то есть, если Вы
захотите переместиться  на символ ниже путем увеличения старшего
байта адреса, у Вас ничего не получится, и вот почему: допустим,
что мы хотим переместиться с нулевого символа,  адрес начала ко-
торого-16384 (#4000),  на символ ниже,  для этого нужно сдвинуть
адрес экрана на 8 пиксельных строк вниз: 16384 + 8 * 256= 18432.
Вроде все верно, но посмотрите на получившееся число:  ведь  это
уже вторая треть экрана, значит мы переместились не нa 1 символ,
а на 8!
   Tеперь атрибуты.  Тут все гораздо проще:  начало  -  (#5800),
строение построчное. То есть, если Вы заполните первые 32 знако-
места  цветом,  то  переместитесь на
строку ниже.  При засылании значения   ┌───────────┐ 
в  область атрибутов цвет соответст-   │* ▓ ███ ░░░│ *-мерцание 
вующего знакоместа  меняется следую-   └√─√──√───√─┘ ▓-яркость 
щим образом:  чернила берутся из 3-х    7 6 543 210  █-бумага 
первых  бит (биты 0..2),  бумага  из                 ░-чернила 
из битов 3..5,  яркость  и  мерцание
устанавливаются в соответствии с 6-м и 7-м битом. Вот трехбитные
значения чисел 0-7:

╔════════════════════════════════╗
 0-%000  2-%010  4-%100  6-%110  Например,  нам нужно в верх-
 1-%001  3-%011  5-%101  7-%111  нем левом углу  получить си-
╚════════════════════════════════╝  нюю бумагу,  желтые  чернила
                                    (оригинально уже само по се-
бе), с выключенной яркостью и включеным мерцанием. Желтые черни-
ла - 6=%110,  синяя бумага - 1=%001,  мерцание и яркость - 1 и 0
=%10. Теперь составляем из этих кусочков один байт: %10 001 110
= %10001110=142. А вот программка:

                        LD  A,142
                        LD  (#5800),A
                        RET

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





Другие статьи номера:

Ассемблер - Строение экрана.

В паутине - График работы городских серверов.

К размышлению - Кто победит в компьютерной войне.

Каракули мозга - Диалоги...

Рек-тайм - Реклама и объявления ...

Слово авторов - Полтора месяца спустя...

События, Факты - О Chaos Construction'99.


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

Похожие статьи:
Лит. страничка - Гриф "Y-II" (Дневник - продолжение).
Новости - Работа над CSC Deja VU завершена. Эмулятор Pentagon-128 для платформы АМИГА. Редактор уровней для ЧВ.
Лечение современными методами - 5 способов лечения.

В этот день...   19 января