Добрался до спрайтового движка.
Спрайтовый движок делится на две части. В первой части происходит считывание четырёх первых байтов атрибутов спрайта пословно из видеопамяти. Сначала Считывается первое слово - позиция 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;




Ответить с цитированием