C-Net Week #23
31 июля 2002

Железо - CDROM в ваш дом: документация по ATAPI(IDE) CD-ROM

CDROM в ваш дом...

После  того  как я подключил к
своему     спеку     PC-клаву,
PC-мышку   и  HDD,  мне  стало
интересно,    а    можно    ли
подключить  к  спеку CDROM ? В
принципе  то  можно конечно :)
Разъем  то ведь IDE-стандарта.
Но  вся  проблема  в  том, что
контроллер у меня от господина
Nemo   :(   и   как  только  я
подрубил    шлейф   к   своему
samsung  x24  он  так  сразу и
офигел :( перестал реагировать
вообще  на любые кнопки... Что
ж  туда  ему загнал контроллер
от  Немо  я пока не разобрался
:(  но  вот  кое-какую инфу об
управлении CDROM'ом вообще и в
частности я нашел в интернете.
Возможно она покажется кому-то
интересна.

ATAPI(IDE)   CD  Информация  к
размышлению         Константин
Норватов (C) 1997

Данный документ никоим образом
не  является  полным описанием
стандартного  ATAPI-CD.  Здесь
были  собраны  только основные
данные, необходимые для общего
понимания            принципов
функционирования.
Предполагается знание (хотя бы
в общих чертах) IDE-интерфейса
(стандарт   ходил  под  именем
ATA-R4C.*).

Для желающих быстро заполучить
исходники    для    управления
CD-ROM   могу  порекомендовать
драйвер VIDE-CDD.SYS. Он проще
всего                поддается
дизассемблированию  и содержит
достаточно неплохой код. Кроме
того,   в   исходных   текстах
драйвера    CD    для    Linux
содержится    много   полезной
информации, хотя ориентация на
"юниксоидный"   тип   запросов
мешает    использованию   этих
текстов   для  компиляции  под
MS-DOS.

Соглашения    и   используемые
сокращения.

При     указании    конкретных
адресов  подразумевается,  что
CD  является  мастером,  адрес
контроллера - 170h. Если у Вас
используются   другие  адреса,
вместо      17x     необходимо
подставить   1Fx,   1E8+x  или
168+x.

Тик = 18.2 герца.

Данные   длиной  в  слово  или
двойное  слово  в/из CD идут в
формате   co   старшим  первым
байтом  (в  отличие от PC, где
первый байт - младший).

AP  -  Atapi  пакет,  12  байт
передаваемых     в     CD-Rom.
Содержат  команду  и  основные
данные для нее.

ВНИМАНИЕ:  возможно существуют
устройства  c пакетом длиной в
16  байт.  Однако, подавляющее
большинство    драйверов    не
анализируют  и не поддерживают
такой  формат. Для определения
размера   пакета  используется
ATA-команда A1h.

AK- Atapi команда
M - минуты
S - секунды
F - номер фрейма(1/75 секунды)

Часто используемые биты
регистра состояния (177h):
BSY - бит 80h
DRQ - бит 08h
CHK - бит 01h

I.  Определение  наличия  CD в
системе

Для    проверки    присутствия
Atapi-CD            устройства
необходимо:

1.  На  нужном  шлейфе выбрать
требуемое           устройство
(Master/Slave)    в   регистре
176h.
2. Проверить отсутствие BSY
3. Если занято-устройства нет.

Далее   можно   дать   команду
общего сброса (вывести код 8 в
регистр  177h  и подождать 1-3
тика),     либо    попробовать
обойтись  без  этого.  Если CD
находится      в     состоянии
нормального  ожидания команды,
сброс давать не обязательно.

3.   В   порты   174h  и  175h
записать  нечто,  отличающееся
от 14EBh.
4. В порт 177h вывести команду
ECh и подождать пару тиков.
5. Проверить порт 174h (д.б. =
14h) и порт 175h (д.б. = EBh).
При этом надо учитывать, что в
регистрах     должна     будет
установлена   ошибка  (177h  -
51h,    171h   -   04h).   Это
нормально.

Если все условия соблюдены, то
можно    считать,    что    на
IDE-шлейфе  присутствует Atapi
устройство. Для уточнения типа
устройства               можно
воспользоваться            уже
Atapi-командами.

Данный      алгоритм     может
применяться    только   тогда,
когда достоверно известно, что
CD   до   этого   не  выполнял
команд. В противном случае бит
BSY   может  быть  установлен.
Если    необходимо,   проверку
регистра    состояния    можно
смягчить,    проверяя   только
наличие  самого ATA устройства
записью в регистры.

II. Выполнение команд

Для  выполнения  AK необходимо
(работа без прерываний):
1.   Выбрать   соответствующее
устройство   (Master/Slave)  в
порту 176h
2. Дождаться готовности (BSY и
DRQ  =  0).  Драйверы  ждут до
10-20  секунд. Если готовности
нет    -    можно   попытаться
сбросить привод.
3.    Установить   желательный
размер  блока в регистрах 174h
(мл.)  и 175h (ст. часть) Если
команда  не возвращает данные,
это  можно  и  не  делать. Для
DMA-шных обменов в этот момент
надо   установить   и   другие
регистры.
4.  В  177h  записать  команду
A0h. В ответ на это устройство
может  установить BSY на время
подготовки к приему AP.
5. Дождаться требования данных
(DRQ=1 и BSY=0). (обычно ждать
не  надо  -  драйв  выставляет
требование  сразу). При этом в
регистре 172h два младших бита
должны иметь значение 01.
6.  В режиме словной пересылки
записать  в  порт  170h 6 слов
AP.
7.     Дождаться    готовности
(BSY=0).   (В  зависимости  от
типа    команды    и    других
обстоятельств,   драйв   может
выполнять  команду за время от
тысячных   долей   секунды  до
десятков     секунд     (Если,
например,    плохо    читается
сектор диска).
8. Проверить бит DRQ и если он
установлен,   то   считать  из
регистров  174h  и  175h длину
передаваемого блока.
9.  Если длина =0 или бит DRQh
в  177h не установлен - п. 11,
иначе произвести обмен данными
через  порт 170h. При этом два
младших   бита  регистра  172h
могут  принимать  значение  00
(при передаче данных в CD) или
02 (при приеме данных из CD).
10.Если  команда  не закончила
обмен    (бит    BSY=1),    то
повторить с п 7.
11.После   завершения  команды
два  младших бита регистра 172
обычно  принимают значение 03,
что означает готовность драйва
к  выдаче  статуса  завершения
команды.    При   этом   можно
проанализировать     результат
завершения  команды  (регистры
177h   и  171h).  При  ошибках
можно             использовать
ATAPI-функцию      03h     для
получения    более   детальной
информации.

III. Типы команд

По   режимам   обмена  команды
можно разделить на три группы:

а) Управления

Как    правило,   все   данные
находятся  в  AP.  В некоторых
командах           применяется
дополнительно     пересылаемый
блок  данных.  Результат можно
определить по регистрам ошибок
(171h  и  177h)  или с помощью
дополнительной         команды
получения состояния.

б) Передачи данных

Адресные  данные  и  параметры
передачи    находятся   в   AP
Поскольку    пишущие   CD   не
рассматриваются  (мне  они  не
известны),   то  блок  данных,
передаваемых       в       CD,
отсутствует.  Если  в  команде
подразумевается       передача
данных  из CD и нет ошибок, CD
драйв   выдает   в   ответ  на
команду блок (блоки) данных.

в) Получения информации

Все данные о запросе находятся
в  AP.  В  ответ на команду СD
выдает блок данных.

IV. ATA команды

У     CD     есть    несколько
вспомогательных        команд,
которые  исполняются  так  же,
как    и    команды   обычного
IDE-винчестера.    При    этом
назначение регистров совпадает
с назачением по ATA.

Вот основные команды:

A0h - Команда передачи AP.

A1h  -  Идентификация привода.
Аналог    команды    ECh   для
IDE-винчестера,    но   формат
выходного блока другой (описан
в приложении C).

ECh   -   Воспринимается   как
ошибка,  но в регистрах 174h и
175h устанавливается сигнатура
14EBh    -    признак    Atapi
устройства.

08h    -   Програмный   сброс.
Выполняет  процедуру начальной
инициализации.

Также,    могут    выполняться
некоторые  команды  управления
сохранением энергии, установки
возможностей  и  пр. Во многих
приводах   они  воспринимаются
как   правильные  команды,  но
реально   не  исполняются  или
исполняются частично.

V. Команды в ATAPI-пакетах

Первый   байт  в  AP  является
кодом       команды.       Это
единственный   байт,   который
анализируется          всегда.
Остальные   11  байт  содержат
информацию,    зависящую    от
конкретной команды.

------------------------------

Команда   00h    -   пустышка,
проверяет готовность

Пакет:
        db  0
        db  11*dup(0)   ; *

Ничего   не    делает,   может
применяться для проверки смены
диска

ПРИМЕЧАНИЯ:

1)  Первая команда после смены
диска будет отвергнута с кодом
ошибки "смена носителя".
2)   Здесь   и  далее:  данные
помеченные  "*",  как правило,
не  анализируются  CD,  но для
совместимости    должны   быть
установлены в 0.

------------------------------
Команда   01h   -   Установить
головку на начало диска

Пакет:
        db 01h
        db 12*dup(0)    ; *

Команда            управляющая
(практически не используется).

------------------------------
Команда 03h - читать состояние
привода

Пакет:
        db 03h
        db 3*dup(0)    ; *
        db Len         ; длина
               выходного блока
        db 7*dup(0)    ; *

На выходе таблица из 12h байт,
в  которой  самыми интересными
являются  байты  2,  0С и 0D -
это   три  байта  кода  ошибки
последней операции.

------------------------------
Команда  012h  - читать строку
параметров изготовителя драйва

Пакет:
        db 12h
        db 0h,0h      ; иногда
   здесь устанавливаются некие
                     параметры
        db 0h         ; *
        db Len        ;  длина
               выходной строки
        db 7*dup(0)   ; *

Драйв   выдает   некую  строку
изготовителя     (в    формате
изготовителя)  Зависит от типа
CD-Rom.  Иногда  применяется в
драйверах     для     проверки
соответствия     драйвера    и
устройства.

Структура выходного блока:
0  db 1Fh - тип устройства (CD
            =5) E0h - для CD =
1  db 7Fh  - = 0 (для совм. со
 SCSI-1) 80h -  поддерживаются
              сменные носители
2  db 0  -  версии ISO, ECMA и
                         ANSI.
3  db 0 - для совместимости со
                        SCSI-2
4  db ?  -  длина  оставшегося
                         блока
5  db 2 dup(?) - резервные
7  db 0 - для совместимости со
                        SCSI-2
8  db 8   dup(?)   -  строка
      изготовителя (там бывает
                      'ATAPI')
10h db 10h dup(?) - название
                     продукции
20h db 4 dup(?) - ревизия

Текстовые  поля  образуют одну
строку, разделенную пробелами.

------------------------------
Команда   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 ; вариант
      запроса(полный/краткий -
                      бит 40h)
  db Func   ; подфункция
  (только для полного запроса)
  db 3*dup(0) ; *
  dw Length   ; Длина таблицы
  db 3*dup(0) ; *

Команда информационная, выдает
блок следующей информации:

00h dw состояние проигрывания
                        аудио:

00h   -   неизвестно   или  не
                поддерживается
11h - Играет аудио
12h - Аудио стоит
13h - Аудио остановилось на
                         конце
14h - Открыта дверь или ошибка
                       запуска
15h - Прочее

02h dw длина последующих
               данных(0 - нет)

04h и  далее  присутствует при
наличии бита  40h в FullInfo и
зависят от Func

Func не равен 2 или 3

04h db 01h  (формат  данных
                субканала = 1)
05h db Ctrl/Addr
06h db TrackNumber
07h db Point or Index
08h db 0
09h db 3*dup(?) -MSF/SECTOR на
                         диске
0Ch db 0
0Dh db 3*dup(?) -MSF/SECTOR на
                       дорожке

Подфункция 2
(Получить UPC код)

04h db 02h  (формат  данных
                субканала = 2)
05h db 3h*dup(?)
08h db 80h -флажок наличия UPC
(если нет, то UPC отсутствует)
09h db 0Ch*dup(?)  -  здесь
хранится UPC код (6 цифр в BCD
                         коде)
15h db 3*dup(?)  -  Положение
чего-то на диске в формате MSF

Подфункция 3
(получить ISRC код)

04h db 03h  (формат  данных
                субканала = 2)
05h db Ctrl/Addr
06h db TrackNumber -не всегда
                 используется.
07h db ?
08h db 80h -флажок присутствия
      (аналогично функции 02h)
09h db  далее запись ISRC

------------------------------

Команда 043h  -  информация о
           дорожках (READ TOC)

Пакет:
  db 43h
  db ScMsf   ; 0/2 -тип выдачи
адресов(номер сектора или MSF)
  db 4*dup(0); *
  db BegTrk  ; начальная
    дорожка(от 1, 0 заменяется
                         на 1)
  dw Length  ; Длина таблицы
  db Func    ; варианты выдачи
        информации (0/40h/80h)
  db 2*dup(0) ; *

Команда информационная, выдает
таблицу  дорожек. Максимальная
длина таблицы 8*64h+4 байт или
64h (100.) дорожек.

Func
=00h ;получить обычную таблицу
дорожек
=40h ;получить таблицу сессий
=80h ;получить обычную таблицу
в расширенном формате

Общий формат таблицы :

  dw Len       ;длина
    последующих полей в байтах
  db BegTrk    ;первая дорожка
  db EndTrk    ;последняя
                       дорожка
  d? <track_Def>;описание
                       дорожек

Описание дорожек
м.б. трех форматов:

1)    5    байт   на   дорожку
(внутренний  формат, наружу из
CD не выдается):

 db   Ctrl/Addr;тип дорожки и
                         флаги
 db   Index    ;индекс дорожки
                       (номер)
 db*3 Start    ;адрес начала
                       дорожки

2)8    байт     на     дорожку
(Func=0h/40h):

  db  ?
  db  Ctrl/Addr   ;тип дорожки
                       и флаги
  db   TrackNumber ;номер
                       дорожки
  db   ?
  db*4 Start     ;адрес начала
                       дорожки

3)  11 байт на дорожку (Func =
80h):

  db   Res1
  db   Ctrl/Addr ;тип дорожки
  db   Res2
  db   Index   ;индекс дорожки
  db   Res3
  db   Res4
  db   Res5
  db*4 Start    ; адрес начала
                       дорожки

Ctrl/Addr - тип дорожки(то-же,
что    и    в    MSCDEX,    но
переставлены тетрады):

Ctrl     (младшая     тетрада,
отдельные биты):

01 - есть pre-emphasis
02 - разрешено копирование
04 - дорожка данных
08 - 4 канала (а не 2)

Addr (старшая тетрада, коды):

0-нет субканала
1-в  субканале закодирована
позиция
2-в субканале закодирован UPC
3-в субканале закодирован ISRC
прочее - зарезервировано

Самые распространенные коды:

14h - ROM
10h - audio

Index - кодируется в BCD и для
обычной  дорожки  находится  в
интервале  01-99.  Коды  A0  и
выше     имеют     специальное
значение,  они не соответстуют
физическим  дорожкам на диске,
а  носят  служебный характер -
информируют  о  числе дорожек,
начале  диска,  конце  диска и
т.п.

Start   -   в  зависимости  от
запроса,   может   быть   либо
номером  сектора, либо адресом
сектора в формате MSF.

------------------------------
Команда  044h  -  информация о
реальных    метках   положения
(Read HEADER)

Пакет:

 db 44h
 db SL      ; бит 2 - что
   записывать в выходной буфер
   (исходный номер сектора или
                    считанный)
 db 0       ; *
 db M,S,F   ; Номер сектора
 db 0       ; *
 dw Len     ; длина выдаваемой
                     информаци
 db 3*dup(0); *

Команда информационная, выдает
следующую таблицу из 8 байт:

 db SectorType ; тип формата
           сектора (data mode)
 db 4*dup(0)
 db M,S,F      ; адрес сектора

Пакет  выдается  только  в том
случае,  если  CD смог считать
заданный  сектор  и определить
его тип.

------------------------------

Команда   045h  -  проигрывать
audio в терминах блоков (длина
- слово)

Пакет:

 db 45h
 db 0           ; *
 dd StartBlock  ; блок начала
     проигрывания (-1 - с тек.
                   положения)
 db ?
 dw Length      ; число блоков
 db 3*dup()     ; *

Команда управляющая.

------------------------------

Команда   047h  -  проигрывать
audio в стиле MSF

Пакет:

 db 47h
 db 2*dup(?)   ; *
 db M,S,F      ; начало
   отрезка (FF:FF:FF - текущая
                      позиция)
 db M,S,F      ; конец отрезка
 db 3*dup(?)   ; *

Команда управляющая.

------------------------------

Команда   04Bh   -  Start/stop
audio

Пакет :

 db 4Bh
 db 7*dup(0)    ; *
 db Func
 db 3*dup(0)    ; *

Команда управляющая.

Младший бит Func
=0 - остановить
=1 - запустить

------------------------------

Команда   04Eh   -  остановить
проигрывание

Пакет:

 db 4eh
 db 11*dup(?)    ; *

Команда управляющая.

------------------------------

Команда   055h   -  установить
параметры

Пакет:

 db 55h
 db ?       ;бит 1 -сохранять
                   в NVRAM (?)
 db Page    ;требуемая
           страница параметров
 db 4 dup (?)
 dw Length  ;длина таблицы
 db 3*dup(0);*

Команда  управляющая,  коды  и
формат    страниц   описан   в
команде 5Ah.

------------------------------

Команда    05Ah   -   получить
параметры

Пакет:

 db 5Ah
 db ?
 db Page -определяет требуемые
    параметры, состоит из двух
                битовых полей:

3Fh - номер требуемой страницы
параметров:
01h - параметры  исправления
ошибок
0Dh - общие параметры
0Eh - аудио-управление
2Ah - параметры  устройства
(только читается)
3Fh - все странички

C0  - биты   типа  требуемой
страницы:
00 - текущие значения
01 - измененные значения
10 - значения по умолчанию
11 - сохраненные значения

 db 4 dup (?)
 dw Length   ;длина таблицы
 db 3*dup(0) ;*

Команда информационная, выдает
соответствующую      страничку
параметров.

Общий заголовок:

00h dw Длина всего блока
           (без первого слова)
02h db Состояние привода
03h db 5 dup(?);

Заголовок каждой страницы:

08h db Номер страницы из
                       запроса
09h db Длина страницы

Страница 01 -исправление ошибо

0Ah db Параметр исправления
                        ошибок
0Bh db Счетчик повторов чтения

Страница 0D - общие параметры

0Ah db ?
0Bh db  Множитель  таймера  не
                    активности
0Ch dw  Число  S  единиц  в  M
  единице для формата MSF (60)
0Eh dw  Число  F  единиц  в  S
  единице для формата MSF (75)

Страница 0E - аудио параметры

0Ah db  ? параметр не исп., но
                    изменяется
0Bh db 2 dup(?)
0Dh db ? =0 LBA всегда равен
   номеру сектора, cтарший бит
        указывает правильность
               следующего поля
0Eh dw 0 Число логических
          блоков в секунду для
 проигрывания. (как правило не
                 используется)
10h db мл. тетрада - биты
      выходного порта канала 0
11h db громкость канала 0
12h db мл. тетрада - биты
      выходного порта канала 1
13h db громкость канала 1
14h db мл. тетрада - биты
      выходного порта канала 2
15h db громкость канала 2
16h db мл. тетрада - биты
      выходного порта канала 3
17h db громкость канала 3

Страница   2Ah   -   параметры
устройства  (только  чтение) ;
биты    присутствия/отсутствия
функций

0Ch db 01h -проигрывание аудио
       02h -композитный аудио/
                   видео поток
       04h -Digital out to
                        port 1
       08h -Digital out to
                        port 2
       10h -чтение секторов
                 Mode 2 Form 1
       20h -чтение секторов
                 Mode 2 Form 2
       40h -Чтение
        многосессионных дисков
       80h - ?

0Dh db 01h - Чтение RedBook
         через команду Read-CD
       02h - Чтение RedBook
        "with accurate stream"
       04h - Чтение субканала
       08h - Поддержка
        деинтерливинга данных
                    субканала
       10h - Поддержка
           "C2 error pointers"
       20h - Поддержка чтения
                          ISRC
       40h - Поддержка чтения
                           UPC
       80h - ?

0Eh db 01h-блокировка носителя
       02h-чтение статуса
                    блокировки
       04h-Disk prevent jumper
                       present
       08h-команда выброса
                      носителя
       10h-?
       E0h-Тип загрузчика:
            0 - Caddy
            1 - Tray
            2 - Pop-Up
            3 - Reserved
            4 - Ченджер с
       индивидуально меняемыми
                       дисками
            5 - Картридж
            6 - Reserved
            7 - Reserved

0Fh db 01h-Раздельная
           регулировка каналов
       02h-Раздельный
             комутатор каналов
       04h-Информация о
                 наличии диска
       08h-
       10h-
       20h-
       40h-
       80h-

10h dw Максимальная скорость
           обмена в килобайтах
13h db Число градаций
         регулировки громкости
14h dw Размер буфера в
                    килобайтах
16h dw Текущая скорость обмена

;--иногда может отсутствовать-

18h db ?
19h db 01h - Digital out по
     фронту/спаду сигнала BCKF
       02h - LRCK индицирует
            левый/правый канал
       04h - данные в формате
                       LSB/MSB
       08h
       10h  BCKs:0 - 32
       20h  |     1 - 16
       40h /      2 - 24
                  3 - 24(I^2S)
       80h - ?

Длина  каждой из страниц может
быть   разной.  Здесь  описаны
только    те   поля,   которые
более-менее  стандартны.  Если
запрашиваются   все  странички
(код 3Fh), то в выходном блоке
будет    присутствовать   один
общий        заголовок       и
последовательно  расположенные
странички       со      своими
заголовками.

------------------------------

Команда   0A5h  -  проигрывать
audio в терминах блоков

Пакет:

  db A5h
  db 0          ; *
  dd StartBlock ; блок начала
    проигрывания|-1 c текущего
                     положения
  dd Length     ; число блоков
  db 2*dup(?)   ; *

Команда управляющая.

------------------------------

Команда 0B9h - читать данные

Пакет:

 db B9h ;
 db Fmt ; может быть = 00h
          годится любой формат
        ; 08h обычный CD-диск
                (Желтая книга)
        ; 10h  разновидности
        ; 14h/      Green XA
 db 0       ; *
 db M,S,F; начало чтения
 db M,S,F; конец чтения
 db Flg  ; флаги читаемого
                куска сектора:

         ; 01h три
         ; 02h неиспользуемых
         ; 04h бита (?)
         ; 08h EDC/Zero/ECC
         ; 10h основное тело
                сектора (data)
         ; 20h описатель
         адреса сектора (head)
         ; 40h данные
               субканала (sub)
         ; 80h начальные
            синхробайты (sync)
         ; передаются только
те  части секторов,для которых
         ; установлены биты.
    Передаваемые части сектора
        должны идти подряд,без
                     пропусков
 db 0    ; всегда д.б. =0,
              иначе ошибка (?)
 db 0    ; *

Команда  передачи данные. Если
начало=конец,     производится
позиционирование  на указанную
позицию  и тест читабельности.
В   этом   случае   данные  не
передаются.

------------------------------

Команда 0BEh - читать данные в
терминах секторов

Пакет:

 db BEh ;
 db Fmt ;
 dd Sec ; начало чтения
         (исп. только 24 бита
 db 0   ; *
 dw ScNum; Число секторов
 db Flg ; флаги читаемого
     куска сектора (как в B9h)
 db 0   ; всегда д.б. =0,иначе
                    ошибка (?)
 db 0   ; *

Команда  полностью  аналогична
команде   B9,  за  исключением
задания адресов области чтения
в терминах секторов.

==============================

Примечание    b42(b-reeze)   В
приложении к cweek, вы сможете
найти примеры написания команд
на  C  для  PC,  а  так же ряд
документов,  которые  шли  как
приложение   к   данному.  (не
включены  в  сам  номер  из-за
сложности       форматирования
текста)

==============================

P.S.  Изначально этот документ
составлялся  исключительно для
внутреннего  использования  по
причине   невозможности  найти
фирменное  описание  стандарта
на    ATAPI-CD. Поскольку  вся
информация      бралась     из
дизассемблированных
драйверов,исходных     текстов
Linux'а, отдизассемблированной
прошивки  ACER665,  a также из
описания     SCSI-пакетов    и
стандарта  на ATAPI, то вполне
возможны          определенные
расхождения  со  стандартом (в
существовании  которого  я  не
уверен).  Несмотря на это, мне
кажется,    что   даже   такое
описание          представляет
определенную ценность.

В  данное  описание  не попала
команда   специального  чтения
данных  (028h/0A8h)  -  у меня
нет четких данных о ее работе,
а   также   несколько  других,
которые   не   используются  в
драйверах  и поддерживаются не
всеми  приводами. Это касается
команд             потрекового
проигрывания  Audio-CD, команд
смены  диска  в  многодисковых
приводах   и   т.п.   У   меня
осталась     еще     кое-какая
информация,  например,  тексты
CD-драйверов, прошивок и т.п.,
которые      были      сочтены
несущественными   или  излишне
громоздкими.  Если необходимо,
можно вставить в этот документ
выдержки из драйверов.

Для    любителей    "подробных
описаний" могу порекомендовать
стандарт  SCSI-2  (X3T9.2).Там
есть     большое    количество
интересной    информации,   но
солидный  объем (более 20 тыс.
строк   или   около  1.7  Mb),
некоторые   отличия   SCSI  от
ATAPI    и    "замусоренность"
лишними   деталями   усложняют
получение нужных сведений.

При     необходимости    более
детального    ознакомления   с
процессом   обмена  (обмен  по
DMA, перекрывающиеся команды и
т.п.) можно прочитать стандарт
на  ATAPI  устройства (X3T10).
Однако, описание конкретных CD
команд  там  отсутствует (есть
ссылка на SCSI).

Предложения, замечания, ругань
и  т.п.  просьба направлять по
адресу           2:5030/163.44
Константин            Норватов
(Konstantin Norvatoff, KonNor)
Также, можно попробовать найти
меня         по        адресу:
konnor@small.spb.su

==============================

Примечание2: b42(b-reeze)
К   моменту  написания  данной
статьи  мне  все-таки  удалось
подключить CDROM к контроллеру
NEMO вместе с HDD. Причем HDD,
как  master  disk, а CDROM как
slave.   Так  же  хотелось  бы
уточнить  по  поводу  команд в
примерах      пакетов      для
управления  CDROM. Запись типа
db  3*dup(0), означает что код
#00  следует повторить 3 раза.

Надеюсь данная статья, поможет
разобраться    с   управлением
CDROM  и  в ближайшее время мы
получим  полноценную  работу с
CD на ZX.




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

Похожие статьи:
Семь и 1/2 - "Страшилки" - анталогия черного юмора.
Письма - письма читателей.
Презентация - Презентация адвентюрных игр написанных с использованием ABS: "Иван Царевич", "Last Raider", "Color Balls".

В этот день...   17 ноября