http://www.shadowmagic.org.uk/cssfaq...kreference.htm
Поищите строки, содержащие "ir:" (без кавычек).
Нет, четыре такта -- чтение плюс такт на обновление памяти -- выполняются в любом случае. И даже если значение I лежит в диапазоне [0x40; 0x80), на четвертом такте задержки нет. А вот если цикл выборки длиннее этих четырех тактов, то на каждом дополнительном такте, начиная с пятого и до конца цикла, ULA будет взводить ~CLK, т.е. останавливать процессор. (Может показаться странным это особенное поведение T4 цикла выборки, но на самом деле все логично: этот такт начинается при низком уровне ~MREQ, который в течение такта поднимается, и на следующем такте ULA уже смотрит на адресную шину.)
Тот же Vectron использует это как визуальный эффект. Без всяких последствий.
Да, интересно было бы сравнить предельные скорости эмуляции. Сейчас сравнивать родную линуксовую сборку с чем-то работающим под Wine было бы неправильно, но на перспективу идея годится.
С другой стороны, в моем случае, насколько я могу умозрительно оценить реализацию, введение задержек на IR не могло ощутимо повлиять на производительность.
Даже не знаю как прокомментировать...
В логике (уже который раз к ней обращаюсь) есть такие аксиомы: из истины следует истина, а из лжи может следовать что угодно. Применительно к теме это означает, что даже если реализация эмулятора не верна, то это еще не значит, что тест BBG на ней не будет правильно работать. И обратно: тот факт, что после некоторых правок тест BBG стал правильно работать, еще не значит, что сами эти правки верны.
Я вас отлично понимаю, когда вы говорите, что не стремитесь к абсолютной точности эмуляции, однако это не может делать из таких рассуждений аргумент в обсуждении правильной реализации.
Задержек на IR нет.
Я приложил трейсинг пары рабочих фреймов теста BBG. Там же снапшот состояния, с которого трейсинг стартовал. Формат такой: до двоеточия стоит адрес инструкции, после двоеточия следует полный оп-код инструкции, в скобках указан номер такта во фрейме до исполнения инструкции.
Не забудьте пропустить первые фреймы синхронизации.
Я имел в виду, что задержки вывода в порт считаются по паттернам. Все эти паттерны подразумевают, что цикл вывода длиной в 4 такта.
За KAZ6 спасибо.
С MEGACLR странная история. На Higgins и Fuse в режиме 48K после загрузки черный экран без признаков жизни. На Fuse в режиме 128K прокручивает снизу вверх текст из цветных квадратов, без всяких бордюрных эффектов. По описанию ("угребище") -- похоже, но тем не менее.
Да, пожалуйста.
На всякий случай дам ссылку:
http://www.worldofspectrum.org/forum...ad.php?t=20345
Попробовал убрать влажок H из инструкции AND. Тест на флаги это обнаружил, на остальных инструкциях ошибок не дал. Тест на MEMPTR тоже ошибок не дал.
Попробовал изменить вычисление значения MEMPTR для LDIR/LDDR чтобы прибавлял 2 к значению PC. Тест на флаги прошел без ошибок. В тесте на MEMPTR LDIR (BC > 1) и LDDR (BC > 1) дали ошибки, все остальные инструкции прошли без ошибок.
Ну, вам в помощи здесь никто не отказывает. А игрушка... не хуже других. ;-)
Минуточку. В этом документе сказано, что если была прервана одна из этих инструкций, т.е. прерывание было принято перед ее исполнением, то флаг P/V получит уже сброшенное значение IFF2. Более того, сайте WOS подчеркнуто, что это обстоятельство является следствием того факта, что прерывания начинаются со сброса IFF1 и IFF2. То есть это не то что на баг не похоже, это даже не особый случай.
А Владимир пишет совсем по-другому:
Обновление памяти -- это всегда только один такт в цикле выборки. Больше оно не длится. Но само значение IR остается на адресной шине. И пока I лежит за пределами области задержек, это не заметно.
На сайте WOS задержки на IR просто не учтены, M1 не является чем-то особенным с точки зрения ULA, если не обращать внимания на уровень ~MREQ в начале T4.





Ответить с цитированием