Получить параметры HDD

Тема в разделе "WASM.OS.DEVEL", создана пользователем Guest, 10 мар 2007.

  1. Guest

    Guest Guest

    Публикаций:
    0
    Пытаюсь получить из загрузчика параметры HDD через int 0x13, ah = 0x8, dl = 0x80/0x81 но ничего не получается, другие способы тоже что-то не работают. С дискетой все проходит без проблем. У кого-нибудь есть рабочий способ?
    P.S. при вызове int 0x13, ah = 0x8, dl = 0x80/0x81 система как-будто виснет.
     
  2. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    че то я не понял...
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    Вообщем так:
    1. Пишется код на асм примерно такого содержания:
    Код (Text):
    1. .....
    2. Проверка HDD на доступность
    3. .....
    4. Вывод сообщения вида "HDD is : 0x80"
    5. .....
    6. mov  ah, 0x08
    7. mov  dl, 0x80
    8. int    0x13
    9. .....
    Код должен вернуть параметры HDD или ошибку.
    2. Далее это дело компилится в nasmw
    3. Записывается в boot-sec на дискету.
    4. Запускается под VMWare и виснет при попытке int 0x13 (все диагностические сообщения до этого момента выводятся).
    При dl = 0x1 (floppy) все работает нормально.
     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    фиг знает.. попробуй обнулить al, es и di, хотя вряд ли это поможет
     
  5. Guest

    Guest Guest

    Публикаций:
    0
    Пробовал, вот сейчас пробую
    Код (Text):
    1.    
    2. mov dl, byte [.hdd_id]
    3. mov ah, 0x09
    4. int 0x13
    Вроде работает, но инфы недостаточно. А есть другие методы?
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    im1111
    Проверь ещё с ah=15h "Check Hard Drive Installed"
     
  7. Guest

    Guest Guest

    Публикаций:
    0
    Я ah=10h использую, работает без проблем. Только вот дальше не получается.
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    int 0x13, ah = 0x8, dl = 0x80/0x81 вроде как берёт инфу из СMOS, может варя с ней не дружит?
    Нужная тебе Hard disk parameter table должна ещё висеть по адресу в векторе 41h (адрес вектора 0:0104)
     
  9. Guest

    Guest Guest

    Публикаций:
    0
    Вот я над этим сейчас и думаю, только что-то понять не могу. Можно по подробнее, что нужно делать по этапно? Я считываю память по 0:0104, что в ней?
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Как я понял там как раз адрес той самой таблицы, что int13 08h в ES:lol: I возвращает (в смысле по адресу 0:0104 не сама таблица, а ссылка на неё), но самому туда лазить не доводилось.
    И еще в векторе 46h (0:0118) должен быть адрес такой же таблицы для second диска.
     
  11. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    А если работать напрямую с контроллером ЖД через порты в/в?
    Например, использовать IDENTIFY DEVICE (EСh), или это в данном случае не подходит?
     
  12. Guest

    Guest Guest

    Публикаций:
    0
    lukash
    Подходит, у меня нет инфы по портам в/В
     
  13. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Следующий код скопипастен с этого сайта, считывает размер винчестера в секторах:

    Код (Text):
    1. .486
    2.  
    3. stk segment stack use16
    4.  db 256 dup (?)
    5. stk ends
    6.  
    7. base equ 1f0h
    8.  
    9. data segment use16
    10.  msg0 db "Disk capacity: ",'$'
    11.  msg1 db " Sectors",'$'
    12.  buffer dw 256 dup (0)
    13.  string db 10  dup (?)
    14. data ends
    15.  
    16. code segment use16
    17. assume cs:code,ss:stk,ds:data
    18.  
    19. ByteToStr  PROC
    20.                 xor     ah,ah
    21. WordToStr:      xor     dx,dx
    22. DWordToStr:     push    si
    23.                 push    di
    24.                 mov     si,10
    25.                 xor     cx,cx
    26. Next_Digit:     push    ax
    27.                 mov     ax,dx
    28.                 xor     dx,dx
    29.                 div     si
    30.                 mov     bx,ax
    31.                 pop     ax
    32.                 div     si
    33.                 push    dx
    34.                 mov     dx,bx
    35.                 inc     cx
    36.                 or      bx,ax
    37.                 jnz     Next_Digit
    38.                 cld
    39. Store_Digit_Loop:
    40.                 pop     ax
    41.                 add     al,'0'
    42.                 stosb
    43.                 loop    Store_Digit_Loop
    44.                 mov     BYTE PTR es:[di],'$'
    45.                 pop     di
    46.                 pop     si
    47.                 ret
    48. ByteToStr       ENDP
    49.  
    50. start:  ; ENTRY POINT
    51.  
    52. mov ax,data
    53. mov ds,ax
    54. mov es,ax
    55.  
    56. mov dx,base+7
    57. m1:
    58. in   al,dx
    59. test al,80h
    60. jnz  m1
    61.  
    62. mov dx,base+6
    63. mov al,0E0h
    64. out dx,al
    65.  
    66. mov  dx,base+7
    67. m2:
    68. in   al,dx
    69. test al,80h
    70. jnz  m2
    71. test al,40h
    72. jz   m2
    73.  
    74. mov dx,base+7
    75. mov al,0ECh
    76. out dx,al
    77.  
    78. mov  dx,base+206h
    79. m3:
    80. in   al,dx
    81. test al,80h
    82. jnz  m3
    83.  
    84. mov  dx,base+7
    85. m4:
    86. in   al,dx
    87. test al,08h
    88. jz   m4
    89.  
    90. cld
    91. mov di,offset buffer
    92. mov dx,base
    93. mov cx,256
    94. rep insw
    95.  
    96. mov  di,offset string
    97. mov  ax,word ptr [buffer+60*2]
    98. mov  dx,word ptr [buffer+61*2]
    99. call DWordToStr
    100.  
    101.  
    102. mov ah,9
    103. mov dx,offset msg0
    104. int 21h
    105. mov dx,offset string
    106. int 21h
    107. mov dx,offset msg1
    108. int 21h
    109.  
    110. exit:
    111. mov ax,4c00h
    112. int 21h
    113. code ends
    114. end start
    Еще и здесь
    www.wasm.ru/article.php?article=atazen01
    почитай (отсюда я его и скопипастил)
    Этим же способом можно взять и намного больше инфы, но я с этим не разбирался
     
  14. Guest

    Guest Guest

    Публикаций:
    0
    Спасибо всем, тему можно закрывать
     
  15. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    lukash
    а как насчет serial ata?
     
  16. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    doctor_Ice

    Теоретически, и с sata устройствами можно работать так же, как и с обычными, но базы портов не фиксированы. Но я точно не знаю, т.к. нет на чем проверить.

    Вот топики на ету тему
    www.wasm.ru/forum/viewtopic.php?id=16109
    www.wasm.ru/forum/viewtopic.php?id=16740
     
  17. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    lukash
    я знаю. просто я предупредил что твой код не сработает на машине с сериал ата. я сам так проколося однажды.