IPB

Здравствуйте, гость ( Вход | Регистрация )

> Контроллер AZ BK: Документирование процесса разработки, на основании этой темы будет сформирована техническое описание
SuperMax
сообщение 20.1.2021, 20:37
Сообщение #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
Прикрепленный файл  palette_calc26.xlsm ( 102.97 килобайт ) Кол-во скачиваний: 1541


начиная с v15 базовая палитра изменена
v2.8 от 2024.02.07
Прикрепленный файл  palette_calc28.xlsm ( 107.53 килобайт ) Кол-во скачиваний: 1511

изменения косметические, касаются только палитры 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БК

от автора БК-Арена
Прикрепленный файл  color15bit.exe ( 2.05 мегабайт ) Кол-во скачиваний: 29






--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
SuperMax
сообщение 24.9.2023, 12:33
Сообщение #2


Администратор
*****

Группа: Root Admin
Сообщений: 6 341
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



Блиттер (описание соответствует версии v15b9 и далее)
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
Прикрепленный файл  BLTSPEED_2025_05_23__1.RAR ( 1.89 мегабайт ) Кол-во скачиваний: 21

v1.10
Прикрепленный файл  BLTSPEED_2025_05_26__1.RAR ( 1.89 мегабайт ) Кол-во скачиваний: 16


диск с тестами от 2025-05-26
Прикрепленный файл  AZKV.BKD ( 800 килобайт ) Кол-во скачиваний: 16


скорость на 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 ) не будут выполнены корректно тк сравнение будет по байтам, но если подогнать данные до байтов то это прокатит




--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
SuperMax   Контроллер AZ BK: Документирование процесса разработки   20.1.2021, 20:37
SuperMax   Для Legacy видеорежимов реализовано циклическое п...   15.4.2021, 1:24
SuperMax   [b]Модель управления памятью в AZ V2 с поддержкой ...   16.4.2021, 11:52
SuperMax   Генератор псевдослучайных чисел технически это LF...   4.5.2021, 14:16
SuperMax   Консоль контроллера основное назначение - отладка...   8.5.2021, 14:10
SuperMax   Загрузка ПЗУ Пример az.ini [ROM] R00=0...   8.5.2021, 14:13
SuperMax   Стартовая последовательность 1. После нажатия RES...   14.6.2021, 0:12
SuperMax   Индикация режимов работы AZБК снабжен RGB сетодио...   19.6.2021, 15:36
SuperMax   Кнопка перезапуска (RESET) на AZ изначально, подра...   19.6.2021, 16:10
SuperMax   Проект звуковой части 1. COVOX - уже реализован н...   17.7.2021, 22:45
SuperMax   По заявкам телезрителей родилась еще более новая в...   21.12.2021, 2:48
SuperMax   UART (RS-232 EIA-232 COM ком-порт) адреса стандар...   16.1.2022, 23:56
SuperMax   К расширенным видеорежимам добавились слои (редак...   17.6.2022, 20:18
SuperMax   Блиттер (описание соответствует версии v15b9 и дал...   24.9.2023, 12:33


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 19.6.2025, 21:22