Работа с CD-Rom в реальном режиме процессора

Тема в разделе "WASM.OS.DEVEL", создана пользователем Arounder, 14 дек 2009.

  1. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Доброго времени суток !

    Помогите пожалуйста вот с такой задачей:
    Место нахождения -> до загрузки ОС, т.е. можно сказать сразу после отработки BIOS
    Нужно пусть даже самое простое - загрузить с CD-диска первый (второй, третий, ... не важно) сектор.
    Читал мануал 'ATA для дZенствующих. Часть 1' и вторую часть её, но потестил и вроде как не применима метода к оптическим приводам (в том элементарном представленном виде). Хотя, честно говоря, видимо я просто не в курсе нюансов.
    Интересно, без драйвера можно обойтись ?!
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    А чего, INT 13 (или INT 40) - это слишком высокий уровень? Для того и БИОС,чтоб не морочится с драйверами.
     
  3. smileman

    smileman New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2009
    Сообщения:
    11
    Нет,драйверов не нужно, по крайней мере, когда я баловался в свое время таким же образом с флоппиком,насколько помню, никаких особо проблем не возникло..вот только код потерялся где-то в бардаке моем..
    Вылаживай, что ты там тестил )) посмотрим)
     
  4. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Если загрузка идёт с CD после биоса, то происходит эмуляция floppy, т.е. к CD-rom можно обращаться как к дисководу А:. А загрузки c си-ди не было. Хотя если вы знаете реально работающую программку объясните хоть принцип с int'ами.
     
  5. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Со времени сообщения нарыл некоторую инфу и понял, что не годится то, что для винтов, поэтому ссылка на статью: (надеюсь это можно, т.к. ссылка на конечную статью, даже дипломную работу и информация в ней содержащаяся отсутствует на сайте): http://masters.donntu.edu.ua/2005/fvti/nikolaev/library/cd.htm

    Код (Text):
    1. ;                - = Программа CD-Rom reading = -
    2.  
    3.  
    4. CDRom_read proc
    5.  
    6.  
    7.  
    8.  
    9. mov dx,3f6h        ;Запретить прерывания, установить в 1 бит 1 регистра 3F6h
    10. mov al,2h
    11. out dx,al
    12.  
    13.  
    14. mov  al,0A0h
    15.  
    16. mov dx,01f6h       ;Выбор устройства на канале.
    17. out dx,al
    18.  
    19.  
    20. mov dx,01f7h       ;Ждем пока BSY=1, на случай если девайс занят
    21. m1:
    22. in   al,dx
    23. test al,80h
    24. jnz  m1
    25. ;test al, 08h
    26. ;jnz m1
    27.  
    28.  
    29. mov dx,1f4h
    30.  
    31. mov al, 0
    32. out dx,al
    33. mov al, 02h
    34. mov dx,1f5h
    35.  
    36. out dx,al
    37.  
    38.  
    39. mov al, 0ECh
    40. mov dx, 01f7h
    41. out dx, al
    42.  
    43. mov dx, 01f4h
    44. m5:
    45. in al, dx
    46. cmp al, 14h
    47. jnz m5
    48. inc dx
    49. m6:
    50. in al, dx
    51. cmp al, 0EBh
    52. jnz m6
    53.  
    54. mov dx, 01f4h
    55. mov al, 01h
    56. out dx, al
    57. mov al, 00h
    58. inc dx
    59. out dx, al
    60.  
    61. mov dx, 01f7h
    62. mov al, 0A0h
    63. out dx, al
    64.  
    65. mov  dx,01f7h
    66. m2:                       ;Ждем, DRQ=1 и BSY=0
    67. in   al,dx
    68. test al,80h
    69. jnz  m2
    70. test al,08h
    71. jz   m2
    72.  
    73.  
    74. mov dx, 01f0h
    75. mov al, 1bh
    76. out dx, al
    77. mov al, 00h
    78. out dx, al
    79. mov ax, 0000h
    80. out dx, ax
    81. mov al, 02h
    82. out dx, al
    83. mov al, 00h
    84. out dx, al
    85. mov ax, 0000h
    86. out dx, ax
    87. mov ax, 0000h
    88. out dx, ax
    89. mov ax, 0000h
    90. out dx, ax
    91.  
    92.  
    93. mov dx,3f6h        ;Разрешить прерывания от устройства
    94. mov al,0
    95. out dx,al
    96.  
    97. ret
    98.  
    99.  
    100.  
    101. CDRom_read endp
    Если не понятно, то могу написать с пояснениями (выложу файлом); да и в статье там всё расписано. Но код элементарный. Но не работает. Пока что.
    Хотел бы добавить, что это очень интересная тема про программирование оптических накопителей (IDE/ATAPI устройств). Информации маловато - или дизассемблируй драйверы или изучай исходники.
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Это неправда. Даже если эмуляция флоппика используется, то ее можно отключить теми же функциями BIOS. А вообще лучше сразу сделать загрузочный CD без эмуляции флоппика/харда, тогда и отключать ничего не придется.

    В ситуации Место нахождения -> до загрузки ОС, т.е. можно сказать сразу после отработки BIOS целесообразнее использовать именно функции BIOS.
     
  7. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Так не нужно как раз отключать, но поскольку не происходит первоначальная загрузка с CD поэтому эмуляции флоппика не происходит (т.е. можно обращаться посредством того же int 13h как к флоппику, а он (флоппик) сдвигается как дисковод B:). В том и дело, что проэмулировать я не знаю как под флоппик и пока ещё (только начал) не смог добиться работы через порты. А по поводу загрузочного CD (или дискеты) сразу отпадает. Прошу прощения, но лёгких путей не надо. Смысл в загрузке всего этого с винчестера (темы не касается). Хотелось бы понять, как реализовать или эмуляцию, или работы через порты.

    Подскажите каким образом. Пробовал ясное дело через int 13h, так читает дисковод.

    Примечательно, что в книгах ни слова о CD/DVD. Только работа c дисководами и более всего с HDD через вышеупомянутое прерывание.

    ... покой нам только снится ...
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Объясняю, что посекторное чтение с CD лучше выполнять именно в режиме без эмуляции. В этом случае в коде загрузочной записи к примеру ты получаешь от BIOS именно номер CD, а не эмулируемого флоппика/харда. Этот номер вполне успешно может быть использован в функциях BIOS int 13h/4xh.
     
  9. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Каким образом и в каком коде ? Поподробнее. И если не сложно, то где можно глянуть о прервыниях int 4xh (40h) ?
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    EDD BIOS Specification на www.t13.org
     
  11. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Огромная благодарность за ссылку, но завести ничего не удалось. Прошу ваших разъяснений.

    Немного повторюсь:

    Укажите пожалуйста, где можно получить этот самый 'BIOS device number'.

    Даже так делал. Перебирал эти же номера на функции от 0 до 255 (вход для bios dev num) на наличие ошибки. Ошибки не было на 80h и F2h(?). В документе по EDD... указано, что стандартный номер для CD/DVD A0h. Но он не идёт !

    ... Хоть натолкните на мысли. После прочтения сначала документа и попыток игры с функциями ничего не получилось и опять вернулся к портам I/O. Так вот там удалось прочитать по команде 03 строку из CD вместе с его названием. Но! Это просто команда. А когда дело доходит до ATAPI Packet (AP), то после команды A0 (ввод AP) вроде и шесть слов доправляю и BSY в 0 устанавливается, а DRQ не становится готовым, т.е. 1.

    Вообщем ещё раз: хоть как-нибудь возможен ли запуск CD/DVD вообще в реальном режиме (BIOS творит чудеса !!!) ???
    И если можно, то как ???
     
  12. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Немного добавлю: прошу прощения, что пишу вообще не понятно как - без кода, как в тумане. По крайней мере вроде всё делаю как в описании.
    Если нужен код просто укажите. Не выкладываю т.к. куча закомментированных строк - постоянные безуспешные опыты ...

    ... Надеюсь на хоть какое-то продвижение ...
     
  13. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Наткнулся на документик http://wiki.osdev.org/ATAPI Так вот там всё то же о портах ввода-вывода, но после загрузки 6 слов в '16-битный' порт ждать не получится от DRQ=1 хотя бы, а указывается, что надо ждать IRQ. Вопрос ! Что значит ждать IRQ. В смысле, каким образом проверить, что прерывание (IRQ) выполнилось (пришло) ?
     
  14. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    EDDspec30.pdf

    Ты сначала написал, что до спецификации не добрался, а сейчас ссылаешься на какой-то таинственный "документ по EDD"... Если можно, цитату, где написано, что номер CD/DVD - это A0h. Я вполне допускаю, что номером CD может быть F2h. Вообще я CD с помощью BIOS "со стороны" не читал. Вполне может быть, что эта возможность появляется лишь тогда, когда ты с этого CD загружаешься. Загрузчику, находящемуся на CD, номер диска передается BIOS в регистре DL при передаче ему управления. Я просто использовал это значение и проблем не возникало. Единственный момент, который нужно учитывать - в режиме без эмуляции размер сектора равен 2 кб.

    Напиши простейший загрузчик для CD, для начала выводящий номер диска из DL. Запиши загрузочный CD с этим загрузчиком в режиме без эмуляции... и будет тебе счастье.

    Чего тут непонятного. "Вешаешь" обработчик, запускаешь команду, ждешь прерывания или таймаута, при возникновении прерывания проверяешь, нет ли ошибки.
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В простейшем случае заведи обнуляемый при отправке команды "флажок", который будет устанавливаться внутри обработчика прерывания. После отправки команды жди установки флажка или таймаута. Также желательно иметь "флажок" или переменную для отслеживания возникающих ошибок.
     
  16. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Я не писал, что не добрался, но: 1) ... И если не сложно, то где можно глянуть о прервыниях int 4xh (40h) ? и 2) ... Огромная благодарность за ссылку, но завести ничего не удалось ... - мой 3-ий пост снизу об EDD BIOS Specification на ... от cppasm - как раз четвёртую версию EDD нашёл и ясное дело, что сразу начал знакомиться, иначе бы не писал, что не заводиться ...

    ... не таинственный, а по совету cppasm
    Кстати немного не по теме, но есть также документ об устаревших (obsoleting) функциях int 13h (предложение об их перенесении в категорию устаревших и вообще удалении из обработчика)

    Из d2132r1-Enhanced_Disk_Drive_-_4_EDD-4.pdf - п. 7.2.3 No Emulation Boot -> ... The system BIOS shall assign the CD-ROM drive a device number. A common industry number is A0h ...

    Проверял я на нём, но ошибка та же. Ошибка в ah=01h. Из этого же документа - Invalid Command.

    Мой 4-ый пост сверху. Дело в том, что передача управления осуществляется после отработки boot loader'a на жёстком диске. Мне не нужно тем более делать загрузочный диск.
    Из сообщения - происходит как раз эмуляция флоппи-дисковода при загрузке (после BIOS) с CD/DVD-Rom.

    Мне надо либо САМОМУ эмулировать образ, либо читать без эмуляции, либо работа через порты.
    Также использовал команду terminate boot emulation (4Bh кажется) с параметром все (7fh), то опять ошибка.
    С чем ошибки могут быть связаны. Всё же более к портам склоняюсь. Я уже и под дос пытался отлаживать в AFD функцию 35h int 21h )))

    За это благодарю. Ясно. Честно говоря как раз перед прочтением разбирался с прерываниями.

    Там у меня в посте про команду в порт для выдачи информации из драйва ошибка -> не 03, а A1h команда ...
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я имел в виду функции 4xh прерывания int 13h. Собственно они и описываются в спецификации EDD. С помощью традиционного дискового сервиса BIOS, естественно, к CD доступ ты не получишь, даже если у тебя будет в распоряжении подходящий номер диска. Если у меня получится прочитать CD "со стороны" с помощью BIOS, отпишусь.
     
  18. Arounder

    Arounder New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2009
    Сообщения:
    10
    Доброго времени суток !
    Всех поздравляю с наступающим Новым Годом и Рождеством Господа нашего Иисуса Христа. Желаю сбыться всему самому доброму и хорошему !
    С наступающими праздниками коллектив данного сайта и всех посетителей !

    Откомпилируйте программу, код которой приведён ниже. Хочу узнать будет она работать или нет у меня. Я ставил прерывания уже и ... ничего. Очень жду. Заранее благодарю откликнувшихся ...
    Код (Text):
    1.   /* The default and seemingly universal sector size for CD-ROMs. */
    2.   #define ATAPI_SECTOR_SIZE 2048
    3.  
    4.   /* The default ISA IRQ numbers of the ATA controllers. */
    5.   #define ATA_IRQ_PRIMARY     0x0E
    6.   #define ATA_IRQ_SECONDARY   0x0F
    7.  
    8.   /* The necessary I/O ports, indexed by "bus". */
    9.   #define ATA_DATA(x)         (x)
    10.   #define ATA_FEATURES(x)     (x+1)
    11.   #define ATA_SECTOR_COUNT(x) (x+2)
    12.   #define ATA_ADDRESS1(x)     (x+3)
    13.   #define ATA_ADDRESS2(x)     (x+4)
    14.   #define ATA_ADDRESS3(x)     (x+5)
    15.   #define ATA_DRIVE_SELECT(x) (x+6)
    16.   #define ATA_COMMAND(x)      (x+7)
    17.   #define ATA_DCR(x)          (x+0x206)   /* device control register */
    18.  
    19.   /* valid values for "bus" */
    20.   #define ATA_BUS_PRIMARY     0x1F0
    21.   #define ATA_BUS_SECONDARY   0x170
    22.   /* valid values for "drive" */
    23.   #define ATA_DRIVE_MASTER    0xA0
    24.   #define ATA_DRIVE_SLAVE     0xB0
    25.  
    26.   /* ATA specifies a 400ns delay after drive switching -- often
    27.    * implemented as 4 Alternative Status queries. */
    28.   #define ATA_SELECT_DELAY(bus) \
    29.     {inb(ATA_DCR(bus));inb(ATA_DCR(bus));inb(ATA_DCR(bus));inb(ATA_DCR(bus));}
    30.  
    31.   /* Use the ATAPI protocol to read a single sector from the given
    32.    * bus/drive into the buffer using logical block address lba. */
    33.   int
    34.   atapi_drive_read_sector (uint32 bus, uint32 drive, uint32 lba, uint8 *buffer)
    35.   {
    36.     /* 0xA8 is READ SECTORS command byte. */
    37.     uint8 read_cmd[12] = { 0xA8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    38.     uint8 status;
    39.     int size;
    40.     /* Tell the scheduler that this process is using the ATA subsystem. */
    41.     ata_grab ();
    42.     /* Select drive (only the slave-bit is set) */
    43.     outb (drive & (1 << 4), ATA_DRIVE_SELECT (bus));      
    44.     ATA_SELECT_DELAY (bus);       /* 400ns delay */
    45.     outb (0x0, ATA_FEATURES (bus));       /* PIO mode */
    46.     outb (ATAPI_SECTOR_SIZE & 0xFF, ATA_ADDRESS2 (bus));
    47.     outb (ATAPI_SECTOR_SIZE >> 8, ATA_ADDRESS3 (bus));
    48.     outb (0xA0, ATA_COMMAND (bus));       /* ATA PACKET command */
    49.     while ((status = inb (ATA_COMMAND (bus))) & 0x80)     /* BUSY */
    50.       asm volatile ("pause");
    51.     while (!((status = inb (ATA_COMMAND (bus))) & 0x8) && !(status & 0x1))
    52.       asm volatile ("pause");
    53.     /* DRQ or ERROR set */
    54.     if (status & 0x1) {
    55.       size = -1;
    56.       goto cleanup;
    57.     }
    58.     read_cmd[9] = 1;              /* 1 sector */
    59.     read_cmd[2] = (lba >> 0x18) & 0xFF;   /* most sig. byte of LBA */
    60.     read_cmd[3] = (lba >> 0x10) & 0xFF;
    61.     read_cmd[4] = (lba >> 0x08) & 0xFF;
    62.     read_cmd[5] = (lba >> 0x00) & 0xFF;   /* least sig. byte of LBA */
    63.     /* Send ATAPI/SCSI command */
    64.     outsw (ATA_DATA (bus), (uint16 *) read_cmd, 6);
    65.     /* Wait for IRQ that says the data is ready. */
    66.     schedule ();
    67.     /* Read actual size */
    68.     size =
    69.       (((int) inb (ATA_ADDRESS3 (bus))) << 8) |
    70.       (int) (inb (ATA_ADDRESS2 (bus)));
    71.     /* This example code only supports the case where the data transfer
    72.      * of one sector is done in one step. */
    73.     ASSERT (size == ATAPI_SECTOR_SIZE);
    74.     /* Read data. */
    75.     insw (ATA_DATA (bus), buffer, size / 2);
    76.     /* The controller will send another IRQ even though we've read all
    77.      * the data we want.  Wait for it -- so it doesn't interfere with
    78.      * subsequent operations: */
    79.     schedule ();
    80.     /* Wait for BSY and DRQ to clear, indicating Command Finished */
    81.     while ((status = inb (ATA_COMMAND (bus))) & 0x88)
    82.       asm volatile ("pause");
    83.    cleanup:
    84.     /* Exit the ATA subsystem */
    85.     ata_release ();
    86.     return size;
    87.   }
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    И в чем ее компилировть? Что за ata_grab / schedule? Похоже на какую-то линуксовоподобную среду.
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Arounder
    http://wiki.osdev.org/ATAPI
    Там же написано :
    Будет работать в драйвере, т.е. плюс надо еще кучу инклюдов добавить. И естественно это драйвер какой-то ОС.
    То что ты спрашивал - это загрузчик. Вот и ищи инфу там. В конце концов найди исходники загрузчика из БИОС.