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

       

к любому элементу массива можно


Известно, что в Бейсике к любому элементу массива можно обратиться по индексу, например, оператор LET b=a(8) присвоит переменной b значение 8-го элемента массива a(). В ассемблере подобная запись может выглядеть так:

LD B,(IX+7)

Обратите внимание, что первый элемент массива имеет индекс 0, а не 1. В отличие от массивов Бейсика, максимальный индекс у регистров IX и IY не может превышать 127, но зато допускаются отрицательные значения номера элемента массива. Таким образом, общий размер адресуемой области составляет 256 байтовых элементов, а индексный регистр указывает на его «середину».

Реальным примером большой структуры данных могут служить системные переменные Бейсика. Обычно они адресуются регистром IY, который указывает на переменную ERR_NR, находящуюся по адресу 23610. Кстати, именно в связи с этим регистр IY лучше оставить в покое и никак не изменять его в своих программах, по крайней мере, до тех пор, пока вы так или иначе используете операционную систему компьютера. Что касается регистра IX, то им вы можете смело пользоваться при любых обстоятельствах.

Наверное, лучше всего объяснить идею применения индексных регистров на конкретном примере. В качестве такого примера приведем уже знакомые вам процедуры очистки окон и установки в них постоянных атрибутов (тем более, что они понадобятся при составлении программы многокадровой заставки), но графические переменные заменим единой структурой, первый элемент которой адресуем через IX. Саму же структуру оставим без изменения, то есть на первом месте (по смещению 0, задаваемом как IX+0 или просто IX) по-прежнему будет находиться параметр COL, на втором (задаваемом как IX+1) - ROW, дальше LEN, HGT и ATTR. А чтобы новые процедуры отличить от описанных выше, изменим их имена на SETW и CLSW:

SETW LD DE,#5800 LD B,(IX+3) ;HGT LD C,(IX+2) ;LEN LD A,(IX+1) ;ROW LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,DE LD A,L ADD A,(IX) ;COL LD L,A LD A,(IX+4) ;ATTR SETW1 PUSH BC PUSH HL SETW2 LD (HL),A INC HL DEC C JR NZ,SETW2 POP HL POP BC LD DE,32 ADD HL,DE DJNZ SETW1 RET ; ----------------- CLSW LD B,(IX+3) ;HGT LD C,(IX+2) ;LEN LD A,(IX+1) ;ROW CLSW1 PUSH AF PUSH BC PUSH DE CALL 3742 POP DE LD A,L ADD A,(IX) ;COL LD L,A LD B,8 CLSW2 PUSH HL PUSH BC LD B,C CLSW3 LD (HL),0 INC HL DJNZ CLSW3 POP BC POP HL INC H DJNZ CLSW2 POP BC POP AF INC A DJNZ CLSW1 RET


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