THE COMPLETE AMIGA HARDWARE
REFERENCE MANUAL

                                 ГЛАВА 4

                                 СПРАЙТЫ

ВВЕДЕНИЕ

Спрайты - это объекты чипсета, создаваемые и  перемещаемые  независимо
от плейфилда и независимо друг от друга. Вместе с плейфилдами, спрайты
формируют изображение на экране монитора. Вы  можете  создавать  более
сложные  анимационные  эффекты, используя блиттер, как описано в главе
6, "Блиттер". Спрайты помещаются на экран  с  помощью  восьми  каналов
DMA.  Простой спрайт имеет ширину 16 пикселей и неограниченную высоту.
Вы можете выбрать 3 цвета для пикселей спрайта. Кроме  этого,  пиксель
может быть прозрачным, сквозь который виден объект позади спрайта. Для
больших и более сложных объектов или для получения большего количества
цветов, спрайты могут объединяться.

DMA спрайтов может быть повторно включено после первого использования.
Таким  образом, вы не ограничены только 8 спрайтами на экране в одно и
то же время.

ОБ ЭТОЙ ГЛАВЕ

В этой главе обсуждаются следующие темы:

- Определение размера, формы, цвета и расположения спрайтов.
- Отображение и перемещение спрайтов.
- Объединение  спрайтов  для  более  сложных  изображений: добавление
цветов и увеличение ширины.
- Повторное использование спрайтов для получения более, чем 8 спрайтов
одновременно.

СОЗДАНИЕ СПРАЙТА

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

- Ширина до 16 пикселей
- Высота неограничена
- Форма любая
- Три цвета плюс прозрачный
- Позиция на экране любая

ПОЗИЦИЯ СПРАЙТА НА ЭКРАНЕ

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

   (0,0)
        \                                  Видимая область плейфилда
         \_______________________        /
         |                |             /
         |    ____________|____________/
         |   |            Y            |
         |   |            |            |
         |   |            |______      |
         |-------X--------|  /\  |     |
         |   |            |__\/__|     |
         |   |                         |
         |   |                         |

           Рис. 4-1: Определение позиции спрайта на экране

Расположение   видимой   области  экрана  зависит  от  установки  окна
изображения,   определяемого  значениями  DDFSTRT,  DDFSTOP,  DIWSTRT,
DIWSTOP и т.д. Для подробностей, касающихся установки окна изображения
см. главу 3 "Плейфилды"

ГОРИЗОНТАЛЬНАЯ ПОЗИЦИЯ

Горизонтальная  позиция спрайта (координата X) может иметь значение от
0  до 447. Для того, чтобы быть видимым, объект должен попадать внутрь
окна изображения. В примерах, данных в этой главе,  используется  окно,
начинающееся  в  позиции  64  и  заканчивающееся  в  позиции 383 (т.к.
каждая  линия  шириной  320 пикселей). По желанию могут использоваться
большие   или   меньшие   окна,  но  перед  изменением  размеров  окна
рекомендуется прочитать главу 3 "плейфилды".

Если  вы  зададите значение X за пределами окна, часть или весь спрайт
могут   пропасть   с   экрана.   Таким  образом,  спрайты  могут  быть
клиппированы.

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

Желаемая позиция + горизонтальное смещение окна = 94+64 = 158

Следовательно  158  -  это как раз то значение, которое записывается в
структуру данных

ПРИМЕЧАНИЕ
X  координата задает размещение самого левого пикселя в спрайте, даже,
если этот пиксель определен как прозрачный и не виден на экране.

Если,   например,  спрайт,  показанный  на  рис.  4-2  имеет  значение
координаты  X  равное  158,  в  действительности  изображение  спрайта
начинается в позиции 162, т.к. первые 4 пикселя спрайта определены как
прозрачные и через них будет изображаться задний план.

Нету... (Было "Figure4-11")

        См. рис. 4-2: Расположение спрайта (катинка отсутствует)

ВЕРТИКАЛЬНАЯ ПОЗИЦИЯ

Вы  можете  задавать  позицию  для  самой  верхней  строки  спрайта  в
интервале  0-262.  В  примерах  этой  главы  используется  NTSC окно с
координатами  44  -  243.  Это позволяет изображать 200 строк. Если вы
зададите  вертикальную  позицию  меньше, чем 44 (т.е. выше начала окна
изображения) то верхняя часть спрайта исчезнет с экрана.

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

Желаемая координата Y + вертикальное смещение края окна = 25+44=69

Следовательно  69  -  это  как раз то значение, которое записывается в
структуру данных

КЛИППИРОВАНИЕ СПРАЙТОВ

Как  показано  выше,  спрайты  могу  быть   частично   или   полностью
клиппированы,  если  они  пересекаются  с  границами окна изображения.
Значения 64 по горизонтали и 44 по вертикали  соответствуют  нормально
центрированному   плейфилду  в  NTSC.  Для  подробностей  о  смещениях
плейфилда и для информации о смещениях  в  системе  PAL  см.  главу  3
"Плейфилды".  Если  вы  выберете  другие  значения для создания своего
плейфилда, границы клиппирования тоже изменятся.

РАЗМЕРЫ СПРАЙТОВ

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

Размер   спрайта   задается   в   пикселях   низкого   разрешения  при
неинтерлейсном  режиме. Разрешение спрайтов не зависит от разрешения и
интерлейса, установленных на экране.

ФОРМА СПРАЙТОВ

Спрайт может иметь любую форму, помещающуюся в шестнадцать пикселей по
ширине.  Задание  спрайта  производится  заданием видимых пикселей для
каждого  пикселя  спрайта.  На  рисунках 4-3 и 4-4 показан космический
корабль,  обозначенный  знаками 'х'. Первый рисунок показывает корабль
так  как он появится на экране. Второй рисунок показывает биты спрайта
шириной   16  пикселей.  Нули  вокруг  корабля  обозначают  прозрачные
пиксели.
                                x x
                             x x x x x
                        x x x x x x x x x x
                        x x x x x x x x x x
                            x x x x x x
                                x x

                    Рис. 4-3: Космический корабль


                        o o o o x x o o o o o o o o o o
                        o o x x x x x x o o o o o o o o
                        x x x x x x x x x x o o o o o o
                        x x x x x x x x x x o o o o o o
                        o o x x x x x x o o o o o o o o
                        o o o o x x o o o o o o o o o o

                    Рис. 4-4: Спрайт с изображением корабля

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

ЦВЕТА СПРАЙТОВ

Когда спрайты используются отдельно (а не "объединены" как  описано  в
разделе "Объединенные  спрайты"   каждый пиксель может иметь один из 3
цветов или быть прозрачным.  Цвета задаются примерно  так  же,  как  и
цвета на плейфилде. Рисунок 4-5 показывает как определяются цвета каждого
пикселя при задании спрайта.



                   рис. 4-5: Задание цветов спрайтов

Нули  и  единички  в  двух  словах  данных,  определяющих каждую линию
спрайта  формируют  двоичный  номер. Этот номер является указателем на
один из 4х регистров цвета, закрепленных за данным каналом DMA. Восемь
спрайтов используют цветовые регистры 16-31. Для задания цветов восемь
спрайтов  объединены  в  пары и каждая пара использует четыре регистра
цвета как показано на рис. 4-6

ПРИМЕЧАНИЕ
Значение   цвета   первого   регистра   в   каждой   группе  спрайтами
игнорируется.  Когда  биты спрайта выбирают этот регистр, используется
прозрачный цвет.

Коды  01,  10  и 11 выбирают один из трех регистров из группы, которая
прикреплена к определенным цветовым регистрам.

                        УСТАНОВКА ЦВЕТОВЫХ РЕГИСТРОВ
                          _________________________
                   __    |       не используется   | 16
                  |   00 |_________________________|    \
  Спрайты 0 или 1 |   01 |_________________________|     \
                  |   10 |_________________________|      \
                  |__ 11 |_________________________|       \
                   __    |       не используется   | 20     \      п
                  |   00 |_________________________|   \     \     р
  Спрайты 2 или 3 |   01 |_________________________|    \     \    о
                  |   10 |_________________________|     \     \   з
                  |__ 11 |_________________________|      \     \  р
                   __    |       не используется   | 24 ---------> а
                  |   00 |_________________________|      /     /  ч
  Спрайты 4 или 5 |   01 |_________________________|     /     /   н
                  |   10 |_________________________|    /     /    ы
                  |__ 11 |_________________________|   /     /     й
                   __    |       не используется   | 28     /
                  |   00 |_________________________|       /
  Спрайты 6 или 7 |   01 |_________________________|      /
                  |   10 |_________________________|     /
                  |__ 11 |_________________________| 31 /

                Рис 4-6: Назначение цветовых регистров

Если вам требуются определенные цвета для  спрайтов,  вам  потребуется
загрузить  цветовые  регистры  этими цветами. В главе 3 "Плейфилды" вы
можете найти инструкции по загрузке цветовых регистров.

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

КОНСТРУИРОВАНИЕ СПРАЙТОВ

Для конструирования спрайтов можно изобразить их сначала на бумаге. Вы
можете  использовать  цвета  от 0 до 3. Например, космический корабль,
показанный выше, может быть раскрашен так:

        0000122332210000
        0001223333221000
        0012223333222100
        0001223333221000
        0000122332210000

Следующим шагом будет конвертирование  чисел  0-3  в  двоичные  числа,
которые будут использоваться для построения слов данных и размещения в
структуре данных спрайта.

ПОСТРОЕНИЕ СТРУКТУРЫ ДАННЫХ

После определения спрайта вам  необходимо  создать  структуру  данных,
состоящую  из  последовательности  слов  в  непрерывной  области  chip
памяти. Первые два слова содержат координаты и служебную информацию, а
остальные  содержат  цвета  пикселей  спрайта.  Для создания структуры
данных спрайта вам необходимо:

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

ПРИМЕЧАНИЕ
Данные для спрайтов,  как и все другие данные  для  спец-чипов  должны
располагаться в chip памяти.  Убедитесь, что все ваши структуры данных
спрайтов находятся в chip памяти и выровнены по границам слова.

В таблице 4-1 показана структура данных спрайта  в  памяти  и  функции
каждого слова.

Рис 4-7 показывает расположение структуры данных спрайта в памяти.

    Табл 4-1: Структура данных спрайта

    Память       Слова                        Функции

      N         Первое управляющее слово    Вертикальная и горизонтальная
                                            координаты начала спрайта
      N+1       Второе управляющее слово    Вертикальная координата
                                            конца спрайта
      N+2       Цвета. Младшее слово        Биты для первой линии
      N+3       Цвета. Старшее слово        Биты для первой линии
      N+4       Цвета. Младшее слово        Биты для второй линии
      N+5       Цвета. Старшее слово        Биты для второй линии
                        .
                        .
                        .
                Маркер конца данных         Два слова, разрешающих следующее
                                            использование этого спрайта

  \ /   <------------- 16 Бит  ----------->
   |     _________________________________----\    _ Каждая группа слов
   |    |                                 |   |   /  определяет один
   |    |          VSTART, HSTART         |   |  /   блок спрайта
   |    |_________________________________|   | /    Содержит начальные
        |                                 |   |/     координаты образа
   У    |       VSTOP, управляющие биты   |   |      спрайта на экране
   в    |_________________________________|   |
   е     _________________________________ ___|___
   л    |                                 |   |   |
   и    | Младшее слово данных. Строка 1  |   |   |
   ч    |_________________________________|   |   |
   е    |                                 |   |   |\
   н    | Старшее слово данных. Строка 1  |   |   | \
   и    |_________________________________|   |   |  \_ Пары слов содержат
   е      _____                               |   |     информацию о
          _____ Остальные строки спрайта      |   |     цвете каждой линии
   а       ____                               |   |
   д     _________________________________    |   |
   р    |                                 |   |   |
   е    |     Младшее слово данных.       |   |   |
   с    |________Последняя строка_________|   |   |
   о    |                                 |   |   |
   в    |     Старшее слово данных        |   |   |
        |_________________________________|___|___|
   |                                      ____|
   |     _________________________________
   |    |                                 |\
   |    | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | \
   |    |_________________________________|  \_ Последнее слово
   |     _________________________________      содержит нули
   |    |                                 |     если этот канал
   |    | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |     спрайта используется
  \|/   |_________________________________|     один раз за кадр.
   V
              РИС. 4-7 Часть первая: Формат данных спрайта



               РИС 4-7 Часть вторая: Формат данных спрайта

ПЕРВОЕ УПРАВЛЯЮЩЕЕ СЛОВО: SPRxPOS

Это слово содержит вертикальную  (VSTART)  и  горизонтальную  (HSTART)
начальные  позиции  спрайта, которые задают расположение самой верхней
линии спрайта.

    Биты 15-8 содержат младшие 8 бит VSTART
    Биты  7-0 содержат старшие 8 бит HSTART

ВТОРОЕ УПРАВЛЯЮЩЕЕ СЛОВО: SPRxCTL

Это  слово  содержит   координату   вертикальной   позиции   окончания
изображения  спрайта  (т.е.  линию  ПОСЛЕ последней изображаемой линии
спрайта).  Также  это  слово   содержит   данные,   используемые   при
объединении спрайтов.

                 Биты 15-8          Младшие 8 бит VSTOP
                 Бит  7             Используется про объединении
                 Биты 6-3           Не используются (должны быть 0)
                 Бит  2             Старший бит VSTART
                 Бит  1             Старший бит VSTOP
                 Бит  0             Младший бит HSTART

Значение  разницы  (VSTOP  - VSTART) определяет, сколько строк спрайта
будет изображаться.

СЛОВА ДАННЫХ СПРАЙТА

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

Для  формирования  слов  данных  вам  необходима   картинка   спрайта,
показывающая  цвет  каждого  пикселя числом от 0 до 3, соответствующих
номерам цветовых  регистров  спрайта.  Например,  рассмотрим  еще  раз
изображение космического корабля:

        0000122332210000
        0001223333221000
        0012223333222100
        0001223333221000
        0000122332210000

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

        0000100110010000 <---Младшее слово
        0000011111100000 <---Старшее слово

Первое получившееся слово это как  раз  младшее  слово  данных  первой
линии  спрайта,  а второе - старшее слово данных первой линии спрайта.
Эти слова располагаются в структуре данных спрайта,  как  показано  на
рис 4-7

Каждое  двоичное  число,  формируемое  комбинацией  двух  слов  данных
соответствует   определенному   цветовому   регистру,  назначаемому  в
зависимости от канала,  которым  выводится  данный  спрайт.  Например,
нулевому каналу соответствуют регистры 17-19. Двоичные значения цветов
спрайта и их  соответствие  цветовым  регистрам  для  нулевого  канала
спрайтов показано в табл. 4-2

    Табл. 4-2: Цветовые регистры нулевого канала спрайтов.

      Двоичное число    Номер цветового регистра

          00                  Transparent
          01                      17
          10                      18
          11                      19

Двоичное  значение  0 всегда обозначает прозрачность. Сквозь этот цвет
виден задний план.

СЛОВА ОКОНЧАНИЯ ДАННЫХ

Когда вертикальная позиция луча достигает VSTOP, из  структуры  данных
спрайта  выбираются  следующие  2  слова  и записываются в управляющий
регистр спрайтов, а  не  на  экран.  Эти  два  слова  интерпретируются
железом  точно  таким-же  образом, как и те управляющие слова, которые
были записаны в начале вывода спрайта. Таким образом здесь может  быть
расположена   еще   одна   структура  данных  спрайта  для  повторного
использования этого канала. Если значение VSTART, содержащееся в  этих
словах  меньше,  чем  текущее  значение  позиции луча, спрайт не будет
использоваться повторно. Соответственно, значение  0,  содержащееся  в
обоих  словах,  обозначает  завершение  использования данного спрайта.
Более подробно повторное использование спрайтов будет обсуждено ниже.

Следующая  структура  данных  задает  спрайт  космического  корабля, с
координатами V= 65 и H=128.

SPRITE:
    DC.W   $6D60, $7200     ;VSTART, HSTART, VSTOP
    DC.W   $0990, $07E0     ;Первая пара слов данных
    DC.W   $13C8, $0FF0
    DC.W   $23C4, $1FF8
    DC.W   $13C8, $0FF0
    DC.W   $0990, $07E0
    DC.W   $0000, $0000     ;Конец данных спрайта

ИЗОБРАЖЕНИЕ СПРАЙТА

После создания структуры данных  спрайта  необходимо  вывести  его  на
экран.  Этот  раздел  описывает изображение спрайта в "автоматическом"
режиме. В этом режиме после установки канала DMA спрайта он  выводится
автоматически до достижения позиции VSTOP. Более подробно ручной режим
описан ниже.

Для  изображения  спрайта  используется  следующая  последовательность
действий:

1.  Определите, какой из 8 каналов DMA будет использоваться для вывода
данного спрайта. Убедитесь, что выбранный канал доступен.

2.  Установите  указатели  спрайта,  чтобы  система  знала, где искать
данные спрайта.

3. Включите DMA спрайта, если он не был включен до этого.

4. Для  каждого  последующего  кадра  во  время  обратного  хода  луча
изменяйте содержимое указателей спрайта.

ВНИМАНИЕ

Если  DMA спрайта выключается во время изображения спрайта (т.е. после
VSTART  но  перед VSTOP) система будет продолжать изображать последнюю
выбранную  линию. Это вызывает появление на экране вертикальных полос.
Рекомендуется  выключать  DMA  спрайтов только во время обратного хода
луча  или  в то время, когда вы уверены, что в данный момент спрайт не
изображается.

ВЫБОР КАНАЛА DMA И УСТАНОВКА УКАЗАТЕЛЕЙ

При  выборе канала DMA для использования, вы должны учитывать желаемые
цвета спрайта и его приоритет.

Каждый канал DMA имеет два указателя для  чтения  управляющих  слов  и
данных  спрайта.  Вы  должны записать адрес структуры данных спрайта в
эти указатели перед использованием спрайта  во  время  обратного  хода
луча.  Указатели  называются  SPRxPTH  и SPRxPTL, где x - номер канала
DMA. SPRxPTH содержит старшие 3 бита адреса, а SPRxPTL  -  младшие  16
бит.  Самый  младший  бит  в  SPRxPTL игнорируется т.к. данные спрайта
должны быть  выровнены  по  границе  слова.  Как  обычно,  для  записи
указателей,  вы  можете  записать  длинное  слово, содержащее адрес, в
SPRxPTH.

В  следующем  примере,  процессор  инициализирует указатель спрайта 0.
Обычно это делается коппером. Адрес спрайта - $20000.

 MOVE.L #$20000,SPR0PTH+CUSTOM ;Запись $20000 в указатель спрайта 0

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

ПЕРЕУСТАНОВКА УКАЗАТЕЛЕЙ СПРАЙТОВ

Для каждого кадра система автоматически считывает данные из  структуры
данных  спрайта  и изображает спрайт цветами, определенными в цветовых
регистрах спрайта. Если вы хотите, чтобы спрайт изображался в  течение
последовательности   кадров,   вы   должны   переписывать   содержимое
указателей спрайта во время обратного хода луча. Это необходимо потому
что во время изображения спрайтов указатели перемещаются по памяти. Си
раздел "Выбор канала DMA и установка указателей"

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

ПРИМЕР ИЗОБРАЖЕНИЯ СПРАЙТА

Этот  пример  изображает  спрайт  космического корабля в позиции V=65,
H=128.  Не  забудьте  подгрузить  файл  "hw_examples.i", находящийся в
приложении J.

; Сначала откроем простой экран      .
;
   LEA CUSTOM,a0                    ; а0 на чипсет
   MOVE.W #$1200,BPLCON0(a0)        ; Один битплан
   MOVE.W #$0000,BPL1MOD(a0)        ; Модуль = 0
   MOVE.W #$0000,BPLCON1(a0)        ; Горизонтальный скроллинг = 0
   MOVE.W #$0024,BPLCON2(a0)        ; Спрайт  имеет  приоритет  над
                                    ; экраном
   MOVE.W #$0038,DDFSTRT(a0)        ; Начало выборки данных
   MOVE.W #$00D0,DDFSTOP(a0)        ; Конец выборки данных

; Устанавливаем окно изображения

   MOVE.W #$2C81,DIWSTRT(a0)        ; Начало окна изображения
                                    ; Верт позиция в старшем байте
                                    ; Гор позиция * 2 в младшем
   MOVE.W #$F4C1,DIWSTOP(a0)        ; Конец окна изображения
                                    ; Верт позиция в старшем байте
                                    ; Гор позиция * 2 в младшем
;
; Устанавливаем цветовые регистры
;
   MOVE.W #$0008,COLOR00(a0)        ; Задний план = темно синий
   MOVE.W #$0000,COLOR01(a0)        ; Передний план = черный
   MOVE.W #$0FF0,COLOR17(a0)        ; Цвет 17 = желтый
   MOVE.W #$00FF,COLOR18(a0)        ; Цвет 18 = голубой
   MOVE.W #$0FOF,COLORl9(a0)        ; Цвет 19 = фиолетовый
;
; Перемещаем копперлист в $20000.
;
   MOVE.L #$20000,a1                ; A1 - куда
   LEA    COPPERL(pc),a2            ; A2 - откуда

CLOOP:
   MOVE.L (a2),(a1)+                ; Перемещаем длинное слово
   CMP.L  #$FFFFFFFE,(a2)+          ; Проверка на конец
   BNE    CLOOP                     ; Цикл
;
; Перемещаем спрайт в $25000.
;
   MOVE.L #$25000,a1                ; A1 - куда
   LEA    SPRITE(pc),a2             ; A2 - откуда

SPRLOOP:
   MOVE.L (a2),(a1)+                ; перемещаем длинное слово
   CMP.L  #$00000000,(a2)+          ; Проверка на конец спрайта
   BNE    SPRLOOP                   ; Цикл
;
;   Теперь  создадим  пустой спрайт в $30000. Поскольку активизируются
; все 8 спрайтов,  а мы используем только 1, оставшиеся спрайты должны
; указывать на пустой спрайт
;
   MOVE.L #$00000000,$30000         ; Записываем...
;
; Указываем копперу на копперлист

   MOVE.L #$20000,COP1LC(a0)
;
; Закрашиваем битплан $FFFFFFFF.
;
   MOVE.L #$21000,a1                ; A1 на битплан
   MOVE.W #l999,d0                  ; 2000-1(для dbf) = 8000 байт
FLOOP
   MOVE.L #$FFFFFFFF,(al)+          ; Перемещаем длинное слово $FFFFFFFF
   DBF    d0,FLOOP                  ; Цикл.
;
; Включаем DMA.
;
   MOVE.L #$20000,d0                ; Стартуем коппер с адреса $20000
   MOVE.L d0,COPJMP1(a0)            ;
   MOVE.W   #$83A0,DMACON(a0)       ; DMA  битпланов,  коппера  и
                                    ; спрайтов
   RTS                              ; Возврат
;
; Это копперлист для одного битплана и 8 спрайтов
; Битплан расположен в $21000.
; Нулевой спрайт расположен в $25000; все остальные в $30000
;
COPPERL:
   DC.W   BPL1PTH,$0002             ; Указатель на 1й битплан $21000
   DC.W   BPL1PTL,$1000
   DC.W   SPR0PTH,$0002             ; Спрайт 0 = $25000
   DC.W   SPR0PTL,$5000
   DC.W   SPR1PTH,$0003             ; Спрайт 1 = $30000
   DC.W   SPR1PTL,$0000
   DC.W   SPR2PTH,$0003             ; Спрайт 2 = $30000
   DC.W   SPR2PTL,$0000
   DC.W   SPR3PTH,$0003             ; Спрайт 3 = $30000
   DC.W   SPR3PTL,$0000
   DC.W   SPR4PTH,$0003             ; Спрайт 4 = $30000
   DC.W   SPR4PTL,$0000
   DC.W   SPR5PTH,$0003             ; Спрайт 5 = $30000
   DC.W   SPR5PTL,$0000
   DC.W   SPR6PTH,$0003             ; Спрайт 6 = S30000
   DC.W   SPR6PTL,$0000
   DC.W   SPR7PTH,$0003             ; Спрайт 7 = $30000
   DC.W   SPR7PTL,$0000
   DC.W   $FFFF,$FFFE               ; Конец копперлиста
;
; Данные для спрайта космического корабля. Его координаты V-65 и H-128
;
SPRITE:
   DC.W   $6D60,$7200               ; VSTART, HSTART, VSTOP
   DC.W   $0990,$07E0               ; Первая пара слов данных
   DC.W   $13C8,$0FF0
   DC.W   $23C4,$1FF8
   DC.W   $13C8,$0FF0
   DC.W   $0990,$07E0
   DC.W   $0000,$0000               ; Конец данных спрайта

ПЕРЕМЕЩЕНИЕ СПРАЙТОВ

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

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

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

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

В  этом  примере,  спрайт космического корабля перемещается по экрану,
изменяя направление при столкновении с границами экрана.

Структура  данных,  содержащая  VSTART  и  HSTART  находится по адресу
$25000.  VSTOP  находится  по  адресу  $25002. Для перемещения спрайта
производится   запись  по  этим  адресам.  Каждый кадр VSTART и HSTART
увеличиваются  или  уменьшаются  на 1. Затем вычисляется новая позиция
VSTOP, равная новой позиции VSTART + 6.

    MOVE.B #151,d0          ; Инициализируем горизонтальный счетчик
    MOVE.B #194,d1          ; Инициализируем вертикальный счетчик
    MOVE.B #64,d2           ; Инициализируем горизонтальную позицию
    MOVE.B #44,d3           ; Инициализируем вертикальную позицию
    MOVE.B #1,d4            ; Инициализируем горизонтальное приращение
    MOVE.B #1,d5            ; Инициализируем вертикальное приращение
;
; Ждем начала прорисовки экрана.
;
    LEA CUSTOM,a0           ; База чипсета
VLOOP:
    MOVE.B VHPOSR(a0),d6    ; Читаем вертикальную позицию луча.

; Этот код используется только для режима PAL.
    CMP.B  #$20,d6          ; Сравниваем с концом экрана PAL.
    BNE.S  VLOOP            ; Цикл, если не конец.

; Иначе используйте следующий код:
; VLOOP:

;  MOVE.W INTREQR(a0),d6    ; Читаем регистр запроса прерываний
;  AND.W  #$0020,d6         ; Маскируем все биты, кроме VBLANK
;  BEQ    VLOOP             ; Цикл, пока бит не станет 1
;  MOVE.W #$0020,INTREQ(a0) ; Ставим обратно

   ADD.B  d4,d2             ; Изменяем горизонтальную позицию
   SUBQ.B #1,d0             ; Уменьшаем горизонтальный счетчик
   BNE    L1
   MOVE.B #151,d0           ; Если 0, восстанавливаем 151
   EOR.B  #$FE,d4           ; Меняем знак приращения
L1:
   MOVE.B d2,$25001         ; Записываем новое значение HSTART
   ADD.B  d5,d3             ; Изменяем вертикальную позицию
   SUBQ.B  #1,d1            ; Уменьшаем вертикальный счетчик
   BNE    L2
   MOVE.B #194,d1           ; Если 0, восстанавливаем 194
   EOR.B  #$FE,d5           ; Меняем знак приращения

L2:
   MOVE.B d3,$25000         ; Записываем новое значение VSTART
   MOVE.B d3,d6             ; Вычисляем новое значение VSTOP
   ADD.B  #6,d6             ; В данном примере VSTOP равен VSTART+6
   MOVE.B d6,$25002         ; Записываем новый VSTOP
   BRA    VLOOP             ; Бесконечный цикл

ИСПОЛЬЗОВАНИЕ ВСЕХ 8-МИ СПРАЙТОВ

Для  использования  всех  остальных  спрайтов  надо  создать  для  них
структуры  данных и, открыв экран как в предыдущем разделе, записать в
указатели SPR1PRH и SPR1PTL адрес первого спрайта, в SPR2PTH и SPR2PTL
- адрес второго спрайта и т.д.

ПРИМЕЧАНИЕ
Когда вы включаете DMA спрайтов для одного спрайта, DMA включается для
всех  спрайтов  и  переводит их в автоматический режим. Поэтому вам не
надо повторно включать DMA.

Перед   включением   DMA   все   8  указателей  спрайтов  должны  быть
проинициализированы:  для  используемых  спрайтов  - адресами структур
данных,  а для неиспользуемых - нулевым спрайтом. Неинициализированный
спрайт может являться причиной появления на экране "духа" спрайта.

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

Кроме  того, каждая пара спрайтов использует различные регистры цвета,
как показано в таблице 4-3

  Табл. 4-3: Цветовые регистры для пар спрайтов

    Номер спрайта    Цветовой регистр
        0 и 1           17-19
        2 и 3           21-23
        4 и 5           25-27
        6 и 7           29-31

ПРИОРИТЕТ СПРАЙТОВ

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

ПРИМЕЧАНИЕ
В  главе 7 "Управление чипсетом" приоритеты спрайтов рассмотрены более
подробно.
                           ____
                        __|_  7|
                     __|_  6|__|
                  __|_  5|__|
               __|_  4|__|
            __|_  3|__|
         __|_  2|__|
      __|_  1|__|
     |   0|__|
     |____|

                      Рис. 4-8: Приоритеты спрайтов

ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ СПРАЙТОВ

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



            рис. 4-9: Пример повторного использования спрайтов

При   простом   использовании   спрайта   в   конец  структуры  данных
записываются  2 нулевых слова для остановки работы DMA. Для повторного
использования  этого  канала, эти 2 нулевых слова заменяются на полную
структуру   данных  другого  спрайта,  который  будет  изображаться  в
позиции,  ниже  текущей. Два нулевых слова размещаются после последней
структуры  данных,  выводимой  на экран при помощи данного канала DMA.
Рисунок   4-10  показывает  структуру  данных,  описывающую  картинку,
показанную на рис 4-9

                      Список спрайтов
                                            ------\    _ Данные,
               ________________________________   |  /   описывающие
 Увеличение   |________________________________|  | /    первое
  адресов     |________________________________|  |/     использование
     в         ________________________________   |      спрайта
   памяти     |________________________________|  |      по
              |________________________________|  |      вертикали
      |                    _________              |
      |                    _________              |
      |                    _________              |
      |        ________________________________   |
      |       |________________________________|  |
      |       |________________________________|  |
      |                                      -----/
      |
      |                                      -----\   _ Данные,
      |        ________________________________   |  / описывающие
      |       |________________________________|  | /  второе использ
      |       |________________________________|  |/   овавние спрайта
      |        ________________________________   |    по вертикали
      |       |________________________________|  |    Вертикальная
      |       |________________________________|  |    координата
      |                    _________              |    должна быть как
      |                    _________              |    минимум на 1
      |                    _________              |    больше,чем
     \|/       ________________________________   |    конец первого
      V       |________________________________|  |    спрайта
              |________________________________|  |\
                                                  | \
                                             -----/  \_ Слова конца
                                                        данных
                                                        завершают
                                                        использование
                                                        этого спрайта

    Рис 4-10: Структура данных для повторного использования спрайта

Единственное ограничение на повторное использование спрайта  во  время
одного  кадра  это то, что нижняя линия одного спрайта должна отстоять
как минимум на  1  пиксель  от  верхней  линии  другого  спрайта.  Это
необходимо  потому,  что  на каждый канал DMA отводится только 2 цикла
шины, которые нужны для выборки управляющих слов второго спрайта.

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

    LEA CUSTOM,a0
    MOVE.W #$0F00,COLOR17(a0)       ; Цвет 17 красный
    MOVE.W #$0FF0,COLOR18(a0)       ; Цвет 18 желтый
    MOVE.W #$0FFF,COLORl9(a0)       ; Цвет 19 белый
SPRITE:
    DC.W   $6D60,$7200
    DC.W   $0990,$07E0
    DC.W   $13C8,$0FF0
    DC.W   $23C4,$1FF8
    DC.W   $13C8,$0FF0
    DC.W   $0990,$07E0
    DC.W   $8080,$8D00             ; VSTART, HSTART, VSTOP для второго
    DC.W   $1818,$0000             ; спрайта
    DC.W   $7E7E,$0000
    DC.W   $7FFE,$0000
    DC.W   $FFFF,$2000
    DC.W   $FFFF,$2000
    DC.W   $FFFF,$3000
    DC.W   $FFFF,$3000
    DC.W   $7FFE,$1800
    DC.W   $7FFE,$0C00
    DC.W   $3FFC,$0000
    DC.W   $0FF0,$0000
    DC.W   $03C0,$0000
    DC.W   $0180,$Ї0000
    DC.W   $0000,$0000              ; Конец данных спрайта

ПЕРЕКРЫВАЮЩИЕСЯ СПРАЙТЫ

Для  более  сложных  или  более  больших  объектов  можно использовать
перекрывающиеся   спрайты.   Это  значит,  что  спрайты  просто  имеют
одинаковые  или  близкие  координаты.  Из-за существования приоритетов
спрайтов один спрайт изображается  перед  другим.  Следовательно,  при
конструировании экрана с перекрывающимися спрайтами проследите,  чтобы
передний спрайт имел меньший номер, чем задний. Например, на рис 4-11,
клетка изображается спрайтом с меньшим номером, чем обезьяна.



               Рис. 4-11: Перекрывающиеся спрайты

Вы можете создавать более широкие изображения, просто размещая спрайты
рядом  друг  с  другом.  Рисунок  4-12  показывает спрайт космического
корабля и способ увеличения его в 2 раза, используя 2 спрайта.

     (128,65)
        o_____________________
        |     _|        |_    |
        |   _|            |_  |
        |  |_              _| |
        |    |_          _|   |
        |______|________|_____|

     (128,65)              (144,65)
        o_____________________o_____________________
        |         |           |          |          |
        |       __|           |          |__        |
        |      |              |             |       |
        |    __|              |             |__     |
        |   |                 |                |    |
        |   |__               |              __|    |
        |      |              |             |       |
        |      |__            |           __|       |
        |         |           |          |          |
        |_________|___________|__________|__________|
               Sprite 0               Sprite 1

             Рис 4-12: Размещение спрайтов рядом.

ОБЪЕДИНЕННЫЕ СПРАЙТЫ

Вы  можете  создавать  спрайты,  имеющие  15  цветов  плюс прозрачный,
используя объединение спрайтов. Для этого необходимо:

-  Используя 2 канала на спрайт, создать спрайты одинакового размера и
разместить их в одинаковых координатах.
-  Установить  бит,  называемый  ATTACH  в  управляющем  слове второго
спрайта.

15  цветов  выбираются  из  полного  диапазона   цветовых   регистров,
доступных  спрайтам:  с  17  до 31. Дополнительные цвета получаются за
счет того, что каждый пиксель состоит из 4 бит, а  не  из  2х,  как  в
нормальных, необъединенных спрайтах. Каждый спрайт в паре объединенных
спрайтов  добавляет  2  бита  к  цвету  спрайта.  Например,  если   вы
используете  объединенные  спрайты  номер  0  и  1,  слова данных этих
спрайтов для первой строки объединяются в  данные  для  первой  строки
объединенного спрайта.

Спрайты могут объединяться в следующих комбинациях:

    Спрайт 1 и спрайт 0
    Спрайт 3 и спрайт 2
    Спрайт 5 и спрайт 4
    Спрайт 7 и спрайт 6

Любой  или  все  эти  объединенные  спрайты  могут быть активизированы
одновременно.  Например,  добавим больше цветов к спрайту космического
корабля, используя объединение спрайтов 0 и 1. На рисунке изображено 5
цветов плюс прозрачный.

    0000154444510000
    0001564444651000
    0015676446765100
    0001564444651000
    0000154444510000

Для  правильного  выбора  цветов спрайта первая строка требует 4 слова
данных, показанных в табл. 4-4

                            Номер пикселя
        15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
----------------------------------------------------------------------
Слово 1  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
Слово 2  0   0   0   0   0   1   1   1   1   1   1   0   0   0   0   0
Слово 3  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
Слово 4  0   0   0   0   1   1   0   0   0   0   1   1   0   0   0   0

Спрайт  с  более  высоким  номером (в нашем примере, номер 1) содержит
старшие  (левые)  биты  двоичного  номера цвета, следовательно, слова,
приведенные  выше,  записываются в структуры данных спрайтов следующим
образом:

    Слово 1 Спрайт 1 Старшее слово
    Слово 2 Спрайт 1 Младшее слово
    Слово 3 Спрайт 0 Старшее слово
    Слово 4 Спрайт 0 Младшее слово

Расположение  слов  в  памяти  показано  на рис 4-7. Запомните, данные
содержатся в двух структурах данных

Получающееся двоичное число от 0 до 15 указывает на один  из  цветовых
регистров 17-31 как показано в табл. 4-5

    Табл. 4-5: Цветовые регистры объединенных спрайтов

    Десятичный Двоичный  Номер цветового
      номер     номер        регистра

        0       0000           16 *
        1       0001           17
        2       0010           18
        3       0011           19
        4       0100           20
        5       0101           21
        6       0110           22
        7       0111           23
        8       1000           24
        9       1001           25
       10       1010           26
       11       1011           27
       12       1100           28
       13       1101           29
       14       lll0           30
       15       1111           31

* Не используется. Изображается прозрачный пиксель

Объединение  спрайтов  работает только тогда, когда в структуре данных
нечетного  спрайта  во  втором  управляющем  слове,  включен  7й бит -
ATTACH.  В  нашем  примере  надо включить 7й бит во втором управляющем
слове первого спрайта.

При   передвижении   объединенных  спрайтов  необходимо  сохранять  их
относительное расположение. Если произойдет сдвиг, то спрайты вернутся
назад  в  нормальный  режим  (3  цвета  +  прозрачный), при этом цвета
спрайтов  будут  отличаться  от  цветов  этих-же спрайтов в нормальном
режиме.  Спрайт  с  меньшим  номером будет использовать цвета 17-19, а
спрайт с большим номером - 20, 24 и 28.

Следующая  структура  шестицветного космического корабля состоит из 2х
объединенных спрайтов.

SPRITE0:
    DC.W    $6D60,$7200     ;VSTART = 65, HSTART = 128
    DC.W    $0C30,$0000     ;Первое слово данных
    DC.W    $1818,$0420
    DC.W    $342C,$0E70
    DC.W    $1818,$0420
    DC.W    $0C30,$0000
    DC.W    $0000,$0000     ;Конец первого спрайта
SPRITE1:
    DC.W    $6D60,$7280     ;То-же, что и в первом спрайте + attach
    DC.W    $07E0,$0000     ;Первое слово данных второго спрайта
    DC.W    $0FF0,$0000
    DC.W    $1FF8,$0000
    DC.W    $0FF0,$0000
    DC.W    $07E0,$0000
    DC.W    $0000,$0000     ;Конец второго спрайта

РУЧНОЙ РЕЖИМ

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

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

Если данные не изменяются, результатом будет вертикальная полоса. Если
данные  перезагружаются  каждую  строку,  может  быть  создано сложное
изображение.

Изображение спрайта может быть остановлено записью в регистр  SPRxCTL.
Записью   в   регистр   SPRxPOS   можно   вручную  передвигать  спрайт
горизонтально, даже во время автоматического вывода спрайта.

ПОДРОБНОСТИ РАБОТЫ ЖЕЛЕЗА

Спрайты  формируются блоком, показанном на рис. 4-13. На нем показано,
как пары слов данных становятся пикселами, изображаемыми на экране.

Элементы цикла формирования спрайта объяснены ниже.

-  Регистры  данных  спрайта.  Регистры  SPRxDATA  и SPRxDATB содержат
битовую структуру, определяющую одну горизонтальную строку спрайта для
каждого  из  8  спрайтов.  Строка  спрайта  имеет ширину 16 пикселей и
задается двумя словами, что дает три цвета плюс прозрачный.

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

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

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

- Последовательные видео данные спрайта. Данные спрайта  идут  в  блок
приоритетов  для  обработки  указанных  приоритетов  между спрайтами и
плейфилдами. Более подробно установка приоритетов рассмотрена в  главе
7 "Управление чипсетом"

- Регистры позиции спрайтов. Эти регистры, называемые SPRxPOS содержат
значение  горизонтальной (X) и вертикальной (Y) позиции для каждого из
8 спрайтов.

-  Управляющие  регистры.  Эти  регистры,  называемые SPRxCTL содержат
позицию останова каждого спрайта, и признак объединения спрайтов.

- Счетчик луча. Он дает системе данные о текущем положении видео луча,
рисующего изображение.

-  Компаратор.  Это  устройство  сравнивает  значение  счетчика луча с
значением Y координаты, записанным в регистре SPRxPOS. Если луч достиг
позиции,  в которой должен начинаться спрайт, компаратор выдает сигнал
параллельно-последовательному преобразователю и начинается изображение
спрайта.


      _________________
     |Счетчик луча     |
     |(Гориз.  позиция)|                          ____________________
     |_________________|                         |загрузка SPRxDATA   |
             \  /                                |  (68000 or DMA)    |
      ________\/_______                          |____________________|
     |                 | Равно                             |
     |   Компаратор    |______        ___________________  |
     |_________________|      |      |загрузка SPRxPOS   | |
              /\      ________|______|  (68000 or DMA)   | |
      _______/__\____|_       |      |___________________| |
     |                 |      |                            |
     | SPRxPOS (Гориз.)|      |                            |
     |_________________|      |   <-"Включение спрайта"->  |
              /\      ________|____________________________o
 ____________/  \    |        |___            _______      |
|                |   |       | И  |-|        |       |     |
| ___________    |   |        \__/  |--------|Q     S|-----|
||           \  /    |         |             |       |   _____________
||    ________\/_____|_        |         ----|Q     R|--|SPRxCTL load |
||   |                 |       |             |_______|  |   decode    |
||   |    SPRxDATA     |       |                        |(68000 or DMA|
||   |_________________|   ____o                        |_____________|
||              \  /      |    |
||         ______\/_______|_   |           _____   ______________
||    ____|параллельн-послед|  |                | |Последов видео|
|| __|__  |преобразователь  |-----------------> | |данные спрайта|
||  ___   |_________________|  |                | |              |
||   _     _________________   |                | |Вывод данных в|
||        |параллельн-послед|  |                | |блок видео    |
||        |преобразователь  |-----------------> | | приоритетов  |
||        |_________________|  |           _____| |______________|
||            /\          |    |
||    _______/__\______   |____|
||   |                 |
||   |    SPRxDATB     |
||   |_________________|         ____________________
||        /\        ^           |Загрузка SPRxDATB   |
||       /  \       |___________|(68000 или DMA)     |
||_______|  |                   |____________________|
| __________|
||
||______________________________________________________________________
|_______________________________________________________________________
             Шина данных


                  Рис. 4-13: Блок формирования спрайтов

Теперь рассмотрим работу по формированию спрайтов более подробно:

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

-  Запись  в регистр данных А включает компаратор. Это разрешает вывод
на  экран,  когда  горизонтальная  позиция  видео  луча  сравняется со
значением в регистре координат.

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

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

-  Данные  в  регистрах  данных  не изменяются до тех пор, пока они не
перепишутся либо вручную, либо с помощью DMA.

Устройства,  описанные  выше,  выполняют  автоматическое   изображение
спрайта   следующим  образом:  При  включении  автоматического  режима
указатели спрайта (состоящие из SPRxPTL и  SPRxPTH)  используются  для
чтения  первых 2х слов из структуры данных спрайта. Эти слова содержат
координаты начала и конца спрайта и записываются в регистры SPRxPOS  и
SPRxCTL.  После  этого  указатели  указывают  на  первое  слово данных
(младшее слово первой строки спрайта)

Запись  в  регистр  SPRxCTL  выключает  спрайт.  Теперь канал DMA ждет
достижения  вертикальным  счетчиком  луча значения, равного VSTART (по
Y),  содержащегося  в  регистре  SPRxPOS. Когда эти значения совпадут,
система включит доступ к данным спрайта.

Канал  DMA  спрайта проверяет содержимое VSTOP (координату линии после
последней  линии  спрайта,  в  регистре  SPRxCTL) и VSTART (в регистре
SPRxPOS)  для  расчета количества линий, которое необходимо выбрать из
памяти.  На  каждую  строку  выбирается  по  2 слова, и записываются в
регистры данных спрайта. Первое слово сохраняется в регистре SPRxDATA,
а второе слово в SPRxDATB.

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

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

Таким  образом при автоматическом выводе спрайта под управлением DMA в
течение каждой строки экрана выводится одна линия спрайта.

ОБОБЩЕНИЕ РЕГИСТРОВ СПРАЙТА

Система  содержит  8  наборов регистров, отвечающих за спрайты. Каждый
набор  состоит  из  5  регистров.  Здесь  будут  рассмотрены  регистры
нулевого  спрайта, поскольку все остальные отличаются только номером в
названии регистра.

УКАЗАТЕЛИ

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

SPR0PTH и SPR0PTL

Эта пара регистров содержит 32х битный адрес структуры данных нулевого
спрайта.

Для остальных спрайтов имена регистров указателей следующие:

    SPR1PTH SPR1PTL
    SPR2PTH SPR2PTL
    SPR3PTH SPR3PTL
    SPR4PTH SPR4PTL
    SPRSPTH SPRSPTL
    SPR6PTH SPR6PTL
    SPR7PTH SPR7PTL

УПРАВЛЯЮЩИЕ РЕГИСТРЫ

SPR0POS

Это регистр позиции нулевого спрайта. Слово, записанное в этот регистр
задает  координаты  изображения  верхнего  левого  угла  спрайта.  Это
значит,  что старший бит первого слова данных будет размещен на экране
в этих координатах.

ПРИМЕЧАНИЕ
Спрайты  могут  размешаться  на координатной сетке 320х200 или 320х256
для  PAL.  Разрешение спрайта не зависит от разрешения плейфилда.

Распределение бит этого регистра следующее:

- Биты 15-8 определяют вертикальную стартовую позицию: V7-V0
- Биты 7-0 определяют горизонтальную стартовую позицию: H8-H1

ПРИМЕЧАНИЕ
Обычно  этот  регистр  используется только каналом DMA, за исключением
организации изображения спрайтов в ручном режиме.

SPR0CTL

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

Распределение бит этого регистра следующее:

- Биты 15-8 содержат вертикальную координату конца спрайта,  V7-V0.
- Бит 7 - бит ATTACH. Этот бит имеет значение только  для  спрайтов  с
нечетными   номерами.   Он  показывает,  что  этот  спрайт  в  паре  с
соответствующим ему четным спрайтом (0 и 1, 2 и 3,  4  и  5,  6  и  7)
образует  объединенный  15-ти цветный спрайт. Нечетный спрайт содержит
старшие биты двоичного кода цвета спрайта

В  объединенном режиме объединенные спрайты обычно перемещаются вместе
под   управлением  процессора.  Тем  не  менее,  объединенные  спрайты
сохраняют способность независимого перемещения.

- Биты 6-3 зарезервированы для дальнейшего использования (должны  быть
равны 0)
- Бит 2 - бит V8 вертикальной стартовой позиции
- Бит 1 - бит V8 вертикальной позиции конца спрайта
- Бит 0 - бит H0 горизонтальной стартовой позиции

Для остальных спрайтов имена управляющих регистров следующие:

    SPR1POS SPR1CTL
    SPR2POS SPR2CTL
    SPR3POS SPR3CTL
    SPR4POS SPR4CTL
    SPR5POS SPRSCTL
    SPR6POS SPR6CTL
    SPR7POS SPR7CTL

РЕГИСТРЫ ДАННЫХ

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

    SPR0DATA, SPR0DATB регистры данных для спрайта 0
    SPR1DATA, SPR1DATB регистры данных для спрайта 1
    SPR2DATA, SPR2DATB регистры данных для спрайта 2
    SPR3DATA, SPR3DATB регистры данных для спрайта 3
    SPR4DATA, SPR4DATB регистры данных для спрайта 4
    SPR5DATA, SPR5DATB регистры данных для спрайта 5
    SPR6DATA, SPR6DATB регистры данных для спрайта 6
    SPR7DATA, SPR7DATB регистры данных для спрайта 7

ОБОБЩЕНИЕ ЦВЕТОВЫХ РЕГИСТРОВ СПРАЙТОВ

Слова  данных спрайта используются для выбора цвета пикселя спрайта из
системных регистров цвета как показано в следующих таблицах.

Для   простых   спрайтов   цвета  берутся  из  следующих  регистров  в
зависимости  от  номера спрайта и комбинации бит, определяемой словами
данных спрайта.

     Табл 4-6: Цветовые регистры для простых спрайтов

     Простой спрайт             Цветовой
    Спрайт      Значение        регистр

    0 или 1       00         Не используется *
                  01               17
                  10               18
                  11               19

    2 или 3       00         Не используется *
                  01               21
                  10               22
                  11               23

    4 или 5       00         Не используется *
                  01               25
                  10               26
                  11               27

    6 или 7       00         Не используется *
                  01               29
                  10               30
                  11               31

* Не используется. Изображается прозрачный пиксель.

Для объединенных спрайтов цвета выбираются из следующих регистров:

    Табл. 4-7: Цветовые регистры для объединенных спрайтов

         ОБЪЕДИНЕННЫЕ СПРАЙТЫ
                         Цветовой
    Значение             Регистр

    0000         Используется прозрачный цвет
    0001                    17
    0010                    18
    0011                    19
    0100                    20
    0101                    21
    0110                    22
    0111                    23
    1000                    24
    1001                    25
    1010                    26
    1011                    27
    1100                    28
    1101                    29
    1110                    30
    1111                    31

ВЗАИМОДЕЙСТВИЕ МЕЖДУ СПРАЙТАМИ И ДРУГИМИ ОБЪЕКТАМИ

В  главе  7,  "Управление  чипсетом"  рассказывается  как  назначаются
приоритеты  между  плейфилдами  и  спрайтами  и  как  можно обнаружить
столкновения между плейфилдами и спрайтами и между плейфилдами.

 


НОМЕ