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 * * *
Другие статьи номера:
Похожие статьи:
В этот день... 31 марта