![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
SuperMax |
![]()
Сообщение
#1
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 341 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Палитры V2
управление палитрами осуществляется через 2 регистра палитры первый (177234) - адрес ячейки палитры второй(177236) - значение палитры 15bit адреса ячеек палитры будут начинаться с большей Код нумерация кодов цветов палитра коды цветов (адреса ячеек палитры) 256 0-255 4х16 256-319 16 320-335 2 336-337 так получается полностью независимые палитры без пересечений + явный дубль стандартного функционала палитр, те можно переключать палитры как и ранее, но теперь доступна опция настройки каждой штатной палитры! и как следствие палитры не надо будет перегружать при переключении видеорежима для удобства формирования палитр сделал эксельку v2.6 от 2023.11.07 ![]() начиная с v15 базовая палитра изменена v2.8 от 2024.02.07 ![]() изменения косметические, касаются только палитры 256 цветов - ее начало изменено на 32 градации серого тк в стандартной WEB-safe которая взята за базу, такого набора градаций серого почему-то нет эта палитра загружена в ПЛИС, а также перегружается при запске явно. именно эта палитра используется при конвертации графики этим конверетером https://master.pdp-11.ru/picword3/picword.php основная задача этой эксельки - сформировать файл mif для загрузки дефолтной палитры при старте ПЛИС также она пригодится разработчикам для пересчета цветов в 15bit пояснения к блоку 4x16 256-319 это 16 наборов палитры, изначально туда грузятся штатные значения, но их можно менять на любые! нумерация прямая - те нулевая палитра это 256-257-258-259 ячейки следующие 4 ячейки это 1ая палитра и так далее управление палитрами осуществляется через 2 регистра 177234 - адрес ячейки палитры [9бит] 177236 - значение палитры [15бит] Код РЕГИСТРЫ УПРАВЛЕНИЯ ПАЛИТРАМИ АДРЕС = 177234 ФОРМАТ РЕГИСТРА ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ └────АДРЕС ПАЛИТРЫ───────┘ Доступен по чтению и записи АДРЕС = 177236 ФОРМАТ РЕГИСТРА ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │15│14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │ │ └──────────ЗНАЧЕНИЕ ПАЛИТРЫ────────────────┘ Доступен по чтению и записи Палитра 15bit ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │14│13│12│11│10│09│08│07│06│05│04│03│02│01│00│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ └─────RED────┘ └───GREEN───┘ └────BLUE────┘ формулу формирования цвета цвет на выходе = VideoModeOffset + PaletteOffset + ColorIndex ; VideoModeOffset - смещение видеорежима cмещение - кол-во цветов (значения десятичные) 0 - 256 256- 4 х16 320- 16 336- 2 PaletteOffset существует только для штаного видеорежима 4 цвета во всех остальных случаях =0 номер палитры - смещение 0 - 0 1 - 4 2 - 8 итд ColorIndex - непосредственно номер цвета в видеорежиме, начиная с 0 Примеры работы с палитрой надо загрузить новые значения для 16ти цветной палитры для этого мы последовательно пишем 320.-> 177234 те устанавливаем адрес палитры теперь мы можем записать значение <новое значение> -> 177236 (также после установки адреса палитры мы можем ее и считать) Примеры работы с экселькой к примеру делаем новые значения для 16ти-цветой палитры ![]() слева вводим стандартные RGB значения в hex справа получаем как этот цвет выглядит (надо включить макросы) и восьмеричные значения цвета номер палитры - в столбце номер цвета Как включить макросы в эксельке идем в настройки ![]() ![]() ![]() Утилита-пикер формирующая 15ти-битный цвет AZБК от автора БК-Арена ![]() -------------------- Живы будем - Не помрем !
|
![]() ![]() |
SuperMax |
![]() ![]()
Сообщение
#2
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 341 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Модель управления памятью в AZ V2 с поддержкой эмуляции БК11М на БК10
Правки от 2023-04-13 Регистры 177300 - окно 000000-007777 177302 - окно 010000-017777 177304 - окно 020000-027777 177306 - окно 030000-037777 177310 - окно 040000-047777 177312 - окно 050000-057777 177314 - окно 060000-067777 177316 - окно 070000-077777 177320 - окно 100000-107777 177322 - окно 110000-117777 177324 - окно 120000-127777 177326 - окно 130000-137777 177330 - окно 140000-147777 177332 - окно 150000-157777 177334 - окно 160000-167777 177336 - окно 170000-176777 177340 - Регистр управления активацией окно - маски окон 177342 - Регистр управления r/o на окно 177344 - Регистр управления shadow окон - маски окон 177346 - Регистр управления маппером 177350 - регистр копия по записи 177130 в режиме записи управления памятью в SMK 177352 - регистр копия по записи 177716 в режиме записи управления памятью в БК11М Концепция: маппер 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 -------------------- Живы будем - Не помрем !
|
![]() ![]() |
Текстовая версия | Сейчас: 20.6.2025, 1:27 |