Настало время отчитаться об очередном этапе разработки контроллера - расширении API для управления монтированием образов.
Итак, в API у нас теперь добавилась группа команд 8x. Вот их описание:
80 — получить имя образа
Команда предназначена для получения имени KDI-файла, смонтированного в данный момент на логическом устройстве A или B. Номер устройства задается в поле DRV. Возвращается 14-байтовый буфер с именем файла, заканчивающийся 0.
81 — смонтировать образ
Команда монтирует один из имеющихся KDI-образов к логическому диску. Образы должны быть расположены на SD-карте в каталоге DISK/. Параметры команды:
DRV — номер устройства
TRK — режим доступа к диску: 0 — чтение/запись, 1 — только чтение.
SEC — 0 - временное мотирование, 1 - постоянное
Постоянное монтирование позволяет сохранить связь логического диска с конкретным KDI-образом после перезагрузки системы. Для этого в корне SD-карты создается файл MOUNT.CFG, содержащий в себе имена файлов, монтируемых к дискам А и В при загрузке системы. Если такого файла нет, то он создается, а в качестве имен файлов назначаются значения по умолчанию — DISKA.KDI и DISKB.KDI.
После ввода команды контроллеру передается 14-байтовый буфер с именем назначаемого файла, окнчивающийся 0. Контроллер проверяет наличие файла и его информационный сектор, в случае ошибок монтирование не происходит, а флаг состояния устройства опускается.
82 — проверка состояния устройстваКоманда возвращает ответ ОК, если устройство смонтировано, или Fail, если не смонтировано. Флаг состояния автоматически опускается в случае ошибок ввода-вывода на данном устройстве. С помощью этой команды можно проверить результат предыдущего вызова mount (81)
83 — создать образ
Команда создает на SD-карте пустой KDI-файл с указанным именем, формирует в нем инфосектор и пустой каталог. Команде надо передать 14-байтовый буфер с именем создаваемого файла. Если файл существует, то он будет полностью затерт с потерей всей информации. После создания файл автоматически монтируется на указанный в DRV диск.
На данный момент создается стандартный KDI-файл размером 800К. В будущем планируется добавить параметры для создания файла произвольного размера.
84 — получить каталог образов
Команда предназначена для просмотра каталога всех KDI-файлов, имеющихся на карте. Она отдает цепочку строк размером 14 байт для каждого из имеющихся файлов. Признаком конца цепочи является байт 00 (строки имен файлов не могут начинаться с 00).
Теперь у нас есть все инструменты для управления образами дисков прямо с корвета. Я написал для этого утилиту MOUNT под CP/M. Для этого пришлось приспособиться к убогому компилятору C80, но в конце концов я приспособился и получилась вполне приличная вещь.
Вот пример работы с программой:Код:Формат командной строки: MOUNT - без аргументов показывает текущие смонтированные образы MOUNT /L - Выводит список файлов-образов KDI в каталоге DISK/ карты MOUNT [ключи] DRV[:] FILE подключает образ FILE к логическому диску DRV FILE - образ KDI, лежит в каталоге DISK/ SD-карты контроллера DRV - буква монтируемого диска, A или B. Двоеточие в коце необязательно. /R - подключить образ в режиме только чтение. /P - сделать назначение диска постоянным /C - создать пустой образ диска и смонтировать его
Следует быть осторожным с постоянным монтированием диска А, пока мы не придумали интерфейс доступа к монтированию в аварийных ситуациях. Дело в том, что если на новом образе диска А не окажется программы MOUNT, то перемонтировать этот диск будет уже нечем. В этом случае следует просто удалить файл MOUNT.CFG из корня карты (или каталога extrom/ в эмуляторе). Тогда будут восстановлены образы DISKA и DISKB по умолчанию.Код:CP/M-80 vers. 2.2 EXTROM disk emulation BIOS v1.02 A>MOUNT /L HLP.KDI | DISK_B.KDI | TDISK.KDI | SYS.KDI | DISK_A.KDI | OSCPM.KDI | TD.KDI | E.KDI | -- Всего 8 файлов -- A>MOUNT /R B OSCPM A>MOUNT A: => (R/W) DISKA.KDI B: => (R/O) OSCPM.KDI A>MOUNT /C B TEST11 B: Создание файла...ok A>MOUNT A: => (R/W) DISKA.KDI B: => (R/W) TEST11.KDI
Во вложении я кладу архив extrom_mount.7z, содержащий новую прошивку контроллера с поддержкой данного расширения API, а также образ MOUNT.KDI, содержащий исходники и готовую собранную программу MOUNТ. Кроме того, я вложил туда текстовый документ api_v2.odt, с полным описанием текущей версии API. Этот файл можно использовать как базовый при написании будущего пакета документации к нашей разработке.
ESL, я позволил себе также внести все исправления в эмулятор. Сам понимаешь, для отладки мне жизненно необходим инструмент поудобнее реального корвета. Прикладываю архив kemu_newapi.7z, содержащий доработанный файл ext_rom.c. Мои изменения:
- Полностью введена поддержка новых вызовов 80-84.
- Поддержка флагов состояния устройства, и флагов R/O-R/W
- Поддержка постоянного монтирования и файла списка монтирования MOUNT.CFG такого же формата как и в реальном контроллера.
- Исправлена серьезная ошибка в приеме пакета (иногда получалась неправильная КС) и ошибка реализации команды NOP (00).
- Полностью реализован режим подмены системных дорожек (у тебя был только прием команды A0 и установка флага). Образы дорожек берутся из файла SYSTEM.BIN (это переименованный exrsystem.cim), лежащего в корне extrom/.
- Образы KDI теперь живут в каталоге DISK/ внутри extrom/, то есть как на реальном контроллере. Это нужно для того, чтобы образы дисков не мешались в кучу с другими служебными файлами и не лезли в список по команде DIR (84).
- Теперь все имена образов, а также DISK/ и MOUNT.CFG записаны большими буквами. Дело в том, что FAT, в отличие от ext*, не отличает больших и маленьких букв, и по стандарту в каталоге должны использоваться только большие буквы. Отнако линуксовый драйвер VFAT на это забивает, что иногда приводит к неприятным последствиям в виде двух файлов с одинаковым именем. Мне уже задрало каждый раз переименовывать файл при копировании из extrom/disk/ на реальную карту. Поэтому предлагаю на будущее имена образов дисков писать только большими буквами.
Что я не стал менять, так это различие в именовании дисков по умолчанию. В контроллере - DISKA и DISKB, у тебя в эмуляторе - DISK_A и DISK_B. Раз ты их так назвал - тебе и решать.
Ну, надеюсь, мои наработки тебе пригодятся при доработке эмулятора.
Теперь осталось придумать аварийный интерфейс для доступа к утилите mount, Мы тут начали это дело обсуждать, но как-то пока заглохло. И ждем универсальный загрузчик от ESL, он его уже отлаживает. Ну и на этом первый этап будет завершен - останется потестировать, исправить баги, и можно будет объъявлять первый релиз.




Ответить с цитированием