Пытаюсь получить из загрузчика параметры HDD через int 0x13, ah = 0x8, dl = 0x80/0x81 но ничего не получается, другие способы тоже что-то не работают. С дискетой все проходит без проблем. У кого-нибудь есть рабочий способ? P.S. при вызове int 0x13, ah = 0x8, dl = 0x80/0x81 система как-будто виснет.
Вообщем так: 1. Пишется код на асм примерно такого содержания: Code (Text): ..... Проверка HDD на доступность ..... Вывод сообщения вида "HDD is : 0x80" ..... mov ah, 0x08 mov dl, 0x80 int 0x13 ..... Код должен вернуть параметры HDD или ошибку. 2. Далее это дело компилится в nasmw 3. Записывается в boot-sec на дискету. 4. Запускается под VMWare и виснет при попытке int 0x13 (все диагностические сообщения до этого момента выводятся). При dl = 0x1 (floppy) все работает нормально.
Пробовал, вот сейчас пробую Code (Text): mov dl, byte [.hdd_id] mov ah, 0x09 int 0x13 Вроде работает, но инфы недостаточно. А есть другие методы?
int 0x13, ah = 0x8, dl = 0x80/0x81 вроде как берёт инфу из СMOS, может варя с ней не дружит? Нужная тебе Hard disk parameter table должна ещё висеть по адресу в векторе 41h (адрес вектора 0:0104)
Вот я над этим сейчас и думаю, только что-то понять не могу. Можно по подробнее, что нужно делать по этапно? Я считываю память по 0:0104, что в ней?
Как я понял там как раз адрес той самой таблицы, что int13 08h в ESI возвращает (в смысле по адресу 0:0104 не сама таблица, а ссылка на неё), но самому туда лазить не доводилось. И еще в векторе 46h (0:0118) должен быть адрес такой же таблицы для second диска.
А если работать напрямую с контроллером ЖД через порты в/в? Например, использовать IDENTIFY DEVICE (EСh), или это в данном случае не подходит?
Следующий код скопипастен с этого сайта, считывает размер винчестера в секторах: Code (Text): .486 stk segment stack use16 db 256 dup (?) stk ends base equ 1f0h data segment use16 msg0 db "Disk capacity: ",'$' msg1 db " Sectors",'$' buffer dw 256 dup (0) string db 10 dup (?) data ends code segment use16 assume cs:code,ss:stk,ds:data ByteToStr PROC xor ah,ah WordToStr: xor dx,dx DWordToStr: push si push di mov si,10 xor cx,cx Next_Digit: push ax mov ax,dx xor dx,dx div si mov bx,ax pop ax div si push dx mov dx,bx inc cx or bx,ax jnz Next_Digit cld Store_Digit_Loop: pop ax add al,'0' stosb loop Store_Digit_Loop mov BYTE PTR es:[di],'$' pop di pop si ret ByteToStr ENDP start: ; ENTRY POINT mov ax,data mov ds,ax mov es,ax mov dx,base+7 m1: in al,dx test al,80h jnz m1 mov dx,base+6 mov al,0E0h out dx,al mov dx,base+7 m2: in al,dx test al,80h jnz m2 test al,40h jz m2 mov dx,base+7 mov al,0ECh out dx,al mov dx,base+206h m3: in al,dx test al,80h jnz m3 mov dx,base+7 m4: in al,dx test al,08h jz m4 cld mov di,offset buffer mov dx,base mov cx,256 rep insw mov di,offset string mov ax,word ptr [buffer+60*2] mov dx,word ptr [buffer+61*2] call DWordToStr mov ah,9 mov dx,offset msg0 int 21h mov dx,offset string int 21h mov dx,offset msg1 int 21h exit: mov ax,4c00h int 21h code ends end start Еще и здесь www.wasm.ru/article.php?article=atazen01 почитай (отсюда я его и скопипастил) Этим же способом можно взять и намного больше инфы, но я с этим не разбирался
doctor_Ice Теоретически, и с sata устройствами можно работать так же, как и с обычными, но базы портов не фиксированы. Но я точно не знаю, т.к. нет на чем проверить. Вот топики на ету тему www.wasm.ru/forum/viewtopic.php?id=16109 www.wasm.ru/forum/viewtopic.php?id=16740
lukash я знаю. просто я предупредил что твой код не сработает на машине с сериал ата. я сам так проколося однажды.