Speccy
#06
31 августа 1996 |
|
Программирование - эффект перелистывания страниц текста по синусу.
╒══════════════════════════════╕ │░░░░░░ ПРОГРАММИРОВАНИЕ ░░░░░░│ ╘══════════════════════════════╛ Кузнецов Владимир ─────────────────── 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
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября