Move #02
03 февраля 1997

Программистам - Пишем Multicolor...

<b>Программистам</b> - Пишем 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. Но надежда умирает последней...



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

Предисловие - О новой оболочке газеты.

Список BBS - Список, работающих BBS г.Минска.

Размышления - Бредовые мысли о дальнейшем развитии оболочки газеты. Почему газета "нерегулярная".

Обзор - Обзор устройств для SPECCY : Видеопорт. Контроллер любой IBM клавиатуры.

Программистам - Пишем Multicolor...

XOR'em ALL - XOR'ки и как с ними бороться : IMP PROTECTION SYSTEM'95 & GOLDEN EAGLE PROTECTION SYSTEM.

Интервью - Интервью с Николаем Кежевниковым (NICK SOFT)

Тест - Тест "Умеете ли вы слушать собеседника".

Реклама - Реклама и объявления.


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

Похожие статьи:
ЭСМИнец - обзор свежей прессы: Psychoz 9-12, HeresY 8-10, Buzz 20, Target 10, Ебелька, ZX-Guide #4.5, RIP 15, Promised Land 2.
От авторов - Редакция.
Обзор - обзор выпусков MSD.
Playing - Советы по прохождению игр: Бегство на Хархан, Сталкер.
Дух железа - Жуткие байки о черных духах.

В этот день...   21 ноября