Урок ассемблера 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 ; Вот так - вот все просто. Если, что не понятно, то ждем писем. __________________________________________