IPB

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

> Контроллер AZ BK: Документирование процесса разработки, на основании этой темы будет сформирована техническое описание
SuperMax
сообщение 20.1.2021, 20:37
Сообщение #1


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

Группа: Root Admin
Сообщений: 6 287
Регистрация: 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 килобайт ) Кол-во скачиваний: 107


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

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


Как включить макросы в эксельке
идем в настройки
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение


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


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

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



Блиттер (описание соответствует версии v15b8 и далее)
https://forum.maxiol.com/index.php?s=&showt...indpost&p=58488

редакция от 2024-05-01

Блиттер в мой реализации есть робот читающий набор команд и выполняющих их по окончанию отображения кадра в отличии от классического блиттера в амиге, где команды подаются в режиме реального времени

Примеры применения блиттера с исходниками вот ТУТ


изначальные ограничения:
1. блиттер оперирует только словами, иначе говоря минимальная дискретность по горизонтали - 2пикселя (в видеорежиме 256цветов) *все расчеты в блиттере ведутся словами.*

2.команда блиттера - 8 слов

3. блиттер может работать в автоматическом или ручном режиме запуска. автоматический режим запуска производится по факту окончания отображения видимой части кадра. ручной запуск производится по факту установки бита 12 в регистре управления блиттером (177270) и при установленном бите 14. Бит 14 доступен и по чтению и по записи, тогда как бит 12 будет всегда читаться как 0.

4. после получения сигнала к запуску блиттера, он сначала читает пакет команд в память ПЛИС, а зачем начинает выполнять пакет команд. как только блиттер начал что-то делать, блиттер устанавливает флаг своей работы (занятости) - бит 15 в регистре управления блиттером (177270), данный бит доступен по чтению, записать туда не получится. Для организации конвейерной обработки, есть бит 9 который устанавливается во время чтения пакета команд в буфер и означает запрет на изменения в этом пакете.

5. блиттер работает в плоском адресном пространстве со словами 16бит и адресом 24 бита
иначе говоря он видит всю память [расширенную - те 32МБ] сразу.

6. макс количество команд - 128.

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};

Управление блиттером осуществляется через два регистра
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 слово
старший байт - старшая часть адреса 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 (сохранение фона)

в итоге получаются команды (в 8 системе)
= 0 заполнение константой
= 11 копирование SRC=>DST
= 21 наложение SRC на DST =>DST (при SRC!=прозрачный цвет SRC)
= 33 наложение SRC на DST =>DST (при SRC!=прозрачный цвет SRC) и (при DST=прозрачный цвет DST)
= 42 копирование DST=>SRC


Пояснения - на примере команды заполнения константой: для нее не требуется установка битов чтения данных 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 (бит проще проверять чем несколько битов)



далее в примере будем рассматривать спрайт шириной 8 пикселей и высотой тоже 8 пикселей
количество слов получается (8/2)*8 = 32.


5 слово
младший байт
длина спрайта в словах по горизонтали
иначе говоря в копировании 1в1 значение должно быть 1
(речь о копировании сплошного блока целиком)
а если спрайт по горизонтали 8. пикселей то указываем 3. тк копирование идет словами по 2 пикселя

старший байт
количество строк


6 слово
младший байт
инкрементация адреса назначения после копирования строки спрайта
иначе говоря в копировании 1в1 значение должно быть 1
а если мы хотим вывести спрайт шриной 8. пикселей в строку длиной 256. слов
то мы должны указать инкрементацию - 256.-3.=253.

7 слово
Y координата для видеорежима 256. слов в строке
иначе говоря это часть базового 24х битного адреса для удобства
addr_mem_dst<=addr_dst+{spr_Yadd,8'd0};


8 слово
младший байт - константа заполнения или константа прозрачного цвета SRC
старший байт - константа прозрачного цвета DST

Для формирования команды можно использовать калькулятор команд блиттера


технология работы с блиттером - один из вариантов
к примеру у нас на экране 5 спрайтов
соответственно в пакете команд - 10. команд с адресами спрайтов:
(первая команда - запись пустого поля, вторая запись спрайта)
каждый раз спрайты перерисовываются из памяти и копируются в средний слой
а для перемещения спрайта на новое место
1. чистим слой (к примеру средний) заполняя его прозрачным цветом те =0
2. пишем нижний спрайт
3. пишем верхний спрайт
.....
n. пишем самый верхний спрайт
иначе говоря порядок наложения спрайтов определяется порядком команд


Быстродействие блиттера:
за время гашения кадра точно помещается пара команд со спрайтом 3.6-4кБ
соответственно для большего числа спрайтов рекомендуется буферизация
те один экран отображаем - другой рисуем и переключаем
соответственно вполне просто получить 60 кадров в секунду для плавности


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   Блиттер (описание соответствует версии v15b8 и дал...   24.9.2023, 12:33


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

 



Текстовая версия Сейчас: 9.5.2024, 15:50