С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Версия эмулятора указывается в файле в числовых полях, сразу за названием эмулятора.
Благодаря вашей базе выявил ещё пару нюансов, касающихся плейбека RZX. Один простой - для корректного плейбека некоторых RZX требуется в точности тот же образ ПЗУ, который использовался при записи RZX. Если ПЗУ моделей спектрума у большинства эмулей одинаковые, то с TRDOS возникают проблемы - в разных эмулях используется разные ПЗУ TRDOS (даже с одним и тем же номером версии), что приводит к краху плейбека некоторых RZX на некоторых эмулях. Я бы рекомендовал эмулеписателям использовать образ ПЗУ TRDOS, поставляемый с SpecEmu - он совпадает с Spectaculator-ским.
Второй посложнее, он касается недокументированной особенности команд LD A,I/LD A,R - во время её выполнения в момент прихода импульса прерывания в флаг PV записывается не состояние триггера IFF1, а ноль, т.к. запрос на прерывание начинает обрабатываться на последнем такте команды. Все эмуляторы, кроме Spectaculator, при плейбеке RZX этот факт игнорируют. А сам Spectaculator почему-то в большинстве случаев обрабатывает эти команды правильно, но иногда, несмотря на заход в обработчик прерывания после выполнения команды LD A,R, в флаг PV таки копируется триггер IFF2. С чем это связано, я не знаю, но из-за этого файл beastiefeastie.rzx в принципе не может быть правильно проигран - он нарушает и нативную, и ненативную логику выполнения команды LD A,R во время плейбека RZX. Однако, тем не менее, в Spectaculator-е он проигрывается до концаТо есть, либо в Spectaculator-е есть баг, либо он знает о ещё какой-то особенности выполнения команды LD A,R, из-за которой она иногда во время импульса прерывания копирует в флаг PV триггер IFF2. Я этот вопрос выяснить до конца не смог. Скорее всего баг, но какова его логика, непонятно.ldartst2.zip
Последний раз редактировалось Spectramine; 08.07.2018 в 16:47.
Для RZX всё не так критично, он специально сделан так, чтобы отвязаться хотя бы от таймингов команд/INT/длины фрейма. Проблемы могут быть, только если эмуль где-то криво эмулирует z80, ну или из-за багов реализации. А так в принципе большинство эмулей Спека большинство RZX проигрывает корректно.
Кстати, я вроде бы встречал RZX, записанные EmuzWin, которые в самом EmuzWin-е сбоят. То есть хороший проигрыватель RZX не гарантирует хорошей записи RZX, и наоборот, это две разные процедуры.
Пытаюсь найти RZX файл прохождения для игры Robin of the Wood: http://www.worldofspectrum.org/infos...cgi?id=0004177
Но ничего не нашёл. Может у кого-то есть?
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
у меня есть, держите.
https://yadi.sk/d/5mOlGrZD3YujEH
Поднятая тема напомнила мне о нерешенном вопросе с beastiefeastie.rzx. Новые размышления привели меня к мысли, что либо Spectaculator не вполне правильно эмулирует команды LD A,R/LD A,I в части эмуляции ошибки z80 копирования IFF2 во флаг P/V во время прихода импульса прерывания (что более вероятно), либо процессор обрабатывает эту команду по какому-то сложному алгоритму (что менее вероятно). Я написал тест: ldartst2.zip, который проверяет это дело. И выяснилось, что по данному вопросу мнения расходятся у половины самых ходовых эмуляторов.
Spectaculator, ZX Spin, ZXMAK2, EmuzWin выходят в бейсик и выдают "LD A,R ERROR!".
Fuse, SpecEmu и Unreal виснут - что является, как мне кажется, правильным поведением, совпадающим с работой реального NMOS Z80. На CMOS Z80 тест должен сбрасываться - на нем после команды LD A,R прерывание вообще невозможно.
Тест настроен для работы на фирменных моделях и Пентагоне (на Скорпионах и других клонах запускаться будет, но толку от него мало - на них не будет работать использованная в тесте схема сдвига времени начала команд в кадре на 1 такт).
Если кто-то заинтересуется и проверит тест на реале, буду рад.
- - - Добавлено - - -
Исходник теста
Скрытый текст
org #FFD0
DI
LD HL,#8000
LD BC,8000
L1 LD (HL),#ED
INC HL
LD (HL),#5F
INC HL
DEC BC
LD A,B ; заполняем память с адреса #8000 8000-ми командами LD A,R
OR c
JR NZ,L1
LD (HL),#C7 ; сброс для CMOS процессоров
LD HL,#FFFF
LD (#BEFF),HL
LD A,#BE
LD I,A
IM 2
EI
JP #8000
org #FFF4
LD A,(HL)
POP HL ; снимаем адрес возврата
EI
JP PO,#8000 ; флаг PV=0, ожидаемое поведение из-за ошибки Z80
; 19+12+7+10+4+10=62 (7*9-1) тактов на обработку прерывания
INC BC
IM 1
RET ; возврат в бейсик, если на момент входа в прерывание PF=1
org #FFFF
JR #FFF4[свернуть]
Последний раз редактировалось Spectramine; 09.07.2018 в 14:02.
Благодаря daniel, запустившему тест на своих реалах, подтвердилось, что Спектакулятор и ZXMAK2 неправильно эмулируют команды LD A,I/LD A,R - хотя они эмулируют ошибку этой команды, из-за которой во флаг P/V во время прихода импульса прерывания во время команды заносится 0 на NMOS-процессорах, (в остальное время во флаг P/V заносится состояние маскируемых прерываний - 0-выключены,1 - включены), НО - не всегда, иногда на них во флаг P/V заносится 1, а после команды происходит прерывание.
Это уже второе узкое место эмуляции Z80, влияющее на запись RZX. Первое - малоизвестный факт, что сразу после команды EI и префиксов команд прерывание произойти не может.
- - - Добавлено - - -
Так что вопрос с bestiefestie.rzx снят - он был записан с неправильной эмуляцией Z80. Обойти это при плейбеке можно, примерно так же, как и с прерыванием после EI на некоторых RZX, записанных на старом ZXSpin-е.
Последний раз редактировалось Spectramine; 09.07.2018 в 14:02.
а в чём неправильность? LD A,I/R читает IFF2 (не путать с IFF1), это вроде даже в документации прописано.
Нужно это для того, чтобы в обработчике NMI можно было узнать состояние IFF1 до прерывания.
Это нужно, т.к. NMI срабатывает независимо от того - разрешены прерывания или нет.
Таким образом NMI обработчик имеет возможность корректно восстановить состояние прерываний после завершения своей работы.
Глюк процессора в том, что IFF2 не всегда читается, в частности он не читается когда INT активен и IFF1=1 (прерывания разрешены).
По крайней мере в ZXMAK2 такое условие эмуляции. Откуда это бралось уже не помню.
Был какой-то софт, который без эмуляции этой фишки не работал.
Вот код эмуляции этого флага в ZXMAK2:
На счёт спектакулятора, у него отладчик глючный. Его поведение во время прерываний разное, зависит от того выполняется код по шагам или запущена эмуляция. Поэтому под отладчиком в спектакуляторе можно много магических эффектов обнаружитьКод:if (!(INT && IFF1) && IFF2) { regs.F |= CpuFlags.P; }![]()
Последний раз редактировалось ZXMAK; 10.07.2018 в 13:21.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Глюк процессора в том, что, если во время выполнения команды LD A,I/R активен INT, а прерывания разрешены, во флаг P/V заносится 0 вместо 1. Другими словами - если после команды LD A,I/R идет подтверждение маскируемого прерывания, во флаге P/V после команды LD A,I/R _всегда_ должен быть 0 на NMOS процессоре Z80.
А глюк ZXMAK2 и Spectaculator в том, что иногда при этих условиях во флаг P/V заносится 1. Можете запустить мой тест на на них и убедиться, а также запустить его на Fuse, SpecEmu и Unreal. При правильной эмуляции тест должен висеть, а при ошибке эмуляции - выходит в бейсик с сообщением "LD A,R ERROR!".
Проверьте граничные условия в коде эмулятора, связанные с сигналом INT.
А я тест не под отладчиком гонял, а напрямую.На счёт спектакулятора, у него отладчик глючный. Его поведение во время прерываний разное, зависит от того выполняется код по шагам или запущена эмуляция. Поэтому под отладчиком в спектакуляторе можно много магических эффектов обнаружить![]()
Флаг P устанавливается в двух случаях:
- если IFF2=1 и IFF1=0 (прерывания были разрешены, но запрещены входом в обработчик NMI)
- если IFF2=1 и INT=0 (прерывания разрешены и нет сигнала прерывания)
В остальных случаях флаг P устанавливается в 0.
по сути именно то что вы и сказали. Именно так работает ZXMAK2
Последний раз редактировалось ZXMAK; 10.07.2018 в 17:11.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)