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сли кого это заинтересовало - зво- ните, пишите, присылайте свои раз- работки - мы вас поддержим. Желаю удачи !!!



Other articles:


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Similar articles:
We will understand - Game Description THE GREAT ESCAPE.
Aperativchik - On the control of the shell DEJA VU
Ottyag - Terminology of the user or the modern spoken language. Marazminki: 10 reasons why the dinosaurs became extinct. 10 contenders for the Ninja Turtles. 10 things you could do V. Van Gogh. 10 things you can cry, stealing back to my Granddaddy. 10 things that would gluppo say what who came to buy your house. 10 things you can give a deaf-rodst ots. That you should not say or do, if you nazh- ralsya. Chinese poslivitsy. The Gospel of Mitkov. Tests: "Are you cool demomayker?" "Do you have friends?" "Russian Folk Chernushka" (scanned images of SERGA)

В этот день...   13 February