

(c) Бекарев Михаил,
г. Красноярск.

   Я давний поклонник ZX (и ком-
пьютера и журнала). В  основном,
пробую свои силы в  программиро-
вании. Поначалу в Бейсике, как и
все, а теперь перешел на  машин-
ные коды и очень жалею, что дол-
го не мог  преодолеть так  назы-
ваемого психологического барьера
при  переходе  с BASIC на ASSEM-
BLER. Поразительная  разница! Не
только  в  скорости, но и в дос-
тупности.  В  кодах общаешься  с
процессором как с хорошим  това-
рищем, обо  всем  можно  погово-
рить.
   Начиная познавать  ассемблер,
я столкнулся с проблемой  расче-
та адреса  экранной  области  по
знакоместу и наоборот.  И  решил
эту проблему прилагаемой таблич-
кой. Пользоваться ей не  просто,
а очень просто!
   Например, нам необходимо рас-
считать адрес  по  знакоместу  с
координатами y=11, x=18.

           H                    L
┌───┬──┬──┬──┬─┬─┬─┬─╥───┬──┬──┬──┬─┬─┬─┬─┬────────────────────┐
│128│64│32│16│8│4│2│1║128│64│32│16│8│4│2│1│                    │
├───┼──┼──┼──┼─┼─┼─┼─║───┼──┼──┼──┼─┼─┼─┼─┼────────────────────┤
│   │  │  │  │ │4│2│1║   │  │  │  │ │ │ │ │Номер строки   0..7 │
├───┼──┼──┼──┼─┼─┼─┼─║───┼──┼──┼──┼─┼─┼─┼─┤                    │
│   │  │  │16│8│ │ │ ║  4│ 2│ 1│  │ │ │ │ │Y              0..23│
├───┼──┼──┼──┼─┼─┼─┼─║───┼──┼──┼──┼─┼─┼─┼─┤                    │
│   │  │  │  │ │ │ │ ║   │  │  │16│8│4│2│1│X              0..31│
├───┼──┼──┼──┼─┼─┼─┼─║───┼──┼──┼──┼─┼─┼─┼─┤                    │
│   │  │  │ 2│1│ │ │ ║   │  │  │  │ │ │ │ │Номер сегмента 0..2 │
├════════════════════╬════════════════════├────────────────────┘
│   │ 1│  │  │ │ │ │ ║   │  │  │  │ │ │ │ │Адрес экрана
└───┴──┴──┴──┴─┴─┴─┴─╨───┴──┴──┴──┴─┴─┴─┴─┘

   Смотрим и набираем в  таблице
по строке Y число 11 и  отмечаем
его в самой нижней строке  Адрес
экрана.
   Число  11  набирается  как  8
старшего байта и 2,1 младшего.

      1       1      ║     1  1
└───┴──┴──┴──┴─┴─┴─┴─┴───┴──┴──┴──┴─┴─┴─┴─┘

   Теперь набираем  по  X  число
18, это 16 и 2 младшего байта

      1       1      ║     1  1  1     1
└───┴──┴──┴──┴─┴─┴─┴─┴───┴──┴──┴──┴─┴─┴─┴─┘

   Можно даже узнать, какой  ад-
рес будет иметь 3 строка в  дан-
ном знакоместе, добавив в строке
таблицы "номер строки"  число  3
старшего байта:

      1       1   1 1║     1  1  1     1
└───┴──┴──┴──┴─┴─┴─┴─┴───┴──┴──┴──┴─┴─┴─┴─┘

   Теперь мы видим все  это  как
битовую раскладку  двухбайтового
регистра (например, HL).

      1       1   1 1║     1  1  1     1
└───┴──┴──┴──┴─┴─┴─┴─┴───┴──┴──┴──┴─┴─┴─┴─┘
 128 64 32 16 8 4 2 1 128 64 32 16 8 4 2 1

   Следовательно,  старший  байт
H=(64+8+2+1)*256=19200, а  млад-
ший L=64+32+16+2=114, и, значит,
адрес  равен  19200+114 = 19314.
Можно даже  увидеть,  что  адрес
находится в первом  сегменте эк-
рана, так как  включен бит над 1
в строке "номер сегмента".
   Обратный пересчет еще  проще.
Разложив адрес экрана  в  битах,
нетрудно узнать координаты, пос-
читав даже на пальцах.
   Единица  в  старшем  регистре
(бит 6)  обязательна,  т.к.  это
начало  адреса  экрана  (64*256=
16384).

********************************