Teleshow #03 |
|
Программы - БЕГУШАЯ СТРОКА
БЕГУЩАЯ СТРОКА
Программа, которуЮ Вы видите
ниже не что иное как сама
бегуЩая строка. Строка бежит по
одному пикселЮ, достаточно
плавно и достаточно медленно,
даже для тех, кто очень плохо
владеет грамотой, хотя
регулировать скорость скроллинга
Вы можете сами.
ВообЩе программа составлена
так, что поменяв пару строк, Вы
без труда можете передвинуть
строку в лЮбуЮ часть экрана,
пару частных случаев мы разберем
ниже. Так же Вы можете
использовать свой собственный
Шрифт, например сделаный в
графредакторе, предварительно
установив системные переменные
23606, 23607. Вы можете пустить
ваШу бегуЩуЮ строку утолЩеным
Шрифтом, а если еЩе немного
доработать программу, Вы сможете
видеть бегуЩуЮ символами двойной
высоты.
10 ORG 50000 ;Задаем адрес
размеЩения об'ектного кода
равным 50000. То есть программа
из Бейсика будет запускаться
оператором RAND USR 5E4. А
вообЩем адрес Вы можете задать
лЮбой.
15 ADDR EQU 16415 ;Адрес в
экранной области конца бегуЩей
строки, меняя его Вы можете
размеЩать строку в лЮбой части
экрана. В данном случае строка
будет бежать в верхней строке
экрана.
20 ENT $
30 LD A,0
40 LD (23560),A
;Выход из бегуЩей строки
будет осуЩествляться при нажатии
на лЮбуЮ клавиШу. Системная
переменная 23560 - содержит код
последней нажатой клавиШи и эта
переменная в дальнейШем будет
использоваться, поэтому перед
началом работы она обнуляется.
50 LD DE,TEXT
;В регистр DE заносим адрес
по которому расположен текст.
Только что были произведены
некоторые начальные установки.
Теперь займемся самой
программой. Наружный цикл
повторяется каждый раз при
выводе нового символа в конец
строки, и выполняется он до тех
пор, пока в качестве очередного
символа не будет стоять код
нуля.
60 NEXT_CHAR
70 LD B,8 ;Количество
пиксельных сдвигов строки до
печати следуЮЩего символа.
80 NEXT_PIXL
100 HALT
;Оператор выполняет
задержку, ожидая вызова
очередного маскируемого
прерывания. Если Вас
неудовлетворяет предложенный Вам
вариант: скорость движения
строки слиШком мала, или на
оборот она движется слиШком
быстро, Вы можете исправить этот
недостаток либо убрав эту
строку, либо понаставив пустых
циклов соответственно.
110 PUSH BC
;Сохраняем счетчик
предыдуЩего цикла.
120 LD HL,ADDR
;В этот регистр идет адрес
экранной области напрямуЮ
связанный с расположением строки
на экране. Адрес был определен в
строке с номером 15.
130 LD B,8
;Новый цикл начинается с
определения нового счетчика.
Восьмерка здесь означает, что
будет двигаться строка высотой в
восемь линий.
140 NEXT_LINE
150 PUSH BC
;Снова сохранение счетчика
цикла.
160 LD B,31;
Счетчик следуЮЩего цикла
цодержит количество байтов в
одной линии, которые будут
двигаться.
170 NEXT_BYTE
180 RL (HL)
;Побитовый сдвиг байта
содержаЩегося по адресу HL.
Каждая точка байта занимает
позициЮ левее. При этом старШий
(самый левый) бит байта
переходит во флаг переноса, а
последнее значение флага
переноса идет в младШий бит
байта. Так осуЩествляется связь
между байтами без потери
информации.
190 DEC HL
;Переход к следуЮЩему байту.
Отсчет байтов идет в обратном
порядке, так как строка движется
в направлении противоположном от
отсчета байтов в экранной
области.
200 DJNZ NEXT_BYTE;
ЗаверШение внутреннего
цикла. И после того, как регистр
В будет равен нулЮ то есть будет
сдвинут 31 байт или одна линия,
выполнение программы будет
продолжаться.
210 POP BC
; Востановление счетчика
цикла
220 INC H ;
230 LD A,31 ;
240 ADD A,L;
250 LD L,A ;
;Таким образом в четырех
предыдуЩих строках происходит
прибавление к регистру HL числа
287. В строке 220 старШий байт
регистра увеличивается на
единицу. Для регистровой пары
это будет означать увеличение на
256, а адрес экранной области,
записанный в этом регистре будет
указывать ровно на одну линиЮ
ниже. И для того, чтобы получить
адрес конца строки мы прибавляем
к регистру число 31.
260 DJNZ NEXT_LINE ;
;ЗаверШение цикла произойдет
тогда, когда на один пиксель
продвинутся все восемь линий.
270 POP BC ; Востановление
счетчика,
280 DJNZ NEXT_PIXL ;и
заверШение очередного цикла,
выход из него произойдет, когда
строка сдвинется на восемь
пикселей.
;Вот наШа строчка сдвинулась
на восемь пикселей, знакоместо в
конце строки осталось пустое. И
как раз туда нам надо будет
напечатать следуЮЩий символ из
заданного текста, а затем
продолжить выполнение программы
уже с новым символом.
290 LD A,(DE) ;Загрузка в А
кода следуЮЩего символа из
текста.
300 OR A
310 RET Z ;Если символ равен
нулЮ, то конец текста и конец
выполнения программы.
320 PUSH DE; Регистр DE нам
понадобится в подпрограмме
вывода символа на экран, а в нем
содержится информация об адресе
текуЩей буквы для вывода.
330 LD HL,(23606) ;B HL
загружаем адрес текуЩего Шрифта
из соответствуЮЩей системной
переменной.
340 LD B,8 ;Предстоит
вывести символ длиной в восемь
байтов.
350 LD D,0
360 LD E,A ;Код буквы
записан в регистр DE.
370 RL E
380 RL D
390 RL E
400 RL D
410 RL E
420 RL D
;В строках 370-420
регистровая пара DE три раза
умножается на два, иначе говоря
умножается на восемь. это
делается для того, чтобы в паре
DE находилось число обознахаЮЩее
с какого по счету байта Шрифта
начинается заданная буква, а
каждый символ занимает в памяти
восемь байтов.
425 ADD HL,DE; Сложив эти
регистры в HL мы получим уже
реальный адрес нахождения
символа в Шрифте.
430 LD DE,ADDR ; B DE
заносим адрес экранной области
показываЮЩий, в какое место
экрана будет выводиться символ.
440 NXTBYTCHR
450 LD A,(HL)
460 LD (DE),A ; Пересылка
байта из Шрифта в экраннуЮ
область.
470 INC HL ;HL указывает на
следуЮЩий байт из Шрифта.
480 INC D ; DE указывает на
место экрана куда будет
выводиться следуЮЩий байт
символа.
490 DJNZ NXTBYTCHR
;После заверШения вывода
байта предстоит проверить, не
была ли нажата какая-нибудь
клавиШа и если нет, то
выполнение программы
продолжается с наружного цикла.
500 POP DE ;Востановление
адреса, указываЮЩего на текуЩий
символ из текста.
510 INC DE ;СледуЮЩий символ
для печати.
520 LD A,(23560) ; Код
последней нажатой клавиШи.
530 OR A ; Установка флагов
в зависимости от регистра А.
540 JR Z,NEXT_CHAR ; Если
А=0,- небыла нажата ни одна из
клавиШа то переход к началу
программы.
550 RET ;И конец, в
противном случае.
560 TEXT
570 DEFM "ЛЮбой текст лЮбой
длины для вывода."
580 DEFB 0 ; Признаком конца
текста является код нуля.
Теперь отассемблируйте
программу и запустите командой R
из ассемблера или RANDOMIZE USR
50000. Строка будет двигаться в
верхней строке экрана. Для того,
чтобы переместить строку вниз
экрана нужно всего лиШь изменить
строку с номером 15.
15 ADDR EQU 20733
Для того, чтобы строка
двигалась более плавно
необходимо сделать самый правый
символ строки невидимым, то есть
занести туда соответствуЮЩий
атрибут. Из бейсика чтобы
сделать это достаточно ввести
оператор:
PRINT AT N,31;INK 7;" "
N - здесь является номером
строки.
Теперь я предложу несколько
полезных модификаций программы
для получения некоторых
эффектов.
Жирный Шрифт. Для получения
жирного Шрифта достаточно
добавить две строки:
455 RLA
456 OR (HL)
Уплотненный Шрифт. Идея
этого Шрифта заклЮчается в
следуЮЩем: Шрифт сжимается за
счет сокраШения растояния между
буквами.
70 LD B,7
В данном случае следуЮЩий
символ печатается после
прокрутки в семь пикселей
(Ширина обычного знакоместа -
восемь пикселей). Таким образом
Вы не достигнете больШого
эффекта, а для более сжатого
Шрифта Вам придется нарисовать
сам Шрифт меньШих размеров и
уменьШать значение регистра В.
А теперь некоторые
дополнения к программе для
удвоения высоты бегуШей строки.
Далее будет указан номер строки
в программе, после которой
необходимы изменения, а затем
строки без номеров, которые Вы
будете должны вписать после
указаной строки и перед
следуЮЩей за ней строкой.
20
LD HL,23232
LD BC,31
LD DE,23233
LD (HL),7
LDIR
LD HL,23264
LD BC,31
LD DE,23265
LD (HL),5
LDIR
30
LD (23295),A ;Установка
атрибутов начала и конца
строки в ноль, чтобы
устранить видимость
печатаЮЩегося символа.
LD (23263),A
LD (23232),A
LD (23264),A
120 LD HL,20735
160 LD B,64
230 LD A,64
340 LD B,7
430 LD DE,20703
450
RL A
OR (HL)
480
LD A,#57
CP D
JR NZ,CONT
LD A,#DF
CP E
JR NZ,CONT
LD DE,20735
JR NXTBYTCHR
CONT INC D
Эта строка бежит символами
двойной высоты на черном фоне
светлыми буквами, причем верх и
низ букв имеЮт разный цвет.
Символы рисуЮтся прерываЮЩимися
линиями, но если Вам это не
понравилось сделать символы
сплоШными можно добавив одну
Цтроку:
480
LD (DE),A
В высокой бегуЩей строке
затруднительно менять координаты
и цвета, поэтому рекомендуется
оставить предложеннуЮ
конфигурациЮ программы.
Все, что Вы видите до строки
120 - это установка атрибутов
двух нижних строк экрана. Цвет
фона будет черным, и его менять
не рекомендуется, а цвет
символов верхней и нижней
половины разный - соответственно
7 и 5. Их Вы можете изменять
очень просто.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября