Программирование FDD

Тема в разделе "WASM.ELECTRONICS", создана пользователем valeri, 7 июн 2005.

  1. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Вот в чем суть проблемы.

    Занимаюсь программированием floppy через порты.

    Сделал программку чтения сектора. На эмуляторах Virtual PC и Bochs все работает, а на реальном компе выдается ошибка, что сектор не найден.

    Может быть кто знает возможные причины.
     
  2. MSKZ

    MSKZ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2005
    Сообщения:
    47
    Может не к тем портам обращаешься?
     
  3. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    задежка между обращениями к портам есть?



    P.S. без исходного кода трудно сказать...

    залей если не секрет
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    valeri



    напихай push eax - pop eax между in / out
     
  5. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Много напихивать придется. :)
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _BC_



    Ну тогда пустые циклы на пару десятков - сотен тысяч итераций :)
     
  7. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    :)

    Есть специальный порт для задержки ввода-вывода, а именно EBh. BIOS обожает туда писать...

    --

    О, моя реплика № 200 ;)
     
  8. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Я тоже такое написал, Может пригодится!

    Вот мой код на fasm!!!


    Код (Text):
    1. ;CopyRight by Songoku aka x-goku (songoku{@}tut.by)
    2.  
    3.  
    4. last_port equ 'lp' ; YOU CAN USE THIS, WENN LAST PORT WAS ABOVE THEN 255
    5.                    ; IF YOU WANNA USE 0 PORT YOU MAST USE "XOR DX,DX" AND THEN out(x) last_port,y
    6. macro outb port,byte
    7. {
    8. if     port eqtype ""
    9. if     byte in <al>
    10. else
    11. if     byte = 0
    12. xor    al,al
    13. else
    14. mov    al,byte
    15. end    if
    16. end    if
    17. out    dx,al
    18. else
    19. if     byte in <al>
    20. else
    21. if     byte = 0
    22. xor    al,al
    23. else
    24. mov    al,byte
    25. end    if
    26. end    if
    27. if     port > 255
    28. mov    dx,port
    29. out    dx,al
    30. else
    31. out    port,al
    32. end    if
    33. end    if
    34. }
    35.  
    36.  
    37. macro inb port
    38. {
    39. if    port <> last_port
    40. if    port > 255
    41. mov   dx,port
    42. in    al,dx
    43. else
    44. in    al,port
    45. end   if
    46. else
    47. in    al,dx
    48. end   if
    49. }                      
    50.  
    51.  
    52. DR_A             equ 00000000b ; Disk A:
    53. DR_B             equ 00000001b ; Disk B:
    54. ;digital output register DOR
    55. DOR              equ 3F2h
    56. DOR_A            equ 00010000b ; Âêëþ÷íèå ìîòîðà
    57. DOR_B            equ 00100000b ; Âêëþ÷íèå ìîòîðà
    58. DOR_DMA          equ 00001000b
    59. DOR_NONREST      equ 00000100b ;Controller enabled
    60. ;main status register
    61. MSR              equ 3F4h
    62. MSR_READY        equ 10000000b
    63. MSR_INPUT        equ 01000000b ; With OUT OUTPUT
    64. ;data register
    65. DATA_REG         equ 3F5h
    66. CMD_SEEK         equ 00001111b ;Seek
    67. CMD_READ         equ 00000110b ;Read
    68. CMD_FLAG_MT      equ 10000000b
    69. CMD_FLAG_MFM     equ 01000000b
    70. CMD_FLAG_SK      equ 00100000b
    71. ;configuration control register (AT)
    72. CON_REG          equ 3F7h ;Data Transfer Rate
    73. TRANSF_RATE_500  equ 00b  ;500kbits/s
    74. TRANSF_RATE_300  equ 01b  ;300kbits/s
    75. TRANSF_RATE_250  equ 10b  ;250kbits/s
    76. ; DMA
    77. DMA_CHANEL_0     equ 00h ; Address
    78. DMA_CHANEL_0_C   equ 01h ; Counter
    79. DMA_CHANEL_1     equ 02h ; Address
    80. DMA_CHANEL_1_C   equ 03h ; Counter
    81. DMA_CHANEL_1_SEG equ 83h ; Segment
    82. DMA_CHANEL_2     equ 04h ; Address
    83. DMA_CHANEL_2_C   equ 05h ; Counter
    84. DMA_CHANEL_2_SEG equ 81h ; Segment
    85. DMA_CHANEL_3     equ 06h ; Address
    86. DMA_CHANEL_3_C   equ 07h ; Counter
    87. DMA_CHANEL_3_SEG equ 82h ; Segment
    88. ;----------------------------------
    89. DMA_CMD_MASK     equ 0x0A ; Mask
    90. ; FLAGS
    91. DMA_MASK_CHANEL0 equ 00000000b  ; Memory Pointer (Chanel 0)
    92. DMA_MASK_CHANEL1 equ 00000001b
    93. DMA_MASK_CHANEL2 equ 00000010b  ; Floppy
    94. DMA_MASK_CHANEL3 equ 00000011b  ; Hdd
    95. DMA_MASK_SETMASK equ 00000000b  ; SET MASK
    96. DMA_MASK_DELMASK equ 00000100b  ; RESET MASK
    97.  
    98. ;----------------------------------
    99. DMA_CMD_MOD      equ 0x0B ; Ðåãèñòð ðåæèìà
    100. ; FLAGS
    101. DMA_MOD_POINTER  equ 00000000b  ; Memory Pointer (Chanel 0)
    102. DMA_MOD_FLOPPY   equ 00000010b  ; Chanel 2
    103. DMA_MOD_HDD      equ 00000011b  ; Chanel 3
    104. DMA_MOD_TEST     equ 00000000b  ; Test
    105. DMA_MOD_WRITE    equ 00000100b  ; Write To Memory
    106. DMA_MOD_READ     equ 00001000b  ; Read From Memory
    107. DMA_MOD_INIT     equ 00010000b  ; Àâòîèíèöèëèçàöèÿ
    108. DMA_MOD_ADDR_INC equ 00000000b  ; Óâåëè÷åíèå àäðåñà
    109. DMA_MOD_ADDR_DEC equ 00100000b  ; Óìåíüøåíèå àäðåñà
    110. DMA_MOD_ONCE     equ 01000000b  ; Îäèíî÷íûé ðåæèì
    111. DMA_MOD_BLOCK    equ 10000000b  ; Áëî÷íûé ðåæèì
    112. ;----------------------------------
    113. DMA_CMD_RESET_TR equ 0x0C ; Ñòáðîñ òðèãåðà áàéòîâ ... äëÿ çàãðóçêè 16 áèòíûõ àäðåñîâ
    114. DMA_CMD_RESET    equ 0x0D ; Reset DMA
    115. DMA_CMD_RESER_M  equ 0x0F ; Reset MASK
    116.  
    117. ;
    118. ; 18 CYLINDERS
    119. ;
    120. ;
    121. ;
    122. ;
    123.  
    124. flp_wait:
    125. inb   MSR
    126. test  al,MSR_READY
    127. jz    flp_wait
    128. ret                                                                            
    129.  
    130.  
    131.  
    132. ; cl - Drive
    133. ; ch - Cylinder
    134. ; bl - Head
    135. ; bh - Sector to Read
    136. ; edi - address
    137. ReadSector:
    138. mov   al,cl
    139. or    al,DOR_A+DOR_DMA+DOR_NONREST
    140. outb  DOR,al
    141. call  flp_wait
    142. outb  CON_REG,TRANSF_RATE_500
    143. call  flp_wait
    144. ;DMA
    145. outb  DMA_CMD_RESET_TR,0
    146. outb  DMA_CMD_MOD,DMA_MOD_FLOPPY+DMA_MOD_WRITE+DMA_MOD_ONCE
    147. mov   ax,1000h;_test;start2      ;ADDRESS
    148. outb  DMA_CHANEL_2,al
    149. mov   al,ah
    150. outb  DMA_CHANEL_2,al
    151. mov   ax,0          ; SEGMENT
    152. outb  DMA_CHANEL_2_SEG,al
    153. mov   ax,511 ; 512 = Size Of Sector
    154. outb  DMA_CHANEL_2_C,al
    155. mov   al,ah
    156. outb  DMA_CHANEL_2_C,al
    157. outb  DMA_CMD_MASK,DMA_MASK_CHANEL2
    158. ;end of DMA
    159. outb  DATA_REG,CMD_READ+CMD_FLAG_MFM+CMD_FLAG_SK
    160. mov   al,cl
    161. outb  last_port,al   ;Floppy
    162. mov   al,ch
    163. outb  last_port,al   ;Cylinder
    164. mov   al,bl
    165. outb  last_port,al   ;Head
    166. mov   al,bh
    167. outb  last_port,al   ;Sector to Read
    168. outb  last_port,2    ;Sector size (128 * 2^x) -> x = 2
    169. outb  last_port,0Fh
    170. outb  last_port,54H  ;Length of GAP 3:
    171. outb  last_port,0FFh ;Length of data to read
    172. call  flp_wait
    173. inb   DATA_REG
    174. push  eax
    175. mov   ecx,6
    176. @@:
    177. inb   last_port
    178. loop  @B
    179. pop   eax
    180. and   al,11000000b
    181. movzx eax,al
    182. test  eax,eax
    183. jnz   @F
    184. push  eax
    185. mov   esi,1000h
    186. mov   ecx,128
    187. repz  movsd
    188. pop   eax
    189. @@:
    190. ret
    191.  
    192.  
     
  9. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    Задержка во флопе организуется через прерывания. Послал команду дождался прерывания прочитал результат. Я развлекался с флоповодом, и у меня всё работало. Наверное даже работает. Если надо могу скинуть сорцы. Только в AT&T синтаксисе.



    у меня тоже вопрос по поводу флоповода. Приобрёл тут себе новый, и только дома заметил, что в разьёме, куда шлейф втыкать не хватает штырьков, причём всё выглят так как будто так и надо. Флоп замечательно работает, но только до тех пор, пока я не попытаюсь использовать формат диска отличный от стандартного 1440k. Что это может быть? Все дискеты засраны (штуки три я пробовал), или всё дело в отсутсвующих штырьках? Или контроллер помешан на почве 1440k?
     
  10. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Если три способа!

    1. Читать память EBh.

    2. Обрабатывать прерывание.

    3. Использовать эту функцию:
    Код (Text):
    1. flp_wait:
    2. inb   MSR
    3. test  al,MSR_READY
    4. jz    flp_wait
    5. ret        
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    rgo >




    Уже давно такое с флопами, экономия видимо :) Если нужно работать с нестандартными форматами под NT+ можно попробовать драйвер от OmniFlop.
     
  12. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    _S_T_A_S_

    я пользую линуховый драйвер флопа, а когда не хватает fdutils.

    То есть пользовал fdutils. Теперь только /dev/fd0u1440 дееспособен. В честь этого я, обидемшись на флоп, купил себе флеш :) Но блин, написан загрузчик который из xxdf формата должен грузится. И в процессе моих экспериментов с fdc, флоп сказал прощай. А новый с xxdf работать не хочет (причем проверено на fdutils->xdfformat, xdfcopy). Такой вот облом. Даже убедится не могу что загрузчик написан.



    А этот омнидиск, может например расформатировать флоп (в отсутсвующими штырьками) на 1760 например? я просто винду снёс, когда место на харде кончилось, и теперь проверить не могу. А на сайте я так и не нашёл слов на этот счёт.
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Про 1760 не знаю, последний раз контроллеры дисковода я программировал на Спектруме. И эта прога мне понадобилась что бы прочитать несколько дискет 5'25 под XP. Вот список форматов, которые поддерживает драйвер. Единственно, у проги есть недостаток - требуется регистрация для каждого формата (по мылу), но подходящие s/n несложно находятся, если нет времени ждать.









    А по поводу недостающих контактов - посмотри номера пинов, может они и не нужны :)
    Код (Text):
    1.           РАСПРЕДЕЛЕНИЕ КОНТАКТОВ РАЗ'ЕМА ВНУТРЕННЕГО ДИСКОВВОДА
    2.                                                     номера
    3.                     при стандартных ТТЛ-уровнях     контактов
    4. ───────────────────                                        ───────────────────
    5.                    │общий для четных номеров         1-33 │
    6.                    ├──────────────────────────────────────┤
    7.                    │не используется                  2,4,6│
    8.                    ├──────────────────────────────────────┤
    9.                    │индекс                             8  │
    10.                    ├─────────────────────────────────────>┤
    11.                    │включение двигателя A             10  │
    12.                    ├<─────────────────────────────────────┤
    13.                    │выбор привода B                   12  │
    14.                    ├<─────────────────────────────────────┤
    15.                    │выбор привода A                   14  │
    16.                    ├<─────────────────────────────────────┤
    17.                    │включение двигателя B             16  │
    18.                    ├<─────────────────────────────────────┤
    19.                    │направление(шаг.двиг.)            18  │
    20.                    ├<─────────────────────────────────────┤
    21.                    │Шаговый импульс                   20  │
    22.    Внутренний      ├<─────────────────────────────────────┤  адаптер
    23.                    │запись данных                     22  │
    24.    дисковвод       ├<─────────────────────────────────────┤  дисковвода
    25.                    │разрешение записи                 24  │
    26.                    ├<─────────────────────────────────────┤
    27.                    │нулевая дорожка                   26  │
    28.                    ├─────────────────────────────────────>┤
    29.                    │защита записи                     28  │
    30.                    ├─────────────────────────────────────>┤
    31.                    │чтение данных                     30  │
    32.                    ├─────────────────────────────────────>┤
    33.                    │выбор головки 1                   32  │
    34.                    ├<─────────────────────────────────────┤
    35.                    │не используется                   34  │
    36.                    ├──────────────────────────────────────┤
    37. ───────────────────│                                      │───────────────────
    38.  
     
  14. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Решение проблемы нашел.

    Пришлось при чтении каждого сектора вставлять команду recalibrate, а потом seek. Знаю, что это коряво. Подскажите когда надо давать команду seek и recalibrate.
     
  15. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    valeri

    рекалибровка нужна один раз, а seek когда с цилиндра на цилиндр переходишь. Линуксовый драйвер флоповода выполняет рекалибровку, только при инициализации драйвера, в случае ошибок и смены носителя.

    seek каждый раз при смене цилиндра и опять же в случае ошибок.

    PS. ты точно все байты результата выполнения команды считываешь?



    _S_T_A_S_

    а как при это нумеруются пины? Я придумал восемь способов, и из них один говорит что отсутствует большая часть земли (то есть нечётных контактов). и я думаю что это правильный способ, ибо остальные, по-моему все, какой-нибудь из полезных пинов да выкинут.

    вот разъём на флопе:
    Код (Text):
    1.  
    2. 123456789012344678
    3. ------------------
    4. 111111111111111111
    5. 100001000010000101
    6. --------[]--------
    7.  
     
  16. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    OK. Все работает. Только медленно, почему-то.