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

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18

Тема: Точная эмуляция эффекта снега

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

    По умолчанию Точная эмуляция эффекта снега

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

    Эффект снега аппаратно обусловлен интерференцией двух процессов - чтением данных экрана 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 штатная, без снега и дублей.

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



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

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

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

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

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

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


    Объяснение эффектов снега и дубля на аппаратном уровне от 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 и Ричарду Чандлеру за участие.
    Мой тест, исследующий эту особенность: snow128n.zip В моем тесте регистр I указывает на верхнюю страницу памяти, цвет бордюра указывает номер текущей верхней страницы, цвет бумаги указывает на страницу активного экрана (экран 0 - 5-я страница - голубой, экран 1 - 7я страница - белый), цвет чернил указывает, с какой страницы выбираются снежные байты. Номер цвета означает номер страницы, т.е. синий => 1 => 1я страница памяти.
    Видео с этим тестом от Ричарда Чандлера:


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

  2. Эти 13 пользователя(ей) поблагодарили Spectramine за это полезное сообщение:

    Black Cat / Era CG (20.10.2022), CodeMaster (20.10.2022), daniel (21.10.2022), Doronetty (21.10.2022), NiKa (20.10.2022), SERGEY256 (22.10.2022), SoftLight (20.10.2022), Titus (20.10.2022), Uzix (20.10.2022), Xela (19.10.2022), zebest (20.10.2022), ZjoyKiLer (20.10.2022), [bETA]mEN (19.10.2022)

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

  4. #2
    Junior
    Регистрация
    13.10.2021
    Адрес
    Cádiz, Spain
    Сообщений
    2
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  5. Этот пользователь поблагодарил ZjoyKiLer за это полезное сообщение:

    Spectramine (20.10.2022)

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

    По умолчанию

    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 видеоадреса для второго пакета, получается дубль.

    Если кто-то предложит более адекватный перевод, или исправит мой, буду рад.
    Последний раз редактировалось Spectramine; 21.10.2022 в 11:39.

  7. Этот пользователь поблагодарил Spectramine за это полезное сообщение:

    ZjoyKiLer (20.10.2022)

  8. #4
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,668
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    320
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Все это отлично, для эмулеписателей видимо понятно.
    Но объясните для чайника, что не так в этом коде:
    Код:
    // 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 тестов показывает ровно. Но видимо всё же чего то не хватает
    Profi v3.2 -=- Speccy2010,r2

  9. Этот пользователь поблагодарил zebest за это полезное сообщение:

    ZjoyKiLer (20.10.2022)

  10. #5
    Guru Аватар для breeze
    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,691
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    30 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  11. Эти 2 пользователя(ей) поблагодарили breeze за это полезное сообщение:

    Dexus (20.10.2022), Titus (20.10.2022)

  12. #6
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,668
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    320
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    мусор в виде пикселей - тоже частный случай.
    Profi v3.2 -=- Speccy2010,r2

  13. Этот пользователь поблагодарил zebest за это полезное сообщение:

    ZjoyKiLer (20.10.2022)

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

    По умолчанию

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

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

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

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

  15. Этот пользователь поблагодарил Spectramine за это полезное сообщение:

    ZjoyKiLer (20.10.2022)

  16. #8
    Guru
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    13,767
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    1,173
    Поблагодарили
    770 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  17. Этот пользователь поблагодарил goodboy за это полезное сообщение:

    ZjoyKiLer (20.10.2022)

  18. #9
    Guru Аватар для ZX_NOVOSIB
    Регистрация
    24.12.2006
    Адрес
    р.п. Маслянино, Новосибирская обл.
    Сообщений
    5,547
    Спасибо Благодарностей отдано 
    233
    Спасибо Благодарностей получено 
    258
    Поблагодарили
    178 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от goodboy Посмотреть сообщение
    он и ЧёрныйВорон показывал
    Это ЧВ так на серых +2 работает??
    Куплю корпус и материнку от Spectrum +2/+3

  19. #10
    Сибирский антропоморфн Аватар для Black Cat / Era CG
    Регистрация
    06.05.2010
    Адрес
    Бердск, НСО
    Сообщений
    4,552
    Спасибо Благодарностей отдано 
    922
    Спасибо Благодарностей получено 
    870
    Поблагодарили
    634 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ФирмА -- дно. Эта знают даже дети.
    Личка заполнена! И чистить я ее не буду! Пользуйтесь адекватными средствами связи! Спасибо.

    Seamos realistas y hagamos lo imposible!

    Ernesto Che Guevara
    Переехал сюда: SteinBlume (ex ATM CP/M Explorer)
    http://era-cg.su

    Скрытый текст

    Speccy2010 r2 (Спасибо m.d. & xlat),
    Sinclair ZX Spectrum + (Спасибо stepmotor),
    ZX Evolution rev.C + 5'25 FDD Epson SD-700AA + NedoPC PAL-Coder (Спасибо m.d. & xlat)
    [свернуть]

Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Похожие темы

  1. СРОЧНО НАДО 2 ЭФФЕКТА В ТРАШМО!
    от AAA в разделе Демо
    Ответов: 3
    Последнее: 22.07.2014, 14:19
  2. Эмуляция AY/YM
    от mungo в разделе Эмуляторы
    Ответов: 18
    Последнее: 22.03.2013, 06:14
  3. Профик (точная идентификация)
    от ZXSlaver в разделе Profi
    Ответов: 4
    Последнее: 19.04.2010, 21:57
  4. Создание таблички для эффекта
    от TmK в разделе Программирование
    Ответов: 2
    Последнее: 25.05.2006, 12:45

Ваши права

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