Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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