Subversion Repositories Kolibri OS

Rev

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