Важная информация

User Tag List

Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 22

Тема: Помогите в написании эмуля!

  1. #1
    Veteran Аватар для molodcov_alex
    Регистрация
    13.03.2006
    Адрес
    Колпино
    Сообщений
    1,249
    Благодарностей: 330
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Exclamation Помогите в написании эмуля!

    Товарищи программисты! Помогите, плиз, с написанием эмуля!
    Вопрос номер раз: как наиболее грамотно организовать рабочий цикл (тот что от инта до инта), если конкретнее, организацию цикла каждые 20 мс (внутренности уже написаны и работают). В данный момент сделано через timeSetEvent, что ИМХО является неграмотным и неприличным.
    Вопрос номер два: звук. Как его сделать, скажем через WaveOut? Размер буффера? И т.д.. Алгоритм в общем. (со звуком никогда дела не имел)
    Как вы наверное поняли эмуль пишется пока под Винду на Си.
    Заранее благодарен.
    Последний раз редактировалось molodcov_alex; 27.06.2008 в 15:01.
    ZX Spectrum forever!

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

  3. #2
    Master Аватар для boo_boo
    Регистрация
    10.05.2005
    Адрес
    Москва
    Сообщений
    713
    Благодарностей: 14
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    насчет 20мс
    про винду мало что знаю, но в целом -- либо по звуку либо по таймеру высокого разрешения, причем чем евент по расписанию, ИМО лучше замерять тики до и после отработки фрейма, и когда все что надо на фрейм сделано, висеть оставшееся кол-во тиков, ожидая начала следующего фрейма
    Последний раз редактировалось boo_boo; 27.06.2008 в 17:27.

  4. #3
    Veteran Аватар для molodcov_alex
    Регистрация
    13.03.2006
    Адрес
    Колпино
    Сообщений
    1,249
    Благодарностей: 330
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну вот щаз как раз через таймер высокого разрешения, но это не кошерно...
    Через тики можно попробовать.
    ZX Spectrum forever!

  5. #4
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,041
    Благодарностей: 1426
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Еще можно завязываться на звук. Асинхронно запускаем воспроизведение 20мс звука и начинаем выполнять одно прерывание (проверка по счетчику тактов). Как только закончили- ожидаем, пока буфер до конца воспроизведется. Если отключить звук- получим режим максимальной скорости работы. Так сделано в US например.

  6. #5
    Master
    Регистрация
    16.08.2005
    Адрес
    Estonia,Tallinn
    Сообщений
    695
    Благодарностей: 409
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  7. #6
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,041
    Благодарностей: 1426
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Raydac Посмотреть сообщение
    увязывать чере цепь обратной связи время задержки выполнения отдельной эмулируемой команды для получения "реалистичного" быстродействия эмулятора
    Это ОЧЕНЬ ресурсозатратно и абсолютно не нужно. Эмуляция с точностью до кадра вполне достаточна для подавляющего большинства случаев

  8. #7
    Member Аватар для cyrax inc
    Регистрация
    24.09.2006
    Адрес
    Саратов
    Сообщений
    99
    Благодарностей: 0
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    как в этом случае реализуются эффекты мультиколора и полос на бордюре? обрабатываются отдельно?
    この悲しみは何時かきっと優しさに成る
    貴方に逢えた丘の上星が降る
    -------------------------------------------------
    Критик - человек, рассуждающий о том, как бы правильно сделал он сам... если бы умел.
    -------------------------------------------------
    Sony PS2 SCPH-70008 et Sony PS3 Eur 2.10

  9. #8
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,041
    Благодарностей: 1426
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от cyrax inc Посмотреть сообщение
    как в этом случае реализуются эффекты мультиколора и полос на бордюре? обрабатываются отдельно?
    Не забывай, что ты эмулируешь не только выполнение команд процессора, но и все остальные вещи. В том числе и луч ЭЛТ, выполняющий отрисовку экрана. Это позволяет даже клешинг эмулировать.
    Со звуком момент тонче- заполнение буфера идет параллельно с воспроизведением. Но в подавляющем большинстве случаев разница в скорости позволяет забивать на это. Главное, не делать большого объема работ в начале кадра- как раз начинается воспроизведение буфера, надо как можно скорее его забить, а уж потом делать прочие операции, пока карта будет играть.

  10. #9
    Veteran Аватар для molodcov_alex
    Регистрация
    13.03.2006
    Адрес
    Колпино
    Сообщений
    1,249
    Благодарностей: 330
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В общем сделал я с привязкой на звук... Теперь вот такой вопрос: как грамотно расчитывать эээ... sample чтоли?.. Есть у меня, конечно, один вариант, но он не очень.
    ZX Spectrum forever!

  11. #10
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,041
    Благодарностей: 1426
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от molodcov_alex Посмотреть сообщение
    Теперь вот такой вопрос: как грамотно расчитывать эээ... sample чтоли?..
    То есть? В какое место буфера надо пихать звук в данный момент? Дык, простой математикой

    F-частота дискретизации звука (44100,48000 и т.д.)
    buf_samp=F/20 - число семплов в буфере

    buf_pos = 0; //текущая позиция в буфере
    ticks_per_samp = ticks_per_frame / buf_samp; //тактов на один звуковой семпл
    last_buf_ticks = buf_pos; //граница текущего семпла в тактах
    //цикл по тактам фрейма
    for (unsigned ticks = 0; ticks < ticks_per_frame
    {
    ticks += do_cpu_cmd(); //выполняем процессорную команду и увеличиваем счетчик тактов
    if (ticks >= last_buf_ticks) //если вышли за пределы текущего семпла
    {
    wave_buffer[buf_pos++] = current_audio_level; //генерим звук
    last_buf_ticks += ticks_per_samp; //сдвигаем границу
    }
    }

    воспроизведение физически должно начинаться вместе с началом цикла

Страница 1 из 3 123 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Перенос файлов с эмуля на реал.
    от Vitamin в разделе Утилиты
    Ответов: 6
    Последнее: 02.07.2007, 14:28
  2. Новые плагины для Эмуля Шалаева 3.05
    от hi_soft в разделе Утилиты
    Ответов: 0
    Последнее: 22.05.2006, 19:26

Ваши права

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