|
Move
#02
03 февраля 1997 |
|
Программистам - Пишем Multicolor...

ПРОГРАММИСТАМ
──────────────────────────────────────────
(c) Alexander Nikiforov
В этом номере я решил ввести новую руб-
рику в нашей газете для начинающих програ-
мистов. В данном номере я решил написать
про очень простой эффект именуемый
multicolor. И только я собрался писать эту
статью как в Минск пришел ZX-FORMAT #5, а
в нем была небольшая статейка про эффекты
на border'е. В данной ситуации я решил
немного сократить изложение моих мыслей,
касающихся border'а, но все равно не удив-
ляйтесь если заметите кое-какие повторе-
ния.
Для начала немного информации. Как из-
вестно в ZX-SPECTRUM 50 раз в секунду при-
ходит сигнал INT. Одновременно с приходом
данного сигнала микросхема ULA начинает
формировать изображение на экране, начиная
с верхнего левого угла. Одну строку экрана
ULA выводит за 224 такта Z80 (на некоторых
машинах это происходит за 220 тактов
[ZX-FORMAT #5]). Всего у Спектрума 312
строк, а у Пентагона - 320. Поэтому форми-
рование изображения на экране у Спектрума
занимает 312*224=69888 тактов Z80, а у
Пентагона 320*224=71680 тактов (вот ответ
на вопрос: "Почему у Пентагона "влазит на
прерывание" больше эффектов чем у Спектру-
ма). Зная эту информацию можно легко сооб-
разить как сделать multicolor: надо все-
го-то установить нужный цвет border'а пе-
ред выводом ULA на экран нужной строки эк-
рана монитора, а через 224 (220) такта
сменить его на другой цвет и т.д. Не-
большой пример:
DI
LD HL,#FE00
LD A,H
LD I,A
DEC A
LD (HL),A ; Организажия второго
INC L ; режима прерываний
JR NZ,$-2
INC H
LD (HL),A
LD A,#C9 ; В обработке прерыва-
LD (#FDFD),A ; ния ставим только
IM 2 ; команду RET
LOOP EI
HALT
CALL PAUSE
; Красный цвет
LD A,2 ; 7 тактов
CALL BORDER ; +17=24 такта
; Желтый цвет
LD A,6
CALL BORDER
; Синий цвет
LD A,1
CALL BORDER
; и т.д.
XOR A
OUT (254),A
LD A,#7F ; Проверка нажатия
IN A,(#FE) ; пробела
RRA
JP C,LOOP
DI ; Возврат в ассемблер
LD A,#3F ; (или в BASIC).
LD I,A
IM 1
EI
RET
BORDER OUT (254),A ; 11 тактов
LD B,13 ; +7=18
DJNZ $ ; +12*13+8=+164=182
NOP ; +4=186
NOP ; +4=190
RET ; +10=200 тактов
; 200 + 24 = 224 такта!
А теперь небольшие коментарии. Ре-
зультатом работы программы будут 3 (или
больше если Вы вставили вместо "и т.д."
еще несколько команд изменения цвета)
цветные полосы на border'е. Подпрограмма
PAUSE служит для задержки перед выводом
полос на border, так как обычно на телеви-
зорах и мониторах невидно несколько
верхних и нижних строк, и поэтому Вы
должны написать ее сами под Вашу машину и
монитор. Можно написать несколько разных
подпрограмм PAUSE для разных типов машин
или сделать одну, но с возможностью ее
подстойки пользователем при помощи клавиа-
туры (как это сделано в EXTASY).
Ну вот кажется и все, что я хотел напи-
сать про эффекты на border'e. Если что-ни-
будь непонятно, то почитайте ZF#5, может
быть там поймете.
А сейчас немного о multicolor'е на эк-
ране. Принцип все тот же: перед рисованием
ULA строки на экране установите в атрибу-
тах экрана нужный цвет, а через 224 (220)
тактов смените его на другой. Однако сме-
нить атрибуты экрана значительно сложнее
чем border'а, так как атрибутов в одной
строке 32. Единственный выход менять их
через стек, так как другим способом Вы не
не сумеете уложиться в 224 такта. Пример:
DI
LD HL,#4000
LD DE,#4001
LD BC,2047
LD (HL),#FF
LDIR
LD HL,#FE00
LD A,H
LD I,A
DEC A
LD (HL),A ; Организажия второго
INC L ; режима прерываний
JR NZ,$-2
INC H
LD (HL),A
LD A,#C9 ; В обработке прерыва-
LD (#FDFD),A ; ния ставим только
IM 2 ; команду RET
LD (OLD_SP+1),SP ; Сохраняем стек
LOOP EI
HALT
CALL PAUSE
LD HL,#4242 ; 10
LD SP,#5820 ; +10=20
DS 9,#E5 ; +9*11=+99=119
LD HL,#4444 ; +10=129
IN A,(254) ; +11=140
LD A,(HL) ; +7=147
DS 7,#E5 ; +7*11=+77=224
LD HL,#4444
LD SP,#5820
DS 9,#E5
LD HL,#4141
IN A,(254)
LD A,(HL)
DS 7,#E5
LD HL,#4141
LD SP,#5820
DS 9,#E5
LD HL,#4646
IN A,(254)
LD A,(HL)
DS 7,#E5
LD HL,#4646
LD SP,#5820
DS 9,#E5
LD HL,#4242
IN A,(254)
LD A,(HL)
DS 7,#E5
LD HL,#4242
LD SP,#5820
DS 9,#E5
LD HL,#4444
IN A,(254)
LD A,(HL)
DS 7,#E5
LD HL,#4444
LD SP,#5820
DS 9,#E5
LD HL,#4141
IN A,(254)
LD A,(HL)
DS 7,#E5
LD HL,#4141
LD SP,#5820
DS 9,#E5
LD HL,#4646
IN A,(254)
LD A,(HL)
DS 7,#E5
LD HL,#4646
LD SP,#5820
DS 9,#E5
LD SP,#580E
LD HL,#4242
IN A,(254)
LD A,(HL)
DS 7,#E5
OLD_SP LD SP,0
LD A,#7F ; Проверка нажатия
IN A,(#FE) ; пробела
RRA
JP C,LOOP
DI ; Возврат в ассемблер
LD A,#3F ; (или в BASIC).
LD I,A
IM 1
EI
RET
Результатом работы этой программы будет
восемь цветов в одном знакоместе. Но для
этого Вам будет необходимо подобрать паузу
в подпрограмме PAUSE, так что-бы программа
COLOR начала работу как раз во время рисо-
вания ULA первой строки спектрумовского
экрана. Так как ULA рисует изображение на
экране слева направо, а атрубуты меняются
через стек справа налево, то в середине
программы вывода атрибутов стоят две ко-
манды задержки IN A,(254) и LD A,(HL). Они
нужны для того что-бы атрибуты не выдава-
вались на экран на то знакоместо которое в
данный момент рисует ULA. Если этого не
сделать то на экране будут появляться вся-
кие "левые" эффекты. Может быть на некото-
рых машинах эти команды надо вставлять
немного раньше или позже. Если кто не зна-
ет, что за такая команда DS 9,#E5, то объ-
ясняю: это девять (первая цифра) команд
PUSH HL код котой #E5 (вторая цифра). Дан-
ный формат поддерживают MASM и TASM v.4.*.
Все программы которые здесь приведены
были мною написаны для рекламной демки мо-
его сервера (которую я так до сих пор и не
дописал :-( ) и поэтому гарантирована их
стопроцентная работоспособность.
Ну вот и все, что я хотел написать. На-
деюсь что Вы все-таки что-то поняли из то-
го, что я здесь насочинял.
P.S. Прочитал я весь этот бред заново и
понял, что вероятно зря надеюсь.
P.P.S. Но надежда умирает последней...
Другие статьи номера:
Похожие статьи:
В этот день... 19 ноября