Вход

Просмотр полной версии : Расширения fpga-клонов



Smalovsky
19.06.2025, 18:05
Уже давно появились фпга клоны, однако почему-то никто ещё не хочет их улучшать в плане графики. Однако, эти улучшения напрашиваются сами. Например ограничение в 512 цветов. Это ограничение из-за того, что для значений цветовых компонентов не учитывается младший бит. Но ведь, ВДП имеет кучу неиспользованных регистров с номерами: 6,8,9,14,с 24 по 31. В одном из свободных регистров можно было бы предусмотреть разряд, который бы и отвечал за режим включения учета младших бит в цветовых компонентах. Тогда при записи в этот разряд регистра, мы бы получали четырёхбитные компоненты цвета, и 4096 цветов.
Потом, ограничение в 4 общие палитры и на тайлы и на спрайты. Хотя, можно разделить палитры на два банка - банк палитр для тайлов и банк палитр для спрайтов. Каждый банк по 4 палитры. Это удвоит количество цветов видимых одновременно на экране с 61 до 121. Но для этого нужно расширить CRAM до 128 цветов. Цвета с номерами 0-63 входят в банк палитр тайлов, а 64 по 127 в банк палитр спрайтов. Разумеется, нужно предусмотреть включение разделения палитр бо банкам через свободный регистр ВДП.
Наконец, можно сделать для спрайтов выбор банка палитр через свободный бит в байтах атрибутов спрайта. Это позволит использовать для спрайтов 2 банка палитр( банк палитр фона и банк палитр спрайтов),все 8 палитр. Место для этого бита можно выделить в третьем байте атрибута спрайта, который отвечает за размер спрайта. Конкретно, это любой бит с 4 по 7. Например, седьмой.
Ну, вот это всё можно приложить к 14-му свободному регистру. Рассмотрим возможное назначение его разрядов:
D7 - задание ширины цветовых компонентов:
0- компонента в три бита;
1- компонента в 4 бита;
D6 - D5 -задание режима разделения палитр по банкам:
00- разделения по банкам нет, общие 4 палитры для тайлов и спрайтов;
01- разделения по банкам есть, раздельные банки из 4 палитр для тайлов и спрайтов. Но для 3 байта атрибута спрайтов седьмой бит при нулевом значении выбирает банк палитр тайлов, при единичном банк палитр спрайтов;
10 - разделения по банкам есть, раздельные банки из 4 палитр для тайлов и спрайтов. Но для 3 байта атрибута спрайтов седьмой бит при нулевом значении выбирает банк палитр спрайтов, при единичном банк палитр тайлов;
11-Строгое разделение палитр по банкам, раздельные банки из 4 палитр для тайлов и спрайтов. Для тайлов банк палитр тайлов, для спрайтов банк палитр спрайтов. Седьмой бит 3 байта атрибута спрайта не влияет на выбор банка палитр;
D4 - D3 - не используются;
D2 - D0 - обязательный повтор значений битов D7 - D5. Защитная функция от записи случайного мусора при ошибках.

Кто-нибудь что-нибудь понял? Напишите свой отзыв.

xolod
20.06.2025, 09:23
А в программах откуда появится поддержка этих железных расширений?

Hunta
20.06.2025, 10:51
А в программах откуда появится поддержка этих железных разширений?
Оттуда же, откуда всегда - кто-то когда-то может быть напишет новые версии программ. Он вообще много чего успел написать, этот кто-то

Smalovsky
21.06.2025, 16:16
Пацаны, не слушайте посторонних для тематики. Это топик для каких-то предложений, находок, обзоров.
Вот,например, клон с расширенными возможностями(2 МБ ОЗУ):
http://tv-games.ru/forum/showthread.php?t=7089
SoftLight, ты вообще кто такой? Что ты для спектрума сделал? Да, даже если я в "устранении клешинга" и "тупо рассуждал и тролил и больше ничего", то это, в конечном итоге, привело к появлению ZX ULax, потому что людей заинтересовало. Так что лучше пацанам "повестись".

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


А в программах откуда появится поддержка этих железных расширений?
Это топик для первоначальных предложений, обмозгований. Тут не "делайте как я написал!". Ну вот, появился новый расширенный клон( ссылка выше). Откуда там сразу новый софт? Ясно, что не сразу.

murgatroid_79
19.07.2025, 17:04
...Вот,например, клон с расширенными возможностями(2 МБ ОЗУ):
http://tv-games.ru/forum/showthread.php?t=7089...
Ну это не совсем клон,это специальная девборда в которой все процессоры и заказные СБИСы (ASIC) устанавливаются в панельки. Основная память,память z80,а также видеопамять расширены:
82525
Собственно всё описал HardWareMan в соседней теме: https://zx-pk.ru/threads/25978-nuzhna-sega-megadrajv-na-dekap.html?p=1184746&viewfull=1#post1184746
Ему бы твои вопросы задать...Вот только HardWareMan ушёл с форума :(
А расширить память на Сеге можно,там в карте памяти окно большое свободно. Я,даже,как-то пытался это сделать микросхемами SRAM из кэша с материнской платы. Конечно не 2 мегабайта,а поменьше,но что-то пошло не так :v2_dizzy_facepalm:
https://zx-pk.ru/threads/21624-b-statikram-512kb-b.html?p=617401&viewfull=1#post617401

Smalovsky
20.07.2025, 16:14
murgatroid_79, 16 кБ ОЗУ зилога хорошо. Больше места для для таблиц разных, дополнительных данных, увеличенный буфер для звуковых эффектов. 2 МБ основной памяти ОЗУ тоже хорошо. Особенно для больших карт в игре.
Но, к этому делу обязательно нужно расширять цветовую память на 128 цветов и вводить раздельные банки палитр. Вот пример. Допустим, я пишу игру. Для графики у меня 4 общих палитры. Для фонов я задействовал 2 палитры ( 30 цветов + 1 цвет фона). На спрайты остаётся 2 палитры (30 цветов). Допустим, на экране будет главный персонаж и три персонажа противников с уникальными цветами. Это 30/4=7 цветов для отдельного персонажа. А если у них еще индивидуальное оружие в 2-3 цвета? Нужно будет сокращать до 4-5 цветов на персонаж или делать оружие цветами персонажей. Скудная цветовая расцветка получится. А ведь, нужно предусмотреть цвета для шрифтов и эффектов!
Теперь, рассмотрим ситуацию когда у нас 2 банка палитр по 4 палитры в каждом. На фон можно выделить 3 палитры из первого банка( банк палитр фона). Это 45 цветов +1 цвет фона. Для шрифтов и эффектов можно выделить 1 палитру из первого банка( банк палитр фона). Это 15 цветов. Для спрайтов можно выделить 4 палитры из второго банка( банк палитр спрайтов). Это 60 цветов. Или 60/4=15 цветов для отдельного персонажа. Если есть оружие на 2-3 цвета, то на персонаж будет 12-13 цветов. Цветовая расцветка будет получше.

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

Где бы взять исходники прошивки на верилоге или вшдиэле? Покопаться там для интереса. А мож чего и выйдет?.. Я так понимаю, открытые прошивки есть только для Мистера?

murgatroid_79
21.07.2025, 17:33
...Где бы взять исходники прошивки на верилоге или вшдиэле? Покопаться там для интереса. А мож чего и выйдет?.. Я так понимаю, открытые прошивки есть только для Мистера?
А на ГитХабе нету?
Посмотри тут: https://github.com/emu-russia/SEGAChips/tree/main
И тут :https://github.com/nukeykt/Nuked-MD-FPGA
И у участников реверса спросить можно..Например and1981 здесь на форуме есть,а NukeYKT на Эмуленде.
Да и на самом ГитХабе есть способ задать вопрос.

Smalovsky
22.07.2025, 16:41
murgatroid_79, спасибо за ссылки. Если эти исходники приближены к реальным схемам, то в них будет трудно разобраться. Нужно б дженерики, где как "эмуляция" - нет точного повторения схемы, приставка как чёрный ящик, исходники сделаны на повторение функционала приставки без соответствия реальным схемам. Дженерики более алгоритмичны, в них нет привязки к конкретным микросхемам. В дженерики намного проще внести изменения.

Smalovsky
23.07.2025, 16:28
murgatroid_79, я скачаю что-нибудь. Но я не специалист в области исходников прошивок для генезис. Какие исходники наиболее простые, популярные у сообщества СНГ, общепризнанные и рекомендуемые?
Ну, вообще, я выбрал https://github.com/MiSTer-devel/Genesis_MiSTer и https://github.com/Torlus/fpgagen
Там меньше привязки к микросхемам. Конечно, там есть узлы процессора, вдп, памяти, но это как функциональные блоки.

Smalovsky
26.07.2025, 17:31
Сообщение поделю на пункты:
А) Пересмотр концепции
Б) Прогресс и промежуточные результаты
В) Диалог с заинтересованными людьми

А) В общем окончательно я выбрал исходники https://github.com/Torlus/fpgagen. По сравнению с исходниками для Мистера в них только один язык VHDL, в то время как в исходниках для Мистера мешанина Verilog и VHDL. Кроме того, на этих исходниках базируются исходные коды для Мистера. Также эти исходники для четырёх плат:
MiST, Turbo Chameleon 64, Altera/Terasic DE2 board.
Когда я глянул на исходный код VDP, то сразу понял, что от выбора разрядности компонентов цвета нужно отказаться. Что бы реализовать такой выбор необходимо полностью переписать VDP, а это достаточно тяжело. Также я решил изменить расположение битовых полей в регистре 14. Теперь биты задающие режим разделения палитр по банкам не шестой и пятый, а пятый и четвёртый. Эти биты необходимо дублировать в первом и нулевом битах при записи в регистр.

Б) Вот исходники VDP https://github.com/Torlus/fpgagen/blob/master/src/vdp.vhd для вашего анализа. Теперь я напишу что мне удалось изменить. Если есть ошибки или у вас есть лучшие решения - сразу исправляйте и предлагайте другие решения. Анализируйте исходный код оригинала и читайте мои изменения и пояснения:

1. Расширение CRAM
В разделе объявлений -- ON-CHIP RAMS есть тип и объявление для CRAM

type cram_t is array(0 to 63) of std_logic_vector(15 downto 0);
signal CRAM

Меняем диапазон типа массива CRAM на 0..127

type cram_t is array(0 to 127) of std_logic_vector(15 downto 0);

Теперь цветовая память расширена для хранения 128 значений цветов.

Нужно проверить есть ли в листинге ограничения на запись-чтение CRAM только для 64 цветов.
Такие ограничения есть, поэтому их нужно устранить. Ограничения касаются размера адреса только для 64 ячеек CRAM.
Необходимо расширить диапазон адресов до 128 ячеек. За адрес в участках памяти ВДП отвечает сигналы DT_WR_ADDR и ADDR.
Они описаны в разделе объявлений -- DATA TRANSFER CONTROLLER

signal DT_WR_ADDR : std_logic_vector(15 downto 0);
signal ADDR : std_logic_vector(15 downto 0);

Однако, нужно узнать в каких местах есть доступ к CRAM. В этом поможет сигнал DTC перечислимого типа dtc_t.
Их описания в том же разделе

type dtc_t is (
...
DTC_CRAM_WR,
...
DTC_CRAM_RD,
...
);
signal DTC : dtc_t;

Ищем место в листинге где есть запись в CRAM по значению переменной DTC равному DTC_CRAM_WR.
Такие места встречаются в разделе реализации -- DATA TRANSFER CONTROLLER. Нас интересует оператор case

case DTC is

А именно случай
when DTC_CRAM_WR =>
-- synthesis translate_off
write(L, string'(" CRAM WR ["));
hwrite(L, x"00" & DT_WR_ADDR(15 downto 1) & '0');
write(L, string'("] = ["));
hwrite(L, DT_WR_DATA);
write(L, string'("]"));
writeline(F,L);
-- synthesis translate_on
CRAM( CONV_INTEGER(DT_WR_ADDR(6 downto 1)) ) <= DT_WR_DATA;

Последнюю строку нужно изменить, чтобы был доступ ко всем 128 цветам

CRAM( CONV_INTEGER(DT_WR_ADDR(7 downto 1)) ) <= DT_WR_DATA;

В томже операторе case ищем ветвь по значению пременной DTC равной DTC_CRAM_RD

when DTC_CRAM_RD =>
DT_RD_DATA <= CRAM( CONV_INTEGER(ADDR(6 downto 1)) );
DT_RD_DTACK_N <= '0';
ADDR <= ADDR + ADDR_STEP;
DTC <= DTC_IDLE;

Здесь нужно заменить вторую строку на

DT_RD_DATA <= CRAM( CONV_INTEGER(ADDR(7 downto 1)) );

Похоже, что теперь расширение CRAM до 128 цветов выполнено, если не было каких-либо упущений.

2. Введение нового регистра.
В разеле объявлений -- CPU INTERFACE есть тип и объявение для множества( массива) регистров

type reg_t is array(0 to 31) of std_logic_vector(7 downto 0);
signal REG : reg_t;

Из этого видно, что предусмотрено 32 регистра. Регистр с индексом и номером 14 не используется, поэтому выберем
его в качестве нового регистра "Режим выбора палитровых банков".
Для временного хранения значения регистров используется сигнал REG_LATCH. Он описан в том же разделе как

signal REG_LATCH : std_logic_vector(15 downto 0);

Данные регистра хранятся в битах 7-0 защёлки REG_LATCH. В старших битах 15-8 хранится конкатенация битового значения "100" и номера регистра.

В разделе объявлений -- REGISTERS описаны поименованные линии( сигналы) непосредственно представляющие данные битовых
полей регистров. В этом разделе нам необходимо ввести новый сигнал PBS_MODE( palette bank selection mode)

signal PBS_MODE : std_logic_vector(1 downto 0);

В исходниках есть раздел реализации -- REGISTERS. В этом
разделе реализации -- REGISTERS назначаем нашему сигналу PBS_MODE соответствующие битовые поля регистра 14


PBS_MODE <= REG(14)(5 downto 4);

Фактически регистр введён. Но из-за особой роли этого регистра, его необходимо защитить от записи в него случайных значений.
Так для того, чтобы записать в регистр значения 5-го и 4-го битов нужно продублировать эти значения в 1-ый и 0-й бит.
Для релизации защиты нужно посмотреть место в исходнике где происходит запись в регистр. В этом помогут сигналы
REG_SET_REQ - запрос на установку с регистром( наверно такая расшифровка) и REG_SET_ACK - подтверждение выполнения запроса на установку регистра( могу ошибиться с расшифровкой).
Эти сигналы описаны в разделе объявлений -- DATA TRANSFER CONTROLLER

signal REG_SET_REQ : std_logic;
signal REG_SET_ACK : std_logic;

Ищем место в исходнике по названию сигнала REG_SET_REQ, где происходила бы запись в регистр или буфер REG_LATCH.
Одно такое место находится в разделе реализации -- CPU INTERFACE в одном из вложенных условий


if DI(15 downto 13) = "100" then
-- Register Set
REG_LATCH <= DI;

Это место легко найти по комментарию -- Register Set. Проанализируем: данные с шины DI (сокращение Data Input) записываются в буфер-защёлку.
Но тут нет передачи данных непосредсвенно в регистр. Следовательно, продолжаем искать дальше. В разделе реализации -- DATA TRANSFER CONTROLLER
находим место в одном из подусловий

if REG_SET_REQ = '1' and REG_SET_ACK = '0' and IN_DMA = '0' then
REG( CONV_INTEGER( REG_LATCH(12 downto 8)) ) <= REG_LATCH(7 downto 0);
REG_SET_ACK <= '1';
end if;

Вот тут данные с защёлки-буфера попадают в регистр. Защиту реализуем вставкой вложенного условия

if REG_SET_REQ = '1' and REG_SET_ACK = '0' and IN_DMA = '0' then
if ( (CONV_INTEGER(REG_LATCH(12 downto 8)) = 14) and (REG_LATH(5 downto 4) = REG_LATH(1 downto 0))) then
REG(14) <= REG_LATCH(7 downto 0);
elseif CONV_INTEGER(REG_LATCH(12 downto 8)) /= 14 then
REG( CONV_INTEGER( REG_LATCH(12 downto 8)) ) <= REG_LATCH(7 downto 0);
end if;
REG_SET_ACK <= '1';
end if;


Защита записи регистра выполнена, хотя очень коряво. Отдаю всё на откуп оптимизатору.

Остаётся понять работу тайло-спрайтового движка и внести в него изменения.

В) Вы заметили, что я не дал, готовый файл, не вынес на блюдечке. Я хочу, что бы те кому интересна тема разбирались вместе со мной и оказывали мне помощь. Как я не раз убеждался на этом форуме: те кто выносили всё на готовенькое на блюдечке получали плевок в лицо. То ли многие люди тут неблагодарные, то ли это у них совковое воспитание, то ли они завистливые и тех кто инициативен считают выпендрёжниками - не знаю. Поэтому коллективная работа и взаимопомощь. Я пока недельку отдохну от VDP и посмотрю, что изменится за неделю. Может, кто-то
расшифрует на русский названия сигналов, кто-то нарисует временные диаграммы, ну а кто-то даже графически зарисует схему процессов со спискам чувствительности.
Вот ещё момент. Автор исходников рекомендует программы
- Altera Quartus II 9.1 Web Edition.
- (optional) ModelSim-Altera 6.5b Starter Edition.
Это достаточно старые программы как и сами исходники 2010-2013 гг. Посоветуйте, где бы их скачать? Только, вот, не надо "Ищи сам" и прочее. Я ни разу не пользовался Квартусом, поэтому не специалист в этом вопросе и даже не представляю, где скачать такую старую версию. Да ещё могут быть подводные камни с установкой и настройкой.
А может мне сменить форум, где смогу получить помощь? Посоветуйте такой.

AlexG
26.07.2025, 18:37
Чойтоясегоднядурной...
Соррян за жуткий оффтоп.
Со стороны это выглядит так:
"ТС якобы что-то изваял, привёл куски кода (только смысла в них ни какого).
Потом "свалил в кусты" типо подожду пока кто нибудь не клюнет и не сделает часть работы (в которой нифига не шарит, либо лень).
Прикинулся шлангом (что такое гугл не знает и где торрент тоже).
Докучи намекнул что все ... а я дартаньян. может к другим мушкетёрам податься ?"
Ещё раз сорри... если слишком грубо.
ПС: может я ошибаюсь в ситуации? и всё совсем не так на деле?

Smalovsky
31.07.2025, 16:39
Чойтоясегоднядурной...
Только сегодня?

ТС якобы что-то изваял, привёл куски кода (только смысла в них ни какого).
Толстый троллинг. Почитай название топика. Расширение клонов на фпга подразумевает изменение их прошивки, а для этого нужно изменить исходные коды прошивки. Ты это знал?
Я взял прошивку с гитхаба за базу и написал, что в ней я конкретно меняю для получения результата. Знаток вхдл? Докажи, что в кусках кода нет никакого смысла.

Потом "свалил в кусты" типо подожду пока кто нибудь не клюнет и не сделает часть работы (в которой нифига не шарит, либо лень).
Подожду, пока кто-нибудь не присоединится к работе. Ты понимаешь, что правку кода вдп можно одному не потянуть? Докажи, что я нифига не шарю.

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

Докучи намекнул что все ... а я дартаньян. может к другим мушкетёрам податься ?"
Ты наверно подсознательно причислил себя к нехорошим людям, о которых я писал.

ПС: может я ошибаюсь в ситуации? и всё совсем не так на деле?
Зачем ты написал в этот топик? Ты не понимаешь о чём речь в этом топике, не понимаешь, о каком расширении я написал в первом посту, не понимаешь принцип этого расширения,не понимаешь кусков кода, да и вообще, тебе этот топик безразличен. Тогда зачем ты сюда пишешь?

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

Пацаны, не ведитесь на залётных циркачей. Им этот топик по-барабану. Они даже не могут понять о чём речь вообще.

AlexG
31.07.2025, 16:47
Сегодня мне просто лень.
Посему кратко:
VHDL, Verilog - это один из моих "кусков хлеба" - так что, увы, я в нем разбираюсь.
"Правильно установить и настроить" - обычно эти знания требуются при работе в линуксе. в винде обычно всё сводится к запуску инсталлятора. Если с эти у кого-то сложности то это его печаль.

Smalovsky
31.07.2025, 16:51
Сегодня мне просто лень.
Так ты даже мои правки не читал! Циркач!

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


в винде обычно всё сводится к запуску инсталлятора
А может и не сводИться.

Smalovsky
03.08.2025, 14:02
Автор оригинальной прошивки недавно умер...
https://tinkerdifferent.com/threads/passing-of-gregory-torlus-estrade.4501/
Может, для кого-то это важно узнать.
А я ему уже хотел письмо писать, для разъяснения назначения сигналов в спрайтовом движке... Буду писать( видимо придётся, слишком сложный спрайтовый движок) в команды Мистера и Тимгенезис , у них прошивки основаны на прошивке автора. Такие дела..

Smalovsky
09.08.2025, 16:00
Дошёл до редактирования раздела реализации -- PIXEL COUNTER AND OUTPUT.
Сделаю необходимые пояснения. Информация о пикселях строки хранится в трёх буферах строк OBJ_COLINFO, BGA_COLINFO, BGB_COLINFO,
представляющих собой двухпортовую память. Каждый буфер строки хранит информацию о 320 пикселях строки. Буфер OBJ_COLINFO хранит пиксели
строки спрайтового слоя. Буферы BGA_COLINFO и BGB_COLINFO хранят информацию о пикселях тайловых слоёв А и Б. В функциональном блоке PIXEL COUNTER AND OUTPUT
происходит считывание информации для пикселя выводимого на экран из каждого источника - буферов строк и из регистра фонового цвета, выбор согласно информации из источников( приоритету и значению номеру цвета)
конечного источника информации о пикселе и получению значения цвета из CRAM согласно этому источнику. Это приблизительно показано на следующей схеме:

https://i.postimg.cc/D2tKx92S/GREAT-MUX.png

Информация о пикселе в семибитных ячейках буферов строк состоит из следующих битовых полей:
PRI - бит приоритета, PALNO -номер палитры, COLNO-номер цвета в палитре.
Для регистра фонового цвета бит приоритета не нужен.
Выбор значения цвета из массива CRAM происходит по индексу равному десятичному значению конкатенации PALNO & COLNO.

За реализацию показанной выше приближонной схемы отвечает участок кода в операторе case PIXDIV is, в ветви:

when "0011" =>
if OBJ_COLINFO_Q_B(3 downto 0) /= "0000" and OBJ_COLINFO_Q_B(6) = '1' then
T_COLOR <= CRAM( CONV_INTEGER(OBJ_COLINFO_Q_B(5 downto 0)) );
elsif BGA_COLINFO_Q_B(3 downto 0) /= "0000" and BGA_COLINFO_Q_B(6) = '1' then
T_COLOR <= CRAM( CONV_INTEGER(BGA_COLINFO_Q_B(5 downto 0)) );
elsif BGB_COLINFO_Q_B(3 downto 0) /= "0000" and BGB_COLINFO_Q_B(6) = '1' then
T_COLOR <= CRAM( CONV_INTEGER(BGB_COLINFO_Q_B(5 downto 0)) );
elsif OBJ_COLINFO_Q_B(3 downto 0) /= "0000" then
T_COLOR <= CRAM( CONV_INTEGER(OBJ_COLINFO_Q_B(5 downto 0)) );
elsif BGA_COLINFO_Q_B(3 downto 0) /= "0000" then
T_COLOR <= CRAM( CONV_INTEGER(BGA_COLINFO_Q_B(5 downto 0)) );
elsif BGB_COLINFO_Q_B(3 downto 0) /= "0000" then
T_COLOR <= CRAM( CONV_INTEGER(BGB_COLINFO_Q_B(5 downto 0)) );
else
T_COLOR <= CRAM( CONV_INTEGER(BGCOL) );
end if;

Необходимо изменить этот код, чтобы можно было выбирать из 128 значений цветов CRAM. Впервую очередь, необходимо расширить память OBJ_COLINFO
до ширины шины данных в 8 бит. Ячейка памяти OBJ_COLINFO будет содержать конкатенацию битовых полей BS & PRI & PALNO & COLNO. Новый бит BS в старшем разряде ячейки - бит переключения палитровых банков.
Буфера строк имеют тип vdp_colinfo( описан в файле vdp_colinfo.vhd). По аналогии с этим типом при помощи Мегавизард( Memory Compilier) в Квартус 2 делаем тип vdp_ext_colinfo, который отличается торлько шириной шины
данных каналов в 8 бит. Что у меня вышло:




-- megafunction wizard: %RAM: 2-PORT%
-- GENERATION: STANDARD
-- VERSION: WM1.0
-- MODULE: altsyncram

-- ================================================== ==========
-- File Name: vdp_ext_colinfo.vhd
-- Megafunction Name(s):
-- altsyncram
--
-- Simulation Library Files(s):
-- altera_mf
-- ================================================== ==========
-- ************************************************** **********
-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
--
-- 9.1 Build 350 03/24/2010 SP 2 SJ Web Edition
-- ************************************************** **********


--Copyright (C) 1991-2010 Altera Corporation
--Your use of Altera Corporation's design tools, logic functions
--and other software and tools, and its AMPP partner logic
--functions, and any output files from any of the foregoing
--(including device programming or simulation files), and any
--associated documentation or information are expressly subject
--to the terms and conditions of the Altera Program License
--Subscription Agreement, Altera MegaCore Function License
--Agreement, or other applicable license agreement, including,
--without limitation, that your use is for the sole purpose of
--programming logic devices manufactured by Altera and sold by
--Altera or its authorized distributors. Please refer to the
--applicable agreement for further details.


LIBRARY ieee;
USE ieee.std_logic_1164.all;

LIBRARY altera_mf;
USE altera_mf.all;

ENTITY vdp_ext_colinfo IS
PORT
(
address_a : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
address_b : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
clock : IN STD_LOGIC := '1';
data_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
data_b : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
wren_a : IN STD_LOGIC := '0';
wren_b : IN STD_LOGIC := '0';
q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
q_b : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END vdp_ext_colinfo;


ARCHITECTURE SYN OF vdp_ext_colinfo IS

SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL sub_wire1 : STD_LOGIC_VECTOR (7 DOWNTO 0);



COMPONENT altsyncram
GENERIC (
address_aclr_a : STRING;
address_aclr_b : STRING;
address_reg_b : STRING;
indata_aclr_a : STRING;
indata_aclr_b : STRING;
indata_reg_b : STRING;
intended_device_family : STRING;
lpm_type : STRING;
numwords_a : NATURAL;
numwords_b : NATURAL;
operation_mode : STRING;
outdata_aclr_a : STRING;
outdata_aclr_b : STRING;
outdata_reg_a : STRING;
outdata_reg_b : STRING;
power_up_uninitialized : STRING;
read_during_write_mode_mixed_ports : STRING;
widthad_a : NATURAL;
widthad_b : NATURAL;
width_a : NATURAL;
width_b : NATURAL;
width_byteena_a : NATURAL;
width_byteena_b : NATURAL;
wrcontrol_aclr_a : STRING;
wrcontrol_aclr_b : STRING;
wrcontrol_wraddress_reg_b : STRING
);
PORT (
wren_a : IN STD_LOGIC ;
clock0 : IN STD_LOGIC ;
wren_b : IN STD_LOGIC ;
address_a : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
address_b : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
q_b : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
data_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
data_b : IN STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END COMPONENT;

BEGIN
q_a <= sub_wire0(7 DOWNTO 0);
q_b <= sub_wire1(7 DOWNTO 0);

altsyncram_component : altsyncram
GENERIC MAP (
address_aclr_a => "NONE",
address_aclr_b => "NONE",
address_reg_b => "CLOCK0",
indata_aclr_a => "NONE",
indata_aclr_b => "NONE",
indata_reg_b => "CLOCK0",
intended_device_family => "Stratix",
lpm_type => "altsyncram",
numwords_a => 512,
numwords_b => 512,
operation_mode => "BIDIR_DUAL_PORT",
outdata_aclr_a => "NONE",
outdata_aclr_b => "NONE",
outdata_reg_a => "CLOCK0",
outdata_reg_b => "CLOCK0",
power_up_uninitialized => "FALSE",
read_during_write_mode_mixed_ports => "OLD_DATA",
widthad_a => 9,
widthad_b => 9,
width_a => 8,
width_b => 8,
width_byteena_a => 1,
width_byteena_b => 1,
wrcontrol_aclr_a => "NONE",
wrcontrol_aclr_b => "NONE",
wrcontrol_wraddress_reg_b => "CLOCK0"
)
PORT MAP (
wren_a => wren_a,
clock0 => clock,
wren_b => wren_b,
address_a => address_a,
address_b => address_b,
data_a => data_a,
data_b => data_b,
q_a => sub_wire0,
q_b => sub_wire1
);



END SYN;

-- ================================================== ==========
-- CNX file retrieval info
-- ================================================== ==========
-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0"
-- Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0"
-- Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0"
-- Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0"
-- Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0"
-- Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0"
-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8"
-- Retrieval info: PRIVATE: BlankMemory NUMERIC "1"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0"
-- Retrieval info: PRIVATE: CLRdata NUMERIC "0"
-- Retrieval info: PRIVATE: CLRq NUMERIC "0"
-- Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0"
-- Retrieval info: PRIVATE: CLRrren NUMERIC "0"
-- Retrieval info: PRIVATE: CLRwraddress NUMERIC "0"
-- Retrieval info: PRIVATE: CLRwren NUMERIC "0"
-- Retrieval info: PRIVATE: Clock NUMERIC "0"
-- Retrieval info: PRIVATE: Clock_A NUMERIC "0"
-- Retrieval info: PRIVATE: Clock_B NUMERIC "0"
-- Retrieval info: PRIVATE: ECC NUMERIC "0"
-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0"
-- Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0"
-- Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "1"
-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A"
-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0"
-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Stratix"
-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
-- Retrieval info: PRIVATE: MEMSIZE NUMERIC "4096"
-- Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0"
-- Retrieval info: PRIVATE: MIFfilename STRING ""
-- Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "3"
-- Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0"
-- Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "1"
-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "1"
-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "4"
-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "4"
-- Retrieval info: PRIVATE: REGdata NUMERIC "1"
-- Retrieval info: PRIVATE: REGq NUMERIC "1"
-- Retrieval info: PRIVATE: REGrdaddress NUMERIC "0"
-- Retrieval info: PRIVATE: REGrren NUMERIC "0"
-- Retrieval info: PRIVATE: REGwraddress NUMERIC "1"
-- Retrieval info: PRIVATE: REGwren NUMERIC "1"
-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
-- Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0"
-- Retrieval info: PRIVATE: UseDPRAM NUMERIC "1"
-- Retrieval info: PRIVATE: VarWidth NUMERIC "0"
-- Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8"
-- Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8"
-- Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8"
-- Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8"
-- Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0"
-- Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "1"
-- Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0"
-- Retrieval info: PRIVATE: enable NUMERIC "0"
-- Retrieval info: PRIVATE: rden NUMERIC "0"
-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE"
-- Retrieval info: CONSTANT: ADDRESS_ACLR_B STRING "NONE"
-- Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0"
-- Retrieval info: CONSTANT: INDATA_ACLR_A STRING "NONE"
-- Retrieval info: CONSTANT: INDATA_ACLR_B STRING "NONE"
-- Retrieval info: CONSTANT: INDATA_REG_B STRING "CLOCK0"
-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Stratix"
-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "512"
-- Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "512"
-- Retrieval info: CONSTANT: OPERATION_MODE STRING "BIDIR_DUAL_PORT"
-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE"
-- Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE"
-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0"
-- Retrieval info: CONSTANT: OUTDATA_REG_B STRING "CLOCK0"
-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE"
-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "OLD_DATA"
-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "9"
-- Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "9"
-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8"
-- Retrieval info: CONSTANT: WIDTH_B NUMERIC "8"
-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"
-- Retrieval info: CONSTANT: WIDTH_BYTEENA_B NUMERIC "1"
-- Retrieval info: CONSTANT: WRCONTROL_ACLR_A STRING "NONE"
-- Retrieval info: CONSTANT: WRCONTROL_ACLR_B STRING "NONE"
-- Retrieval info: CONSTANT: WRCONTROL_WRADDRESS_REG_B STRING "CLOCK0"
-- Retrieval info: USED_PORT: address_a 0 0 9 0 INPUT NODEFVAL address_a[8..0]
-- Retrieval info: USED_PORT: address_b 0 0 9 0 INPUT NODEFVAL address_b[8..0]
-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC clock
-- Retrieval info: USED_PORT: data_a 0 0 8 0 INPUT NODEFVAL data_a[7..0]
-- Retrieval info: USED_PORT: data_b 0 0 8 0 INPUT NODEFVAL data_b[7..0]
-- Retrieval info: USED_PORT: q_a 0 0 8 0 OUTPUT NODEFVAL q_a[7..0]
-- Retrieval info: USED_PORT: q_b 0 0 8 0 OUTPUT NODEFVAL q_b[7..0]
-- Retrieval info: USED_PORT: wren_a 0 0 0 0 INPUT GND wren_a
-- Retrieval info: USED_PORT: wren_b 0 0 0 0 INPUT GND wren_b
-- Retrieval info: CONNECT: @data_a 0 0 8 0 data_a 0 0 8 0
-- Retrieval info: CONNECT: Wren_a 0 0 0 0 wren_a 0 0 0 0
-- Retrieval info: CONNECT: q_a 0 0 8 0 @q_a 0 0 8 0
-- Retrieval info: CONNECT: q_b 0 0 8 0 @q_b 0 0 8 0
-- Retrieval info: CONNECT: @address_a 0 0 9 0 address_a 0 0 9 0
-- Retrieval info: CONNECT: @data_b 0 0 8 0 data_b 0 0 8 0
-- Retrieval info: CONNECT: @address_b 0 0 9 0 address_b 0 0 9 0
-- Retrieval info: CONNECT: Wren_b 0 0 0 0 wren_b 0 0 0 0
-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0
-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
-- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo.vhd TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo.inc FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo.cmp TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo.bsf FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo_inst.vhd FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo_waveforms.html TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo_wave*.jpg FALSE
-- Retrieval info: LIB_FILE: altera_mf




Теперь в архитектурном теле меняем конкретизацию компонента с obj_ci : entity work.vdp_colinfo

на obj_ci : entity work.vdp_ext_colinfo , соответствие портов не меняем.

Вразделе описаний -- SPRITE ENGINE первой части -- PART 1 меняем объявление сигналов

signal OBJ_COLINFO_D_A : std_logic_vector(6 downto 0);
signal OBJ_COLINFO_D_B : std_logic_vector(6 downto 0);

signal OBJ_COLINFO_Q_A : std_logic_vector(6 downto 0);
signal OBJ_COLINFO_Q_B : std_logic_vector(6 downto 0);

на


signal OBJ_COLINFO_D_A : std_logic_vector(7 downto 0);
signal OBJ_COLINFO_D_B : std_logic_vector(7 downto 0);

signal OBJ_COLINFO_Q_A : std_logic_vector(7 downto 0);
signal OBJ_COLINFO_Q_B : std_logic_vector(7 downto 0);

Этими действиями мы расширили размер ячейки буфера строки спрайтового слоя OBJ_COLINFO до 8 бит.
Теперь можно переписать необходимую ветвь оператора case PIXDIV is в разделе реализации -- PIXEL COUNTER AND OUTPUT на

when "0011" =>
if OBJ_COLINFO_Q_B(3 downto 0) /= "0000" and OBJ_COLINFO_Q_B(6) = '1' then
case PBS_MODE is
when "00" =>
T_COLOR <= CRAM( CONV_INTEGER('0' & OBJ_COLINFO_Q_B(5 downto 0)) );
when "01" =>
T_COLOR <= CRAM( CONV_INTEGER(OBJ_COLINFO_Q_B(7) & OBJ_COLINFO_Q_B(5 downto 0)) );
when "10" =>
T_COLOR <= CRAM( CONV_INTEGER(not (OBJ_COLINFO_Q_B(7)) & OBJ_COLINFO_Q_B(5 downto 0)) );
when "11" =>
T_COLOR <= CRAM( CONV_INTEGER('1' & OBJ_COLINFO_Q_B(5 downto 0)) );
when others => null;
end case;
elsif BGA_COLINFO_Q_B(3 downto 0) /= "0000" and BGA_COLINFO_Q_B(6) = '1' then
T_COLOR <= CRAM( CONV_INTEGER('0'& BGA_COLINFO_Q_B(5 downto 0)) );
elsif BGB_COLINFO_Q_B(3 downto 0) /= "0000" and BGB_COLINFO_Q_B(6) = '1' then
T_COLOR <= CRAM( CONV_INTEGER('0'& BGB_COLINFO_Q_B(5 downto 0)) );
elsif OBJ_COLINFO_Q_B(3 downto 0) /= "0000" then
case PBS_MODE is
when "00" =>
T_COLOR <= CRAM( CONV_INTEGER('0' & OBJ_COLINFO_Q_B(5 downto 0)) );
when "01" =>
T_COLOR <= CRAM( CONV_INTEGER(OBJ_COLINFO_Q_B(7) & OBJ_COLINFO_Q_B(5 downto 0)) );
when "10" =>
T_COLOR <= CRAM( CONV_INTEGER(not (OBJ_COLINFO_Q_B(7)) & OBJ_COLINFO_Q_B(5 downto 0)) );
when "11" =>
T_COLOR <= CRAM( CONV_INTEGER('1' & OBJ_COLINFO_Q_B(5 downto 0)) );
when others => null;
end case;
elsif BGA_COLINFO_Q_B(3 downto 0) /= "0000" then
T_COLOR <= CRAM( CONV_INTEGER('0'& BGA_COLINFO_Q_B(5 downto 0)) );
elsif BGB_COLINFO_Q_B(3 downto 0) /= "0000" then
T_COLOR <= CRAM( CONV_INTEGER('0'& BGB_COLINFO_Q_B(5 downto 0)) );
else
T_COLOR <= CRAM( CONV_INTEGER('0'& BGCOL) );
end if;

Что соответствует приближенной к коду схеме:

https://i.postimg.cc/fDhmGyHK/GREAT-MUX-2.png

В тех источниках информации о пикселях( BGA_COLINFO, BGB_COLINFO, BGCOL) у которых размерность выходных данных на входе в каналы мультиплексора меньше 7 бит, дополняем старшим нулевым разрядом до 7 бит.

Smalovsky
16.08.2025, 17:16
Добрался до спрайтового движка.
Спрайтовый движок делится на две части. В первой части происходит считывание четырёх первых байтов атрибутов спрайта пословно из видеопамяти. Сначала Считывается первое слово - позиция Y срайта, затем второе слово включающее в себя атрибуты размера спрайта и ссылку на следующий по приоритету спрайт. Каждое слово сохраняется в свою однопортовую память в более плотном виде. Необходимо проследить, чтобы при уплотнении слова атрибутов не пропал новый атрибут - бит переключения банков.
Так как новый атрибут - бит переключения банков, расположен в третьем байте атрибутов или во втором сохраняемом слове атрибутов, то необходимо найти место где считывается это слово. Это происходит в разделе реализации -- SPRITE ENGINE - PART ONE в операторе case:

case SP1C is
...
when SP1C_SZL_RD =>
if SP1_DTACK_N = '0' then
-- OBJ_SZ_LINK( CONV_INTEGER( SP1_X(7 downto 1) ) ) <= SP1_VRAM_DO(11 downto 8) & SP1_VRAM_DO(6 downto 0);
OBJ_SZ_LINK_ADDR_WR <= "00" & SP1_X(7 downto 1);
OBJ_SZ_LINK_D <= "00000" & SP1_VRAM_DO(11 downto 8) & SP1_VRAM_DO(6 downto 0);
OBJ_SZ_LINK_WE <= '1';

OBJ_CUR <= SP1_VRAM_DO(6 downto 0);
SP1C <= SP1C_LOOP;
end if;
...
end case;

В строке
OBJ_SZ_LINK_D <= "00000" & SP1_VRAM_DO(11 downto 8) & SP1_VRAM_DO(6 downto 0);
Сделаем необходимые изменения
OBJ_SZ_LINK_D <= "0000" & VRAM_DO(15) & SP1_VRAM_DO(11 downto 8) & SP1_VRAM_DO(6 downto 0);
так как при уплотнении данных не включался новый атрибут.
Во второй части спрайтового движка поисходит считывание остальных слов атрибутов и форимирование буфера строки OBJ_COLINFO.
В разделе объявлений -- SPRITE ENGINE подраздел -- PART 2 вводим новый сигнал, отвечающий за бит прпеключения банков:

signal OBJ_BS : std_logic;


Теперь необходимо найти место, где извлекается сохранённое ранее и уплотненное второе слово атрибутов, чтобы назначить сигнал OBJ_BS.
Такое место есть в раздел реализации -- SPRITE ENGINE - PART TWO:

case SP2C is
...
when SP2C_Y_RD4 =>
OBJ_Y_OFS <= "010000000" + ("0" & SP2_Y) - OBJ_Y_Q(8 downto 0);
OBJ_HS <= OBJ_SZ_LINK_Q(10 downto 9);
OBJ_VS <= OBJ_SZ_LINK_Q(8 downto 7);
OBJ_LINK <= OBJ_SZ_LINK_Q(6 downto 0);
SP2C <= SP2C_Y_TST;
...
end case;

Делаем необходимое добавление с назначением сигнала OBJ_BS:
...
OBJ_Y_OFS <= "010000000" + ("0" & SP2_Y) - OBJ_Y_Q(8 downto 0);
OBJ_BS <= OBJ_SZ_LINK_Q(11);
OBJ_HS <= OBJ_SZ_LINK_Q(10 downto 9);
OBJ_VS <= OBJ_SZ_LINK_Q(8 downto 7);
OBJ_LINK <= OBJ_SZ_LINK_Q(6 downto 0);
SP2C <= SP2C_Y_TST;
...


В том же операторе case находим ветвь

when SP2C_PLOT =>

и вложенное условие, где формируется информация о пикселе в буфере строки OBJ_COLINFO:

if OBJ_COLINFO_Q_A(3 downto 0) = "0000" then
OBJ_COLINFO_WE_A <= '1';
OBJ_COLINFO_D_A <= OBJ_PRI & OBJ_PAL & OBJ_COLNO;
else
if OBJ_COLNO /= "0000" then
SCOL_SET <= '1';
end if;
end if;

Делаем необходимые изменения третьей строке:

OBJ_COLINFO_D_A <= OBJ_BS & OBJ_PRI & OBJ_PAL & OBJ_COLNO;

Smalovsky
26.08.2025, 16:11
Дошло дело до компиляции. И я столкнулся с траблом... Проект-то зависит от субмодулей. Посмотрите https://github.com/Torlus/fpgagen/blob/master/.gitmodules
Короче, начал разбираться в чём дело. Автор пишет:

The project depends on submodules, so you need to type in the following commands after checkout.

cd fpgagen
git submodule init
git submodule update


Перевод:

Проект зависит от подмодулей, поэтому после извлечения вам нужно будет ввести следующие команды. cd fpgagen git submodule init git submodule update

Что-бы это сделать, нужно установить гит декстоп. Скачал две версии, и ни одна не установилась... Пробую вручную скачать подмодули и кинуть их в нужные папки. Может, проканает?

Нужна помощь. Если кто может, скачайте репозиторий https://github.com/Torlus/fpgagen и выполните подключение подмодулей. Этот репозиторий с установленными модулями потом скиньте мне в архиве через какой файлообменник или на почту. Адрес электоронной почты напишу в личку тем кто захочет помочь. Вы поможете не только мне, но и тем кто желает увидеть новый видеорежим.

Hunta
26.08.2025, 20:02
https://git-scm.com/downloads
Именно оттуда и именно установился

Smalovsky
30.08.2025, 15:41
Hunta, я не могу установить. Хотя ,возможно, проблема из-за того что я скачал квартус 9.1, а для проекта на мистере надо квартус 11.1. У меня открывается проект для альтеры де1, но не открывается для мистера.

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

Пока буду собирать для альтеры де1. Дальше видно будет. Как вижу новый видеорежим для сеги только мне интересен.

Hunta
30.08.2025, 15:48
Хотя ,возможно, проблема из-за того что я скачал квартус 9.1, а для проекта на мистере надо квартус 11.1.
А какое отношение имеет клиент git к Quartus-у и его открытию или не открытию проекта из другой версии?

Я клиентом git-а могу скачать с github репозитории никоим боком не относящиеся к VS, но если проект VS, то могу клиентом, а могу непосредственно самой VS

А на другом компе стоит только клиент git-а - и могу качать репозитории и без VS

Smalovsky
30.08.2025, 15:57
А какое отношение имеет клиент git к Quartus-у и его открытию или не открытию проекта из другой версии?
Проект для мистера не открывается в квартусе 9.1. Вот два варианта решения: 1. Установить подмодули с гит; 2 Обновить квартус. Гит не установливается...
Удивительно, но для альтеры де1 проект открывается...
Проблема, что я не могу пока обновить видовс для установки гит... Висит ещё старый проект https://zx-pk.ru/threads/35854-bunny-emerald-hunter(-official-blog).html
Пока его не доделаю не смогу установить новую виндовс...

Smalovsky
02.09.2025, 14:34
Hunta, нашёл старую версию гита. Мне посоветовали https://github.com/git-for-windows/git/releases/tag/v2.46.2.windows.1
Буду разбираться. Всё дело в дополнительных модулях. Если их не установить - проект компилируется только на альтеру де1, а если установить, то можно на мист компилировать.
А тебе, вообще, хоть интересен топик?

Hunta
02.09.2025, 19:48
Проект для мистера не открывается в квартусе 9.1
fpgagen.qsf:
...
set_global_assignment -name ORIGINAL_QUARTUS_VERSION "12.0 SP1"
set_global_assignment -name PROJECT_CREATION_TIME_DATE "00:29:53 MAY 10, 2013"
set_global_assignment -name LAST_QUARTUS_VERSION "13.0 SP1"
...

Но и 13.0 sp1 не собирает ни один из вариантов. Причём для Myst он хотя бы дальше уходит в процессе

Smalovsky
04.09.2025, 15:35
Hunta, там вообще трешак. Для подмодуля jt12 нужны подмодули jt49 и jt89...
Вариант этого клона есть для ксиликса.
Если в ксиликсах разбираешься можешь компильнуть. Ссылка на форум https://gendev.spritesmind.net/forum/viewtopic.php?t=1327
Прямая ссылка на проект https://sourceforge.net/p/teamgenesis/code/HEAD/tree/
Посмотри, ВДП точно такой как для альтеры https://sourceforge.net/p/teamgenesis/code/HEAD/tree/trunk/vdp.vhd
Все мои правки можно применить и получить клон с новым видеорежимом на ксиликсе. Но я не спец по ксиликсам...
Для ксиликса можно картриджи! Почитай описание клона https://course.ece.cmu.edu/~ece545/F16/reports/F12_Genesis.pdf

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

Я ещё немного помучаю эти исходники. Если не смогу скомпилировать для миста, возьму за основу другой проект https://github.com/MiSTer-devel/Genesis_MiSTer Я его сразу хотел взять за основу, но там мешанина из вхдл и верилога, что будет сильнее напрягать.

Hunta
04.09.2025, 22:55
Если в ксиликсах разбираешься
Нет

Hunta
05.09.2025, 09:45
мешанина из вхдл и верилога
Обычное дело. Но - какие проблемы разобраться? Мануалы в руки и вперёд

Smalovsky
06.09.2025, 16:46
Hunta, хорошие новости. Я нашёл форк проекта https://github.com/robinsonb5/fpgagen
Робинсон сделал форк. Он пишет в блоге, что запорол конфигурации для де1 и де2, и проект компилируется для хамелеона и мистера.
Его блог https://retroramblings.net/?p=1201
Также фобоз делал форк https://github.com/phoboz/fpgagen
Но что он там менял не написал.
Вот, вопрос - где скачать квартус 13 и выше?

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

Я Робинсону вопрос отправил в блог - какой квартус использовал. Пока пишет:

Ваш комментарий ожидает модерации. Это предварительный просмотр; ваш комментарий будет виден после одобрения.

Трудов жалко. Попробую вытянуть проект.
Узнал, что фобоз поменял в форке из комментария Робинсона :

Phoboz портировал её на MIST, добавив мой модуль управления на базе ZPU из моих портов ядер OneChipMSX и PC Engine. Эта версия может загружать ПЗУ с SD-карты и является основой для версий с FM-звуком, но больше не помещается в DE1 даже без звука из-за нехватки блочной оперативной памяти.
Фобоз тоже запорол де1.

Smalovsky
08.09.2025, 17:26
Софтлайт ссылку на квартусы кидал https://zx-pk.ru/threads/31924-intel-ubiraet-starye-versii-quartus.html?p=1067738&viewfull=1#post1067738
Пусть будет запись, чтоб не потерять ссылку.
Ну, я, кажется, понял почему не компилируется под виндовс. В проекте есть некие утилиты, которые ,возможно, задействует квартус при компиляции. И у меня подозрение, что утилиты эти для линукса, поэтому проект можно скомпилировать только в версии квартуса для линукса...

Smalovsky
05.12.2025, 01:39
Есть способ ещё немного расширить графику генезиса. В некоторых играх используются огромные сложные спрайты, состоящие из более меньших. Причем, в составе сложного спрайта могут находится внутренние спрайты, которые не бывают граничными. Вот, пример:

https://i.postimg.cc/hGh2g3f1/hqdefault.jpg

Для таких внутренних спрайтов прозрачный цвет не нужен. Можно использовать цвет из палитры вместо прозрачного. Для внутреннего спрайта будет доступно все 16 цветов, а не пятнадцать.
Допополнительный цвет может обогатить оформление внутренних спрайтов, особенно, для мелких деталей.
Для того, что бы сделать прозрачный цвет непрозрачным, можно задействовать неиспользуемый бит в третьем байте атрибута спрайта, например, шестой бит. При нулевом значении этого бита, цвет с нулевым значением остаётся прозрачным, а при единичном значении, цвет будет браться из палитры по нулевому индексу.