Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

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

(«ZX-Ревю» 7—10/1997)
Дата последнего редактирования: 5.04.2003.

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

        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.
        INC     SP   ;Если выходить из обработчика
        INC     SP   ;с помощью RET, снова попадём
        IM      1    ;в цикл, что совсем не нужно.
        EI
        JP      END

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

81+(18+t)x = T,
где  t — время выполнения анализируемой команды в тактах,
x — число выполнений цикла (содержимое HL),
T — число тактов между прерываниями.

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

T = 81+22x.

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

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

t = 
T–81

x
 –18.

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

Теперь я приведу определённое по этому способу время выполнения некоторых недокументированных команд:

Табл. 1
Мнемоника Код Содержимое HL Время в тактах
LD HX,nDD 26 n#9A511
LD LY,nFD 2E n#9A511
LD HX,ADD 67#AC28
LD LX,LXDD 6D#AC28
ADD A,HXDD 84#AC28
SLI ACB 37#AC28
SLI (HL)CB 36#87A15
SLI A,(IX+s)DD CB s 37#6D323
SRL A,(IX+s)DD CB s 3F#6D323
SET 0,A,(IX+s)DD CB s C7#6D323
INFED 70#95312
OUT (C),*ED 71#95312

Все команды, которые получаются с помощью добавления префиксов #DD и #FD, в том числе недокументированные, выполняются на 4 такта дольше, чем те же команды без префикса, а регистр R при их выполнении дополнительно увеличивается на 1. Это не касается команд с индексной адресацией, таких как LD A,(IX+s).

Команда SLI выполняется с такой же скоростью, как команды SRL, SRA и SLA.

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

Команды INF и OUT (C),* выполняются так же быстро, как и другие команды ввода/вывода, т.е. за 12 тактов.

Другие мои статьи о недокументированных особенностях процессора Z80:

1. 

«Недокументированная особенность процессора Z80». «Радиолюбитель. Ваш компьютер» 4/2000.

2. 

«Влияние команды OUTD на флаг переноса». «Радиолюбитель. Ваш компьютер» 5/2001, под псевдонимом BV_Creator.

Страница Ивана Рощина > Статьи >