Как можно доработать уже готовую игру для БК с использованием возможностей 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: все просто- надо вернуть изначальные страницы которые вы поменяли