Subversion Repositories Kolibri OS

Rev

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

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