Из газеты Move #02, Минск, 4.02.1997 ПРОГРАММИСТАМ ------------------------------------------ (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. Но надежда умирает последней...