User Tag List

Страница 116 из 224 ПерваяПервая ... 112113114115116117118119120 ... ПоследняяПоследняя
Показано с 1,151 по 1,160 из 2231

Тема: ZXMAK2 - Виртуальная машина ZX Spectrum

  1. #1151

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Каким методом ты синхронизируешься с лучом?
    Код:
                    // wait VBlank
                    while (!_isCancel)
                    {
                        var state = D3D.RasterStatus.InVBlank;
                        var change = state != _vblankValue;
                        _vblankValue = state;
                        if (change && _vblankValue)
                        {
                            break;
                        }
                    }
    кроме свойства InVBlank, других способов узнать момент начала развертки в MDX Direct3D не нашел И насколько помню в нативном API с этим тоже вроде проблемы были. В unreal тоже тупой цикл из-за этого сделали
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  2. #1152

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение

    кроме свойства InVBlank, других способов узнать момент начала развертки в MDX Direct3D не нашел И насколько помню в нативном API с этим тоже вроде проблемы были. В unreal тоже тупой цикл из-за этого сделали
    Это что же, у тебя вечный цикл до смены вбланка?
    Я тоже искал для своего эмулятора хоть какой-нибудь способ усыпить приложение до прихода VBlank, но не нашел. Пришлось так же отслеживать состояние пока оно не изменится.

  3. #1153

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Это что же, у тебя вечный цикл до смены вбланка?
    а как в пц демах делают? и почему тут нельзя так же?

  4. #1154

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Это что же, у тебя вечный цикл до смены вбланка?
    Я тоже искал для своего эмулятора хоть какой-нибудь способ усыпить приложение до прихода VBlank, но не нашел. Пришлось так же отслеживать состояние пока оно не изменится.
    Да, если включить VBlank, то при вызове IHostVideo.WaitFrame работает тупой цикл, пока не прийдет VBlank. Пробовал сделать высокоприоритетный поток из которого кидать ивенты, но он как-то не стабильно работает, если его усыплять на 5-10 мс в момент ивента, то работает более менее, если усыплять на меньшее время, он начинает отбирать время у потоков эмуляции, если на большее, то пропускает кадры. Короче работает менее стабильно чем тупой цикл, а процессор жрет еще больше...

    ---------- Post added at 01:44 ---------- Previous post was at 01:29 ----------

    Цитата Сообщение от psb Посмотреть сообщение
    а как в пц демах делают? и почему тут нельзя так же?
    в демках не нужно узнавать когда бланк пришел, они просто вызывают Present, который при включенной настройке VBlank у девайса блокирует выполнение и крутит такой-же цикл уже внутри системы...
    Тут есть загвоздка в том что в эмуляторе Present вызывается из UI потока. А синхронизировать нужно поток эмуляции, т.е. не из UI...
    Хм.. Можно попробовать настроить девайс на Present с ожиданием VBlank и кидать после Present'а ивент для потока в котором выполняется WaitFrame...
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  5. #1155

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Да, если включить VBlank, то при вызове IHostVideo.WaitFrame работает тупой цикл, пока не прийдет VBlank. Пробовал сделать высокоприоритетный поток из которого кидать ивенты, но он как-то не стабильно работает, если его усыплять на 5-10 мс в момент ивента, то работает более менее, если усыплять на меньшее время, он начинает отбирать время у потоков эмуляции, если на большее, то пропускает кадры. Короче работает менее стабильно чем тупой цикл, а процессор жрет еще больше...
    А этот 'тупой цикл' не отбирает все быстродействие системы?

    В своем эмуле я просто засыпаю на 1мс, потом проверяю не пришел ли вбланк, и так по кругу (если очень упрощенно говорить).
    Хотя на самом деле я делаю чуть хитрее. Я не жду вбланк, а жду некой линии развертки, примерно линий за 100 до вбланк'а (с отдачей квантов другим задачам по 1мс кусочкам), после чего забираю все быстродействие на себя, таким образом могу очень точно отловить приход вбланка. Кроме того, такой подход позволяет избежать случайного пропуска момента вбланка, если в данное время какое-то приложение забрало на себя кванты времени, и не хочет отдавать.
    Экспериментально тестировал в разных условиях, работает весьма стабильно даже если на фоне начался жуткий свап или другое безобразие.

  6. #1156

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Хотя на самом деле я делаю чуть хитрее. Я не жду вбланк, а жду некой линии развертки, примерно линий за 100 до вбланк'а (с отдачей квантов другим задачам по 1мс кусочкам), после чего забираю все быстродействие на себя, таким образом могу очень точно отловить приход вбланка.
    У Windows Sleep работает на аппаратных прерываниях 10 мс. Так что вызвав Sleep(1), назад управление можно получить и через 10 мс. А это практически время развертки целого кадра (1/75=13мс), о каком отслеживании VBlank в таких условиях можно говорить?
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

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

  8. #1157

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    У Windows Sleep работает на аппаратных прерываниях 10 мс. Так что вызвав Sleep(1), назад управление можно получить и через 10 мс. А это практически время развертки целого кадра (1/75=13мс), о каком отслеживании VBlank в таких условиях можно говорить?
    По умолчанию может и 10мс, но я устанавливаю предварительно принудительно 1мс, и действительно оно переключается каждую мс. Проверял тестами на всех машинах.

    Можешь запустить у себя EmuStudio, он в консольном окне напишет измеренный минимальный интервал, уверен на 99.9%, что там будет написано Timer Period Min - 1ms.

  9. #1158

    Регистрация
    22.06.2005
    Адрес
    Ульяновск
    Сообщений
    161
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    А можно поподробнее как это обрабатывает реальная вг93? Зачем тут принудительное прерывание?
    Итак, *****код процедуры торможения диска в лоадере Satisfaction находится по адресу #6084.
    Код:
    xor a
    out (#1f),a
    ld a,#d0
    out (#1f),a
    ret
    Непосредственно после загрузки первой части мегадемо, до выполнения процедуры торможения диска, имеем следующую ситуацию в эмуляторе:



    Далее выполняется код:
    Код:
    xor a - гасим лампочку, bit 3 загрузки головки h выставляем в 0
    out (#1f),a
    Здесь выполняется команда "Восстановление" 0000hvxx - обеспечивает переход МГ на нулевую дорожку ГМД. Команда имеет следующие параметры:
    h - бит определяет положение магнитной головки дисковода во время выполнения команды. Если он обнулен, то головка поднята, если установлен - находится в рабочем положении (опущена на дискету). Следует учитывать, что при h=0, контроллер не выдает сигнал на включение двигателя дисковода. Выход на нулевую дорожку подтверждается состоянием входного сигнала TR00 который поступает с НГМД. Если сигнал TR00 = 0, это означает, что МГ находится в исходном состоянии. Если сигнал TR00 = 1 (наш случай) микроконтроллер генерирует не более 255 шаговых импульсов STEP. Если после генерации 255 импульсов устанавливается низкий уровень сигнала TR00, то в бит состояния "Ошибка поиска" в регистр состояния записывается единица. Другими словами, физический дисковод на реале никуда головку перемещать не будет, но ВГ-93 отработает 255 шаговых имульсов. А в эмуляторе это не учитывается. После этого:



    Далее, чтобы прервать эти шаговые импульсы выполняется код:
    Код:
    ld a,%11010000 - принудительно прерываем выполнение команды
    out (#1f),a
    ret
    Здесь выполняется команда "Принудительное прерывание" 1101i3i2i1i0 - задается для завершения какой-либо выполняемой команды. В отличии от других команд она может быть записана в регистр команд в любой момент. Однако, исполнение команды может определяться состоянием младших битов i0 - i3. Если биты i0 - i3 в состоянии "0" (наш случай), то немедленно прекращается выполнение текущей команды и сигнал подтверждения завершения команды INTRQ не вырабатывается. После этого:



    Затем, когда загрузчик пытается загрузить новую часть демо, то turbo loader виснет в цикле при чтении сектора на ошибке "сектор не найден".
    Обрати внимание на номер трека и статус на последнем скрине, по идее значения должны быть такими (если я правильно понимаю):
    Код:
    STATUS: #80
    TRK: #03
    beta: #00
    Ну, в общем, как-то так.
    Последний раз редактировалось Faster; 10.04.2014 в 10:37. Причина: подправил причину зависания в лоадере
    Когда на твой вопрос отвечает философ, перестаешь понимать вопрос

  10. #1159

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Faster Посмотреть сообщение
    Итак
    Спасибо, очень помогло бы расписать что именно не так и как должно быть (например - вот тут делаем то-то, должно получиться то-то, а получается то-то), потому что пока кроме того, что чтото c восстановлением работает неправильно (если я правильно понял), суть проблемы не очень ясна
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  11. #1160

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    пока без поддержки звука и джойстиков (видео, клавиатура, мышь)



    Вроде в XNA уже встроен механизм синхронизации, когда окно активно, то кушает ядро на 100%, кактолько убераешь фокус - падает до обычных 5-8%. Причем что интересно, почемуто XNA4 сам вызывает обновление с частотой 50 Гц, как Game.Update, так и Game.Draw. Но фреймы скипает криво - похоже на синхронизацию от звука, даже чуть менее точно, плавные скролы подергиваются раз в несколько секунд.
    Код полностью реюзает существующий MainPresenter, для XNA версии написана только реализация интерфейсов IHost (IHostVideo, IHostKeyboard, IHostMouse) и подключен референс на ZXMAK2.exe
    Синхронизация по видео, т.к. IHostSound пока нету

    Неприятная штука, в XNA4 убрали поддержку обычного rgba формата для цвета. Есть только bgra, в итоге каждый кадр приходится конвертить перед рендерингом, что дает дополнительную нагрузку на процессор.

    Пока не комиттил. Подумываю о полном переходе на .NET 4.0. Но есть опасения что на каких-то системах он не поддерживается.
    Последний раз редактировалось ZXMAK; 10.04.2014 в 03:50.
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

Страница 116 из 224 ПерваяПервая ... 112113114115116117118119120 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Ответов: 7
    Последнее: 06.04.2012, 21:37
  2. Машина Тьюринга для Z80
    от ZXMAK в разделе Эмуляторы
    Ответов: 4
    Последнее: 15.08.2011, 03:26
  3. Продвинутая Мелко Машина 1
    от Black_Cat в разделе Зарубежные компьютеры
    Ответов: 74
    Последнее: 03.03.2009, 09:05
  4. Что за машина такая??? Commodore 128...
    от ILoveSpeccy в разделе Commodore 16/64/128
    Ответов: 5
    Последнее: 31.10.2007, 10:25
  5. Java-машина
    от Error404 в разделе Программирование
    Ответов: 2
    Последнее: 15.01.2007, 15:11

Ваши права

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