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


         

ВВОД ЭЛЕМЕНТА СЛУЧАЙНОСТИ - часть 2


Кроме того, есть и еще один недостаток использования регистра регенерации. Значение его никогда не превышает 127. Иными словами, седьмой бит этого регистра обычно «сброшен» в 0, и, дойдя до значения 127, он вновь обнуляется.

Однако, справедливости ради, стоит заметить, что это относится лишь к тем программам, в которых регистр R не изменяется принудительным образом. При желании вы можете установить его 7-й бит и тогда постоянно будете получать из него значения от 128 до 255. Правда, делается это обычно в целях защиты программ (например, такой метод применен в игре NIGHT SHADE), но это уже совсем другая тема.

Когда требуется получить наибольшую степень случайности, прибегают к математическим расчетам. Разберем одну из таких «математических» подпрограмм. Несмотря на ее простоту, она вырабатывает все же достаточно длинную последовательность неповторяющихся значений, чтобы их можно было рассматривать в качестве случайных.

RND255 PUSH BC PUSH DE PUSH HL ; Регистровая пара HL загружается значением из счетчика «случайных» чисел ; (это может быть, например, системная переменная 23670/23671, ; которая используется Бейсиком для тех же целей) LD HL,(ADDR) LD DE,7 ;дальше следует расчет очередного ; значения счетчика ADD HL,DE LD E,L LD D,H ADD HL,HL ADD HL,HL LD C,L LD B,H ADD HL,HL ADD HL,BC ADD HL,DE LD (ADDR),HL ;сохранение значения счетчика «случайных» ; чисел для последующих расчетов LD A,H ;регистр A загружается значением ; старшего байта счетчика POP HL POP DE POP BC RET ADDR DEFW 0

Эта процедура возвращает в аккумуляторе «случайные» числа от 0 до 255. Однако в подавляющем большинстве случаев нужно иметь возможность получать значения из произвольного диапазона. С этой целью дополним подпрограмму RND255 расчетами по ограничению максимального значения и назовем новую процедуру просто RND. Перед обращением к ней в регистре E задается верхняя граница вырабатываемых «случайных» чисел. Например, для получения в аккумуляторе числа от 0 до 50 в регистр E нужно загрузить значение 51:




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