PDA

Просмотр полной версии : Видеокарта для ZX на основе DivGMX



izzx
18.12.2025, 21:10
Решил я, что для спектрума сделали мало видеокарт в слот. Могу вспомнить максимум две.
А у меня есть замечательная карта DivGMX, на основе которой можно сделать очень мощную карточку. И не только для видео.
У неё есть выход hdmi, она с базовой прошивкой умеет показывать стандартный экран, вписывая его в режим 640*480*60Гц.
https://zx-pk.ru/threads/27225-divgmx.html?highlight=divgmx

Я стал с нуля пытаться освоить vhdl. После пары месяцев битв, что-то всё-таки сделал. По крайне мере статичную картинку можно посмотреть.

На данный момент я добавил поверх стандартного ещё экран, который почти повторяет mode 4 от компьютера SAM Coupé:


режим 4: 256×192, линейный 4 бита на пиксел (16 цветов из палитры 128) = 24 КБ.

У этого экрана прозрачен цвет номер 0, сквозь него виден стандартный экран ZX.
Также почти прикручена аппаратная прокрутка всего экрана.

Вот картинка для примера. Запущена на Эволюции (просто она была под рукой).
Некоторые цвета ещё не правильные, но видно, что на спектруме теперь есть коричневый цвет ).

https://pic.maxiol.com/thumbs2/1766080033.1503894911.escrpic001.jpg (https://pic.maxiol.com/?v=1766080033.1503894911.escrpic001.jpg&dp=2)

Делал на основе прошивки divgmx_ep4_basic20170429. На гитхабе свежее не нашёл.
Хотя существует релиз divgmx_ep4_basic20181030, но без исходников.
Только для микросхемы ep4ce10e22c8n.
На Scorpion GMX работать не будет...
На Evolution пока что не показывает второй спектрумовский экран...

В целом главная задача выполнена - картинка есть.

Буду дополнять тему...

upd. Лежит тут:
https://github.com/izzx-git/DivGMX

izzx
19.12.2025, 11:23
Сейчас частота работы карты:


с шиной ZX - 112 Мгц. То есть чтение/запись идёт с такой частотой, а не постоянно. Как-то это работает, хотя есть сомнения в стабильности. По-моему на Эве надёжнее всего работает на частоте процессора 7 Мгц.
с памятью sdram - 84 Мгц. Память динамическая sdram на 32 Мб. MT48LC32M8A2 должна тянуть по-моему до 133 Мгц.
hdmi - 25.2 Мгц.


Внутренней памяти vram в чипе ep4ce10e22c8n всего 423936/8=52992 байт.

В прошивке есть виртуальный процессор Z80 на частоте 40 Мгц. Он используется для отрисовки меню OSD.

Для отрисовки стандартного экрана ZX карта мониторит шину компьютера. Считывает все записи в память страниц 5, 7 и копирует во внутреннюю память чипа, виртуальную двухпортовую микросхему vram размером 16 кб. По 8 кб на каждый экран.
И одновременно выводит по hdmi содержимое этой памяти.
Также карта следит за записью в порты #7ffd, #fe.

Моя идея в том, что карта подменяет ПЗУ компьютера на свою память sdram. Таким образом можно пользоваться областью 0000-3fff как видеопамятью, по специальным портам переключать страницы.
Планировал сделать разрешение 256*192*256 цветов. То есть три страницы по 16384 байт = 49152 байт.
Но работу с sdram я не осилил. Оказалось, в режиме случайного чтения она тратит на каждый байт целых 7 тактов на своей частоте. А это слишком медленно для отрисовки каждой строки изображения.
Как я ни бился, изображение дрожало, байты читались не стабильно.
Когда сделал во внутренней памяти промежуточный буфер для одной строки в 256 байт, стало получше. Но конец строки всё равно "дребезжал".
Мне посоветовали работать с sdram по-другому, читать сразу несколько байт. Но не понятно как увязать это с чтением этой же памяти со стороны компьютера.

Так что я переделал проект на работу только с внутренней памятью vram. Она успевает читать/писать за один такт.

izzx
19.12.2025, 13:35
Итак, экран 24576 байт. Я "разделил" его на три страницы по 8192 байта, которые включаются в область ПЗУ.
Когда в одном байте два пикселя, это, конечно. не очень удобно. Но зато занимает в два раза меньше памяти.
Но зато аппаратная прокрутка по горизонту тоже будет по 2 пикселя за раз. Это не очень хорошо, но можно использовать.

Я сделал несколько портов ввода/вывода с общим младшим адресом 91 (#5b).
Для управления экранами, страницами памяти карты, палитрой. Больше 20 портов.

На данный момент свободной внутренней памяти осталось около 6 кб. Можно попробовать добавить немного маленьких спрайтов.
Возможно, это пригодится чтобы обесклешивать главного героя в играх. Просто рисовать на втором экране поверх спрайта на обычном экране.

Также будет возможность использовать 4 Мб памяти sdram как просто память.

Каринку для SAM Coupé можно подготовить в DaDither, это удобно.

Предстоит доработка всего этого, тестирование.
Не понятно как будет на практике смотреться 60Гц, в то время как на спектруме 50. Надо ли добавлять какие-то прерывания по началу экрана, строки.
Если попробовать синхронизироваться с сигналом int спектрума, то наверное не все телевизоры такое поймут. Особенно 48 Гц.


Вот тут снял немного видео с экрана:
https://drive.google.com/drive/folders/1ItErFBJXsWGAnlXNWqtUjg61tFPhUf-B

Кстати, когда компьютер пишет в видеопамять, то при конфликтах видеоконтроллер читает байты не по тем адресам, и на экране появляется небольшой "снег". Прямо как фирменная особенность настоящего ZX!
Это можно разглядеть на видео.
Понятно, что изображение надо менять не во время прохода луча, тогда всё будет ок.

После сброса загружается палитра со стандартными цветами ZX. И второй экран выключается, на всякий случай.

Smalovsky
20.12.2025, 17:22
izzx, ты ничего не написал о структуре видеоданных. Линейная, как у специалиста, или как?
При линейной организации видеорежима ,24 килобайта можно было бы отобразить на 8 килобайт адресов стандартного экрана, используя технологию Sprinter PortY. Почитай про это.
Нужно предусмотреть блокировку прозрачности нулевого цвета, возможно, кто-то захочет использовать в программе все доступные цвета.

izzx
20.12.2025, 20:33
ты ничего не написал о структуре видеоданных
Линейная. Получается по порядку строки по 128 байт каждая, сверху вниз.
Левый пиксель в старших адресах байта, 7-4 бит. Правый 3-0 бит.


Sprinter PortY
А ссылка есть? Так сразу не нашёл.


предусмотреть блокировку прозрачности нулевого цвета
Это наверное хорошая идея.

Ещё забыл сказать: в прошивке basic я повыключал всё, что там было (divMMC, тестовое ПЗУ, SounDrive, TS, USB клавиатуру и мышь), чтобы освободить внутреннюю память. Некоторые опции наверное можно будет вернуть, если захочется. Если они не тратят память.

Вот ещё устройство байта палитры:

The palette is 7 bits:

0 BLU0 least significant bit of blue
1 RED0 least significant bit of red
2 GRN0 least significant bit of green
3 BRIGHT half bit intensity on all colours
4 BLU1 most significant bit of blue
5 RED1 most significant bit of red
6 GRN1 most significant bit of green

Smalovsky
20.12.2025, 21:57
izzx, ну, суть port_y простая. Вот, у тебя вся видеопамять 24 килобайта, и ее нужно как-то отобразить в 8 килобайтное окно. В это окно влазит только треть всей видеопамяти, или 64 строки из 192. Так вот, port _y отвечает за то, с какой строки отображаются на наше окно 64 строки из видеопамяти в 192 строки.
Например, записываем в port_y номер строки 0 и в окно отобразятся строки с нулевую по 63. Пишем в порт номер строки 100,и в окно отобразятся строки с сотую по 163. Пишем номер 150, и отобразятся со 150 по последнюю 191-ю, схема следит что-бы номера отображаемых строк не превышали максимальное количество строк.
Спринтеровская система очень удобна для позиционирования спрайтов. Не нужно вычислять адрес строки на которой начинается спрайт. Этот адрес всегда равен начальному адресу окна.

izzx
20.12.2025, 22:50
Красивое решение. Может так и сделаю. Спасибо.
У меня сейчас просто в порт нужно записать номер страницы видео от 0 до 2. Соответствующая треть экрана и впечатывается в ПЗУ.

izzx
24.12.2025, 19:03
Сделал прокрутку экрана с точностью до пикселя. Так получше будет.
А также палитру 256 цветов, вместо 128. На самом деле, цветов можно сделать хоть 16 миллионов. Каждый цвет RGB по 8 бит.
Но я думаю если одновременно только 16 из 16 млн, то смысла мало. Хотя палитру можно менять в любой момент...
Добрый человек добавил графический режим в программу DaDither.

backa
24.12.2025, 21:29
Я стал с нуля пытаться освоить vhdl. После пары месяцев битв, что-то всё-таки сделал.
я тоже на досуге занимаюсь освоением VHDL. В основном использую чужие рабочие проекты из открытых источников для изучения как НАДО делать.
Вот тоже думал сделать , чтобы при включении компьютера отрисовывалась заставка-фотография на несколько секунд и далее переходил к основному экрану ZX.
Но пока руки не дошли)) Вот Ваш проект заинтересовал но на Вашем гугл-драйве не нашел исходников на VHDL для поиска чего-то полезного для своих хобби-проектов.
Вы планируете выкладывать исходники?

izzx
24.12.2025, 21:44
Вы планируете выкладывать исходники?
Завтра хотел выложить на гитхаб.
На облаке оно лежит, но скрыто гуглом как подозрительное ).

Deadly
24.12.2025, 23:49
Мб не нужно изобретать велосипед, а использовать то что есть? Ft812 позволяет работать с медленными портами и выбивать разрешение 1024*768. И прикрутить можно к любому спектруму.

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

И если делать что то полезное, то попытаться на СМТ сделать аналог рендера ft дабы избавится от зависимости и придумать действительно что то ценное.
Объем памяти 1мб для хранения данных, и 8кб для вывода экрана разрешением от 320*240 до 1280* 1024 мб и больше можно. Любой спек на частоте 3.5мгц сможет ворочить 8кб памяти а результат будет уровня ПК. Единственное для качественной работы желательно иметь на борту дма, дабы не слать раз в фрейм данные через порты до 8кб ( и то те что изменились)


Но если цель, просто что то делать, без какой либо пользы, тогда делай )

backa
25.12.2025, 04:05
На облаке оно лежит, но скрыто гуглом как подозрительное
видимо поэтому и "не увидел")))

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


Мб не нужно изобретать велосипед, а использовать то что есть? Ft812 позволяет работать с медленными портами и выбивать разрешение 1024*768. И прикрутить можно к любому спектруму.
если это относится ко мне то я этот чип знаю досконально - использовал в связке с Cortex-M4 от TI - все его плюшки использовал - даже некое подобие осциллографа делал ))
Я хотел без всяких сторонних контроллеров прикрутить маленький модуль VHDL для старта и все))
Если не трудно - выложите исходники - будет полезно в познавательных целях !

Deadly
25.12.2025, 13:22
если это относится ко мне то я этот чип знаю досконально - использовал в связке с Cortex-M4 от TI - все его плюшки использовал - даже некое подобие осциллографа делал ))
это похвально!


Если не трудно - выложите исходники - будет полезно в познавательных целях !
несовсем понятно что подразумевается под исходниками, могу только вот это (https://github.com/DeadlyKom/TSLib) и видяшки всякие пример из либы и всякие эксперементы на FT812

https://youtu.be/4T0tMvKoxrI?si=II0ea93H6863HGPO

https://youtu.be/8BeSNIV-ATk?si=pSX0qTy9ET0UAevU
их конечно больше, но юпубе нет других

backa
25.12.2025, 18:07
Я стал с нуля пытаться освоить vhdl

могу только вот это и видяшки всякие пример из либы и всякие эксперементы на FT812
получилось небольшое недопонимание у меня - Вы свой проект реализовывали "софтово" без вставки VHDL модулей в существующий VHDL проект видеокарты.
FT812 конечно достаточно хороший контроллер но чет мне не хочеться его задействовать в существующей схеме ZX. FPGA настолько гибкая система в умелых руках, что навешивание внешних контроллеров является избыточно))) чисто мое мнение!
Фантазия в случае использования FPGA ограничена только ценой , которую готовы потратить на этот чип!

izzx
25.12.2025, 19:08
Частично выложил проект. На днях остальное закину, а то много мелких файлов за раз не копируется.
https://github.com/izzx-git/DivGMX/tree/main
В основном я правлю два файлика: basic.vhd и vga_zx.vhd.

backa
25.12.2025, 19:14
На днях остальное закину
ждем) спасибо!

Deadly
25.12.2025, 20:22
FT812 конечно достаточно хороший контроллер но чет мне не хочеться его задействовать в существующей схеме ZX. FPGA настолько гибкая система в умелых руках, что навешивание внешних контроллеров является избыточно))) чисто мое мнение!
Фантазия в случае использования FPGA ограничена только ценой , которую готовы потратить на этот чип!
Я за то, чтобы взять идею того, как он работает, и сделать свой графический контроллер на ПЛИС. в ФТ812 имхо интересно сделан графический конвеер, который позволяет медленному з80 ворочить графику 24 бит и не париться особо с производительность, всё что нужно это изменять/пересобирать DisplayList в рамках 8кб (почти 6912)

izzx
25.12.2025, 21:26
Мб не нужно изобретать велосипед, а использовать то что есть? Ft812 позволяет работать с медленными портами и выбивать разрешение 1024*768. И прикрутить можно к любому спектруму.
Как-нибудь почитаю про этот ft812. Но пока он прикручен только в Эве, как я понимаю. А карточка divGMX у меня уже есть, и она под разные спеки. И сделать из неё можно далеко не только видеокарту.
И придумывать свой велосипед, конечно, интереснее. Вместо того, чтобы почитать как у людей правильно сделано.
Но постепенно чему-то научусь.

Абзац про СМТ пока что даже не понял.

Deadly
25.12.2025, 21:47
Но пока он прикручен только в Эве
насколько мне известно, спринтер и Дельта-С

Smalovsky
25.12.2025, 22:34
Deadly, проблема этих чипов, что они могут исчезнуть из торговли. Исчезнет ФТ и конец. А фпга будут ещё долго продаваться. Лучше на фпга делать.

Deadly
25.12.2025, 22:56
Перечитай мои сообщения, благо их тут немного

backa
25.12.2025, 23:47
Исчезнет ФТ и конец
исчезнуть он конечно может но вряд-ли - там британцы владеют бизнесом (или частично). Ft812 я использовал в 2017 и тогда он был "трудноусваемым" изза китайского стиля оформления документации - приходилось общаться с офисом в Британии чтобы получить адекватную доку))) Но в коммерческие устройства вряд-ли стоит ее ставить)) Хотя штука волне приятная - микроконтроллер совсем не нагружен отрисовкой экрана - особенно если задействовать их встроенные кнопочки и др.
Кстати у Андрея Карпова последний его ZX клон использует FT812 - так что - кто хочет тот найдет все исходники на гитхабе у него.

А фпга будут ещё долго продаваться. Лучше на фпга делать
вот тут с Вами согласен и солидарен - я портировал известные корки(на этом форуме) ZX на CPLD и FPGA от 3х разных основных FPGA производителей. И все работает - главное отлаженные модули на VHDL - а портировать и адаптировать к встроенным плюшкам не займет много времени. Вот только с китайскими FPGA поделками не хочеться связываться - это такой узкоспецпродукт )))

izzx
26.12.2025, 11:51
Почитал про FT812, интересно.
https://hype.retroscene.org/blog/727.html
https://hype.retroscene.org/blog/728.html
https://hype.retroscene.org/blog/734.html
Там прямо про меня слова:

Режим «байт на точку». Характерно для обитателей известного форума друзей. В данном решении считается, что достаточно снять с программиста ограничение на количество цветов пикселя, как мир заиграет новыми диззями. Изобретательская мысль на этом месте останавливается и до обработки процессором непропорционально огромного массива графических данных и связанных с этим проблем обычно не доходит.

Блиттер. Вторая стадия болезни. Изобретатель уже осознает, что сил Z80 на новый режим не хватит. Предлагается концепт «видеокарты» на бюджетной FPGA с максимальным количеством SRAM (потому что работать с дешевой и большой SDRAM автор не умеет). «Видеокарта» должна аппаратно двигать тонны пикселей по командам Z80. На этом мысль автора обычно тоже обрывается.

Спрайтовый процессор. До этой стадии видеопроцессорного дизайна доходят немногие и намного меньше, чем почти лишь каждый.
Я пока знаю двоих =)

Буду считать, что у меня ретро проект на простой ФПГА. А не на современных высоких технологиях.
Главное сделать хоть немного спрайтов, и проект уже будет иметь какую-то завершённость.

Smalovsky
26.12.2025, 16:18
izzx, аппаратные спрайты не нужно. Спектрум в турборежиме на 7 МГц потянет 16 цветов на пиксель при линейной раскладке видеобайт.

Посмотри новые игры для Сэм курс
https://zxart.ee/eng/software/games/hw:samcoupe/
У него 16 цветов на пиксель. И ничего, процессор справляется. Главное линейная раскладка видеобайт.

Deadly
26.12.2025, 17:47
Почитал про FT812, интересно.
посмотри дата шифты (можешь в библиотеке, линк на гит кидал выше) там и программы для конверсии и описание работы имеются.
дело не в аппаратных спрайтах, а в подходе пайплайна рендера.

DL engine читает Display List последовательно один раз на кадр, формируя примитивы (формируется RECT-примитив в FIFO.)
Scanline Renderer идёт по строкам (вертикально)
- Для каждой строки проверяет: пересекает ли RECT текущую строку?
- если да, перебирает горизонталь, вычисляет цвет для каждого пикселя

Примитивом (RECT-примитив) может быть, как линия, прямоугольник, фон, изображение и т.д. и т.п.

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


аппаратные спрайты не нужно. Спектрум в турборежиме на 7 МГц потянет 16 цветов на пиксель при линейной раскладке видеобайт.
у тебя есть опыт работы над проектами в 7МГц, коль так жёстко утверждаешь такое?

Smalovsky
26.12.2025, 19:40
Deadly, на спринтере 256 цветные гонял под 14 МГц.
На векторе четырех цветными сейчас занимаюсь.