┌──────────────────────────────┐
│ │
│ ЭТЮДЫ │
│ │
└──────────────────────────────┘
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
* * *