Нашлись тесты, которые использовались для отладки эмуляции ВИ53 в эмуляторе VE http://sensi.org/~svo/scalar/ware/650
Вид для печати
Нашлись тесты, которые использовались для отладки эмуляции ВИ53 в эмуляторе VE http://sensi.org/~svo/scalar/ware/650
Знать бы ещё, чего они выдают на реальном Векторе...
Знать бы еще чо это вообще за цифирь =)))
Двузначная цифра, как ни странно, номер режима.
Первая 4-х значная: считанное значение после загрузки 0FFFFh (до этого стоит HLT), а вторая у трёх тестов разная:
i8253 - считанное значение после двух HLT
i82531 - считанное значение после загрузки 0E0E0h
i82532 - просто повторно считанное значение (при этом до обоих считываний была установка того-же режима)
Добавлено через 14 минут
Кажется, третий тест у меня неправильно работает: после установки режима счёт вроде бы запрещён, и оба значения должны быть одинаковы...
Не буду утверждать совсем уж строго, потому что целенаправленно не тестировал, но мне очень сильно показалось, что в режиме "0" ВИ53 в обоих эмуляторах переваливает через ноль и продолжает считать как ни в чем ни бывало. А должен ждать, пока его не перезарядят.
Цитата:
Mode 0 (terminal count)
The counter output is set to “L” level by the mode setting. If the count value is then written in the counter with the gate input at “H” level (that is, upon completion of writing the MSB when there are two bytes), the clock input counting is started. When the terminal count is reached, the output is switched to “H” level and is maintained in this status until the control word and count value are set again.
Counting is interrupted if the gate input is switched to “L” level, and restarted when switched back to “H” level.
When Count Values are written during counting, the operation is as follows:
1-byte Read/Load. ............When the new count value is written, counting is stopped immediately, and then restarted at the new count value by the next
clock.
2-byte Read/Load ............. When byte 1 (LSB) of the new count value is written, counting is stopped immediately. Counting is restarted at the new count value when byte 2 (MSB) is written.
Вечером сделаю замеры на реале, сравним. Можете также придумать свои тесты.
Ближе к вечеру погоняю, отпишусь. Мой таймер у меня тоже иногда вызывает сомнения, но сейчас я еще не могу на них сфокусироваться.
Да, таймер сломался. Вобщем, чтобы убрать артефакт программирования палитры я сделал изменение, которое касается эмуляции в целом. Я потестировал немного все компы, вроде косяков не было, но как оказалось сделал это слишком поверхностно. Действительно, для теста таймера больше всего подходит exolon на Векторе, это я давно заметил :)
clrs с музоном срывается раз в 7-8 секунд.
Прилагаю скриншоты тестов таймера http://www.sensi.org/~svo/scalar/ware/650/
Вектору нужен более компактный и быстрый плеер. Все эти адаптированные с Z80 чудеса отжирают недопустимо много экранного времени.
Сидел вчера, мучил свой таймер. Узнал немало нового про устройство 8253, передавал в астрале инженерам из интела наипламеннейшие приветы. Три известных таймерных теста стали проходить как на реале: все кроме 0-3. 0-3 у меня показывает 2C28 хоть убей (вместо 2C26), причем в других случаях цифры совпадают.
clrslow при этом все равно дергается (хотя, сейчас вспоминаю и не могу с увереностью сказать, когда именно я его проверял), а SSTV по-прежнему не желает сдвигаться с мертвой точки. Это какой-то заговор.
svofski - а exolon нормально работает?
Конечно, как можно без Эхолона =) Но я не знаю, гарантирует ли это что бы то ни было, кроме исправности Эхолона. Таймер имеет ожидаемый период в режиме <x> и из него получается считывать значения каждый раз одинаковые.. В каком, кстати, режиме, кто-нибудь помнит?
Мне кажется, что команда разработчиков 8253 испытывала какой-то комплекс перед всеми остальными.. Типа, вот, люди процессоры делают, контроллеры шыыыннные, к памяти напрямую доступаются! А нам счетчик какой-то дали убогий. И, подогреваемые эмоциями, сделали его сложнее процессора. Документаторы, соответственно, не смогли описать его поведение, поэтому в даташитах везде какие-то недомолвки. С другой стороны, забавно. Ведь это единственный чип того времени, который до сих пор есть в каждом писюке. Правда, интегрированный в южный мост.
Для отсчетов интервала ехелон использует канал 1 в режиме 2
---------- Post added at 17:51 ---------- Previous post was at 17:43 ----------
Кстати игры использующие таймер нестандартно: colorwar.rom, набор карточных игр card.fdd, само собой exelon.rom. в других прогах незамечал. В картах вообще непонятно зачем, походу SES неособо задавался этим вопросом когда передирал его :)
---------- Post added at 18:01 ---------- Previous post was at 17:51 ----------
Вот например в даташитах написано минимально допустимое число которое можно записывать в счетчик в разных режимах, но нигде ненаписано, что будет если всеже его туда записать, и что счетчик по окончанию счета должен остаться в нуле или переполнится и будет считать с $FFFF, и таких вопросов у меня была целая куча, к томуже нет программ, которые это могут выявить, тесты все подводные камни всеравно невыявят
Colorwar вроде запускал не так давно. Вроде ничего из ряда вон не заметил.
Сейчас вспомнил, на диске с SSTV у меня есть не помню откуда взявшийся файл TEST8253.COM, который с виду не делает ничего, кроме как рисует снизу какую-то черточку и зависает. Никто не знает, что это такое и, если черточка -- это индикатор (не)исправности, как она должна выглядеть?
---------- Post added at 16:12 ---------- Previous post was at 16:04 ----------
Да, это одно из кидалов. В даташите OKI как-то очень косно написано, что число $0000 прочитать из счетчика нельзя. Что они хотели этим сказать я не очень понял. Из Intel-овского даташита следует, что все "однократные" режимы 0 и 4 на самом однократны только с точки зрения выходов. А счетчик продолжает считать, переваливаясь через 0. Экспериментально вроде получилось, что переваливается он без перезагрузки (хотя это трудно установить теми тестами, что есть).
Еще интересный момент, который не выкопаешь ни в какой доке. После первого теста в режиме "0" счетчик продолжает считать. Дальше тест программирует его на режим "1" и загружает в него значение $FFFF. Но, поскольку сигнал GATE в Векторе всегда "1", это число не переписывается во внутренний счетчик и счет продолжается как будто бы записи не было. Самое занятное в том, что операция установки режима в "1" все же останавливает счетчик, а загрузка значения, которое в него так никогда и не попадает, продолжает счет.
короче сделали какой то глючный таймер, а нам теперь все глюки клонируй :)
Хмм.. а у меня вроде получалось 12 таймерных, то есть 24 процессорных =)
Не, вообще-то счётчик должен останавливаться на 32 такта:
Если не учитывать смещение сигнала на пару тактов в последнем цикле команды OUT, то будет 8+12+12=32 такта.Код:OUT 08H ; тут в последнем цикле останавливается
MVI A,0FFH ; 8 тактов
OUT 0BH ; 12 тактов
OUT 0BH ; 12 тактов, в последнем цикле включается
Откуда же у меня ещё 4 лишних такта? :v2_conf2:
---------- Post added at 18:22 ---------- Previous post was at 18:16 ----------
Надо посмотреть выход из режима HALT, наверное у меня делается мгновенно, а не через 4 такта после прерывания...
---------- Post added at 18:24 ---------- Previous post was at 18:22 ----------
Нет, тогда бы наоборот - счётчик меньше "уменьшился" ...
Я балда стоеросовая, или какая она там бывает, дубовая, еловая мякинная.. 12 хекс, 18 таймерных, то есть 36 процессорных тактов у меня разница была пока я не стал останавливать счетчик после записи управляющего слова. Правда, это никак не проливает пока свет на твои 4 такта, но меня немножко успокаивает.
---------- Post added at 17:33 ---------- Previous post was at 17:32 ----------
А ты учел, что счетчик там переваливает через край? Начальный отсчет в итоге получается меньше конечного.Цитата:
Нет, тогда бы наоборот - счётчик меньше "уменьшился" ...
В принципе, если принять за аксиому, что после установки режима счётчики простаивают 2 таймерных такта, то всё сходится. Т.е. нужно не просто приостановить счётчик, а ещё и задержать его возобновление на 2 таймерных такта.
Вот небезынтересный сорец из 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 (внутри)
Ну, у меня всё гораздо запутаннее :)
Внутри, когда значение меньше или равно нулю доплюсовывается начальное значение. При считывании, если число нечётное (в режиме 3), то добавляется еденичка. Вообще-то, надо бы скорректировать условие, должно быть: если число нечётное (в режиме 3) и оно меньше начального значения, то добавляется еденичка.Код:8 6 4 2 6 4 2 8... (считывается)
7 5 3 1 6 4 2 7 (внутри)
---------- Post added at 16:13 ---------- Previous post was at 16:12 ----------
А чё, по даташиту может ноль считаться?
Ни. Это так изображатеся, что в момент, когда по уму должен бы быть ноль, счетчик уже перезагружен и содержит начальное значение. Один из шитов, кажется OKI, вообще говорит, что ноль никогда не считывается. Но я не очень понимаю, что же тогда должно считываться тогда в момент перевала через ноль в режиме 0, например. Я думаю, что написанное ими следует читать как "ни в одном из описаных режимов", а не "никогда вообще".
Да, у тебя запутано и сложно =) В то же время оригинальный 8253 простым и элегантным назвать никак язык не поворачивается.
Вот и думаю я, как бы мне это исправить-то: все значения кроме первых правильные, а вот первые - увы.Код:8 6 4 2 6 4 2 8 ... (у меня)
7 6 4 2 7 4 2 7 ... (по даташиту)
Как заведено у программистов:
Код:// ХАКА
if (первое) исправить(); // ПОПРАВИТЬ!!
Мда, придётся так и сделать :)
Ещё раз подправил таймер, а заодно сделал тест третьего режима таймера: загружается (только младший байт) число 33, цикл опроса составляет 64 такта, т.е. 32 тика таймера, таким образом каждая следующая итерация попадает на следующий тик таймера.
Реальный тест
А можно было бы как-нибудь склеить все накопившиеся у нас тесты 8253 в один, чтобы по нажатию кнопки они бы один за другим шли? Круто было бы, конечно, еще и с эталонными данными, но это так, мечты.
До таймера у меня все как то руки недоходят, но вот в голове мысли крутятся, и я чесно говоря непонял, в режиме 3 счетчик декркментируется сразу на 2 за один такт? именно с этим связаны все эти шаманства для этого режима?
При работе clrs (и clrslow) на реале из пищалки слышно гудение, может это таймер? Я записал этот звук с магнитофонного/звукового выхода вектора Вложение 13914
Tim0xA, у тебя нечто подобное слышно?