© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
Дата последнего редактирования: 5.04.2003.
В
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
Чтобы определить время выполнения
| где | t время выполнения анализируемой команды в тактах, |
| x число выполнений цикла (содержимое HL), | |
| T число тактов между прерываниями. |
Прежде всего нужно определить число тактов между прерываниями, так как для разных моделей компьютеров оно различно. Для этого в качестве анализируемой команды подставляем NOP, время выполнения которого равно четырём тактам. Получаем следующее соотношение:
Для моего
Теперь попробуем измерить время выполнения
| t = |
|
18. |
Для моего компьютера 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 тактов.
|
Другие мои статьи о недокументированных особенностях процессора Z80:
|