Exact emulation of the Snow effect

At the beginning of this year I promised to publish details of the exact snow effect emulation after publication of a new version of my emulator. Well, I changed my mind, the publication of new version of the emulator is planned later, and the details of the exact snow effect emulation I publish now, along with the update of my emulator Spectramine (1.05), in which the correct emulation of the snow effect was first implemented, and my snow effect tests, which are modifications of the snow test with a tuning table.

The snow effect is caused by the interference of two processes — reading screen data by the ULA and memory regeneration by the processor. Under certain conditions, the bits 6..0 of the register R are picked up in the bits 6..0 of the screen memory address set by the ULA on the address bus. In the course of my research, another effect was revealed, determined by the same reasons. I called it the double effect — under certain conditions, the interference of reading ULA screen data and memory regeneration leads to the fact that ULA cannot read the data of the next bar of pixels, and instead displays a bar of pixels with the data read earlier. This effect is perfectly visible on the ULA128 test written by azesmbog/zebest.

And now the actual results of the research — the necessary information for exact emulation of the snow effect.

A prerequisite for the snow effect: at 16/48/128/+2 machines snow appears if register I contains a value that, if it taken by the high byte of address, points to an address in the slow memory. For Spectrum 16/48 these are addresses #4000..#7FFF, for 128/+2 these are also addresses #C000… #FFFF, if a slow memory page is paged there, for 128/+2 these are pages with odd numbers — 1,3,5,7 (not 0,2,4,6).

There is no snow/double effects on Amstrad's black machines (+2A/+2B/+3/...) and on any ZX Spectrum clones except maybe those that based on original ULA.

Additionally, it turned out that on some 128 machines the snow effect leads to a hang / reset of the computer, and on some — it works ok.

Now about the snow phases. Snow phase means how a 4-tacts operation code fetching cycle overlaps an 8-tacts screen drawing cycle by ULA.

So:
1) If the 4th cycle of the operation code fetching cycle coincides with the 3th cycle of the 8-tacts output cycle of 16 pixels, this leads to snow effect — in the pixels1/attributes1 addresses the bit 6..0 of address is replaced with the current contents of the bits 6..0 of register R (it should already be increased in this operation code fetching cycle). upd.: And page from where the snow bytes are fetched is that the register I pointed to.

2) If the 4th cycle of the operation code fetching cycle coincides with the 5th cycle of the 8-tacts output cycle of 16 pixels, then this leads to a double effect — the pixels2/attributes2 data will not be read, and the screen bar with pixels1/attributes1 data will be re-displayed.

3) For the remaining variants of overlapping the operation code fetching cycle with the ULA screen drawing cycle, the ULA works normal, without snow and duplicate.



I express my gratitude to Pheel (Alexander Filyanov) and balford (Brendon Alford), who, at my request, launched my tests on their machines, and shot the results in the videos. Also to NEO_SPECTRUMAN, TheMartian and Guesser, for help with a question of register R's participation in the snow effect.

My emulator Spectramine (1.05) with correct snow can be downloaded here: files.fm/u/r7cymnn9m

Snow tests, the old one and my modifications of it, and ULA128 test:
zx-pk.ru/attachment.php?attachmentid=77971&d=1666205428

Sorry for long wait and bad english)

(Snow.tap test is not entirely correct — under certain conditions there will be no running columns on the screen, which is due to the absence of alignment to the beginning of the frame. Try to load it with pressed Ctrl. Very fast running columns on the screen immediately after loading the tests are caused by an imperfect pause acceleration code between the tape blocks during loading).

TheMartian's addition:
— Pixels and attributes are read in «bursts». First the RAS signal is asserted, and the raw address, (that's bits 6-0 of the video address), are set. Then the CAS signal is asserted twice, setting a column address (bits 13-7) which can point to a pixel byte and its attribute. The first CAS 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) RAS, 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 RAS asserted the refresh address, so you get snow.
— If it happens on this 5th pixel cycle T-state, the RAS 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.
Also: www.zxdesign.info/dynamicRam.shtml

Update: Recently (04.2023) yet another snow peculiarity was open. When register I points to slow memory page on 128 machine, the page from where the snow bytes are fetched depends from: 1) on which slow page register I points; 2) what screen is active.
The table shows needed memory page for snow bytes fetching:
I-pointed page Screen 0(page 5) Screen 1(page 7)
1 1 3
3 1 3
5 5 7
7 5 7
In this table rows mean slow page number on which register I points to, columns mean active screen number, table cells mean from what page the snow bytes are fetched. Thanks to TheMartian, IceKnight and Richard Chandler for participation.

Recommendation for game writers — to avoid the snow effect you need to make sure that the register I does not point to slow memory, and the interrupt vector does not get into the slow memory. It is safer and easiest to place it in addresses $8000… $BFFF (register I within $80… $BF) — on machines with snow it's always fast memory page.

Диалектика разрядности

На размышления по теме меня сподвигла статья aa-dav под заголовком 8/16-битный компьютер мечты (процессор Simpleton). Статья, без дураков, замечательная. Понравилась своим рассудительным изложением материала. Мой особенный интерес вызвали мысли автора, оказавшись близкими по духу. Множество раз размышляя на подобную тему “с карандашом в руках” очень похоже изводил себя вопросами озвученными автором. Процесс созидания чего бы то ни было итеративный, наблюдения и заключения меняются по времени, в силу приобретения дополнительного опыта и знаний. Иногда достаточно попробовать сложившуюся на бумаге архитектуру “на зуб” написав в ней десяток другой строк кода и, казалось бы, с железобетонных утверждений приходится слезать. Неизменным всегда остается то, что любой вопрос, касающийся архитектуры, содержит в себе массу противоречий. По большому счету выбор решения в итоге заключается в том какие же из них являются меньшим злом. Так и в случае разрядности появляется масса вопросов и проблем. Для меня в итоге, при решении вопросов разрядности в разработке архитектуры (архитектуры мечты), потеря байта как единицы оперативной информации, оказалась болезненной.
Читать дальше →

Программирование для Famicom/NES/Денди в Nesicide+ca65: маппер MMC3 - HBlank+скроллинг (10) КОНЕЦ

Это будет последний урок в этой серии описывающий на практике последнюю технику которую нужно знать, чтобы написать крутую игру на Famicom/NES/Денди…
Ну хорошо, если призадуматься, то нюансов в программировании на денди есть еще порядком. Как организовать «бесконечный» скроллинг прокручивая две экранных области друг за другом и обновляя вновь появляющиеся с краёв тайлы в VRAM по ходу движения… Как организовать тайлы в метатайлы 2x2, а то и 4x4 для более краткого описания карт и удобного обновления видеопамяти (ведь атрибуты палитр назначаются сразу блоку тайлов 2x2 в экранной области, а один байт атрибутов покрывает 4x4 тайла)… Как воспроизводить оцифрованные DCPM звуки с помощью FamiTone2…
Впрочем, имхо, материалов и примеров изложенных в этих статьях хватит чтобы сообразить как это всё делается самостоятельно. Да и должно же быть какое то пространство и для собственного творчества. Здесь же я поставлю точку в этом цикле и, возможно, займусь какой-нибудь уже полноценной игрой исходники которой выложу, но это будет другая история.

Читать дальше →

Музей Яндекса продолжает серию вебинаров о творчестве на ретрокомпьютерах (выпуск 5)

На прошлой неделе мы говорили о программировании визуальных эффектов: узнали как устроен алгоритм горящего пламени, реализовали его в программном коде и на примере этого кода познакомились с основами оптимизации. Запись вебинара можно посмотреть здесь.

Следующий, пятый по счёту вебинар будет посвящен маппингу и визуальным эффектам на его основе. Вебинар проведут Олег Сенин (bfox ) и Александр Солодков (TmK ) — программисты, художники, музыканты на различных ретроплатформах.

Ждём всех 14 мая в 19:00 по московскому времени. Участие бесплатное, пожалуйста, зарегистрируйтесь заранее по ссылке. Трансляцию вебинара также можно будет посмотреть на youtube.

Практика

А чтобы материал не остался теорией, мы приглашаем проверить свои силы, приняв участие в конкурсной программе фестиваля «Демодуляция 2020», который состоится осенью. Мы понимаем, что для создания чего-то впечатляющего нужно время, поэтому приём работ уже открыт. Более подробно о правилах конкурсов можно прочитать на нашем сайте.

Программирование для Famicom/NES/Денди в Nesicide+ca65: маппер MMC3 - страницы (8)

Итак на этот момент нам подвластны 32Кб кода/данных в PRG ROM и 8Кб графики в CHR ROM. Но когда этого перестало хватать в ход пошли мапперы — микросхемы встроенные в картриджи переключающие банки памяти. О них у меня есть отдельная обзорная статья. Одним из крайне популярных мапперов был MMC3 и кроме собственной популярности на его базе было создано огромное число производных чипов. В этой статье мы научимся использовать его для увеличения доступного для игры ROM картриджа.

Читать дальше →

Ready Player One - Joust

После прочтения Ready Player One возникла идея просмотреть основные игры, участвующие в сюжете. Первая игра в книге была —

Вот как главный герой встречается с этой игрой в книге:
… Он взмахнул костлявой рукой, и трон исчез в яркой вспышке с характерным звуком (явно взятым из старого мультсериала «Супердрузья»). На его месте появился древний игровой автомат. Из контрольной панели торчали два джойстика — желтый и синий. Я не смог сдержать улыбки. На козырьке над экраном значилась яркая надпись: «Joust, Williams Electronics, 1982».

Читать дальше →
  • avatar
  • [просмотров: 2845]
  • 3
  • +8

Знаешь, ты мне не нравишься.

Дело в том, что ты напыщенный мудак.

Ты знаешь лучше — как должно быть.
Ты знаешь лучше всех — как должно быть написано/нарисовано/должно звучать, как правильно писать код/рисовать, где что не верно / старо / не в стиле / не та платформа, и какое место на компо должно быть у прода…
И при этом ты знаешь даже — кто в этом виноват.

Читать дальше →

Старт Конкурса Best Basic Game!

Всем доброго дня суток! :-) 1 ноября на events.retroscene.org/ состоится открытие конкурса на лучшую игру на бейсике 2017! Будут выложены все работы авторов принявших участие в конкурсе. Заходите! Скачивайте! Играйте! Голосуйте за лучшие игры! Призовой фонд в 9000 рублей будет разделен между авторами чьи игры заняли соответственно первое, второе и третье место! Ссылка на голосование и скачиваеие игр здесь! events.retroscene.org/bbg2017/main_compo Голосование продлится до 12 числа

ZX Spectrum BASIC Jam

Тут на itch.io вот вот начнётся интересный джем.

ZX Spectrum BASIC Jam — соревнование на лучшего игрописателя на бейсике для спектрума. Это чем-то похоже на обсуждавшийся тут конкурс на лучшую игру от Бориса, но со своими фишками.

Читать дальше →