Демошкола Септика - Урок 2

Демошкола Септика - Урок 2.

автор: Dimouse (перевод)

Введение

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

Регистры

Единственный новый регистр, который понадобится сегодня - это VPOSR ($dff004). Он, как и многие другие регистры, является регистром НА ЧТЕНИЕ. На самом деле, это горизонтальное и вертикальное положение в регистре VHPOSR ($ dff006), где 8 нижних битов - это горизонтальное положение, а 8 высших битов - вертикальное. Это не подходит, конечно же, для PAL Амиг, поскольку там нужно ждать до положений больше $FF (а они не помещаются в байт).

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

Некоторые люди предпочитают ждать момента, когда вертикальное положение луча становится нулевым, простым сравнением:

WT: TST.B $ DFF006
BNE.S WT

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

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

sync: move.l $ dff004, d0; Здесь я получаю сразу вертикльное
; и горизонтальное положение, а также главный бит
; вертикального положения
and.l # $ 1ff00, d0; затем я убираю ненужны биты командой "И"
; (нужны только вертикальные биты)
lsr.l # 8, d0; затем я делаю побитовое смещение этого положения
cmp.w # $ f0, d0; И наконец сравниваю его с вертикальным положением,
; до которого хочу ждать
bne.s sync; и возвращаюсь, если оно еще не достигнуто

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

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

DC.W $ FFFF, $ FFFE

Эта инструкция на самом деле ждет положения, которое никогда не достигается, и поэтому коппер остается там, пока не получает сигнал, что экран обновился, и начинает исполнения с начала списка.

Еще интересно отметить, как ждать до положения ниже линии 255. Вертикальное положение WAIT это всего лишь один байт и таким образом, нельзя указать больше 255. И все же есть небольшой трюк... Мы ждем до наибольшего положения, которого можно достичь и потом переводим коппер в так называемый "PAL-режим", где ко всем значениям вертикальной координаты прибавляется $100. Это означает, например, что значение 02 это на самом деле $102.

Мы ждем "PAL" следующим образом:

DC.W $ FFDF, $ FFFE

На этот раз у меня все, жду вас в следующем уроке, в котором будет еще больше новых интересных вещей!

Пример программы

На этот раз у нас в примере старые добрые "copper bars". Сделать эти полоски относительно просто. Первое и самое главное, что нужно сделать - зарезервировать место для них в коппер-списке, а поскольку очень не хочется писать 168 строк, мы просто забьем туда нули, а коппер сгенерирует код у нас в программе.

Эта генерация кода у меня заключена в процедуре ClrBars. Каждое обновление экрана она вызывается и перерисовывает полоски. Техника, с помощью которой я это делаю, очень проста. Мы двигаемся по коду программы и записываем два значения в необходимую инструкцию. Первая инструкция - это WAIT, вторая - MOVE. MOVE, конечно же, всегда будет $01800000, так как нам просто нужно будет вернуть цвет фона. А вот инструкцию WAIT нужно будет постоянно менять, так как ждать нужно будет каждый раз следующую линию.

В процедуре Swing Bars я рисую 6 полос, одну за другой, меньшую наверху. Я считываю значение синуса из таблицы и умножаю его на значение в нужном месте коппер-списка, таким образом получая значение цвета там. Как я уже сказал, это очень просто, но немного непривычно для новичков.

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

; Bar 1 (narrow)
Dc.w $ 700
Dc.w $ 800
Dc.w $ 500
Dc.w $ 000

на желтую:

; Bar 1 (narrow)
Dc.w $ 770
Dc.w $ 880
Dc.w $ 550
Dc.w $ 000

Экспериментируйте больше! Так вы больше поймете!

Последнее изменение Mon, 16 Mar 2015 автором Dimouse


Назад в раздел Old-games Diskmag 7