Move #09
02 августа 1997

Алгоритм - Об адресации спектрумовского экрана.

<b>Алгоритм</b> - Об адресации спектрумовского экрана.
                АЛГОРИТМЫ
──────────────────────────────────────────
(c) Ars

    В    этой    рубрике   мы   продолжаем
публиковать  полезные  процедуры.  На этот
раз речь пойдет о различных подпрограммах,
связанных  с  выводом на экран. Если у вас
возникнут   какие-то  замечания,  сообщите
нам.  А  также  вы  можете  предложить для
обсуждения    свой   вариант   алгоритмов,
обратившись в редакцию MOVE.
    Часть   процедур,   приводимых   ниже,
написал  Rui  Ribeiro  -  автор  WSpecem -
эмулятора Спектрума для Windows.

    Прежде      всего     об     адресации
спектрумовского    экрана.   Несмотря   на
некоторую   непоследовательность   в   его
строении,   адрес  любого  байта  экранной
области  (#4000..#57FF)  может  быть задан
схемой:

          010S SLLL RRRB BBBB

где: S - секция или треть (0..2);
     L - номер линии символа (0..7)
     R - позиция по вертикали в пределах
         секции (0..7);
     B - номер столбца (0..31).

Координаты любой точки (x,y) экрана в этих
обозначениях имеют такое строение:

y - 11 111 111    x - 11111 111
     S  R  L            B   bit number

y = 0..191        x = 0..255

А  вот  как  можно  описать адрес экрана в
виде формулы:

 adr(x,y) = 16384+2048*INT(L/8)+
 +32*(L-8*INT(L/8))+256*R+C

Теперь - основные процедуры.

1)  Как  из  координат  точки  получить ее
экранный адрес и номер пикселя в байте.

Input:  BC = yx
Output: HL = screen address, A = bit

PixAdr1  LD      A,B
         AND     A
         RRA
         SCF
         RRA
         AND     A
         RRA
         XOR     B
         AND     #F8
         XOR     B
         LD      H,A
         LD      A,C
         RLCA
         RLCA
         RLCA
         XOR     B
         AND     #C7
         XOR     B
         RLCA
         RLCA
         LD      L,A
         LD      A,C
         AND     7
         RET

2)  Та  же  задача, но вместо координаты x
задан номер столбца.

Input:  B = pixel line number (0..191)
        C = column number   (0..31)
Output: HL = screen address

PixAdr2  LD      A,B
         AND     A
         RRA
         SCF
         RRA
         AND     A
         RRA
         XOR     B
         AND     #F8
         XOR     B
         LD      H,A
         LD      A,B
         RLCA
         RLCA
         AND     #E0
         OR      C
         LD      L,A
         RET

Положение  любого  текстового  символа  на
экране задается следующей схемой:

Y - 000 11 111  X - 000 11111
        S   R             B

Y = 0..23       X = 0..31

3)   Как   из   позиции  символа  получить
экранный адрес.

Input:  BC = YX
Output: HL = screen address

ChrAdr1  LD      A,B
         AND     #18
         OR      #40
         LD      H,A
         LD      A,B
         AND     7
         RRCA
         RRCA
         RRCA
         ADD     A,C
         LD      L,A
         RET

Или другой вариант:

ChrAdr2  LD      A,B
         AND     #18
         OR      #40
         LD      H,A
         LD      A,B
         RRCA
         RRCA
         RRCA
         AND     #E0
         OR      C
         LD      L,A
         RET

Следующие процедуры касаются вывода текста

4) Спуск на символ вниз.

Input:  HL = screen address
Output: HL = down char screen address

DownChr  LD      A,L
         ADD     A,32
         LD      L,A
         RET     NC
         LD      A,H
         ADD     A,8
         LD      H,A
         RET

5) Подъем на символ вверх.

Input:  HL = screen address
Output: HL = upper char screen address

UpChar   LD      A,L
         SUB     32
         LD      L,A
         RET     NC
         LD      A,H
         SUB     8
         LD      H,A
         RET

6)   Переход   к   следующему  символу  по
экранному адресу.

Input:  HL = screen address
Output: HL = next char screen address

NextChr  RR      H
         RR      H
         RR      H
         INC     HL
         RL      H
         RL      H
         RL      H
         RET

7)   Переход   к  предыдущему  символу  по
экранному адресу.
         
Input:  HL = screen address
Output: HL = previous char screen address

PrevChr  RR      H
         RR      H
         RR      H
         DEC     HL
         RL      H
         RL      H
         RL      H
         RET

Информация получена с Web-странички:
http://www.atlantic.net/~adansby/plot.html

(Продолжение читайте в следующем номере.)



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

От редакции - О регулярности выхода газеты.

О сетях - Может договоримся ? Зачем нужна внешняя почта ?

Обзор - Сенсация! DOOM на Спектруме!.

Алгоритм - Об адресации спектрумовского экрана.

Алгоритм - Один полезный трюк с ^ (алгоритм круга).

Мозаика - Где они? Что стало с людьми, писавших фирменные игры для Спектрума.

Письмо - Письмо от Максима Голикова (DarkMax).

Правда о хакерах - Как она есть. Кто такие хаккеры.

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


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

Похожие статьи:
Музобзор - Интервью с группой "Too Late! Frozen".
Обратная связь - Письма читателей...
Help - управление журналом.
Введение - Об изменениях в оболочке газеты.
Очумелые_ручки - схема турибирования процессора Z80.

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