- SEPTiC DEMO'S COLLEGE -- 

                                   Урок 2
                           автор - Vicious / Septic 

                                  23 Apr 93 



                                  Введение

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

                                  Регистры

Единственный новый регистр, который понадобится сегодня - это 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 

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

