Speccy #05
30 апреля 1996

Программирование - Как сделать бегущую строчку.

<b>Программирование</b> - Как сделать бегущую строчку.
╒══════════════════════════════╕
│░░░░░  ПРОГРАММИРОВАНИЕ  ░░░░░│
╘══════════════════════════════╛

Кузнецов Владимир   
─────────────────


 Каждый  начинающий 
программист   хочет 
сделать     бегущую 
строчку. Но с  чего
начать?  Может ее у
кого- нибудь "выта-
щить"?



 Ответ  на  вопрос  очень прост:
обратиться  к  тому,  кто ее уже
сделал    сам!   Ко  мне  многие
обращались с просьбой о помощи и
я  решил  опубликовать несколько
конкретных   примеров.   И  так,
приступим...
        
      ORG #8000

FONT  EQU  #3D00  ;Адрес начала
                  ;шрифта

WBUF  EQU  #7E00  ;Адрес начала
                  ;буфера

SCROL1: LD    A,1
        RRCA
        LD    (SCROL1+1),A
        JR    NC,SCROL5

 Пытаемся вычислить местоположе-
ние в шрифте новой буквы...

SCROL3: LD    HL,TEXT
        LD    A,(HL)
        INC   HL
        SUB   #20
        JR    NC,SCROL2

Конец текста - код меньше #20

        LD    HL,TEXT
        XOR   A
SCROL2: LD    (SCROL3+1),HL
        LD    DE,FONT
        LD    L,A
        LD    H,0
        ADD   HL,HL
        ADD   HL,HL
        ADD   HL,HL
        ADD   HL,DE

Переносим символ в рабочий буфер

        LD    B,8
        LD    DE,WBUF+32
SCROL4: PUSH  BC
        LDI
        EX    DE,HL
        LD    BC,32
        ADD   HL,BC
        EX    DE,HL
        POP   BC
        DJNZ  SCROL4

 Скроллируем  (сдвигаем) рабочий
буфер...

SCROL5: LD    HL,WBUF+263
        LD    B,132
SCROL6: RL    (HL)
        DEC   HL
        RL    (HL)
        DEC   HL
        DJNZ  SCROL6

 Если  вы  пользуетесь TASM3.2 и
вам  не  жалко памяти (процедура
увеличивается  в  об'еме  на 518
байт),  то  это  можно  записать
так:

SCROL5: LD    HL,WBUF+263
        DEFS  264,#CB,#16,#2B

 Зато    выигрыш    во   времени
составит  1586  тактов! Повысить
скорость работы можно еще на 264
такта:

SCROL5: LD    HL,WBUF+263
        DEFS  132,#CB,#16,#2B
        DEFS  #CB,#16,#2D

Далее выводим буфер на экран...
Это  можно  сделать традиционным
способом:

        LD    HL,WBUF
        LD    DE,#5000
        LD    B,8
SCROL7: PUSH  BC
        PUSH  DE
        LD    BC,32
        LDIR
        POP   DE
        POP   BC
        INC   HL
        INC   D
        DJNZ  SCROL7
        RET

|гСкорость работы: 5968 тактов.
Но  существуют  более  хитрые  и
притом   более  быстрые  способы
вывода.
Например  вывод  можно  оформить
так:
        LD    HL,WBUF
        LD    DE,#5000
        LD    B,8
SCROL7: PUSH  BC
        PUSH  DE
        DEFS  32,#ED,#A0
        POP   DE
        POP   BC
        INC   HL
        INC   D
        DJNZ  SCROL7
        RET
Скорость  работы:  4688  тактов.
А "раскрыв" цикл, вы   увеличите
скорость вывода до 4424  тактов!
Но  лично  мне  более   нравится
копирование с помощью стека:

        DI
        EXX
        PUSH  HL
        LD    (SAVESP+1),SP
        LD    SP,WBUF
        POP   AF
        POP   HL
        POP   DE
        POP   BC
        EX    AF,AF'
        EXX
        POP   AF
        POP   HL
        POP   DE
        POP   BC
        LD    SP,#5010
        PUSH  BC
        PUSH  DE
        PUSH  HL
        PUSH  AF
        EX    AF,AF'
        EXX
        PUSH  BC
        PUSH  DE
        PUSH  HL
        PUSH  AF
 Далее  повторяем  этот блок, но
с изменениями:
        LD    SP,WBUF+16
        POP   AF
        .....
        LD    SP,#5020
        PUSH  BC
        .....           
        LD    SP,WBUF+33
        POP   AF
        .....
        LD    SP,#5110
        PUSH  BC
        .....
        LD    SP,WBUF+49
        POP   AF
        .....
        LD    SP,#5120
        PUSH  BC
        .....
        .....
        .....
        LD    SP,#5720
        PUSH  BC
        .....
SAVESP: LD    SP,0
        POP   HL
        EXX
        EI
        RET
Заметили  алгоритм   вычисления?
Если нет, то воспользуйтесь моей
программкой:

10 FOR I=0 TO 7
20 PRINT I*33,I*33+16
30 NEXT I

Полученные числа являются смеще-
ниями в рабочем буфере.
Экранные адреса вычисляются так:

10 FOR I=0 TO 7
20 PRINT I*256+16,I*256+32
30 NEXT I

Примечание: при работе со стеком
прерывания должны быть запрещены
(команда DI) и сохранена регист-
ровая пара HL' (альтернативная).
Скорость работы: 3520 тактов!!!

             * * *



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

Авторская программа - Bestseller from Star - проигрыватель мелодий.

Авторская разработка - схемы Sound Drive V1.02 и Covox.

Игроскоп - О играх: Biff, Crime Santa Claus.

Игроскоп - О играх: Mugsy.

Игроскоп - О играх: Звёздное Наследие.

Музобоз - Таблица итогов 1-го тура. Конкурс продолжается...

Мультролик - Мультролик "Прогулка".

Новелла - Новелла "НЛО - Враг Неизвестен" часть 2.1.

Новелла - Новелла "НЛО - Враг Неизвестен" часть 2.2.

От редакции - О изменениях в журнале и его распространении.

Программирование - Как сделать бегущую строчку.

Программирование - Основные устройства ZX-Spectrum.

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

Тусовка - Приветы и поздравления.


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

Похожие статьи:
Others - О спортивном ориентировании.
Новости - Загадочная идея в MOVE #8.
Сказки чОрного кота - Проблемы эволюционной классификации.
Результаты - Результаты анкетирования пользователей Ижевской BBS.
Системки - ZX-Basic Compiler: расширяемый кросс-компилятор.

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