Memphis Так ты напиши определение BusMaster делов-то. Поиск по PCI устройства с классом 01 - IDE. И чтение регистра Bar5(считая от 1)
Pavia Можно, только ленивый я на это. Пусть готовые/годные/рабочие адреса дают. Их же не поиск адресов интересует (речь выше уже была о этом), да и пример будет короче, не надо на другое отвлекаться. Кстати, с твоей ссылки и я начинал (первое знакомство), но там несколько важных моментов не описано.
Memphis Будет и на бумаге и под отладчиком и непосредственно поддержка ФАТ16/32 уже написана осталось только с УДМА разобраться. Pavia Я думал УДМА и ДМА по разному программируются, статью конечно до конца пока еще не дочитал, но слов УДМА пока не встречалось!
fireman Не, так не пойдет. Эти циферки мне мало чего говорят. Адресов много, и куда конкретно хард включен, неизвестно. Поэтому читай мой диалог с dess, чего я от него требовал. Я хочу, чтобы код сразу заработал, а не гадать на кофейной гуще. А пример я уже принес - как дашь конкретные адреса для харда, я его перекомпилирую. Жду.
fireman Код (Text): codesg segment assume cs:codesg, ds:codesg .486p org 100h start: jmp short begin ;------------------------------------------------ base_IO dw 8438h ; база ввода/вывода харда device db 0A0h ; это мастер base_BM dw 8400h ; база БусМастера ;------------------------------------------------ sect db 0FFh ; кол-во секторов для трансфера segm dw 5678h ; сегмент ОЗУ для трансфера offs dw 9ABCh ; смещение в сегменте ;------------------------------------------------ align 4 base_DTP dd ? ; база дескрипторов всегда выравнена dw ? dw ? dd ? dw ? dw ? ;------------------------------------------------ begin: push cs pop ds ; !!!!! smsw ax test al,1 jz short lab0 int 3 ;------------------------------------------------ lab0: cmp sect,0 jnz short lab1 int 3 ;------------------------------------------------ lab1: test byte ptr offs,1 jz short lab2 int 3 ;------------------------------------------------ lab2: mov al,device or al,40h mov dx,base_IO add dx,6 out dx,al inc dx lab3: in al,dx test al,80h jnz lab3 mov al,0 sub dx,6 out dx,al inc dx mov al,sect out dx,al mov al,0 inc dx out dx,al inc dx out dx,al inc dx out dx,al mov al,0C8h inc dx inc dx out dx,al mov si,offset base_DTP movzx ebx,segm shl ebx,4 movzx eax,offs add ebx,eax mov [si],ebx mov al,sect cmp al,80h jna short lab4 sub al,80h mov dword ptr [si+4],0 add ebx,10000h add si,8 mov [si],ebx lab4: shl ax,9 mov [si+4],ax mov ah,80h mov [si+6],ax mov al,6 mov dx,base_BM add dx,2 out dx,al xor eax,eax mov ax,cs add dx,2 shl eax,4 add eax,offset base_DTP out dx,eax mov al,9 sub dx,4 out dx,al add dx,2 lab5: in al,dx test al,4 jz lab5 test al,2 jz short lab6 int 3 ;------------------------------------------------ lab6: ;;; out dx,al mov al,8 sub dx,2 out dx,al mov dx,base_IO add dx,7 lab7: in al,dx test al,1 jz short good int 3 ;------------------------------------------------ good: nop ;;; ////////////////// ;;; ////////////////// ;;; ////////////////// nop int 3 ;------------------------------------------------ codesg ends end start Бинарник нужен для отладки или сам сделаешь ?
Спасибо за код! Бинарик Сам как-нибудь Где можно слить СОФТ-АЙС не подскажешь меня просто интересует 32-битный отладчик для ДОС? А то ТД не рулит, а Тд32 только под Винду.
fireman Не знаю. Я под ДОСом на AFD отлаживаю. Вижу только 16 бит младшие. А старшие по смыслу догадываюсь. Мне этого вполне хватает, особо когда прожки сам для себя пишешь, исходник практически наизусть помнишь, поэтому РОНы особо и не интересуют. Ну а если уж больно припрет, можно DWORD РОНа в стек послать, поглядеть, затем обратно вернуть.
Memphis В досе отлаживаю TD нормально рабтает. Регистры 32битные показывает только нужно установить переключатель. Насчет меток. Есть удобное средство как @B @f @@ или @lable- с произвольным именем.
Вопрос в тему, ЛБА 48 т.е. Максимальное кол-во секторов 281474976710655, а у АТА 32 бита (60-61 слово), куда делись 16 бит?
Читаю 128 первых секторов через УДМА5 с запрещенными прерываниями и ожиданием обнуления бита AС. Заметил такую особенность - если читать в режиме LBA28 (команда 0xC8) - ожидание AC 1-15 милисекунд, если в LBA48 (команда 0x25) - ожидание AC 0.1-0.4 милисекунды. Т.е. LBA48 гораздо быстрее. Кто-нить такое замечал или это где-то моя бага?
Rodin и ожиданием обнуления бита AС - а что за бит такой ? Я их помню только по маскам и расположению, но не по названиям.
Rodin Признак активности BusMaster - нулевой бит регистра состояния DMA - есть такая зверушка. Заметил такую особенность - если читать в режиме LBA28 (команда 0xC8) - ожидание AC 1-15 милисекунд, если в LBA48 (команда 0x25) - ожидание AC 0.1-0.4 милисекунды. Т.е. LBA48 гораздо быстрее. Кто-нить такое замечал или это где-то моя бага? - думаю, твоя. Для начала померь скорость трансфера из буфера для ЛБА28/48. Алгоритм такой - дал команду в хард. Выждал 2...5 секунд (хард гарантированно положит данные в буфер), включил БМ, засек время через rdtsc, опрос бита #4 в статусе БМ, опять засек время через rdtsc, взял разность, посчитал ручками.
Провожу крештесты под виндой. При активной работе винта (параллельная дефрагментация или массовое копирование файлов) в 2-3 случаях из 1000 происходит таймаут ожидания канала (я ожидаю обнуления бита занятости уст-ва регистра статуса). Значение регистра статуса при этом 0xC8. Т.е. уст-во занято выполнением команды и уст-во готово к приему команды. Кто-нибудь такое встречал и как на это реагировать?