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

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

(c) Иван Рощин, г.Москва, 1997

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

   В "ZX-РЕВЮ" уже был опублико-
ван ряд статей, посвященных  не-
документированным командам  Z80,
но ни в одной из них я  не  смог
найти упоминания о  времени  вы-
полнения этих команд. Не секрет,
что их  часто  используют  имен-
но для повышения  быстродействия
программы (а также для  уменьше-
ния ее размера и затруднения от-
ладки). Поэтому я решил  опреде-
лить  время  выполнения  опытным
путем, для  чего  была  написана
следующая программа:140.

        ORG     #6000

;Устанавливаем 2-й режим прерываний,
;обработчик будет по адресу #6262:

        DI
        LD      A,#80    ;таблица будет
        LD      I,A      ;по адресу #8000
        LD      HL,#8000 ;заполняем
        LD      (HL),#62 ;таблицу...
        LD      DE,#8001
        LD      BC,#100
        LDIR
        IM      2
        LD      A,#C9    ;заносим код RET,
        LD      (#6262),A;чтобы проц. обр.
                         ;прерываний
                         ;ничего не делала
        LD      HL,0     ;обнулили счетчик
        EI
        HALT             ;ждем прерывания

;Поступил сигнал прерывания, происходит
;следующее:
; - процессор запоминает адрес следующей
;   команды программы в стеке;
; - просматривает ячейку, указанную
;   шиной данных +256, умноженное на
;   содержимое регистра I;
; - передает управление по адресу,
;   содержащемуся в этой ячейке (в данном
;   случае - по адресу #6262).
;
; На это тратится 18 тактов.
;
; - по адресу #6262 сейчас находится
;   команда RET, ее выполнение занимает
;   10 тактов.

;Заменяем эту команду RET на NOP:

        XOR     A          ; 4 такта
        LD      (#6262),A  ; 13
        NOP                ; 4
        NOP  ;задержка     ; 4
        NOP  ;во избежание ; 4
        NOP  ;повторного   ; 4
        NOP  ;захвата      ; 4
        NOP  ;прерывания   ; 4
        NOP                ; 4
        NOP                ; 4
        EI                 ; 4

;Итак, с момента получения сигнала
;прерывания прошел уже 81 такт.
;Теперь начинаем выполнять в цикле
;последовательность команд,
;при каждом выполнении цикла содержимое
;HL увеличивается на 1.

LOOP1   INC     HL         ; 6 тактов

;Здесь находится анализируемая команда:

        NOP

;Если команда влияет на HL, вместо нее
;можно записать последовательность
;PUSH HL: КОМАНДА :POP HL.

        JR      LOOP1      ; 12 тактов

;Таким образом, на каждое выполнение
;цикла будет затрачено 18+t тактов,
;где t - время выполнения анализируемой
;команды.

;Сюда будет передано управление, как
;только поступит следующий импульс
;прерывания.
;В HL будет кол-во выполнений цикла.

END     RET

;**************************************
;Обработчик прерывания:

        ORG     #6262

        NOP

;В процессе выполнения сюда сначала
;ставится RET, а потом NOP. Если выходить
;из обработчика с помощью RET, снова
;попадем в цикл, что совсем не нужно.

        INC     SP
        INC     SP
        IM      1
        EI
        JP      END
2
   Чтобы определить время выпол-
нения какой-либо команды процес-
сора с помощью  этой  программы,
необходимо  подставить   команду
вместо NOP, скомпилировать прог-
рамму и запустить ее из отладчи-
ка STS  с  помощью  команды  [C]
#6000. После  этого  нужно  рас-
смотреть содержимое регистра  HL
(естественно, сама анализируемая
команда не должна влиять на этот
регистр).  Из  текста  программы
ясно, что существует такое соот-
ношение:

        81+(18+t)*x = T

Здесь t - время выполнения  ана-
    лизируемой команды в тактах;
x - число выполнений цикла  (со-
    держимое HL);
T - число тактов между  прерыва-
    ниями.

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

         T = 81+22*x

   Для моего "Пентагона-128" x =
#CB7. После подстановки в форму-
лу получим T = 71691 такт.  Хотя
при таком способе измерения быс-
тродействия  погрешность   может
достигать   времени   выполнения
цикла (в данном случае  22  так-
та), на дальнейшие  расчеты  это
мало повлияет.

   Теперь   попробуем   измерить
время  выполнения   какой-нибудь
команды,  например, LD  IX,#1234
(истинное  время  выполнения  14
тактов). Подставляем  ее  вместо
команды NOP и запускаем програм-
му, как и в  предыдущем  случае.
После этого время выполнения на-
ходится по формуле:

             T-81
        t = ────── - 18
              x

   Для моего компьютера x =#8BE,
тогда  t = 13,9973.  Как  видим,
при таком способе измерений дос-
тигается неплохая точность.
   Теперь  я  приведу  найденные
этим способом оценки времени вы-
полнения некоторых  недокументи-
рованных команд:

    ┌──────────────┬──────────┬─────────────┬──────────────┐
    │Мнемоника     │Код       │Содержимое HL│Время в тактах│
    ├──────────────┼──────────┼─────────────┼──────────────┤
    │LD HX,N       │DD 26 N   │ #9A5        │11            │
    │LD LY,N       │FD 2E N   │ #9A5        │11            │
    │LD HX,A       │DD 67     │ #AC2        │8             │
    │LD LX,LX      │DD 6D     │ #AC2        │8             │
    │ADD A,HX      │DD 84     │ #AC2        │8             │
    │SLI A         │CB 37     │ #AC2        │8             │
    │SLI (HL)      │CB 36     │ #87A        │15            │
    │SLI A,(IX+S)  │DD CB S 37│ #6D3        │23            │
    │SRL A,(IX+S)  │DD CB S 3F│ #6D3        │23            │
    │SET 0,A,(IX+S)│DD CB S C7│ #6D3        │23            │
    │INF           │ED 70     │ #953        │12            │
    │OUT (C),*     │ED 71     │ #953        │12            │
    └──────────────┴──────────┴─────────────┴──────────────┘

   Все команды, которые  получа-
ются с помощью  добавления  пре-
фиксов #DD и #FD, в том числе  и
недокументированные, выполняются
на 4 такта дольше, чем те же ко-
манды без префикса, а регистр  R
при их выполнении  дополнительно
увеличивается на 1. Это не каса-
ется команд с индексной  адреса-
цией, таких как LD A,(IX+S).
   Команда SLI выполняется с та-
кой  же  скоростью, как  команды
SRL, SRA и SLA.
   Выполнение команд, помещающих
результат кроме  ячейки  памяти,
адресуемой IX или IY, в регистр,
занимает  столько  же   времени,
сколько и для  обычных вариантов
этих команд.
   Команды INF и  OUT (C),*  вы-
полняются  так же быстро, как  и
другие   команды   ввода/вывода,
т.е. 12 тактов.

          *   *   *




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

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.

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


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

Похожие статьи:
Реклама - Реклама и объявления.
События - подробный отчет и фотографии с Chaos Construction 2001 (окончание).
For Coderz - Описание модульной структуры программ.

В этот день...   9 декабря