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.