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