Абзац
:: Поиск
:: ПоддерЖка ПрОекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №27 (05.08.2006) ПрОсмотрОв: 2583

    Автор: Влад Сотников.

    Рубрика: Читатель читателю.

    Номер: №27 (05.08.2006).



    Работа с мультисессионными компакт-дисками

    В 25-м номере газеты «Абзац» мною была опубликована статья, посвященная описанию программирования CD-ROM. При этом, к большому моему сожалению, в ней остались слабо освещенными вопросы работы с мультисессионными дисками. В этой небольшой заметке мне хотелось бы исправить этот маленький недостаток.

    Итак, этот текст будет вам полезен и понятен лишь при условии, что вы ознакомились с моей основной статьей: «Программирование CD-ROM на Спектруме». Там описан принцип подачи команд на контроллер CD-ROM’а, подпрограммы взаимодействия с этим контроллером, и т.д. Здесь же будет приведено описание одной из ATAPI команд, которая и позволяет обращаться на компакт-диске к нужной нам сессии.

    Для начала необходимо получить базовое представление о том, что же это слово «сессия» означает применительно к компакт-диску. Чтобы не вдаваться в технические подробности, примитивно организацию информации на компакт-диске (в файловой системе ISO-9660) можно представить следующим образом: вначале идет описание диска - TOC (Table of Contents, 16-й сектор), в котором находится указание на корневой каталог (находящийся в последующих секторах), и далее последовательно располагаются тела файлов. Допустим, у нас на диске записано 2 файла. Можно представить следующее расположение секторов:


    Сектор    Описание
        16    TOC с указанием на корневой каталог
        23    корневой каталог
     28-31    тело 1-го файла
     32-34    тело 2-го файла

    В 16-м секторе указано расположение корневого каталога - в 23 секторе, а в корневом каталоге описано расположение тел первого файла (сектора 28-31) и второго (сектора 32-34). Далее идет свободное пространство.

    Как известно, в CD-R дисках записать информацию в сектор можно лишь один раз. Т.е., допустим, записанные сектора в нашем примере (с 0 по 34) переписать уже не удастся. Однако существует возможность добавления файлов на CD-R диски. Допустим, мы решили добавить к нашим двум файлам еще один файл. Теперь информация будет распределена следующим образом:


    Сектор    Описание
        16    TOC-1 с указанием на корневой каталог (сектор 23)
        23    корневой каталог (с указанием на сектора: 28-31, 32-34)
     28-31    Тело 1-го файла
     32-34    Тело 2-го файла
        52    TOC-2 с указанием на корневой каталог (сектор 59)
        59    корневой каталог (с указанием на сектора: 28-31, 32-34, 64-66)
     64-66    Тело 3-го файла

    Как видим, в свободном пространстве, куда еще не производилась запись, был сформирован новый сектор TOC, а также новый корневой каталог, в котором содержится указание на первые два наших файла (расположенных на своем прежнем месте) и на третий файл (который записан после нового корневого каталога).

    Такая структура записи имеет название «сессии». Сессия - это указание на соответствующую запись TOC. Если мы будем работать с 16-м сектором с начала диска, то мы будем видеть лишь файлы, записанные в первую сессию (т.е. в нашем примере два файла). Если мы обратимся к 52-му сектору, то будем работать со второй сессией (три файла), и т.д.

    Таким образом, если на диске существует свободное пространство, то можно дописать дополнительные файлы - будет сформирована новая сессия. При этом размер занятого пространства увеличится на размер новых дописанных файлов и на размер новой служебной информации (порядка 60-ти килобайт). Количество сессий, независимо от оставшегося свободного пространства на диске, ограничено числом #AA = 170 (это число является служебным).


    Команда # 43 - Read TOC.

    При использовании этой команды мы должны задать параметры информации, которую хотим получить:

    0 - #43, код команды.

    1 - 0 = LBA, 2 = MSF

    2 - формат команды

    3 - 0

    4 - 0

    5 - 0

    6 - номер сессии

    7 \ размер выделенной

    8 / области.

    9 - (64*формат команды)

    10 - 0

    11 - 0

    Если в ATAPI-пакете в первом байте выставить число 2 (установленный 1-й бит), то информация о сессиях будет получена нами в MSF (минуты, секунды, фреймы). Это актуально для audio-дисков, но поскольку мультисессионными бывают, как правило, диски с данными (в формате ISO-9660), то более правильным будет выставить значение LBA.

    Во втором байте задается формат команды. При выставленном в нем значении 0 мы получаем данные обо всех сессиях, при значении 1 - информацию только о последней сессии. Девятый байт используется для поддержки старых приводов. Для всех современных CD-ROM он является необязательным

    При подаче команды мы еще не знаем, какого объема данные нам вернутся. Если мы выясняем информацию лишь о последней сессии, то, скорее всего, получим около 12 байт. В случае же получения таблицы всех сессий размер блока получаемых данных может доходить до 1364 байт. Поэтому мы поступаем следующим образом. В байтах 7 и 8 ATAPI-пакета резервируем размер области для получаемых данных: как правило, он равен отведенному для данных буферу. Естественно, мы можем указать и 256 байт - наше право. Далее мы посылаем команду - ATAPI-пакет, и считываем первые два байта. В них будет указано, сколько еще байт необходимо ожидать. Так, если в первых двух байтах будет содержаться число 12, то это значит, что необходимо считать дополнительно еще 12 байт (всего считанных байт будет 14). Кроме того, общий размер предстоящего блока можно получить традиционным образом, т.е. считав значение из регистра цилиндра (в нашем случае в нем будет число 14).

    Получаемая информация о сессиях имеет следующий вид:


    0 \ количество байт

    1 / на выходе

    2 - номер первой сессии

    3 - номер последней сессии


    Далее идет последовательность 8-байтных описателей каждой сессии:

    0 - 0

    1 - тип диска: audio/data

    2 - номер описываемой сессии

    3 - 0

    4 |

    5 | логический адрес

    6 | сессии (сначала старший байт)

    7 |


    В первом байте указан тип диска, причем описание битов довольно сумбурно. Нам достаточно знать, что в случае audio-диска мы имеем число #10, а в случае диска с данными (ISO-9660) - число #14 (точнее, установленный 2-й бит как признак диска с данными).

    Вот образец данных, полученных с помощью рассматриваемой нами команды. В первом случае мы задали во втором байте ATAPI-пакета число 0, т.е. мы хотим получить информацию обо всех сессиях диска. Мы формируем следующий ATAPI-пакет: #43, #00, #00, #00, #00, #00, #00, #00, #FF, #00, #00, #00. В ответ нам приходит следующая информация:


    #00, #22, #01, #03, #00, #14, #01, #00, #00, #00, #00, #00, #00, #14, #02, #00, #00, #00, #2E, #E0, #00, #14, #03, #00, #00, #00, #4C, #2C, #00, #14, #AA, #00, #00, #00, #4E, #84

    Первые два считанных байта показывают нам, сколько байт нам еще ожидать. В данном случае - 34 байта (всего, с длиной - 36). Далее мы видим номер первой сессии диска (1) и последней (3). Т.е. всего диск имеет 3 сессии, и 3-я сессия является последней. Далее идут 8-байтовые описатели каждой сессии. Мы можем видеть, что первая сессия начинается с сектора #0000, вторая - с сектора #2EE0, третья - сектора #4C2C, и последний описатель (с условным номером #AA) указывает начало свободной области: сектор #4E84. Следующая создаваемая сессия будет располагаться по этому адресу. Чтобы работать с выбранной сессией, нужно не забывать, что 16-й сектор находится в 16-м секторе от ее начала. Т.е. для второй сессии TOC будет располагаться по адресу #2EF0 (#2EE0 + 16).

    Однако гораздо чаще нам требуется информация лишь о последней сессии. В этом случае мы можем быть уверены, что нам вернется таблица, состоящая всегда из 12 байт. Так, мы подаем ATAPI-команду #43, #00, #01, #00, #00, #00, #00, #00, #FF, #40, #00, #00 и получаем следующие данные:


    #00, #0A, #01, #03, #00, #14, #03, #00, #00, #00, #4C, #2C

    Итак, мы узнаем, что диск состоит из 3-х сессий, и 3-я сессия начинается по адресу #4C2C. Т.е. ее TOC расположен на секторе #4C3C. Далее считываем информацию о корневом каталоге и продолжаем работать так, как описано мной в основной статье.

    Я надеюсь, что это дополнение поможет всем тем, кто занимается программированием HDD-устройств на Спектруме, и сэкономит им уйму времени, затрачиваемого на экспериментирование с ATAPI-командами при обращении к CD-ROM. Кроме того, именно такой принцип работы с командой #43 позволяет корректно работать с DVD-дисками.


    P.S. Автор выражает искреннюю благодарность Дмитрию Быстрову за ценные замечания, использованные при написании статьи.


    P.P.S. Для более подробного ознакомления с вопросом, Дмитрий Быстров рекомендует программу HDDoctor v0.10; прессу:

    Info Guide #8 и ACNews #45; документы: INF-8020 и ECMA-119.

    © 2004-2013 Perspective group