IPB

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

> Программирование под AZБК, методики использования возможностей AZБК
SuperMax
сообщение 3.11.2023, 16:33
Сообщение #1


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

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



Работа с палитрами

документация по палитрам тут

оба регистра доступны по записи и чтению, сохранение палитры осуществляется по записи в 177236
пример изменения дефолтной палитры RGB
Код

SetPal1:        mov     #177234,R0
                mov     #177236,R1

                mov     #256.,(R0)   ; адрес палитры
                mov     #10,(R1)    ; значение палитры - был черный фон - теперь темно-синий

                inc     (R0)
                mov     #15446,(R1)     ; значение палитры - был синий - стал - зеленый

                inc     (R0)
                mov     #77454,(R1)     ; значение палитры - был зеленый - стал желтый

                inc     (R0)
                mov     #46614,(R1)     ; значение палитры - был красный - стал коричневый
                return


загрузка палитры 256 цветов
Код

                mov        #177234,R0      ; установка палитры
                mov        #177236,R1
                mov        #newpal,R2
                mov        #256.,R3
                clr        R4
$rp0:            mov        R4,(R0)
                mov        (R2)+,(R1)
                inc        R4
                sob        R3,$rp0


newpal - метка массива палитры 256 цветов (256 слов)





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


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

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



Как можно доработать уже готовую игру для БК с использованием возможностей AZБК ?
Что может помочь сократить код и поднять быстродействие ?


1. Генератор случайных чисел.
регистр 177550 отдает случайное число каждое чтение
думаю пояснений тут не требуется

2. Слои. детально слои описаны вот тут
постараюсь пояснить как их можно использовать для уже имеющейся игры для БК-0010
те игра изначально ориентирована писать всю графику в блок 40'000-77'777

напомню, AZБК занимается зеркалированием оперативной памяти в самой БК
и уже эту копию выводит на VGA

механизм зеркалирования управляемый через регистры

рассмотрим конфигурацию памяти в самом плохом случае - у нас БК-0010.01 с отключенным бейсиком
те у нас вот такое адресное пространство
Код



  АДРЕСНОЕ ПРОСТРАНСТВО БК-0010 + AZБК
┌─────────┬─────────┬───────────┬─────────────────────────────┐
│ 0-37777 │ 40k-77k │ 100k-117k │ 120k  .....             170k│
└─────────┴─────────┴───────────┴─────────────────────────────┘
  │                 │ │         │  │                          │
  └─────────────────┘ └─────────┘  └──────────────────────────┘
   Штатное ОЗУ        ПЗУ монитора       ОЗУ/ПЗУ AZБК


те ОЗУ штатное + монитор не отключен

соответственно что делает AZБК - он как вы уже знаете разбивает все адресное пространство на блоки по 4кБ

Код

Адресное пространство разбито на 16 окон
для облегчения восприятия я пронумерую их с 0 до 15


┌────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬─
│0..7777 │10000..17777│20000..27777│30000..37777│40000..47777│50000..57777│60000..67777│70000..77777│
└────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴─
  0 окно   1 окно        2 окно       3 окно       4 окно        5 окно       6 окно       7 окно
  177300   177302        177304       177306       177310        177312       177314       177316


  
──┬─────────────┬──────────────┬──────────────┬──────────────┬──────────────┬──────────────┬──────────────┬──────────────┐
  │100000-107777│110000..117777│120000..127777│130000..137777│140000..147777│150000..157777│160000..167777│170000..177000│
──┴─────────────┴──────────────┴──────────────┴──────────────┴──────────────┴──────────────┴──────────────┴──────────────┘
      8 окно         9 окно        10 окно        11 окно       12 окно        13 окно        14 окно        15 окно
      177320         177322        177324         177326        177330         177332         177334         177336


соответственно в регистрах 177300 - 177316 указаны страницы ОЗУ AZБК в которые работает SHADOW RAM

механизм SHADOW RAM это зеркалирование всех данных по этим адресам
иначе говоря мы выполняем команду

Код
MOV #123456,@#40000; пишем слово в экран

физически эта команда будет видна на шине как запись по адресу 40000(8) числа 123456(8)
соответственно контроллер SHADOW RAM выполнит эту операцию тоже и в странице памяти сопоставленной (см регистры) будет занесено число 123456(8)

по умолчанию, после старта у нас экран 40k-77k приколочен вот так
Код

           АДРЕСНОЕ ПРОСТРАНСТВО  
  ┌────────┬─────────┬─────────┬──────────┐
  │ Адреса │ регистр │  режим  │ страница │
  ├────────┼─────────┼─────────┼──────────┤
  │0-7777  │  177300 │ shadow  │   0      │
  ├────────┼─────────┼─────────┼──────────┤
  │10-17k  │  177302 │ shadow  │   1      │
  ├────────┼─────────┼─────────┼──────────┤
  │20-27k  │  177304 │ shadow  │   2      │
  ├────────┼─────────┼─────────┼──────────┤
  │30-37k  │  177306 │ shadow  │   3      │
  ├────────┼─────────┼─────────┼──────────┤
  │40-47k  │  177310 │ shadow  │   4      │
  ├────────┼─────────┼─────────┼──────────┤
  │50-57k  │  177312 │ shadow  │   5      │
  ├────────┼─────────┼─────────┼──────────┤
  │60-67k  │  177314 │ shadow  │   6      │
  ├────────┼─────────┼─────────┼──────────┤
  │70-77k  │  177316 │ shadow  │   7      │
  ├────────┼─────────┼─────────┼──────────┤
  │100-177k│  177320 │         │          │
  ├────────┼─────────┼─────────┼──────────┤
  │        │         │         │          │


ну и в регистре 177232 у нас указана страница 4 - те что отображение идет с нее

теперь внимательно:

к примеру у нас игра с фоном - пусть это какой-то дом/лабиринт - он рисуется какой-то процедурой
у нас есть NPC и есть главный герой управляемый игроком, и все они поверх фона
(соответственно у нас есть код который сохраняет фон под спрайтом дабы его потом восстановить когда спрайт переместится в другое место)

иначе говоря мы можем задействовать 3 слоя:
верхний - это главный герой
средний - это различные НПС - которые к примеру двигаются на месте (анимация на месте)
нижний - это собственно фон

и вот теперь делаем финт ушами:
0. на стадии инциализации *
- устанавливаем видеорежим
Код

mov    #12205,@#177230; включаем слоенный видережим 256х256х4цвета - те 16кБ экран
mov    #1004,@#177232; верхняя страница - доступно 3 цвета
mov    #1014,@#177240; средняя страница - доступно 3 цвета
mov    #1024,@#177242; нижняя страница - доступно 4 цвета

- устанавливаем персональные палитры для каждого
Код

; верхний слой
; нулевой цвет прозрачный и соответственно его палитру мы просто пропускаем
mov    #257.,@#177234
mov     #15446,@#177236

mov    #258.,@#177234
mov     #77454,@#177236

mov    #259.,@#177234
mov     #46614,@#177236

; средний
; нулевой цвет прозрачный и соответственно его палитру мы просто пропускаем
mov    #261.,@#177234
mov     #17446,@#177236

mov    #262.,@#177234
mov     #77474,@#177236

mov    #263.,@#177234
mov     #47614,@#177236

; нижний - тут есть все цвета
mov    #264.,@#177234
mov     #17446,@#177236

mov    #265.,@#177234
mov     #07774,@#177236

mov    #266.,@#177234
mov     #67674,@#177236

mov    #276.,@#177234
mov     #17654,@#177236


1. в процедуре вывода фона, до начала очистки-вывода вставляем
Код

mov    #1024,@#177310
mov    #1025,@#177312
mov    #1026,@#177314
mov    #1027,@#177316

те указываем что SHADOW будет делаться в страницы памяти 1024...1027
2. в процедурах работы с НПС - перед работой **
Код

mov    #1014,@#177310
mov    #1015,@#177312
mov    #1016,@#177314
mov    #1017,@#177316

3. в процедурах где отрисовывается главный герой **
Код

mov    #1004,@#177310
mov    #1005,@#177312
mov    #1006,@#177314
mov    #1007,@#177316



* стоит учитывать, что изначально на страницах 1004...1027 может быть мусор
и их надо очистить
как вы уже догадались сделать это можно двумя способами
1. подмапировать страницы явно в окно со 120k и записать туда 0
2. а можно в режиме shadow
те устанавливаем
Код

mov    #1024,@#177310
mov    #1025,@#177312
mov    #1026,@#177314
mov    #1027,@#177316

а зачем прогоняем обычный цикл очистки экрана с 40k
и так для всех 3х экранов

** так как на экране с 40k у нас будет физически каша, то ничего читать оттуда и применять точно не стоит
весь вывод на экран с 40k должен быть построен на командах MOV
никаких BIS BIC - иначе мы утащим мусор на страницы которые отображаются!

Графическое пояснение как работают слои на примере режима 12205
Прикрепленное изображение

те у нас в каждом слое цвет кодируется двумя битами, но каждый слой имеет свою палитру и всего на экране у нас будет 10 цветов из палитры 32768 цветов


FAQ

Q:
почему выбраны страницы 1024 итд?
A: просто для красоты примера, можно начать с 1000 к примеру

Q: почему запись палитр явная - mov #257.,@#177234 ?
A: только для демонстрации и для понимания процесса - те можно оптимизировать

Q: я внимательно читал что shadow режим управляется средствами AZ - не сломаем ли мы чего-нибудь ?
A: нет, не сломаем ибо мы сам режим у страниц не меняем, а меняем только сами страницы
иначе говоря если мы экран прицепим к страницам 1000...1004 это будет корретным для всех конфигурация БК11М и даже для БК10 которая в режиме эмуляции БК11М ибо все отличие будет только в том, что страницы будут реальными - а не зеркальными.

Q:
снова про shadow - можно ли менять режим shadow руками ?
A: технически - да, но необходимости в этом нет, а также надо понимать, что именно вы делаете - те надо точно определить конфигурацию машины и только потом менять иначе мы получим нерабочую конфигурацию и скорее всего зависание.

Q: как сделать корректный выход ?
A: все просто- надо вернуть изначальные страницы которые вы поменяли


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

Сообщений в этой теме


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

 



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