ZX Review #7-8-9-10
08 ноября 1997

Форум - Программа Multicolor на любой модели компьютера. Использование 2-го экрана для Multicolor'а. Демонстрация текста. Электронные журналы.

┌──────────────────────────────┐
│                              │
│            ФОРУМ             │
│                              │
└──────────────────────────────┘

Music by ZET

(c) KM SoftWare '1997

   Итак, на первом  месте  прог-
рамма, которая позволяет исполь-
зовать MULTICOLOR на любой моде-
ли  компьютера.  Входных  данных
программа не требует (только же-
лательно очистить экран и  уста-
новить атрибуты). Выходные  дан-
ные: A - количество строк от на-
чала  бордюра  (приход  INT)  до
первой строки экрана.
   Пример использования:  запус-
каете этот тест, затем запускае-
те свою  программу, на  прерыва-
нии которой висит вывод MULTICO-
LOR'а. То есть, для вывода  MUL-
TICOLOR'а   нужно   подождать  n
строк  экрана  (224  такта  -  1
строка), где n - полученное тес-
том число.
   Если вы не  хотите  сами  пи-
сать программу строковой  задер-
жки, то сделайте  так:  в  метку
RETURN запишите команду RET (код
201=#C9),  и  по  приходу  INT'а
сразу передавайте управление  на
метку PRINT, а при возврате  вы-
водите MULTICOLOR.
   Второе:  если  вам  нужна  не
первая, а какая-то другая  стро-
ка экрана, то поменяйте адрес  в
метке ADRES - это адрес  первого
байта нужной экранной строки.

   Программа занимает всего  201
байт.140.

        ORG 32768 

TEST    DI
        LD DE,#C001 ;формируем вектор
        LD BC,#0100 ;для IM 2
        LD H,D      ;3(с #C000=49152)
        LD L,C
        LD A,#C1
        LD (HL),A
        PUSH AF
        DEC A
        LD (PRINT+1),A ;текущая строка
        LD I,A
        LDIR
        IM 2
ADRES   LD HL,16384 ;рисуем на экране
        LD B,32     ;линию
L1      LD (HL),255
        INC HL
        DJNZ L1
        POP HL
        LD L,H
        LD (HL),#FB ;программа обработки
        INC HL      ;прерывания: EI:RET
        LD (HL),#C9
        LD A,B
        OUT (#FE),A ;черный бордюр
        EI          ;разрешили IM 2
LOOP    HALT        ;главный цикл
        CALL PRINT  ;вывод линии
        CALL KLAV   ;опрос клавиатуры
        JR NC,LOOP  ;если не нажат огонь
        DI          ;выход
        LD A,#3F
        LD I,A      ;нормальный выход
        IM 1
        LD A,(PRINT+1);берем номер
        INC A       ;строки+1
        EI
        RET         ;выход
;опрос клавиатуры
;если выход по SCF,то нажат огонь.
KLAV    XOR A       ;* эти строки в
        IN A,(#FE)  ;*принципе можно
        CPL         ;*убрать...
        AND #1F     ;*
        JR Z,NOKEY  ;*нет нажатых клавиш
        LD A,#FB
        IN A,(#FE)
        BIT 0,A     ;клава "Q"
        JR Z,UP     ;если да,то переход
        LD A,#FD
        IN A,(#FE)
        BIT 0,A     ;клава "A"
        JR Z,DOWN
        LD A,#7F
        IN A,(#FE)
        RRA
        JP NC,FIRE  ;клава "SPACE"
NOKEY   AND A       ;нет нажатых клавиш
        RET
FIRE    SCF         ;выход по "SPACE"
        RET

;передвижение строки вверх
UP      LD A,(PRINT+1)
        CP 20
        JR Z,NOKEY  ;ограничитель
        DEC A       ;уменьшили номер
        LD (PRINT+1),A
        JR NOKEY    ;выход

;передвижение строки вниз
DOWN    LD A,(PRINT+1)
        CP 255      ;ограничитель
        RET Z
        INC A       ;увеличили номер
        LD (PRINT+1),A
        JR NOKEY    ;выход

;вывод на бордюр строки синего цвета
PRINT   LD B,0      ;номер строки
PAUSLIN EX (SP),IX  ;* данная программка
        EX (SP),IX  ;*3пропускает 224
        EX (SP),IX  ;*такта, то есть
        EX (SP),IX  ;*одну строку
        EX (SP),IX  ;*
        EX (SP),IX  ;*
        EX (SP),IX  ;*
        EX (SP),IX  ;*
        LD HL,(0)   ;*
        NOP         ;*
        LD A,3      ;*
        DJNZ PAUSLIN;*
        EX (SP),IX ;пропускаем еще одну
        EX (SP),IX ;3строку (почти 224
        EX (SP),IX ;такта - это нужно для
        EX (SP),IX ;коррекции положения
        EX (SP),IX ;строки от левого края
        EX (SP),IX ;бордюра. Почти -
        EX (SP),IX ;потому что уже были
        EX (SP),IX ;команды CALL, LD B,N
        LD DE,0
        LD H,(HL)
        NOP
RETURN  OUT (#FE),A;синий бордюр
        EX (SP),IX ;3пропускаем 224 такта
        EX (SP),IX ;3-11 тактов на
        EX (SP),IX ;команду OUT (#FE),A
        EX (SP),IX
        EX (SP),IX
        EX (SP),IX
        EX (SP),IX
        EX (SP),IX
        LD A,(IX+0)
        NOP
        LD A,0
        OUT (#FE),A;черный бордюр
        RET        ;выход2

   Данный тест работает правиль-
но на машинах с  224  тактами  в
строке. Если у вас  220, то  он,
конечно, работать  не  будет.  О
правильности работы  этой  прог-
раммы можно сказать вот  что:  у
меня глючный Пентагон (66  строк
вместо 80 до экрана) подлой фир-
мы СОЛОН. Поэтому на  нормальных
машинах может  быть  отклонение.
Если вы используете  для  задер-
жки программу PRINT, то  это  не
страшно, а вот если свою - тогда
вам  придется  подкорректировать 
полученное  значение  (командами
ADD A,N или SUB A,N).
   Кстати, из-за этой  фирмы, на
ее  "Пентагонах"   отвратительно
идут все демы: то в ILLUSION шар
пропадает (не успевает вывод  на
экран), то синхронизация  MULTI-
COLOR'а опаздывает на  3  знако-
места  (EYE ACHE)  &  куча  т.п.
глюков.

   Немного об использовании 2-го
экрана для MULTICOLOR'а. Исполь-
зовать его можно, а в  некоторых
случаях и нужно. С  его  помощью
можно выводить в одном знакомес-
те 4  цвета  вместо  2-х, причем
недостаток разрешения  компенси-
руется тем, что можно  по  гори-
зонтали использовать  хоть  весь
экран. Где это можно  применить?
Если вы видели демку VIBRATIONS,
то можете понять... Там в  нача-
ле выводятся красивые линии; при
ближайшем  рассмотрении   оказа-
лось, что они двуцветные:  точка
фиолетовая - точка зеленая. Вро-
де бы  используется  2-ой  экран
(точно не знаю - эту демку я по-
ка не ломал). С помощью 2-го эк-
рана  можно  выводить   скроллер
текста по картинке, причем  дру-
гим цветом. Будет не очень  чет-
ко, но все-таки...

      Демонстрация текста.
      Электронные журналы.

   Данная статья - для  тех, кто
мечтает сделать свой электронный
журнал или HELP, но не  знает, с
чего начать.
   Начнем  с  основ:  главное  в
журнале  -  демонстратор текста.
Естественно, он должен  быть  на
уровне 97 года, т.е. обязательно
цветной, и как  с  постраничным,
так и с  построчным  скроллингом
текста.  Управляться  это   дело
должно или клавишами (как в SPE-
CTROFON'е) или стрелкой (ZX-FOR-
MAT) -  других  интерфейсов  для
демонстраторов пока не  придума-
но.

   Итак, демонстратор текста де-
лится на две отдельные  програм-
мы: управляющая и

       Текстовый скроллер.

   Данная программа должна обес-
печивать скроллинг текста в  2-х
направлениях построчно и постра-
нично.  Алгоритм  работы   таков
(при команде "строка вверх"):

 1. Если это  начало  текста, то
    выход.
 2. Берем текущий адрес в тексте
    и передвигаем его на  строку
    вверх.
 3. Сдвигаем весь экран на  одно
    знакоместо вниз.
 4. Печатаем  в  верхней  строке
    строчку из текущего адреса.
 5. Выходим.

   Основная потеря времени  идет
на пункт 3: здедь мы  можем  из-
брать один из  двух  путей - или
очень сильно увеличить  скорость
скроллера  -  использовать  стек
или LDI (при  этом  используется
почти вся память  48)  или  сде-
лать скроллер не очень  быстрым,
но цветным.

   1. Использование стека. Циклы
развернуты. Используется практи-
чески вся память 48 (если учиты-
вать текст и рабочие программы).
Процедура работает при запрещен-
ных прерываниях, поэтому  SOUND-
TRACK невозможен. Весь экран пе-
рестраивается за неполных 2 пре-
рывания.

   Пример построения такой прог-
раммы скроллинга  экрана  вверх.
Данная программа  строит  скрол-
лер с адреса 26000. При входе  в
26000  прерывания   запрещаются,
затем происходит скроллинг экра-
на  вверх  на  одно  знакоместо,
восстановление стека, разрешение
прерываний и возврат.140.

        ORG 25000         

        LD HL,26000 ;взяли адрес проги
        LD (HL),#F3
        INC HL
        LD (HL),#ED
        INC HL
        LD (HL),#73 ;DI : LD (0),SP
        INC HL
        LD (HL),0
        INC HL
        LD (HL),0
        INC HL
        EX DE,HL
        LD BC,184*2
LOOP    PUSH BC     ;Теперь переносим
        LD HL,BLOK  ;блок 184*2 раза.
        LD BC,ENDBLOK-BLOK
        LDIR        ;для скроллинга
        POP BC      ;одной линии нужно
        DEC BC      ;2 блока.
        LD A,B
        OR C
        JR NZ,LOOP
        EX DE,HL
        LD (HL),#31 ;LD SP,0 : EI : RET
        INC HL
        LD (26000+3),HL
        INC HL
        INC HL
        LD (HL),#FB
        INC HL
        LD (HL),#C9
        LD HL,26006 ;адрес первого SP+1
        LD BC,184   ;184 строки
LOOP1   LD DE,(ADRES1)
        LD (HL),E   ;эта пп. заносит по
        INC HL      ;командам LD SP,0
        LD (HL),D   ;нужные значения.
        LD DE,12
        ADD HL,DE
        LD DE,(ADRES3) ;взяли адрес
        INC DE      ;увеличили на 1
        LD (HL),E   ;занесли в LD SP,NN
        INC HL
        LD (HL),D
        LD DE,12    ;увеличили адрес
        ADD HL,DE   ;до следующего LD SP
        LD DE,(ADRES2)
        LD (HL),E
        INC HL
        LD (HL),D
        LD DE,12
        ADD HL,DE
        LD DE,(ADRES4)
        INC DE
        LD (HL),E
        INC HL
        LD (HL),D
        LD DE,12
        ADD HL,DE
        EX DE,HL
        LD HL,(ADRES1) ;корректируем
        CALL DHL       ;экранные адреса
        LD (ADRES1),HL ;(понижаем на 1
        LD HL,(ADRES2) ;линию)
        CALL DHL
        LD (ADRES2),HL
        LD HL,(ADRES3)
        CALL DHL
        LD (ADRES3),HL
        LD HL,(ADRES4)
        CALL DHL
        LD (ADRES4),HL
        EX DE,HL
        DEC BC
        LD A,B
        OR C
        JR NZ,LOOP1
        RET
DHL     INC H          ;DOWN HL для
        LD A,H         ;экрана.
        AND 7
        RET NZ
        LD A,L
        ADD A,32
        LD L,A
        RET C
        LD A,H
        SUB 8
        LD H,A
        RET
ADRES3  DW 16384+16-1  ;адреса в экране
ADRES4  DW 16384+31
ADRES1  DW 16384+32
ADRES2  DW 16384+31+17
BLOK    LD SP,0        ;блок для
        POP HL         ;построения
        POP DE         ;программы-
        POP BC         ;скроллера
        POP AF
        EXX
        EX AF,AF
        POP HL
        POP DE
        POP BC
        POP AF
        LD SP,0
        PUSH AF
        PUSH BC
        PUSH DE
        PUSH HL
        EXX
        EX AF,AF
        PUSH AF
        PUSH BC
        PUSH DE
        PUSH HL
ENDBLOK2

   2. Вместо стека  используется
LDI. Циклы также развернуты. Ис-
пользуется почти в 2 раза  мень-
ше памяти, чем в первом  случае.
Программа  работает  при  разре-
шенных прерываниях, вывод  музы-
ки  возможен.  Скорость  полного
скроллинга: 4-6 прерываний. При-
мер приводить не  буду, так  как
она по принципу построения напо-
минает 1-ый случай, а по  струк-
туре -  3-й  (только  все  циклы
развернуты).   Блок  для   одной
строки будет иметь такой вид:
140.
BLOK    LD HL,0
        LD DE,0
        LD BC,32
LOOP    LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        JP PE,LOOP
2
   Разумеется, придется  коррек-
тировать не  только  адреса  эк-
рана, но и  адрес  перехода:  JP
PE,LOOP,  т.к.  если  вместо  JP
PE,LOOP поставить еще 16 LDI, то
программа получится очень  боль-
шой (даже больше чем 1-я).

   3. Используется  сжатый  цикл
LDI. Занимает очень мало  памяти
(200-400 байт), но скорость, ес-
тественно,  уменьшена  до  10-15
прерываний. Прерывания  разреше-
ны.  В  принципе, идеальный  ва-
риант для цветных скроллеров  (В
SMM, MTV я применил именно  этот
способ).
140.
;пример скроллинга экрана вверх.
        LD DE,16384    ;куда(верх экрана)
        LD HL,16384+32 ;откуда (на
                       ;знакоместо ниже)
        LD B,192-8     ;всего строк
LOOP    PUSH BC        ;запомнили
        PUSH HL
        PUSH DE
        LDI            ;332 LDI (32 байта
        LDI            ;в строке). Можно
        LDI            ;заменить на:
        LDI            ;LD BC,32
        LDI            ;LDIR,
        LDI            ;но это уже
        LDI            ;совсем медленно
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        POP HL
        CALL DOWNHL
        POP DE
        EX DE,HL
        CALL DOWNHL
        POP BC
        DJNZ LOOP
        RET            ;выход
DOWNHL  INC H          ;экранная линия
        LD A,H         ;вниз для HL.
        AND 7
        RET NZ
        LD A,L
        ADD A,32
        LD L,A
        LD A,H
        SUB 8
        LD H,A
        RET
2
   Если хотите сделать  скроллер
вверх, то  отличаться  он  будет
только парой вещей: в DE задади-
те адрес  23296-31, в HL - адрес
на знакоместо выше (23296-63), в
BC то же самое (192-8), но толь-
ко теперь  нужно  корректировать
адрес не DOWNHL, а UPHL - экран-
ная строка вверх. Выглядит так:
140.
UPHL    DEC H
        LD A,H
        AND 7
        CP 7
        RET NZ
        LD A,L
        SUB 32
        LD L,A
        RET C
        LD A,H
        ADD A,8
        LD H,A
        RET
2
   Все приведенные выше процеду-
ры работают только  с  графикой.
Для цветного скроллинга  придет-
ся еще переносить атрибуты. Соб-
ственно,  переносить  их   можно
двумя путями:

   1. После  переноса   графики.
Это быстрый способ, но есть один
недостаток: если ваша  программа
скроллинга  графики  не  уклады-
вается в 1-2 прерывания, то  эф-
фект будет очень неприятным:  мы
увидим, как сначала  перенесется
графика, а потом атрибуты.

   2. Параллельно  с   переносом
графики. Более медленный и емкий
способ, но зато  скроллер  будет
выглядеть более-менее  прилично.
Для цветного скроллинга разобьем
процедуру скроллирования на под-
программу, которая бы  переноси-
ла 8 линий графики и 1 линию ат-
рибутов. Текст программы:
140.
        LD DE,16384    ;куда(верх экрана)
        LD HL,16384+32 ;откуда (на
                       ;знакоместо ниже)
        LD B,23        ;всего строк/8
        EXX            ;адрес атрибутов
        LD DE,22528    ;куда
        LD HL,22528+32 ;откуда
        EXX
LOOP1   PUSH BC
        CALL SCROLL    ;скроллинг 8 линий
        POP BC
        DJNZ LOOP1
        RET            ;выход
SCROLL  LD B,8         ;8 линий.
LOOP    PUSH BC        ;запомнили
        PUSH HL
        PUSH DE
        LDI            ;332 LDI (32 байта
        LDI            ;в строке). Можно
        LDI            ;заменить на:
        LDI            ;LD BC,32
        LDI            ;LDIR,
        LDI            ;но это уже
        LDI            ;совсем медленно
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        POP HL
        CALL DOWNHL
        POP DE
        EX DE,HL
        CALL DOWNHL
        POP BC
        DJNZ LOOP
        EXX            ;атрибуты
        LD BC,32       ;перенос строки
        LDIR
        EXX
        RET            ;выход
DOWNHL  INC H          ;экранная линия
        LD A,H         ;вниз для HL.
        AND 7
        RET NZ
        LD A,L
        ADD A,32
        LD L,A
        LD A,H
        SUB 8
        LD H,A
        RET
2
  Как видите, ничего сложного...

   Немного о процедурах обработ-
ки текста. Собственно, нам  нуж-
но 4 адреса - адрес начала  тек-
ста, адрес  конца  текста, адрес
верхней строки в тексте (это ко-
торая в данный момент  выводится
сверху на экране) и адрес нижней
строки  в  тексте.  Тогда  вывод
текста будет  наиболее  быстрым.
Для  скроллинга  вверх  набиваем
такую программу:
140.
SCRUP   LD HL,(ADRES1) ;адрес верхней
        PUSH HL        ; строки
        LD DE,(BADRES) ;адрес начала
        AND A          ; текста
        SBC HL,DE      ;если равны, то
        POP HL         ; коррекция стека
        RET Z          ; и выход
        DEC HL         ;пропускаем байт
        DEC HL         ;3 ENTER =13 (#0D)
        LD A,13        ;поиск следующей
LOOP1   CP (HL)        ; строки
        JR Z,FOUND     ;строка найдена
        DEC HL         ;уменьшили адрес
        JR LOOP1       ;в цикл
FOUND   INC HL         ;в HL-адрес строки
        LD (ADRES1),HL ;запомнили
        LD HL,(ADRES2) ;
        DEC HL         ;
        DEC HL         ;Так же
LOOP2   CP (HL)        ;корректируем
        JR Z,FOUND1    ;адрес нижней
        DEC HL         ;строки.
        JR LOOP2
FOUND1  INC HL
        LD (ADRES2),HL
        LD HL,(ADRES1) ;адрес печати
PRNSTR  LD C,0         ;счетчик
LOOP3   LD A,(HL)
        CP 13          ;если конец строки,
        JR Z,DOP       ;то допечатка
        INC C          ;увеличили счетчик
        PUSH BC
        PUSH HL
        CALL PRINT     ;печать символа
        POP HL
        POP BC
        INC HL         ;увеличили адрес
        JR LOOP3       ;в цикл
DOP     LD A,32        ;допечатка строки
        SUB C          ;(мы должны
        AND A          ;напечатать ровно
        RET Z          ;332 символа).
        LD B,A         ;Оставшееся кол-во
DOP1    PUSH BC
        LD A,32        ;код пробела
        CALL PRINT     ;печать
        POP BC
        DJNZ DOP1
        RET            ;выход
2
   Данный вариант для  монохром-
ного  скроллинга.  Для  цветного
придется немного  потрудиться...
Весь вопрос в том, что при цвет-
ном скроллинге  текст  автомати-
чески приобретает  нестандартный
формат - управляющие коды и т.п.
Если  вы  сами  используете  эту
программку только для себя, то в
этом нет ничего плохого, но  ес-
ли для распространения, то  при-
дется писать свою  утилитку  для
изменения текста.  По-моему, для
скроллера лучше всего  использо-
вать текст с таким форматом: пе-
ред  кодом  атрибута  стоит  ка-
кой-либо управляющий код (в SMM,
например, 17).  Данная  комбина-
ция должна быть в начале  каждой
строки. Программа печати  (PRINT
в нашем случае) должна при  пос-
туплении кода 17 установить  но-
вый атрибут (поступит  при  сле-
дующем  ее  вызове)  и  печатать
все символы до поступления  кода
17 этим цветом.  Тут  еще  одно:
нужно переделать программу LOOP1
и LOOP2 (поиск  кода  13 - конца
строки). Теперь они будут такими
(интересующий нас кусок процеду-
ры):
140.
SCRUP   LD HL,(ADRES1) ;адрес верхней
        PUSH HL        ; строки
        LD DE,(BADRES) ;адрес начала
        AND A          ; текста
        SBC HL,DE      ;если равны, то
        POP HL         ; коррекция стека
        RET Z          ; и выход
        DEC HL         ;пропускаем байт
        DEC HL         ;3 ENTER =13 (#0D)

                       ;поиск следующей
LOOP1   LD A,(HL)      ; строки
        CP 13
        JR Z,FOUND     ;строка найдена
PROPUSK DEC HL         ;уменьшили адрес
        JR LOOP1       ;в цикл
FOUND   DEC HL
        LD A,(HL)
        CP 17          ;это был цвет ?
        JR Z,PROPUSK   ;если да, переход
        INC HL
        INC HL         ;в HL-адрес строки
        LD (ADRES1),HL ;запомнили
        LD HL,(ADRES2) ;
        DEC HL         ;
        DEC HL         ;Так же
LOOP2   LD A,(HL)      ;корректируем
        CP 13
        JR Z,FOUND1    ;адрес нижней
PROPSK1 DEC HL         ;строки.
        JR LOOP2
FOUND1  DEC HL
        LD A,(HL)
        CP 17
        JR Z,PROPSK1
        INC HL
        INC HL
        LD (ADRES2),HL
2

 Часть вторая:

     Управляющие процедуры.

   Говорить  тут  особо  нечего.
В последнее время  в  программах
этого рода вместо  клавиш  стала
применяться стрелка. Скажу одно:
для   "мышиных"  это,  может,  и
удобно, но  если  мышки  нет, то
только  потеря  времени.  Лучшим
вариантом  было  бы  определение
наличия мыши, и если  она  есть,
то  управление  стрелкой, а  ес-
ли нет, то клавишами. По  поводу
клавиш больше  говорить  нечего,
поговорим об  управлении  стрел-
кой. Существует  два  алгоритма:
первый применяется  в  ZX-POWER:
когда нажат огонь, стрелка  про-
падает, затем экран скроллирует-
ся, стрелка печатается, а  затем
опрашивается клавиатура. Но  ес-
ли все еще нажат  огонь, то  пе-
чать и стирание  стрелки  пропа-
дают зря. Стрелка начинает  дико
мерцать, а скроллер тормозить.
   Другой  вариант  применен   в
ZX-FORMAT'е: если  нажат  огонь,
стрелка  пропадает, скроллирует-
ся экран, а потом снова  опраши-
вается огонь, и если он все  еще
нажат, то, не  печатая  стрелку,
переходим на скроллинг, если  же
нет, то печать стрелки.  Тут  мы
не теряем  времени  на  ненужную
печать/стирание, и все  довольно
быстро.

   Прим. ред. Автор подводит нас к мысли о
том, что невозможно  реализовать  полноэк-
ранный скроллинг, укладывающийся в  преры-
вание. Но в некоторых случаях  это  вполне
возможно за счет уменьшения количества пе-
ресылаемых байтов.  Рассмотрим  два  таких
случая.

   1. Две  верхние  строки  экрана  заняты
служебной информацией  (название статьи  и
т.п.),  а  текст  занимает  оставшиеся  22
строки.  Между  строками  текста  оставлен
промежуток в 2 пиксела (т.е. каждый символ
по высоте занимает 6 пикселов).
   Посчитаем, сколько  байтов  должна  пе-
реслать  процедура  скроллинга, сдвигающая
текст на одно знакоместо вверх  или  вниз.
Должна быть перемещена 21  строка  текста,
т.е.  21*32*6=4032  байта, плюс  атрибуты:
21*32=672 байта.  Итого 4704 байта.  Фраг-
мент программы, выполняющий  пересылку  16
байтов, выглядит так:

        LD      SP,адрес источника
        POP     AF
        POP     BC
        POP     DE
        POP     HL
        EXX
        EX      AF,AF'
        POP     AF
        POP     BC
        POP     DE
        POP     HL
        LD      SP,адрес приемника+16
        PUSH    HL
        PUSH    DE
        PUSH    BC
        PUSH    AF
        EXX
        EX      AF,AF'
        PUSH    HL
        PUSH    DE

        PUSH    BC
        PUSH    AF

   Длина фрагмента 26 байт, время выполне-
ния 204 такта.  Посчитаем, сколько  тактов
уйдет на выполнение всей процедуры сдвига:
4704/16=294;  294*204=59976  тактов,  т.е.
еще останется достаточно времени на печать
появившейся сверху или снизу новой  строки
текста и на вызов  процедуры  проигрывания
музыки.
   Сколько места в памяти  будет  занимать
такая процедура сдвига? 294*26=7644 байта.
Но  так  как  сдвиг  должен  выполняться и
вверх и вниз, удваиваем это значение.  По-
лучим 15288 байтов. При наличии 128K памя-
ти удобно выделить какой-либо банк  (16384
байта) и разместить в нем  процедуры сдви-
га.
   Недостатком указанного способа является
ограничение  высоты  символов  текста - не
более 6 пикселов. Это сразу делает  невоз-
можным вывод графики и псевдографики, да и
шрифт придется подредактировать.

   2. Две  верхние  строки  экрана  заняты
служебной информацией  (название  статьи и
т.п.),  а  текст  занимает  оставшиеся  22
строки. Но каждая строка  текста  занимает
по ширине не 32 байта, а 20 (т.е. в строке
умещается 20 символов 8х8, или 26 символов
6х8, или 40 символов 4х8).
   Снова посчитаем количество пересылаемых
байтов: 21*20*8=3360, плюс атрибуты: 21*20
=420 байтов.  Итого 3780 байтов.  Фрагмент
программы, выполняющий пересылку  20  бай-
тов, выглядит так:

        LD      SP,адрес источника
        POP     AF
        POP     BC
        POP     DE
        POP     HL
        EXX
        EX      AF,AF'
        POP     AF
        POP     BC
        POP     DE
        POP     HL
        POP     IX
        POP     IY
        LD      SP,адрес приемника+20
        PUSH    IY
        PUSH    IX
        PUSH    HL
        PUSH    DE
        PUSH    BC
        PUSH    AF
        EXX
        EX      AF,AF'
        PUSH    HL
        PUSH    DE
        PUSH    BC
        PUSH    AF

   Длина фрагмента 34 байта, время  выпол-
нения 262 такта. На выполнение всей проце-
дуры сдвига уйдет  3780/20*262=49518  так-
тов, а в памяти она займет 3780/20*34=6426
байтов (соответственно, обе процедуры, для
сдвига вверх и вниз, займут 12852 байта).
   Достоинство этого  способа - не ограни-
чена высота символов, т.е. можно  выводить
и графику, и псевдографику.  Можно  задей-
ствовать и  две  верхние  строки  экрана -
времени на их обработку хватит  (сдвиг бу-
дет занимать 53710 тактов).  Можно сделать
плавный попиксельный  скроллинг  (хотя  он
будет  красиво  выглядеть, только если для
всего текста установлены одинаковые  атри-
буты).
   Недостаток - не используются  правый  и
левый края экрана. Хотя, с другой стороны,
это может повысить удобочитаемость текста.

   Можно увеличить  ширину  строки  до  24
байт (32 символа 6х8, как  в оболочке  ZX-
Ревю), не сильно  увеличив  время  сдвига.
При этом придется дополнительно  перенести
21*4*8=672 байта графики и  21*4=84  байта
атрибутов, всего  756 байт.  Фрагмент  для
переноса двух байтов выглядит так:

        LD      HL,(адрес источника)
        LD      (адрес приемника),HL

   и занимает 6 байт, а выполняется за  32
такта (т.е. 16 тактов на байт). Тогда вре-
мя выполнения процедуры увеличится на 756*
*16=12096 тактов и  составит  49518+12096=
61614 тактов, а занимаемая  память  увели-
чится на 756/2*6=2268  байт.  Общая  длина
двух  процедур  будет  равна 12852+2*2268=
17388 байт.

   Кстати, вовсе необязательно  хранить  в
памяти обе  процедуры  сдвига  -  вверх  и
вниз.  Можно  хранить только одну из  них,
например, пусть это будет сдвиг вверх. Ко-
гда пользователь нажимает кнопку для сдви-
га в противоположном  направлении - просто
изменяем адреса в этой  процедуре.  И  так
при каждом изменении направления сдвига.

           *   *   *




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

TR-DOS для начинающих - Окончание.

Компьютерная новелла - Prince of Persia.

Компьютерная новелла - Лазерная бригада (по игре Laser Squad).

Перекресток драконов - Игра Rapscallion.

Перекресток драконов - Игра The Runes of Zendos.

Перекресток драконов - Игра The Saga.

Перекресток драконов - Игра Witch's Cauldron.

Перекресток драконов - Создаём Адвентюру. Обзор редакторов.

Перекресток драконов - Создаём словарь к Адвентюрной игре.

Программы, которые мы выбираем - Возможные последствия использования недокументированных команд.

Программы, которые мы выбираем - О замеченных шероховатостях в работе некоторых программ и пожелания к следующим версиям.

Программы, которые мы выбираем - Предложение ко всем авторам программ, печатающих дамп памяти. Программистам, использующим защиту дисков от копирования.

Программы, которые мы выбираем - Несколько предложений по усовершенствованию ассемблера.

Программы, которые мы выбираем - Предложения по доработке ZX Word v2.5.

Программы, которые мы выбираем - Программа "Эмулятор Спектрума" v1.2.

Программы, которые мы выбираем - Что хотелось бы иметь в идеальном ассемблере.

Ретро - 40 лучших процедур: Копирование данных в памяти.

Ретро - 40 лучших процедур: Обмен токена.

Ретро - 40 лучших процедур: Определение адреса БЕЙСИК-строки.

Ретро - 40 лучших процедур: Определение длины БЕЙСИК-программы.

Ретро - 40 лучших процедур: Определение размера свободной памяти.

Ретро - 40 лучших процедур: Поиск и замещение строки.

Ретро - 40 лучших процедур: Поиск подстроки.

Ретро - 40 лучших процедур: Поиск строки.

Ретро - 40 лучших процедур: Составление списка переменных.

Ретро - 40 лучших процедур: увеличение и копирование экрана.

Ретро - 40 лучших процедур: Удаление REM-строк.

Ретро - 40 лучших процедур: Удаление блока программы.

Советы экспертов - Игра Fredloader.

Советы экспертов - Игра Robin of Sherwood: The Touchstones of Rhianon.

Советы экспертов - Игра Scorpions: Die Machines.

Советы экспертов - Игра Terropods.

Страничка iS-DOS - Описание рестартов системы IS DOS.

Форум - Алгоритм распознавания символов.

Форум - Время выполнения недокументированных команд процессора Z80.

Форум - Концепция экрана высокого цветового разрешения.

Форум - Несколько Pokes к играм. Программа Hacman96.

Форум - По поводу новых DOS и BIOS для Спектрума.

Форум - Программа Multicolor на любой модели компьютера. Использование 2-го экрана для Multicolor'а. Демонстрация текста. Электронные журналы.

Форум - Проект ZX Config.

Форум - Усовершенствование Art Studio. Идеи относительно компрессии файлов.

Форум - Эмулятор ZX Spectrum на IBM. По поводу шестнадцатеричной системы счисления. Программа ZX-Stars. Странности в Elita

Форум - Эффекты на бордюре и Multicolor.

Читатель-читателю - ZX Spectrum 128 - новые возможности, новые проблемы.

Читатель-читателю - Группа 'Light'. Спектрум и экспертная система.

Читатель-читателю - Драйвер принтера для Scorpion'а.

Читатель-читателю - Печать чисел в различных системах счисления.

Читатель-читателю - Программирование аркадной игры со скроллингом экрана.

Читатель-читателю - Процедура печати меток ассемблера XAS для монитора-отладчика STS 4.3.

Этюды - Атрибутная бегущая строка. "Гасилка" экрана. Упрощенный вариант процедуры "Занавес". Процедура гащения картинки. Процедура проявления картинки по точкам.

Этюды - Графический эффект "цветные полосы".

Этюды - Драйвер экрана для печати по 64 символа в строке.

Этюды - Комплект защит загрузчиков.

Этюды - Обращение к диску в режиме IM 2. Работа с диском нестандартного формата.

Этюды - Печать символа, увеличенного в 8 раз. Программа "наливания" экрана. Процедура гашения экрана по точкам. Очистка экрана как в Terminator'е. Поиск последовательности символов в памяти. Система перекодировки символьного набора.

Этюды - Программа - каталогизатор дисков.

Этюды - Программа вывода значений амплитуды каналов муз. сопроцессора на бордюр.

Этюды - Программа вывода картинки.

Этюды - Программа зажигания спрайта.

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

Этюды - Программа сортировки массива по возрастанию. Процедура заполнения экрана заданным атрибутом. Процедура проявления картинки. Эффект летящих навстречу звезд. "Душ", идущий из верхнего левого угла экрана. Процедура "осыпания" картинки по пиксельным линиям. Программа "вытягивания" картинки под углом в 45 градусов. Три процедуры "Scroll".

Этюды - Процедура печати чисел.

Этюды - Процедура прорисовки символа с помощью атрибутов.

Этюды - Процедура проявления картинки. Fade-OUT эффект (картинка уходит за края экрана). Графический эффект "Фонтан". Fade-OUT эффект, имитирующий выключение телевизора. Процедура "зажигания" картинки. Программа плавной прорисовки картинки.

Этюды - Процедура рисования линии.

Этюды - Процедура составления оптимальной таблицы символов.

Этюды - Скроллинг строк текста в заданном окне. Атрибутный скроллер. Диагональный скроллинг.

Этюды - Спрайтовый скроллер. Процедуры проявления экрана.

Этюды - Укороченная процедура индикации амплитуды каналов муз. сопроцессора. Способ вычитания константы из регистровой пары HL.

Этюды - Формула для вычисления дня недели.


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

Похожие статьи:
Реклама - Реклама и объявления...
Мир звуков Спектрума - глава 4.6: Обработка внешних сигналов - оцифровка.
Разное - C добрым утром... Cейчас 12:эо. Я только что очнулся после пьяного нездорового сна...

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

Релизов не было :(