ZX Review #3-4
22 июля 1997

Форум - В.Давыдов. По материалам, опубликованным в ZX-РЕВЮ: Некоторые вопросы, связанные с автостартом Бейсик-программ. Redefine Keys. Процедура печати 42 символов в строке. Процедура умножения HL=B*C. Доработка посекторных загрузчиков. Мини-драйвер дисковых операций.

<b>Форум</b> - В.Давыдов. По материалам, опубликованным в ZX-РЕВЮ:
 Некоторые вопросы, связанные с автостартом Бейсик-программ. Redefine Keys. Процедура печати 42 символов в строке. Процедура умножения HL=B*C. Доработка посекторных загрузчиков. Мини-драйвер дисковых операций.


(c) Давыдов В.М.,
Нижегородская обл., с.Запрудное.

        По материалам,
    опубликованным в ZX РЕВЮ.

 НЕКОТОРЫЕ ВОПРОСЫ, СВЯЗАННЫЕ С
 АВТОСТАРТОМ БЕЙСИК-ПРОГРАММЫ.
    (ZX РЕВЮ 94/5, стр.29).

    Корреспондент задавал вопрос
о запуске из машинного кода  BA-
SIC-программ. По приведенным ре-
комендациям  сделать это не сос-
тавит  труда, но  нужно  иметь в
виду одну тонкость.
    Хотя, в основном,  на  BASIC
пишутся  загрузчики  длиной  1-2
сектора, программировать  на BA-
SIC никто не  запрещал, и  может
встретиться  программа, занимаю-
щая всю память. Запустить  ее из
машинного  кода не удастся.  При
загрузке  она  затрет  процедуру
запуска.  А  boot, для  которого
это все и  предназначалось, дол-
жен  запускать любую  программу.
Кроме  того,  при  использовании
BASIC  для  загрузки  и  запуска
программы, в машинном  коде пот-
ребуется  только  перенести  имя
файла в строку BASIC типа:

CLEAR VAL "65535":
RANDOMIZE USR VAL "15619":
REM: RUN "ANY NAME"

на место ANY  NAME  и  поставить
RET для возврата в BASIC, а  все
остальное сделает  интерпретатор
TR-DOS.  Размер  программы   при
этом сократится.
    Кстати,  те  же  ограничения
относятся к размещению в  памяти
релоцируемой   процедуры  "LOAD-
MERGE" (ZX РЕВЮ 96/4-5, стр.80).
    Резюме:  boots с промежуточ-
ным выходом в BASIC  пишутся  не
от  скудоумия, а для универсаль-
ности.


        REDEFINE KEYS
   (ZX РЕВЮ 96/4-5, стр.79).

    Увидев в трех  местах  маску
%11111, очень сильно  захотелось
сократить  процедуру.   Исходный
вариант сократился всего на  два
байта.  Одновременно  повысилось
быстродействие на шесть  тактов,
хотя  быстродействие  здесь   не
требуется. Все равно перед опро-
сом следующей  клавиши  придется
ставить  замедляющий  цикл   или
процедуру  ожидания   отпускания
клавиши, иначе, не  желая  того,
можно назначить одну клавишу  на
все функции.
    В конце процедуры  добавлены
несколько строк для ожидания от-
пускания клавиши.  Они  помечены
комментарием ;***
1410.
  REDEF   LD     BC,#7FFE
          LD     H,#1F
  KEY_L   IN     A,(C)
          AND    H
          CP     H
          JR     NZ,KEY_PR
          RRC    B
          JR     C,KEY_L
          JR     REDEF
  KEY_PR  XOR    H
          LD     L,A
          LD     H,B
  WAIT_L  IN     A,(C)    ;***
          AND    L        ;***
          JR     Z,WAIT_L ;***
          RET
2
    Если бы от процедуры  требо-
валось быстродействие,  повысить
его на один такт процессора мож-
но было бы, если вместо последо-
вательности

          CP     H
          JR     NZ,KEY_PR

использовать

          JP     PE,KEY_PR

    В  дополнение  к  предыдущей
предлагаю свой вариант  процеду-
ры определения кода нажатой кла-
виши. На входе в процедуру в ре-
гистре H - старший  байт  адреса
порта, в L - маска бита  нажатой
клавиши. На выходе в A - код на-
жатой клавиши.  Изменяет  регис-
тры HL и DE. HL - адрес в ПЗУ из
которого взят код в аккумулятор;
DE - смещение от начала таблицы,
находящейся по адресу #0205.
140.
 TRANSF  XOR     A
 LOOP_1  ADD     A,#08
         RL      L
         JR      NC,LOOP_1
 LOOP_2  INC     A
         RL      H
         JR      C,LOOP_2
         SUB     #21
         LD      E,A
         JP      #0347

     Примечание. По адресу #0347
в ПЗУ расположен следующий фраг-
мент:

        LD       HL,#0205
        LD       D,#00
        ADD      HL,DE
        LD       A,(HL)
        RET

     Управляющим клавишам в таб-
лице по  адресу  #0205  соответ-
ствуют следующие коды:

       #0D - ENTER
       #0E - SYMBOL SHIFT
       #E3 - CAPS SHIFT
2

        ПРОЦЕДУРА ПЕЧАТИ
      42 СИМВОЛОВ В СТРОКЕ.

    В ZX РЕВЮ 95/5 была  опубли-
кована  процедура печати 42 сим-
волов в  строке  (Дмитрий Серге-
ев). В ZX РЕВЮ 96/4-5  приведена
ее упрощенная модификация (Матю-
шев Александр).
    Поскольку  они    используют
один алгоритм, им присущи  общие
ограничения.
    Во-первых, не совсем коррек-
тно отрабатывается печать с  ис-
пользованием цветовых атрибутов.
Расчет адреса атрибутов произво-
дится для левого угла  знакомес-
та 6х8 и, если  символ  занимает
два  знакоместа  8х8,  в  нужный
цвет окрашивается  только  левая
часть символа.
    Устранить это можно,  напри-
мер, таким способом. Для листин-
га в ZX 96/4-5, стр.  102  между
строками 0870  и  0880  вставить
следующий фрагмент:
140.
  LD  A,(XTXT)
  AND 3
  JP  PE,NO_INCX ; переход к
                 ;3 строке 0880
  INC HL
  LD  A,(23659)
  LD  (HL),A
2
    Для  листинга  из  ZX  95/5,
стр.30 аналогичный фрагмент нуж-
но вставить между строками  0133 
и 0134.
    Второе ограничение связано с
алгоритмом печати.  Так как  ис-
пользуется скроллинг в  экранной
памяти с очисткой соседнего зна-
коместа,  пользоваться    данной
процедурой можно только для  пе-
чати на чистом экране слева нап-
раво и сверху вниз. Для этих це-
лей процедура достаточно компак-
тна.
    Для придания процедуре  уни-
версальности  потребуется  изме-
нить процедуру PRSYM.
    Алгоритм  может быть, напри-
мер, таким. Он понятен из  поби-
товой раскладки знакомест 8х8  и
6х8 пикселов.

┌─────────────────────────────┐
│       Знакоместа 8х8        │
├─────────┬─────────┬─────────┤
│    1    │    2    │    3    │
├─────────┼─────────┼─────────┤
│765432 10│7654 3210│76 543210│
╞══════╤══╧════╤════╧══╤══════╡
│765432│76 5432│7654 32│765432│
├──────┼───────┼───────┼──────┤
│    1 │   2   │   3   │  4   │
├──────┴───────┴───────┴──────┤
│       Знакоместа 6х8        │
└─────────────────────────────┘

    Для печати первого знакомес-
та 6х8 нужно взять байт  экрана,
соответствующий  первому  знако-
месту 8х8, наложить по AND маску
          %00000011,
к полученному  результату  доба-
вить по OR байт из  знакогенера-
тора и  окончательный  результат
переслать на экран в первое зна-
коместо 8х8.

    Для печати второго знакомес-
та 6х8:
  1. Взять байт знакогенератора.
  2. Циклическим  сдвигом  полу-
чить следующее расположение  би-
тов:
          54321076
  3. На  значение, полученное  в
п.2, наложить по AND маску:
         %00000011
  4. Взять байт экрана, соответ-
ствующий первому знакоместу 8х8,
и наложить по AND маску
         %11111100
  5. Объединить по OR  результа-
ты п.3 и п.4 и полученное значе-
ние переслать на экран в  первое
знакоместо 8х8.
  6. На значение,  полученное  в
п.2, наложить по AND маску
         %11110000
  7. Взять байт экрана, соответ-
ствующий второму знакоместу 8х8,
и наложить по AND маску
         %00001111
  8.  Объединить по OR результа-
ты п.6 и п.7 и полученное значе-
ние переслать на экран  во  вто-
рое знакоместо 8х8.

    Для печати  третьего  знако-
места 6х8:
  1. Взять байт знакогенератора.
  2. Циклическим  сдвигом  полу-
чить следующее расположение  би-
тов:
          32107654
  3. На значение,  полученное  в
п.2, наложить по AND маску:
         %00001111
  4.  Взять байт  экрана,  соот-
ветствующий  второму  знакоместу
8х8, и наложить по AND маску
         %11110000
  5.  Объединить по OR результа-
ты п.3 и п.4 и полученное значе-
ние переслать на экран  во  вто-
рое знакоместо 8х8.
  6. на значение,  полученное  в
п.2, наложить по AND маску
         %11000000
  7.  Взять байт  экрана,  соот-
ветствующий третьему  знакоместу
8х8, и наложить по AND маску
         %00111111
  8.  Объединить по OR результа-
ты п.6 и п.7 и полученное значе-
ние переслать на экран в  третье
знакоместо 8х8.

   Для печати четвертого  знако-
места 6х8:
  1. Взять байт знакогенератора.
  2.   Циклическим сдвигом полу-
чить следующее расположение  би-
тов:
        10765432
  3. На значение,  полученное  в
п.2, наложить по AND маску:
       %00111111
  4.  Взять  байт  экрана, соот-
ветствующий третьему  знакоместу
8х8, и наложить по AND маску
       %11000000
  5.  Объединить по OR результа-
ты п.3 и п.4 и полученное значе-
ние переслать на экран в  третье
знакоместо 8х8.

    На этом и закончу. Будет те-
ма для  соревнований  в  разделе
"ЭТЮДЫ". Дойдя до этой стадии, я
решил посмотреть,  как  делается
печать 42 символов  в  строке  в
серьезных программах  и  обнару-
жил подобный алгоритм в редакто-
ре ассемблера  XAS ((c) Max Pet-
rov) и в текстовом редакторе ZX/
IBM EDITOR  ((c)  Олег  Хохлов).
Желание   изобретать   велосипед
пропало, а  приводить  фрагменты
чужих программ не считаю возмож-
ным по этическим соображениям.


   ПРОЦЕДУРА УМНОЖЕНИЯ HL=B*C.
    (ZX РЕВЮ 96/4-5, стр.69).

    Предлагаю вариант процедуры,
который имеет большую длину,  но
работает быстрее  при  умножении
больших чисел (B>15) и не  имеет
синдрома нулевой ошибки.
    Числа в  комментариях  озна-
чают: числитель - длина  (байт),
знаменатель - время (тактов).

         LD      L,C;     1/4
         LD      D,B;     1/4
         LD      H,0;     2/7
         LD      E,0;     2/7
         LD      B,8;     2/7
;                   ---------
;                         8/29
;-----------------------------

LOOP     LD      A,1;     2/7
         AND     L;       1/4
         JR      Z,PASS;  2/7

         ADD     HL,DE;   1/11
PASS     RR      H;       2/8
         RR      L;       2/8
         DJNZ    LOOP; 2/13+8
;                   ----------
;                        12/472
;                  или (58*8+8)
;------------------------------
         RET     ;        1/10
; ==============================
;          ИТОГО:        21/511

    При значении регистра B от 1
до 15 процедура умножения спосо-
бом многократного  сложения  (ZX
96/4-5, стр.69) выполняется быс-
трее.
    Алгоритм умножения  способом
сложений  со  сдвигами  подробно
описан в книге Р.Токхейм  "Осно-
вы цифровой  электроники",  МИР,
1988г., стр. 238-240.
    Практическое применение про-
цедры  умножения  могут   найти,
например, при расчете адреса на-
чала строки двумерного массива.


      ДОРАБОТКА ПОСЕКТОРНЫХ
          ЗАГРУЗЧИКОВ.
  (О.Литвинов, ZX РЕВЮ 96/4-5,
            стр. 88).

    Описан  очень  досадный  эф-
фект при использовании функции 5
интерпретатора TR-DOS,  о  кото-
ром все знали, но не говорили. Я
с ним столкнулся в 1994 г., ког-
да занимался адаптацией под диск
накопившихся магнитофонных  вер-
сий программ. Не обращал на  не-
го особого внимания,  пока  слу-
чайно не увидел при снятой крыш-
ке  компьютера,  что  при   этом
происходит с дисководом.  Голов-
ка  начинает  искать  неизвестно
что, но, судя по  ее  поведению,
где-то около 255 дорожки. Голов-
ка упирается в  ограничитель,  а
шаговый двигатель упорно пытает-
ся двинуть ее  еще  дальше.  Так
можно и юстировку сбить.  Борол-
ся я с этим эффектом менее изящ-
ным и быстрым способом, позицио-
нируя головку дисковода на нуле-
вую дорожку перед  чтением  оче-
редного блока. При  этом  устра-
няется следствие, но хотелось бы
знать причину.
    Может, кто-то  из  читателей
нашел причину нарушения позицио-
нирования? Насколько я  заметил,
проявляется этот эффект в основ-
ном при загрузке  программ, име-
ющих следующую структуру: упако-
ванный экран, затем основной ко-
довый блок. После распаковки эк-
рана  в  50% случаев  происходит
нарушение позиционирования.
    А  применение   загрузчиков,
использующих функцию 5 интерпре-
татора  TR-DOS,  с  объединением
блоков в одном файле,  представ-
ляется  наиболее  удобным    для
программистов, думающих об инте-
ресах  пользователей.  Загрузчик
наиболее компактен и работает на
любой версии TR-DOS.  Программу,
построенную таким образом, всег-
да можно восстановить при разру-
шении   каталога.    BASIC-часть
программы легко найти по  байтам
#80,#AA, а рассчитать общее  ко-
личество  секторов,   просмотрев
загрузчик при  помощи  дискового
монитора типа ADM,  не  составит
труда даже для начинающих.


 МИНИ-ДРАЙВЕР ДИСКОВЫХ ОПЕРАЦИЙ
    (ZX РЕВЮ 95/4, стр. 10).

    Этот драйвер имеет один  ма-
ленький недостаток, приводящий к
большим неудобствам для  пользо-
вателей. Работает  он  только  с
дисководом "A", хотя больше  по-
ловины  пользователей  имеют  по
крайней мере два дисковода. Если
с   его  использованием  создать
процедуру отгрузки на диск отло-
женного состояния, которая перед
записью  не будет  выдавать пре-
дупреждения  типа  "INSERT  DISK
INTO DRIVE 'A'", а  пользователь
решит немного отдохнуть и загру-
зит игру с дисковода "B",  оста-
вив системный диск  с  результа-
том  своего  труда  в  дисководе
"A", то его мысли о  разработчи-
ке такой дисковой версии вряд ли
можно будет выразить  литератур-
ным языком. Даже если найти мес-
то для  размещения  сообщений  и
заставить пользователя перестав-
лять диски, выглядеть это  будет
не очень профессионально.
    К тому же драйвер имеет  до-
вольно большую длину  и  требует
для своего размещения  неразрыв-
ного участка  в  памяти.  В  ре-
зультате оказывается проще адап-
тировать  магнитофонную   версию
программы с использованием  фун-
кций  5 и  6 интерпретатора  TR-
DOS. Да и работать она  будет на
любом дисководе при любой версии
TR-DOS.


        ЧТЕНИЕ ДОРОЖКИ
    (ZX РЕВЮ 95/4, стр.56).

    Корреспондент упоминает  за-
щиту "MICROPROTECTOR", использу-
ющую команду  ВГ-93  "чтение до-
рожки". Если  при пошаговом про-
хождении Микропротектора посмот-
реть  память  с адреса  загрузки
после ее выполнения, заметно на-
рушение  информации.  Поэтому  в
MICROPROTECTOR'е   после  чтения
дорожки  используется   довольно
длинный цикл поиска нужной  пос-
ледовательности байтов, располо-
женной на свободном месте в кон-
це дорожки.
    А в программе FDU при чтении
дорожки  также легко  обнаружить
искажение информации через 20-30
байт после начала поля данных.
    Использовать напрямую коман-
ду  "чтение  дорожки"   действи-
тельно затруднительно.  В  книге
А.Ларченко  и  Н.Родионова  "ZX-
SPECTRUM & TR-DOS...", издатель-
ство  "ПИТЕР", 1994 г., стр.209,
написано: "В силу некоторых  ап-
паратных    особенностей    Beta
Disk'а  при выполнении  этой ко-
манды происходит потеря  синхро-
низации  данных  микроконтролле-
ром".
    Может, кто нибудь знает, что
нужно исправить в BETA DISK  для
того, чтобы не происходило нару-
шение синхронизации?


    О ПРЯМОМ ПРОГРАММИРОВАНИИ
           КР1818ВГ93
     (ZX РЕВЮ 95/2, стр.12)

    Интересная  идея  о   прямом
доступе к регистрам  ВГ93  путем
отключения ПЗУ. Если  это  нужно
для личного  пользования,  можно
просто  установить  тумблер, от-
ключающий ПЗУ.  А  информации  о
ВГ93 было опубликовано достаточ-
но для написания хоть потреково-
го копировщика, хоть  программмы
просмотра и переноса  файлов  на
дисках разных форматов.
    Можно также отключать селек-
тор адреса  в дисковом интерфей-
се. При этом появится  доступ  к
портам контроллера из любого ад-
реса в памяти.




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

TR-DOS для начинающих - Часть 1.

Авторская разработка - General Sound - мультимедиа для ZX Spectrum!

Визитная карточка - Представляем новый электронный журнал "Major Wares" (c) Codebusters & V.M.G.

Компьютерная новелла - Knight Lore "Преданья рыцарских времен".

Новые программы - И.Рощин. HELP_Z80. В.Давыдов. Catalog's Base v1.8.

Описание оболочки журнала "ZX-РЕВЮ"

Перекресток драконов - Aavlon, Castle of Dreams, Erik the Viking.

Перекресток драконов - Eureka!, Eye of Bain, Kentilla.

Перекресток - Sherlock, Apollo, Shadows of Mordor, Rigels Revenge, Temple of Terror, ID, That's the Spirit, Return to Ithaka.

Ретро - Дж.Хардман, Э.Хьюзон. 40 лучших процедур.

Советы экспертов - Castle Master.

Советы экспертов - Firelord.

Советы экспертов - Stonkers.

Форум-игры - Insult Megademo, Catch 23, Livingstone, Rock Star ate my Hampster, НЛО-2: Дьяволы Бездны, Terminator 2, Venturama, The Spririts, Nipper, Sweewo'S World, King's Bounti-2, Hacker 2, Black Magic, Satcom, Звёздное Наследие.

Форум - А.Гура. Кодекс программиста.

Форум - А.Стрельников. Перспективы развития ZX Spectrum.

Форум - В.Давыдов. По материалам, опубликованным в ZX-РЕВЮ: Некоторые вопросы, связанные с автостартом Бейсик-программ. Redefine Keys. Процедура печати 42 символов в строке. Процедура умножения HL=B*C. Доработка посекторных загрузчиков. Мини-драйвер дисковых операций.

Форум - Группа 'Light'. Музыкальный процессор для ZX-Speccy.

Форум - Д.Федоров: Печать картинки с маской с точностью до пиксела. Алгоритм расчета адреса по координатам с точностью до пиксела.

Форум - И.Рощин. Совместное использование ZX ASM 3.0 и STS 5.1.

Форум - М.Бекарев. Расчет адреса экранной области по знакоместу и наоборот.

Форум - П.Федин. Доработка Profi для бесконфликтного подключения периферии.

Форум - С.Астров. Генератор псевдослучайных чисел.

Читатель-читателю - В.Сироткин. Защита программ (взгляд на проблему).

Читатель-читателю - И.Рощин. Драйвер экрана для компьютера "Пентагон-128".

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

Этюды - А.Уржа. Процедура рисования окружности.

Этюды - В.Сироткин. Программа подсчета контрольной суммы.

Этюды - Е.Волчков. Улучшение подпрограммы вычисления адреса в дисплейном файле.

Этюды - Е.Мороз. Бегущая строчка.

Этюды - И.Командин. Программа проявления экрана.

Этюды - И.Рощин. Два графических эффекта.

Этюды - М.Лазутов: Программа модернизации шрифта. Программа кодирования/декодирования блока кодов. Эффект с атрибутами.

Этюды - О.Смолянкин: Процедуры очистки экрана. Вывод текстовых сообщений на экран.


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

Похожие статьи:
Раскрутка - адвентюрная игра "Souls of Darkon".
Enlight'96 - "Взгляд Изнутри" оpганизатоpы об оpганизации.
Part 2 - Playing tips.
Советы - Диск сдох!
IS DOS - Проблемы и решения

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