Как работать с флоппи и ЖД в защищенном режиме?

Тема в разделе "WASM.ASSEMBLER", создана пользователем kostec, 1 ноя 2006.

  1. kostec

    kostec New Member

    Публикаций:
    0
    Регистрация:
    1 ноя 2006
    Сообщения:
    3
    Если кто-нибудь знает, подскажите плз.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В чисто защищёнке, без функций ос? Порты, Bios.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Bios?
     
  4. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    kostec
    Вот так с флоппи
    Код (Text):
    1. _universal  equ 1       ; закомментировать если не используется
    2. ;----------------------------------------------------------------------------¬
    3. ;¦ Подпрограмма инициализации                                                  ¦
    4. ;¦ Вход: cl - дисковод                                  ¦
    5. ;¦ Выход:      ZF=0 если инициализация успешна                     ¦
    6. ;¦             ZF=1 если таймаут или ошибка посылки комманды             ¦
    7. ;L----------------------------------------------------------------------------
    8. InitFDD:        mov dx,3F2h
    9.             in al,dx
    10.             and al,0FBh     ; бит 2 - reset
    11.             out dx,al
    12.             or al,0Ch
    13.             out dx,al
    14. ;----------------------------------------------------------------------------¬
    15. ;¦ Подпрограмма ожидания аппаратного прерывания IRQ6                         ¦
    16. ;¦ Вход:                                    ¦
    17. ;¦ Выход:      ZF=0 если условие выполнилось пока счетчик не обнулился         ¦
    18. ;¦             ZF=1 если обнулился счетчик                  ¦
    19. ;L----------------------------------------------------------------------------
    20. WaitForIRQ6:        mov al,0Ah      ; чтение IRR
    21.             out 20h,al
    22.             call WaitForFDDEvent
    23.             in al,20h
    24.             shl al,1
    25.             jns WFELabel2       ; бит 6 - IRQ6
    26.             mov al,8       
    27.             pop _bx         ; Выход из ожидания
    28. SCToFDDFromEAX:     push edx
    29.             push ecx
    30.             push eax
    31. SCFDDLabel1:        call SCToFDDFromStack
    32. SCFDDLabel2:        pop eax
    33.             pop ecx
    34.             pop edx
    35.             retn
    36. ;----------------------------------------------------------------------------¬
    37. ;¦ Подпрограмма посылки комманды                                             ¦
    38. ;¦ Выход:      ZF=0 если условие выполнилось пока счетчик не обнулился         ¦
    39. ;¦             ZF=1 если обнулился счетчик                  ¦
    40. ;L----------------------------------------------------------------------------
    41. SendCommandFDD:     push edx
    42.             push ecx
    43.             push eax
    44.             mov cl,ah
    45.             call IsDSKCHG
    46.             jz SCFDDLabel2
    47.             call SCToFDDFromStack
    48. ;           call WaitForIRQ6
    49.             pop eax
    50.             pop ecx
    51.             pop edx
    52.             retn
    53. ;----------------------------------------------------------------------------¬
    54. ;¦ Подпрограмма рекалибровки                                                ¦
    55. ;¦ Вход: cl - дисковод                                  ¦
    56. ;¦ Выход:      ZF=1 если успешна                        ¦
    57. ;¦             ZF=0 если ошибка таймаут при ожидании конца рекалибровки      ¦
    58. ;L----------------------------------------------------------------------------
    59. Recalibrate:        call RLabel1    ; дважды
    60.             jz RLabel2  ; Поскольку 77 треков в
    61. RLabel1:        mov ah,cl   ; DRV
    62.             mov al,7        ; RECALIBRATE
    63. FinishSeek:     push _cx
    64.             call SCToFDDFromEAX
    65.             call WaitForIRQ6
    66.             pop _cx
    67.             shl al,1
    68.             js RLabel2
    69. RLabel3:        sbb al,al
    70. RLabel2:        retn
    71. ;----------------------------------------------------------------------------¬
    72. ;¦ Подпрограмма поиска трека                                                 ¦
    73. ;¦ Вход: cl - дисковод ch - трек                            ¦
    74. ;¦ Выход:      ZF=1 если успешна                        ¦
    75. ;¦             ZF=0 если ошибка таймаут при ожидании конца поиска            ¦
    76. ;L----------------------------------------------------------------------------
    77. Seek:           mov _ax,_cx
    78.             shl eax,8
    79.             mov al,0Fh
    80.             jmp FinishSeek
    81. ;----------------------------------------------------------------------------¬
    82. ;¦ Подпрограмма проверки смены диска                                  ¦
    83. ;¦ Вход: cl - дисковод                                  ¦
    84. ;¦ Выход: Калибровка скорости                            ¦
    85. ;L----------------------------------------------------------------------------
    86. IsDSKCHG:       mov dx,3F2h
    87.             in al,dx
    88. MOLabel2:       test cl,1
    89.             mov ah,10h
    90.             jz MOLabel1
    91.             mov ah,21h
    92. MOLabel1:       or al,ah
    93.             out dx,al
    94.             mov dl,0F7h
    95.             in al,dx
    96.             shl al,1
    97.             jnc FindSpeed
    98.             call Recalibrate
    99.             jnz FSLabel3        ; Ошибка рекалибровки
    100.             push _cx
    101.             mov ch,1
    102.             call Seek
    103.             pop _cx
    104.             jnz FSLabel3        ; Ошибка позиционирования
    105.             mov dl,0F7h     ; проверка наличия дискеты
    106.             in al,dx        ; вообще
    107.             shl al,1
    108.             jc FSLabel3
    109. FindSpeed:      mov eax,0010AF03h   ; 0011AF03h
    110.             call SCToFDDFromEAX ; SPECIFY
    111.             jz FSLabel2
    112.             mov eax,005F0013h  
    113. ; !!! Если хотим использовать FIFO, то здесь 005F0013h, но тогда при записи
    114. ; на диск - будет требоваться на 16 байт (от 1 до 16 байт) больше послать
    115. ; информации, которая на диск писаться не будет, а будет служить лишь для
    116. ; заполнения буфера FIFO, поскольку сигнал запрос данных будет выдан FDC CPU
    117. ; как только освободиться FIFO, а на диск еще последний байт не запишется,
    118. ; то есть к примеру при чтении читается 512 байт, а при записи пишется
    119. ; 512, но дополнительно посылаются 16 байт чтобы запонить FIFO - итого 528.
    120. ; При использовании DMA этого не будет. При отключеном FIFO тоже. Этот
    121. ; момент происходит лишь при использовании универсальной программы FDD_IO.
    122.             call SCToFDDFromEAX ; CONFIGURE
    123.             jz FSLabel2
    124.             mov al,3
    125. FSLabel1:       mov dx,3F7h
    126.             out dx,al
    127. ;           jmp FSLabel2
    128.             push _ax
    129.             push _cx            ; _cx - меняется READ ID
    130.             mov ah,cl
    131.             mov al,4Ah
    132.             call SCToFDDFromEAX
    133.             test al,0C0h
    134.             stc         ; для сброса ZF
    135.             pop _cx
    136.             pop _ax
    137.             jz RLabel3      ; выход со сбросом ZF
    138.             dec al
    139.             jns FSLabel1
    140. FSLabel3:       cmp al,al       ; ZF = 1 ошибка
    141. FSLabel2:       retn
    142. ;----------------------------------------------------------------------------¬
    143. ;¦ Подпрограмма ожидания события                                             ¦
    144. ;¦ Вход:       mov ecx, ...     ; сетчик в единицах по 15 мксек             ¦
    145. ;¦        call WaitForEvent                                             ¦
    146. ;¦             ...               ; код проверки условия                      ¦
    147. ;¦             retn         ; ZF = 1 условие выполнено          ¦
    148. ;¦ Выход:      ZF=0 если условие выполнилось пока счетчик не обнулился         ¦
    149. ;¦             ZF=1 если обнулился счетчик                  ¦
    150. ;L----------------------------------------------------------------------------
    151. Pause15mks:     call WaitForEvent
    152.             jmp short WFELabel2
    153. WaitForHDDEvent:    mov ecx,33333       ; 0.5 секунд
    154.             jmp short WaitForEvent
    155. WaitForFDDEvent:    mov ecx,333333      ; 5 секунд
    156. WaitForEvent:       pop _bx
    157.             mov ah,10h
    158. WFELabel1:      call _bx
    159.             jz WFELabel2        ; дождались
    160.             in al,61h
    161.             and al,10h
    162.             xor al,ah
    163.             jnz WFELabel1
    164.             xor ah,10h
    165. ifndef  _32Bit
    166.             db 67h
    167. endif
    168.             loop WFELabel1
    169. WFELabel2:      or ecx,ecx
    170.             retn
    171. ;----------------------------------------------------------------------------¬
    172. ;¦ Подпрограмма ввода-вывода комманды-результата с использованием стека      ¦
    173. ;¦ Вход: В стеке комманда и достаточно места для результата ее исполнения    ¦
    174. ;¦ Выход:      ZF=0 если комманда выполнилось пока счетчик не обнулился       ¦
    175. ;¦             ZF=1 если обнулился счетчик                  ¦
    176. ;L----------------------------------------------------------------------------
    177. SCToFDDFromStack:   pop _ax     ; +2 или +4
    178.             mov _si,_sp
    179.             push _ax
    180.             mov _di,_si            
    181. ;----------------------------------------------------------------------------¬
    182. ;¦ Подпрограмма ввода-вывода комманды-результата                             ¦
    183. ;¦ Вход: esi-буфер ввода                          -¬  если используется      ¦
    184. ;¦       edi-буфер вывода                          +- режим _universal, то   ¦
    185. ;¦       ebp-буфер для фазы исполнения если есть  --  адресация в ss: сегм.  ¦
    186. ;¦ Выход:      ZF=0 если комманда выполнилось пока счетчик не обнулился      ¦
    187. ;¦             ZF=1 если обнулился счетчик                  ¦
    188. ;L----------------------------------------------------------------------------
    189. FDD_IO:         call ReadyFDD
    190. FDD_IOLabel1:
    191. ifdef _universal
    192.             db 36h          ; ss:
    193. endif
    194.             outsb               ; послать комманду
    195. FDD_IOLabel3:       call Pause15mks
    196. ReadyFDD:               mov dx,3F4h
    197.                         call WaitForFDDEvent    ; <--------------------¬
    198.                         in al,dx                ;                      ¦
    199.                     shl al,1                ;                      ¦
    200.                         jnc short WFELabel2     ; бит RQM - готовность ¦
    201.                         pop _cx                 ; выход из ожидания ----
    202.                         mov ecx,10              ; должна быть задержка
    203.             inc _dx         ; edx = 3F5h
    204.             test al,20h     ; бит CB - Command Buzy
    205.             jz WFELabel2            ; выход если CB = 0
    206.             shl al,1            ; бит CB - 1
    207.             jns NoExecute       ; бит NonDMA=1
    208.             mov _si,_bp
    209.             mov _di,_bp
    210.             db 9Ch          ; pushfd или pushf
    211.             mov cl,0        ; нет задержки для
    212.             inc _bp         ; фазы исполнения
    213.             db 9Dh          ; popfd или popf
    214. NoExecute:      jnc FDD_IOLabel1        ; бит CPU>FDD
    215. ifdef   _universal
    216.             db 36h          ; ss:
    217. endif
    218.             insb
    219.             jmp FDD_IOLabel3
     
  5. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    kostec
    А вот так с HDD

    Код (Text):
    1. ;----------------------------------------------------------------------------¬
    2. ;¦ScanPCI:                                  ¦
    3. ;L----------------------------------------------------------------------------
    4. ;   Регистр CONFADD  0CF8h
    5. ;
    6. ;          3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1                    
    7. ;          1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
    8. ;         --T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-¬
    9. ;         ¦C¦       ¦          ¦        ¦     ¦         ¦Re ¦
    10. ;         ¦O¦  Reserved   ¦     BUSNUM     ¦  DEVNUM ¦FUNC-¦  REGNUM   ¦se ¦
    11. ;         ¦N¦       ¦          ¦        ¦ NUM ¦         ¦er ¦
    12. ;         ¦E¦       ¦          ¦        ¦     ¦         ¦ved¦
    13. ;         L-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--
    14. ;       CONE - Configuration Enable (1-Enable; 2-Disable)
    15. ;       REGNUM - от 0 до 252 соответсвенно определяют адрес окна в
    16. ;           4 байта для последующего доступа.
    17. ;   Регистр CONDATA 0CFCh - 0CFFh - это 32 бит окно в конфигурационной
    18. ;       области PCI если бит CONE = 1.
    19. ; CF = 1 не найдено
    20. ScanPCI:        add esi,100h
    21.             cmp esi,81000000h
    22.             cmc
    23.             jc RPCILabel1
    24. ReadPCI:        mov eax,esi     ; Передпологается, что
    25.             mov dx,0CF8h        ; прочитать 0FFFFFFFFh
    26.             out dx,eax      ; мы не можем
    27.             add dl,4
    28.             in eax,dx
    29.             inc eax
    30.             jz ScanPCI
    31.             dec eax        
    32. RPCILabel1:     retn
    33.  
    34. HDDControl  struc
    35.     BaseCommandBlock    dd ?
    36.     BaseControlBlock    dd ?
    37.     HDDFlags        dd ?
    38. HDDControl  ends
    39.  
    40. CommandBlock    struc
    41.     Data        db ?
    42.     Error       db ?
    43.     SectorCount db ?
    44.     SectorNumber    db ?
    45.     CylinderLow db ?
    46.     CylinderHigh    db ?
    47.     Drive       db ?
    48.     Status      db ?
    49. CommandBlock    ends
    50.  
    51. ; При записи
    52.  
    53. Featers equ <Error>
    54. Head    equ <Drive>
    55. Command equ <Status>
    56.  
    57. ControlBlock    struc
    58.             db ?    ; Reserved
    59.             db ?    ; Reserved
    60.     AltStatus   db ?   
    61.     Floppy      db ?
    62. ControlBlock    ends
    63.  
    64. ; При записи
    65.  
    66. DeviceControl equ <AltStatus>
    67.  
    68.    
    69. ;----------------------------------------------------------------------------¬
    70. ;¦ FoundPCIIDE: Находит PCI IDE устройство.                    ¦
    71. ;L----------------------------------------------------------------------------
    72. FoundPCIIDE:
    73. FPCIIDELabel1:  call ScanPCI
    74.         jc FPCIIDELabel2
    75.         shr eax,10h+8
    76.         dec al
    77.         jnz FPCIIDELabel1
    78.         or al,al
    79. FPCIIDELabel2:  retn
    80. ;----------------------------------------------------------------------------¬
    81. ;¦ TestIDEDevice: Находит устройство IDE.                      ¦
    82. ;L----------------------------------------------------------------------------
    83. TestIDEDevice:  push edi
    84.         add dl,7        ; Command
    85.         call WaitForHDDBSY
    86.         jz TIDEDLabel1
    87.         dec _dx
    88.         in al,dx
    89.         push _ax
    90.         mov al,11100000b    ; Device 0
    91.         call TestIDEDLabel3
    92.         jnz TIDEDLabel2
    93.         mov al,11110000b    ; Device 1
    94.         call TestIDEDLabel3
    95. TIDEDLabel2:    pop _ax
    96.         pushfd
    97.         dec _dx
    98.         popfd
    99.         in al,dx
    100.         mov bl,al
    101.         out dx,al
    102. TIDEDLabel1:    pop edi
    103.         retn
    104. TestIDEDLabel3: call ChoseHDD
    105.         jz TIDEDLabel4      ; Device 0 занято
    106.         mov al,0ECh         ; 0A1h для CDROM
    107.         out dx,al       ; 1F7h
    108.         call WaitForHDDBSY
    109.         jz TIDEDLabel4
    110.         in al,dx
    111.         and al,01
    112.         dec al
    113.         jz TIDEDLabel4
    114.         call WaitForHDDDRQ
    115.         mov ecx,100h
    116.         push eax
    117.         sub dl,7
    118. LoopCycle1: mov edi,esp
    119.         insw
    120.         loop LoopCycle1
    121.         add dl,7
    122.         pop eax
    123. TIDEDLabel4:    retn
    124. ChoseHDD:   out dx,al
    125.         inc _dx
    126. WaitForHDDDRDYBSY: call WaitForHDDBSY
    127.         jz WFHDDRDYLabel1
    128.         call WaitForHDDEvent
    129.         in al,dx
    130.         and al,40h
    131.         xor al,40h
    132. WFHDDRDYLabel1: retn
    133. WaitForHDDBSY:  call WaitForHDDEvent
    134.         in al,dx
    135.         and al,80h
    136.         retn
    137. WaitForHDDDRQ:  call WaitForHDDEvent
    138.         in al,dx
    139.         and al,08h
    140.         xor al,08h
    141.         retn
    142. ;----------------------------------------------------------------------------¬
    143. ;¦ InitHDD: Находит адрес ввода вывода IDE устройства.                 ¦
    144. ;L----------------------------------------------------------------------------
    145. InitHDD:    mov ebp,esp
    146.         mov esi,(80000000h OR 1000b)-100h
    147. FoundAdapters:  call FoundPCIIDE
    148.         jc EndFoundAdapters
    149.         push esi
    150.         jmp FoundAdapters
    151. EndFoundAdapters:
    152.         cmp esp,ebp
    153.         jz EndInitHDD
    154.         pop esi
    155.         add esi,10h-08h
    156.         call ReadPCI
    157.         jnz IHDDLabel1  ; если = 0, то это Primary Onboard
    158.         mov ax,01F0h   
    159. IHDDLabel1: and al,0F0h
    160.         xchg eax,edx    ; edx - базовый порт.
    161.         call TestIDEDevice
    162.         jz NextChanel
    163.         sub dl,6
    164.        
    165. NextChanel: add esi,8h  ; 18h вторая шина
    166.         call ReadPCI
    167.         jnz IHDDLabel3  ; если = 0, то это Secondary Onboard
    168.         mov ax,0170h   
    169. IHDDLabel3: and al,0F0h
    170.         xchg eax,edx
    171.         call TestIDEDevice
    172.         jz HDDWLabel3
    173.         sub dl,6
    174. HDDWLabel3: xor edx,edx
    175.         jmp EndFoundAdapters
    176.  
    177. EndInitHDD: retn
     
  6. kostec

    kostec New Member

    Публикаций:
    0
    Регистрация:
    1 ноя 2006
    Сообщения:
    3
    PROFi
    спасибо большое. А где можно достать список комманд FDD?
    Booster, n0name
    no bios, int 13h я и так знаю.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    kostec
    82077AA_FloppyControllerDatasheet.pdf
    82078_FloppyController.pdf
    i8272.txt
     
  8. kostec

    kostec New Member

    Публикаций:
    0
    Регистрация:
    1 ноя 2006
    Сообщения:
    3
    Огромное всем спасибо! Сам я, конечно ничего не написал, но зато скатал код из исходников BOS'а и разобрался как это всё работает.
     
  9. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    А как с SATA быть?