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.