Teleshow #03

Программы - БЕГУШАЯ СТРОКА

<b>Программы</b> - БЕГУШАЯ СТРОКА
 
        БЕГУЩАЯ СТРОКА

    Программа, которуЮ Вы видите
ниже   не  что   иное  как  сама
бегуЩая  строка. Строка бежит по
одному    пикселЮ,    достаточно
плавно  и  достаточно  медленно,
даже  для тех,  кто очень  плохо
владеет      грамотой,      хотя
регулировать скорость скроллинга
Вы можете сами.
    ВообЩе  программа составлена
так,  что поменяв пару строк, Вы
без   труда  можете  передвинуть
строку  в  лЮбуЮ  часть  экрана,
пару частных случаев мы разберем
ниже.    Так   же    Вы   можете
использовать   свой  собственный
Шрифт,   например   сделаный   в
графредакторе,    предварительно
установив  системные  переменные
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.  Их Вы  можете  изменять
очень просто.



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

От авторов - Мы лучшие из лучших и мы пишем лучших из лучшие программы. Мы выпускаем компьютерный журнал и распростропяем его на дисках и кассетах. Мы - это представители GSH. ГИЛЬДИЯ СИБИРСКИХ ХАКЕРОВ GUILD of SIBIRIAN HACKERS ГИЛЬДИЯ СИБИРСКИХ ХАКЕРОВ. GUILD of SIBIRIAN HACKERS

Программы - БЕГУШАЯ СТРОКА

Программы - Программа очистки экрана.


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

Похожие статьи:
Вступление - приложение: анкеты для заполнения акции respect, оболочка для газеты/журнала.
Архив - разбор игры "Enigma Force".
Pеклама отовсюду
Inferno - Содержание номера.
Бук - Похождения Штиpлица и дpугие пpиключения Боpмана.

В этот день...   20 апреля