возвращаясь к тесту, где у меня FFFF в 01 и 05 режиме.
Я не могу понять каким образом там получается A10B (на оригинале), когда как там заносится значение FFFF в счетчик и сразу же считывается. Как?? как он успевает дотикивать до A10B??
- - - Добавлено - - -
я посмотрел по схеме. Ничего там кроме ресета не заведено. Да и стремно было бы если на ресет какие-то импульсы приходили бы.
Но при всём при этом я не понимаю как там после заноса FFFF в счетчик и считыванием в следующей комманде получается A10B... Не успеет он так быстро дотикать.
- - - Добавлено - - -
b2m,
в чем секрет такой скорости в режимах 1 и 5?
Ты смотрел схему Вектора 02го ?
D65.06 -> D66.13
KTSerg,
хм.. у меня схемы все от первой версии.
где взять 02?
p.s. нашел
- - - Добавлено - - -
у меня плохая схема 02.. числа очень плохо видны
- - - Добавлено - - -
Тут даже если на gate что-то тикает (в чем я сильно сомневаюсь), получить A10B сразу после записи в счетчик просто невозможно!
Я немного подправил тест i8253.
В нём первоначально сразу после записи в счётчики считывались значения, потом ожидание двух прерываний и снова считывание (вторая пара).
Я исправил, что-бы считывал сразу два раза без прерываний.
Получилось, что во всех режимах разница между первой и второй парой одинакова, но счёт в режимах 1 и 5 начинается не с записанного FFFFh а с A111h !!!
Вот попробуй, когда запустятся 1й и 5й режимы, у меня на реале такой результат:
FFF9 00
FFD5
A10B 01
A0E7
FFF9 02
FFD5
FFF4 03
FFAC
FFF9 04
FFD5
A10B 05
A0E7
FFF9 06
FFD5
FFF4 07
FFAC
KTSerg,
у меня совпадает с твоими данными за исключением 1 и 5 режимов. В 1 и 5 у меня FFFF всегда, ибо в доках сказано что счет начинается только когда GATE переходит из состояния 0 в 1. Других данных у меня нет. Я даже не знаю что можно сделать.
А ты можешь еще исследовать 1 и 5? Например, замени в tst8253 режим на 1 или 5. Посмотри какие значения будут считываться.
Тут бы b2m помог. У него в EMU тесты как на реальном железе показывают.
Но он пока молчит...
- - - Добавлено - - -
о! наткнулся на тему про ви53.
там svofski пишет:
"Еще интересный момент, который не выкопаешь ни в какой доке. После первого теста в режиме "0" счетчик продолжает считать. Дальше тест программирует его на режим "1" и загружает в него значение $FFFF. Но, поскольку сигнал GATE в Векторе всегда "1", это число не переписывается во внутренний счетчик и счет продолжается как будто бы записи не было. Самое занятное в том, что операция установки режима в "1" все же останавливает счетчик, а загрузка значения, которое в него так никогда и не попадает, продолжает счет. "
Вот, это похоже на правду
- - - Добавлено - - -
Получается, что если Gate=1 то при переключении режима на 1, останавливает счет, а занесение любого значения в счетчик продолжает счет со старого значения. Типа, бага..
В доках, кстати, диаграммы рисуют варианты запуска режима 1(и 5) когда GATE=0 вначале, а потом переходит в 1.
- - - Добавлено - - -
в общем, сэмулировал я этот глюк.
Но вместо A10B у меня A109. И в десятичном тесте тоже на 2 меньше.
Где-то я не задерживаю достаточно.
Попробую отыскать эти 2 такта.
Да, скорее всего это так и есть.
Я уменьшил начальные значения счётчиков с FFFF на AAAA и все считанные значения уменьшились пропорционально, похоже что в 1 и 5 режимах новые значения действительно не записываются.
Посмотрел схему от простого Вектора, там GATE = системный сброс, просто вырабатывается. На схеме 02го там ещё чего-то дополнительно накручено... пытался разобраться... утонул в развилках...
- - - Добавлено - - -
Я логгером осматривал ВИ53ю может это поможет.
Дело в том, что сигнал CS длится 2 такта CLK.
Может счёт останавливается на нём?
- - - Добавлено - - -
Верхний график это CLK.
Ниже GATE.
Потом CS, RD, WR.
Здесь можно скачать актуальные версии Virtual Vector (VV)
Не бага, а фича
Мы же вроде разобрались выше, что установка режима останавливает счёт, а загрузка делителя - разрешает. Вот только загружается не сам счётчик, а регистр, откуда в режимах отличных от 1 и 5, загружается счётчик (либо сразу после загрузки делителя, либо когда он доходит до нуля). Особенность режимов 1 и 5 в том, что счётчик загружается из регистра (куда загружен делитель) по фронту gate (т.е. аппаратный строб). До этого момента он просто продолжает считать дальше, даже когда дойдёт до нуля. А срабатывание таймера, а именно заём переноса при переходе через ноль, в этих режимах на выходе никак не отражается, пока не было строба запуска.
Т.е. схематично можно изобразить канал таймера как: [регистр делителя] -> [счётчик] -> [регистр latch]
Пишем мы в регистр делителя, а читаем из регистра latch.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)