На мой взгляд это неудачная концепция. Пригодная лишь для точной эмуляции по скорости и ито НЕ на коротких периодах. На быстрой машине собственно такая эмуляция длится, допустим, 1 процент времени за цикл, а остальное время прогона нет. Как же тогда правильно будет играть музыка, где всё на задержках. И где взять таймер с периодом частоты в 50-100 герц? Я слышал, что в IBM PC есть таймер позволяющий измерять отсчеты с кратностью 1/18 секунды, а не 1/100 секунды.Сообщение от b2m
По-моему, правильнее прогонять всё время, но тормозить после каждой команды, как я и делаю, хотя подгон времён и сделан небрежно. Обычно я сам пользуюсь эмулятором, где подгонка времён прогона команд отсутствует или минимальна, отчего погрешность времён +-100% и более (зато в режиме ТУРБО - 100 МГЦ Z80). Никакой разницы в работе программ при подгоне времён и без него - нет (точнее, я не заметил). Есть встроенный тест, который исполняет сотни миллионов команд NOP, а затем по таймеру вычисляет реальный такт. Этого вполне хватает. Можно прогнать тест с заведомо известным временем прогона и настроить и по нему. Но т.к команды плохо сбалансированы, то время прогона зависит от конкретного набора команд. Поэтому если настроить константу тормозилки по одному тесту, то на другом тесте возможны существенные расхождения с реальностью +-10%.
Но для программ это без разницы. Нет программ ни для ОРИОНА, ни для СПЕЦИАЛИСТА, ни для РК86, где это бы играло роль. Чем переделывать концепцию, мне проще написать тест команд по скорости (это программа Z80, который в моём эмуляторе имеет доступ к времени в 0040:006C) и сделать покомандную подгонку менее дискретной (т.е грузить в счётчик паузы не число тактов, а число тактов умноженное на 10), что даст возможность точнее сбалансировать команды.
КСИ у меня в эмуляторе нет, т.к такты я не считаю. А прерывание 50 ГЦ формирую подсчётом не тактов, а числа команд - делалось на медленной ЭВМ, где запаса по скорости вообще не было, а INC короче чем ADD (на число тактов). Поэтому если тормозилка маленькая, такт CPU высокий, то эмулируются прерывания не 50 ГЦ, а например 100 ГЦ. В программах разницы не заметил.




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