Realtime
#01
13 января 1996 |
|
Программирование - использования стека для ускорения программ.
MAXWELL ═══════ Сегодня мы расскажем Вам о том, как можно намного повысить скорость вы- полнения Ваших программ, а именно ,о таком приеме программирования , как "переливание по стеку". Преимущества этого способа говорят сами за себя . Но не будем опережать события и рас- скажем обо всем по порядку. Приведем такой пример: Вы наверное знаете , что для очист- ки экрана программисты обычно поль- зуются программой с использованием комманды LDIR . Я привожу ее ниже ( в скобках дано время исполнения комманды или группы комманд при вы- полнении ее в цикле в тактах процес- сора ): LD НL,#4000 (10) ; началo экраннoй oбластu LD DE,#4001 (10) ; началo экрана +1 LD BC,#17FF (10) ; размер oчuщаемoй oбластu LD (НL),L (7) ; oчuстuть LDIR (21*Б143) ; выпoлнять дo кoнца REТ Итого 129040 тактов процессора . Но для очистки экрана в программах с множеством двигающихся объектов (на- пример в музыкальных демонстрациях с использованием двух страниц экранной памяти ) такая процедура не подходит из-за ее медленного выполнения . Но очень хорошо подходит метод 'перели- вания по стеку'.Этот метод позволит настолько быстро убрать с экрана все лишнее , что вы даже и не заметите этого . Вся 'изюминка' заключена в том, что мы одной коммандой PUSН за- несем сразу два байта в область, ко- торую хотим очистить. Используем новый метод: LD (SТEК),SP (20) ; сoхранuть стек для вoзврата LD НL,#0000 (10) ; чтo будем занoсuть LD SP,#S800 (10) ; устанoвuм стек LD BC,3072 (10) ; размер oбластu /2 LООP PUSН НL (11*3072) ; занoсuм DEC BC (Б*3072) ; прoверка на oкoнчанuе LD A,B (4*3072) ; ОR C (4*3072) ; JR МZ,LООP (12*3072+7); еслu не все,тo uдем на LООP LD SP,(SТEК) (10) ; вoсстанoвuть стек REТ SТEК DEFW 0 Здесь нужно позаботиться о том , чтобы сохранить адрес расположения стека, а по окончании процедуры его нужно будет восстановить . Иначе ви- деоэффекты и зависание компьютера Вам обеспечены . В пару регистров SP мы заносим адрес начала области ат- рибутов , так как стек растет сверху вниз. В регистровой паре ВС 'сидит' число 6144 (размер экранной области) уменьшенное в 2 раза , так как при исполнении микропроцессором комманды PUSН НL в стек помещается сразу 2 байта - Н и L . Ну , посмотрим, что там у нас полу- чилось по тактам : 113731 ! Заме- тили разницу ? Но и это еще не все, на что способен старина 'SPEССY' ! Зачем выполнять лишние комманды для проверки 'кончилась область или еще еще нет' ? Ведь можно поступить сов- сем другим способом и поставить од- ну и ту же комманду несколько раз подряд . Вот что может получиться : LD (SТEК+1),SP (20) LD НL,#0000 (10) LD SP,#S800 (10) PUSН НL (11*3072) PUSН НL PUSН НL ....... u так 3072 раза ....... PUSН НL SТEК LD SP,#0000 (10) REТ Во первых мы засылаем значение сте- ка сразу в команду восстановления, а во вторых мы не используем лишние комманды для возврата в цикле , хотя такой способ и занимает больше места в памяти. Итак здесь мы имеем 33842 тактов!!! Ну как? Mы вас убедили? Кстати, что- бы облегчить 'забивание' всех этих PUSН НL в ассемблере TASM 3.00i пре- дусмотрена функция DEFS <размер> , <последовательность>. В нашем случае это будет выглядеть так : DEFS 3072, 229 .Вам остается лишь вставить эту строчку в то место программы , где у Вас должны находиться комманды PUSН НL . Tак что теперь Вы можете смело садиться за клавиатуру и пи- сать программы не думая о том, что все это будет работать слишком мед- ленно. Этот прием можно применять не толь- ко с коммандами PUSН , но и с любыми другими.Tак,например, если захочется вывести несколько точек на экран в заранее определенные адреса ( напри- мер звезды в какой-нибудь космичес- кой стрелялке ), то это можно орга- низовать так : LD B,1 ; этo тoчка (%00000001) LD (SТEК+1),SP ; запoмнuлu стек LD SP,ADDR ; устанoвuлu стек на массuв адресoв PОP НL ; взялu адрес экрана uз массuва LD A,(НL) ; чтo на экране , тo в регuстр A ОR B ; налoжuлu тoчку LD (НL),A ; вернулu на экран PОP НL ; пoвтoрuлu LD A,(НL) ; ОR B ; LD (НL),A ; ....... ; скoлькo нужнo раз ; ....... ; SТEК LD SP,#0000 ; вoсстанoвuлu стек REТ ; ADDR DEFW #4000 ; здесь нахoдuтся массuв адресoв DEFW #4020 ; экраннoй oбластu DEFW ..... ; u так далее Mожете проверить - работать будет! Ну а о применении всего того, о чем я здесь наговорил догадаетесь сами. Пожалуй со следующего номера я начну приводить конкретные примеры различных спецэффектов и программ. Eсли кого это заинтересовало - зво- ните, пишите, присылайте свои раз- работки - мы вас поддержим. Желаю удачи !!!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября