Пытаюсь найти RZX файл прохождения для игры Robin of the Wood: http://www.worldofspectrum.org/infos...cgi?id=0004177
Но ничего не нашёл. Может у кого-то есть?
Пытаюсь найти 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.
А я тест не под отладчиком гонял, а напрямую.На счёт спектакулятора, у него отладчик глючный. Его поведение во время прерываний разное, зависит от того выполняется код по шагам или запущена эмуляция. Поэтому под отладчиком в спектакуляторе можно много магических эффектов обнаружить
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Флаг 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
Так, да не так. При определенных условиях, несмотря на то, что во время команды LD A,R приходит сигнал INT прерывания (т.к. после неё идет вход в обработчик), во флаг P/V заносится 1 (на Спектакуляторе и ZXMAK2). Посмотрите код теста в этом сообщении, он несложный, и скажите, должен ли тест выходить в бейсик, если ошибка процессора эмулируется правильно. А тест выходит в бейсик - на ZXMAK2 и Спектакуляторе. А на SpecEmu, Fuse, Unreal, и на реальных процессорах - тест висит, как положено.
Последний раз редактировалось Spectramine; 10.07.2018 в 18:56.
хм... такое может быть только если на последнем такте LD A,R прерывания нет. А на следующем такте уже есть.
Впринципе тут есть ньюанс, на реальном Z80 прерывание проверяется на последнем такте инструкции, а начинает обрабатываться на следующем такте. А в ZXMAK2 прерывание проверяется перед началом цикла M1. Поэтому эмулятор сразу обрабатывает прерывание, а реальный процессор в такой ситуации по инерции выполнит еще одну инструкцию. Которая будет уже при INT=1. Если это действительно так на реальном железе, то надо фиксить.
Вообще неприятный баг, его исправление может сдвинуть на 1 такт тайминги. Поэтому если его фиксить, то надо всё перепроверять.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
то есть этот Amaurote НЕ должен воспроизводиться до конца, если ei/di задерживают прерывание как положено?
а есть примеры, где такой сбой раньше должен произойти?
только это не то чтобы "баг формата", а скорее эмуляторов, неверно его толкующих
кстати, в spin (а может, и еще где) еще глюк есть - для кадра без инов повторяется последняя запись
например, в меню rick1 два halt подряд и нет опроса в обработчике, но вместо 8,0,8,0 там 8,8,8,8...
так что, чтобы не городить проверки, недочитанные ины достаточно тупо игнорировать
и хотя так можно пропустить другую ошибку, всё равно рассинхрона после недолго ждать
- - - Добавлено - - -
кстати, в эмуле inkspector2 есть инструмент быстрой проверки rzx
Прихожу без разрешения, сею смерть и разрушение...
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)