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

Amazing #02
(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.
Все должно отлично работать.

══════════════════════════════════════════