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

       

Простые циклы


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

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

ORG 60000 ENT $ CALL 3435 ;Подготовка экрана к печати LD A,2 CALL 5633 LD B,32 ;В регистре B - количество повторений LOOP LD A,"*" ;Печать символа «*» RST 16 DJNZ LOOP ;Уменьшение регистра B на 1 и если ; B не равно 0, переход на метку LOOP RET

Такой способ организации циклов наиболее прост и удобен, но у него есть два существенных ограничения. Во-первых, как вы понимаете, количество повторений здесь не может превышать максимального значения для регистров, то есть 256 (если изначально в B записан 0), а во-вторых, между адресом начала цикла и командой DJNZ может быть расстояние не более 126 байт. Со вторым ограничением можно справиться, например, если тело цикла оформить как подпрограмму, тогда между меткой начала цикла и командой DJNZ будет находиться единственная инструкция CALL.

Еще раз напоминаем вам о необходимости сохранять регистры, которые могут быть изменены. В данном случае нужно позаботиться о сохранении регистра B, иначе цикл может никогда не закончиться, то есть произойдет «зависание» компьютера. В приведенном выше примере мы не сделали этого только потому, что команда RST 16 все регистры данных, за исключением аккумулятора, оставляет без изменений, но это не всегда справедливо при использовании других процедур ПЗУ. Если вы не совсем уверены в том, что какая-то подпрограмма сохраняет нужные регистры, лучше на всякий случай перестраховаться. Таким образом, в общем виде цикл может выглядеть так:

LD B,N ;Указываем количество повторений МЕТКА PUSH BC ;Сохраняем счетчик цикла ......... ;Тело цикла, которое может быть выделено ; в отдельную подпрограмму, и тогда ; здесь будет располагаться единственная ; инструкция CALL POP BC ;Восстановление счетчика DJNZ МЕТКА ;Уменьшение счетчика и если не конец, ; переход на начало цикла



Содержание раздела