User Tag List

Показано с 1 по 10 из 1102

Тема: Emu80 v.4

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от barsik Посмотреть сообщение
    Понятно, что можно заставить каждую процедуру эмуляции конкретной команды увеличивать какой-то счётчик на число тактов реальной команды. Что это даст, кроме знания сколько тактов исполнилось.
    Без этого вообще невозможно сделать точную эмуляцию. И кстати, условные команды CALL и RET выполняются за разное количество тактов, в зависимости от условия, тоже надо учитывать.

    Цитата Сообщение от barsik Посмотреть сообщение
    Какой цикл эмуляции? Что за цикл?
    Например, мы запускаем эмуляцию 50 раз в секунду по таймеру (или сигналу КСИ). Эмуляция команд процессора происходит в цикле. В нём же мы учитываем, сколько тактов выполнил наш процессор. Как только это число перевалило за 40000, завершаем цикл и ждём следующего срабатывания таймера. Таким образом в секунду мы эмулируем 50*40000=2000000 тактов процессора, что соответствует тактовой частоте 2МГц. В том-же цикле эмуляции нужно эмулировать и другие устройства: экран, звук, в/в магнитофона, последовательный интерфейс и т.д. и т.п.
    Последний раз редактировалось b2m; 04.04.2017 в 14:42.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m
    Как только это число перевалило за 40000, завершаем цикл и ждём следующего срабатывания таймера
    На мой взгляд это неудачная концепция. Пригодная лишь для точной эмуляции по скорости и ито НЕ на коротких периодах. На быстрой машине собственно такая эмуляция длится, допустим, 1 процент времени за цикл, а остальное время прогона нет. Как же тогда правильно будет играть музыка, где всё на задержках. И где взять таймер с периодом частоты в 50-100 герц? Я слышал, что в IBM PC есть таймер позволяющий измерять отсчеты с кратностью 1/18 секунды, а не 1/100 секунды.

    По-моему, правильнее прогонять всё время, но тормозить после каждой команды, как я и делаю, хотя подгон времён и сделан небрежно. Обычно я сам пользуюсь эмулятором, где подгонка времён прогона команд отсутствует или минимальна, отчего погрешность времён +-100% и более (зато в режиме ТУРБО - 100 МГЦ Z80). Никакой разницы в работе программ при подгоне времён и без него - нет (точнее, я не заметил). Есть встроенный тест, который исполняет сотни миллионов команд NOP, а затем по таймеру вычисляет реальный такт. Этого вполне хватает. Можно прогнать тест с заведомо известным временем прогона и настроить и по нему. Но т.к команды плохо сбалансированы, то время прогона зависит от конкретного набора команд. Поэтому если настроить константу тормозилки по одному тесту, то на другом тесте возможны существенные расхождения с реальностью +-10%.

    Но для программ это без разницы. Нет программ ни для ОРИОНА, ни для СПЕЦИАЛИСТА, ни для РК86, где это бы играло роль. Чем переделывать концепцию, мне проще написать тест команд по скорости (это программа Z80, который в моём эмуляторе имеет доступ к времени в 0040:006C) и сделать покомандную подгонку менее дискретной (т.е грузить в счётчик паузы не число тактов, а число тактов умноженное на 10), что даст возможность точнее сбалансировать команды.

    КСИ у меня в эмуляторе нет, т.к такты я не считаю. А прерывание 50 ГЦ формирую подсчётом не тактов, а числа команд - делалось на медленной ЭВМ, где запаса по скорости вообще не было, а INC короче чем ADD (на число тактов). Поэтому если тормозилка маленькая, такт CPU высокий, то эмулируются прерывания не 50 ГЦ, а например 100 ГЦ. В программах разницы не заметил.
    Последний раз редактировалось barsik; 04.04.2017 в 22:46.

  4. #3

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от barsik Посмотреть сообщение
    По-моему, правильнее прогонять всё время, но тормозить после каждой команды
    На мой взгляд это неудачная концепция. Особенно для винды, которая совсем не реалтайм. А музыка - она буферизируется, естесственно. Если пополнять буфер 50 раз в секунду, то буфер нужен всего лишь на 1/25 секунды. Есть, конечно, и недостаток - музыка отстаёт на 20 миллисекунд. Иногда заметно, например когда должны быть короткий звук и вспышка на экране. Но чаще всего такое мизерное отставание особой роли не играет. К тому-же, можно видео на один кадр позже выводить (правда придётся очередь из кадров городить).

    Кстати, я сталкивался с проблемой заметного отставания музыки, когда пытался переделать эмулятор на SDL. Причём размер буфера особой роли не играл. Pyk, а как ты эту проблему решил?

    - - - Добавлено - - -

    Цитата Сообщение от barsik Посмотреть сообщение
    Я слышал, что в IBM PC есть таймер позволяющий измерять отсчеты с кратностью 1/18 секунды
    Мне почему-то кажется, что времена ДОСа закончились уж лет 20 как.

    - - - Добавлено - - -

    Цитата Сообщение от barsik Посмотреть сообщение
    Нет программ ни для ОРИОНА, ни для СПЕЦИАЛИСТА, ни для РК86, где это бы играло роль.
    Зато есть демки для Вектора, где точность выполнения играет охренительную роль.

  5. #4

    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,829
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    663
    Поблагодарили
    513 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Pyk, если у вас заявлена высокая точность по времянкам
    то вы должны знать когда именно проц выдает hlda

    смотрел по мануалу
    проц детектит hold только во время t2, tw каждого машинного цикла
    а подтверждение... (с разной задержкой в зависимости от комады сходу не вспомню)

    короче
    где мне взять список всех команд проца
    разбитых на машинные циклы и их растактовку?

    та таблица что мне попадалась была сильно зачуханой и плохо читаемой
    где хорошо описанно подтверждение hold-а и как это влияет на время исполнения разных команд??

    а еще меня интересует на каком такте ei, di появляется изменение на inte
    Последний раз редактировалось NEO SPECTRUMAN; 04.04.2017 в 16:47.

  6. #5

    Регистрация
    05.04.2013
    Адрес
    Починки, Нижегородская обл.
    Сообщений
    1,371
    Спасибо Благодарностей отдано 
    401
    Спасибо Благодарностей получено 
    647
    Поблагодарили
    255 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    barsik, в общем-то b2m вроде бы уже все объяснил, и мне нечего добавить. У меня все сделано практически так же, да и в большинстве современных эмуляторов разных авторов и разных платформ, я думаю, тоже.


    Цитата Сообщение от b2m Посмотреть сообщение
    Кстати, я сталкивался с проблемой заметного отставания музыки, когда пытался переделать эмулятор на SDL. Причём размер буфера особой роли не играл. Pyk, а как ты эту проблему решил?
    В 3-й версии такая проблема вообще возникнуть не могла, так как я синхронизировал эмулятор как раз со звуком. В текущей же используется SDL2, синхронизируется с performance timer'ом (хотя скорее всего хватило бы и обычного), и со звуком проблем не было. Да и вообще, непонятно, из-за чего может появиться отставание, может быть, как раз накапливались не перенесенные на следующий цикл какие-нибудь отброшенные остатки от деления? Не зная особенностей твоей реализации, сложно сказать...


    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    Pyk, если у вас заявлена высокая точность по времянкам
    то вы должны знать когда именно проц выдает hlda
    Нет, я начал изучать этот вопрос, но так и не добил пока точные времянки, поэтому воздержусь от ответа, чтобы не наврать.
    Зато этого добился uart, надеюсь, он подскажет.

    У меня же было просто некое добавленное за несколько минут эвристическое решение, которое резко увеличило точность и зачастую даже выдавало совершенно точные значения на тестах. Но сейчас я уже сам до конца не понимаю, из каких соображений я это сделал и как оно вообще работает. Попытки улучшить приводят только к ухудшению, так что пока его убрал.

  7. #6

    Регистрация
    12.11.2009
    Адрес
    Москва
    Сообщений
    403
    Спасибо Благодарностей отдано 
    50
    Спасибо Благодарностей получено 
    90
    Поблагодарили
    66 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    а еще меня интересует на каком такте ei, di появляется изменение на inte
    Это поможет?


Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Emu80, старые версии
    от Pyk в разделе Эмуляторы отечественных компьютеров
    Ответов: 68
    Последнее: 11.03.2017, 00:33

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •