![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
SuperMax |
![]()
Сообщение
#1
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 341 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Палитры V2
управление палитрами осуществляется через 2 регистра палитры первый (177234) - адрес ячейки палитры второй(177236) - значение палитры 15bit адреса ячеек палитры будут начинаться с большей Код нумерация кодов цветов палитра коды цветов (адреса ячеек палитры) 256 0-255 4х16 256-319 16 320-335 2 336-337 так получается полностью независимые палитры без пересечений + явный дубль стандартного функционала палитр, те можно переключать палитры как и ранее, но теперь доступна опция настройки каждой штатной палитры! и как следствие палитры не надо будет перегружать при переключении видеорежима для удобства формирования палитр сделал эксельку v2.6 от 2023.11.07 ![]() начиная с v15 базовая палитра изменена v2.8 от 2024.02.07 ![]() изменения косметические, касаются только палитры 256 цветов - ее начало изменено на 32 градации серого тк в стандартной WEB-safe которая взята за базу, такого набора градаций серого почему-то нет эта палитра загружена в ПЛИС, а также перегружается при запске явно. именно эта палитра используется при конвертации графики этим конверетером https://master.pdp-11.ru/picword3/picword.php основная задача этой эксельки - сформировать файл mif для загрузки дефолтной палитры при старте ПЛИС также она пригодится разработчикам для пересчета цветов в 15bit пояснения к блоку 4x16 256-319 это 16 наборов палитры, изначально туда грузятся штатные значения, но их можно менять на любые! нумерация прямая - те нулевая палитра это 256-257-258-259 ячейки следующие 4 ячейки это 1ая палитра и так далее управление палитрами осуществляется через 2 регистра 177234 - адрес ячейки палитры [9бит] 177236 - значение палитры [15бит] Код РЕГИСТРЫ УПРАВЛЕНИЯ ПАЛИТРАМИ АДРЕС = 177234 ФОРМАТ РЕГИСТРА ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ └────АДРЕС ПАЛИТРЫ───────┘ Доступен по чтению и записи АДРЕС = 177236 ФОРМАТ РЕГИСТРА ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ └──────────ЗНАЧЕНИЕ ПАЛИТРЫ────────────────┘ Доступен по чтению и записи Палитра 15bit ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ └─────RED────┘ └───GREEN───┘ └────BLUE────┘ формулу формирования цвета цвет на выходе = VideoModeOffset + PaletteOffset + ColorIndex ; VideoModeOffset - смещение видеорежима cмещение - кол-во цветов (значения десятичные) 0 - 256 256- 4 х16 320- 16 336- 2 PaletteOffset существует только для штаного видеорежима 4 цвета во всех остальных случаях =0 номер палитры - смещение 0 - 0 1 - 4 2 - 8 итд ColorIndex - непосредственно номер цвета в видеорежиме, начиная с 0 Примеры работы с палитрой надо загрузить новые значения для 16ти цветной палитры для этого мы последовательно пишем 320.-> 177234 те устанавливаем адрес палитры теперь мы можем записать значение <новое значение> -> 177236 (также после установки адреса палитры мы можем ее и считать) Примеры работы с экселькой к примеру делаем новые значения для 16ти-цветой палитры ![]() слева вводим стандартные RGB значения в hex справа получаем как этот цвет выглядит (надо включить макросы) и восьмеричные значения цвета номер палитры - в столбце номер цвета Как включить макросы в эксельке идем в настройки ![]() ![]() ![]() Утилита-пикер формирующая 15ти-битный цвет AZБК от автора БК-Арена ![]() -------------------- Живы будем - Не помрем !
|
![]() ![]() |
SuperMax |
![]()
Сообщение
#2
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 341 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Блиттер (описание соответствует версии v15b9 и далее)
cм https://forum.maxiol.com/index.php?s=&showt...indpost&p=58488 редакция от 2025-05-26 для прошивки 19b1 Блиттер в мой реализации есть робот читающий набор команд и выполняющих их по окончанию отображения кадра в отличии от классического блиттера в амиге, где команды подаются в режиме реального времени Примеры применения блиттера с исходниками вот ТУТ изначальные ограничения: 1. блиттер оперирует только словами, иначе говоря минимальная дискретность по горизонтали - 2пикселя (в видеорежиме 256цветов) *все расчеты в блиттере ведутся словами.* 2.команда блиттера - 8. слов 3. блиттер может работать в автоматическом или ручном режиме запуска. автоматический режим запуска производится по факту окончания отображения видимой части кадра. ручной запуск производится по факту установки бита 12 в регистре управления блиттером (177270) и при установленном бите 14. Бит 14 доступен и по чтению и по записи, тогда как бит 12 будет всегда читаться как 0. 4. после получения сигнала к запуску блиттера, он сначала читает пакет команд в память ПЛИС, а зачем начинает выполнять пакет команд. как только блиттер начал что-то делать, блиттер устанавливает флаг своей работы (занятости) - бит 15 в регистре управления блиттером (177270), данный бит доступен по чтению, записать туда не получится. Для организации конвейерной обработки, есть бит 9 который устанавливается во время чтения пакета команд в буфер и означает запрет на изменения в этом пакете. 5. блиттер работает в плоском адресном пространстве со словами 16бит и адресом 24 бита иначе говоря он видит всю память [расширенную - те 32МБ] сразу. 6. макс количество команд - 511. (нулевое количество команд = выключение блиттера) 8. макс количество слов в команде - те обрабатываемое в пакете - 256*256=65536 cлов 9. хранение исходных (SRC) спрайтов строго линейное и кратное 32м словам те спрайт должен начинаться с адреса кратному 100(8) 9. расположение целевых данных (DST) прямоугольное - те строка cпрайта (ширина спрайта) + строчная инкрементация. важно для понимания: ширина спрайта + строчная инкрементация = длина строки в данном видеорежиме. 10. максимальная шbрина спрайта - 256. слов 11. максимальная строчная инкрементация - 256. слов 12. максимальное количество строк - 256. 13. операции: - заполнение константой - копирование из SRC в DST (дискретность - слово) - наложение SRC на DST и помещение результата в DST при SRC!=константа прозрачного цвета (дискретность - байт) - наложение SRC на DST и помещение результата в DST при SRC!=константа прозрачного цвета и DST==константа прозрачного цвета (дискретность - байт) - копиирование из прямоугольного DST в линейный SRC (сохранение фона) (дискретность - слово) - NOP - пропуск команды что означает дискретность: слово - те операция всегда пишет слово (2 байта) байт - означает, что тут проверяется каждый байт на соответствие правил и пишутся только те байты которые выполнили условия иначе говоря наложение спрайта на фон будет без дефектов - те оно попиксельное! 14. под блок команд блиттера выделяется страница (технически любая cвободная, просто команды читаются с начала указанной в регистре страницы) иначе говоря набор команд можно быстро менять просто меняя номер страницы 15.После чтения строки команд в буфер ПЛИС, регистр номера страницы можно менять как угодно это сделано для того чтобы пока одна пачка команд выполняется, можно было подготовить новую пачку команд. для индикации есть бит 9 - он устанавливается во время чтения команд в буфер.данный бит доступен по чтению, записать туда не получится.при cброшеном бите 9 можно менять значение регистра количества команд на новое, однако если установить =0 как количество команд - блиттер асинхронно остановится. во время своей работы блиттер устанавливает флаг - бит 15 в регистре управления блиттером (177270), данный бит доступен по чтению, записать туда не получится. 16. чтение пачки команд производится в память ПЛИС при выполнении условий: автоматический режим: бит 14=0, количество команд не равно =0 и поступает флаг окончания отображения видимой части от VGA контроллера ручной режим: бит 14=1, количество команд не равно =0 и затем установка бита 12 в регистре управления блиттером (177270) 17. процесс выполнения пачки команд не останавливается кроме как установкой количества команд в 0. если мы зафигачим 100 команд которые будут выполняться 5 кадров (к примеру) то чтение новой пачки не начнется пока вся пачка команд не выполнится. также изменения режимов ручной/автоматический или попытка ручного запуска будут проигнорированы! 18. правильный ручной запуск блиттера осуществляется так: - устанавливаем ручной режим - те бит 14 (в регистре управления блиттером (177270)) - следующей командой (!) устанавливаем бит 12=1 (запуск) и количество команд /данная технология необходима для исключения гонок внутри логики запуска блиттера/ допускается разбить на 3 этапа - устанавливаем ручной режим - те бит 14 (в регистре управления блиттером (177270)) - устанавливаем количество команд - устанавливаем бит 12=1 (запуск) 19. выполнение большого пакета команд блиттером: - готовим пачку команд в страницу - запускаем блиттер см п18 - ждем cброса флага занятости буфера бит 9=1 в регистре управления блиттером (177270) (смысл в том что чтение пакета команд в память ПЛИС занимает некоторое время) - устанавливаем в регистр номера страницы новую страницу с пачкой команд - устанавливаем новое (не нулевое) количество команд в пакете - ждем снятия флага работы блиттера бит 15=0 в регистре управления блиттером (177270) - запускаем блиттер снова устанавливая бит 12=1 в регистре управления блиттером (177270) 20. для удобства работы с координатами добавлена явная координата Y в 7е слово, она ориентирована на видеорежим 256 слов в строке базовый адрес формирует иначе говоря это часть базового адреса для удобства addr_mem_dst<=addr_dst+{spr_Yadd,8'd0}; 21. Команда 51 - предназначена для заливки константой по контуру спрайта, данный способ отметить пересечение или попадание было характерным для игр 80х годов к примеру тут https://www.youtube.com/watch?v=LtetK6-x6bs&t=146s герой засвечивается белым во время столкновения с шерифом 22. Зеркалирование по горизонтали. для реализации зеркалирования введен флаг [бит 9 командного слова] который переключает счетчик выведенных слов на вычитание. иначе говоря меняется направление вывода спрайта. если в обычном режиме вывод спрайта начинается с верхнего ЛЕВОГО угла и идет слева направо, те в сторону увеличения адреса, то при включении зеркалирования по горизонтали он начинается с ПРАВОГО и идет влево. Соответственно начальная координата для вывода спрайта должна указываться исходя из этого понимания. Важно понимать как работает спрайтовый вывод: у нас есть 2 счетчика - счетчик ширины спрайта - который считает слова самого спрайта и счетчик строк. для упрощения понимания рассмотрим случай (см пример 11) где спрайт шириной 100 байт = 50 слов. в обычном выводе Код ;5 слово ;младший байт - длина спрайта в словах по горизонтали минус 1 ;старший байт - количество cтрок movb #49.,@#120010; длина спрайта в словах по горизонтали 50-1 movb #50.,@#120011; количество cтрок - в нашем случае это 50. ;6 слово - инкрементация адреса назначения после копирования строки спрайта ;считаем - видережим 256px по горизонтали, соответственно 128 слов: 128.-49.=79. mov #79.,@#120012; то в случае зеркалирования по горизонтали нам надо задать параметры иначе: Код ;5 слово ;младший байт - длина спрайта в словах по горизонтали минус 1 ;старший байт - количество cтрок movb #49.,@#120030; длина спрайта в словах по горизонтали 50-1 movb #50.,@#120031; количество cтрок - в нашем случае это 50. ;6 слово - инкрементация адреса назначения после копирования строки спрайта ;считаем - видережим 256px по горизонтали, соответственно 128 слов: 128.+49.=177. mov #177.,@#120032; Важный момент! при зеркалировании надо включить еще и перестановку байтов - см [бит 6 командного слова] 23. Зеркалирование по вертикали. тут отличие от обычного вывода иное - вывод начинается с левого НИЖНЕГО угла. Код ;5 слово ;младший байт - длина спрайта в словах по горизонтали минус 1 ;старший байт - количество cтрок movb #49.,@#120050; длина спрайта в словах по горизонтали 50-1 movb #50.,@#120051; количество cтрок - в нашем случае это 50. ;6 слово - инкрементация адреса назначения после копирования строки спрайта ;считаем - видережим 256px по горизонтали, соответственно 128 слов: 128.+49.=177. mov #177.,@#120052; строчное изменение адреса тоже 177 потому что адрес уменьшается на строку + смещение от самой ширины спрайта 24. Можно включить зеркалирование по вертикали и по горизонтали одновременно. Вывод спрайта начинается с ПРАВОГО НИЖНЕГО угла. Код ;5 слово ;младший байт - длина спрайта в словах по горизонтали минус 1 ;старший байт - количество cтрок movb #49.,@#120070; длина спрайта в словах по горизонтали 50-1 movb #50.,@#120071; количество cтрок - в нашем случае это 50. ;6 слово - инкрементация адреса назначения после копирования строки спрайта ;считаем - видережим 256px по горизонтали, соответственно 128 слов: 128.-49.=79. mov #79.,@#120072; тут направления смещения совпадают (и строки уменьшают адрес и слова спрайта) и длина строчного смещения вычисляется вычитанием ширины спрайта из физической ширины строки. Управление блиттером осуществляется через два регистра 177270 - регистр управления, регистр сбрасывается в 0 по низкому B_HALT_L (системный сброс в БК) 177272 - номер страницы содержащей команды запись 0 в 177270 вызывает полный асинхронный сброс/останов всех процессов блиттера Код РЕГИСТР УПРАВЛЕНИЯ БЛИТТЕРОМ АДРЕС = 177270 ФОРМАТ РЕГИСТРА доступен по чтению и записи ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ │ │ │ │ │ │ │ │ ╔╧════════════════════════╧╗ │ │ │ │ ║ Количество команд R/W ║ │ │ │ │ ║ =0 выключен ║ │ │ │ │ ╚══════════════════════════╝ │ │ │ │ ╔═════════════════════════╗ │ │ │ └──╢ Флаг не трогать команду ║ │ │ │ ║ =1 R/O ║ │ │ │ ╚═════════════════════════╝ │ │ │ ╔══════════════════════════╗ │ │ └──────────╢ Ручной пуск блиттера W/O ║ │ │ ║ =1 пуск, по чтению =0 ║ │ │ ╚══════════════════════════╝ │ │ ╔══════════════════════════════════╗ │ └────────╢ Режим: Автоматический/Ручной R/W ║ │ ║ =1 ручной =0 пуск по концу кадра ║ │ ╚══════════════════════════════════╝ │ ╔════════════════════════════════════╗ └─────────╢ Блиттер выполняет пакет команд R/O ║ ║ или читает пактет команд в буфер ║ ║ =1 занят ║ ╚════════════════════════════════════╝ РЕГИСТР СТРАНИЦЫ КОМАНД БЛИТТЕРА АДРЕС = 177272 ФОРМАТ РЕГИСТРА доступен по чтению и записи ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ ╔╧════════════════════════════════════╧╗ ║ Номер страницы с командами блиттера ║ ╚══════════════════════════════════════╝ пояснение к флагам - бит 15 и 9 в 177270 бит 15 бит занятости блиттера - он установлен в =1 всегда когда блиттер занят чем-либо: читает команды в буфер или уже выполняет команды бит 9 бит фиксации пачки команд, =1 означает, что блиттер читает пачку команд в буфер и сейчас ничего с командами делать ничего нельзя. данный бит предназначен для организации конвейерной обработки пакетов команд; далее в описании рассматриваем видеорежим разрешение 512х384 256цветов, 196кБ экран, квадратный пиксель как основное команда блиттера cодержит 8 слов Код Команда блиттера #1 адреса ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ │ │ ┌─┴─────────────────────┤ ├─────────────────────┴─┐ │ адрес SRC └┬┘ адрес SRC │ │ 23 22 21 20 19 18 17 16│ 23 22 21 20 19 18 17 16│ └────────────────────────┴────────────────────────┘ #2 адреса ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ ┌┴─────────────────────────────────────────────┴┐ │ адрес SRC │ │15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00│ └───────────────────────────────────────────────┘ #3 адреса ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ ┌┴─────────────────────────────────────────────┴┐ │ адрес DST │ │15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00│ └───────────────────────────────────────────────┘ #4 команда ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╔═══════════════╧╗ │ │ │ │ │ │ │ │ │ │ ║ зеркалирование ║ │ │ │ │ │ │ │ │ │ │ ║ по вертикали ║ │ │ │ │ │ │ │ │ │ │ ╚════════════════╝ │ │ │ │ │ │ │ │ │ │ ╔══════════════════╧╗ │ │ │ │ │ │ │ │ │ ║ зеркалирование по ║ │ │ │ │ │ │ │ │ │ ║ горизонтали ║ │ │ │ │ │ │ │ │ │ ╚═══════════════════╝ │ │ │ │ │ │ │ │ │ ╔═════════════════════╧══╧╗ │ │ │ │ │ │ │ ║ резерв ║ │ │ │ │ │ │ │ ╚═════════════════════════╝ │ │ │ │ │ │ │ ╔═══════════════════════════╧╗ │ │ │ │ │ │ ║ Перестановка байтов ║ │ │ │ │ │ │ ╚════════════════════════════╝ │ │ │ │ │ │ ╔══════════════════════════════╧══╧══╧╗ │ │ │ ║ Код операции над данными ║ │ │ │ ╚═════════════════════════════════════╝ │ │ │ ╔═════════════════════════════════════╗ │ │ │ ║ Флаг NOP - безусловный пропуск ╟─┘ │ │ ╚═════════════════════════════════════╝ │ │ ╔═════════════════════════════════════╗ │ │ ║ Флаг - нужно считать DST ╟────┘ │ ╚═════════════════════════════════════╝ │ ╔═════════════════════════════════════╗ │ ║ Флаг - нужно считать SRC ╟───────┘ ╚═════════════════════════════════════╝ #5 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ │ │ ┌─┴─────────────────────┤ ├─────────────────────┴─┐ │ количество строк └┬┘ длина спрайта в │ │ в спрайте │ словах по горизонтали │ └────────────────────────┴────────────────────────┘ #6 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ │ │ ┌─┴─────────────────────┤ ├─────────────────────┴─┐ │ RESERVED └┬┘ инкрементация адреса │ │ │ назначения после │ │ │ копирования строки │ │ │ спрайта │ └────────────────────────┴────────────────────────┘ #7 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ ┌─┴─────────────────────────────────────────────┴┐ │ Y координата для видеорежима 256. │ │ слов в строке │ └────────────────────────────────────────────────┤ #8 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ │ │ ┌─┴─────────────────────┤ ├─────────────────────┴─┐ │ константа прозрачного └┬┘ константа заполнения │ │ цвета DST │ или константа │ │ (для 51й - DST) │ прозрачного цвета SRC │ └────────────────────────┴────────────────────────┘ 1 слово старший байт - старшая часть адреса SRC младший байт - старшая часть адреса DST 2 слово - младшая часть адреса SRC 3 слово - младшая часть адреса DST 4 слово - команда биты 0 = 1 для команды нужно чтение SRC 1 = 1 для команды нужно чтение DST 2 = 1 флаг NOP - те наличие этого флага вызывает переход к следующей команде 3-4-5 номер команды =0 заполнение константой CONST =1 копирование SRC=>DST =2 наложение SRC на DST =>DST при (при SRC!=прозрачный цвет SRC) =3 наложение SRC на DST =>DST при (при SRC!=прозрачный цвет SRC) и (при DST=прозрачный цвет DST) =4 копирование DST => SRC (сохранение фона) =5 заполнение константой по контуру 6 - перестановка байтов - см п22 про зеркалирование 7 - резерв 8 - резерв 9 - зеркалирование по горизонтали 10 - зеркалирование по вертикали в итоге получаются команды (в 8 системе) = 0 заполнение константой = 11 копирование SRC=>DST = 21 наложение SRC на DST =>DST (при SRC!=прозрачный цвет SRC) = 33 наложение SRC на DST =>DST (при SRC!=прозрачный цвет SRC) и (при DST=прозрачный цвет DST) = 42 копирование DST=>SRC = 51 заполнение константой по контуру Пояснения - на примере команды заполнения константой: для нее не требуется установка битов чтения данных SRC или DST, тк запись данных (в данном случае константы идет безусловно). если мы поставим эти биты - ничего не произойдет для пользователя - лишь скорость выполнения команды уменьшится тк блиттер потратит время на чтение. = 11 копирование SRC=>DST тут чтобы положить данные в DST мы должны из считать из SRC - cоответственно проставляем бит чтения SRC, читать DST нам тут не надо тк нам пофиг - запись безусловная = 21 наложение SRC на DST =>DST (при SRC!=прозрачный цвет SRC) тут аналогично - нужен только SRC для проверки условия = 33 наложение SRC на DST =>DST (при SRC!=прозрачный цвет SRC) и (при DST=прозрачный цвет DST) - тут две проверки - и нам нужно считать и SRC и DST - соответственно установлены оба бита чтения зачем чтение вынесено в отдельные биты ? тупо оптимизация аппаратной части блиттера - экономия LC (бит проще проверять чем несколько битов) = 51 наложение SRC на DST =>DST (при SRC!=прозрачный цвет SRC) тут аналогично - нужен только SRC для проверки условия важно - константа заполнения в младшем байте, а константа прозрачного цвета SRC в старшем (не как в 21й команде где константа прозрачного цвета SRC в младшем байте) 5 слово младший байт длина спрайта в словах по горизонтали старший байт количество строк в спрайте 6 слово младший байт инкрементация адреса назначения после копирования строки спрайта если мы хотим вывести спрайт шриной 8. пикселей в строку длиной 256. словто мы должны указать инкрементацию - 256.-3.=253. 7 слово Y координата для видеорежима 256. слов в строке иначе говоря это часть базового 24х битного адреса для удобства addr_mem_dst<=addr_dst+{spr_Yadd,8'd0}; 8 слово младший байт - константа заполнения или константа прозрачного цвета SRC старший байт - константа прозрачного цвета DST команда 51 исключение: младший байт - константа заполнения старший байт - константа прозрачного цвета SRC Для формирования команды можно использовать калькулятор команд блиттера технология работы с блиттером - один из вариантов к примеру у нас на экране 5 спрайтов соответственно в пакете команд - 10. команд с адресами спрайтов: (первая команда - запись пустого поля, вторая запись спрайта) каждый раз спрайты перерисовываются из памяти и копируются в средний слой а для перемещения спрайта на новое место 1. чистим слой (к примеру средний) заполняя его прозрачным цветом те =0 2. пишем нижний спрайт 3. пишем верхний спрайт ..... n. пишем самый верхний спрайт иначе говоря порядок наложения спрайтов определяется порядком команд Быстродействие блиттера: за время гашения кадра точно помещается пара команд со спрайтом 3.6-4кБ соответственно для большего числа спрайтов рекомендуется буферизация те один экран отображаем - другой рисуем и переключаем соответственно вполне просто получить 60 кадров в секунду для плавности Бенчмарк блиттера: в данном тесте обрабатывается спрайт 60х60px - те объемом 3600 байт тестируется каждый вид команд в двух режимах - включены слои на видеоконтроллере и нет число показывает количество обработанных спрайтов за 1 секунду (левое число без слоем, правое со слоями) Важно! спрайт - шарик, соответственно есть пиксели и слова которые не пишутся в память, как следствие это ускоряет выполнение команд. Для понимания процессов - блиттер имеет низкий приоритет по получению доступа к оперативной памяти - дабы он не создавал проблем для основных процессов в БК/AZБК сборка запросов для приоритетного энкодера - выше номер бита - выше приоритет. Код wire [15:0] bus_ram={1'b0,rqrm, rqwm, rqrv0,rqrv1,rqrv2,rqrds, 2'd0 ,rqrddst,rqrdsrc,rqrdcmd,rqwd ,1'd0,rqrs ,rqws}; // собираем шину // МПИ чтение МПИ запись VGA VGA1 VGA2 DMA SND blitter чтение blitter запись STM чтение STM запись исходник теста с бинарником v1.00 ![]() v1.10 ![]() диск с тестами от 2025-05-26 ![]() скорость на 18й прошивке ![]() скорость на 19й прошивке ![]() cкорость на 19b1 ![]() Пояснение к математике блиттера Код // формирование данных - сама логика блиттера - данные always @ (posedge CLK_MAIN) begin if (state_blt==STATE_BLT_DATA_PRC) begin case (type_cmd[5:3]) 3'o0: // заполнение константой begin wdatadma<={spr_cnst[7:0],spr_cnst[7:0]}; // 0 - заполнение константой dqmw_dma<=2'b00; // пишем оба байта безусловно end 3'o1: // копирование из SRC в DST безусловное begin wdatadma<=rdsrc; dqmw_dma<=2'b00; // пишем оба байта безусловно end 3'o2: // наложение SRC на DST и помещение результата в DST, наложение идет только цветов которые не совпадают с прозрачным в SRC begin wdatadma<=rdsrc; dqmw_dma<={(rdsrc[15:8] == spr_cnst[7:0]) ,(rdsrc[7:0] == spr_cnst[7:0]) }; // формируем маску записи end 3'o3: // наложение SRC на DST и помещение результата в DST, наложение идет только цветов которые не совпадают с прозрачным в DST и не совпадают с прозрачным в SRC begin wdatadma<=rdsrc; dqmw_dma<={(rddst[15:8] != spr_cnst[15:8])||(rdsrc[15:8] == spr_cnst[7:0]) ,(rddst[7:0] != spr_cnst[15:8])||(rdsrc[7:0] == spr_cnst[7:0]) }; // формируем маску записи end 3'o4: // копирование из DST (блок) в SRC безусловное begin wdatadma<=rddst; dqmw_dma<=2'b00; // пишем оба байта безусловно end 3'o5: // наложение константы на DST и помещение результата в DST, наложение идет только цветов которые не совпадают с прозрачным в SRC begin wdatadma<={spr_cnst[7:0],spr_cnst[7:0]}; // 0 - заполнение константой dqmw_dma<={(rdsrc[15:8] == spr_cnst[15:8]) ,(rdsrc[7:0] == spr_cnst[15:8]) }; // формируем маску записи end default: begin wdatadma<=16'd0; // пустое значение дабы не было латча dqmw_dma<=2'b11; // неизвестные команды не вызывают запись end endcase end end // те это сам процессинг данных для понимания как работает его математика данных FAQ: Q: А можно использовать блиттер для копирования информации ? A: Да, можно ибо блиттер никак не отличает видеопамять от обычной памяти Q: Видит ли блиттер память в самой БК A: Нет, адресуется только память внутри AZБК Q: А можно использовать блиттер для видеорежимов с 2-4-16 цветами ? A: Технически никаких ограничений нет, просто все команды будут оперировать словами и к примеру команды наложения (21 и 33 ) не будут выполнены корректно тк сравнение будет по байтам, но если подогнать данные до байтов то это прокатит -------------------- Живы будем - Не помрем !
|
![]() ![]() |
Текстовая версия | Сейчас: 19.6.2025, 21:22 |