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: