Subversion Repositories Kolibri OS

Rev

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

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