╒══════════════════════════════╕
│░░░░░░ ПРОГРАММИРОВАНИЕ ░░░░░░│
╘══════════════════════════════╛ Кузнецов Владимир
───────────────────
HaLLo! С Вами постоянный кор-
респондент рубрики "Программиро-
вание". За лето произошло немало
грандиозных событий (Развалилась
"Omega H.C.",успешно прошел слет
демомейкeров "Enlight'96" с вы-
текающими оттуда последствиями,я
приобрел себе "Amiga 1200" и
д.р.) и накопилась масса идей. С
одной из них я сейчас поделюсь с
Вами.
Примерно с 1994 года можно
встретить в различных интрухах,
демонстрашках и т.п.эффект пере-
листывания страниц текста по си-
нусу.Я уверен, что кто-то из Вас
пытался повторить этот эффект
(без взлома оригинала),но ничего
не получилось, т.к. обычные спо-
собы для этого не подходят. К
решению этой проблемы надо по-
дойти нестандартно, что мы сей-
час и сделаем. Но для начала ус-
ловимся о распределении памяти:
#FFFF┌──────────────────────┐
│ 2-ая страница текста │
#F000│ │
#EFFF├──────────────────────┤
│ 1-ая страница текста │
│ │
#E000└──────────────────────┘
Адреса можно взять и другие, но
эти выбраны в целях экономии па-
мяти.
Принцип эффекта очень прост:
1. Пропечатываем 1-ую страницу
(для этого необходимо будет
составить собственную проце-
дуру печати символа);
2. Выводим ее на экран;
3. Делаем паузу;
4. Пропечатываем 2-ую страницу;
5. Выводим ее на экран;
6. Делаем паузу;
7. Повторяем все с начала.
Нас будут интересовать только
пункты вывода буфера на экран.
Сделать это можно несколькими
путями. Например LDIR'ом или
стеком, а более эффективным в
данном случае будет очень ориги-
нальный метод:
PUT_B: LD (P_EXIT+1),SP
LD SP,HL
POP HL
LD (#4800),HL
POP HL
LD (#4802),HL
POP HL
LD (#4804),HL
.....
POP HL
LD (#57FE),HL
P_EXIT: LD SP,0
RET
Гениально! Мы убили сразу 2-х
зайцев:скопировали буфер (на ко-
пирование одного байта тратится
всего 13 тактов!!!) и наплевали
на нелинейность экрана! Но воз-
никает другая проблема -для про-
цедуры копирования требуется
ровно в 2 раза больше памяти,чем
выводимый буфер. Отсюда следует
вывод: если Вы пишете настолько
"гениальную" программу, что не
можете позволить себе лишнего
байта, то этот метод не для Вас.
Нет необходимости набивать "ко-
пировалку" вручную. Можно заме-
тить, что "копировалка" состоит
из повторяющихся команд,поэтому
я советую писать для таких дел
инсталятор ( процедуру, которая
сама создаст то, что Вам нужно).
Теперь нужно только на вход
"копировалки" в регистровой паре
HL подать адрес начала спрайта,а
все остальное она сделает сама.
Для смены экранов нужно
расчитать таблицу значений коси-
нуса по формуле:
X=INT(64+63.5*COS(I*PI/64)), где
X - результат
I - параметр (FOR I=0 TO 127)
Первой странице соответствуют
значения для I=[0;63], а второй
странице - I=[64;127].
Я упрощу себе задачу, исполь-
зуя готовый спрайт (отпадают
процедуры печати символов,
контроля за положением указателя
в буфере и паузы между страни-
цами). В результате получился
просмотрщик картинок 256 линий.
Чтобы не быть голословным я
подготовил программку, которая
демонстрирует 2 картинки разме-
рами 256x256 точек. Переключение
картинок происходит по нажатию
клавиши ENTER, а выход из демон-
страции по SPACE.ЯЬ
В приложении Вы найдете текст
программы для TASM ( не забудьте
загрузить русский шрифт TASM.FNT
чтобы читать мои коментарии ) и
файлы картинок ROSE.DAT и CHER.
DAT(спрайты размером 8192 байта)
P.S. Картинки (256x256) я взял
из графического редадактора
Personal Paint 6.4 (Amiga)
и там же их конвертировал в
2 цвета.
i'LL B BaCK
SPeCiaL 4 u, Mr.Key