Subversion Repositories Kolibri OS

Rev

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

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