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. Все должно отлично работать. ══════════════════════════════════════════
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября