#Аппаратная часть.
     Схема электрическая принципиальная:
Схема устройства

     Устройство разработано на основе микросхемы серии PSoC4 от cypress - CY8C4245AXI-483, которая кроме обычного микроконтроллера на основе ARM Cortex-M0, содержит весьма необычные программируемые цифровые блоки UDB, а также программно коммутируемые аналоговые блоки. Цифровые блоки - это не программная эмуляция логических элементов на микроконтроллере, а полноценные цифровые блоки программно коммутируемые с внешними выводами, между собой и с микроконтроллером, как маленькая ПЛИС.
     Шина МПИ, используемая в УКНЦ, имеет совмещенные линии адреса и данных, что требует наличие регистра хранения адреса в устройстве. Использование блоков UDB для защелкивания и проверки диапазона адреса, обеспечивает достаточную скорость для взаимодействия устройства с УКНЦ по шине.
Конфигурация

Схема конфигурации цифровых блоков в программе PSoC Creator

     Поступающий с шины адрес инвертируется и сохраняется в регистре адреса, представленном на схеме в виде пары 8-разрядных D-трипперов. Защелкивание происходит по сигналу СИА. Далее с помощью логических элементов происходит определение принадлежность захваченного адреса устройству, проверка выбора нужного банка нужной кассеты ПЗУ, определение вида операции и поддиапозона, которому принадлежит адрес. Результат этих проверок читается микроконтроллером через регистр STATE:

  • 0-й разряд - чтение по адресу 0100000-0115776
  • 1-й разряд - чтение по адресу 0116000-0117776
  • 2-й разряд - запись по адресу 0116000-0117776

     Разряды регистра STATE устанавливаются только если выбран первый банк кассеты ПЗУ.
     При ненулевом значении этого регистра, микроконтроллер читает или устанавливает значение на шине и формирует СИП согласно протоколу МПИ.
     Также к PSoC4 подключена microSD-карта, работающая по протоколу SPI. Функционирование SPI осуществляется через блок последовательного интерфейса, который, в отличие от UDB, жестко привязан к порту 4 микросхемы. microSD-карта питается от 3.3 вольта, для понижения напряжения используется стабилизатор с низким падением напряжения, например белорусский K1235ЕН3БП или LM2931AZ. Выводы microSD-карты защищены от перенапряжения (не очень хорошо, правда).

     Все сигналы могут быть переназначены на различные выводы PSoC4, кроме порта 4. В прототипе используется следующая конфигурация.

Конфигурация выводов

Схема конфигурации выводов в PSoC Creator

     Устройство тактируется от внутреннего RC-генератора на частоте 48МГц, стабильность не нужна.

#Управляющая программа в PSoC.

     Основной цикл программы непрерывно читает регистр STATE и в случае появления в одном из разрядов единицы, осуществляет следующие действия:

  • При чтении по адресам 0100000-0115776 происходит выдача слова из массива, расположенного во флэш-памяти PSoC4. Таким образом на эти адреса отображается “прошивка” устройства, содержащая начальный загрузчик кассеты ПЗУ и драйвер. Линия БАЙТ работает только с этим диапазоном но не используется программой в УКНЦ (сделано для отладочных целей).
  • При чтении или записи по адресам 0116000-0117776 происходит чтение или запись в буфер ОЗУ PSoC, т.е. на эти адреса отображается 1Кбайт памяти.
  • При записи в адрес 0117776 происходит выполнение команды, код которой передан в записываемом слове. Параметры команды передаются через буфер 0116000-0117774.

     При выполнении данных действий, устройство формирует сигнал подтверждения СИП. Однако, в программе не использовались прерывания и при выполнении команд микроконтроллер перестает обслуживать шину МПИ, если в этот момент произойдет обращение УКНЦ по адресам устройства - произойдет зависание по вектору 4. Чтобы этого избежать используется линия ИНДЕКС. При выполнении команды, после формирования СИП, на данную линию выставляется единица, а после завершения выполнения сбрасывается в ноль и процессор в PSoC возвращается к обслуживанию шины МПИ. Таким образо, перефирийный процессор УКНЦ после запуска команды (запись в 0117776) должен читать значение с линии ИНДЕКС и ожидать готовности. Сигнал управления светодиодом LED повторяет значение ИНДЕКС.
     Для работы с файловой системой на microSD-карте используется библиотека FatFS от elm-chan. Поддерживается как обычные microSD-карты, так и более новые SDHC. Карта должна содержать один раздел, отформатированный в FAT. Образы дисков хранятся в каталоге disks, при этом файлы должны быть именованы в формате 8.3, т.е. длина файла не должна превышать восьми символов, а расширение - трех. Также не следует использовать кириллические имена файлов из-за несоответствия кодировок в УКНЦ и DOS/Windows.
     Устройство поддерживает 4 дисковода. Привязка виртуального дисковода к образу осуществляется с помощью файла map.txt в корне microSD-карты. Содержимое файла имеет следующий формат:

N:<filename>
Например:
1:image1.dsk
2:ImAgE2.DsK
3:games.dsk
4:empty.dsk

     Номер диска начинается с 1. Если какого-либо файла-образа нет, то он будет создан, размер создаваемого образа определяется типом диска. Поддерживаются следующие типы дисков:

  • 1 - Односторонний дисковод, размер образа 400Кб. Поддерживается родным ПО УКНЦ и RT-11, но не используется по умолчанию.
  • 2 - Двусторонний дисковод, размер образа 800Кб. Поддерживается родным ПО УКНЦ и RT-11, и используется по умолчанию в нем.
  • 3 - Трехсторонний Диск большой емкости, 256 дорожек, 255 секторов, 2 стороны. Размер образа ~63Мб. Необходим драйвер для RT-11, есть низкоуровневая поддержка.

#Программный интерфейс со стороны ПП УКНЦ

     Устройство использует адреса кассеты ПЗУ для взаимодействия с УКНЦ, таким образом, для включения этих адресов в адресное пространство ПП, необходимо использовать регистр управления адресным пространством 0177054. При этом отключается часть системного ПЗУ, поэтому после завершения операции необходимо вернуть прежнее значение регистра.
     Управление устройством происходит посредством комманд, посылаемых через буфер по адресам 0116000-0117777. Аргументы команды заносятся в буфер, затем происходит инициализация команды посредством записи ее кода по адресу 117776. После инициализации команды, необходимо ожидать готовности, читая значение на линии ИНДЕКС, при этом можно вновь подключить системное ПЗУ по адресу 0100000. Буфер устройства поддерживает только операции со словами.

Код команды Аргументы.
Смещение в байтах
относительно адреса 116000
Описание команды
0 нет Сброс.
Выполняется инициализация обмена с microSD-картой
и чтение файла map.txt
1 вход:
2:тип диска 1..3
3:N_диска + сторона в старшем бите
4:дорожка
5:сектор
выход:
0:код ошибки или 0
6,7:кол-во переданных БАЙТОВ
8+:данные.
Чтение сектора.
Размер сектора фиксирован и равен 512 байт.
2 вход:
2:тип диска 1..3
3:N_диска + сторона в старшем бите
4:дорожка
5:сектор
8+:данные.
выход:
0:код ошибки или 0
6,7:кол-во переданных БАЙТОВ
Запись сектора.
3 вход:
2:тип диска 1..3
3:N_диска + сторона в старшем бите
4:дорожка
6,7:код в зоне данных
выход:
0:код ошибки или 0
Форматирование дорожки.
Размер сектора фиксирован и равен 512 байт.
4 вход:
2:кол-во слов для записи в лог
8+: данные
Запись данныхв файл log.txt
Данные записываются в восьмиричном виде.
Файл пересоздается при включении питания.
Перед каждой записью создается заголовок “log entry:”
Используется для отладки.
5 нет Задержка в 1мС.
6 выход:
0,1: длина map-файла
2+: данные
Чтение файла map.txt
Размер файла не должен превышать 512 байт
7 вход:
0,1: длина map-файла
2+: данные
Запись файла map.txt
Размер файла не должен превышать 512 байт
8 вход:
0,1: N файла, с которого начинается чтение
2,3:кол-во файлов
выход:
0,1: кол-во байт прочитано
2,3: файлов всего
4+:имена файлов.
Чтение каталога disks
Данная команда не проверяет кол-во байт
нужно запрашивать не более 64 имен.
Имена могут иметь различную длину,
разделяются кодом 0

#Процесс загрузки и программный интерфейс со стороны ЦП УКНЦ.

     Работа устройства начинается, когда пользователь выбирает пункт загрузки с кассеты ПЗУ. Таким образом, происходит загрузка первых 512 байт прошивки по адресу 0 и осуществляется запуск с этого адреса. Этот начальный загрузчик загружает оставшуюся часть прошивки начиная с адреса 10000 и производит ее запуск. После этого выявляется объем доступной для выделения памяти ПП, для этого выделяется весь доступный объем памяти и сразу освобождается. Далее выделяется 2 куска памяти ПП, один свободный и освобождается, а второй с необходимым размером в конце области памяти ПП. Это сделано для того, чтобы блок начиная с адреса 23666 был доступен для любителей писать неперемещаемые программы в памяти ПП. В выделенный блок пересылается код драйвера и запускается. После этого происходит загрузка первого сектора нулевой дорожки стандартными методами и его запуск с адреса 0, после чего загружается операционная система обычным способом.
     В ОЗУ ПП, получив управление драйвер устанавливается как обработчик событий канала 2. После этого, все операции с устроиствами типа 1,2 и 3 обрабатываются этим драйвером, а операции с другими типами устройств перенаправляются на старый обработчик в ПЗУ. Таким образом происходит прозрачное для системы подключение дисков и операционная система загружается со стандартными драйверами в пространстве ЦП.
     Команды установки параметров дисковода, передаваемые через К2, игнорируются и сообщают об успешном завершении. Кроме стандартных команд: чтение (10), запись (20) и форматирование (30); поддерживаются следующие команды:

код команды массив параметров описание
101 40400
тип накопителя 1..3
адрес ОЗУ ЦП
длина
Чтение файла привязки map.txt
после выполнения в поле “длина” возвращается кол-во прочитанных слов.
102 41000
тип накопителя 1..3
адрес ОЗУ ЦП
длина
Запись файла привязки map.txt
103 41400
тип накопителя 1..3
Номер начального файла
адрес ОЗУ ЦП
N файлов
длина
Чтение директории с файлами-образами.
Читаются имена N файлов начиная с начального файла. После выполнения в поле N файлов заносится общее кол-во файлов в каталоге, а в поле длина - кол-во слов.

     Для просмотра списка файлов-образрв и изменения привязки к виртуальным дискам, (не без помощи форумчан с zx-pk.ru) была разработана программа CHDISK под RT-11. Параметры запуска:

  • -L или –LIST для вывода списка файлов
  • -S или –SORT для вывода сортированного списка, работает медленно при большом количестве файлов.
  • N:filename.ext для привязки файла к диску N, где N от 0 до 3. Если файл не существует, то будет создан.

Скриншот с загруженной RT-11 и результат выполнения команды CHDISK -L: Скриншот RT-11

#Текущее состояние

     В ходе отладки устройства было замечено, что необходимо использовать задержку при выполнении дисковых операций, иначе происходит зависание во время загрузки ОС. Причину такого поведения установить не удалось.
     Также вместо линии ИНДЕКС использовался сигнал РЕЖ2, предназначенный для детектирования типа дисковода, но изменеие уровня воспринималось УКНЦ как нажатие клавиши.
     Весь код выложен на github, однако не уверен, что его хватит для сборки, скорее всего в PSoC Creator придется производить ручные настройки. Для компиляции прошивки использовался мой недо-ассемблер, в котором вместо мнемоники используются коды команд.

Пришли платы. Заказывал на http://dirtyPCBs.com .

Плата

Собранный контроллер: Готовое устройство