И спасает только BR, т.к. не используя счётчики - обнуляет их.
Что-то типа того. Но после этого исполняется два раза INC R1, вот это номер. Тут еще эффект связан если последующие команды не нарушают предвыборки, т.е. состоят из одного слова.
---------- Post added at 13:00 ---------- Previous post was at 12:59 ----------
Любая команда, нарушающая принцип предвыборки.
Гениально!
Вот любопытная модификация проведённого теста:
MovB перед записью ещё раз читает ячейку, не добавит ли это дополнительных глюков..Код:Clr R1
Clr R2
Clr R3
MovB (PC),(PC)
Inc R1
Inc R2
Inc R3
Jmp @#1000
.Word 2000
.Word 3000
---------- Post added at 12:06 ---------- Previous post was at 12:04 ----------
Но если эта команда сама использует сбитый счётчик - она скорее вынесет в Trap_To_4, чем спасёт. А из всех команд, нарушающих предвыборку - только BR не использует ни одного счётчика ( или ошибаюсь? ).
---------- Post added at 12:21 ---------- Previous post was at 12:06 ----------
Ещё один вариант:
Код:Clr R1
Clr R2
Clr R3
Mov (PC),R0
Mov (PC),R0
Inc R1
Inc R2
Inc R3
Jmp @#1000
.Word 2000
.Word 3000
Ну вот собственно и ответ:Скрытый текст
---------- Post added at 19:15 ---------- Previous post was at 18:52 ----------
Глюков здесь нет, все в пределах нормы. Т.к. эта команда делает запись по адресу предвыборки, то все сбрасывается и начинается сначала.
Скрытый текст
---------- Post added at 19:26 ---------- Previous post was at 19:15 ----------
Это тот вариант, что я описывал. Количество команд MOV @PC,R0 роли не играет.
Скрытый текст
Получается, что запись следующей ячейки после команды занимает весьма разное время при адресации относительно PC и относительно любого другого регистра:
Код::::::: SP = PC ::::::
Mov R0, (PC) 47
Mov R0, (SP)+ 85
---------- Post added at 18:34 ---------- Previous post was at 18:32 ----------
На первый взгляд могло показаться, что в первом случае запись не происходит, однако последние тесты показали, что команда Mov R0, (PC) честно пишет в следующую ячейку, но просто делает это гораздо быстрее.
Два кода для анализа с результатами:
Скрытый текст
---------- Post added at 20:16 ---------- Previous post was at 19:56 ----------
Еще интересный случай.
Скрытый текст
Супер!
Ну так если подытожить?
Там в двух позициях есть сомнительные результаты:
http://emulator.pdp-11.org.ru/misc/Test1.png
http://emulator.pdp-11.org.ru/misc/Test2.png
Во втором случае точно должно быть в 2 раза больше, а в первом - надо ещё проверить.
...
Специально для проверки первого пункта - более точный вариант линейного теста: MovPC2_v1.2
При первом запуске теста нужно ввести правильное значение частоты тестируемого процессора в килогерцах.
Результат запуска в эмуляторе ДВК выглядит так:
Где:Код:.RU MOVPC2
MovPC2 - v1.2
Memory Top: 137554
BUF words: 22867
CPU KHz: 5300 >
1: Nop Evt: 14 ; Run: 7557 ; Res: 7571 ; CLC: 14.0
1: Mov R0, R0 Evt: 14 ; Run: 7557 ; Res: 7571 ; CLC: 14.0
1: Mov R0, (PC) Evt: 5 ; Run: 2861 ; Res: 2866 ; CLC: 37.0
1: MovB R0, (PC) Evt: 5 ; Run: 2861 ; Res: 2866 ; CLC: 37.0
1: Mov (PC), R0 Evt: 6 ; Run: 3528 ; Res: 3534 ; CLC: 30.0
1: MovB (PC), R0 Evt: 6 ; Run: 3528 ; Res: 3534 ; CLC: 30.0
::: SP = PC :::
1: Mov R0, (SP)+ Evt: 4 ; Run: 2582 ; Res: 2586 ; CLC: 41.0
1: MovB R0, (SP)+ Evt: 4 ; Run: 2582 ; Res: 2586 ; CLC: 41.0
1: Mov (SP),(SP)+ Evt: 4 ; Run: 2161 ; Res: 2165 ; CLC: 49.0
1: MovB (SP),(SP)+ Evt: 4 ; Run: 2161 ; Res: 2165 ; CLC: 49.0
Program completed.
.
Evt - Число тестируемых команд, выполнившихся за промежуток времени между началом и концом первого прерывания таймера.
Run - Число тестируемых команд, выполнившихся за промежуток времени между концом первого и началом второго прерывания таймера.
Res - Общее число тестируемых команд, выполнившихся между началом первого и началом второго прерывания таймера.
CLC - Подсчитанное число тактов.
...
В приложении два варианта теста - MovPC2_v1.1 выходит из первого прерывания таймера по RTI, а MovPC2_v1.2 - по BR.
...