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


         

Приведенный вариант организации циклов уже


Приведенный вариант организации циклов уже почти повторяет такие строки Бейсика:

FOR N=12 TO 24 .............. NEXT N

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

;Предположим, что значение аккумулятора до начала цикла неизвестно CYCLE CP 25 ;проверяем на достижение конечного ; значения, то есть выполнение условия ; A > 24 (A >= 25) JR NC,AROUND ;если да, обходим цикл PUSH AF ;сохраняем счетчик в стеке ......... ;тело цикла POP AF ;восстановление значения счетчика INC A ; и увеличение его на 1 JR CYCLE ;безусловный переход на начало AROUND ......... ;продолжение программы

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

LD A,-1

после чего просмотрите память, например, функцией Бейсика PEEK. На первом месте вы увидите байт 62, это код самой команды, а следом за ним вместо -1 обнаружите число 255. Казалось бы, что с отрицательными числами в машинных кодах иметь дело совершенно невозможно, но тем не менее, можно считать, что старший бит в байте или двухбайтовом значении иногда будет играть роль знака: если он установлен, то число отрицательное, а если сброшен - положительное. Таким образом, применение чисел со знаком в ассемблере в достаточной степени условно, но все же возможно. А следить за тем, какой тип чисел применяется в каждом конкретном случае должен сам программист.


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