Помощь - Поиск - Пользователи - Календарь
Полная версия: Контроллер AZ BK: Документирование процесса разработки
MAXIOL > Техника > DEC hardware / software > БК 0010 / 11 / 11M
SuperMax
Палитры V2
управление палитрами осуществляется через 2 регистра палитры первый (177234) - адрес ячейки палитры
второй(177236) - значение палитры 15bit

адреса ячеек палитры будут начинаться с большей
Код

нумерация кодов цветов
палитра коды цветов (адреса ячеек палитры)
256     0-255
4х16    256-319
16      320-335
2       336-337


так получается полностью независимые палитры без пересечений
+ явный дубль стандартного функционала палитр, те можно переключать палитры как и ранее, но теперь доступна опция настройки каждой штатной палитры!

и как следствие палитры не надо будет перегружать при переключении видеорежима

для удобства формирования палитр сделал эксельку
v2.3
Нажмите для просмотра прикрепленного файла
новая версия v2.4 - на нее переходим
Нажмите для просмотра прикрепленного файла
v2.5 - исправил ошибку с 1й палитрой
Нажмите для просмотра прикрепленного файла

основная задача этой эксельки - сформировать файл 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
Для Legacy видеорежимов реализовано циклическое переключение по сочетанию AR2 + KT
В зависимости от запущенной программы, поведение может отличаться от стандартного, но в большинстве перехват данного сочетания работает корректно

Всего 4 видеорежима - точнее интерпретации 16кБ видеопамяти

0 - ч/б режим, по умолчанию палитра с белыми точками и темно-синим фоном
разрешение 512х256

1 - цветной режим, 4 цвета, палитра управляется как и стандартным 177662 как и через 177234/177236
разрешение 256х256


Для БК10 добавлена возможность сброса палитры на нулевую

(так как к примеру АНДОС устанавливает 5ую (все белое) при запуске на 10ке в режиме 10ки
сброс палитры по сочетанию АР2+РУС

SuperMax
Модель управления памятью в AZ V2 с поддержкой эмуляции БК11М на БК10

Правки от 2023-04-13

Концепция:
маппер V2 - это чисто маппер AZ без костылей и _все_ запросы к мапперам 177716(БК11М) или 177130(СМК) транслируются в маппер AZ который является единым устройством управления памятью
это сделано для кардинального расширения возможностей БКшек, а именно для отключения 037й
и как следствие - возможности работы полного маппера AZ. Это означает что на любой адрес в адресном пространстве БК10/БК11М можно подставить любую страницу памяти!

адресное пространство расширенной памяти разбито на 4 сегмента:
Код


   АДРЕСНОЕ ПРОСТРАНСТВО ПАМЯТИ В AZ

╔═══════════════════════════════════════════════════ .....  ════════╗
║     АДРЕСНОЕ ПРОСТРАНСТВО ПАМЯТИ В AZ                             ║
╚═══════════════════════════════════════════════════ .....  ════════╝
   0    128kB    256kB   512kB   1024kB                            32MB
  │       │        │       │        │
  └───────┤        ├───────┴────────┘
   RAM    │        │  ROMs    SMK
   Shadow │        │
          │        │
          └─SYSTEM─┘




0-128кБ (страницы 0-37) это память для организации "теневой" или эмулируемой памяти БК11М
первые 128кБ являются полной копией оперативки БК11М - или эмулируемой в БК10
из этой памяти идет отображение legacy видео режимов

что такое теневая (shadow) память:
суть в том, что все обращения к оперативной памяти есть на шине МПИ
запросы это конкретный цикл обмена по шине - те выставление SYNC+адрес, подтверждение RPLY
и затем DOUT и DIN те нормальный режим работы.
теневая память это память куда пишется (те производится выполнение цикла SYNC+DOUT) с получением адреса и данных которые пишутся в память. те технически это копия по-записи реальной памяти в БК.

так как у нас есть копия - то получается есть техническая возможность отобразить на экран любую страницу памяти БК11М
Нажмите для просмотра прикрепленного файла
обращаю внимание на то, что физический адрес - словный
режим работы этой памяти устанавливается в регистре 177346

128-256кБ (страницы 40-77) это полноценная R/W память с которой всегда идет RPLY
но эта память служебная и используется для работы AZ контроллера

256-512кБ (страницы 100-177) это read-only память, она не доступна на запись со стороны БКшки
эта память для эмуляции различных ПЗУ, содержимое которых может быть загружено только средствами AZ

512-1024кБ (страницы 200-377) для эмуляции SMK-512

Начиная с 1МБ (страницы 400-17777) вся оперативная память - полноценная R/W память без ограничений, а именно ее подключение всегда дает RPLY на чтение и на запись если не установлен режим r/o на данной странице в регистре 177342



маппер памяти AZ
технически адрес в системе 24bit-а (адрес слова 16bit)
для маппера памяти используется старшая часть адреса, и получается дискретность привязки памяти к окну - 4кБ

есть 16 регистров (177300-177336 R/W) куда пишется 13bit адрес начала (11 бит добавляется от адреса с шины и получается 24bit адрес слова)
старшие 3 бита в резеве и маппер предусматривает расширение до 256МБ.

Код



  ПРИНЦИП ФОРМИРОВАНИЯ ПОЛНОГО 24bit  АДРЕСА  16bit слова
  ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
  │23│22│21│20│19│18│17│16│15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│
  └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
   │                                    │ │                              │
   └────────────────────────────────────┘ └──────────────────────────────┘
      АДРЕС В РЕГИСТРЕ ОКНА 13bit             АДРЕС С ШИНЫ МЛАДШИЕ 11bit




Адресное пространство разбито на 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







         Регистр управления активацией окно - маски окон
         АДРЕС = 177340 R/W
         ФОРМАТ РЕГИСТРА
       ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
       │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│
       └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

       пример: для подключения оперативки в окно №14 - 160000-167777
       надо сделать следующее:
    177334 <- 400 (это указатель на первый мегабайт)
    177340 <- 40000 (это разрешение этого окна - 14 бит)
    177342 <- сброс бита 14 тк мы хотим оперативку а не ПЗУ


        
         Регистр управления r/o на окно
         АДРЕС = 177342 R/W
         ФОРМАТ РЕГИСТРА
       ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
       │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│
       └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
      
       пример: для подключения оперативки в режиме ПЗУ
       в окно №14 - 160000-167777 надо сделать следующее:
    177334 <- 400 (это указатель на первый мегабайт)
    177340 <- 40000 (это разрешение этого окна - 14 бит)
    177342 <- 40000 (это установка r/o тк мы хотим ПЗУ)



         Регистр управления shadow окон - маски окон
         АДРЕС = 177344 R/W
         ФОРМАТ РЕГИСТРА
       ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
       │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│
       └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

shadow это режим копирования всех операций записи в зеркальную память  - см

   АДРЕСНОЕ ПРОСТРАНСТВО ПАМЯТИ В AZ

╔═══════════════════════════════════════════════════ .....  ════════╗
║     АДРЕСНОЕ ПРОСТРАНСТВО ПАМЯТИ В AZ                             ║
╚═══════════════════════════════════════════════════ .....  ════════╝
   0    128kB    256kB   512kB   1024kB                            32MB
  │       │                      
  └───────┘        
  SHADOW RAM              
          
Это нужно для работы на БК11М и формирования изображения на VGA экране

shadow страницы устанавливаются автоматически при работе с маппером БК11М






для управления маппером предусмотрен регистр маски окон - 177340 R/W
младший бит соответствует младшему окну (те с 0 до 7777)

пример: для подключения оперативки в окно 160000-167777 надо сделать следующее:
177334 <- 400 (это указатель на первый мегабайт)
177340 <- 40000 (это разрешение этого окна)

для управления r/o на выбранном окне предусмотрен регистр-маска 177342
соответственно для установки режима только чтения надо установить соответствующий бит на окне
к примеру
177334 <- 400 (это указатель на первый мегабайт)
177340 <- 40000 (это разрешение этого окна)
177342 <- 40000 это запрет записи в это (160000-167777) окно



разбивка на окна соответствует размеру в SMK - те 4кБ начиная со 100000(8)
обращаю внимание на адресацию, те свойства r/o w/o привязаны к 24bit адресу слова (!)
также есть регистр управления который осуществляет включение/выключение окон по маске (177342) + для общего управления и совместимостью с SMK

регистр управления shadow режимом 177344 R/W
это тоже битовая маска окон, и младший бит соответствует младшему окну
назначение регистра - управление работой shadow-режима для БК11М

как уже было сказано - маппер V2 это полный маппер
и соответственно в режиме БК11М - первые 128кБ это тень памяти БК11М
для этого в регистры 177330 и далее прописываются соответствия страниц памяти в которые будет "откидываться" вся запись в память БК11М и будет обеспечиваться ее копия в памяти AZ.

к примеру
177300 <=13'o030; // 000000-007777
177302 <=13'o031; // 010000-017777
177304 <=13'o032; // 020000-027777
177306 <=13'o033; // 030000-037777
те это нулевая страница в понятии БК11М
и соответственно в 177344 устанавливаются биты shadow-режима

управление shadow осуществляется автоматически в ПЛИС трансляцией запросов из 177716 и согласно режиму работы маппера в 177346

регистр управления маппером 177346 R/W

Код


         Регистр управления маппером
         АДРЕС = 177346
         ФОРМАТ РЕГИСТРА
       ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
       │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│
       └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
        │  ║  │  │  │  ║  ║  │     │  │  │  │  │  │   │      ┌─────────────────────────┐
        │  ║  │  │  │  ║  ║  └─────┤  │  │  │  │  └───┴──────┤ версия аппаратной части │
        │  ║  │  │  │  ║  ║        │  │  │  │  │             └─────────────────────────┘
        │  ║  │  │  │  ║  ║        │  │  │  │  │             ┌─────────────────────────────────┐
        │  ║  │  │  │  ║  ║        │  │  │  │  └─────────────┤ =1 50Hz =0 60Hz кадровый таймер │  
        │  ║  │  │  │  ║  ║        │  │  │  │                └─────────────────────────────────┘
        │  ║  │  │  │  ║  ║        │  │  │  │                ┌─────────────────────────────────┐
        │  ║  │  │  │  ║  ║        │  │  │  └────────────────┤ =1 включить таймер 100й вектор  │
        │  ║  │  │  │  ║  ║        │  │  │                   └─────────────────────────────────┘
        │  ║  │  │  │  ║  ║        │  │  │                   ┌────────┐
        │  ║  │  │  │  ║  ║        │  │  └───────────────────┤ резерв │
        │  ║  │  │  │  ║  ║        │  │                      └────────┘
        │  ║  │  │  │  ║  ║        │  │       ┌─────────────────────────────────────────────┐
        │  ║  │  │  │  ║  ║        │  └───────┤ управление эмуляцией ПЗУ в БК11М =1 включить│
        │  ║  │  │  │  ║  ║        │          └─────────────────────────────────────────────┘
        │  ║  │  │  │  ║  ║        │  ┌──────────────────────────────────────────────────────────────┐
        │  ║  │  │  │  ║  ║        └──┤частота процессора явно те =3 =4 =5 =6 MHz =0 то неопределено │
        │  ║  │  │  │  ║  ║           │ заполняется программно, стартовым ПЗУ                        │
        │  ║  │  │  │  ║  ║           └──────────────────────────────────────────────────────────────┘
        │  ║  │  │  │  ║  ║  ╔═════════════════════════════════════════════════════════════════════════════════╗
        │  ║  │  │  │  ║  ╚══╣  R/W - RAM окно памяти с 0 до 77777 (технически это и окно 100000 до 137777)    ║
        │  ║  │  │  │  ║     ║  в отключенном режиме (=1) на 037ую не проходят запросы с адресов с 0 до 77777  ║
        │  ║  │  │  │  ║     ║  соответственно и 037ая никак не отвечает и не принимает данные на запись       ║
        │  ║  │  │  │  ║     ║  соответственно эта опция включает RPLY на маппере БК11М, а также возможность   ║
        │  ║  │  │  │  ║     ║  читать из маппера !!! при 14 бите =0 опция не работает                         ║
        │  ║  │  │  │  ║     ╚═════════════════════════════════════════════════════════════════════════════════╝
        │  ║  │  │  │  ║     ╔═════════════════════════════════════════════════════╗
        │  ║  │  │  │  ╚═════╣ R/W - ответ на 177660-663 строб 014й =1 отключение  ║
        │  ║  │  │  │        ║  а именно эмуляцию 014й                             ║
        │  ║  │  │  │        ║  те уже пойдет RPLY от AZ на адресах 177660-663     ║
        │  ║  │  │  │        ║  при 14 бите =0 опция не работает                   ║
        │  ║  │  │  │        ╚═════════════════════════════════════════════════════╝
        │  ║  │  │  │  ┌──────────────────────────────────────────────────────────────────┐
        │  ║  │  │  └──┤ R/W - включение эмуляции БК11М =1 включено                       │
        │  ║  │  │     │эта опция может быть активирована только при наличии =1 в бите 12 │
        │  ║  │  │     │(при =0 в бите 12 - игнорируется)                                 │
        │  ║  │  │     └──────────────────────────────────────────────────────────────────┘
        │  ║  │  │     ┌────────────────────────────────────────────────────────────────┐
        │  ║  │  └─────┤ R/W - тип БКшки =0 это 11М, дефолтное состояние  =1 это 10ка   │
        │  ║  │        │ проверяется и устанавливается программно стартовым ПЗУ         │
        │  ║  │        └────────────────────────────────────────────────────────────────┘
        │  ║  │ ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
        │  ║  └─┤ 13 - R/W - наличие работоспособной доработки окна1                                          │
        │  ║    │ =1 - работает отключение окна 1 традиционным методом через оттягивание выхода TM9 на землю  │
        │  ║    │ =0 - доработки нет                                                                          │
        │  ║    │ проверяется и устанавливается программно                                                    │
        │  ║    │ но сбрасывается в 0 при установке бита 14 - см ниже                                         │
        │  ║    └─────────────────────────────────────────────────────────────────────────────────────────────┘
        │  ║ ╔═════════════════════════════════════════════════════════╗
        │  ╚═╣R/O - тип доработки, результат автоопределения в ПЛИС    ║
        │    ║=0 доработка окна 1 или нет доработки                    ║
        │    ║=1 доработка с управлением 037й                          ║
        │    ╚═════════════════════════════════════════════════════════╝
        │    ┌────────────────────────────────────────────────────────────────────────────────────────────────────┐
        └────┤ 15 - R/W - =1 отключение окна 1 в БК11М, транслируется из эмуляции SMK                             │
             │ и в зависимости от типа доработки будет подаваться как сигнал на А22 или как переключение окон 11М │
             └────────────────────────────────────────────────────────────────────────────────────────────────────┘





биты
00 - R/O - версия аппаратной части платы ПЛИС - сейчас там 0
01 - R/O - версия аппаратной части платы ПЛИС - сейчас там 0

02 - =1 50Hz =0 60Hz кадровый таймер
переключение источников таймера, в случае 60Гц - оно идет с VGA модуля, 48Гц генерится из 65MHz

03 - =1 включить таймер 100й вектор
включает таймер по 100му вектору безусловно, h

04 - резерв =0

05 - управление эмуляцией ПЗУ в БК11М; по-умолчанию расширенные ПЗУ бейсика подключаемые через 177716 в окно 1 (100000-137777)
ПЗУ 8 [0] - подключает ПЗУ 325, 327 к магистрали
ПЗУ 9 [1] - подключает ПЗУ 328, 329 к магистрали
установка этого бита включает полную эмуляцию подключения этих ПЗУ средствами AZБК
бит независимый от эмуляции БК11М тк может быть случай с БК11М без ПЗУ совсем


частота процессора явно те =3 =4 =5 =6 MHz =0 то неопределено
заполняется программно, стартовым ПЗУ
06 - R/W
07 - R/W
08 - R/W


управление опциями отключения 037й в ПЛИС, доступно программно
по-умолчанию =0, те опция выключена
тк все изначально =0, и устанавливаются по HALT-у

эти опция отключает прохождение SYNC-а на 037 и включает дополнительный функционал
09 - R/W - RAM окно памяти с 0 до 77777 (технически это и окно 100000 до 137777)
в отключенном режиме (=1) на 037ую не проходят запросы с адресов с 0 до 77777 соответственно и 037ая никак не отвечает и не принимает данные на запись
соответственно эта опция включает RPLY на маппере БК11М, а также возможность читать из маппера
при 14 бите =0 опция не работает

эти опция отключает прохождение SYNC-а на 037 и включает дополнительный функционал
10 - R/W - ответ на 177660-663 строб 014й =1 отключение
а именно эмуляцию 014й
те уже пойдет RPLY от AZ на адресах 177660-663
при 14 бите =0 опция не работает

11 - R/W - включение эмуляции БК11М
=0 выключено
=1 включено
эта опция может быть активирована только при наличии =1 в бите 12 (при =0 в бите 12 - игнорируется)
функционал эмуляции БК11М на БК10 включает:
- разрешение записи (RPLY) в 177662
соответственно работают: палитры + кадровый таймер, частота задается в бите 2

12 - R/W - тип БКшки
=0 это 11М, дефолтное состояние
=1 это 10ка
проверяется и устанавливается программно стартовым ПЗУ
опция нужна для дальнейшей работы механизмов эмуляции БК11М на БК10
наличие в ней =1 обязательно для включения эмуляции БК11М на БК10

13 - R/W - наличие работоспособной доработки окна1
=1 - работает отключение окна 1 традиционным методом через оттягивание выхода TM9 на землю
=0 - доработки нет
проверяется и устанавливается программно
но сбрасывается в 0 при установке бита 14 - см ниже

14 - R/O - тип доработки, результат автоопределения в ПЛИС
=0 доработка окна 1 или нет доработки
=1 доработка с управлением 037й

15 - R/W - =1 отключение окна 1 в БК11М, транслируется из эмуляции SMK
и в зависимости от типа доработки будет подаваться как сигнал на А22 или как переключение окон 11М

Регистры-копии данных, доступны только по чтению
177350 R/O - регистр копия по записи 177130 в режиме записи управления памятью в SMK
177352 R/O - регистр копия по записи 177716 в режиме записи управления памятью в БК11М

Основное назначение регистров - возможность в любой процедуре поменять настройки памяти, что-то сделать и вернуть их обратно (тк штатными средствами узнать что записано в эти регистры невозможно)


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

a)машина БК11М, без блокировки 037й, возможно наличие простой доработки окна1
доступные режимы
1. теневой маппер БК11М - те ловим DOUT с шины на все окна, RPLY не посылаем
при наличии доработки SMK - отключаем окно аппаратно

б) машина БК11М, с блокировкой 037
1. теневой маппер БК11М - те ловим DOUT с шины на все окна, RPLY не посылаем
2. полный маппер БК11М - те отключаем штатную память полностью, ловим DIN и DOUT с шины на все окна, RPLY посылаем
3. полный маппер БК11М - те отключаем штатную память полностью, ловим DIN и DOUT с шины на все окна, RPLY посылаем, подключаем все "ПЗУ" БК11М (для БК11М без ПЗУ или БК10)

в) машина БК10, без блокировки 037
1. теневой маппер БК10 - те ловим DOUT с шины на все окна, RPLY не посылаем
работаем в режиме обычной расширенной памяти с 120000-157777

г) машина БК10, с блокировкой 037
1. теневой маппер БК10 - те ловим DOUT с шины на все окна, RPLY не посылаем
2. полный маппер БК11М - те отключаем штатную память 037й, ловим DIN и DOUT с шины на все окна, RPLY посылаем
3. полный маппер БК11М - те отключаем штатную память 037й, ловим DIN и DOUT с шины на все окна, RPLY посылаем, подключаем все "ПЗУ" БК11М (для БК11М без ПЗУ или БК10)

Также наличие доработки 037й позволяет отключить 014ую и подключить внешную PS/2 клавиатуру


Техническое описание с точки зрения внутренних механизмов работы маппера

данный раздел предназначен для разработки эмуляторов БК с AZ

концепция маппера и работы с памятью
1. вся память доступная AZ, управляется только маппером AZ

* доступная AZ - ее объем зависит от конфигурации машины
к примеру
БК-0010(01) без доработки монитора и 037 имеет доступный для работы маппера AZ участок с 120000 и до конца
БК-0010(01) с доработкой монитора и но без доработки 037 имеет доступный для работы маппера AZ участок с 100000 и до конца
БК-0010(01) c доработкой 037 в режиме быстрой памяти или в режиме эмуляции 11М - вся память управляется AZ-маппером
БК11М c доработкой монитора - с 100000 и до конца
БК11М без доработки монитора - с 100000 до 137777 и с 160000 до конца

*управляется маппером AZ
это означает что все запросы к 177716 или 177130(SMK) мапперам транслируются в запросы к мапперу AZ

2. Гранулярность окон маппера - 4кБ - это позволяет легко рулить всей доступной памятью
единственное ограничение - окно 170000 имеет принудительное окончание на 176777

3. Маппер имеет возможность назначения режимов для каждого окна
это очень важно понимать для понимания работы всего маппера

4. Регистры маппера
они описаны выше но повторю:
177300-177336 - адрес начала окна
177340 - регистр активного RPLY
177342 - регистр ограничения R/O
177344 - регистр теневой записи - shadow
177346 - управление маппером
также есть регистры-справки
177350 R/O - регистр копия по записи 177130 в режиме записи управления памятью в SMK
177352 R/O - регистр копия по записи 177716 в режиме записи управления памятью в БК11М

приоритеты:
для исключения конфликтов 177340 имеет больший приоритет чем 177344

тут все ясно и описано ранее

5. Работа внутренних механизмов - эмуляция маппера 11М
тут разберем как обрабатываются запросы к мапперу 11М в AZ

- обращение к 177716 разделяются на 2 ветки - DIN (чтение) и DOUT (запись)

5.1 DIN
код обработчика DIN - те стейт state==STATE_DIN_reg_az_716
Код

    if (state==STATE_DIN_reg_az_716)
    begin
        DA_OUT[15]<=1'b1;
        DA_OUT[14:12]<=(start==1)?3'd7:                            // если старт - 170
                            (reg_az_mapper_ctrl[14]==1 &&         // есть доработка 037й
                             reg_az_mapper_ctrl[9]==1 &&             // отключена 037ая
                             reg_az_mapper_ctrl[11]==1)?3'd4:     // включена эмуляция 11М - 140
                             3'd0;                                         // иначе 100k                                                            
        DA_OUT[11:7]<={4'd0,1'b1};
        DA_OUT[6]<= (reg_az_mapper_ctrl[10]==1)?~key_down:1'd0; // отдаем нажатие только когда у нас PS/2 - иначе не мешаем работать
        DA_OUT[5:0]<=6'd0;
    end

пояснения
DA_OUT - это данные на шину, те что AZ отдает процессору
eg_az_mapper_ctr - это регистр 177446


5.2 DOUT
тут все сложнее
сначала идет фильтрация - те для перехода в стейт state=STATE_DOUT_reg_az_716
недостаточно упавшего B_DOUT_L, нужно еще выполнение условий:
Код
            if (B_DOUT_L==0 && (DA_IN[11]==1) && // это флаг записи в 177716!
                                    (     reg_az_mapper_ctrl[12]==0 ||  // или это БК11М
                                     (   reg_az_mapper_ctrl[9]==1        // или замена памяти 037 +
                                         && reg_az_mapper_ctrl[12]==1        // это БК10 +
                                       && reg_az_mapper_ctrl[14]==1     // есть доработка 037й    
                                        )))                                                                                                  
                    next_state=STATE_DOUT_reg_az_716;

если условия выполнены, мы попадает на стейт state=STATE_DOUT_reg_az_716
важно стейт не единственный - это цепочка:

Код

        STATE_DOUT_reg_az_716:                                    // запись в 177716
                next_state=STATE_DOUT_reg_az_716_pre;

        STATE_DOUT_reg_az_716_pre:                                // формируем регистры PRE для AZ
                next_state=STATE_DOUT_reg_az_716_az;

        STATE_DOUT_reg_az_716_az:                                // запись PRE в регистры маппера AZ
                next_state=STATE_WAITSYNC1;


первый стейт STATE_DOUT_reg_az_716 - это проверка условий обращения к мапперу (те бит 11)
далее стейт формирования PRE регистров данных
это регистры-предшественники с данными для маппера AZ
и третий стейт это непосредственно запись регистров-предшественников в регистры маппера AZ


итак идетм по стейтам

5.2.1 STATE_DOUT_reg_az_716


Код

[code]
always @ (posedge CLK)
begin
    if ( (state==STATE_DOUT_reg_az_716) && (DA_IN[11]==1) )
        reg_az_716<=DA_IN[15:0]; // запоминаем только при обращении к мапперу памяти    
end




5.2.2 STATE_DOUT_reg_az_716_pre

а вот тут уже сложнее
Код

wire [2:0]    win0_map={reg_az_716[14],reg_az_716[13],reg_az_716[12]};    // что подключено в окно 0:  40000 -  77777
wire [2:0]    win1_map={reg_az_716[10],reg_az_716[9], reg_az_716[8] };    // что подключено в окно 1: 100000 - 137777

wire             win1_roms01=reg_az_716[0] || reg_az_716[1];// флаг подключения ПЗУ 11М (бейсик и БОС) в окно1: 100000 - 137777    
wire             win1_roms34=reg_az_716[3] || reg_az_716[4];// флаг подключения внешних ПЗУ            в окно1: 100000 - 137777    

reg [6:0]    pre_b11m_reg_az_mapper[7:0];      // массив регистров мапирования // сохраняем младшие 7бит и только 8 регистров
reg            pre_b11m_reg_az_win_ctrl;            // регистр для установки режимов окна 1 - активность
reg             pre_b11m_reg_az_win_shdw;            // регистр для установки режимов окна 1 - тень

always @ (posedge CLK)
begin
    if (state==STATE_DOUT_reg_az_716_pre)
    begin
        pre_b11m_reg_az_mapper[3'd0]<={2'd0,win0_map,2'd0};    // что подключено в окно 0:  40000 -  77777
        pre_b11m_reg_az_mapper[3'd1]<={2'd0,win0_map,2'd1};
        pre_b11m_reg_az_mapper[3'd2]<={2'd0,win0_map,2'd2};
        pre_b11m_reg_az_mapper[3'd3]<={2'd0,win0_map,2'd3};

        pre_b11m_reg_az_mapper[3'd4]<=(reg_az_716[1]==1)?7'o124:(reg_az_716[0]==1)?7'o126:{2'd0,win1_map,2'd0};     // что подключено в окно 1: 100000 - 137777    
        pre_b11m_reg_az_mapper[3'd5]<=(reg_az_716[1]==1)?7'o125:(reg_az_716[0]==1)?7'o127:{2'd0,win1_map,2'd1};     // 110000
        pre_b11m_reg_az_mapper[3'd6]<=(reg_az_716[1]==1)?7'o122:(reg_az_716[0]==1)?7'o130:{2'd0,win1_map,2'd2};  // 120000
        pre_b11m_reg_az_mapper[3'd7]<=(reg_az_716[1]==1)?7'o123:(reg_az_716[0]==1)?7'o131:{2'd0,win1_map,2'd3};     // 130000
                
        pre_b11m_reg_az_win_ctrl<=(win1_roms01==1)?reg_az_mapper_ctrl[5]:            // если были запрошены ПЗУ 11М даем их если есть разрешение
                                          (win1_roms34==1)?1'b0:                                // если были запрошены внешние ПЗУ11М - нету нифига!
                                          reg_az_mapper_ctrl[9];                                // тогда ОЗУ и то только если оно включено
                                          
        pre_b11m_reg_az_win_shdw<=(win1_roms01==1 || win1_roms34==1)?1'b0:        // для любых ПЗУ нет shadow    
                                            ~reg_az_mapper_ctrl[9];                                // если оперативка не в активном состоянии- то значит shadow
    end        
end
//



5.2.3 STATE_DOUT_reg_az_716_az

этот стейт сложнее - тут идет непосредственно применение PRE-регистров
Код

if (state==STATE_DOUT_reg_az_716_az)                        // есть преобразование от БК11М            
    begin                                                                        // регистры идут обрезанные - 12шт по 6бит
        // начальный блок статика - всегда приколочен жестко
        reg_az_mapper[4'd0]     <=13'o030;    // 000000-007777
        reg_az_mapper[4'd1]     <=13'o031;     // 010000-017777
        reg_az_mapper[4'd2]     <=13'o032;    // 020000-027777
        reg_az_mapper[4'd3]     <=13'o033;    // 030000-037777
        // окно 0 - всегда оперативка        
        reg_az_mapper[4'd4]     <={6'd0,pre_b11m_reg_az_mapper[4'd0]};    // 040000-047777
        reg_az_mapper[4'd5]     <={6'd0,pre_b11m_reg_az_mapper[4'd1]};    // 050000-057777
        reg_az_mapper[4'd6]     <={6'd0,pre_b11m_reg_az_mapper[4'd2]};    // 060000-067777
        reg_az_mapper[4'd7]     <={6'd0,pre_b11m_reg_az_mapper[4'd3]};    // 070000-077777
                
        reg_az_win_ctrl[7:0]    <={8{reg_az_mapper_ctrl[9]}};  // если включена замена 037 - включаем оперативку как активную
        reg_az_win_ro[7:0]    <=8'd0;                                 // сбрасываем на всякий случай флаг запрета записи
        reg_az_win_shdw[7:0]    <={8{~reg_az_mapper_ctrl[9]}}; // если нет замены - включаем shadow

        if (reg_az_mapper_ctrl[15]==0) // нет сигнала отключения окна 1 от SMK
        begin
            // окно 1 - может отключаться или эмулировать ПЗУ. адреса пишем всегда
            reg_az_mapper[4'd8]      <={6'd0,pre_b11m_reg_az_mapper[4'd4]};     // 100000-107777
            reg_az_mapper[4'd9]      <={6'd0,pre_b11m_reg_az_mapper[4'd5]};     // 110000-117777
            reg_az_mapper[4'd10]     <={6'd0,pre_b11m_reg_az_mapper[4'd6]};    // 120000-127777
            reg_az_mapper[4'd11]     <={6'd0,pre_b11m_reg_az_mapper[4'd7]};    // 130000-137777
                    
            reg_az_win_ctrl[11:8] <={4{pre_b11m_reg_az_win_ctrl}};
            reg_az_win_ro  [11:8] <=4'd0;    // сбрасываем на всякий случай флаг запрета записи
            reg_az_win_shdw[11:8] <={4{pre_b11m_reg_az_win_shdw}};
        end
        else
        begin // окно отключено через SMK - значит вставляем данные от SMK-маппера
            reg_az_mapper[4'd11]     <={5'b00000,pre_smk_reg_az_mapper[3'd3]}; // 130000-137777
            reg_az_mapper[4'd10]     <={5'b00000,pre_smk_reg_az_mapper[3'd2]}; // 120000-127777
            reg_az_mapper[4'd9]      <={5'b00000,pre_smk_reg_az_mapper[3'd1]}; // 110000-117777
            reg_az_mapper[4'd8]      <={5'b00000,pre_smk_reg_az_mapper[3'd0]}; // 100000-107777        
            reg_az_win_ctrl[11:8] <=pre_smk_reg_az_win_ctrl[3:0];        
            reg_az_win_ro  [11:8] <=pre_smk_reg_az_win_ro  [3:0];    
            reg_az_win_shdw[11:8] <=4'b0000;            
        end    

тут видно, что маппер SMK тут тоже завязан ибо он "надет сверху" на маппер 11М и подменяет окно1 когда хочет

6. работа внутренних механизмов - эмуляция маппера SMK

чтение из 177130 у нас не поддерживается соответственно тут только участок обработки DOUT

тут тоже цепочка стейтов
Код

        // 177130
        STATE_DOUT_reg_az_130:
            if(reg_az_smk_flag==1 ) // флаг установлен ?
                next_state=STATE_DOUT_reg_az_130_wsmk;
            else
                next_state=STATE_DOUT_reg_az_130_wflg;// не установлен, проверяем возможность установки                    
                
        STATE_DOUT_reg_az_130_wflg:                        // если флаг не установлен - пытаемся его установить
                next_state=STATE_WAITSYNC1;                
                
        STATE_DOUT_reg_az_130_wsmk:                        // флаг установлен - читаем данные в регистр SMK
                next_state=STATE_DOUT_reg_az_130_pre;                
                
        STATE_DOUT_reg_az_130_pre:                        // формируем регистры PRE для AZ
                next_state=STATE_DOUT_reg_az_130_az;                
                
        STATE_DOUT_reg_az_130_az:                        // запись PRE в регистры маппера AZ
                next_state=STATE_WAITSYNC1;    


описание стейтов
Код

localparam STATE_DOUT_reg_az_130                    = 6'd35;     // опрос флага SMK
localparam STATE_DOUT_reg_az_130_wflg            = 6'd36;     // если флаг не установлен - пытаемся его установить
localparam STATE_DOUT_reg_az_130_wsmk            = 6'd37;     // флаг установлен - читаем данные в регистр SMK
localparam STATE_DOUT_reg_az_130_pre            = 6'd38;     // формируем регистры PRE
localparam STATE_DOUT_reg_az_130_az                = 6'd39;     // пишем PRE в маппер


6.1 STATE_DOUT_reg_az_130

это промежуточный стейт

6.2 STATE_DOUT_reg_az_130_wflg
Код

// установка флага
always @ (posedge CLK)
begin
    if (state==STATE_DOUT_reg_az_130_wflg)          // если флаг не установлен - пытаемся его установить
       reg_az_smk_flag<=(DA_IN==16'o6);                     // если в 177130 пишется 6 то это флаг
    else if (  (state==STATE_DOUT_reg_az_130_az) || (state_hlt==STATE_HLT_HALT1) )
        reg_az_smk_flag<=1'b0;                                     // а тут сбрасываем флаг
end

те обработка флага записи

6.3 STATE_DOUT_reg_az_130_wsmk
Код

//    сохранение данных в регистр SMK
always @ (posedge CLK)
begin
    if (state==STATE_DOUT_reg_az_130_wsmk)          // флаг установлен - читаем данные в регистр SMK
       reg_az_reg_az_smk_data<=DA_IN;
end
//


6.4 STATE_DOUT_reg_az_130_pre
промежуточный стейт, во время которого происходит формирование PRE- данных по SMK
Код

// формирование отключения (1)
// МОНБК10    =  ( ~U2 && ~U1 ) || ( U2 && ~U1);
// МОНБК11М   =  ( ~U2 && ~U1 ) || (~U2 &&  U1)
// ОКНОБК11M  = U0

wire mon_bk10_off=  ( ~reg_az_reg_az_smk_data[6] && ~reg_az_reg_az_smk_data[5] ) || (  reg_az_reg_az_smk_data[6] && ~reg_az_reg_az_smk_data[5] );
wire mon_bk11m_off= ( ~reg_az_reg_az_smk_data[6] && ~reg_az_reg_az_smk_data[5] ) || ( ~reg_az_reg_az_smk_data[6] &&  reg_az_reg_az_smk_data[5] );

wire [3:0] SMK_PAGE={reg_az_reg_az_smk_data[10],reg_az_reg_az_smk_data[3],reg_az_reg_az_smk_data[2],reg_az_reg_az_smk_data[0]}; // номер страницы памяти, страница по 32кБ * 16шт всего 512кБ
// для SMK выделен блок с 512кБ до 1024кБ - итоговые внутренние номера сегментов от 200 до 377

// блок режимов                            U2                         U1                        U0
wire [2:0] SMK_MODE={reg_az_reg_az_smk_data[6],reg_az_reg_az_smk_data[5],reg_az_reg_az_smk_data[4]}; // номер режима

// набор регистров которые будут транслироваться из SMK в регистры AZ после операции SMK
reg    [7:0]        pre_smk_reg_az_mapper[7:0];      // массив регистров мапирования // сохраняем младшие 13бит  // регистры только старшие
reg   [7:0]     pre_smk_reg_az_win_ctrl;        //    управление окнами - битовая маска активации окон, верхняя часть
reg   [7:0]       pre_smk_reg_az_win_ro;           // управление окнами - битовая маска r/o           окон, верхняя часть
reg   [11:8]   pre_smk_reg_az_win_shdw;        // управление тенью

always @ *
begin
    case (SMK_MODE)        
        3'b111:        // Start - используется для запуска, пересылки данных на БК10 и RAM-BIOS'ом (он - всегда в 0-й странице);
            begin
            pre_smk_reg_az_mapper[3'd7]<=8'o100;
            pre_smk_reg_az_mapper[3'd6]<=8'o110;
            pre_smk_reg_az_mapper[3'd5]<={1'b1,SMK_PAGE,3'd1}; // 4+3=7bit
            pre_smk_reg_az_mapper[3'd4]<={1'b1,SMK_PAGE,3'd0};
            pre_smk_reg_az_mapper[3'd3]<={1'b1,SMK_PAGE,3'd7};
            pre_smk_reg_az_mapper[3'd2]<={1'b1,SMK_PAGE,3'd6};            
            //pre_smk_reg_az_mapper[3'd1]<=pre_smk_reg_az_mapper[3'd1];
            //pre_smk_reg_az_mapper[3'd0]<=pre_smk_reg_az_mapper[3'd0];            
            pre_smk_reg_az_win_ctrl     <=8'b11111100;
            pre_smk_reg_az_win_ro          <=8'b00000000;
            end
            
        3'b011:        // Std10    60        
            begin
            pre_smk_reg_az_mapper[3'd7]<={1'b1,SMK_PAGE,3'd7};
            pre_smk_reg_az_mapper[3'd6]<=8'o110;
            pre_smk_reg_az_mapper[3'd5]<={1'b1,SMK_PAGE,3'd5};
            pre_smk_reg_az_mapper[3'd4]<={1'b1,SMK_PAGE,3'd4};
            pre_smk_reg_az_mapper[3'd3]<={1'b1,SMK_PAGE,3'd3};
            pre_smk_reg_az_mapper[3'd2]<={1'b1,SMK_PAGE,3'd2};
            //pre_smk_reg_az_mapper[3'd1]<=pre_smk_reg_az_mapper[3'd1];
            //pre_smk_reg_az_mapper[3'd0]<=pre_smk_reg_az_mapper[3'd0];            
            pre_smk_reg_az_win_ctrl     <=8'b11111100;
            pre_smk_reg_az_win_ro          <=8'b00000000;
            end
        
        3'b101:        // ОЗУ10 120    
            begin
            pre_smk_reg_az_mapper[3'd7]<={1'b1,SMK_PAGE,3'd7};
            pre_smk_reg_az_mapper[3'd6]<={1'b1,SMK_PAGE,3'd6};
            pre_smk_reg_az_mapper[3'd5]<={1'b1,SMK_PAGE,3'd5};
            pre_smk_reg_az_mapper[3'd4]<={1'b1,SMK_PAGE,3'd4};
            pre_smk_reg_az_mapper[3'd3]<={1'b1,SMK_PAGE,3'd3};
            pre_smk_reg_az_mapper[3'd2]<={1'b1,SMK_PAGE,3'd2};
            pre_smk_reg_az_mapper[3'd1]<={1'b1,SMK_PAGE,3'd1};
            pre_smk_reg_az_mapper[3'd0]<={1'b1,SMK_PAGE,3'd0};
            pre_smk_reg_az_win_ctrl     <=8'b11111111;            
            pre_smk_reg_az_win_ro          <=8'b00000000;
            end
        
        3'b001:        // All    20        
            begin
            pre_smk_reg_az_mapper[3'd7]<={1'b1,SMK_PAGE,3'd3};
            pre_smk_reg_az_mapper[3'd6]<={1'b1,SMK_PAGE,3'd2};
            pre_smk_reg_az_mapper[3'd5]<={1'b1,SMK_PAGE,3'd1};
            pre_smk_reg_az_mapper[3'd4]<={1'b1,SMK_PAGE,3'd0};
            pre_smk_reg_az_mapper[3'd3]<={1'b1,SMK_PAGE,3'd7};
            pre_smk_reg_az_mapper[3'd2]<={1'b1,SMK_PAGE,3'd6};
            pre_smk_reg_az_mapper[3'd1]<={1'b1,SMK_PAGE,3'd5};
            pre_smk_reg_az_mapper[3'd0]<={1'b1,SMK_PAGE,3'd4};
            pre_smk_reg_az_win_ctrl     <=8'b11111111;            
            pre_smk_reg_az_win_ro          <=8'b00000000;
            end        
        
        3'b110:        // Std11    140    
            begin
            pre_smk_reg_az_mapper[3'd7]<={1'b1,SMK_PAGE,3'd7};
            pre_smk_reg_az_mapper[3'd6]<=8'o110;
            pre_smk_reg_az_mapper[3'd5]<=8'o121;                            // стандартное ПЗУ БК11М
            pre_smk_reg_az_mapper[3'd4]<=8'o120;                            // стандартное ПЗУ БК11М            
            //pre_smk_reg_az_mapper[3'd3]<=pre_smk_reg_az_mapper[3'd3];
            //pre_smk_reg_az_mapper[3'd2]<=pre_smk_reg_az_mapper[3'd2];
            //pre_smk_reg_az_mapper[3'd1]<=pre_smk_reg_az_mapper[3'd1];
            //pre_smk_reg_az_mapper[3'd0]<=pre_smk_reg_az_mapper[3'd0];            
            pre_smk_reg_az_win_ctrl     <=8'b11110000;
            pre_smk_reg_az_win_ro          <=8'b00000000;            
            end        
        
        3'b010:        // ОЗУ11    40      
            begin
            pre_smk_reg_az_mapper[3'd7]<={1'b1,SMK_PAGE,3'd7};
            pre_smk_reg_az_mapper[3'd6]<={1'b1,SMK_PAGE,3'd6};
            pre_smk_reg_az_mapper[3'd5]<={1'b1,SMK_PAGE,3'd5};
            pre_smk_reg_az_mapper[3'd4]<={1'b1,SMK_PAGE,3'd4};
            //pre_smk_reg_az_mapper[3'd3]<=pre_smk_reg_az_mapper[3'd3];
            //pre_smk_reg_az_mapper[3'd2]<=pre_smk_reg_az_mapper[3'd2];
            //pre_smk_reg_az_mapper[3'd1]<=pre_smk_reg_az_mapper[3'd1];
            //pre_smk_reg_az_mapper[3'd0]<=pre_smk_reg_az_mapper[3'd0];
            pre_smk_reg_az_win_ctrl     <=8'b11110000;            
            pre_smk_reg_az_win_ro          <=8'b00000000;
            end        
        
        3'b100:        // HLT10 100    
            begin
            pre_smk_reg_az_mapper[3'd7]<={1'b1,SMK_PAGE,3'd7};
            pre_smk_reg_az_mapper[3'd6]<={1'b1,SMK_PAGE,3'd6};
            pre_smk_reg_az_mapper[3'd5]<={1'b1,SMK_PAGE,3'd5};
            pre_smk_reg_az_mapper[3'd4]<={1'b1,SMK_PAGE,3'd4};
            pre_smk_reg_az_mapper[3'd3]<={1'b1,SMK_PAGE,3'd3};
            pre_smk_reg_az_mapper[3'd2]<={1'b1,SMK_PAGE,3'd2};
            pre_smk_reg_az_mapper[3'd1]<={1'b1,SMK_PAGE,3'd1};
            pre_smk_reg_az_mapper[3'd0]<={1'b1,SMK_PAGE,3'd0};
            pre_smk_reg_az_win_ctrl     <=8'b11111111;
            pre_smk_reg_az_win_ro          <=8'b00000001;            
            end        
        
        3'b000:        // HLT11 20000 = 0
            begin
            pre_smk_reg_az_mapper[3'd7]<={1'b1,SMK_PAGE,3'd7};
            pre_smk_reg_az_mapper[3'd6]<={1'b1,SMK_PAGE,3'd6};
            pre_smk_reg_az_mapper[3'd5]<={1'b1,SMK_PAGE,3'd5};
            pre_smk_reg_az_mapper[3'd4]<={1'b1,SMK_PAGE,3'd4};
            //pre_smk_reg_az_mapper[3'd3]<=pre_smk_reg_az_mapper[3'd3];
            //pre_smk_reg_az_mapper[3'd2]<=pre_smk_reg_az_mapper[3'd2];
            //pre_smk_reg_az_mapper[3'd1]<=pre_smk_reg_az_mapper[3'd1];
            //pre_smk_reg_az_mapper[3'd0]<=pre_smk_reg_az_mapper[3'd0];            
            pre_smk_reg_az_win_ctrl     <=8'b11110000;            
            pre_smk_reg_az_win_ro          <=8'b00000000;
            end    
    endcase
end
//


6.5 STATE_DOUT_reg_az_130_az

а вот тут уже применением PRE регистров:

Код

if (state==STATE_DOUT_reg_az_130_az)                 // есть преобразование от SMK
    begin
        reg_az_mapper[4'd15]     <={5'b00000,pre_smk_reg_az_mapper[3'd7]}; // 170000-177000
        reg_az_mapper[4'd14]     <={5'b00000,pre_smk_reg_az_mapper[3'd6]}; // 160000-167777
        reg_az_mapper[4'd13]     <={5'b00000,pre_smk_reg_az_mapper[3'd5]}; // 150000-157777
        reg_az_mapper[4'd12]     <={5'b00000,pre_smk_reg_az_mapper[3'd4]}; // 140000-147777

        reg_az_win_ctrl[15:12] <=pre_smk_reg_az_win_ctrl[7:4];        
        reg_az_win_ro  [15:12] <=pre_smk_reg_az_win_ro  [7:4];                
        reg_az_win_shdw[15:12] <=5'd0;    // принудительно выключаем тень тк вся память SMK это память AZ    
                
        if (reg_az_reg_az_smk_data[4]==1) // есть отключение окна 1 и мы оверайдим из SMK данные
        begin
            reg_az_mapper[4'd11]     <={5'b00000,pre_smk_reg_az_mapper[3'd3]}; // 130000-137777
            reg_az_mapper[4'd10]     <={5'b00000,pre_smk_reg_az_mapper[3'd2]}; // 120000-127777
            reg_az_mapper[4'd9]      <={5'b00000,pre_smk_reg_az_mapper[3'd1]}; // 110000-117777
            reg_az_mapper[4'd8]      <={5'b00000,pre_smk_reg_az_mapper[3'd0]}; // 100000-107777
                        
            reg_az_win_ctrl[11:8] <=pre_smk_reg_az_win_ctrl[3:0];        
            reg_az_win_ro  [11:8] <=pre_smk_reg_az_win_ro  [3:0];                            
            reg_az_win_shdw[11:8] <=4'b0000; // принудительно выключаем тень в зоне пересечения с SMK - те на окне 1
        end
        else // иначе окно принадлежит мапперу БК11М
        begin
            // окно 1 - может отключаться или эмулировать ПЗУ. адреса пишем всегда
            reg_az_mapper[4'd8]      <={6'd0,pre_b11m_reg_az_mapper[4'd4]};     // 100000-107777
            reg_az_mapper[4'd9]      <={6'd0,pre_b11m_reg_az_mapper[4'd5]};     // 110000-117777
            reg_az_mapper[4'd10]     <={6'd0,pre_b11m_reg_az_mapper[4'd6]};    // 120000-127777
            reg_az_mapper[4'd11]     <={6'd0,pre_b11m_reg_az_mapper[4'd7]};    // 130000-137777
                    
            reg_az_win_ctrl[11:8] <={4{pre_b11m_reg_az_win_ctrl}};
            reg_az_win_ro  [11:8] <=4'd0;    // сбрасываем на всякий случай флаг запрета записи
            reg_az_win_shdw[11:8] <={4{pre_b11m_reg_az_win_shdw}};
        end            
        reg_az_mapper_ctrl[15]<=reg_az_reg_az_smk_data[4]; // отключение окна 1 на БК11М            
    end


7. внутренние механизмы - старт БКшки

тут стоит подробно описать как производится старт AZ и БК

следует выделить несолько этапов, перывым из которых является - инзкий HALT
7.1 микроконтроллер (далее МК) обнаружив низкий HALT перезапусается

7.2 после перезапуска МК сам устанавливает низкий HALT для удержания БК в остановленном состоянии. в это время МК инициализиует библитеку FATFS, сеть, и загружает с карточки из директории ROM все ПЗУ которые описаны в AZ.INI
после завершения инциализации, МК отпускает HALT БКшки и она начинает стартовать

ПЛИС в это время "выполняет" вот этот код
Код

if (state_hlt==STATE_HLT_HALT1)         // установка стартовой конфигурации, далее уже стартовое ПЗУ все настраивает
    begin
        reg_az_mapper[4'd15]        <=13'o100;        // подключаем стартовое ПЗУ - страница 100
        reg_az_win_ctrl              <=16'o100000;    // активируем стартовое ПЗУ
        reg_az_mapper_ctrl[15]     <=1'b0;             // сбрасываем блокировку окна 1 в БК11М        
        reg_az_mapper_ctrl[3]     <=1'b0;             // выключаем кадровый таймер явно        
        reg_az_mapper_ctrl[14]    <=~WIN1_OFF;    // считаем состояние доработки
        reg_az_mapper_ctrl[13]    <=(~WIN1_OFF==1)?1'b0:reg_az_mapper_ctrl[13]; // сбросим если есть доработка 037й        
        reg_az_mapper_ctrl[10:9]<=2'b0;             // сбросим режимы доработки в первоначальное состояние
    end    


7.3 старт процессора БК идет согласно ответа на 177716 - см выше мы описали условия ответа.
в данном случае AZ явно устанавливает старший байт адреса запуска в 170000
программа старта проверяет начилие установленной частоты процессора в 177346 и если там пусто - пишет туда 7, устанавливает начальное значение маппера 177716 и отправляет БК в перезапуск командой микроконтроллеру.
это сделано для первоначальной инициализации регистра 177716 который при первом включении БК11М находится в некоррекном состоянии - а именно он включает все ПЗУ на шину!
если не привести его в порядок, механизм автоопределения доработки примет 11М за БК10 что нарушит работу маппера.

7.4 БК перезапускается те пункты 7.1->7.2->7.3->
теперь процессор снова стартанул со 170000 и тут код уже видит что в частоте стоит 7 и первичная инициализация проведена успешно и начинается выполнение основного кода старта БК


8. защита от дурака

этот блок описывает защиты от некорректных установок в 177346
Код
        // сюда попадаем только при 14=1 и 10=1            
        STATE_PRC_reg_az_014_662:
            if(B_DIN_L==0 )
                next_state=STATE_DIN_reg_az_014_662;
            else
            if (B_DOUT_L==0 &&
                 ( ( reg_az_mapper_ctrl[11]==1 && reg_az_mapper_ctrl[12]==1 ) ||  // включаем  запись в 177662 при эмуляции БК11М на БК10
                    ( reg_az_mapper_ctrl[11]==0 && reg_az_mapper_ctrl[12]==0 )  )  // включаем  запись в 177662 на 11М при отключенной эмуляции 10ки
                 )    
                next_state=STATE_DOUT_reg_az_014_662;
                else
                if (B_SYNC_L==1)
                    next_state=STATE_WAITSYNC1;
                else
                    next_state=STATE_PRC_reg_az_014_662;    

Код
        STATE_PRC_reg_az_716:
            if ((B_DIN_L==0) )// && (start==1) )
                next_state=STATE_DIN_reg_az_716;
            else
            if (B_DOUT_L==0 && (DA_IN[11]==1) && // это флаг записи в 177716!
                                    (     reg_az_mapper_ctrl[12]==0 ||  // или это БК11М
                                     (   reg_az_mapper_ctrl[9]==1        // или замена памяти 037 +
                                         && reg_az_mapper_ctrl[12]==1        // это БК10 +
                                       && reg_az_mapper_ctrl[14]==1     // есть доработка 037й    
                                        )))                                                                                                  
                    next_state=STATE_DOUT_reg_az_716;
                else
                if (B_SYNC_L==1)
                    next_state=STATE_WAITSYNC1;
                else
                    next_state=STATE_PRC_reg_az_716;    



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

Маппер БК11М

Код

          РАСПРЕДЕЛEНИЕ АДРЕСНОГО ПРОСТРАНСТВА БК11М
                  окно N%0       окно N%1
0           40000         100000         140000       160000     177777
┌──────────────┬─────────────┬─────────────┬────────────┬────────────┐
│  стр ОЗУ 0   │   ХХХХХХ    │   ХХХХХХ    │ сист. ПЗУ  │регистры  ВУ│
└──────────────┴─────────────┴─────────────┴────────────┴────────────┘
                      │            │
              ┌───────┘            └────────┐
┌─────────────┴────────────┐   ┌────────────┴────────────┐
│    стр ОЗУ 0....7        │   │    стр ОЗУ 0....7       │
└──────────────────────────┘   └─────────────────────────┘
                                          или
                               ┌─────────────────────────┐
                               │    стр ПЗУ 8....11      │
                               └─────────────────────────┘
                                        
                        ┌─────────────────────────────────────────────┐
                        │ 177716 по записи, при установленом бите 11  │
                       ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
                       │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│
                       └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
┌───────────────────────┐   │││││││  │  ││││││           │  │     │  │
│    окно ОЗУ N%0       ├───┴─────┘  │  │    │           │  │     │  │
└───────────────────────┘            │  │    │           │  │     │  │
┌───────────────────────┐            │  │    │           │  │     │  │
│    окно ОЗУ N%1       ├────────────│──┴────┘           │  │     │  │
└───────────────────────┘            │                   │  │     │  │
┌───────────────────────┐            │                   │  │     │  │
│ стробирование записи  ├────────────┘                   │  │     │  │
└───────────────────────┘                                │  │     │  │
┌─────────────────────────────────────────────────────────────────────┐
│ подключение стр. ППЗУ NN% по адресу 100000-140000      11..10...9..8│
└─────────────────────────────────────────────────────────────────────┘

              КОДИРОВКА ПЕРЕКЛЮЧАЕМЫХ СТАНИЦ ОЗУ
┌────────────────┬──────────────────┬────────────────┬─────────────────┬─────────────────┐
│ НОМЕР СТРАНИЦЫ │ МАСКА (14;13;12) │ МАСКА (10,9,8) │     СТАТУС      │Номер страницы AZ│
├────────────────┼──────────────────┼────────────────┼─────────────────┼─────────────────┤
│       0        │      60000 (110) │     3000       │   отображена    │      030         │
│                │                  │                │   0....40000    │                 │
│       1        │      00000 (000) │     0000       │                 │      000         │
│                │                  │                │                 │                 │
│       2        │      20000 (010) │     1000       │                 │      010         │
│                │                  │                │                 │                 │
│       3        │      30000 (011) │     1400       │                 │      014         │
│                │                  │                │                 │                 │
│       4        │      40000 (100) │     2000       │                 │      020         │
│                │                  │                │                 │                 │
│       5        │      10000 (001) │     0400       │ БУФЕР ЭКРАНА  0 │      004         │
│                │                  │                │                 │                 │
│       6        │      70000 (111) │     3400       │ БУФЕР ЭКРАНА  1 │      034         │
│                │                  │                │                 │                      │
│       7        │      50000 (101) │     2400       │                 │      024         │
└────────────────┴──────────────────┴────────────────┴─────────────────┴─────────────────┘
  * ВНИМАНИЕ ! маска указана без учета бита 11 (4000)
  
  ПЗУ  8[0] - подключает ПЗУ 328, 329 к магистрали  - 100k=328   120k=329
  ПЗУ  9[1] - подключает ПЗУ 325, 327 к магистрали  - 100k=327   120k=325
  ПЗУ 10[3] - внешнее пзу в панельках (2шт) или на МПИ, сигнал разрешения на A32
  ПЗУ 11[4] - внешнее пзу на МПИ, сигнал разрешения на A22 (ПЗУ ЛВС)
  наличие сигнала выбора ПЗУ, отключает ОЗУ с 100000

ПЗУ  
R16=0:/rom/11m_324.rom  120  121   - 140k
R18=0:/rom/11m_325.rom  122  123   - 120k
R20=0:/rom/11m_327.rom    124  125   - 100k
R22=0:/rom/11m_328.rom  126  127   - 100k
R24=0:/rom/11m_329.rom  130  131   - 120k


SuperMax
Генератор псевдослучайных чисел

технически это LFSR длиной 128bit, младшие 16bit доступны по адресу 177550
данный регистр отвечает и на чтение и на запись. запись игнорируется.

питается генератор частотой 65MHz и как следствие каждое обращение с МПИ даст совершенно новое слово


SuperMax
Консоль контроллера
основное назначение - отладка + информационные сообщения для расширенной диагностики

Настройка консоли
baud rate: 115200
data:8 bit
parity: none
stop: 1bit


К примеру в случае отсутствия карточки в консоли будет:

Код
AZBK build May  5 2021 23:12:19
Start lan init
ERROR: Card NOT installed
Lan init ok
IO11 init begin
ERROR open AZ.INI  errorcode=12
IO11 Error: 4
System Halted



Нормальный старт выводит в консоль следующий лог
Код

AZBK build May 17 2021 22:27:48
Start lan init
Card installed OK
Card mounted OK
Lan init ok
IO11 init begin
LOAD 0 ROM: file 0:/ROM/AZBOOT.ROM at 400000 (100)
LOAD 8 ROM: file 0:/ROM/BZ326.ROM at 440000 (110)
LOAD 11 ROM: file 0:/ROM/HDD326.ROM at 454000 (113)
LOAD 16 ROM: file 0:/ROM/11M_324.ROM at 500000 (120)
LOAD 18 ROM: file 0:/ROM/11M_325.ROM at 510000 (122)
LOAD 20 ROM: file 0:/ROM/11M_327.ROM at 520000 (124)
LOAD 22 ROM: file 0:/ROM/11M_328.ROM at 530000 (126)
LOAD 24 ROM: file 0:/ROM/11M_329.ROM at 540000 (130)
MOUNT image 0:/DISKS/AG.IMG
MOUNT image 0:/DISKS/ANSYS.IMG
MOUNT image 0:/DISKS/CSI_321B.IMG
MOUNT image 0:/DISKS/CSI_321R.IMG
MOUNT image 0:/DISKS/FORTRA.DSK
MOUNT image 0:/DISKS/51SYS_DS.DSK
MOUNT image 0:/DISKS/51DS_BK.DSK
MOUNT image 0:/DISKS/BK326.IPL
Card installed OK
Card mounted OK

-----------------------------
Network setting:
DHCPNAME=AZNET-BK.home.maxiol.com
MAC=00.0e.35.22.0b.01
DHCP=ON
IP=0.0.0.0
MASK=0.0.0.0
GW=0.0.0.0
NTP=0.0.0.0
DNS1=0.0.0.0
DNS2=0.0.0.0
NTP_BROADCAST=OFF
SNMP_COMMUNITY=maxiol
SNMP_TRAP=0.0.0.0
SNMP_TRAP_CHECK_PERIOD=0
SNMP_OK1=0.0.0.0
SNMP_OK2=0.0.0.0
SNMP_OK3=0.0.0.0
SNMP_OK4=0.0.0.0
SNMP_OK5=0.0.0.0
TIMEZONE=0
IO11 init ok
Begin main work




SuperMax
Загрузка ПЗУ

Пример az.ini
Код

[ROM]
R00=0:/rom/AZBOOT.ROM
R08=0:/rom/bz326.rom
R11=0:/rom/HDD326.ROM
R16=0:/rom/11m_324.rom
R18=0:/rom/11m_325.rom
R20=0:/rom/11m_327.rom
R22=0:/rom/11m_328.rom
R24=0:/rom/11m_329.rom
[disks]
D0=0:/disks/AG.IMG
D1=0:/disks/ANSYS.IMG
D2=0:/disks/CSI_321B.IMG
D3=0:/disks/CSI_321R.IMG
D4=0:/disks/fortra.dsk
D5=0:/disks/51SYS_DS.DSK
D6=0:/disks/51DS_BK.DSK
D7=0:/disks/BK326.IPL
[boot]
D7


Секция ROM обязательна и всегда должна быть первой
привязка основных ROMов будет статична тк является ключевой для эмуляции стандартного набора ПЗУ разных БК

разберем строчку:
Код
R00=0:/rom/AZBOOT.ROM


R00 - номер слота куда будет загружено ПЗУ
нумерация от R00 до R63
(весь сегмент ПЗУ - 256кБ - соответственно всего 64слота)
соответственно если ПЗУ 8кБ то она займет 2 слота

Код
0:/rom/AZBOOT.ROM

тут очевидно путь к файлу

Распределение адресного пространства ПЗУ
Нажмите для просмотра прикрепленного файла
обращаю внимание на то, что физический адрес - словный

столбец окно маппера как раз показывает номер для мапирования
те для подключения ПЗУ AZ326.ROM которое загружено с адреса 440'000(8)
мы должны занести в регистр слота - в нашем случае 177334 (тк мы подключаем в окно 160'000(8)), значение 110(8)

Если мы хотим подключить длинное ПЗУ которое занимает два слота маппера то надо указать оба
Код

            mov        #120,@#177330         ; окно 140000-147777
            mov        #121,@#177332         ; окно 150000-157777
            bis        #30000,@#177340       ; включаем страницы


SuperMax
Стартовая последовательность

1. После нажатия RESET на БК (или включения) питания процессор в БК остановлен
2. Запускается STM32, удерживает RESET в низком состоянии и начинает загрузку конфига AZ.INI и его исполнение
3. Загружаются образа ПЗУ в оперативку для эмуляции ПЗУ
4. После завершения инициализации инфраструктры, STM32 отпускает RESET и БК может стартовать
5. Инициализирует сетевой стек до старта БК (подъема RESET через штатную цепь заряда конденсатора)
6. Старт БКшки с AZ осуществляется с адреса 177000 по которому отвечает стартовое однорегистровое ПЗУ.
6. Старт БКшки с AZ осуществляется с адреса 170000
7. Программа в нем подключает ПЗУ AZBOOT c адрес 170000 и передает управление ему.
8. ПЗУ AZBOOT включает сеть и инициализирует оборудование AZ
9. AZBOOT передает управление стандартному монитору (в БК-0010 со 100000 а в БК-0011М о 140000)

Цветовая индикация,стадии
1-2 - фиолетовый
3 - синий
4-5-6-7 - зеленый
8,9 - красный-зеленый (адрес по DHCP еще не получен) или синий-зеленый (есть адрес по DHCP)

далее при обращении к карточке могут быть сочетания до белого

SuperMax
Индикация режимов работы

AZБК снабжен RGB сетодиодом в целях экономии места и увеличения функционала

Индикация ошибок - подробно расписано тут

1. При старте если все OK - горит зеленый

2. Сеть в номинальном режиме работы: раз в секунду гасит зеленый и зажигает синий потом обратно - те синий-зеленый раз в секунду

3. Процесс неполучения адреса по DHCP [или отсутствия сетевой карты]
раз в секунду зеленый гаснет но синий не загорается, загорается красный

4. Сетевая активность - только при отправке пакетов ибо мусор из сети валится постоянно
зеленый не горит, синий моргает часто

5. Активность контроллера - малиновый [синий +красный], при совмещении с сетью получаются сочетания до белого.
SuperMax
Кнопка перезапуска на AZ
изначально, подразумевалось что перезапуск будет идти с платы БКшки, и на самом AZ не предусматривалась установка кнопки перезапуска, однако это можно легко сделать

необходимо подключить кнопку между контактами NRST и GND

к примеру можно так:
Нажмите для просмотра прикрепленного файла

Данная кнопка перезапустит STM32, а он в свою очередь осуществит полный перезапуск и БКшки и ПЛИС
SuperMax
Проект звуковой части

1. COVOX - уже реализован

набор регистров доступных и по чтению и по записи
177200 - 16bit левый канал
177202 - 16bit правый канал
177204 - 16bit моно, иначе говоря запись в этот регистр приводит к фактической одновременной записи в регистры 177200 и 177202
177206 - 8bit стерео/mono, иначе говоря запись в этот регистр приводит к фактической одновременной записи в
регистры 177200 и 177202 - в старший байт
режимы stereo/momo определяются по байтовой записи
те если писать слово в 177206 то это будет стерео
а если писать младший байт в 177206 то данные будут трактоваться как моно

запись в 177714 мультирежимная
ибо у нас есть 2 варианта ковокса
1. моно 8bit - запись в младший байт
2. стерео 8bit - МЛБ - левый СТБ-правый
переключать режимы видимо придется через регистр тк байтовую запись в младший байт завернули на AY

соответственно запись туда
тоже приводит к фактической одновременной записи в 177200 и 177202
обеспечивая полную совместимость со старым софтом

Регистр управления звуком - 177212
биты:
00 - легаси перехват ковокса в 177714: 0=моно 1=стерео
01 - =0 разрешен легаси перехват 177714 =1 запрещен
02 - =0 разрешен перехват 177716 =1 запрещен
03 - =0 YM2149 =1 AY8910 тип эмуляции PSG
перехват сделан 3х битный


2. DMA контроллер звука - реализован
177160 - регистр управления
регистр скорости чтения , режима интерпретации данных (8/16 моно стерео), повтора

//reg_dma_ctrl
00 - старт =1 старт
01 - =1 однократный запуск =0 циклический , при этом надо записать =0 в 3й бит
при циклическом запуске, запись 1цы даст останов после завершения цикла, с установкой в =1 бита3
02 - =1 принудительная остановка до завершения цикла
03 - на чтение =1 однократный запуск завершился, в начале сбрасывается на ноль, запись =1 не влияет на процесс
04 - =1 потоковое воспроизведение с подкачкой данных, актуально для IMA_ADPCM в этом режиме на стадии начала цикла не происходит сброса начальных кодов декодирования ADPCM

// 06-07-08 - скорость выдачи наружу
поддерживаемые скорости
0 - 44100

// 09-10-11 - режим интерпретации
// 09 - =0 моно =1 стерео
// 11 - =0 PCM =1 IMA_ADPCM
поддерживаемые режимы:
000-0 PCM 16 mono
100-4 IMA ADPCM DECODER mono
101-5 IMA ADPCM DECODER stereo


177162 - регистр адреса страницы с которой будем читать с дискретностью 10000 (4кБ)
177164 - старшая часть длины - 8бит
177166 - младшая часть длины - 16бит
177170 - номер текущей страницы воспроизведения

данные с DMA пойдут напрямую на микшер отдельным каналом

3. AY эмуляция
штатный перехват 177714 - реализован


4. AYх2 эмуляция (турбосаунд) - уже реализован
Прямая доступность регистров на шине, а именно доступны байтовые регистры
177172 - адрес AY1
177173 - данные AY1
177174 - адрес AY2
177175 - данные AY2

адреса и данные в прямом коде, инвертировать ничего не надо

X. Микшер
пока рождается концепция
- несколько каналов звука
- регулировка громкости сдвигом на/до 16 бит

SuperMax
По заявкам телезрителей родилась еще более новая версия расширенных видеорежимов
первая версия со строчным управлением мне кажется слишком сложной и не дающей никаких преимуществ

итак проект такой

177230 - регистр управления
177232 - регистр номера страницы начала отображения

177230, далее пойдут биты с описанием
1;0 - режим цветовой интерпретации
4;3 - длина строки в словах
7;6 - растяжение по горизонтали - те количество повторов у точки
10;9 - количество повторов строк
15;12 - длина рулона в словах

теперь подробно
режим цветовой интерпретации, значение от 0 до 3
0 - 1 бит на цвет - 2 цвета
1 - 2 бита на цвет - 4 цвета
2 - 4 бита на цвет - 16 цветов
3 - 8 бит на цвет - 256 цветов

длина строки в словах
0 - 32 слова
1 - 64
2 - 128
3 - 256
это значение должно соответствовать вашему режиму - иначе будут повторы или пропуски данных
расчет прост - к примеру мы выбрали 512х384х16 цветов
считаем 512точек х 4 бита = 2048бит /16 = 128 слов

растяжение по горизонтали - те количество повторов у точки
0 - х1 - те 1024 точки в строке
1 - х2 - 512
2 - х3 - 256
3 - х4 - 128

количество повторов строк
0 - х1 - 768 строк
1 - х2 - 384
2 - х3 - 256
3 - х4 - 192

длина рулона в словах
0 6144
1 8192
2 12288
3 16384
4 24576
5 32768
6 49152
7 65536
8 98304
9 131072
10 196608
11 262144
длина дает информацию контроллеру для корректной работы вертикального скролинга
и важный момент - длина рулона может быть БОЛЬШЕ чем экран
иначе говоря можно объявить экран в 32кБ (к примеру 256х256х16цветов )
а рулон выбрать в 64кБ, что позволит осуществлять формирование того что выйдет на экран ЗА его пределами ДО его вывода рулоном


типовые видеорежимы (значение восьмеричные)
012201 - 256х256х4цвета (экран 16кБ)
012100 - 512х256х2цвета (экран 16кБ)
032212 - 256х256х16цветов (экран 32кБ)

регистр 177232 - адрес страницы начала отображения
те можно начинать отображение с любой страницы в памяти

общее количество возможных сочетаний видеорежимов получается 60шт
SuperMax
UART (RS-232 EIA-232 COM ком-порт)

адреса стандартные
177560 - регистр статуса приемника
177562 - регистр управления + регистр принятых данных
177564 - регистр статуса передатчика
177566 - регистр данных на передачу

177560 - регистр статуса приемника
бит 7 - флаг наличия данных: единица означает наличие принятых данных в регистре 177562
после чтения 177562 - флаг будет сброшен
регистр доступен на чтение
запись игнорируется, ошибки не взывает

177562
- по чтению - младший байт содержит принятые данные
- по записи - слово определяющее скорость, подробности ниже
дефолтное значение 32346(8) что соответствует стандартной скорости в 9600бод

177564 - регистр статуса передачика
бит 7 - флаг успешной передачи данных: единица означает что байт из регистра 177566 успешно передан в линию
после записи в 177566 - флаг будет сброшен тк начнется передача
регистр доступен на чтение
запись игнорируется, ошибки не взывает

177566 - регистр данных на передачу, используется младший байт, доступен на чтение и запись
после записи начинается передача в линию

Слово определяющее скорость - доступно только по записи
Нажмите для просмотра прикрепленного файла

те для переключения UART-a на скорость 2400бод мы записываем 64713(8) в регистр 177562

технически эти константы вычисляются так:
константа скорости = (65 000 000)/(бодовая скорость)
те в принципе можно сделать любую доступную скорость в пределах 16ти битного делителя.

дефолтное значение 15163(8) что соответствует стандартной скорости в 9600бод.

Техническая реализация на плате
порт реализован в двух режимах напряжений
TTL - 3.3V
EIA-232 (+-12V)
переключение режимов осуществляется перемычками JP2 и JP3
Нажмите для просмотра прикрепленного файла
положения перемычек подписаны - TTL и EIA232

соответственно для включения TTL надо JP2 и JP3 установить в положение 2-3
Нажмите для просмотра прикрепленного файла

для переключения в режим EIA232 надо JP2 и JP3 установить в положение 1-2
Нажмите для просмотра прикрепленного файла

также есть перемычка JP1 установка которой позволяет вывести +5В с БК на 9й пин порта
это может потребоваться для изготовления своих устройств питающихся от AZ


Старая таблица, актуальна только для прошивки #9
Нажмите для просмотра прикрепленного файла
Начиная с 10й прошивки RS232 переведен на тактирование от 65MHz

SuperMax
К расширенным видеорежимам добавились слои

теперь вот так:

177230 - регистр управления
177232 - регистр номера страницы начала отображения - верхняя страница
177240 - регистр номера страницы начала отображения - средняя страница под спрайты
177242 - регистр номера страницы начала отображения - нижняя страница - под фон
177250 - регистр вертикального скролинга
177244 - регистр управления кадровыми прерываниями
177230, далее пойдут биты с описанием
2;0 - режим цветовой интерпретации
4;3 - длина строки в словах
7;6 - растяжение по горизонтали - те количество повторов у точки
10;9 - количество повторов строк
15;12 - длина рулона в словах

теперь подробно
режим цветовой интерпретации, значение от 0 до 7
0 - 1 бит на цвет - 2 цвета
1 - 2 бита на цвет - 4 цвета
2 - 4 бита на цвет - 16 цветов
3 - 8 бит на цвет - 256 цветов

4 - 1 бит на цвет - 8 цветов - сборный "слоеный" режим
5 - 2 бита на цвет - 4 цвета - включены слои
6 - 4 бита на цвет - 16 цветов - включены слои
7 - 8 бит на цвет - 256 цветов - включены слои

пояснение к "слоеному" или "плановому" режиму 4
цвет формируется из 3х планов по 16кБ из которых считывается по 1 биту
номер цвета собирается так
старший бит [2] - из верхнего слоя (регистр 177232)
средний бит [1] - из среднего слоя (регистр 177240)
младший бит [0] - из нижнего слоя (регистр 177242)

данный режим интересен возможностью формировать текст читаемый сразу на VGA и на стандартном выходе
к примеру:
177232<-4 ая страница те 40000-77777 стандартный экран на БК11 и БК10
177240<-2000
177242<-2004

получается что если мы будем выводит основной текст по стандартному адресу 40000-77777
а цветовые аттрибуты в страницы 2000 и 2004 то у нас на VGA будет цветной текст
а на стандартном выходе - белый текст на черном фоне

этот подход удобен для создания универсального ПО с минимальными затратами



длина строки в словах
0 - 32 слова
1 - 64
2 - 128
3 - 256
это значение должно соответствовать вашему режиму - иначе будут повторы или пропуски данных
расчет прост - к примеру мы выбрали 512х384х16 цветов
считаем 512точек х 4 бита = 2048бит /16 = 128 слов

растяжение по горизонтали - те количество повторов у точки
0 - х1 - те 1024 точки в строке
1 - х2 - 512
2 - х3 - 256
3 - х4 - 128

количество повторов строк
0 - х1 - 768 строк
1 - х2 - 384
2 - х3 - 256
3 - х4 - 192

длина рулона в словах
0 6144
1 8192
2 12288
3 16384
4 24576
5 32768
6 49152
7 65536
8 98304
9 131072
10 196608
11 262144
длина дает информацию контроллеру для корректной работы вертикального скролинга
и важный момент - длина рулона может быть БОЛЬШЕ чем экран
иначе говоря можно объявить экран в 32кБ (к примеру 256х256х16цветов )
а рулон выбрать в 64кБ, что позволит осуществлять формирование того что выйдет на экран ЗА его пределами ДО его вывода рулоном


типовые видеорежимы (значение восьмеричные)
012201 - 256х256х4цвета (экран 16кБ)
012100 - 512х256х2цвета (экран 16кБ)
032212 - 256х256х16цветов (экран 32кБ)

регистр 177232 - адрес страницы начала отображения
те можно начинать отображение с любой страницы в памяти

для слоев добавлены регистры 177240 - средний слой под спрайты
и 177242 под фон


общее количество возможных сочетаний видеорежимов получается 60шт


Концепция работы слоев

1. у нас три страницы с картинками
пусть первая - это нижний фон (адрес страницы 177242)
вторая - двигающиеся герои, факелы монстры и прочее (адрес страницы 177240)
третья - верхний фон (адрес 177232) который перекрывает объекты под ним - к пример колонна или дерево, за которое можно "зайти"

2. видеосистема складывает все три страницы

наивысший приоритет - верхний фон, те если там не =0 то идет перекрытие
далее вторая страница
и уже в самую последнюю очередь - нижний фон который перекрывает любой [не нулевого цвета] объект на странице выше

значение =0 это прозрачный цвет

3. слияние слоев работает в режимах от 4х цветов ибо в меньшем это просто лишено смысла


4. Для каждого слоя назначается своя палитра
4.1 для видеорежима с 2бит на цвет (пример 12205)
Верх - палитра 0
Середина - палитра 1
Низ - палитра 2
ну и так как палитры можно крутить, то можно назначить любой цвет в пределах 15ти бит
всего получается
В- 3й цвета (один прозрачный)
С- 3й цвета (один прозрачный)
Н- 4й цвета
итого 10 цветов, что круто ибо манипулировать-то надо всего 1й 16кБ страницей со спрайтами

в случае если будем делать мортал комбат - верхний фон можно пустить под одного героя
а середину под второго (ну а фон и останется фоном)
тогда решать задачу затирания спрайтов не придется совсем!

4.2 для 16ти цветных режимов тоже персональные палитры - но пул уже берем от типовой 256цветной палитры (см про палитры)
всего получается 15+15+16=46 цветов - КРУТО!
напомню формулу формирования цвета
цвет на выходе = VideoModeOffset + PaletteOffset + ColorIndex ;

VideoModeOffset - смещение видеорежима
cмещение - кол-во цветов (значения десятичные)
0 - 256
256- 4 х16
320- 16
336- 2
соответственно для 16ти цветов и слоев получаетяцвет на выходе = 0 + <номер слоя> + ColorIndex ;номер слоя:
верх -0
середина 1низ - 2

4.3 для 256цветов палитра очевидно едина ибо их хватит на все

4.4 режим монохрома в наложение не интересен, но тк код есть то я сделал его слоями
те В - старший бит ; С- cредний бит; H - младший бит цвета из 16ти цветной палитры
иначе говоря получился "плановый" видеорежим
к примеру код 12204 - это три страницы по 16кБ складываются в 8ми цветный 512х256 режим

Палитра - верхний кусок от 16ти цветной:
Нажмите для просмотра прикрепленного файла
те сборному коду 0 соответствует 8код цвета



примеры:

у нас установлен режим 4 цвета 256х256 (значение 12205 в регистре 177230 ) а палитра - пусть стандартная

итак верхняя страница задана в 177232
средняя в 177240
нижняя фоновая в 177242

читаем из верхней средней и нижней [далее В C Н] по два бита

В=11 - тк это не =0 то это перекрывающиее значение и оно идет на экран через трансляцию палитры

читаем дальше
B=00 - =0 значит фон прозрачный - надо идти дальше
С=00 - =0 и тут прозрачно - значит выводим то что на странице Н
Н=10 - код 10 идет на идет на экран через трансляцию палитры

читаем дальше
B=00 - =0 значит фон прозрачный - надо идти дальше
С=01 - !=0 дальше уже не идем и показваем спрайт из средней страниц
и код 01 идет на идет на экран через трансляцию палитры


читаем дальше
B=00 - =0 значит фон прозрачный - надо идти дальше
С=00 - =0 и тут прозрачно - значит выводим то что на странице Н
Н=00 - тк уже некуда просвечивать то этот код (00) идет на экран через трансляцию палитры

очевидно что коду 00 мы можем назначить любой из 32768 цветов равно как и другим кодам





Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2023 Invision Power Services, Inc.