ZXNet эхоконференция «hardware.zx»


тема: cdrom 1/3



от: Boris Sokol
кому: All
дата: 13 Nov 1999
Hello, All! ──────────────────────────кусать─здесь──────(file: cd1.txt)───────────── IDE-CD Информация к размышлению Данный документ никоим образом не является полным описанием стандартного IDE-CD. Здесь были собраны только основные данные, необходимые для общего понимания принципов функционирования. Предполагается знание (хотя бы в общих чертах) IDE-интерфейса (стандарт ходил под именем ATA-R4C.*). Для желающих быстро заполучить исходники для управления CD-ROM могу порекомендовать драйвер VIDE-CDD.SYS. Он проще всего поддается дизассемблированию и содержит достаточно неплохой код. Кроме того, в исходных текстах драйвера CD для Linux содержится много полезной информации, хотя ориентация на "юниксоидный" тип запросов мешает использованию этих тексты для компиляции под MS-DOS. Соглашения и используемые сокращения. При указании конкретных адресов подразумевается, что IDE-CD является мастером, адрес контроллера - 170h. Если у Вас используются другие адреса, вместо 17x необходимо подставить 1Fx, 1E8+x или 168+x. Тик = 18.2 герца. Все адреса и коды шестнадцатиричные. Данные, длиной в слово или двойное слово в/из CD идут в формате co старшим первым байтом ( в отличие от PC, где первый байт - младший). AP - Atapi пакет, 12 байт передаваемых в CD-Rom. Содержат команду и основные данные для нее. AK - Atapi команда M - минуты в формате BCD S - секунды в формате BCD F - номер фрейма в формате BCD I. Определение наличия CD в системе Для проверки присутствия Atapi-CD устройства необходимо: 1. Hа нужном шлейфе выбрать требуемое устройство (Master/Slave) в регистре 176. 2. Проверить готовность (бит 80 в регистре 177) 3. Если не готово - устройства нет. Далее можно дать команду общего сброса (вывести код 8 в регистр 177 и подождать 1-3 тика), либо попробовать обойтись без этого. Если CD находится в cостоянии ожидания команды сброс давать не обязательно. 4. В порт 177 вывести команду ECh и подождать пару тиков. 5. Проверить порт 174 (д.б. = 14h) и порт 175 (д.б. = EBh). Если все условия соблюдены, то можно считать, что на IDE-шлейфе присутствует Atapi устройство. Для уточнения типа устройства можно воспользоваться Atapi-командами. II. Выполнение команд Для выполнения AK необходимо: 1. Выбрать соответствующее устройство (Master/Slave) 2. Дождаться готовности (в порту 177) 3. Установить желательный размер блока в регистрах 174 (мл.) и 175 (ст. часть) Если команда не возвращает данные, это можно и не делать. 4. В 177 записать команду A0h. 5. Дождаться требования данных (в 177). 6. В режиме словной пересылки записать в порт 170 6 слов AP. 7. Если команда не требует дополнительных передач, то проверить статус завершения по регистрам ошибок и все. Иначе: 8. Дождаться прерывания. 9. Считать из регистров 174 и 175 длину выдаваемого (принимаемого) блока. 10. Если длина =0 - конец операции, иначе произвести обмен данными и перейти на п. 8 11. Проанализировать статус завершения. При передаче данные передаются пословно через порт 170. III. Типы команд По виду команды можно разделить на три группы: а) Управления Как правило, все данные находятся в AP. Иногда применяется дополнительно пересылаемый блок данных. В ответ CD не передает никакой информации, а результат можно определить по регистрам ошибок IDE-интерфейса (171 и 177) или с помощью дополнительной команды получения состояния. б) Передачи данных Адресные данные и параметры передачи находятся в AP Поскольку пишущие CD не рассматриваются (мне они не известны), то блок данных, передаваемых в CD, отсутствует. Если в команде подразумевается передача данных из CD и нет ошибок, CD драйв выдает в ответ на команду блок (блоки) данных. в) Получения информации Все данные о запросе находятся в AP. В ответ на команду СD выдает блок данных. IV. IDE команды У CD есть несколько вспомогательных команд, которые исполняются так же, как и команды обычного IDE винчестера. Вот основные команды: A0h - Команда передачи AP. A1h - Идентификация привода. Аналог команды ECh для IDE-винчестера, но формат выходного блока другой ECh - Воспринимается как ошибка, но в регистрах 174 и 175 устанавливается сигнатура 14 EB - признак Atapi устройства 08h - Сброс. Выполняет процедуру начальной инициализации. Также, могут выполняться некоторые команды управления сохранением энергии, установки возможностей и пр. Во многих приводах они воспринимаются как правильные команды, но реально не исполняются или исполняются частично. V. Команды в ATAPI-пакетах Первый байт в AP является кодом команды. Это единственный байт, который анализируется всегда. Остальные 11 байт содержат информацию, зависящую от конкретной команды. Команда 00h - пустышка Пакет: db 0 db 11*dup(0) ; * Hичего не делает, может применяться для проверки смены диска Здесь и далее: данные помеченые "*", как правило, не анализируются CD, но для совсместимости должны быть установлены в 0 Команда 01h - Установить на начало диска Пакет: db 01h db 12*dup(0) ; * Команда управляющая (практически не используется). Команда 03h - читать состояние привода Пакет: db 03h db 3*dup(0) ; * db Len ; длина выходного блока db 7*dup(0) ; * Hа выходе таблица из 12h байт, в которой самыми интересными являются байты 2, 0С и 0D - это код ошибки последней операции. Команда 012h - читать строку параметров изготовителя драйва Пакет: db 12h db 0h,0h ; иногда здесь устанавливаются некие параметры db 0h ; * db Len ; длина выходной строки db 7*dup(0) ; * Драйв выдает некую строку изготовителя (в формате изготовителя) Зависит от типа CD-Rom. Иногда применяется в драйверах для проверки соответствия драйвера и устройства. Команда 01Bh - управление треем и прочее Пакет: db 1Bh db 3*dup(0) ; * db Func ; подфункция db 7*dup(0) ; * Команда управляющая. Подфункции: 0 - войти в режим Sleep 1 - остановить проигрывание/чтение 2 - выдвинуть трей 3 - закрыть трей Команда 01Eh - блокировка трея Пакет: db 1Eh db 3*dup(?) ; * db Func ; подфункция db 7*dup(?) ; * Команда управляющая. Младший бит Func= 0 - разблокировать трей = 1 - заблокировать трей Команда 025h - получить размер диска в секторах. Пакет: db 25h db 11*dup(0) ; * Команда информационная. Пользователю в ответ передается блок из 8 байт: dd Sectors ; число секторов на текущем диске dd SectSize ; размер сектора (как правило, не зависит ; от диска и равен 930h) Команда 02Bh - Seek Пакет: db 2Bh db 2*dup(0) ; * db M,S,F ; куда позиционироваться db 6*dup(0) ; * Команда управляющая. Команда 042h - смешанная информация (чтение субканала) Пакет: db 42h db ScMsf ; 0/2 - тип выдачи адресов (MSF или номер сектора) db FullInfo; вариант запроса (полный/краткий - 4 db Func ; подфункция db 3*dup(0); * db LenHi ; Старшая часть длины таблицы db LenLo ; Младшая -------//---------- db 3*dup(0); * ──────────────────────────кусать─здесь──────(file: cd1.txt)───────────── Boris.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Печатается с продолжением - Бейсикo-вoеннo-пoлевoй слoварь.
Головоломки - различные головоломки.
Полезное - о скрытой функции цифрового плеера SONY и о незначительном глюке в АОH'е.
Adventure Project - Проектирование и разработака Адвентюрных и RPG игр.
Реклама - Реклама и объявления ...

В этот день...   8 мая