Чтение с дискеты

Тема в разделе "WASM.BEGINNERS", создана пользователем 3n3m1, 7 апр 2007.

  1. 3n3m1

    3n3m1 3n3m1

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    11
    Адрес:
    Украина
    Добрый день. У меня возникла проблема с чтением дискеты используя порты ввода-вывода.
    Вот код:
    Код (Text):
    1. org 0x7c00
    2. use16
    3. start:
    4.         mov     dx,1f6h         ;Drive and head port
    5.                                      ;Drive 0, head 0
    6.         mov     ax,0x0a00
    7.         out     dx,al
    8.  
    9.         mov     dx,1f2h         ;Sector count port
    10.         mov     al,1            ;Read one sector
    11.         out     dx,al
    12.  
    13.         mov     dx,1f3h         ;Sector number port
    14.         mov     al,1            ;Read sector one
    15.         out     dx,al
    16.  
    17.         mov     dx,1f4h         ;Cylinder low port
    18.         mov     al,0            ;Cylinder 0
    19.         out     dx,al
    20.  
    21.         mov     dx,1f5h         ;Cylinder high port
    22.         mov     al,0            ;The rest of the cylinder 0
    23.         out     dx,al
    24.  
    25.         mov     dx,1f7h         ;Command port
    26.         mov     al,20h          ;Read with retry.
    27.         out     dx,al
    28. still_going:
    29.         in      al,dx
    30.         test    al,8            ;This means the sector buffer requires
    31.  
    32.                                 ;servicing.
    33.         jz      still_going     ;Don't continue until the sector buffer
    34.                                 ;is ready.
    35.  
    36.         mov     cx,512/2        ;One sector /2
    37.         mov     di,buffer
    38.         mov     dx,1f0h         ;Data port - data comes in and out of here.
    39.         rep     insw
    40.         jmp     buffer
    41.  
    42.  
    43.         rb 512-($-start)-2
    44.         db 0x55,0xAA
    45. buffer:
    По идее он должен прочитать первый сектор(загрузочный) и записать его по адресу buffer. Пробема в том что код
    Код (Text):
    1. still_going:
    2.         in      al,dx
    3.         test    al,8            ;This means the sector buffer requires
    4.  
    5.                                 ;servicing.
    6.         jz      still_going     ;Don't continue until the sector buffer
    7.                                 ;is ready.
    как-то непонятно работает. Если al <>8 круги цикла продолжают наматыватся... Я проверял борщем, используя образ, поэтому проблема явно не в том, что дискета недоступна... проблема где-то в коде. Помогите, плиз, если кому не тежело :). Сори за ламерский вопрос...
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    3n3m1
    чтением дискеты используя порты ввода-вывода
    Ты ни чего не путаешь?
    Afaik диапазон портов с 0x01F0 по 0x01F7 принадлежит контроллеру первого жесткого диска.

    Если al <>8 круги цикла продолжают наматыватся
    Imho - пока бит 7 не установлен "круги цикла продолжают наматыватся".

    Afaik единица в 7-ом бите означает, что диск выполняет команду, а ноль - диск "свободен". т.е. применительно к hdd надо писать jNz still_going.
     
  3. 3n3m1

    3n3m1 3n3m1

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    11
    Адрес:
    Украина
    2 q_q:
    ОК. А ты можеш подсказать мне как читать с дискеты, плиз?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    3n3m1
    Я не интересовался дискетами года с 1993.
    Единственная информация доступная тогда - это Роберт Журден (оригинального имени не знаю) "Справочник программиста на персональном компьютере фирмы IBM". Пример чтения с дискеты с использованием портов и ПДП содержится в "Глава 5. Дисковые накопители. - Раздел 4. Чтение и запись файла. - Программирование контроллера HГМД 765 и микросхемы прямого доступа к памяти 8237". Я не проверял, работоспособен ли этот пример на современном железе (весной 93 первый раз попробовал 486SX25). Если не найдешь в сети, отпишись здесь, как-нибудь прицеплю (архив этого раздела ~9кб).
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Я наврал в #2 про _седьмой_ бит (перепутал с 0x80). В
    Код (Text):
    1. still_going:
    2.         in      al,dx
    3.         test    al,8            ;This means the sector buffer requires
    4.  
    5.                                 ;servicing.
    6.         jz      still_going     ;Don't continue until the sector buffer
    7.                                 ;is ready.
    все правильно. Этот цикл ждет когда _третий_ бит будет установлен, т.е. контроллер подготовил данные и их можно забирать.
     
  6. 3n3m1

    3n3m1 3n3m1

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    11
    Адрес:
    Украина
    2 q_q:
    Спасибо большое за направление к Роберту Журдену :). Тема! Вчера нарыл - седня прочитал. Кучю всего еще нагуглил. В общем могу я уже читать с дискеты :)!