-
Вот небезынтересный сорец из MAME. Не думаю, что этот таймер выдержал бы проверку Вектором, но он тоже не в лоб по даташиту написан.
http://mamedev.org/source/src/emu/ma...pit8253.c.html
---------- Post added at 20:10 ---------- Previous post was at 19:55 ----------
Да, к слову сказать, установка флага разрешения счета у меня происходит на следующий за загрузкой таймерклок, значит первый отсчет случится еще на следующий. Как будто бы сходится с твоей "аксиомой"?
-
Я отрихтовал эмулятор, чтобы он показывал такие-же буковки, как и скрины тестов ВИ53 от Tim0xA. Занимательно то, что как и svofski я не смог пока победить тест 0-3, который аналогично выдаёт 2С28 вместо 2С26.
-
b2m, лол. Предлагаю принять наш вариант единственно верным =)
В коде MAME есть какая-то очень подозрительная оговорка насчет режима 3. Что-то типа timer->value &= 0xFFFE; в функции load_timer_value(). Как ты думаешь, что они имели ввиду? Впрочем, режим 3 у них реализован вообще странно.
-
Нечётное значение инициализации счётчика в режиме 3 должно как-то хитро обрабатываться. Например, если загружаем 5, то счёт ведётся примерно так: 5 4 2 5 2 5 4 2 5 2 ... Если откинуть пятёрку, то так и получится, что младший бит нужно в ноль установить. Но это неправильно.
-
Даташит говорит, что если значение нечетное и output == 1, вычитаем 3. Если нечетное и output == 0, вычитаем 1 (ну или наоборот). Что делается при загрузке числа 1, разумеется, непонятно. В MAME есть на этот счет поправка, ссылаются на экспериментальные исследования.
Но в наших тестах загружается $FFFF...
-
Поправил предыдущий пост. Действительно либо 3, либо 1 в первом такте вычитается, а дальше чётное число пошло.
---------- Post added at 20:00 ---------- Previous post was at 19:23 ----------
Всё, теперь работает как на картинке :)
-
Ну а чего ты сделал-то, колись?
-
Я не стал мудрить со счётом, счётчик тупо загружает нечётное число, а при считывании, если режим 3 и в счётчик было загружено нечётное значение - один раз добавляется еденичка, другой раз убавляется. Тут, конечно, есть фича - никогда не считывается исходное число, которым производили инициализацию, но в целом работает. :)
-
Хмм... Как в даташите:
Код:
7 4 2 0(7) 6 4 2 0(7) 4 2 ...
Как у тебя:
Код:
6 4 2 0 8 6 4 2... (считывается)
7 5 3 1 7 5 3 1 (внутри)
Так?
-
Ну, у меня всё гораздо запутаннее :)
Код:
8 6 4 2 6 4 2 8... (считывается)
7 5 3 1 6 4 2 7 (внутри)
Внутри, когда значение меньше или равно нулю доплюсовывается начальное значение. При считывании, если число нечётное (в режиме 3), то добавляется еденичка. Вообще-то, надо бы скорректировать условие, должно быть: если число нечётное (в режиме 3) и оно меньше начального значения, то добавляется еденичка.
---------- Post added at 16:13 ---------- Previous post was at 16:12 ----------
А чё, по даташиту может ноль считаться?