|
Amazing
#02
14 июля 1998 |
|
Ассемблер - поговорим о такой необходимой процедуре как вывод спрайта.

(C) 1998 by Mr.Beeper
Music by Ironman
Мы продолжаем уже начатую в предыдущем но-
мере тему "Ассемблер", и на этот раз пого-
ворим о такой необходимой процедуре как
вывод спрайта.
В журнале "Odyssey" есть где-то статья о
выводе спрайта размером 192*256 (полноцен-
ный экран) за 1 прерывание !!! Мы же, бу-
дем рассматривать более меньшие размеры,
так что набирайтесь терпения и читайте.
Все процедуры вывода спрайта делятся на
два вида.
1). Быстрота выполнения процедуры не очень
быстрая, но размеры ее меньше чем во вто-
ром случае.
2). Быстрота выполнения гораздо быстрее,
хотя размеры ее немного стали больше.
Вот по этим пунктам вы должны ориентиро-
ваться, когда будете выбирать тип процеду-
ры, которая больше подходит к вашей прог-
рамме. Ниже преведенная процедура работает
как написано в первом пункте (см. выше), а
переделать ее под второй способ не соста-
вит сложности.
ORG 25000
VIV.SPR LD HL,#8000 ;адрес спрайта
LD DE,#4000 ;адрес
;вывода на экран
LD B,16 ;кол_во пикселей по y
VIV PUSH BC
PUSH DE
LD BC,7 ;кол_во знакомест по x
LDIR ;<<< Warning !!!
POP DE
POP BC
INC D
LD A,D
AND 7
JR NZ,V1
LD A,E
ADD A,#20
LD E,A
JR C,V1
LD A,D
SUB 8
LD D,A
V1 DJNZ VIV
RET
Если внимательно посмотреть на эту проце-
дуру вывода спрайта, то можно увидеть та-
кую команду как LDIR (Вы ею наверное уже
когда-то пользовались,и знаете как она ра-
ботает). В данном примере эта команда слу-
жит для пересылки группы байтов из памяти
на экран, а из этого следует, что быстрота
выполнения этой команды практически яв-
ляется основным действием всей процедуры.
Но есть в этой команде и один недостаток,
скорость ее быстродействия равна 22 такта
в секунду !!! А это очень много. Если ко-
нечно вам без разницы, за сколько времени
выполняется эта процедура, тогда можете
смело вставлять ее в свои программы, но
если же вам дороже каждый такт, тогда да-
вайте рассмотрим второй вариант. Если по-
думать логически, нам в этой процедуре на-
до заменить всего навсего одну команду
LDIR на какую-то другую команду, и сразу
же возникает вопрос, - А где взять такую
команду и каким "Макаром" она будет рабо-
тать. Для начала возьмите каккую-нубудь
книгу про Ассемблер и найдите там кодиров-
ку всех команд (там это толжно быть на
последних страницах). В одной из колонок
этой таблицы должно быть написано время
выполнения каждой команды в отдельности.
Поищите в таблице команду LDIR и LDI, и
посмотрите на скорость их выполнения.
Оказуется, что LDI выполняется за меньшее
количество тактов чем LDIR. Ну вот, с пер-
вой задачей мы и справились, заменив ко-
манду LDIR на LDI. Давайте теперь подроб-
ней рассмотрим команду LDI. Недостаток у
нее такой, LDI пересылает не группу байтов
как LDIR, а всего лишь один! Попробуйте
сейчас вместо LDIR поставить LDI и запус-
тив, посмотрите что получится. Получилось
так, как я и говорил, вывелся всего один
байт из нашего спрайта. Чтобы спрайт выво-
дился с размерами которые мы задали, пос-
мотрите в начало процедуры на регистр BC,
в нем задано количество байтов по ширине.
Вот возьмите теперь и поставте столько ко-
манд LDI сколько написано в регистере BC.
Все должно отлично работать.
══════════════════════════════════════════
Другие статьи номера:
Похожие статьи:
В этот день... 18 ноября