/uknc_sd_fdd

Контроллер дисковода для УКНЦ (МС0511), использующий образы дисков на SD-карте.

Primary LanguageC

Floppy drive emulator board for Soviet PDP-11 computer Elektronica MC-0511 (УКНЦ).

Orginal project site:

http://y-salnikov.github.io/uknc_sd_fdd/

SD Card layout

SD Card must have one FAT-32 partition. Directory structure:

/map.txt    <-- mapping file for up to 4 disks
/disks/     <-- directory containing disk images

map.txt example:

1:disk1.dsk
2:disk2.dsk
3:disk3.dsk
4:disk4.dsk

Hardware description:

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

 Поступающий с шины адрес инвертируется и сохраняется в регистре адреса, представленном на схеме в виде пары 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 firmware:

 Основной цикл программы непрерывно читает регистр 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.

Disk types

1 - Single-sided, image size 400kB. RT-11 supported, but not used by default.
2 - Double-sided, image size 800kB. Default in RT-11.
3 - Large disk: 256 tracks, 255 sectors, 2 sides, image size 63MB. Needs driver for RT-11.

Emulator API

 Устройство использует адреса кассеты ПЗУ для взаимодействия с УКНЦ, таким образом, для включения этих адресов в адресное пространство ПП, необходимо использовать регистр управления адресным пространством 0177054. При этом отключается часть системного ПЗУ, поэтому после завершения операции необходимо вернуть прежнее значение регистра.
 Управление устройством происходит посредством комманд, посылаемых через буфер по адресам 0116000-0117777. Аргументы команды заносятся в буфер, затем происходит инициализация команды посредством записи ее кода по адресу 117776. После инициализации команды, необходимо ожидать готовности, читая значение на линии ИНДЕКС, при этом можно вновь подключить системное ПЗУ по адресу 0100000. Буфер устройства поддерживает только операции со словами.
Command Parameters (offset from addr 116000) Operation
0 None SD-card reset & image files remapping
1 Input:
02: Disk type (1..3)
02: Disk type (1..3)
03: Disk No (top bit = disk side)
04: Track No
05: Sector No
06-07: data_size (bytes read)
08: read_bytes[data_size]
Read sector (512b)
2 Input:
02: Disk type (1..3)
03: Disk No (top bit = disk side)
04: Track No
05: Sector No
06-07: data_size (bytes to write)
08: write_bytes[data_size]
Return:
00: Error code (0==OK)
Write sector (512b)
3 Input:
02: Disk type (1..3)
03: Disk No (top bit = disk side)
04: Track No
06-07: filler bytes
Return:
00: Error code (0==OK)
Format track
4 Input:
02: data size in words
08: log_data[data_size]
Write log entry to log.txt
5 None Delay 1ms
6 Return:
00-01: data size
03: map_txt_data[data_size]
Read map.txt (max 512 bytes)
7 Input:
00-01: data size
03: map_txt_data[data_size]
Write map.txt (max 512 bytes)
8 Input:
00-01: Start file index
02-03: num files to read
Return:
00-01: bytes read
02-03: file count
04: file names[file_count] <- zero-terminated strings
Read disk directory (max 64 records at a time)

To view /vhange mappigns from host OS use CHDISK.SAV. CHKDSK paraleters:

  • -L/–LIST: list files
  • -S/-SORT: sorted list (slow)
  • N:filename.ext : map disk image to device N (N-0..3). Emulator will create file if does not exist.

#Host-side booting process

 Работа устройства начинается, когда пользователь выбирает пункт загрузки с кассеты ПЗУ. Таким образом, происходит загрузка первых 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 файлов заносится общее кол-во файлов в каталоге, а в поле длина - кол-во слов.