Copyright (C) Phantom Lord
Music by Phantom Lord
Рад вас приветствовать в нашей маленькой
школе программистов.Сегодня мы поговорим о
быстрых расчетах адреса по двум координа-
там.Это настолько важная вещь , что невоз-
можно написать мощную программу , будь то
игра , демка или системная программа без
нее.Но кроме всего , необходимо , чтобы
расчет работал быстро . Именно поэтому
программисты придумывают различные извра-
щенные (хитрые) методы , которые позволяют
расчитать адрес за считанные такты.
Итак допустим , что мы делаем летящие
звезды с изменяющимися координатами B и C.
Нам надо расчитать адрес звезды с коорди-
натами B (X) и C (Y).
1.Расчитаем адрес звезды с координатами
(0,C).Для этого создадим по адресу tabl_1
таблицу адресов с областью определений C :
[0,191], и областью значений [#4000,#5800)
LD HL,#4000 ;Начало экрана
LD B,192 ;Цикл на 192 позиции
LD IX,tabl_1;Начало таблицы
A_1 LD (IX+0),L ;В таблицу ложем
LD (IX+1),H ;адрес
INC IX ;
INC IX ;
CALL DOWN ;Подпрограмма на
DJNZ A_1 ; пиксел ниже
...
tabl_1 DEFS 192*2 ;Длина таблицы 192*2,
;т.к. на 1 адрес
;уходит 2 байта
DOWN INC H
LD A,H
AND 7
RET NZ
LD A,L
ADD A,32
LD L,A
RET C
LD A,H
SUB 8
LD H,A
RET
Теперь выберем из таблицы адресов адрес с
координатами (0,C):
LD L,C ;
LD H,0 ;
ADD HL,HL ;Умножаем HL на 2
LD DE,tabl_1;
ADD HL,DE ;В HL-адрес с коорди-
LD E,(HL) ;натой,помещаем его в
INC HL ;DE
LD D,(HL) ; 67 TAKTS
...
Обычно начинающим этого хватает,но с при-
обретением опыта начинаешь понимать, что
эта процедурка при частом использывании за
один тик (один экранный такт. 1 секунда=50
тиков ), превращают последний в двойное
прерывание . Например при большом коли-
честве звезд (300-350 штук).
Наверное многие знают о замечательных
свойствах чисел , кратных 256.Например ,
чтобы выбрать из таблицы , длиной 256 байт
по адресу #7000=256*112 число ,находящееся
на C'ом месте достаточно сделать следующее
LD L,C
LD H,#70
LD A,(HL)
И в A у нас нужное число. Но можно ли
проделать такую операцию с 16-bit'ными
числами.Можно,но возникает одна небольшая
проблемка. Всего адресов у нас должно быть
192,так как высота экрана 192 пикселя , а
в таблице с длинной 256 байт помещается
всего 256/2=128 адресов. Значит необходимо
создать помимо 128 адресов по адресу #7000
еще 64 адреса экрана по адресу #7100:
LD IX,#7000
LD HL,#4000
LD B,128
A_2 LD (IX),L
INC LX
LD (IX),H
INC LX
CALL DOWN (СМ.ВЫШЕ)
DJNZ A_2 ;ПОСЛЕ ПРОЦЕДУРЫ IX=
LD B,64 ;=#7000,HL=#5000
INC HX
A_3 LD (IX),L
INC LX
LD (IX),H
INC LX
CALL DOWN
DJNZ A_3
...
ТЕПЕРЬ ВЫБЕРЕМ АДРЕС С КООРДИНАТАМИ (0,A)
CP 127 ;
JR C,SECOND ;
ADD A,A ; 4
LD L,A ; 4
LD H,#70 ; 7
LD E,(HL) ; 7
INC L ; 4
LD D,(HL) ; 7 =33 TAKTS
RET
SECOND
ADD A,A
LD L,A
LD H,#71
LD E,(HL)
INC L
LD D,(HL)
RET
Как видите сам расчет превосходит преды-
дущий почти в два раза . Около 20 тактов
уходит на проверку принадлежности. Поэтому
можно использовать просто 2-сегментный эк-
ран , а 3ий сегмент забить картинкой .
Мы рассмотрели , как делать расчет адреса
по точкам с нулевыми X-координатами . Рас-
смотрем , как расчитать X.
Предположим , что вышеизложенным способом
мы рассчитали адрес по координате Y и те-
перь найдем отдаленность от левой границы
экрана. Пусть B=X :
LD L,B ;
SRL L ;Делим L на 8.
SRL L ;
SRL L ;
LD H,0 ; В DE у нас адрес по
ADD HL,DE;первому расчету.
В HL получаем адрес , рассчитанный по
точке с координатами (B,C) , т.е. то,что и
хотели.
Хочется отметить,что это не самый быст-
рый расчет , но если вы пораскинете хоро-
шенько мозгами , то поменяв парочку ком-
манд вы получите более интересную проце-
дурку . Дело за вами .
До встречи на следующем уроке ассемблера
, где я расскажу вам еще что-нибудь инте-
ресное.
__________________________________________