информация о дискете

Тема в разделе "WASM.ASSEMBLER", создана пользователем unforgiven, 15 дек 2007.

  1. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    простите, что пишу =/
    нужна помощь, а в Ассе я новичёк


    мне нужно написать прогу, которая проверяет наличие дискеты в приводе
    и если дискета есть, то вывести информацию о ней:кол-во сторон, кол-во дорожек, кол-во слотов на дорожке

    Код (Text):
    1. .model small
    2. .stack 100h
    3. .data
    4.    
    5.     a dw 0
    6. .code
    7. start:
    8.     mov ax,@data
    9.     mov ds,ax
    10.  
    11.     mov ah,32h
    12.     mov dl,1
    13.     int 21h
    14.     ;конец
    15.     cmp al,0
    16.     jnz exit
    17.  
    18. exit:
    19. mov ax,4c00h
    20. int 21h
    21. end start
    22. end
    проверку на вставленность дискеты сделал. а остальное не могу =/

    помогите плизз...
     
  2. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    вот, эсли это раздуплишь, вообщем так, на уровне ф-й биоса, ставишь читать то что хочешь, если ошибку выдаёт - то такого сектора, на такой то дорожке и на такой то поверхности нет, или нет дорожки на такой то поверхности, или нету такой поверхности %)

    вот код из одной фигни, которая ищет читающиеся секторы и их атрибуты запихивает в таблицу:
    Код (Text):
    1. ;данные
    2. TABL1290    db  4*1290  dup ("e")   ; 3 байта на атрибуты сектора, 1 байт разделитель(резерв)  
    3. COUN1290    dw  0
    4.  
    5. ; 2 ПОИСК НА ДИСКЕТЕ 1290 ЧИТАЮЩИХСЯ СЕКТОРОВ
    6.     MOV AH, 0AH
    7.     MOV AL, "2"
    8.     XOR     BH, BH
    9.     MOV CX, 1
    10.     INT 10H ; ДИАГНОСТИЧЕСКОЕ СООБЩЕНИЕ - 2
    11.  
    12.     LEA DI, TABL1290    ; УКАЗАТЕЛЬ НА ТАБЛИЦУ (В ТАБЛИЦЕ БУДУТ АТРИБУТЫ 1290 СЕКТОРОВ)
    13.     ; ПЕРВОНАЧАЛЬНЫЕ ЗНАЧЕНИЯ ДЛЯ Ф-И ЧТЕНИЯ СЕКТОРОВ
    14.     MOV CL, 2       ; сектор 2,3,4,5.... И ТАК ДЕЛЕЕ (нужно 1290)
    15.     MOV CH, 0       ; дорожка 0
    16.     MOV DH, 0       ; поверхность 0
    17.     ; Чтение сектора
    18. __ready_start:
    19.     MOV SI, 3       ; СЧЁТЧИК ПОПЫТОК НА ЧТЕНИЕ
    20. __ERR1290S:
    21.     MOV AH, 2       ; ф-я чтения сектора        
    22.     MOV AL, 1       ; читать 1 сектор
    23.     MOV DL, 0       ; дисковод А:
    24.     LEA BX, BUFER512    ; es:bx -  bufer
    25.     INT 13h
    26.     JNC __READ1290S ; переход если сектор читается
    27.     DEC SI      ; ИНКРЕМЕНТ СЧЁТЧИКА ПОПЫТОК
    28.     JNZ __ERR1290S  ; ПЕРЕХОД - ЕСЛИ СЕКТОР НА ЧИТАЕТСЯ
    29.  
    30.     JMP short __max_atr ; ПЕРЕХОД НА СМЕНУ №СЕКТОРА №ТРЕКА №ПОВЕРХНОСТИ
    31.    
    32. __READ1290S:
    33.     INC COUN1290        ; ИНКРЕМЕНТ СЧЁТЧИКА ЧИТАЮЩИХСЯ СЕКТОРОВ
    34.     ;Перенесём атрибуты в таблицу tabl1290
    35.     MOV [DI], CL    ; сектор
    36.     INC DI
    37.     MOV [DI], CH    ; трек
    38.     INC DI
    39.     MOV [DI], DH    ; поверхность
    40.     INC DI
    41.     MOV byte ptr [DI], "R"  ; разделитель (резерв)  
    42.     INC DI
    43.                                                                                          
    44.     ; Проверка максимальных границ и атрибутов секторов
    45. __max_atr:
    46.     CMP COUN1290, 1290  ; найдено 1290 секторов ?
    47.     JZ  __all_1290  ; ПЕРЕХОД ЕСЛИ 1290 ЧИТАЮЩИХСЯ СЕКТОРОВ НАЙДЕНО.
    48.  
    49.     CMP CL, 18          ; максимальный сектор?
    50.     JZ  __newt          ; ПЕРЕХОД ЕСЛИ МАКСИМАЛЬНЫЙ СЕКТОР НА ТРЕКЕ
    51.     INC CL      ; СЛЕДУЮЩИЙ СЕКТОР
    52.     JMP __ready_start
    53. __newt:  ; СЮДА ПЕРЕХОД КОГДА МАКСИМАЛЬНЫЙ СЕКТОР НА ТРЕКЕ
    54.     CMP CH, 79      ; максимальная дорожка?
    55.     JZ  __newst     ; ПЕРЕХОД ЕСЛИ МАКС. ДОРОЖКА НА ПОВЕРХНОСТИ
    56.     INC CH          ; СЛЕДУЮЩАЯ ДОРОЖКА
    57. __mutka:
    58.           MOV   CL, 1       ; И минимальный сектор на новой(СЛЕДУЮЩЕЙ) дорожке
    59.     JMP __ready_start
    60. __newst:    ; СЮДА ПЕРЕХОДИМ КОГДА НА ПОВЕРХНОСТИ МАКС. ТРЭК
    61.     CMP DH, 1       ; максимальная сторона?
    62.     JZ  __endready  ; ПЕРЕХОД если вторая поверхность читалась, если нет то -
    63.     INC DH          ; поменяем сторону c 0 на 1
    64.     XOR CH, CH      ; и будем читать с первого сектора нулевой дорожки
    65.     jmp __mutka     ; ПЕРЕХОД НА УСТАНОВКУ МИНИМАЛЬНОГО СЕКТОРА
    66.  
    67. __endready: ; прочитана вся дискета и не найдено 1290 ЧИТАЮЩИХСЯ сектора
    68.     MOV AH, 9
    69.     LEA DX, sec_r_err
    70.     INT 21H
    71.     MOV AH, 10H
    72.     INT 16H
    73.     JMP __START
    74. __all_1290: ; СЮДА ПЕРЕХОД ЕСЛИ НАЙДЕНО 1290 ЧИТАЮЩИХСЯ СЕКТОРА
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Слотов на дорожке не бывает, как ни странно. Вот секторы -- бывают

    Читаешь первый сектор нулевой дорожки (головки) нулевого цилиндра -- т.е. самый-самый первый сектор дискеты вообще. Проще, кстати, это делать не через сервисы ДОС, а через BIOS (функция 02h прерывания INT 13h) -- заодно узнаешь, есть ли дискета (если вернёт ошибку, значит, дискеты либо нет, либо она не читается).

    Самый первый сектор -- загрузочный (в нём находится программа-загрузчик, которая осуществляет загрузку системы с дискеты). Однако, кроме загрузчика, в нём присутствует так называемый BPB (BIOS Parameters Block -- блок параметров BIOS). В нём содержится информация о дискете, в т.ч. её "геометрия". Так, по смещению 18h от начала загрузочного сектора хранится число секторов на одной дорожке (длиной слово, т.е. два байта), по смещению 1Ah -- число головок (также слово), а в 13h -- общее число секторов на диске (тоже слово). Число цилиндров не хранится, но его можно вычислить, опираясь на эти три поля.
     
  4. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    хм...вот я где-т вычитал
    ну воть кусок кода

    Код (Text):
    1. mov ah,32h
    2.     mov dx,1
    3.     mov a,bx
    4.     int 21h
    5.  
    6.  
    7.     mov ax,440dh
    8.     mov bx,1
    9.     mov cl,60h
    10.     mov ch,08h
    11.     lea dx,a
    12.     int 21h
    первая часть кода находит аппаратное устройство вроде
    а после выполнения второго куска нашли указатель на блок свойств
    теперь надо это в структуру кинуть...
    а вот элементы этой структуры я и не помню =/
     
  5. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    unforgiven

    У меня нет функций ДОСа -- я под него не программирую. Потому и опирался на функции БИОСа.
     
  6. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    жаль =(

    а то я так понял можно через досовскую 60h функцию сделать
    но у меня для неё описания нет =/


    а вообще спасибо...завтра отосплюсь, поразбираюсь
     
  7. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    google
    книга - "Программирование дисковых подсистем"
     
  8. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Этот BPB сильно ущербный и описать в нём, скажем, "геометрию" xdf не получится. Поэтому когда дискета форматится в xdf никакого BPB туда не пишется. Причём xdf, по-моему, можно прочитать биосом, но только если вручную заказ на каждый сектор оформлять.
    Кстати стандартный формат 1440K вполне работает везде и без BPB. Проверял.
     
  9. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    r90
    Знаю, и что с того? Единого стандартного способа узнать геометрию диска нет, не считая тупой попытки прочитать его весь со всеми возможными извратами (менять размеры секторов, искать удалённые секторы и т.д. и т.п.). Но мне очень кажется, что у человека задача опознать обычный МСДОСнутый диск, а там БПБ сработает.

    Не должен по идее. Во всяком случае, это будет неправильно: параметры диска теоретически могут меняться, и считать их неизменными -- некорректно.
     
  10. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    :'(

    не понимаю....зачем читать сектора, если можно сразу получить кол-во сторон, кол-во дорожек, кол-во секторов на дорожке


    в 60h вроде хранится...в книге той такого нет

    =( подскажите
     
  11. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    SII

    можешь поподробнее написать пожайлуста? =/


    вот

    Код (Text):
    1. MOV AH, 2            
    2.       MOV   AL, 1      
    3.       MOV   DL, 0      
    4.       LEA   BX, BUFER512   
    5.       INT   13h
    ну вот...считал я сектор

    а как из него инфу вытащить ?
     
  12. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    задачи человека я определяю по его посту, а там ничего не сказано про мсдосность.
    какие параметры? обычно тупо считают что дискета имеет 80 дорожек, две головы, и 18 полукилобайтовых секторов на дорожке. этого предположения вполне достаточно чтобы прочитать формат 1440K, вне зависимости от всех прочих параметров формата, типа inteleave и sector skewing.
    То есть может быть какие-то тупые биосы этого не делают -- не знаю. Но я с такими не сталкивался. Венда, по-моему, не замечает отсутствия BPB, хотя не уверен. А драйвер флоповода в лине вообще не обращает внимания на BPB -- он просто предоставляет несколько устройств типа fd0u*, которые позволяют сказать этому драйверу какой формат использовать при работе с дискетой:
    Код (Text):
    1. [rgo ~]$ ls /dev/fd0u*
    2. /dev/fd0u1040  /dev/fd0u1600  /dev/fd0u1743  /dev/fd0u1920  /dev/fd0u800
    3. /dev/fd0u1120  /dev/fd0u1680  /dev/fd0u1760  /dev/fd0u360   /dev/fd0u820
    4. /dev/fd0u1440  /dev/fd0u1722  /dev/fd0u1840  /dev/fd0u720   /dev/fd0u830
    есть ещё /dev/fd0, который пытается автодетектить форматы перебором всех известных ему.
     
  13. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    unforgiven
    смотрим сюда: http://en.wikipedia.org/wiki/BIOS_parameter_block и далее по ссылкам.

    PS. кстати, обратил внимание на фразу по указанной ссылке:
    Этот BPB чисто msdos'овая заморока оказывается. Вот наверное поэтому я её и не встречал нигде.
     
  14. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Дорожек может быть не 80, а больше или меньше, секторов -- тоже, головок -- тоже (одна или две), ну а сами секторы могут иметь размер 128, 256, 512 или 1024 байта. Кроме того, контроллер гибких дисков поддерживает "удалённые" секторы, отличающиеся от обычных одним битом в своём заголовке. Кроме того, информация на дискету может писаться либо с использованием частотной модуляции (FM), либо модифицированной частотной модуляции (MFM) -- и всем этим управляет контроллер. Так что теоретически вариантов полно.

    Нравится или нет, а стандарт де-факто на обмен информацией с помощью дискеты (и флэшки, кстати, тоже) -- это мелкомягкие файловые системы (FAT12 и FAT32). Если отформатировать носитель в другой файловой системе, прочитать его удастся уже не везде.

    Формально Вы правы, но я подошёл к вопросу с другой стороны. Создание полноценного анализатора геометрии дискеты -- весьма непростая задача, требующая, вероятно, прямого программирования FDC (в силу тех вещей, что я перечислил в начале этого поста), что под силу лишь достаточно квалифицированному программисту. Но ему навряд ли потребовалось бы задавать вопросы на форуме новичков -- он бы скорей выступал здесь в роли эксперта. Значит, мы имеем дело с новичком, но новичок вряд ли возьмётся за написание анализатора геометрии, особенно в наше время, когда "защищённые" с помощью разных махинаций с форматом дискеты практически не встречаются (ну, разве что новичок . Куда вероятнее, что ему просто потребовалась информация о геометрии совершенно стандартной дискеты, ну а стандартом для сего носителя информации, как я уже говорил, является FAT12, а не какая-либо другая система.
     
  15. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    SII

    =/

    а ты можешь код этого написать ?

     
  16. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Могу, но лень :-P И вообще, используя чужой код, сам ничему не научишься ;)
     
  17. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    плизз....у мну сессия на носу =/
    а лабу по Ассемблеру завтра сдавать

    :'(
     
  18. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Код (Text):
    1. .code
    2.     ...
    3.  
    4.     push ds
    5.     pop  es
    6.     mov  ax, 0201h
    7.     mov  cx, 1
    8.     xor  dx, dx
    9.     mov  bx, offset Buffer
    10.     int  13h
    11.     jc   ReadError                  ; Переход, если ошибка чтения
    12.    
    13.     mov  ax, word ptr Buffer + 18h  ; Число секторов на дорожке
    14.     mov  SectorsPerTrack, ax
    15.     mov  bx, word ptr Buffer + 1Ah  ; Дорожек в цилиндре (т.е. число головок)
    16.     mov  HeadsPerCylinder, bx
    17.     mul  bx                         ; dx:ax - число секторов в цилиндре
    18.     mov  bx, ax                     ; Старшую часть игнорируем - секторов мало...
    19.     mov  ax, word ptr Buffer + 13h  ; Число секторов на диске
    20.     xor  dx, dx
    21.     div  bx                         ; ax - число цилиндров
    22.     mov  Cylinders, ax
    23.     ...
    24.  
    25. .data
    26.  
    27. Buffer           db  512 dup (?)
    28. SectorsPerTrack  dw  ?
    29. HeadsPerCylinder dw  ?
    30. Cylinders        dw  ?
    Код не проверялся. Вроде должен работать... Есно, надо написать начало и концовку программы, а также обработку ошибки.
     
  19. unforgiven

    unforgiven New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2007
    Сообщения:
    18
    SII
    пасиб...вот ток про вывод спросить хотел

    Код (Text):
    1. .model small
    2. .stack 100h
    3. .data
    4.    
    5.  
    6.     Buffer           db  512 dup (?)
    7.     SectorsPerTrack  dw  ?
    8.     HeadsPerCylinder dw  ?
    9.     Cylinders        dw  0
    10.         temp             dw  0
    11.         msg db 'ERROR$'
    12.    
    13. .code
    14. start:
    15.     mov ax,@data
    16.     mov ds,ax
    17.  
    18. ;Основноле тело   
    19.    
    20.  
    21.     push ds
    22.     pop  es
    23.     mov  ax, 0201h
    24.     mov  cx, 1
    25.     xor  dx, dx
    26.     mov  bx, offset Buffer
    27.     int  13h
    28.     jc   error          ; Переход, если ошибка чтения
    29.     jmp ok                  
    30.  
    31. error:
    32.     mov ah,09h
    33.     lea dx,msg
    34.     int 21h
    35. jmp exit
    36.  
    37. ok:    
    38.     mov  ax, word ptr Buffer + 18h  ; Число секторов на дорожке
    39.     mov  SectorsPerTrack, ax
    40.     mov  bx, word ptr Buffer + 1Ah  ; Дорожек в цилиндре (т.е. число головок)
    41.     mov  HeadsPerCylinder, bx
    42.     mul  bx                         ; dx:ax - число секторов в цилиндре
    43.     mov  bx, ax                     ; Старшую часть игнорируем - секторов мало...
    44.     mov  ax, word ptr Buffer + 13h  ; Число секторов на диске
    45.     xor  dx, dx
    46.     div  bx                         ; ax - число цилиндров
    47.     mov  Cylinders, ax          ;34
    48.     call vivod 
    49.     mov ax,SectorsPerTrack
    50.     call vivod 
    51.     mov ax,HeadsPerCylinder
    52.     call vivod 
    53.  
    54. ;Завершение
    55. exit:
    56. mov ax,4c00h
    57. int 21h
    58.  
    59. vivod proc
    60. push ax
    61. push dx
    62. push bx
    63. push cx
    64. mov temp,ax  
    65.    mov dl,byte ptr temp
    66.    mov bl,byte ptr temp + 1
    67.  
    68.   mov bh,bl
    69.   and bl,11110000b  ;сбрасывает 4 последних в нули
    70.   and bh,00001111b  ;4 первых сбрасывает   
    71.   shr bl,4h     ;смещает 4 вправо
    72.   add bl,30h        ;разница между числом и аски
    73.   add bh,30h        ;тож самое
    74.  
    75.    mov dh,dl
    76.    and dh,00001111b
    77.    and dl,11110000b
    78.    shr dl,4h
    79.    add dl,30h
    80.    add dh,30h
    81.  
    82.    mov cl,dl
    83.    mov ah,02h
    84.    mov dl,bl
    85.    int 21h
    86.    mov dl,bh
    87.    int 21h
    88.    mov dl,cl
    89.    int 21h
    90.    mov dl,dh
    91.    int 21h
    92.  
    93.   mov dl,10d
    94.   int 21h
    95. pop cx
    96. pop bx
    97. pop dx
    98. pop ax
    99. ret
    100. vivod endp
    101.  
    102.  
    103. end start
    104. end
    всё пашет, но я вывожу число посимвольно
    так и надо ?
    и ещё...
    Код (Text):
    1. mov dl,byte ptr temp
    вроде один байт, а почему-то берётся две цифры числа...объясните пожайлуста =/
     
  20. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Во-первых, байт -- это всегда две шестнадцатеричные цифры (одна цифра -- 4 бита, а в байте их 8). А во-вторых, вывод какой-то кривой. Думать лень и некогда, но смахивает на неправильный.