Ассемблер - Быстрый расчет адреса по двум координатам.

Odyssey Magazine #01
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) , т.е. то,что и
хотели.
             
 Хочется отметить,что это не самый быст-
рый расчет , но если вы пораскинете хоро-
шенько мозгами , то поменяв парочку ком-
манд вы получите более интересную проце-
дурку . Дело за вами .

 До встречи на следующем уроке ассемблера
 , где я расскажу вам еще что-нибудь инте-
ресное.
                                    
__________________________________________