Урок ассемблера no.3
____________________
(С) Phantom Lord
Music by Shov
Сегодня я расскажу о вещи, которая порой
очень сильно мешает программистам в реали-
зации своих идей, о телевизионном луче.
Идею написания о этой проблемке подбросил
мне один мой друг, поскольку он сам с ней
столкнулся. Я думаю, что эффект перегиба-
ния или исчезновения изображения знаком
всем, поэтому если вы не знаете, как с ним
бороться, то лучше почитайте этот текст -
пригодится.
Для начала расскажу, как строится изобра-
жение на экране. Экран спектрума разбит на
320 (В стандарте, на Скорпионах старых мо-
делей 312) строк, длина которых на разных
моделях компьютеров разная, но стараются
придерживаться 216/224 тактов процессора.
Луч движется слева направо и достигая пра-
вого предела переходит на следующую нижнюю
строчку. Весь путь хода луча по всему эк-
рану назван "frame'ом". Одна секунда равна
50 frames, т.е. луч за 1 секунду проделы-
вает свой (нелегкий) путь 50 раз.
Для управления лучом (если так можно ска-
зать) существует всего одна команда - HALT
- эта команда дает лучу достроить изобра-
жение и перейти к построению "нового" эк-
рана, т.е. дает лучу команду начать свой
ход заново.
Теперь, когда возникают проблемы ?
Аксиома: Если напечатать на экране в том
месте, где луч уже прошел, то в этот frame
вы изображение не увидите !
Теперь вам наверное понятно , почему во
многих программах курсор вверху становится
невидимым . Для тех , кто не понял , об-
ъясню . Рассмотрим схему работы курсора:
1. Восстановить изображение, которое
было под курсором;
2. Запомнить изображение под курсором
с новыми координатами;
3. Напечатать сам курсор.
Так вот, пока выполняются первые два
пункта, луч уже ниже координат строки .
Тут и применяем нашу аксиому, т.е. курсора
вы не увидите.
Раз суть проблемы понятна, то нужно раз-
рабатывать методы борьбы с ней. Существуют
три практических метода:
1. Синхронизация изображения, путем
хитрых алгоритмов.
2. Использывание двух экранов, для
создания мультиэффекта.
3. Использывание порта атрибутов #FF
Сразу расскажу о третьем методе. Надеюсь
никто его не будет использовать в своих
программах, поскольку по моим подсчетам
90% спектрумистов не имеют порт #FF. Преи-
мущество порта #FF в том, что вам не нужно
знать особенности формирования INT'а комп-
ьютера. Вы можете всегда через порт #FF
узнать где находится луч, в зоне BORDER
или PAPER. А это и есть те знания, ко то-
рые необходимы программисту для синхрони-
зации своих шедевров.
Теперь о первом способе. Он заключается в
том, что вы визуально будете синхронизиро-
вать свою программу с лучом так, чтобы
каждый печатающийся объект выводился до
того момента, как до него дойдет луч. Что-
бы определить где находится луч необходимо
поменять цвет бордюра, т.е.допустим у нас
имеется процедура печати спрайта и нам на-
до определить где будет луч после того,
как спрайт напечатается.
A_1 EI
HALT
LD A,7
OUT (#FE),A
CALL PRINTSPR
LD A,1
OUT (#FE),A
JR A_1
* Не забудьте ставить HALT.
Граница белого и синего бардюра как раз и
будет показывать на местонахождение луча
на экране.
Третий способ самый легкий - ничего не
надо синхронизовать, но он действует на
машинах со 128К. В компьютерах этой конфи-
гурации вместо одного экрана с адреса
16384 (#4000) существует второй экран -
RAM 7 с 49152 (#C000). В чем же суть этого
метода? Разобьем frames на четные и нечет-
ные. В четные будем перерабатывать изобра-
жение на 1 экране, а показывать изображе-
ния на 2, а в нечетные на будем перераба-
тывать на 2, а показывать 1. (Следует еще
сказать, что 1 экран расположен в RAM 5 с
адреса 49152, но это все тот же экран что
и с 16384.)
Чтобы понять, как можно показывать один
экран, а работать с другим нужно просто
знать работу порта #7FFD.
4 бит порта как раз и отвечает за то, ка-
кой экран выводить.
Например : BC=#7FFD
LD A,#10
....,#11
....,#12
....,#13
....,#14
....,#15
....,#16
....,#17
OUT (C),A
Приведет к включению 0,1,..,7 страниц с
выводом 1 экрана.
Если же зажечь 4 бит:
LD A,#18
.....
LD A,#1F
OUT (C),A
То,включатся 0,1,...,7 страницы с выво-
дом 2 экрана.
Теперь вам наверное все понятно, но я
все же приведу пример программы для работы
с двумя экранами:
AGAIN EI ;
HALT ;
LD A,#17 ;Вкл.7 банк - 1 зкран
CALL STRAN ;
CALL ACTION ;выполняем действие
LD A,#13 ;
CALL STRAN ;вкл.3 банк - 1 экран
CALL #C006 ;музыка
EI ;
HALT ;
LD A,#1D ;вкл.5 банк - 2 экран
CALL STRAN ;
CALL ACTION ; ....
LD A,#1B ;
CALL STRAN ;вкл.3 банк - 2 экран
CALL #C006 ;
JR AGAIN ;
Вот так - вот все просто. Если, что не
понятно, то ждем писем.
__________________________________________