Пожалуста, помогите - я немогу написать код которой считал бы сектор или кластер. Я читал статью "Винты и флопики. ATA для дZенствующих. Часть 2: PCI DMA", но мне никак невыходит считать сектор (использувал код в статье - почемуто неработает =(), Помогите или кодом или документацыей или хоть обясните что я делаю нетак, буду очень благодарен за любые попытки мне помоч. Зарание СПОСИБО!
AntiB В семейства Win NT работать не будет. Запускаеть надо либы из под эмулятора либы в досе. Считать сектор можно по разному.
Неужели никто незнает? может у кавота есть ссылки или код - пожалуста выложыте, если не жалко, зарание спасибо
Хотелось бы поднять опять ету тему, но уже с другим вопросом, как найти Class Code всех PCI устройств используя тока порты? (без пририваний).
AntiB Вот тут можешь почитать статью, там в кратце. Рассказано. http://www.wasm.ru/article.php?article=hardzen Конфигурационное адресное пространство это 256 байт в каждом PCI устройстве. Предназначенные для идентификации устройства и его настройки. Для доступа к конфигурационное адресному пространству в PC-AT и совместимых машинах выделено два основных порта. 0CF8h -W порт адреса Address 0CFCh RW порт данных Data Порт адреса представляет из себя следующую 32 битную структуру Код (Text): +---+---------+-------+----------+--------+---------------+-+-+ |31 |30 24|23 16|15 11|10 8|7 2|1|0| +---+---------+-------+----------+--------+---------------+-+-+ | с | резерв |шина |устройство| функция|Индекс регистра|0|0| +---+---------+-------+----------+--------+---------------+-+-+ Порт адреса задает шину, устройства, и адрес регистра в конфигурационном пространстве устройства. Грубо говоря, устройство - это физически присутствующее устройство. А функция - это логическое устройство. Пусть вас не удивляет, но большая часть PCI устройств это системные устройства, а не платы расширения PCI. С - флаг доступа к устройству. По окончании работы с устройством следует сбросить флаг доступа. Или просто установить в 0 весь регистр адреса. Первые два бита в порту данных всегда 0. А следовательно читать за рас из конфигурационного пространства мы можем только по 32бита(один регистр) Далее перебираешь |функция |устройство| шина Функции у устройства могут и отсутствовать Header Type (тип заголовка) – если бит 7 равен 1 то устройство содержит несколько функций. Если устройства нет, то должно вернуться в Vendor ID 0FFFFh
я ето читал, и написал прогу которая всьо ето делает: Код (Text): use16 org 0x100 jmp start write_data: times 0x40 db 0x00 file_name db "c:\pci.dat" handle dw 0x00 pci: mov dx, 0x0cf8 xor eax, eax mov al, bl or ah, 0x80 shl eax, 0x10 mov ah, bh shl ah, 0x03 or ah, cl mov al, ch and al, 0xfc out dx, eax mov dx, 0x0cfc in eax, dx ret start: mov ah, 0x3c mov cx, 0x00 mov dx, file_name int 0x21 mov [handle], ax mov edx, 0x0cf8 xor eax, eax mov bx, 0x00 mov cx, 0x00 cycle1: call pci cmp eax, 0xffffffff jz device_not_found xor si, si cycle2: add ch, 0x04 mov [write_data+si], eax add si, 0x04 call pci cmp si, 0x40 jnz cycle2 mov ch, 0x00 push cx push bx mov ah, 0x40 mov bx, [handle] mov cx, 0x40 mov dx, write_data int 0x21 pop bx pop cx device_not_found: inc bh cmp bh, 0x20 jnz cycle1 mov bh, 0x00 inc bl cmp bl, 0xff jnz cycle1 mov ah, 0x3e mov bx, [handle] int 0x21 int 0x20 ета программа создала файл, но я в етом файле ненашел своево IDE контролера - Class Code: 010180h, 010185h, 01018Ah - значит чтото нетак работает, но немогу понять что? может я в коде зделал ошыбку. Запускалась прога с под Доса. Файл который она создала есть - могу выложыть, помогите пожаулуста
AntiB Так ты функции не перебираешь. Функции это посути тоже устройство. Вот он у тебя IDE/SATA контролеры и не захватывает, да и еще часть других. В самом приметивном варианте добавь вот эти строчки там где метка device_not_found Код (Text): device_not_found: inc сl cmp bh, 7 jnz cycle1 xor cl,cl
Pavia спасибо тебе, я зделал перебор по функцыям и нашел IDE контролер. я подругому зделал: Код (Text): device_not_found: inc cl cmp cl, 0x08 jnz cycle1 xor cl, cl Я перебыраю все функцыи (ето пока что) СПАСИБО ТЕБЕ ОГРОМНОЕ