THE
COMPLETE AMIGA HARDWARE
REFERENCE MANUAL
Глава 3 ЭКРАНЫ ВВЕДЕНИЕ Экран монитора состоит из двух основных частей, экранов, которые иногда называют задними планами и спрайтов, под которыми подразумеваются легко перемещаемые графические объекты. Эта глава описывает как сформировать экран прямым программированием железа. Примечание переводчика: в английском варианте используется термин playfield, который можно перевести как 'игровое поле'. В целях улучшения читабельности в русском варианте используется термин 'экран' ОБ ЭТОЙ ГЛАВЕ Эта глава начинается с краткого обзора возможностей экрана, включая определения некоторых фундаментальных терминов, и продолжается следующими главными темами: - Формирование простого 'основного' экрана, такого же по размерам, как и экран дисплея. Эта глава также содержит концепцию и фундаментальные сведения для формирования любого экрана. - Формирование экрана в режиме dual-playfield, в котором один план накладывается на другой. Эта процедура немного отличается от предыдущей. - Формирование экранов различных размеров и изображение только части большого экрана. - Скроллирование экранов вертикально и горизонтально. - Дополнительные темы помогут Вам использовать экраны в специальных ситуациях. Для получения информации о движущихся спрайтах смотрите главу 4, 'Спрайты'. Существуют также объекты, движущиеся по экрану и являющиеся частью экрана. Для движения части экрана используется техника, называемая экранной анимацией, которая описана в главе 6 'Блиттер' СТРОЕНИЕ ЭКРАНА Амига использует растровую технологию для изображения экранов на мониторе. Картинка, которую Вы видите состоит из горизонтальных линий, расположенных одна под другой. Каждая из этих линий состоит из точек. Вы создаете изображение на экране, определяя в памяти один или несколько битпланов и заполняя их '1' или '0'. Комбинации из нулей и единиц определяют цвет выводимой на экран точки. Каждая линия представляется одним перемещением электронного луча, который рисует картинку там, где проходит. ________________________________________ | | | | | --->----->----->----->----->---->--- | | | ____________________________________ | | | ____________________________________ | | | ____________________________________ | | | __________________ | | | __________________ | | | | | | ЭКРАН МОНИТОРА | | | __________________ | | | __________________ | | | ____________________________________ | | | ____________________________________ | | | _____________________________________ | | | ____________________________________ | \ / |________________________________________| Рис 3-1: Как рисуется картинка на экране ЭКРАН МОНИТОРА Видео луч рисует каждую линию слева направо. Весь экран рисуется сверху вниз, линия за линией. Видео луч рисует 262 линии сверху вниз, из которых 200 видимых на экране NTSC. В системе PAL луч рисует 312 линий, из них 256 видимых. Полный набор видимых линий (262/NTSC или 312/PAL) называется кадром. Время прорисовки кадра, т.е. время требуемое лучу для прорисовки всех линий равно 1/60 секунды для NTSC и 1/50 секунды для PAL. Между рисованием кадров видео луч выключается и перемещается вверх экрана для рисования следующего кадра. Область экрана определяется как сетка пикселей. Пиксель это простейший элемент картинки, наименьшая адресуемая часть экрана. Рисунок ниже показывает что такое пиксель и как они формируют экран. _______________________ | _ | | |_| <----------------------- Картинка состоит из множества | _ | элементов. Каждый элемент | _|_|_ | называется пиксель | |_|_|_| | | |_|_|_| <------------- Пиксели объединяются вместе для |_______________________| построения больших объектов ___________________________ ____________________________ | | | | | | | | | <------ 320 пикселей ---> | | <------ 640 пикселей ----> | | | | | | | | | | | | | | | | | |___________________________| |____________________________| В нормальном разрешении В высоком разрешении горизонтальная линия состоит горизонтальная линия состоит из 320 пикселей из 640 пикселей Рис 3.2: Что такое пиксель? Амига предлагает выбор горизонтального и вертикального разрешения. Горизонтальное разрешение может быть низкое и высокое. Вертикальное может быть в режиме интерлейса и не интерлейса. - В низком разрешении, нормальный экран имеет ширину 320 пикселей. - В высоком разрешении, нормальный экран имеет ширину 640 пикселей при том-же физическом размере экранной области. - В неинтерлейсном режиме экран имеет высоту 320/PAL и 200/NTSC. - Интерлейсный режим дает соответственно 512 и 400 линий. Эти режимы могут комбинироваться, например возможен интерлейсный экран в высоком разрешении. Размеры в предыдущем параграфе относятся к так называемым 'нормальным'или номинальным значениям, которые рекомендуются к использованию. Вообще, Вы можете показывать бОльшие экраны, максимальные значения даются в разделе 'Битпланы и окна всех размеров'. Также, размер экрана в памяти часто больше, чем изображается на экране монитора. Вы выбираете, какую часть большой картинки в памяти показать на мониторе. Экраны, которые выше, чем видимое окно могут плавно скроллироваться вверх или вниз. Экраны, которые шире, могут скроллироваться горизонтально справа налево или слева направо. Это описано в разделе 'Скроллирование экранов' Графическая система Амиги позволяет использовать 32 различных цвета на отдельном экране. Вы можете задавать цвет каждого пикселя, устанавливая соответствующие ему биты. Экран, сформированный подобным образом называется битмапом. Например, в двухцветном экране, цвет каждого пикселя определяется установкой одного бита. Если бит 0, пиксель окрашивается в один цвет, если 1 - в другой. Для 4х цветного экрана вы задаете в памяти 2 битплана. Когда экран показывается, битпланы накладываются друг на друга, что позволяет использовать 2 бита для каждого пикселя. Таким образом Вы можете определить до 5-ти битпланов. Экраны, состоящие из 3х, 4х или 5-ти битпланов позволяют выбирать соответственно 8, 16 или 32 цвета. Цвет пикселя всегда определяется двоичной комбинацией бит, из которых он состоит. Когда система объединяет битпланы для изображения, комбинацией бит формируется номер цветового регистра. Этот метод называется индексацией. Амига имеет 32 цветовых регистра, содержащих цвета, определяемые пользователем из палитры 4096 цветов. Рисунок 3-3 показывает как комбинации битпланов формируют номер цветового регистра, определяющего цвет пикселя. _______________________________ | _ | |_| Битплан 5 | ____________________________ __ | | _ |0 |_ -------- | | |_| Битплан 4 |_|0 |_ | | | _________________________ |_|1 |_ \__ См. ниже | | | _ |_|1 |_ / | | | |_| Битплан 3 |_|1 | | | | | ______________________ |__| ----- | | | _ | | | |_| Битплан 2 | | | ___________________ | | | _ | | | |_| Битплан 1 | | | | | ^ | | | | | | \-------------- Один пиксель Биты из планов 5,4,3,2,1 Цветовые регистры _______________________ | | 00000 | | |_______________________| | | 00001 | | |_______________________| | | 00010 | | |_______________________| | | 00011 | | |_______________________| | | 00100 | | |_______________________| | | ----- | | | | | | | | | ----- | | | | | | | | | ----- | \|/ | |_______________________| | | 11000 | | |_______________________| | | 11001 | | |_______________________| | | 11010 | | |_______________________| | | 11011 | | |_______________________| | | 11100 | | |_______________________| | | 11101 | | |_______________________| | | 11110 | | |_______________________| | | 11111 | | |_______________________| Рис 3-3: Образование цветов из битпланов Значения битпланов с более высокими номерами располагаются в старших разрядах двоичного числа. Как показано на рис 3-4 младший битплан формирует правую цифру номера цвета, следующий битплан - вторую цифру и т.д. Пример для 4х пикселей a b c d 1 1 0 0 Данные битплана 5 старший разряд 1 0 1 0 Данные битплана 4 1 0 0 1 Данные битплана 3 0 1 1 1 Данные битплана 2 0 0 1 0 Данные битплана 1 младший разряд d Значение 6 COLOR6 c Значение 11 COLOR11 b Значение 18 COLOR18 a Значение 28 COLOR28 Рис 3-4: Значимость битпланов в номере цветового регистра Вы также можете определить два раздельных экрана, в каждом из которых до 3 битпланов. Каждый из этих двух экранов использует отдельные 8 цветов. Этот режим называется dual-playfield. ФОРМИРОВАНИЕ ПРОСТОГО ЭКРАНА Эта глава описывает, как прямым доступом к регистрам железа сформировать простой экран размером с видео-область. Это значит, что экран по размерам равен текущему окну видео области. При этом остается маленький бордюр между экраном и краем видео-окна. Для создания экрана Вам необходимо определить следующие параметры: - Высоту, ширину экрана и размер видео-окна (где будет изображаться экран) - Цвет каждого пикселя на экране - Горизонтальное разрешение - Вертикальное разрешение или интерлейс - Выборку данных и модуль, которые указывают системе, сколько данных размещать на горизонтальной линии и как переносить данные из памяти на экран. Кроме этого, Вам необходимо выделить память для хранения экрана, установить указатели, которые покажут системе, где искать данные и (если хотите) написать программу для коппера для руководства изображением экрана. ШИРИНА И ВЫСОТА ЭКРАНА Для создания экрана одного размере с окном, Вы можете использовать разрешение 320 или 640 пикселей по горизонтали и по вертикали 200/400 для NTSC или 256/512 для PAL в зависимости от выбора интерлейса ЦВЕТА И БИТПЛАНЫ Назначение цветов экрана: 1. Решить, сколько цветов Вам нужно и выбрать цвета для каждого пикселя. 2. Загрузить цвета в цветовые регистры. 3. Выделить память для битпланов и установить указатели на каждый битплан. 4. Записать данные в каждый битплан для получения нужных цветов. Таблица 3-1 показывает, сколько битпланов необходимо для различного количества цветов. Число Число цветов Битпланов 1- 2 1 3- 4 2 5- 8 3 9-16 4 17-32 5 Табл 3-1: Цвета на простом экране. ТАБЛИЦА ЦВЕТОВ Таблица цветов содержит 32 регистра и вы можете загружать различные цвета в каждый регистр. Табл 3-2: Содержимое таблицы цветов Название регистра Размер Описание COLOR00 12 бит Фоновый цвет COLOR01 12 бит Цвет 1 (например, это второй цвет двухцветного экрана) COLOR02 12 бит Цвет 2. ... COLOR31 12 бит Цвет 31. COLOR00 зарезервирован для цвета фона. Этот цвет отображается в любом месте, где нет никаких других объектов, а также за пределами окна экрана, в области бордюра. ПРИМЕЧАНИЕ Если Вы используете генлок для ввода видео-изображения с видео-камеры, то фоновый цвет становится прозрачным и вместо него изображается внешний видео-сигнал. 12 бит цветового регистра позволяют Вам определить любой цвет из палитры 4096 цветов для каждого регистра цвета, как показано в табл. 3-3 + Табл 3-3: Содержание регистров цвета Биты Биты 15 -12 Не используются Биты 11 - 8 Красный Биты 7 - 4 Зеленый Биты 3 - 0 Синий Таблица 3-4 показывает несколько примеров задания цветов. В конце главы есть более подробный список. Табл 3-4: Примеры задания цветов Содержимое Цвет регистра цвета $fff Белый $6fe Небесно голубой $db9 Рыжевато-коричневый $000 Черный+ Пример загрузки регистров цвета LEA CUSTOM,a0 ; Базовый адрес регистров чипсета MOVE.W #$FFF,COLOR00(a0) ; Белый цвет в регистр 0 MOVE.W #$6FE,COLOR01(a0) ; Небесно-голубой в регистр 1 ПРИМЕЧАНИЕ Цветовые регистры - только для записи. Вы можете узнать содержимое каждого регистра только посмотрев на экран. Поэтому желательно иметь копию значений регистров в памяти и обновлять ее одновременно с записью в регистры. Таким образом вы всегда сможете узнать, какие цвета содержатся в каждом из регистров. ВЫБОР КОЛИЧЕСТВА БИТПЛАНОВ После выбора количества цветов и соответствующего количества битпланов, Вы должны сказать системе, сколько битпланов Вы используете. Вы выбираете количество битпланов записью в регистр BPLCON0 (Bit Plane Control Register 0) Биты, ответственные за это - 14, 13, и 12, называются BPU2, BPU1, и BPU0 ("Bit Planes Used"). Таблица 3-5 показывает значения, записываемые в эти биты и соответствующее им количество битпланов. Табл 3-5: Установка числа битпланов Число Имена Значение битпланов битпланов 000 Нет * 001 1 План 1 010 2 Планы 1 и 2 011 3 Планы 1 - 3 100 4 Планы 1 - 4 101 5 Планы 1 - 5 110 6 Планы 1 - 6 ** 111 7 Значение не используется. * Показывается только фоновый цвет; Экран не виден. ** Шестой битплан используется только в режимах dual-playfield и HAM, описанных в разделе 'Дополнительные темы' ПРИМЕЧАНИЕ Биты в регистры BPLCON0 не могу быть установлены отдельно. Для установки одного бита Вы должны перезагрузить весь регистр. Следующий пример показывает, как установить два битплана в низком разрешении. MOVE.W #$2200,BPLCON0+CUSTOM ; Запись Поскольку регистр BPLCON0 используется также для установки других характеристик экрана и биты не могут быть установлены отдельно, этот пример также устанавливает другие параметры (полный список которых будет приведен позже) - Режим HAM выключен. - Отдельный экран включен - Используется один битплан. - Включен цветной видео вывод. (Не применяется на всех моделях.) - Звук генлока выключен. - Световое перо выключено. - Интерлейс выключен. - Внешняя синхронизация выключена. (генлок) ВЫБОР ГОРИЗОНТАЛЬНОГО И ВЕРТИКАЛЬНОГО РАЗРЕШЕНИЯ Стандартный телевизионный экран больше подходит для использования низкого разрешения (320 пикселей в горизонтальной линии). RGB мониторы могут работать и в высоком разрешении (640 пикселей в горизонтальной линии) Если Вы создали какой-либо объект в низком разрешении, а затем показали его на экране в высоком разрешении, то его ширина будет только половина от нормальной. Для установки горизонтального разрешения используется бит 15 HIRES в регистре BPLCON0 Высокое разрешение - 1 в бит 15. Низкое разрешение - 0 в бит 15. В высоком разрешении Вы можете использовать до 4х битпланов и, следовательно до 16 цветов. Режим интерлейса позволяет удвоить вертикальное разрешение по сравнению с нормальным режимом. Это достигается удвоением числа линий, появляющихся на экране. Следующая таблица показывает число линий в нормальном, не растянутом экране Табл 3-6: Число линий в нормальном экране NTSC PAL ----------------------- Без интерлейса 200 256 С интерлейсом 400 512 В режиме интерлейса попеременно изображаются два экранных поля линия 1________________________ | _________________________ |\ | _________________________ | \ | _________ | \ | Поле 1 | \ __________________ | _________ | \ |___|______________|___Линия 1 | _________________________ | >|___|______________|___ | _________________________ | / | | | Линия 2 |___________________________| / | |Экран монитора| / | | (400 линий) | Линия 1________________________ / | | | | _________________________ | |__\|/_____________| | _________________________ | | _________ | | Поле 2 | (Используется то-же физическое | _________ | пространство, что и для не | _________________________ | интерлейсного экрана в 200 | _________________________ | линий) |___________________________| Рис 3-5: Интерлейс Использование интерлейсного режима требует немного дополнительных установок регистров (как Вы увидите дальше в этой главе), он дает хорошие результаты для определенных эффектов. Рассмотрим диагональную линию на рис 3-6, как она выглядит в интерлейсном и не интерлейсном режиме. Интерлейсный режим смягчает 'лестничный эффект' по краям изображения. РИС 3-6: ЭФФЕКТ ИНТЕРЛЕЙСА НА КРАЯХ ОБЪЕКТА Когда Вы используете блиттер для изображения линий или полигонов на интерлейсном экране, он рассматривается как один экран, а не как четное и нечетное поле, следовательно можно свободно использовать преимущества интерлейса при сглаживании краев изображения. Для установки режима интерлейса служит бит 2, LACE в регистре BPLCON0: Интерлейс - 1 в 2. Не интерлейс - 0 в 2. Как объяснено выше, в разделе 'Установка количества битпланов' биты в BPLCON0 не могут устанавливаться отдельно. Следующий пример показывает как установить интерлейсный режим в высоком разрешении. MOVE.W #$A204,BPLCON0+CUSTOM ; Запись Поскольку регистр BPLCON0 используется также для установки других характеристик экрана , этот пример также устанавливает другие параметры: - Включено высокое разрешение - Режим HAM выключен. - Используются два битплана. - Включен цветной видео вывод. - Отдельный экран включен - Звук генлока выключен. - Световое перо выключено. - Интерлейс включен. - Внешняя синхронизация выключена. (генлок) Количество памяти, необходимой для каждого битплана зависит от выбранного разрешения, поскольку экраны в высоком разрешении или интерлейсе содержат больше данных и следовательно занимают больше памяти. ВЫДЕЛЕНИЕ ПАМЯТИ ДЛЯ БИТПЛАНОВ После того, как Вы установили количество битпланов и их разрешение необходимо выделить память для всех битпланов. Если Вы работаете под AmigaOS, используйте системные вызовы, такие, как AllocMem() для резервирования памяти. Если Вы взяли машину под свой контроль, просто резервируйте память для битпланов. Затем установите указатели BPLxPTH/BPLxPTL на начало каждого битплана. Начало находится в верхнем левом углу битплана. Таблица 3-6 показывает, сколько памяти необходимо для битпланов различных размеров. Вы должны сбалансировать желаемый размер и количество цветов битпланов и имеющуюся свободную память. Таб 3-7: Требования к памяти для битпланов, NTSC Размер Режимы Длина, байт 320 X200 Низкое, без интерлейса 8,000 320 X400 Низкое, интерлейс 16,000 640 X200 Высокое, без интерлейса 16,000 640 X400 Высокое, интерлейс 32,000 Таб 3-8: Требования к памяти для битпланов, PAL Размер Режимы Длина, байт 320 X256 Низкое, без интерлейса 8,192 320 X512 Низкое, интерлейс 16,384 640 X256 Высокое, без интерлейса 16,384 640 X512 Высокое, интерлейс 32,768 ПРИМЕР РАЗМЕРА БИТПЛАНА ДЛЯ NTSC Например, в NTSC для нормального экрана, не интерлейсного, в низком разрешении размером 320х200 точек, каждая линия занимает 40 байт (320 деленное на 8 = 40) Умножаем на 200 линий и получаем 8000 байт на битплан. Экран, состоящий из двух битпланов, требует 16000 байт. Память для каждого битплана должна быть непрерывной, следовательно у вас должно быть два блока по 8000 байт. Рисунок 3-7 показывает организацию блока памяти в 8000 байт в виде 200 линий по 40 байт в каждой. _____________ _____________ | | | | | | | | _____________________\ | | | | | | | | |_|_|_|_|_|_|_| / |_|_|_|_|_|_|_| Адрес N Адрес N+38 _____________ _____________ | | | | | | | | _____________________\ | | | | | | | | |_|_|_|_|_|_|_| / |_|_|_|_|_|_|_| Адрес N+40 | Адрес N+78 _____________ \|/ _____________ | | | | | | | | ___________V_________\ | | | | | | | | |_|_|_|_|_|_|_| / |_|_|_|_|_|_|_| Адрес N+7960 Адрес N+7998 Рис 3-7: Организация памяти в битплане Доступ к памяти битпланов осуществляется через пару регистров BPLxPTH и BPLxPTL для каждого битплана (всего 12 регистров). 'x' в названии регистра обозначает номер битплана (например BPL1PTH и BPL1PTL хранят адрес первого битплана) Пара регистров PTH и PTL содержит 19-ти битный адрес, но для программиста они выглядят как 32-х битный адрес и могут быть записаны одной командой записи длинного слова в старший регистр, оканчивающийся на 'PTH' Пример ниже показывает, как устанавливать указатели битпланов. Возьмем два битплана, один по адресу $21000 а другой - $25000 и установим BPL1PT = $21000 и BPL2PT = $25000, хота обычно этим занимается коппер. LEA CUSTOM,a0 ; Базовый адрес регистров железа MOVE.L $21000,BPL1PTH(a0) ; Записываем указатель первого битплана MOVE.L $25000,BPL2PTH(a0) ; Записываем указатель второго битплана В этой главе описываются требования к памяти только для битпланов. Вам нужно будет зарезервировать память еще и для спрайтов, звука, анимаций и для Вашей программы. Резервирование памяти для этих нужд обсуждается в соответствующих главах. РИСОВАНИЕ НА БИТПЛАНАХ После того как Вы определили количество битпланов и установили указатели, можно начинать записывать цвета в битпланы. ОДНО- И ДВУХ-ЦВЕТНЫЕ ЭКРАНЫ Для одноцветного экрана все, что Вам надо, это записать 0 во все биты битплана, как показано в примере ниже. Этот код заполняет битплан низкого разрешения цветом фона (COLOR00), записывая 0 в область памяти битплана. Битплан начинается с $21000 и имеет длину 8000 байт LEA $21000,a0 ; Указатель на битплан MOVE.W #2000,d0 ; Пишем 2000 длинных слов = 8000 байт LOOP: MOVE.L #0,(a0)+ ; Пишем $0000 dbra d0,LOOP ; Уменьшаем счетчик и повторяем Для двухцветного экрана, Вы записываете 0 там, где изображается цвет фона и 1 там, где изображается цвет из регистра COLOOR01. Следующий пример похож на предыдущий, только вместо $0000 записывается $FF00FF00. Так мы получаем два цвета. LEA $21000,a0 ; Указатель на битплан MOVE.W #2000,d0 ; Пишем 2000 длинных слов = 8000 байт LOOP: MOVE.L #FF00FF00,(a0)+ ; Пишем $FF00FF00 dbra d0,LOOP ; Уменьшаем счетчик и повторяем ЭКРАНЫ 3х И БОЛЕЕ ЦВЕТОВ Для 3х и более цветов Вам нужен больше чем 1 битплан. Задача стоит так задать битпланы, чтобы когда они объединяются для изображения, каждый пиксель содержал корректную комбинацию бит. Это немного сложнее, чем экран, состоящий из одного битплана, но основная идея и процедуры одинаковы для экранов вплоть до 32х цветов. Рисунок 3-8 показывает два битплана, формирующие 4х цветный экран: РИСУНОК 3-8: Комбинирование битпланов Вы кладете 1 и 0 в оба битплана, давая каждому пикселю правильный цвет. Таким образом Вы можете объединять до пяти битпланов. Использование 5 битпланов позволяет выбирать один из 32х различных цветов для каждого пикселя. Таблица в конце главы содержит все комбинации бит для экранов, состоящих из 4 и 5 битпланов. ОПРЕДЕЛЕНИЕ РАЗМЕРА ОКНА ИЗОБРАЖЕНИЯ После того, как Вы определили экран, необходимо определить размеры окна изображения, т.е. окна на экране монитора. Изменение окна изображения влияет на весь изображаемый экран, включая бордюр и спрайты. Вы не можете изображать объекты за пределами определенного окна. Кроме того, размер бордюра вокруг экрана также зависит от окна изображения. Простой экран, описываемый в этом разделе имеет такой же размер, как и экранная область, и такой же размер, как и окно изображения. Это не всегда так: часто окно изображения меньше, чем картинка, находящаяся в памяти. Такое окно позволяет изображать часть большого экрана, а также скроллировать экран через окно. Вы можете также определить окно большее, чем экран. Эти варианты описаны в разделе 'Битпланы и окна всех размеров' Вы задаете размер окна изображения определяя вертикальную и горизонтальную позицию, в которой окно начинается и заканчивается и записываете эти значения в регистры окна изображения. Вертикальное разрешение имеет размерность в одну линию развертки. Горизонтальное - один пиксель низкого разрешения. Каждая позиция определяется двумя координатами x и y, которые обычно записываются как (x,y). Хотя координаты (0,0) находятся в левом верхнем углу экрана, обычно используются $81 для нормальной горизонтальной позиции и $2c для вертикальной. Эти позиции одинаковы как для PAL, так и для NTSC. Железо позволяет задавать начальную позицию перед ($81,$2c), но при этом часть экрана может стать невидимой. Различие между абсолютной начальной позицией (0,0) и нормальной ($81,$2c) результат наличия множества моделей мониторов. Это необходимо для преодоления искажений на краях экрана. Электронный луч рисует большую поверхность, чем может изобразить монитор, тем самым подавляя краевые искажения. Начальная позиция ($81,$2c) центрирует экран нормальных размеров, оставляя бордюр шириной 8 пикселей низкого разрешения вокруг экрана. Рисунок 3-9 показывает соотношения между окном изображения, видимой частью экрана и экраном, содержащим изображение. (0,0) / ($81,$2C) /______/____________________________ | ___/__________________________ | | | /_________________________ |\ | | | | /\ | | \| | | |<--|-------320----------->| | \ | | | | | | |\ | | | |200 | | | \Граница видимого экрана | | | | | | | | | | | | | | | | |___\/_____________________| | | | |__\________________________/__| | |______\_____________________ /______| \ / \__Изображение_____/ начальной и конечной позиции Рис 3-9: Положение видимого окна изображения УСТАНОВКА НАЧАЛЬНОЙ ПОЗИЦИИ ОКНА Горизонтальная начальная позиция примерно $81 и вертикальная примерно $2c центрируют изображение на большинстве стандартных телевизионных экранах. Если Вы выберете высокое разрешение или интерлейс, начальная позиция не изменится. Она всегда интерпретируется в неинтерлейсном режиме низкого разрешения. Регистр DIWSTRT (Display Window Start) содержит начальную позицию окна изображения. Этот регистр содержит обе координаты вертикальную и горизонтальную, называемые соответственно VSTART и HSTART. Следующий пример устанавливает DIWSTRT для стандартного экрана, записывая $2c в VSTART и $81 в HSTART. LEA CUSTOM,a0 ; Базовый адрес MOVE.W #$2C81,DIWSTRT(a0) ; Регистр начальной позиции окна УСТАНОВКА КОНЕЧНОЙ ПОЗИЦИИ ОКНА Вам нужно также установить позицию конца окна, которая находится в нижнем правом углу. Если Вы выберете высокое разрешение или интерлейс, конечная позиция не изменится. Она всегда интерпретируется в неинтерлейсном режиме низкого разрешения. Регистр DIWSTOP (Display Window Stop) содержит конечную позицию окна изображения. Этот регистр содержит обе координаты вертикальную и горизонтальную, называемые соответственно VSTOP и HSTOP. Следующий пример устанавливает DIWSTOP для стандартного экрана, учитывая начальную позицию ($81,$2c). Записываемое в HSTOP значение на 256 ($100) меньше, чем нормальное. Нормальное значение HSTOP = $1c1, но записывается как $c1. HSTOP одинаков для PAL и NTSC. При записи значения VSTOP также отбрасывается старший байт числа, большего, чем 256. Обычно VSTOP равен $f4 для NTSC и $2c для PAL Нормальный NTSC DIWSTRT - ($2C81). Нормальный NTSC DIWSTOP - ($F4C1). Нормальный PAL DIWSTRT - ($2C81). Нормальный PAL DIWSTOP - ($2CC1). Следующий пример устанавливает DIWSTOP стандартного экрана : горизонтальная координата $f4, и вертикальная $c1 LEA CUSTOM,a0 ; Базовый адрес MOVE.W #$F4C1,DIWSTOP(a0) ; Регистр конечной позиции окна Table 3-9: ОБОБЩЕНИЕ УСТАНОВКИ DIWSTRT И DIWSTOP. -Номинальные- -Возможные- NTSC PAL MIN MAX DIWSTRT: VSTART $2C $2C $00 $FF HSTART $81 $81 $00 $FF DIWSTOP: VSTOP $F4 $2C (=$12C) $80 $7F (=$17F) HSTOP $C1 $C1 $00 (=$100) $FF (=$1FF) УСТАНОВКА ВЫБОРКИ ДАННЫХ После определения размера и позиции окна, Вам необходимо дать системе размещение экрана для выборки данных из памяти. Для этого надо определить где начинается и заканчивается каждая линия изображения и записать эти значения в регистры выборки данных. Регистры выборки данных имеют разрешение в четыре пикселя (в отличие от регистров окна, разрешение которых 1 пиксель). Каждая позиция отстоит от предыдущей на 4 пикселя. Пиксель 0 имеет позицию 0, пиксель 4 - позицию 1 и т.д. Позиции начала выборки данных и начала окна изображения взаимодействуют друг с другом. Рекомендуется, чтобы значения начала выборки данных ограничивались программным разрешением в 16 пикселей (8 тактов в низком разрешении и 4 такта в высоком разрешении) Железо требует небольшой задержки после первой выборки данных перед тем, как сможет изображать данные. Как результат, существует различие в 4.5 такта между значением начала окна и началом выборки данных. Нормальный DDFSTRT в низком разрешении - ($0038). Нормальный DDFSTRT в высоком разрешении - ($003C). Разрешение начала и конца окна изображения в два раза больше, чем разрешение выборки данных. $81 --- -8.5=$38 2 $81 --- -4.5=$3c 2 Соотношение между началом и концом выборки данных: DDFSTRT = DDFSTOP-(8*(число слов-1)) для низкого разрешения DDFSTRT = DDFSTOP-(4*(число слов-2)) для высокого разрешения Нормальный DDFSTOP в низком разрешении - ($00D0). Нормальный DDFSTOP в высоком разрешении - ($00D4). Следующий пример устанавливает начало выборки данных для простого экрана = $38 и конец = $D0 LEA CUSTOM,a0 ; Базовый адрес MOVE.W #$0038,DDFSTRT(a0) ; Записываем DDFSTRT MOVE.W #$00D0,DDFSTOP(a0) ; Записываем DDFSTOP Вам также необходимо сказать системе, сколько байт относится к каждой горизонтальной линии на экране. Для этого Вы должны определить значение модуля. модуль - это число байт между последним словом на одной горизонтальной линии и началом первого слова на следующей линии. таким образом модуль позволяет системе конвертировать данные битплана, представленные в линейной форме (в виде последовательности байт) в прямоугольную форму (линия за линией) Для простого экрана, когда он такой же, как и окно изображения, модуль равен 0, потому что область памяти битпланов содержит ровно столько же байт, сколько Вы хотите изобразить на экране. Рис 3-10 и 3-11 показывают размещение простого экрана в памяти и его восстановление в виде прямоугольной области. Указатели адреса битплана (BPLxPTH и BPLxPTL) используются системой для выборки данных для экрана. Эти указатели динамические. Когда начинается выборка данных, указатели непрерывно увеличиваются, чтобы указывать на следующее слово, которое должно быть выбрано (данные выбираются по 2 байта за раз) Когда достигается конец строки (определенный в регистре DDFSTOP) к указателям битпланов прибавляется значение модуля, устанавливая указатели на первое слово в следующей горизонтальной линии. Данные для линии 1: Размещение: НАЧАЛО НАЧАЛО+2 НАЧАЛО+4 ....НАЧАЛО+38 Самое След. слово След. слово Последнее левое слово изображаемое слово ^ Остановка выборки данных (DDFSTOP) для | каждой горизонтальной линии после того, <------------------| как выбрано последнее слово линии Рис 3-10: Выборка данных для первой линии при модуле = 0 После того, как первая линия выбрана, указатели битпланов BPLxPTH и BPLxPTL содержат значение НАЧАЛО+40. Модуль (в данном случае 0) прибавляется к текущему значению указателей так, чтобы они начинали указывать на данные для следующей линии, которые начинаются с адреса НАЧАЛО+40 Данные для линии 2: Размещение: НАЧАЛО+40 НАЧАЛО+42 НАЧАЛО+44 ....НАЧАЛО+78 Самое След. слово След. слово Последнее левое слово изображаемое слово Рис 3-11: Выборка данных для второй линии при модуле = 0 Указатели всегда содержат четный адрес, потому что данные выбираются из памяти по слову за раз. Существует два регистра модуля, BPL1MOD для нечетных битпланов и BPL2MOD для четных битпланов. Это сделано для возможности использовать битпланы разного размера в режиме dual-playfield. Для нормального экрана, оба регистра BPL1MOD и BPL2MOD должны быть одинаковы. Следующий пример устанавливает модуль 0 для экрана низкого разрешения с одним битпланом. Этот битплан нечетный. MOVE.W #0,BPL1MOD+CUSTOM ; Устанавливаем модуль = 0 ВЫБОРКА ДАННЫХ В ВЫСОКОМ РАЗРЕШЕНИИ Когда Вы используете высокое разрешение, Вам необходимо производить выборку 80 байт для каждой линии, вместо 40. МОДУЛЬ В РЕЖИМЕ ИНТЕРЛЕЙСА Для интерлейсного режима, Вы должны переопределить модуль, поскольку происходит два раздельных сканирования экранной памяти для простого вывода картинки. Во время первого сканирования, выбираются линии с нечетными номерами, а во время второго сканирования - с четными. Битплан на полный экран в интерлейсе такой-же ширины, как и обычный, но высотой 400 NTSC и 512 PAL линий. Размещение данных для картинки начинается так: Линия 1 НАЧАЛО Линия 2 НАЧАЛО+40 Линия 3 НАЧАЛО+80 Линия 4 НАЧАЛО+120 и т.д. Следовательно, необходимо использовать модуль 40 для пропуска другого поля. Для нечетного поля, битплан начинается с байта НАЧАЛО, а для четного - с байта НАЧАЛО+40 Вы можете использовать коппер для ручной переустановки указателей для интерлейсных экранов. ИЗОБРАЖЕНИЕ ЭКРАНА Включение изображения экрана осуществляется включением экранного DMA при установленных указателях. Включение DMA производится установкой бита 1 (BPLEN) в регистре DMACON. Для более подробного объяснения установки этого регистра см. главу 7 'Управление чипсетом' После показа каждого кадра изображения, Вы должны переустановить указатели на битпланы. Это происходит потому что указатели увеличиваются во время выборки данных и все время указывают на следующее выбираемое слово. Для переустановки указателей Вы можете использовать коппер, или выполнять эту операцию как часть экранного прерывания (vertical blank) ВКЛЮЧЕНИЕ ЦВЕТНОГО ВЫВОДА A1000 имеет составной цветной выход, требующий установки 9 бита в BPLCON0 для получения цветного сигнала. Другие модели Амиги не используют этот сигнал и не могут его генерировать. Включение этого режима не влияет на RGB выход, который генерируется правильно независимо от составного видео сигнала РЕЗЮМЕ ПО СОЗДАНИЮ ПРОСТОГО ЭКРАНА Для создания простого экрана необходимы следующие шаги: 1. Определение характеристик экрана a. Определение высоты в линиях: - Для NTSC: - 200 для неинтерлейсного режима. - 400 для интерлейсного. - Для PAL: - 256 для неинтерлейсного режима. - 512 для интерлейсного. b. Определение ширины в пикселях. - 320 для низкого разрешения. - 640 для высокого разрешения. c. Определение цвета для каждого пикселя. - Загрузка цветов в цветовые регистры. - Определение цвета каждого пикселя записью значений в битпланы так, чтобы двоичный код всех битпланов указывал на цветовой регистр. - Построение битпланов. - Установка регистров битпланов. - Биты 12-14 в BPLCON0 - число битпланов (BPU2 - BPU0). - BPLxPTH - указатели на начальные позиции битпланов (записывается как длинное слово) d. Определение разрешения. - Низкое разрешение. - 320 пикселей в каждой горизонтальной линии - Очистить бит 15 в регистре BPLCON0 (HIRES). - Высокое разрешение. - 640 пикселей в каждой горизонтальной линии - Установить бит 15 в регистре BPLCON0 (HIRES). e. Выбрать интерлейс. - Интерлейс. - 400 вертикальных линий для NTSC, 512 для PAL. - Установить бит 2 в регистре BPLCON0 (LACE). - Без интерлейса. - 200 вертикальных линий для NTSC, 256 для PAL. - Очистить бит 2 в BPLCON0 (LACE). 2. Выделить память. Для вычисления необходимой памяти, используйте следующую формулу: число байт в линии * количество линий * количество битпланов. 3. Определить размер окна изображения. - Записать начальную позицию окна в DIWSTRT: - Горизонтальная позиция в битах 0 - 7 (биты младшего слова). - Вертикальная позиция в битах 8 - 15 (биты старшего слова). - Записать конечную позицию окна в DIWSTOP: - Горизонтальная позиция в битах 0 - 7 (биты младшего слова). - Вертикальная позиция в битах 8 - 15 (биты старшего слова). 4. Определить выборку данных. Установить регистры DDFSTRT и DDFSTOP: - Для DDFSTRT, использовать горизонтальную позицию как показано в разделе 'Установка выборки данных' - Для DDFSTOP, использовать горизонтальную позицию как показано в разделе 'Установка выборки данных' 5. Определить модуль. Установить регистры BPL1MOD and BPL2MOD. Установить модуль = 0 для неинтерлейсного и = 40 для интерлейсного режима. 6. Написать программу коппера для переустановки указателей 7. Для A1000 установить вывод составного видео сигнала, включением бита 9 в BPLCON0 ПРИМЕР ФОРМИРОВАНИЯ ПРОСТОГО ЭКРАНА. Следующий пример показывает как устанавливать регистры и создавать копперлист для двух различных экранов. Первый экран - 320х200 с одним битпланом, размещенным в $21000 и копперлистом в $20000 Этот пример использует константы из файла hw_examples.i в приложении J. LEA CUSTOM,a0 ; a0 указатель на чипсет MOVE.W #$1200,BPLCON0(a0) ; 1 битплан, включен цветной вывод MOVE.W #0,BPLCON1(a0) ; Значение горизонтального скроллинга 0 MOVE.W #0,BPL1MOD(a0) ; Модуль 0 для всех нечетных битпланов MOVE.W #$0038,DDFSTRT(a0) ; Начало выборки $38 MOVE.W #$00D0,DDFSTOP(a0) ; Конец выборки $D0 MOVE.W #$2C81,DIWSTRT(a0) ; DIWSTRT = $2C81 MOVE.W #$F4C1,DIWSTOP(a0) ; DIWSTOP = $F4Cl MOVE.W #$0F00,COLOR00(a0) ; Цвет фона - красный MOVE.W #$0FF0,COLOR01(a0) ; Регистр 1 - желтый ; ;Заполняем битплан $FF00FF00 для получения полос ; MOVE.L #$21000,a1 ; Указатель на начало битплана MOVE.L #$FF00FF00,d0 ; Пишем длинное слово $FF00FF00 MOVE.W #2000,d1 ; 2000 длинных слов = 8000 байт ; LOOP: MOVE.L d0,(a1)+ ; Записываем длинное слово DBRA d1,LOOP ; Цикл ; ; Устанавливаем копперлист в $20000 ; MOVE.L #$20000,a1 ; Указатель на копперлист LEA COPPERL(pc).a2 ; a2 указывает на данные CLOOP: MOVE.L (a2),(a1)+ ; перемещаем слово CMPI.L #$FFFFFFFE,(a2)+ ; проверка на последнее слово в ;копперлисте BNE CLOOP ; Цикл, пока не конец ; ; Указываем копперу на копперлист ; MOVE.L #$20000,COP1LCH(a0) ;Записываем регистр адреса коппера MOVE.W COPJMP1(a0),d0 ; Стартуем коппер с $20000 ; ; Включаем DMA ; MOVE.W #(DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),DMACON(a0) ; Включаем DMA битпланов и коппера BRA .... ; Делаем свою задачу ; ; Это данные для копперлиста. ; COPPERL: DC.W BPL1PTH,$0002 ; $0002 в адрес $0E0 (BPL1PTH) DC.W BPL1PTL,$1000 ; $1000 в адрес $0E2 (BPL1PTL) DC.W $FFFF,$FFFE ; Конец копперлиста ; Второй пример устанавливает интерлейсный экран в высоком разрешении с одним битпланом. Этот пример также есть в файле "hw_examples.i" из приложения J. LEA CUSTOM,a0 ; Указатель на чипсет MOVE.W #$9204,BPLCON0(a0) ; Выс. разрешение, интерлейс, 1 битплан MOVE.W #0,BPLCON1(a0) ; Значение горизонтального скроллинга 0 MOVE.W #80,BPL1MOD(a0) ; Модуль = 80 для нечетных битпланов MOVE.W #80,BPL2MOD(a0) ; Тоже для четных битпланов MOVE.W #$003C,DDFSTRT(a0) ; Установка начала выборки MOVE.W #$00D4,DDFSTOP(a0) ; Установка конца выборки MOVE.W #$2C81,DIWSTRT(a0) ; Установка начала окна изображения MOVE.W #$F4C1,DIWSTOP(a0) ; Установка конца окна изображения ; ; Установка цветовых регистров ; MOVE.W #$000F,COLOR00(a0) ; Фон = синий MOVE.W #$0FFF,COLOR01(a0) ; Цвет 1 = белый ;Установка битплана в $20000 LEA $20000,a1 ; a1 указатель на битплан LEA CHARLIST(pc),a2 ; a2 указатель на табличку MOVE.W #400,d1 ; Пишем 400 линий MOVE.W #20,d0 ; 20 Длинных слов в линии L1: MOVE.L (a2),(a1)+ ; Пишем длинное слово DBRA d0,L1 ; Цикл по длинным словам MOVE.W #20,d0 ; Переустанавливаем счетчик слов ADDQ.L #4,a2 ; Смещаемся по табличке CMPI.L #$FFFFFFFF,(a2) ; Конец таблички? BNE L2 LEA CHARLIST(pc),a2 ; Да, устанавливаем a2 на начало L2: DBRA d1,L1 ; Цикл по строкам ; ; Включаем DMA ; MOVE.W #(DMAF_SETCLR!DMAF_RASTER!DMAF_MASTER),DMACON(a0) ; Включаем только DMA битпланов, без коппера Поскольку этот пример не имеет копперлиста, его задачи выполняет цикл, ждущий прихода прерывания vertical blank. Когда оно приходит, проверяем LOF (бит длинного кадра в VPOSR) Если LOF=0 - это короткий кадр, и указатель битплана ставится на $20040. Если LOF=1, это длинный кадр, и указатель ставится на $20000. Это отличает короткие и длинные кадры. VLOOP: MOVE.W INTREQR(a0),d0 ; Читаем запрос на прерывания AND.W #$0020,d0 ; Маскируем все, кроме Vert Blank BEQ VLOOP ; Ждем, пока придет vertical blank MOVE.W #$0020,INTREQ(a0) ; Выключаем прерывание Vert Blank MOVE.W VPOSR(a0),d0 ; Читаем бит LOF в бит 15 рег. d0 BPL VL1 ; Если LOF = 0, переходим MOVE.L #$20000,BPL1PTH(a0) ; LOF = 1, указатель на $20000 BRA VLOOP ; Назад ждать VL1: MOVE.L #$20040,BPL1PTH(a0) ; LOF = 0, указатель на $20040 BRA VLOOP ; Назад ждать ; ; Табличка ; CHARLIST: DC.L $18FC3DF0,$3C6666D8,$3C66C0CC,$667CC0CC DC.L $7E66C0CC,$C36666D8,$C3FC3DF0,$00000000 DC.L $FFFFFFFF СОЗДАНИЕ ЭКРАНА В РЕЖИМЕ DUAL-PLAYFIELD Для большей гибкости при создании экранов Вы можете определить два плана вместо одного. В режиме dual-playfield один план показывается перед другим. Например, в игре может происходить действие на одном плане, а в это время другой план показывает управляющую панель. Вы также можете изменять передний или задний план без переделки всего экрана. Кроме того, каждый план может перемещаться независимо от другого. Экран dual-playfield похож на простой экран, но отличается некоторыми моментами: - Каждый план может состоять из одного, двух или трех битпланов. - Цвета каждого плана (до семи плюс прозрачный) берутся из различных цветовых регистров - Для включения dual-playfirld надо включить один бит. Рисунок 3-12 показывает экран в режиме dual-playfield На рис 3-12 один из цветов в каждом плане 'прозрачный' (цвет 0 в первом плане и цвет 8 во втором плане). Вы можете использовать прозрачность для того, чтобы видеть задний план через передний. В режиме dual-playfield каждый план содержит до трех битпланов. Для первого плана используются цветовые регистры 0-7, в зависимости от количества используемых битпланов. Для второго плана используются регистры 8-15. БИТПЛАНЫ В РЕЖИМЕ DUAL-PLAYFIELD Три нечетных битплана (1,3 и 5) группируются вместе и образуют первый план. Три четных битплана (2,4 и 6) группируются вместе и образуют второй план. Битпланы могут назначаться в различных комбинациях, как показано на рис 3-13. В высоком разрешении Вы можете использовать до двух битпланов в каждом плане. Битпланы 1 и 3 для первого плана и битпланы 2 и 4 для второго. СМ РИС. 3-12: Экран в режиме dual-playfield Число 'включенных' битпланов План 1* План 2* 0 нет нет __________ 1 |1 | |__________| __________ __________ 2 |1 | |2 | |__________| |__________| __________ __________ 3 |1 ________|_ |2 | |_|3 | |__________| |__________| __________ __________ 4 |1 ________|_ |2 ________|_ |_|3 | |_|4 | |__________| |__________| __________ __________ 5 |1 ________|_ |2 ________|_ |_|3 ________|_ |_|4 | |_|5 | |__________| |__________| __________ __________ 6 |1 ________|_ |2 ________|_ |_|3 ________|_ |_|4 ________|_ |_|5 | |_|6 | |__________| |__________| *ПРИМЕЧАНИЕ Каждый план может помещен перед другим, используя 'бит обмена' Рис. 3-13: Назначения битпланов для режима dual playfield. ЦВЕТОВЫЕ РЕГИСТРЫ В РЕЖИМЕ DUAL-PLAYFIELD При использовании dual-playfield, чипсет интерпретирует номера цветов для первого плана из битпланов 1, 3 и 5. Биты из плана 5 формируют старшую цифру номера регистра цвета, а из плана 1 - младшую. Эти комбинации выбирают первые восемь регистров цвета, как показано в табл. 3-10 Табл. 3-10: Цвета первого плана в низком разрешении ПЛАН 1 Комбинация бит Цвет 000 Прозрачный 001 COLOR1 010 COLOR2 011 COLOR3 100 COLOR4 101 COLORS 110 COLOR6 111 COLOR7 Чипсет интерпретирует номера цветов для второго плана из битпланов 2, 4 и 6. Биты из плана 6 формируют старшую цифру номера регистра цвета, а из плана 2 - младшую. Эти комбинации выбирают следующие восемь регистров цвета, как показано в табл. 3-11 Табл. 3-11: Цвета второго плана в низком разрешении ПЛАН 2 Комбинация бит Цвет 000 Прозрачный 001 COLOR9 010 COLOR10 011 COLOR11 100 COLOR12 101 COLOR13 110 COLOR14 111 COLOR15 Комбинация 000 выбирает прозрачный цвет, через который могут быть видимы: другой план, спрайт или фоновый цвет. Табл. 3-12 показывает регистры цвета в режиме dual-playfield в высоком разрешении. Табл. 3-12: Цвета планов в высоком разрешении ПЛАН 1 Комбинация бит Цвет 000 Прозрачный 001 COLOR1 010 COLOR2 011 COLOR3 ПЛАН 2 Комбинация бит Цвет 000 Прозрачный 001 COLOR9 010 COLOR10 011 COLOR11 ПРИОРИТЕТЫ И УПРАВЛЕНИЕ В РЕЖИМЕ DUAL-PLAYFIELD Любой план (1й или 2й) может иметь приоритет. Если он есть, то этот план изображается перед другим планом. Обычно приоритет имеет план 1. Бит PF2PRI (бит 6) в регистре BPLCON2 используется для установки приоритета. Когда PF2PRI включен, приоритет имеет план 2, когда выключен, план 1. Вы можете также контролировать относительный приоритет планов и спрайтов. Это описывается в главе 7, 'Управление чипсетом' Вы можете также управлять следующими характеристиками: - Планы могут быть разного размера в памяти, и разные части каждого плана могут изображаться. - Планы можно скроллировать отдельно один от другого. ЗАМЕЧАНИЕ Вы должны проявить внимание, в случае, если при одном неподвижном плане, другой скроллируется. Вы должны выбирать на одно слово больше, чем ширина скроллируемого плана в низком разрешении ( на 2 слова больше в высоком разрешении ) для того, чтобы исключить пропадание краев изображения, сдвинутого не на целое число слов. Имеются только один регистр начала выборки данных и конца выборки данных, и они совместно используются обоими планами. Если Вы хотите скроллировать один план при неподвижном другом плане, Вы должны корректировать начало и конец выборки данных для того плана, который скроллируется. Затем, Вы должны скорректировать модуль и указатели битпланов того плана, который не скроллируется, чтобы сохранять его позицию на экране. В низком разрешении корректировка указателей -2 и модуля тоже -2. в высоком разрешении корректировка указателей -4 и модуля тоже -4. ВКЛЮЧЕНИЕ РЕЖИМА DUAL PLAYFIELD Режим dual-playfield включается записью 1 в бит 10 (DBLPF) регистра BPLCON0. При этом происходит изменение интерпретации цветовых регистров и группировка битпланов в соответствиями с правилами организации этого режима. РЕЗЮМЕ ПО ИСПОЛЬЗОВАНИЮ РЕЖИМА DUAL PLAYFIELD В целом, шаги по определению dual-playfield такие-же, как и по определению простого экрана и отличаются следующими пунктами: - Загрузкой цветов в регистры. Запомните, регистры 0-7 используются планом 1, а регистры 8-15 - планом 2 (если в каждом плане по 3 битплана) - Строением битпланов. План 1 состоит из битпланов 1,3 и 5, а план 2 состоит из битпланов 2,4 и 6 - Установкой модуля. Он задается раздельно для каждого плана (BPL1MOD для первого плана (битпланы 1,3,5) BPL2MOD для второго плана (битпланы 2,4,6)) Эти шаги добавляются: - Определение приоритета. Если Вы хотите, чтобы план 2 находился перед планом 1, установите бит 6 (PF2PRI) в регистре BPLCON2. - Активизация режима dual-playfield. Установите бит 10 (DBLPF) в регистре BPLCON0 БИТПЛАНЫ И ОКНА ВСЕХ РАЗМЕРОВ Вы узнали, как сформировать простой и dual-playfield экраны, которые такие-же по размерам, как и окно на экране. Этот раздел покажет Вам, как создавать и использовать экраны, чьи битпланы больше, чем окно изображения. Как определять окна изображения размером больше или меньше, чем нормальный размер экрана и как перемещать окно изображения по большой картинке. КОГДА КАРТИНКА БОЛЬШЕ, ЧЕМ ОКНО ИЗОБРАЖЕНИЯ Если Вы создадите картинку больше, чем окно изображения, Вы должны выбрать, какая часть ее будет изображаться. Изображение части большой картинки отличается от изображения простого экрана следующими шагами: - Установка модуля. Модуль должен быть отличен от 0 - Резервирование памяти. БОльшие битпланы требуют больше памяти для размещения. ОПРЕДЕЛЕНИЕ МОДУЛЯ Для картинок шире окна изображения, Вы должны определить модуль так, чтобы обеспечить корректную выборку данных для каждой линии экрана. Например, окно изображения имеет ширину 320 пикселей (40 байт), а картинка в два раза шире, т.е. 640 пикселей (80 байт). Необходимо изобразить на экране левую половину картинки. На рис. 3-14 показано, как относятся друг к другу большая картинка и ее изображаемая часть. НАЧАЛО НАЧАЛО+78 ------------------------------------------------- | Широкий битплан в памяти | | | | | Ширина окна, в | | | котором будут | | | появляться данные | | | битплана | | | | | ------------------------------------------------- Рис. 3-14: Память картинки, большей, чем окно изображения Поскольку для каждой линии выбирается 40 байт, выборка данных для первой линии показана на рис. 3-15 Данные для линии 1: Размещение: НАЧАЛО НАЧАЛО+2 НАЧАЛО+4 ....НАЧАЛО+38 Самое След. слово След. слово Последнее левое слово изображаемое слово ^ Остановка выборки данных (DDFSTOP) для | каждой горизонтальной линии после того, <-----------------| как выбрано последнее слово линии Рис 3-15: Выборка данных для первой линии при модуле = 40 После того, как первая линия выбрана, указатели битпланов BPLxPTH и BPLxPTL содержат значение НАЧАЛО+40. Модуль (в данном случае 40) прибавляется к текущему значению указателей так, чтобы они начинали указывать на данные для следующей линии, которые начинаются с адреса НАЧАЛО+80 Данные для линии 2: Размещение: НАЧАЛО+80 НАЧАЛО+82 НАЧАЛО+84 ....НАЧАЛО+118 Самое След. слово След. слово Последнее левое слово изображаемое слово Рис 3-16: Выборка данных для второй линии при модуле = 40 Для изображения правой половины большой картинки, необходимо изменить процедуру установки указателей битпланов так, чтобы они указывали на НАЧАЛО+40, а не на НАЧАЛО. Модуль остается 40. Размещение данных показано на рис. 3-17 и 3-18. Данные для линии 1: Размещение: НАЧАЛО+40 НАЧАЛО+42 НАЧАЛО+44 ....НАЧАЛО+78 Самое След. слово След. слово Последнее левое слово изображаемое слово Рис 3-17: Выборка данных для первой линии правой половины картинки После того, как первая линия выбрана, указатели битпланов BPLxPTH и BPLxPTL содержат значение НАЧАЛО+80. Модуль (в данном случае 40) прибавляется к текущему значению указателей так, чтобы они начинали указывать на данные для следующей линии, которые начинаются с адреса НАЧАЛО+120 Данные для линии 2: Размещение: НАЧАЛО+120 НАЧАЛО+122 НАЧАЛО+124 ....НАЧАЛО+158 Самое След. слово След. слово Последнее левое слово изображаемое слово Рис 3-18: Выборка данных для второй линии правой половины картинки Запомните, что в высоком разрешении Вы должны выбирать в два раза больше байт, чем в низком разрешении. Для экрана нормальных размеров, Вы выбираете 80 байт для каждой линии вместо 40. ОПРЕДЕЛЕНИЕ ВЫБОРКИ ДАННЫХ Регистры выборки данных задаются также, как описано в разделе 'Формирование простого экрана' ВЫДЕЛЕНИЕ ПАМЯТИ Для бОльших картинок необходимо выделять больше памяти. Вот формула для общего расчета требований к памяти: Число байт на линию * число линий * число битпланов Так, если широкий экран, описанный в этом разделе состоит из двух битмапов, то он займет 80 * 200 * 2 = 32,000 байт памяти ВЫБОР НАЧАЛА ОКНА ИЗОБРАЖЕНИЯ Начало окна изображения это горизонтальная и вертикальная координата верхнего левого угла окна изображения. Обе эти координаты (HSTART и VSTART) содержатся в одном регистре DIWSTRT. Восемь бит HSTART позволяют задавать 256 позиций расположения окна, начиная с самой левой возможной позиции. Итак, Вы можете начинать ваше окно изображения с любой позиции в этом интервале. ПОЛНАЯ ОБЛАСТЬ ЭКРАНА 0 255 361 --------------------------------------------- | | | | HSTART окна изо- | | | бражения может быть| | | в этом интервале | | | | | --------------------------------------------- Рис. 3-19: Горизонтальная начальная позиция окна изображения. Восемь бит VSTART позволяют задавать первые 256 позиций вниз от верха экрана. ПОЛНАЯ ОБЛАСТЬ ЭКРАНА --------------------------------------------- 0 | ^ | | | | | VSTART окна изображения| | | может быть в этом интервале| | | __v_|___255 | (NTSC)____________262 | | --------------------------------------------- Рис. 3-20: Вертикальная начальная позиция окна изображения Выбор значений для начальных позиций производится всегда в неинтерлейсном режиме и низком разрешении. Имейте ввиду, что для интерлейсного режима окно изображения должно быть четное количество строк в высоту для того, чтобы четные и нечетные кадры были одного размера Для установки начала окна изображения запишите значение HSTART в биты 0-7, а значение VSTART в биты 8-15 регистра DIWSTRT. ВЫБОР КОНЕЧНОЙ ПОЗИЦИИ Конец окна изображения это горизонтальная и вертикальная координата нижнего правого угла окна изображения. Обе эти координаты (HSTOP и VSTOP) содержатся в одном регистре DIWSTOP. Для подробностей по установке этих регистров см. раздел 'Формирование простого экрана' ПОЛНАЯ ОБЛАСТЬ ЭКРАНА 0 255 361 ------------------------------------------------ | | | | | HSTOP окна изображе-| | | ния находится в этом | | | интервале | | | | ------------------------------------------------ Рис. 3-21: Горизонтальная конечная позиция окна изображения Выбор значений для начальных позиций производится всегда в неинтерлейсном режиме и низком разрешении. ПОЛНАЯ ОБЛАСТЬ ЭКРАНА --------------------------------------------- 0 | | | _________________________________|___128 | Vstop окна изобра- | | жения находится в этом | | интервале | (NTSC)______|___262 | | | | | | --------------------------------------------- Рис. 3-22: Вертикальная конечная позиция окна изображения Для установки конца окна изображения запишите значение HSTOP в биты 0-7, а значение VSTOP в биты 8-15 регистра DIWSTOP. МАКСИМАЛЬНЫЙ РАЗМЕР ОКНА ИЗОБРАЖЕНИЯ Максимальный размер изображения определяется максимальным числом строк и столбцов. Вертикальные ограничения просты: данные не могут изображаться в период обратного хода. Следующая таблица показывает доступную вертикальную область. Табл. 3-13: Максимально доступная вертикальная видео область Обратный ход NTSC PAL Начало 0 0 Конец $15 (21) $1D (29) NTSC NTSC PAL PAL Нормальн. Интерлейс Нормальн. Интерлейсный Видимых линий 241 483 283 567 =262-21 =525-(21*2) =312-29 =625-(29*2) Горизонтально похожая ситуация. Строго говоря, железо накладывает ограничения на максимальный DDFSTOP, равный ($D8) и на минимальный DDFSTRT, равный ($18). Это дает максимум 25 слов для выборки в низком разрешении и 49 слов в высоком разрешении, потому что ограничение DDFSTOP остается $D8 и только одно слово успевает выбраться до достижения ограничения. Обычно, горизонтальный обратный ход ограничивает область изображения до 368 пикселей (23 слова). Это число одинаковое для PAL и NTSC. Вдобавок, использование начала выборки данных раньше, чем ($38) отключает некоторые спрайты. Табл. 3-13: Максимально доступная горизонтальная видео область Низкое Высокое DDFSTRT (стандартный) $0038 $003C DDFSTOP (стандартный) $00D0 $00d4 DDFSTRT (ограничение железа) $0018 $0018 DDFSTOP (ограничение железа) $00D8 $00D8 Выбирается слов (макс.) 25 49 Изображается пикселей (макс.) 368 (low res) ДВИЖЕНИЕ (СКРОЛЛИРОВАНИЕ) ЭКРАНОВ Если Вы хотите перемещать задний план, Вы можете создать его больше, чем окно изображения и скроллировать его. Если Вы используете dual-playfield, Вы можете скроллировать их отдельно. При вертикальном скроллировании экран плавно перемещается вверх или вниз. Все, что Вам нужно для вертикального скроллинга, это постепенно увеличивать или уменьшать начальный адрес указателей битпланов на размер горизонтальной линии во время обратного хода луча. При горизонтальном скроллировании экран плавно перемещается справа-налево или слева-направо. Горизонтальное скроллирование работает по-другому. Вы должны выбирать на одно слово больше, а затем определять задержку изображения этого дополнительного слова в зависимости от попиксельного положения экрана в окне. Для обоих типов скроллинга, изменение регистров происходит во время обратного хода луча ВЕРТИКАЛЬНЫЙ СКРОЛЛИНГ Вы можете скроллировать экран в окне вверх или вниз. Каждый раз, когда Вы устанавливаете указатели, их надо ставить выше или ниже по картинке. Если значение указателей увеличивать, то будет казаться, что картинка перемещается вверх. Если указатели уменьшать, то картинка будет перемещаться вниз. В режиме NTSC с экраном в 200 линий, каждый шаг будет перемещать экран на 1/200 часть. В режиме интерлейса, при умных манипуляциях с указателями, шаг может быть 1/400, но рекомендуется скроллировать с шагом 2 линии, чтобы поддерживать отношение четных и нечетных полей. В режиме PAL шаг может быть 1/256 экрана или 1/512 в режиме интерлейса. |