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.




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

Похожие статьи:
Новости - беспризорный компьютер приобрёл нового хозяина в лице моего отца, Хочу игровую приставку, В выходной день поехал покататься на велосипеде, Купил в комиссионке музыкальный центр Pionee, всё таки я ушёл в отпуск.
Вступление - стихи и содержание номера.
PartyZone - Final Shoque.
Мнение - Пoчему я не пoкидаю Speссу?
Реклама

В этот день...   28 марта