Как написать игру для ZX Spectrum на ассемблере



         

«Волна» - часть 2


CALL S,ADDR

где S - любое из возможных условий, а ADDR - абсолютный адрес или метка.

После проверки возможности выполнения подпрограммы в регистровую пару HL загружается адрес начала строки экрана, по которой будет пробегать «волна». Этот адрес рассчитывается заранее и помещается в двухбайтовую переменную AD_LIN, которая в программе будет задаваться инструкцией ассемблера DEFW. В остальных строках не встретилось ничего нового, поэтому, надеемся, вполне достаточно кратких комментариев.

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

DOWN CP 32 ;начало такое же, как и в RET NC ; предыдущей подпрограмме LD HL,(AD_LIN) PUSH AF OR L LD L,A PUSH HL XOR A ;в аккумуляторе 0 EX AF,AF' ;отправляем его в альтернативный AF' LD B,7 DOWN1 LD A,(HL) ;считываем байт текущего ряда EX AF,AF' ;меняем аккумулятор на альтернативный LD (HL),A ;записываем в текущий ряд INC H ;переходим к следующему ряду DJNZ DOWN1 EX AF,AF' ;запись последнего байта LD (HL),A ; в самый нижний ряд POP HL POP AF RET

Раньше мы уже упоминали команду EX AF,AF', сейчас же показали ее практическое применение. Напомним, что она выполняет действие, аналогичное команде EXX, только меняет на альтернативный аккумулятор, а заодно и флаговый регистр (этим иногда тоже можно пользоваться, сохраняя флаги для последующих операций). Советуем внимательно изучить подпрограмму DOWN и проследить за «эволюциями» аккумулятора в данном примере. Это поможет вам лучше понять принцип работы многих других подпрограмм, с которыми вы еще встретитесь.

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




Содержание  Назад  Вперед