Доступ к произвольному сектору HDD, используя сервисы BIOS

Тема в разделе "WASM.ASSEMBLER", создана пользователем zhindos, 14 сен 2008.

  1. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Доброго времени суток, господа.
    В общем - то сабж. Знаю о существовании сервиса int 13h, однако, как я понял, там невозможно адресовать больше чем 32MB (1024x63x512). Если то, что я хочу - возможно, ткните, плз, в подробную инфу про нужный сервис и ВСЕ его функции.
     
  2. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Всё можно. Посмотрите Ralph Brown's interrupt list. Есть и расширенные функции, появившиеся позднее.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    zhindos
    Вопервых, Советую перечитать. 13h позволяет используя CHS одрисацию получить доступ к 1024*255*63*512=8ГБ
    Но есть также расширенный сервис функции c омерам 40h ищи по словам BIOS Enhanced Disk Drive Services (EDD).
     
  4. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Читаю с диска ф-ией 42h int 13h:

    Код (Text):
    1. .data
    2. disk_address_packet     db      10h, 0, 01h, 00h, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0
    3. transferBuffer          db      ?
    4.  
    5. .code
    6. .386
    7.  
    8. start:
    9.     mov         ax, DGROUP
    10.     mov         ds, ax
    11.     mov         bx, offset disk_address_packet
    12.     mov         word ptr [bx + 4], ax
    13.     mov         word ptr [bx + 6], offset transferBuffer
    14.     mov         si, offset disk_address_packet
    15.     mov         dl, 80h
    16.     mov         ax, 4200h
    17.     int         13h
    Синтаксис - tasm 4.1

    Возвращает ошибку, error code in ah == 1, what means "invalid function in AH or invalid parameter".
    В чем тут может быть дело? (точно не в номере диска в dl, сам проверял).
    Есть подозрение, что ошибка в "starting absolute block number", если это так - то расскажите, pls, как он формируется.
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Из того, что явно бросается в глаза...

    Во-первых, в указателе segment:offset смещение хранится в младшем слове, а сегментный адрес в старшем.
    Во- вторых, функции работают с блоками, а не байтами, поэтому размер буфера для жесткого диска должен быть равен как минимум 512 байт.
    В-третьих, всегда нужно проверять поддержку EDD-функций, причем как в общем, так и для каждого диска в отдельности.
     
  6. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
  7. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    zhindos
    Кроме того, что указал Phantom_84 (перепутали в блоке параметров сегмент и смещение), я думаю, Вы напортачили в самом блоке параметров, который должен быть длиной 10h байт - я вижу не все. Распишу его подробно:
    Код (Text):
    1. block_param dw 10h ; длина собственно блока параметров - всегда это значение
    2.                  dw  01h ; количество секторов для трансфера - от 1 до 7Fh или до 0FFh
    3.                  dw 1000h ; смещение ОЗУ для трансфера
    4.                  dw 6000h ; сегмент ОЗУ для трансфера - в моем примере 6000:1000
    5.                  dd 0 ; номер ЛБА для трансфера  - младшая часть
    6.                  dd 0 ; номер ЛБА для трансфера - старшая часть