ZX Review #7-8-9-10
08 ноября 1997

Этюды - Графический эффект "цветные полосы".

┌──────────────────────────────┐
│                              │
│            ЭТЮДЫ             │
│                              │
└──────────────────────────────┘

Music by ZET

(c) Иван Рощин, г.Москва, 1996

   Предлагаю вашему вниманию на-
писанную мной  программу, реали-
зующую красивый графический  эф-
фект: по экрану  движутся  цвет-
ные  полосы, плавно  переходящие
друг в друга.  Этот  полноэкран-
ный  REAL-TIME  эффект  занимает
всего  лишь  около  60%  времени
процессора.  Порядок  следования
полос и плавность перехода  меж-
ду ними можно изменять.

140.;****************************************************

CLR0    EQU     0     ;ЦВЕТА ПОЛОС
CLR1    EQU     1     ;(СВЕРХУ ВНИЗ)
CLR2    EQU     2
CLR3    EQU     3
CLR4    EQU     4
CLR5    EQU     5
CLR6    EQU     6

;****************************************************

DEMO    LD      C,0        ;СМЕЩЕНИЕ ПО ВЕРТИКАЛИ

;ПОЛОСЫ ПОДНИМАЮТСЯ:

LOOP1   CALL    SHOW       ;РИСУЕМ ПОЛОСЫ
        CALL    KEY        ;ЧТО-НИБУДЬ НАЖАТО ?
        RET     NZ         ;ЕСЛИ ДА, ВЫХОДИМ
        INC     C          ;УВЕЛИЧИЛИ СМЕЩЕНИЕ
        LD      A,C        ;ДОСТИГЛИ МАКСИМАЛЬНОГО ?
        CP      TABMAXA-23
        JP      NZ,LOOP1   ;ЕСЛИ НЕТ, ПРОДОЛЖАЕМ.

;ПОЛОСЫ ОПУСКАЮТСЯ:

        DEC     C          ;УМЕНЬШИЛИ
        DEC     C          ;СМЕЩЕНИЕ
LOOP2   CALL    SHOW       ;РИСУЕМ ПОЛОСЫ
        CALL    KEY        ;ЧТО-НИБУДЬ НАЖАТО ?
        RET     NZ         ;ЕСЛИ ДА, ВЫХОДИМ
        DEC     C          ;УМЕНЬШИЛИ СМЕЩЕНИЕ
        LD      A,C        ;ДОСТИГЛИ МИНИМАЛЬНОГО ?
        CP      #FF
        JP      NZ,LOOP2   ;ЕСЛИ НЕТ, ПРОДОЛЖАЕМ.

        LD      C,1        ;ИНАЧЕ ПЕРЕХОДИМ НА
        JP      LOOP1      ;НАЧАЛО ПРОГРАММЫ.

;***************************************
;ПРОЦЕДУРА SHOW
;ВХОД: C -СМЕЩЕНИЕ ПОЛОС ПО ВЕРТИКАЛИ (В
;         ЗНАКОМЕСТАХ)
;ВЫХОД: ИЗОБРАЖЕНА СООТВ. КАРТИНКА.

SHOW ;СНАЧАЛА ИЗОБРАЖАЕМ АТРИБУТЫ:

        LD      DE,TABL_A ;АДРЕС ТАБЛИЦЫ АТРИБУТОВ
        LD      H,0       ;HL =СМЕЩЕНИЕ
        LD      L,C
        ADD     HL,DE     ;ПРИБАВЛЯЕМ СМЕЩЕНИЕ
        LD      DE,#5800  ;НАЧАЛО ФАЙЛА АТРИБУТОВ

        HALT    ;ЖДЕМ НАЧАЛА КАДРА
        DI      ;ЗАПРЕЩАЕМ ПРЕРЫВАНИЯ, Т.К.
                ;БУДЕМ МАНИПУЛИРОВАТЬ СО СТЕКОМ.

NEXT_A  LD      A,(DE)    ;КАКОЙ АТРИБУТ ИЗОБРАЖЕН ?
        CP      (HL)      ;ТО,ЧТО НАДО ?
        JP      Z,RETU    ;ЕСЛИ ДА,НЕ ПЕЕСЫЛАЕМ

        PUSH    HL        ;СОХРАНИЛИ АДРЕС ИСТОЧНИКА

        LD      A,(HL)    ;БАЙТ ИЗ ИСТОЧНИКА
        LD      (M1+1),SP ;СОХРАНИЛИ SP (ОБРАТИТЕ ВНИМАНИЕ,КУДА).
        LD      HL,#20    ;ФОРМИРУЕМ НОВЫЙ
        ADD     HL,DE     ;АДРЕС СТЕКА
        LD      SP,HL
        LD      D,A       ;ЧЕМ ЗАПОЛНЯТЬ
        LD      E,A       ;СТРОКУ

        PUSH    DE       ;ФОРМИРУЕМ ОДНУ
        PUSH    DE       ;СТРОКУ
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE
        PUSH    DE

        EX      DE,HL    ;В DE НОВЫЙ АДРЕС ПРИЕМНИКА

M1      LD      SP,0     ;ВОССТАНОВИЛИ SP.
                         ;ЭТА КОМАНДА ЗАГРУЗКИ SP
                         ;ВЫПОЛНЯЕТСЯ ВДВОЕ БЫСТРЕЕ,
                         ;ЧЕМ КОМАНДА LD SP,(NN).
        POP     HL       ;ВОССТАНОВИЛИ HL
        JP      NE_RETU  ;КСТАТИ, КОМАНДА JP
                         ;ВЫПОЛНЯЕТСЯ БЫСТРЕЕ,
                         ;ЧЕМ КОМАНДА JR.

;ЕСЛИ СТРОКУ НЕ ПРИШЛОСЬ ЗАПОЛНЯТЬ,
;УВЕЛИЧИВАЕМ DE (АДР. ПРИЕМНИКА) НА #20:

RETU    LD      A,#20    ;ВЫГЛЯДИТ ЭТО
        ADD     A,E      ;НЕПРИВЫЧНО, НО
        LD      E,A      ;РАБОТАЕТ
        LD      A,0      ;БЫСТРЕЕ.
        ADC     A,D
        LD      D,A

;ИНАЧЕ АДРЕС ПРИЕМНИКА УЖЕ УВЕЛИЧЕН.

NE_RETU INC     HL      ;АДРЕС ИСТОЧНИКА
        LD      A,D
        CP      #5B
        JP      NZ,NEXT_A

;ТЕПЕРЬ РИСУЕМ КАРТИНКУ:

        LD      L,C      ;СМЕЩЕНИЕ В ЗНАКОМЕСТАХ
        SLA     L        ;УМНОЖАЕМ НА 8
        SLA     L
        SLA     L
        RES     7,L
        LD      B,L      ;ПОЛУЧИЛИ СМЕЩЕНИЕ В ТАБЛИЦЕ

        LD      H,0      ;HL=СМЕЩ. В ТАБЛИЦЕ
        LD      DE,TABL  ;АДРЕС ТАБЛИЦЫ
        ADD     HL,DE
        EX      DE,HL
        LD      HL,#4000 ;НАЧАЛО ДИСПЛЕЙНОГО ФАЙЛА

;ЗДЕСЬ, НАОБОРОТ, HL-АДРЕС ПРИЕМНИКА, А
;DE -АДРЕС ИСТОЧНИКА.

NEXT    LD      A,(DE)    ;ИЗОБРАЖАЕМЫЙ БАЙТ
        CP      (HL)      ;СРАВНИВАЕМ С ИЗОБРАЖЕННЫМ.
        JP      Z,RET3    ;ЕСЛИ РАВНЫ,НЕ ПЕРЕСЫЛАЕМ

        PUSH    HL        ;СОХРАНИЛИ АДРЕС ПРИЕМНИКА

;УВЕЛИЧИВАЕМ HL (АДР. ПРИЕМНИКА) НА #20:

        LD      A,#20    ;ВЫГЛЯДИТ ЭТО
        ADD     A,L      ;НЕПРИВЫЧНО, НО
        LD      L,A      ;РАБОТАЕТ
        LD      A,0      ;БЫСТРЕЕ.
        ADC     A,H
        LD      H,A

        LD      (M2+1),SP ;СОХРАНИЛИ SP
        LD      SP,HL     ;SP УКАЗЫВАЕТ НА КОНЕЦ СТРОКИ

        LD      A,(DE)
        LD      H,A      ;ЧЕМ ЗАПОЛНЯТЬ
        LD      L,A      ;СТРОКУ

        PUSH    HL       ;ФОРМИРУЕМ ОДНУ
        PUSH    HL       ;СТРОКУ
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL
        PUSH    HL

M2      LD      SP,0  ;ВОССТАНОВИЛИ SP
        POP     HL    ;ВОССТАНОВИЛИ АДРЕС ПРИЕМНИКА

RET3    INC     DE    ;УВЕЛИЧИЛИ АДРЕС ИСТОЧНИКА
        INC     B     ;УВЕЛИЧИЛИ СЧЕТЧИК
        LD      A,B
        CP      TABMAX    ;ДОСТИГНУТ MAX. АДРЕС ?
        JP      NZ,TAB_OK
        LD      B,0       ;ЕСЛИ ДА, ОБНУЛЯЕМ СЧЕТЧИК
        LD      DE,TABL   ;И ПЕРЕХОДИМ К НАЧАЛУ ТАБЛИЦЫ

TAB_OK  INC     H         ;ОПРЕДЕЛЯЕМ
        LD      A,H       ;АДРЕС НОВОЙ
        AND     7         ;СТРОКИ НА
        LD      A,H       ;ЭКРАНЕ
        JP      NZ,NEW_OK ;ПО АДРЕСУ
        LD      A,L       ;ПРЕДЫДУЩЕЙ
        ADD     A,32      ;СТРОКИ.
        LD      L,A
        LD      A,H
        JP      C,NEW_OK
        LD      A,H
        SUB     8
        LD      H,A

NEW_OK  CP      #58
        JP      NZ,NEXT

        EI
        RET

;***************************************

TABMAX  EQU     16*8   ;РАЗМЕР МАССИВА ДАННЫХ (СМ.НИЖЕ)

TABL    DB      %00000000  ;ДАННЫЕ ДЛЯ ФОРМИРОВАНИЯ
        DB      %00000000  ;ПЛАВНОГО ПЕРЕХОДА МЕЖДУ
        DB      %00000000  ;ЦВЕТНЫМИ ПОЛОСАМИ.
        DB      %00000000  ;КСТАТИ, ОТ ЭТИХ ДАННЫХ
        DB      %00000000  ;ЗАВИСИТ БЫСТРОДЕЙСТВИЕ
        DB      %00000000  ;ПРОЦЕДУРЫ SHOW.
        DB      %00000000
        DB      %00000000
        DB      %00000000
        DB      %00000000
        DB      %00000000
        DB      %00000000
        DB      %00000000
        DB      %00000000
        DB      %00000000
        DB      %00000000

        DB      %00001000
        DB      %00000000
        DB      %10000000
        DB      %00000000
        DB      %00001000
        DB      %10000000
        DB      %00001000
        DB      %10000000

        DB      %00100010
        DB      %10001000
        DB      %00100010
        DB      %10001000
        DB      %00100010
        DB      %10001000
        DB      %00100010
        DB      %10001000
        DB      %00100010
        DB      %10001000
        DB      %00100010
        DB      %10001000
        DB      %00100010
        DB      %10001000
        DB      %00100010
        DB      %10001000

        DB      %00100010
        DB      %01010101
        DB      %10001000
        DB      %01010101
        DB      %00100010
        DB      %01010101
        DB      %10001000
        DB      %01010101
        DB      %00100010
        DB      %01010101
        DB      %00100010
        DB      %01010101
        DB      %10001000
        DB      %01010101
        DB      %00100010
        DB      %01010101
        DB      %10001000
        DB      %01010101
        DB      %00100010
        DB      %01010101

        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101
        DB      %10101010
        DB      %01010101

        DB      %10101010
        DB      %01110111
        DB      %10101010
        DB      %11011101
        DB      %10101010
        DB      %01110111
        DB      %10101010
        DB      %11011101
        DB      %10101010
        DB      %01110111
        DB      %10101010
        DB      %11011101
        DB      %10101010
        DB      %01110111
        DB      %10101010
        DB      %11011101
        DB      %10101010
        DB      %01110111
        DB      %10101010
        DB      %11011101

        DB      %11011101
        DB      %01110111
        DB      %11011101
        DB      %01110111
        DB      %11011101
        DB      %01110111
        DB      %11011101
        DB      %01110111
        DB      %11011101
        DB      %01110111
        DB      %11011101
        DB      %01110111
        DB      %11011101
        DB      %01110111
        DB      %11011101
        DB      %01110111

        DB      %01111111
        DB      %11110111
        DB      %01111111
        DB      %11110111
        DB      %11111111
        DB      %01111111
        DB      %11111111
        DB      %11110111

;********************************************************

TABMAXA EQU     6*16+2 ;РАЗМЕР МАССИВА ДАННЫХ (СМ.НИЖЕ)

TABL_A  DB      CLR0*8+CLR1   ;ОТ ЭТИХ ДАННЫХ ЗАВИСИТ
        DB      CLR0*8+CLR1   ;ЦВЕТ КАЖДОЙ ПОЛОСЫ
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1

140.        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1
        DB      CLR0*8+CLR1

        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2
        DB      CLR1*8+CLR2

        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3
        DB      CLR2*8+CLR3

        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4
        DB      CLR3*8+CLR4

        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5
        DB      CLR4*8+CLR5

        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6
        DB      CLR5*8+CLR6

        DB      CLR6*8+CLR6
        DB      CLR6*8+CLR6

;**************************************
;ПРОЦЕДУРА KEY ВОЗВРАЩАЕТ ФЛАГ Z=0,
;ЕСЛИ НА КЛАВИАТУРЕ ЧТО-НИБУДЬ НАЖАТО.

KEY     XOR     A
        IN      A,(254)
        AND     %00011111
        CP      %00011111
        RET
2
          *   *   *




Другие статьи номера:

TR-DOS для начинающих - Окончание.

Компьютерная новелла - Prince of Persia.

Компьютерная новелла - Лазерная бригада (по игре Laser Squad).

Перекресток драконов - Игра Rapscallion.

Перекресток драконов - Игра The Runes of Zendos.

Перекресток драконов - Игра The Saga.

Перекресток драконов - Игра Witch's Cauldron.

Перекресток драконов - Создаём Адвентюру. Обзор редакторов.

Перекресток драконов - Создаём словарь к Адвентюрной игре.

Программы, которые мы выбираем - Возможные последствия использования недокументированных команд.

Программы, которые мы выбираем - О замеченных шероховатостях в работе некоторых программ и пожелания к следующим версиям.

Программы, которые мы выбираем - Предложение ко всем авторам программ, печатающих дамп памяти. Программистам, использующим защиту дисков от копирования.

Программы, которые мы выбираем - Несколько предложений по усовершенствованию ассемблера.

Программы, которые мы выбираем - Предложения по доработке ZX Word v2.5.

Программы, которые мы выбираем - Программа "Эмулятор Спектрума" v1.2.

Программы, которые мы выбираем - Что хотелось бы иметь в идеальном ассемблере.

Ретро - 40 лучших процедур: Копирование данных в памяти.

Ретро - 40 лучших процедур: Обмен токена.

Ретро - 40 лучших процедур: Определение адреса БЕЙСИК-строки.

Ретро - 40 лучших процедур: Определение длины БЕЙСИК-программы.

Ретро - 40 лучших процедур: Определение размера свободной памяти.

Ретро - 40 лучших процедур: Поиск и замещение строки.

Ретро - 40 лучших процедур: Поиск подстроки.

Ретро - 40 лучших процедур: Поиск строки.

Ретро - 40 лучших процедур: Составление списка переменных.

Ретро - 40 лучших процедур: увеличение и копирование экрана.

Ретро - 40 лучших процедур: Удаление REM-строк.

Ретро - 40 лучших процедур: Удаление блока программы.

Советы экспертов - Игра Fredloader.

Советы экспертов - Игра Robin of Sherwood: The Touchstones of Rhianon.

Советы экспертов - Игра Scorpions: Die Machines.

Советы экспертов - Игра Terropods.

Страничка iS-DOS - Описание рестартов системы IS DOS.

Форум - Алгоритм распознавания символов.

Форум - Время выполнения недокументированных команд процессора Z80.

Форум - Концепция экрана высокого цветового разрешения.

Форум - Несколько Pokes к играм. Программа Hacman96.

Форум - По поводу новых DOS и BIOS для Спектрума.

Форум - Программа Multicolor на любой модели компьютера. Использование 2-го экрана для Multicolor'а. Демонстрация текста. Электронные журналы.

Форум - Проект ZX Config.

Форум - Усовершенствование Art Studio. Идеи относительно компрессии файлов.

Форум - Эмулятор ZX Spectrum на IBM. По поводу шестнадцатеричной системы счисления. Программа ZX-Stars. Странности в Elita

Форум - Эффекты на бордюре и Multicolor.

Читатель-читателю - ZX Spectrum 128 - новые возможности, новые проблемы.

Читатель-читателю - Группа 'Light'. Спектрум и экспертная система.

Читатель-читателю - Драйвер принтера для Scorpion'а.

Читатель-читателю - Печать чисел в различных системах счисления.

Читатель-читателю - Программирование аркадной игры со скроллингом экрана.

Читатель-читателю - Процедура печати меток ассемблера XAS для монитора-отладчика STS 4.3.

Этюды - Атрибутная бегущая строка. "Гасилка" экрана. Упрощенный вариант процедуры "Занавес". Процедура гащения картинки. Процедура проявления картинки по точкам.

Этюды - Графический эффект "цветные полосы".

Этюды - Драйвер экрана для печати по 64 символа в строке.

Этюды - Комплект защит загрузчиков.

Этюды - Обращение к диску в режиме IM 2. Работа с диском нестандартного формата.

Этюды - Печать символа, увеличенного в 8 раз. Программа "наливания" экрана. Процедура гашения экрана по точкам. Очистка экрана как в Terminator'е. Поиск последовательности символов в памяти. Система перекодировки символьного набора.

Этюды - Программа - каталогизатор дисков.

Этюды - Программа вывода значений амплитуды каналов муз. сопроцессора на бордюр.

Этюды - Программа вывода картинки.

Этюды - Программа зажигания спрайта.

Этюды - Программа очистки заданного окна экрана.

Этюды - Программа сортировки массива по возрастанию. Процедура заполнения экрана заданным атрибутом. Процедура проявления картинки. Эффект летящих навстречу звезд. "Душ", идущий из верхнего левого угла экрана. Процедура "осыпания" картинки по пиксельным линиям. Программа "вытягивания" картинки под углом в 45 градусов. Три процедуры "Scroll".

Этюды - Процедура печати чисел.

Этюды - Процедура прорисовки символа с помощью атрибутов.

Этюды - Процедура проявления картинки. Fade-OUT эффект (картинка уходит за края экрана). Графический эффект "Фонтан". Fade-OUT эффект, имитирующий выключение телевизора. Процедура "зажигания" картинки. Программа плавной прорисовки картинки.

Этюды - Процедура рисования линии.

Этюды - Процедура составления оптимальной таблицы символов.

Этюды - Скроллинг строк текста в заданном окне. Атрибутный скроллер. Диагональный скроллинг.

Этюды - Спрайтовый скроллер. Процедуры проявления экрана.

Этюды - Укороченная процедура индикации амплитуды каналов муз. сопроцессора. Способ вычитания константы из регистровой пары HL.

Этюды - Формула для вычисления дня недели.


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

Похожие статьи:
События, факты - Черный ворон-2.
Beatles - история Макаревича о неком легендаpном Коли Васина.
Обратная связь - контакты редакции.

В этот день...   18 июня