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

User Tag List

Страница 5 из 20 ПерваяПервая 123456789 ... ПоследняяПоследняя
Показано с 41 по 50 из 195

Тема: Тестирование эмуляторов

  1. #41
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,643
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Всплыли интересные вещи относительно точности эмуляции. Как известно, импульс маскируемого прерывания длится некоторое фиксированное время, за которое может произойти подтверждение прерывания и вход в процедуру его обработки. Длительность этого импульса в тактах z80 полагается эталонно равной 32. Так вот, существует программа тестирования эмуляторов minfo.tap, которая показывает длину фрейма, длину импульса прерывания и признак правильности эмуляции команды EI (об этом далее). Выяснилось, что эмулятор, который я считал эталонным, Spectaculator, некорректно эмулирует импульс прерывания. Программа показывает длину импульса прерывания = 0, что скорее всего означает, что эмуль считает возможным подтверждение прерывания строго после команды z80, на которой завершается фрейм. Правильно эмулируют импульс прерывания Fuse, ZXMAK2 и SpecEmu (возможно, и другие). ZXSPin определяет длину импульса прерывания = 37 тактам, а EmuzWin этот тест проваливает.

    Относительно команды EI выяснилось, что она разрешает прерывания не сразу после своего выполнения, а после выполнения следующей за ней команды (чтобы предотвратить закольцовывание входа в процедуру прерывания и дать выполниться команде RET). Некоторые эмули этот факт игнорируют. Кстати, это означает, что команда EI запрещает прерывание сразу после себя. Таким образом, если импульс прерывания придёт во время выполнения цепочки из команд EI, он будет проигнорирован.





    Следующая информация будет интересна скорее разработчикам эмуляторов, так как касается поддержки формата RZX. Его спецификация несколько размыто определяет поведение эмулятора в конце проигрывания rzx-фрейма. Базовый алгоритм по завершению фрейма имеет блок "Генерировать прерывание", а как вы его интерпретируете, ваше личное дело.

    Большинство эмулей интерпретируют его так: если на момент окончания проигрывания rzx-фрейма IFF1=1, эмулируется подтверждение прерывания. Однако, таким образом игнорируются некоторые особые случаи :

    1) последней командой фрейма может быть команда EI, соответственно, прерывания будут запрещены после её выполнения;

    2) команда EI может быть предпоследней командой фрейма, а последняя будет на границе окончания импульса прерывания, соответственно, несмотря на то, что IFF1=1 (прерывания разрешены), и после последней команды могло бы быть подтверждение прерывания, его не будет, так как импульс прерывания на ней завершён. А эмуль, проигрывающий rzx-файл, посчитает, что вход в прерывание есть, сэмулирует его, и это приведёт к рассинхронизации дальнейшего проигрывания rzx-файла.

    3) самый редкий, и самый сложный случай. как известно, длина команд с префиксами DD/FD может быть произвольной (повторные префиксы), и во время выполнения такой длинной команды прерывание не может произойти. Импульс прерывания может прийти во время выполнения такой команды, и закончиться за это время, а прерывания до неё - разрешены. Очень сложно корректно оформить конец rzx фрейма при записи rzx файла в такой ситуации. Единственным возможным вариантом, который видится мне, будет разрыв выполнения команды по приходу импульса прерывания, причём эмуль-проигрыватель rzx должен корректно такую ситуацию обработать.

    Основным требованием к эмулятору-проигрывателю rzx-файла будет в таких случаях то, что эмуль должен учитывать не только состояние триггера IFF1 в конце rzx-фрейма, но и то, не запрещены ли прерывания, несмотря на то, что IFF1=1 (из-за EI или префиксов DD/FD). Увы, здесь поведение известных эмуляторов оставляет желать лучшего. Spectaculator, SpecEmu, ZXSpin, и EmuZWin, например, в случае, если фрейм заканчивается командой EI, делают вход в процедуру обработки прерывания, что приводит к потере синхронизации rzx. А вот Fuse и ZXMAK2 ведут себя корректно - так как прерывания сразу после EI запрещены, если фрейм заканчивается этой командой, они считают, что подтверждения прерывания не было.

    Подытожим, как должен вести себя эмулятор для корректной обработки вышеприведённых особых случаев:

    а) если на момент окончания фрейма выполняется команда с цепочкой префиксов DD/FD, эмуль должен корректно обработать разрыв её выполнения (считать все префиксы, кроме последнего, чем-то вроде отдельных команд NOP, запрещающих прерывания сразу после себя);
    б) соответственно, если фрейм rzx заканчивается командой EI или префиксом DD/FD, эмуль должен считать, что подтверждения прерывания после фрейма нет, независимо от состояния IFF1.

    Особый случай 2) при таком раскладе можно будет не слишком сложно обработать при записи RZX файла, завершив rzx фрейм не на команде после команды EI, а на самой этой команде EI.

    Прилагаю архив с программой minfo.tap и rzx-файлом, на котором спотыкаются Spectaculator, ZXSpin, SpecEmu, и EmuZWin, но Fuse и ZXMAK2 успешно его проигрывают. Игра Jumping Jack в этом плане - находка для тестирования поддержки rzx файлов. Во время её выполнения прерывания в основном запрещены, но звук генерируется процедурой ПЗУ BEEPER, которая разрешает прерывания перед выходом из неё. Сразу после её вызова прерывания запрещаются, но - этого достаточно, чтобы время от времени прерывание срабатывало (после выполнения команды RET процедуры BEEPER перед командой DI в коде игры), и появлялась неоднозначность при записи/чтении rzx-файлов.
    ints_tests.zip
    Последний раз редактировалось Spectramine; 18.01.2016 в 01:48.

  2. #42
    Guru
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    13,774
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    1,179
    Поблагодарили
    775 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от weiv Посмотреть сообщение
    Относительно команды EI выяснилось, что она разрешает прерывания не сразу после своего выполнения, а после выполнения следующей за ней команды
    почему тогда висит эта последовательность ?
    EI
    DI
    HALT

  3. #43
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,847
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    167 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Триггер разрешения прерывания устанавливается сразу, однако после команды EI проверка не производится, процессор сразу переходит к чтению следующей команды.

  4. #44
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,643
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от goodboy Посмотреть сообщение
    почему тогда висит эта последовательность ?
    EI
    DI
    HALT
    Команда DI запрещает прерывания независимо от того, какие команды выполнялись перед ней. EI не отрабатывает после следующей за нею команды, она не даёт произойти прерыванию сразу после себя, но устанавливает флаги IFF1/IFF2 сразу. DI их сбрасывает, чего достаточно, чтобы запретить прерывания.
    Последний раз редактировалось Spectramine; 18.01.2016 в 14:18.

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

    По умолчанию

    как известно, длина команд с префиксами DD/FD может быть произвольной (повторные префиксы), и во время выполнения такой длинной команды прерывание не может произойти
    шта!!! чота никогда не задумывался об этом

    в голове сразу нарисовались всякие выравнивалке на первый такт (которые могли бы подстроиться не только под пятнагон если бы и там были такие же глюки)
    и мерялки длины инта

    хотя с таким же успехом можно юзать
    di
    любая задержка
    ei


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

    а что если залить все 64К сплошным DD/FD??????
    жаль у мну нет реала на котором можно было бы подобное проверить...

    да и как тогда определить что прерывание все таки сработало\не сработало без осцилографа...
    Последний раз редактировалось NEO SPECTRUMAN; 20.01.2016 в 23:59.

  6. #46
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,643
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    шта!!! чота никогда не задумывался об этом
    Это вроде бы не новость, я уже давно встречал упоминания об именно таком поведении Z80. Вот тред, посвящённый этой теме: http://zx-pk.ru/showthread.php?t=6978


    А вот что говорит авторитетный источник:
    При получении префиксов DD и FD нужно проверить следующий байт:
    Если это DD, FD или ED, то префикс нужно проигнорировать, выполнив команду NONI*— 4 такта, прерывания не проверяются. Эффект такого поведения состоит в том, что при наличии длинной цепочки префиксов прерывание (даже NMI) сможет сработать только после ее завершения (точнее, после первой команды, следующей за цепочкой); (c) http://www.emuverse.ru/wiki/Zilog_Z8...B0%D0%BD%D0%B4

    Интереснее всего то, что, судя по всему, так же ведут себя цепочки команд EI, а так же цепочки из префиксов DD/FD и команд EI.
    Последний раз редактировалось Spectramine; 19.01.2016 в 01:47.

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

  8. #47
    Veteran Аватар для ZXMAK
    Регистрация
    30.01.2006
    Адрес
    Харьков
    Сообщений
    1,406
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    20
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    насколько помню, захват прерывания происходит на последнем такте инструкции. У EI и префиксов на последнем такте захвата прерывания нет
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  9. #48
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,566
    Спасибо Благодарностей отдано 
    1,227
    Спасибо Благодарностей получено 
    1,778
    Поблагодарили
    686 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    а что если залить все 64К сплошным DD/FD??????
    Значит если прерывание произойдет в середине этой цепочки, то оно не сработает, т.к. сигнал запроса прерывания снимется раньше, чем закончится цепочка.

    Я даже так делал шуточную защиту от кнопки Magic. Вся память DD, а в конце JP на начало. Люди нажимали Magic, а он не работает)

  10. #49
    Master Аватар для NiKa
    Регистрация
    10.02.2015
    Адрес
    г. Екатеринбург
    Сообщений
    789
    Спасибо Благодарностей отдано 
    45
    Спасибо Благодарностей получено 
    32
    Поблагодарили
    27 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от weiv Посмотреть сообщение
    По поводу Shock Megademo, которая всплыла в другом треде. На WOS лежит tap-версия, которая не работает (виснет или сбрасывается после первого блока демо) на большинстве эмуляторов, включая Spectaculator, ZXMAK2, SpecEmu, ZXSpin. Но - работает на Fuse и EmuZWin. Хороший тест на совместимость) Осталось только выяснить, в чём дело.
    А где есть работающая версия Shock Megademo?

    Моё железо

    ZX Spectrum 48K issue 2/3/4A/4B/4S/6A
    ZX Spectrum +2
    ZX Spectrum +3
    Harlequin 48K
    Harlequin 128K
    Karabas-128
    [свернуть]

  11. #50
    R.I.P. Аватар для Rindex
    Регистрация
    10.11.2007
    Адрес
    Khimki
    Сообщений
    18,222
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    15
    Поблагодарили
    14 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NiKa Посмотреть сообщение
    А где есть работающая версия Shock Megademo?
    Ну смотри, и выбирай. Там даже под Пентагон версия есть.

    http://zxaaa.untergrund.net/view_dem...mo&title=Title
    Может, мы обидели кого-то зря,
    Сбросив пару лишних мегатонн,
    И горит зелёным пламенем земля,
    Там, где был когда-то Пентагон!..

    Profi-576 v3.2/AY-3-8912A GI/FDD-5.25'

Страница 5 из 20 ПерваяПервая 123456789 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Исходники эмуляторов Z80 и WinZ80
    от Alexandr Medvedev в разделе Эмуляторы
    Ответов: 7
    Последнее: 24.06.2023, 19:06
  2. Особенности эмуляторов Корвета
    от esl в разделе Корвет
    Ответов: 0
    Последнее: 30.03.2014, 23:46
  3. Посоветуйте джойстик PC для эмуляторов ZX
    от Andrew771 в разделе Устройства ввода
    Ответов: 11
    Последнее: 18.01.2012, 15:30
  4. пожелания создателям эмуляторов
    от проф в разделе Эмуляторы
    Ответов: 24
    Последнее: 09.02.2007, 01:31
  5. 1000 эмуляторов
    от Wladimir Bulchukey (500:95/462) в разделе Эмуляторы
    Ответов: 0
    Последнее: 16.03.2006, 16:35

Ваши права

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