Вход

Просмотр полной версии : Точная эмуляция эффекта снега



Spectramine
19.10.2022, 23:25
В начале этого года я обещал опубликовать детали точной эмуляции эффекта снега после публикации новой версии моего эмулятора. Ну, я передумал, публикация новой версии эмулятора планируется позже, а детали эмуляции эффекта снега я публикую сейчас, вместе с устаревшей версией Спектрамина, в которой впервые была реализована его правильная эмуляция (упд. - увы, не вполне правильная, как выяснилось), и моими тестами снега, являющиеся модификациями известного теста снега с настроечной таблицей.

Эффект снега аппаратно обусловлен интерференцией двух процессов - чтением данных экрана ULA-й и регенерацией памяти процессором. При определенных условиях в биты 6..0 адреса экраной памяти, выставленный ULA-й на шину адреса, подхватывается содержимое битов 6..0 регистра R. В процессе моих исследований выяснился ещё один эффект, определенный теми же причинами, я назвал его эффектом дублей - при определенных условиях интерференция чтения данных экрана ULA-й и регенерации памяти процессором приводит к тому, что ULA не может изменить адрес данных следующей полоски пикселей, и вместо неё снова читает предыдущую. Этот эффект отлично виден на тесте ULA128.

А теперь собственно результаты исследований - информация, необходимая для точной эмуляции снега.

Необходимое условие снега - на 16/48/128/+2 снег появляется, если регистр I содержит значение, которое, если оно взято старшим байтом адреса, указывает на адрес в медленной памяти. Для Спектрум 16/48 это адреса #4000..#7FFF, для 128/+2 это также адреса #C000..#FFFF, если в них сейчас впечатана страница "медленной памяти", для 128/+2 это страницы с нечетными номерами - 1,3,5,7 (не 0,2,4,6). Снега нет на черных амстрадовских машинах (+2A/+2B/+3/...), а также любых клонах Спектрума, кроме, возможно, тех, которые основаны на оригинальной ULA.

Дополнительно выяснилось, что на некоторых 128-х машинах снег приводит к зависанию/сбросу компьютера, а на некоторых - работает ок.

Теперь по фазам снега. Фаза означает, как ложится 4хтактный цикл выборки кода операции на 8тактный цикл вывода юлой 16 пикселей экрана.

Итак:
1) Если 4й такт цикла выборки КОП совпадает с 3м тактом 8тактного цикла вывода юлой 16пикселей, то это приводит к снегу - в адресах чтения пикселей1/атрибутов1 биты 6..0 заменяются на биты 6..0 регистра R (он должен быть уже увеличен в этом цикле выборки КОП). upd.:А страница памяти, из которой выбираются байты снега - это страница, на которую указывает регистр I (а не текущая экранная страница, как я думал раньше).

2) Если 4й такт цикла выборки КОП совпадает с 5м тактом 8тактного цикла вывода юлой 16 пикселей, то это приводит к эффекту дубля - данные пикселей2/атрибутов2 не будут прочитаны, и будет повторно выведена полоска экрана с данными пикселей1/атрибутов1.

3) Для остальных вариантов наложения цикла извлечения КОП на цикл ULA работа ULA штатная, без снега и дублей.

Таким образом, эффект снега проявляется только на нечетных столбцах (если считать с первого), а эффект дублей - только на четных столбцах.

https://i120.fastpic.org/big/2022/1020/a5/2cda1e92ef66a6bdf103bbb3fa57cca5.jpg (https://fastpic.org/view/120/2022/1020/2cda1e92ef66a6bdf103bbb3fa57cca5.jpg.html)

Выражаю благодарность PheeL (Александр Филянов) и balford (Brendon Alford), запускавшим по моей просьбе мои тесты на своих Спектрумах, и снимавшим результаты на видео. (А также NEO_SPECTRUMAN, TheMartian и Guesser за прояснение вопроса с участием битов регистра R в эффекте снега).

Версию моего эмулятора Спектрамин (1.05) с правильным снегом можно скачать здесь: https://files.fm/u/r7cymnn9m

Тесты снега, старый и мои модификации, и тест ULA128: 77971

(Тест snow.tap не вполне корректный - при определенных условиях бега столбцов на экране не будет, что обусловлено отсутствием в тесте выравнивания на начало фрейма. Попробуйте загрузить его с нажатой кннопкой Ctrl перед загрузкой. Быстрый бег столбцов на экране сразу после загрузки тестов вызван несовершенным кодом эмулятора для ускорения пауз между блоками ленты во время загрузки).

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

Видео моих тестов снега:

https://youtu.be/iLqb7hNiclM

Объяснение эффектов снега и дубля на аппаратном уровне от TheMartian с форума SpectrumComputing:

- Пиксели и атрибуты считываются пакетами. Сначала подается сигнал CAS, и задается адрес столбца (это биты 6-0 видеоадреса). Затем сигнал RAS подается дважды, устанавливая адрес строки (биты 13-7), который указывает сначала на байт пикселя, потом на его атрибут. Первый импульс RAS предназначен для байта пикселей, второй для атрибута, изменяются только биты 13-7.
- В циклах RFSH утверждается MREQ, а MREQ контролирует (является) CAS, и поскольку MREQ низок в первой половине T4, он отменяет конкуренцию, но продолжает удерживать биты 6-0 адреса.
- Таким образом, если это происходит в 3м такте пиксельного цикла, это первый пакет пикселей / атрибутов, CAS утверждает адрес обновления, получается снег.
- Если это происходит в 5м такте пиксельного цикла, CAS держится низким между первым и вторым пакетом, поэтому он сохраняет биты 6-0 видеоадреса для второго пакета, получается дубль.


Обновление: Недавно (04.2023) была открыта еще одна особенность эффекта снега. Когда регистр I указывает на медленную страницу памяти на 128й машине, страница, из которой извлекаются байты снега, зависит от: 1) на какую медленную страницу указывает регистр I; 2) какой экран активен.
В таблице показана необходимая страница памяти для выборки снежных байтов:


I>Страница Экран 0 (страница 5) Экран 1 (страница 7)
1 1 3
3 1 3
5 5 7
7 5 7


В этой таблице строки означают номер медленной страницы, на которую указывает регистр I, столбцы означают номер активного экрана, ячейки таблицы означают, с какой страницы извлекаются снежные байты. Спасибо TheMartian, IceKnight и Ричарду Чандлеру за участие.
Мой тест, исследующий эту особенность: 78702 В моем тесте регистр I указывает на верхнюю страницу памяти, цвет бордюра указывает номер текущей верхней страницы, цвет бумаги указывает на страницу активного экрана (экран 0 - 5-я страница - голубой, экран 1 - 7я страница - белый), цвет чернил указывает, с какой страницы выбираются снежные байты. Номер цвета означает номер страницы, т.е. синий => 1 => 1я страница памяти.
Видео с этим тестом от Ричарда Чандлера:
https://www.youtube.com/watch?v=qszntTHMATs


Рекомендация для игроделов: чтобы избежать снега, нужно следить, чтобы регистр I вектора прерывания не указывал на медленную память, а, соответственно, вектор прерываний IM 2 не находился в ней. Безопаснее и проще всего размещать вектор прерываний IM 2 в адресах $8000...$BFFF, дабы гарантированно быть в быстрой странице памяти (регистр I в пределах $80...$BF).

ZjoyKiLer
20.10.2022, 00:02
Большое спасибо за эту информацию. Вы проделали огромную работу.

Spectramine
20.10.2022, 11:42
TheMartian на форуме SpectrumComputing объяснила мои результаты на хардварном уровне:

- Pixels and attributes are read in "bursts". First the CAS signal is asserted, and the column address, (that's bits 6-0 of the video address), are set. Then the RAS signal is asserted twice, setting a row address (bits 13-7) which can point to a pixel byte and its attribute. The first RAS pulse is for the data byte, the second for the attribute, only bits 13-7 change.
- In RFSH cycles MREQ is asserted, and MREQ controls (is) CAS, and since MREQ is low in the first half of T4 it cancels contention, but it proceeds keeping fixed bits 6-0.
- So if it happens on this 3rd pixel cycle T-state, it's the first pixel/attribute burst, the CAS asserted the refresh address, so you get snow.
- If it happens on this 5th pixel cycle T-state, the CAS is kept low between the first and second bursts, so it keeps the bits 6-0 of the video address for the second burst. So, duplicate.


Я перевел её объяснение, как сумел:

- Пиксели и атрибуты считываются пакетами. Сначала подается сигнал CAS, и задается адрес столбца (это биты 6-0 видеоадреса). Затем сигнал RAS подается дважды, устанавливая адрес строки (биты 13-7), который указывает сначала на байт пикселя, потом на его атрибут. Первый импульс RAS предназначен для байта пикселей, второй для атрибута, изменяются только биты 13-7.
- В циклах RFSH утверждается MREQ, а MREQ контролирует (является) CAS, и поскольку MREQ низок в первой половине T4, он отменяет конкуренцию, но продолжает удерживать биты 6-0 адреса.
- Таким образом, если это происходит в 3м такте пиксельного цикла, это первый пакет пикселей / атрибутов, CAS утверждает адрес обновления, получается снег.
- Если это происходит в 5м такте пиксельного цикла, CAS держится низким между первым и вторым пакетом, поэтому он сохраняет биты 6-0 видеоадреса для второго пакета, получается дубль.

Если кто-то предложит более адекватный перевод, или исправит мой, буду рад.

zebest
20.10.2022, 12:08
Все это отлично, для эмулеписателей видимо понятно.
Но объясните для чайника, что не так в этом коде:


// Snow effect for ULA-48 only. ULA-128 has no snow bug.


if (mZX & ~m128 & ~nMREQ & ~nRFSH & contendAddr & snow_ena)


case(hc_next[3:0])
'h8,'hC: vaddr[6:0] <= addr[6:0]; // only RAS got replaced
endcase


case(hc_next[3:0])
'h9,'hD: bits <= vram_dout;
'hB,'hF: attr <= vram_dout;
endcase


if(hc_next[3] & hc_next[0])
ff_data <= vram_dout;
end


if (hc_next[3:0] == 1)
ff_data <= 255;
end
end

Эта конструпция работает почти хорошо, 5 из 7 тестов показывает ровно. Но видимо всё же чего то не хватает :(

breeze
20.10.2022, 12:16
Я конечно фиг его знает, но до этого «эффект снега» считался мусор в виде хаотичных пикселей, из-за медленной памяти на оригинальных машинах.

Сходу сейчас не найду (по ходу на форуме или чистка была или темы пропали), но ещё помнится VeleSoft сокрушался, что игра «Вера» снежит на оригинальных спектрумах и приводил в пример записи видео.

zebest
20.10.2022, 12:28
мусор в виде пикселей - тоже частный случай.

https://youtu.be/gXZPl87WCEo

Spectramine
20.10.2022, 13:53
Я конечно фиг его знает, но до этого «эффект снега» считался мусор в виде хаотичных пикселей, из-за медленной памяти на оригинальных машинах.
Ну так это он и есть. Тест с настроечной таблицей красиво оформил его в виде бега столбцов экрана, а я использовал этот тест как базу для своих тестов. А так в общем случае снег это мусор из хаотичных полосок, выдранных с других мест экранной области.

Чтобы его не было, нужно следить, чтобы вектор прерываний не попал в медленную память. Безопаснее и проще всего размещать его в адресах $8000...$BFFF, дабы гарантированно быть в быстрой странице памяти (регистр I в пределах $80...$BF).

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


Все это отлично, для эмулеписателей видимо понятно.
Но объясните для чайника, что не так в этом коде:
Увы, я этот код не понимаю. Возможно, объяснение TheMartian будет полезным.

goodboy
20.10.2022, 14:40
VeleSoft сокрушался, что игра «Вера» снежит на оригинальных спектрумах и приводил в пример записи видео.
он и ЧёрныйВорон показывал
http://velesoft.speccy.cz/other/blackraven-raining.png

ZX_NOVOSIB
20.10.2022, 14:46
он и ЧёрныйВорон показывал
Это ЧВ так на серых +2 работает??

Black Cat / Era CG
20.10.2022, 16:19
ФирмА -- дно. Эта знают даже дети.

ZX_NOVOSIB
20.10.2022, 17:43
ФирмА -- дно. Эта знают даже дети.
Почему? Черные норм, только звук пофиксить и всё.

goodboy
20.10.2022, 17:45
Черные норм
и много софта ты на них запускал ?

ZX_NOVOSIB
20.10.2022, 18:44
и много софта ты на них запускал ?
Много :D Даже ЧВ запускал ))

Titus
21.10.2022, 13:06
Интересен список софта, который использует этот самый эффект снега. И есть ли такой софт в принципе?
Если да, то залить ютубчики с оригиналов.

goodboy
21.10.2022, 14:03
Интересен список софта, который использует этот самый эффект снега. И есть ли такой софт в принципе?
как минимум игрушка vectron (столкновение со стеной и ещё какое-то событие) I=#50
https://spectrumcomputing.co.uk/entry/5548/ZX-Spectrum/Vectron

Conan
22.10.2022, 19:29
Интересен список софта, который использует этот самый эффект снега. И есть ли такой софт в принципе?Тут важен такой момент: есть игры где "снег" часть эффектов, а есть где побочный артефакт. Например, в игре Strider Walkthrough (https://spectrumcomputing.co.uk/entry/9428/ZX-Spectrum/Strider) (1989) "снег" явно не часть задуманных эффектов (https://youtu.be/HmTSbJG3vt0).

goodboy
22.10.2022, 19:49
побочный артефакт
в Strider`e I=#EE , а плейер музыки/эффектов на 1ой странице.
........
Tiertex/CoreDesign ещё часто в своих играх специально уменьшали громкость AY
(пытаясь хоть как-то `улучшить` ужасный вывод звука)

ZX_NOVOSIB
22.10.2022, 20:06
capcom/tiertex ещё часто в своих играх специально уменьшали громкость AY (пытаясь хоть как-то `улучшить` ужасный вывод звука)
хотя там делов-то - пару раз паяльником тыкнуть, и ребенок справится