Subversion Repositories Kolibri OS

Rev

Rev 1505 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 3519 $
  9.  
  10.  
  11. ;******************************************************
  12. ; ïîèñê ïðèâîäîâ HDD è CD
  13. ; àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
  14. ; àäàïòàöèÿ è äîðàáîòêà Mario79
  15. ;******************************************************
  16.  
  17. ;****************************************************
  18. ;*                 ÏÎÈÑÊ HDD è CD                   *
  19. ;****************************************************
  20. FindHDD:
  21.         mov     [ChannelNumber],1
  22.         mov     [DiskNumber],0
  23.         call    FindHDD_3
  24.         mov     [DiskNumber],1
  25.         call    FindHDD_3
  26.         inc     [ChannelNumber]
  27.         mov     [DiskNumber],0
  28.         call    FindHDD_3
  29.         mov     [DiskNumber],1
  30.         call    FindHDD_1
  31.  
  32.         jmp     EndFindHDD
  33.  
  34. FindHDD_1:
  35.         call    ReadHDD_ID
  36.         cmp     [DevErrorCode],0
  37.         jne     FindHDD_2
  38.         cmp     [Sector512+6],word 16
  39.         ja      FindHDD_2
  40.         cmp     [Sector512+12],word 255
  41.         ja      FindHDD_2
  42.         inc     byte [DRIVE_DATA+1]
  43.         jmp     FindHDD_2_2
  44.    FindHDD_2:
  45.         call    DeviceReset
  46.         cmp     [DevErrorCode],0
  47.         jne     FindHDD_2_2
  48. ;        call    ReadCD_ID
  49. ;        cmp     [DevErrorCode],0
  50. ;        jne      FindHDD_2_2
  51.         inc     byte [DRIVE_DATA+1]
  52.         inc     byte [DRIVE_DATA+1]
  53.    FindHDD_2_2:
  54.         ret
  55.  
  56. FindHDD_3:
  57.         call    FindHDD_1
  58.         shl     byte [DRIVE_DATA+1],2
  59.         ret
  60.  
  61.  
  62. ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà â ðåæèìå LBA
  63. uglobal
  64. SectorAddress   DD ?
  65. endg
  66. ;*************************************************
  67. ;*     ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÆÅÑÒÊÎÃÎ ÄÈÑÊÀ      *
  68. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  69. ;* ïåðåìåííûå:                                   *
  70. ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);       *
  71. ;* DiskNumber - íîìåð äèñêà íà êàíàëå (0 èëè 1). *
  72. ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ     *
  73. ;* â ìàññèâ Sector512.                           *
  74. ;*************************************************
  75. ReadHDD_ID:
  76. ; Çàäàòü ðåæèì CHS
  77.         mov     [ATAAddressMode],0
  78. ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà
  79.         mov     [ATAFeatures],0
  80.         mov     [ATAHead],0
  81.         mov     [ATACommand],0ECh
  82.         call    SendCommandToHDD
  83.         cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
  84.         jne     @@End  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
  85.         mov     DX,[ATABasePortAddr]
  86.         add     DX,7     ;àäðåñ ðåãèñòðà ñîñòîÿíè
  87.         mov  ecx,0xffff
  88. @@WaitCompleet:
  89.         ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
  90.         dec  ecx
  91. ;        cmp  ecx,0
  92.         jz     @@Error1   ;îøèáêà òàéì-àóòà
  93.         ; Ïðîâåðèòü ãîòîâíîñòü
  94.         in      AL,DX
  95.         test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
  96.         jnz     @@WaitCompleet
  97.         test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
  98.         jnz     @@Error6
  99.         test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
  100.         jz      @@WaitCompleet
  101. ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
  102.         mov     EDI,Sector512  ;offset Sector512
  103.         mov     DX,[ATABasePortAddr] ;ðåãèñòð äàííûõ
  104.         mov     CX,256   ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
  105.         rep     insw     ;ïðèíÿòü áëîê äàííûõ
  106.         ret
  107. ; Çàïèñàòü êîä îøèáêè
  108. @@Error1:
  109.         mov     [DevErrorCode],1
  110.         ret
  111. @@Error6:
  112.         mov     [DevErrorCode],6
  113. @@End:  ret
  114.  
  115.  
  116. iglobal
  117. ; Ñòàíäàðòíûå áàçîâûå àäðåñà êàíàëîâ 1 è 2
  118. StandardATABases DW 1F0h, 170h
  119. endg
  120. uglobal
  121. ; Íîìåð êàíàëà
  122. ChannelNumber   DW ?
  123. ; Íîìåð äèñêà
  124. DiskNumber      DB ?
  125. ; Áàçîâûé àäðåñ ãðóïïû ïîðòîâ êîíòðîëëåðà ATA
  126. ATABasePortAddr DW ?
  127. ; Ïàðàìåòðû ATA-êîìàíäû
  128. ATAFeatures     DB ? ;îñîáåííîñòè
  129. ATASectorCount  DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ
  130. ATASectorNumber DB ? ;íîìåð íà÷àëüíîãî ñåêòîðà
  131. ATACylinder     DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà
  132. ATAHead         DB ? ;íîìåð íà÷àëüíîé ãîëîâêè
  133. ATAAddressMode  DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA)
  134. ATACommand      DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ
  135. ; Êîä îøèáêè (0 - íåò îøèáîê, 1 - ïðåâûøåí äîïóñòèìûé
  136. ; èíòåðâàë îæèäàíèÿ, 2 - íåâåðíûé êîä ðåæèìà àäðåñàöèè,
  137. ; 3 - íåâåðíûé íîìåð êàíàëà, 4 - íåâåðíûé íîìåð äèñêà,
  138. ; 5 - íåâåðíûé íîìåð ãîëîâêè, 6 - îøèáêà ïðè âûïîëíåíèè
  139. ; êîìàíäû)
  140. DevErrorCode dd ?
  141. endg
  142. ;****************************************************
  143. ;*          ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ         *
  144. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå    *
  145. ;* ïåðåìåííûå:                                      *
  146. ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);          *
  147. ;* DiskNumber - íîìåð äèñêà (0 èëè 1);              *
  148. ;* ATAFeatures - "îñîáåííîñòè";                     *
  149. ;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ;            *
  150. ;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà;      *
  151. ;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà;         *
  152. ;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè;               *
  153. ;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); *
  154. ;* ATACommand - êîä êîìàíäû.                        *
  155. ;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè:              *
  156. ;* â ATABasePortAddr - áàçîâûé àäðåñ HDD;           *
  157. ;* â DevErrorCode - íîëü.                           *
  158. ;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò    *
  159. ;* âîçâðàùåí êîä îøèáêè.                            *
  160. ;****************************************************
  161. SendCommandToHDD:
  162. ; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà
  163.         cmp     [ATAAddressMode],1
  164.         ja      @@Err2
  165. ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
  166.         mov     BX,[ChannelNumber]
  167.         cmp     BX,1
  168.         jb      @@Err3
  169.         cmp     BX,2
  170.         ja      @@Err3
  171. ; Óñòàíîâèòü áàçîâûé àäðåñ
  172.         dec     BX
  173.         shl     BX,1
  174.         movzx   ebx,bx
  175.         mov     AX,[ebx+StandardATABases]
  176.         mov     [ATABasePortAddr],AX
  177. ; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû
  178.         ; Âûáðàòü íóæíûé äèñê
  179.         mov     DX,[ATABasePortAddr]
  180.         add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
  181.         mov     AL,[DiskNumber]
  182.         cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
  183.         ja      @@Err4
  184.         shl     AL,4
  185.         or      AL,10100000b
  186.         out     DX,AL
  187.         ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ
  188.         inc     DX
  189.         mov  ecx,0xfff
  190. @@WaitHDReady:
  191.         ; Ïðîâåðèòü âðåìÿ îæèäàíè
  192.         dec  ecx
  193.         jz     @@Err1
  194.         ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
  195.         in      AL,DX
  196.         ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
  197.         test    AL,80h
  198.         jnz     @@WaitHDReady
  199.         ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ
  200.         test    AL,08h
  201.         jnz     @@WaitHDReady
  202. ; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà
  203.         cli
  204.         mov     DX,[ATABasePortAddr]
  205.         inc     DX      ;ðåãèñòð "îñîáåííîñòåé"
  206.         mov     AL,[ATAFeatures]
  207.         out     DX,AL
  208.         inc     DX      ;ñ÷åò÷èê ñåêòîðîâ
  209.         mov     AL,[ATASectorCount]
  210.         out     DX,AL
  211.         inc     DX      ;ðåãèñòð íîìåðà ñåêòîðà
  212.         mov     AL,[ATASectorNumber]
  213.         out     DX,AL
  214.         inc     DX      ;íîìåð öèëèíäðà (ìëàäøèé áàéò)
  215.         mov     AX,[ATACylinder]
  216.         out     DX,AL
  217.         inc     DX      ;íîìåð öèëèíäðà (ñòàðøèé áàéò)
  218.         mov     AL,AH
  219.         out     DX,AL
  220.         inc     DX      ;íîìåð ãîëîâêè/íîìåð äèñêà
  221.         mov     AL,[DiskNumber]
  222.         shl     AL,4
  223.         cmp     [ATAHead],0Fh ;ïðîâåðèòü íîìåð ãîëîâêè
  224.         ja      @@Err5
  225.         or      AL,[ATAHead]
  226.         or      AL,10100000b
  227.         mov     AH,[ATAAddressMode]
  228.         shl     AH,6
  229.         or      AL,AH
  230.         out     DX,AL
  231. ; Ïîñëàòü êîìàíäó
  232.         mov     AL,[ATACommand]
  233.         inc     DX      ;ðåãèñòð êîìàíä
  234.         out     DX,AL
  235.         sti
  236. ; Ñáðîñèòü ïðèçíàê îøèáêè
  237.         mov     [DevErrorCode],0
  238.         ret
  239. ; Çàïèñàòü êîä îøèáêè
  240. @@Err1: mov     [DevErrorCode],1
  241.         ret
  242. @@Err2: mov     [DevErrorCode],2
  243.         ret
  244. @@Err3: mov     [DevErrorCode],3
  245.         ret
  246. @@Err4: mov     [DevErrorCode],4
  247.         ret
  248. @@Err5: mov     [DevErrorCode],5
  249. ; Çàâåðøåíèå ðàáîòû ïðîãðàììû
  250.         ret
  251.  
  252. if 0
  253. ;*************************************************
  254. ;*     ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÓÑÒÐÎÉÑÒÂÀ ATAPI    *
  255. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  256. ;* ïåðìåííûå:                                    *
  257. ;* ChannelNumber - íîìåð êàíàëà;                 *
  258. ;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
  259. ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ     *
  260. ;* â ìàññèâ Sector512.                           *
  261. ;*************************************************
  262. ReadCD_ID:
  263. ; Çàäàòü ðåæèì CHS
  264.         mov     [ATAAddressMode],0
  265. ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà
  266.         mov     [ATAFeatures],0
  267.         mov     [ATASectorCount],0
  268.         mov     [ATASectorNumber],0
  269.         mov     [ATACylinder],0
  270.         mov     [ATAHead],0
  271.         mov     [ATACommand],0A1h
  272.         call    SendCommandToHDD
  273.         cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
  274.         jne     @@End_1  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
  275. ; Îæèäàòü ãîòîâíîñòü äàííûõ HDD
  276.         mov     DX,[ATABasePortAddr]
  277.         add     DX,7   ;ïîðò 1õ7h
  278.         mov     ecx,0xffff
  279. @@WaitCompleet_1:
  280.         ; Ïðîâåðèòü âðåì
  281.         dec     ecx
  282.         jz     @@Error1_1  ;îøèáêà òàéì-àóòà
  283.         ; Ïðîâåðèòü ãîòîâíîñòü
  284.         in      AL,DX
  285.         test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
  286.         jnz     @@WaitCompleet_1
  287.         test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
  288.         jnz     @@Error6_1
  289.         test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
  290.         jz      @@WaitCompleet_1
  291. ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
  292.         mov     EDI,Sector512  ;offset Sector512
  293.         mov     DX,[ATABasePortAddr] ;ïîðò 1x0h
  294.         mov     CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
  295.         rep     insw
  296.         ret
  297. ; Çàïèñàòü êîä îøèáêè
  298. @@Error1_1:
  299.         mov     [DevErrorCode],1
  300.         ret
  301. @@Error6_1:
  302.         mov     [DevErrorCode],6
  303. @@End_1:
  304.         ret
  305.  
  306. end if
  307.  
  308. ;*************************************************
  309. ;*                ÑÁÐÎÑ ÓÑÒÐÎÉÑÒÂÀ               *
  310. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  311. ;* ïåðåìåííûå:                                   *
  312. ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);       *
  313. ;* DiskNumber - íîìåð äèñêà (0 èëè 1).           *
  314. ;*************************************************
  315. DeviceReset:
  316. ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
  317.         mov     BX,[ChannelNumber]
  318.         cmp     BX,1
  319.         jb      @@Err3_2
  320.         cmp     BX,2
  321.         ja      @@Err3_2
  322. ; Óñòàíîâèòü áàçîâûé àäðåñ
  323.         dec     BX
  324.         shl     BX,1
  325.         movzx   ebx,bx
  326.         mov     DX,[ebx+StandardATABases]
  327.         mov     [ATABasePortAddr],DX
  328. ; Âûáðàòü íóæíûé äèñê
  329.         add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
  330.         mov     AL,[DiskNumber]
  331.         cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
  332.         ja      @@Err4_2
  333.         shl     AL,4
  334.         or      AL,10100000b
  335.         out     DX,AL
  336. ; Ïîñëàòü êîìàíäó "Ñáðîñ"
  337.         mov     AL,08h
  338.         inc     DX      ;ðåãèñòð êîìàíä
  339.         out     DX,AL
  340.         mov     ecx,0x80000
  341. @@WaitHDReady_1:
  342.         ; Ïðîâåðèòü âðåìÿ îæèäàíè
  343.         dec     ecx
  344. ;        cmp     ecx,0
  345.         je      @@Err1_2 ;îøèáêà òàéì-àóòà
  346.         ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè
  347.         in      AL,DX
  348.         ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
  349.         test    AL,80h
  350.         jnz     @@WaitHDReady_1
  351. ; Ñáðîñèòü ïðèçíàê îøèáêè
  352.         mov     [DevErrorCode],0
  353.         ret
  354. ; Îáðàáîòêà îøèáîê
  355. @@Err1_2: mov     [DevErrorCode],1
  356.         ret
  357. @@Err3_2: mov     [DevErrorCode],3
  358.         ret
  359. @@Err4_2: mov     [DevErrorCode],4
  360. ; Çàïèñàòü êîä îøèáêè
  361.         ret
  362.  
  363. EndFindHDD:
  364.  
  365.