Odyssey Magazine #01
05 марта 1997

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

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

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



Другие статьи номера:

Вступление - Oб авторах журнала и о журнале.

Вступление - Oб авторах журнала

Вступление - Инструкция к оболочке журнала.

Отдохнем - GLODING PROGRAMMING (Программирование снизу вверх наискосок)

Ассемблер - Как вычислить синус на ассемлере.

Система - IBM:Об алгаритме сжатия Lempel-Ziw Welch и его реализации для формата GIF.

Разное - о компьютерных проблемах: ПРОФИ и СКОРПИОН, IBM...

Отдохнем - "Приколы со стороны".

Деморынок - Хит-парад музыкальных демонстраций.

История - Хакеры - статья "ОНО" - об истории появления хакерства.

История - Классификация хакеров.

Отдохнем - "Как ломаются полуоси?".

Письма - Отзывы читателей о журнале.

Конкурс - Конкурс на лучшую головоломку !

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

IS DOS - Проблемы и решения

Новости - новости города.

Разборка - Описание игры THE DOOBLE.

Разборка - Описание игры BLOOD WYCH.

Обзор - новые игры: RETURN TO HOME 4, CITADEL, KLADEMINER, BRIDGE PLAYER, CRUSHER, AMERICAN TURBO KING, RAD RAMP RACER, KUNG FU MASTER, CHOY LEE, SIDERAL WAR, ARKARUM, DIRT TRACK RACER, DOUBLE DRAGON 2, NIGHT BREED, THE CYCLES, MOONTORC, KOMMANDO 2.

Система - Описание системных программ : UNIVERSAL SPRATE STUDIO (USS)

Гости - Старые знакомые:О истории создания краснодарской группа UNIT-5

Система - Описание системных программ : ACCEPT PROTECTION SYSTEM V1.0.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Ferrum - Принесли мне в ремонт телевизор JVC.
От авторов - Прошло время... Появилось желaние творить... И вот, сев поздно ночью я нaчaл нaбивaть этот текст, вводяший вaс в мир 15 номерa информaционного издaния 'PLutоNIUM twо'
Наши новости - Обзор работ над которыми трудятся ковровские кодеры.

В этот день...   10 июля