Subversion Repositories Kolibri OS

Rev

Rev 425 | Rev 538 | Go to most recent revision | Blame | Compare with Previous | 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. ;  ═хяюёЁхфёЄтхээр  ЁрсюЄр ё єёЄЁющёЄтюь ╤D (ATAPI)
  11. ;**********************************************************
  12. ; └тЄюЁ шёїюфэюую ЄхъёЄр  ╩єыръют ┬ырфшьшЁ ├хээрф№хтшў.
  13. ; └фряЄрЎш  ш фюЁрсюЄър Mario79
  14.  
  15. ;        ╧ЁюЎхфєЁр фы  яюыэюую ёўшЄ√трэш  тёхї
  16. ;           фрээ√ї шч ёхъЄюЁр ъюьяръЄ-фшёър
  17. ; └тЄюЁ ЄхъёЄр яЁюуЁрьь√ ╩єыръют ┬ырфшьшЁ ├хээрф№хтшў.
  18.  
  19.  
  20. ; ╠ръёшьры№эюх ъюышўхёЄтю яютЄюЁхэшщ юяхЁрЎшш ўЄхэш 
  21. MaxRetr equ 3
  22. ; ╧Ёхфхы№эюх тЁхь  юцшфрэш  уюЄютэюёЄш ъ яЁшхьє ъюьрэф√
  23. ; (т Єшърї)
  24. BSYWaitTime equ 1000  ;2
  25.  
  26. ;*************************************************
  27. ;*      ╧╬╦═╬┼ ╫╥┼═╚┼ ╤┼╩╥╬╨└ ╩╬╠╧└╩╥-─╚╤╩└      *
  28. ;* ╤ўшЄ√тр■Єё  фрээ√х яюы№чютрЄхы , шэЇюЁьрЎш    *
  29. ;* ёєсърэрыр ш ъюэЄЁюы№эр  шэЇюЁьрЎш             *
  30. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  31. ;* яхЁьхээ√х:                                    *
  32. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  33. ;* DiskNumber - эюьхЁ фшёър эр ърэрых;           *
  34. ;* CDSectorAddress - рфЁхё ёўшЄ√трхьюую ёхъЄюЁр. *
  35. ;* ─рээ√х ёўшЄ√трхЄё  т ьрёёшт CDDataBuf.        *
  36. ;*************************************************
  37. ReadCD:
  38.         pusha
  39. ; ╟рфрЄ№ ЁрчьхЁ ёхъЄюЁр
  40.         mov     [CDBlockSize],2048 ;2352
  41. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  42.         call  clear_packet_buffer
  43. ; ╤ЇюЁьшЁютрЄ№ яръхЄэє■ ъюьрэфє фы  ёўшЄ√трэш 
  44. ; ёхъЄюЁр фрээ√ї
  45.         ; ╟рфрЄ№ ъюф ъюьрэф√ Read CD
  46.         mov     [PacketCommand],byte 0x28  ;0xBE
  47.         ; ╟рфрЄ№ рфЁхё ёхъЄюЁр
  48.         mov     AX,word [CDSectorAddress+2]
  49.         xchg    AL,AH
  50.         mov     word [PacketCommand+2],AX
  51.         mov     AX,word [CDSectorAddress]
  52.         xchg    AL,AH
  53.         mov     word [PacketCommand+4],AX
  54. ;        mov   eax,[CDSectorAddress]
  55. ;        mov   [PacketCommand+2],eax
  56.         ; ╟рфрЄ№ ъюышўхёЄтю ёўшЄ√трхь√ї ёхъЄюЁют
  57.         mov     [PacketCommand+8],byte 1
  58.         ; ╟рфрЄ№ ёўшЄ√трэшх фрээ√ї т яюыэюь юс·хьх
  59. ;        mov     [PacketCommand+9],byte 0xF8
  60. ; ╧юфрЄ№ ъюьрэфє
  61.         call    SendPacketDatCommand
  62. ;        call test_mario79
  63.         popa
  64.         ret
  65.  
  66. ;********************************************
  67. ;*        ╫╥┼═╚┼ ╤┼╩╥╬╨└ ╤ ╧╬┬╥╬╨└╠╚        *
  68. ;* ╠эюуюъЁрЄэюх яютЄюЁхэшх ўЄхэш  яЁш ёсю ї *
  69. ;********************************************
  70. ReadCDWRetr:
  71.         pusha
  72. ; ╓шъы, яюър ъюьрэфр эх т√яюыэхэр єёях°эю шыш эх
  73. ; шёўхЁярэю ъюышўхёЄтю яюя√Єюъ
  74.         mov     ECX,MaxRetr
  75. @@NextRetr:
  76. ; ╧юфрЄ№ ъюьрэфє
  77.         call    ReadCD
  78.         cmp     [DevErrorCode],0
  79.         je      @@End_4
  80. ; ╟рфхЁцър эр 2,5 ёхъєэф√
  81.         mov     EAX,[timer_ticks]
  82.         add     EAX,250 ;50
  83. @@Wait:
  84.         call    change_task
  85.         cmp     EAX,[timer_ticks]
  86.         ja      @@Wait
  87.         loop    @@NextRetr
  88. ;        call test_mario79
  89. ; ╤ююс∙хэшх юс ю°шсъх
  90. ;        mov     SI,offset ErrS
  91. ;        call    FatalError
  92. @@End_4:
  93.         popa
  94.         ret
  95.  
  96.  
  97. ;   ╙эштхЁёры№э√х яЁюЎхфєЁ√, юсхёяхўштр■∙шх т√яюыэхэшх
  98. ;             яръхЄэ√ї ъюьрэф т Ёхцшьх PIO
  99. ;
  100. ; └тЄюЁ ЄхъёЄр яЁюуЁрьь√ ╩єыръют ┬ырфшьшЁ ├хээрф№хтшў.
  101.  
  102. ; ╠ръёшьры№эю фюяєёЄшьюх тЁхь  юцшфрэш  ЁхръЎшш
  103. ; єёЄЁющёЄтр эр яръхЄэє■ ъюьрэфє (т Єшърї)
  104. MaxCDWaitTime equ 1000 ;200 ;10 ёхъєэф
  105.  
  106. ; ╬сырёЄ№ ярь Єш фы  ЇюЁьшЁютрэш  яръхЄэющ ъюьрэф√
  107. PacketCommand:   rb 12  ;DB 12 DUP (?)
  108. ; ╬сырёЄ№ ярь Єш фы  яЁшхьр фрээ√ї юЄ фшёъютюфр
  109. ;CDDataBuf       DB 4096 DUP (0)
  110. ; ╨рчьхЁ яЁшэшьрхьюую сыюър фрээ√ї т срщЄрї
  111. CDBlockSize     DW ?
  112. ; └фЁхё ёўшЄ√трхьюую ёхъЄюЁр фрээ√ї
  113. CDSectorAddress: DD ?
  114. ; ┬Ёхь  эрўрыр юўхЁхфэющ юяхЁрЎшш ё фшёъюь
  115. TickCounter_1 DD 0
  116. ; ┬Ёхь  эрўрыр юцшфрэш  уюЄютэюёЄш єёЄЁющёЄтр
  117. WURStartTime DD 0
  118. ; єърчрЄхы№ сєЇхЁр фы  ёўшЄ√трэш 
  119. CDDataBuf_pointer dd 0
  120.  
  121. ;****************************************************
  122. ;*    ╧╬╤╦└╥▄ ╙╤╥╨╬╔╤╥┬╙ ATAPI ╧└╩┼╥═╙▐ ╩╬╠└═─╙,    *
  123. ;* ╧╨┼─╙╤╠└╥╨╚┬└▐┘╙▐ ╧┼╨┼─└╫╙ ╬─═╬├╬ ╤┼╩╥╬╨└ ─└══█╒ *
  124. ;*     ╨└╟╠┼╨╬╠ 2048 ┴└╔╥ ╬╥ ╙╤╥╨╬╔╤╥┬└ ╩ ╒╬╤╥╙     *
  125. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х    *
  126. ;* яхЁьхээ√х:                                       *
  127. ;* ChannelNumber - эюьхЁ ърэрыр;                    *
  128. ;* DiskNumber - эюьхЁ фшёър эр ърэрых;              *
  129. ;* PacketCommand - 12-срщЄэ√щ ъюьрэфэ√щ яръхЄ;      *
  130. ;* CDBlockSize - ЁрчьхЁ яЁшэшьрхьюую сыюър фрээ√ї.  *
  131. ;****************************************************
  132. SendPacketDatCommand:
  133.         pushad
  134. ; ╟рфрЄ№ Ёхцшь CHS
  135.         mov     [ATAAddressMode],0
  136. ; ╧юёырЄ№ ATA-ъюьрэфє яхЁхфрўш яръхЄэющ ъюьрэф√
  137.         mov     [ATAFeatures],0
  138.         mov     [ATASectorCount],0
  139.         mov     [ATASectorNumber],0
  140.         ; ╟руЁєчшЄ№ ЁрчьхЁ яхЁхфртрхьюую сыюър
  141.         mov     AX,[CDBlockSize]
  142.         mov     [ATACylinder],AX
  143.         mov     [ATAHead],0
  144.         mov     [ATACommand],0A0h
  145.         call    SendCommandToHDD_1
  146. ;        call test_mario79
  147.         cmp     [DevErrorCode],0 ;яЁютхЁшЄ№ ъюф ю°шсъш
  148.         jne     @@End_8    ;чръюэўшЄ№, ёюїЁрэшт ъюф ю°шсъш
  149.  
  150. ; ╬цшфрэшх уюЄютэюёЄш фшёъютюфр ъ яЁшхьє
  151. ; яръхЄэющ ъюьрэф√
  152.         mov     DX,[ATABasePortAddr]
  153.         add     DX,7     ;яюЁЄ 1ї7h
  154. @@WaitDevice0:
  155.         call    change_task
  156.         ; ╧ЁютхЁшЄ№ тЁхь  т√яюыэхэш  ъюьрэф√
  157.         mov     EAX,[timer_ticks]
  158.         sub     EAX,[TickCounter_1]
  159.         cmp     EAX,BSYWaitTime
  160.         ja      @@Err1_1   ;ю°шсър Єрщь-рєЄр
  161.         ; ╧ЁютхЁшЄ№ уюЄютэюёЄ№
  162.         in      AL,DX
  163.         test    AL,80h   ;ёюёЄю эшх ёшуэрыр BSY
  164.         jnz     @@WaitDevice0
  165.         test    AL,1     ;ёюёЄю эшх ёшуэрыр ERR
  166.         jnz     @@Err6
  167.         test    AL,08h   ;ёюёЄю эшх ёшуэрыр DRQ
  168.         jz      @@WaitDevice0
  169. ; ╧юёырЄ№ яръхЄэє■ ъюьрэфє
  170.         cli
  171.         mov     DX,[ATABasePortAddr]
  172.         mov     AX,[PacketCommand]
  173.         out     DX,AX
  174.         mov     AX,[PacketCommand+2]
  175.         out     DX,AX
  176.         mov     AX,[PacketCommand+4]
  177.         out     DX,AX
  178.         mov     AX,[PacketCommand+6]
  179.         out     DX,AX
  180.         mov     AX,[PacketCommand+8]
  181.         out     DX,AX
  182.         mov     AX,[PacketCommand+10]
  183.         out     DX,AX
  184.         sti
  185. ; ╬цшфрэшх уюЄютэюёЄш фрээ√ї
  186.         mov     DX,[ATABasePortAddr]
  187.         add     DX,7   ;яюЁЄ 1ї7h
  188. @@WaitDevice1:
  189.         call    change_task
  190.         ; ╧ЁютхЁшЄ№ тЁхь  т√яюыэхэш  ъюьрэф√
  191.         mov     EAX,[timer_ticks]
  192.         sub     EAX,[TickCounter_1]
  193.         cmp     EAX,MaxCDWaitTime
  194.         ja      @@Err1_1   ;ю°шсър Єрщь-рєЄр
  195.         ; ╧ЁютхЁшЄ№ уюЄютэюёЄ№
  196.         in      AL,DX
  197.         test    AL,80h   ;ёюёЄю эшх ёшуэрыр BSY
  198.         jnz     @@WaitDevice1
  199.         test    AL,1     ;ёюёЄю эшх ёшуэрыр ERR
  200.         jnz     @@Err6_temp
  201.         test    AL,08h   ;ёюёЄю эшх ёшуэрыр DRQ
  202.         jz      @@WaitDevice1
  203.         cli
  204. ; ╧Ёшэ Є№ сыюъ фрээ√ї юЄ ъюэЄЁюыыхЁр
  205.         mov     EDI,[CDDataBuf_pointer] ;0x7000  ;CDDataBuf
  206.         ; ╟руЁєчшЄ№ рфЁхё ЁхушёЄЁр фрээ√ї ъюэЄЁюыыхЁр
  207.         mov     DX,[ATABasePortAddr] ;яюЁЄ 1x0h
  208.         ; ╟руЁєчшЄ№ т ёўхЄўшъ ЁрчьхЁ сыюър т срщЄрї
  209.         mov     CX,[CDBlockSize]
  210.         ; ┬√ўшёышЄ№ ЁрчьхЁ сыюър т 16-ЁрчЁ фэ√ї ёыютрї
  211.         shr     CX,1 ;ЁрчфхышЄ№ ЁрчьхЁ сыюър эр 2
  212.         ; ╧Ёшэ Є№ сыюъ фрээ√ї
  213.         cld
  214.         rep     insw
  215.         sti
  216.         ; ╙ёях°эюх чртхЁ°хэшх яЁшхьр фрээ√ї
  217.         jmp @@End_8
  218.  
  219. ; ╟ряшёрЄ№ ъюф ю°шсъш
  220. @@Err1_1:
  221.         mov     [DevErrorCode],1
  222.         jmp @@End_8
  223. @@Err6_temp:
  224.         mov     [DevErrorCode],7
  225.         jmp @@End_8
  226. @@Err6:
  227.         mov     [DevErrorCode],6
  228.  
  229. @@End_8:
  230.         popad
  231.         ret
  232.  
  233.  
  234.  
  235. ;***********************************************
  236. ;*  ╧╬╤╦└╥▄ ╙╤╥╨╬╔╤╥┬╙ ATAPI ╧└╩┼╥═╙▐ ╩╬╠└═─╙, *
  237. ;*     ═┼ ╧╨┼─╙╤╠└╥╨╚┬└▐┘╙▐ ╧┼╨┼─└╫╚ ─└══█╒    *
  238. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч          *
  239. ;* уыюсры№э√х яхЁьхээ√х:                       *
  240. ;* ChannelNumber - эюьхЁ ърэрыр;               *
  241. ;* DiskNumber - эюьхЁ фшёър эр ърэрых;         *
  242. ;* PacketCommand - 12-срщЄэ√щ ъюьрэфэ√щ яръхЄ. *
  243. ;***********************************************
  244. SendPacketNoDatCommand:
  245.         pushad
  246. ; ╟рфрЄ№ Ёхцшь CHS
  247.         mov     [ATAAddressMode],0
  248. ; ╧юёырЄ№ ATA-ъюьрэфє яхЁхфрўш яръхЄэющ ъюьрэф√
  249.         mov     [ATAFeatures],0
  250.         mov     [ATASectorCount],0
  251.         mov     [ATASectorNumber],0
  252.         mov     [ATACylinder],0
  253.         mov     [ATAHead],0
  254.         mov     [ATACommand],0A0h
  255.         call    SendCommandToHDD_1
  256.         cmp     [DevErrorCode],0 ;яЁютхЁшЄ№ ъюф ю°шсъш
  257.         jne     @@End_9  ;чръюэўшЄ№, ёюїЁрэшт ъюф ю°шсъш
  258. ; ╬цшфрэшх уюЄютэюёЄш фшёъютюфр ъ яЁшхьє
  259. ; яръхЄэющ ъюьрэф√
  260.         mov     DX,[ATABasePortAddr]
  261.         add     DX,7   ;яюЁЄ 1ї7h
  262. @@WaitDevice0_1:
  263.         call    change_task
  264.         ; ╧ЁютхЁшЄ№ тЁхь  юцшфрэш 
  265.         mov     EAX,[timer_ticks]
  266.         sub     EAX,[TickCounter_1]
  267.         cmp     EAX,BSYWaitTime
  268.         ja      @@Err1_3   ;ю°шсър Єрщь-рєЄр
  269.         ; ╧ЁютхЁшЄ№ уюЄютэюёЄ№
  270.         in      AL,DX
  271.         test    AL,80h   ;ёюёЄю эшх ёшуэрыр BSY
  272.         jnz     @@WaitDevice0_1
  273.         test    AL,1     ;ёюёЄю эшх ёшуэрыр ERR
  274.         jnz     @@Err6_1
  275.         test    AL,08h   ;ёюёЄю эшх ёшуэрыр DRQ
  276.         jz      @@WaitDevice0_1
  277. ; ╧юёырЄ№ яръхЄэє■ ъюьрэфє
  278. ;        cli
  279.         mov     DX,[ATABasePortAddr]
  280.         mov     AX,word [PacketCommand]
  281.         out     DX,AX
  282.         mov     AX,word [PacketCommand+2]
  283.         out     DX,AX
  284.         mov     AX,word [PacketCommand+4]
  285.         out     DX,AX
  286.         mov     AX,word [PacketCommand+6]
  287.         out     DX,AX
  288.         mov     AX,word [PacketCommand+8]
  289.         out     DX,AX
  290.         mov     AX,word [PacketCommand+10]
  291.         out     DX,AX
  292. ;        sti
  293. ; ╬цшфрэшх яюфЄтхЁцфхэш  яЁшхьр ъюьрэф√
  294.         mov     DX,[ATABasePortAddr]
  295.         add     DX,7   ;яюЁЄ 1ї7h
  296. @@WaitDevice1_1:
  297.         call    change_task
  298.         ; ╧ЁютхЁшЄ№ тЁхь  т√яюыэхэш  ъюьрэф√
  299.         mov     EAX,[timer_ticks]
  300.         sub     EAX,[TickCounter_1]
  301.         cmp     EAX,MaxCDWaitTime
  302.         ja      @@Err1_3   ;ю°шсър Єрщь-рєЄр
  303.         ; ╬цшфрЄ№ юётюсюцфхэш  єёЄЁющёЄтр
  304.         in      AL,DX
  305.         test    AL,80h   ;ёюёЄю эшх ёшуэрыр BSY
  306.         jnz     @@WaitDevice1_1
  307.         test    AL,1     ;ёюёЄю эшх ёшуэрыр ERR
  308.         jnz     @@Err6_1
  309.         test    AL,40h   ;ёюёЄю эшх ёшуэрыр DRDY
  310.         jz      @@WaitDevice1_1
  311.         jmp @@End_9
  312.  
  313. ; ╟ряшёрЄ№ ъюф ю°шсъш
  314. @@Err1_3:
  315.         mov     [DevErrorCode],1
  316.         jmp @@End_9
  317. @@Err6_1:
  318.         mov     [DevErrorCode],6
  319. @@End_9:
  320.         popad
  321.         ret
  322.  
  323. ;****************************************************
  324. ;*          ╧╬╤╦└╥▄ ╩╬╠└═─╙ ╟└─└══╬╠╙ ─╚╤╩╙         *
  325. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х    *
  326. ;* яхЁхьхээ√х:                                      *
  327. ;* ChannelNumber - эюьхЁ ърэрыр (1 шыш 2);          *
  328. ;* DiskNumber - эюьхЁ фшёър (0 шыш 1);              *
  329. ;* ATAFeatures - "юёюсхээюёЄш";                     *
  330. ;* ATASectorCount - ъюышўхёЄтю ёхъЄюЁют;            *
  331. ;* ATASectorNumber - эюьхЁ эрўры№эюую ёхъЄюЁр;      *
  332. ;* ATACylinder - эюьхЁ эрўры№эюую ЎшышэфЁр;         *
  333. ;* ATAHead - эюьхЁ эрўры№эющ уюыютъш;               *
  334. ;* ATAAddressMode - Ёхцшь рфЁхёрЎшш (0-CHS, 1-LBA); *
  335. ;* ATACommand - ъюф ъюьрэф√.                        *
  336. ;* ╧юёых єёях°эюую т√яюыэхэш  ЇєэъЎшш:              *
  337. ;* т ATABasePortAddr - срчют√щ рфЁхё HDD;           *
  338. ;* т DevErrorCode - эюы№.                           *
  339. ;* ╧Ёш тючэшъэютхэшш ю°шсъш т DevErrorCode сєфхЄ    *
  340. ;* тючтЁр∙хэ ъюф ю°шсъш.                            *
  341. ;****************************************************
  342. SendCommandToHDD_1:
  343.         pushad
  344. ; ╧ЁютхЁшЄ№ чэрўхэшх ъюфр Ёхцшьр
  345.         cmp     [ATAAddressMode],1
  346.         ja      @@Err2_4
  347. ; ╧ЁютхЁшЄ№ ъюЁЁхъЄэюёЄ№ эюьхЁр ърэрыр
  348.         mov     BX,[ChannelNumber]
  349.         cmp     BX,1
  350.         jb      @@Err3_4
  351.         cmp     BX,2
  352.         ja      @@Err3_4
  353. ; ╙ёЄрэютшЄ№ срчют√щ рфЁхё
  354.         dec     BX
  355.         shl     BX,1
  356.         movzx   ebx,bx
  357.         mov     AX,[ebx+StandardATABases]
  358.         mov     [ATABasePortAddr],AX
  359. ; ╬цшфрэшх уюЄютэюёЄш HDD ъ яЁшхьє ъюьрэф√
  360.         ; ┬√сЁрЄ№ эєцэ√щ фшёъ
  361.         mov     DX,[ATABasePortAddr]
  362.         add     DX,6    ;рфЁхё ЁхушёЄЁр уюыютюъ
  363.         mov     AL,[DiskNumber]
  364.         cmp     AL,1    ;яЁютхЁшЄ№ эюьхЁр фшёър
  365.         ja      @@Err4_4
  366.         shl     AL,4
  367.         or      AL,10100000b
  368.         out     DX,AL
  369.         ; ╬цшфрЄ№, яюър фшёъ эх сєфхЄ уюЄют
  370.         inc     DX
  371. ;        mov  ecx,0xfff
  372.         mov     eax,[timer_ticks]
  373.         mov     [TickCounter_1],eax
  374. @@WaitHDReady_2:
  375.         call    change_task
  376.         ; ╧ЁютхЁшЄ№ тЁхь  юцшфрэш 
  377. ;        dec  ecx
  378. ;        cmp  ecx,0
  379. ;        je     @@Err1
  380.         mov     eax,[timer_ticks]
  381.         sub     eax,[TickCounter_1]
  382.         cmp     eax,BSYWaitTime ;300    ;юцшфрЄ№ 3 ёхъ.        
  383.         ja      @@Err1_4   ;ю°шсър Єрщь-рєЄр
  384.         ; ╧ЁюўшЄрЄ№ ЁхушёЄЁ ёюёЄю эш 
  385.         in      AL,DX
  386.         ; ╧ЁютхЁшЄ№ ёюёЄю эшх ёшуэрыр BSY
  387.         test    AL,80h
  388.         jnz     @@WaitHDReady_2
  389.         ; ╧ЁютхЁшЄ№ ёюёЄю эшх ёшуэрыр DRQ
  390.         test    AL,08h
  391.         jnz     @@WaitHDReady_2
  392. ; ╟руЁєчшЄ№ ъюьрэфє т ЁхушёЄЁ√ ъюэЄЁюыыхЁр
  393.         cli
  394.         mov     DX,[ATABasePortAddr]
  395.         inc     DX      ;ЁхушёЄЁ "юёюсхээюёЄхщ"
  396.         mov     AL,[ATAFeatures]
  397.         out     DX,AL
  398.         inc     DX      ;ёўхЄўшъ ёхъЄюЁют
  399.         mov     AL,[ATASectorCount]
  400.         out     DX,AL
  401.         inc     DX      ;ЁхушёЄЁ эюьхЁр ёхъЄюЁр
  402.         mov     AL,[ATASectorNumber]
  403.         out     DX,AL
  404.         inc     DX      ;эюьхЁ ЎшышэфЁр (ьырф°шщ срщЄ)
  405.         mov     AX,[ATACylinder]
  406.         out     DX,AL
  407.         inc     DX      ;эюьхЁ ЎшышэфЁр (ёЄрЁ°шщ срщЄ)
  408.         mov     AL,AH
  409.         out     DX,AL
  410.         inc     DX      ;эюьхЁ уюыютъш/эюьхЁ фшёър
  411.         mov     AL,[DiskNumber]
  412.         shl     AL,4
  413.         cmp     [ATAHead],0Fh ;яЁютхЁшЄ№ эюьхЁ уюыютъш
  414.         ja      @@Err5_4
  415.         or      AL,[ATAHead]
  416.         or      AL,10100000b
  417.         mov     AH,[ATAAddressMode]
  418.         shl     AH,6
  419.         or      AL,AH
  420.         out     DX,AL
  421. ; ╧юёырЄ№ ъюьрэфє
  422.         mov     AL,[ATACommand]
  423.         inc     DX      ;ЁхушёЄЁ ъюьрэф
  424.         out     DX,AL
  425.         sti
  426. ; ╤сЁюёшЄ№ яЁшчэръ ю°шсъш
  427.         mov     [DevErrorCode],0
  428.         jmp @@End_10
  429. ; ╟ряшёрЄ№ ъюф ю°шсъш
  430. @@Err1_4:
  431.         mov     [DevErrorCode],1
  432.         jmp @@End_10
  433. @@Err2_4:
  434.         mov     [DevErrorCode],2
  435.         jmp @@End_10
  436. @@Err3_4:
  437.         mov     [DevErrorCode],3
  438.         jmp @@End_10
  439. @@Err4_4:
  440.         mov     [DevErrorCode],4
  441.         jmp @@End_10
  442. @@Err5_4:
  443.         mov     [DevErrorCode],5
  444. ; ╟ртхЁ°хэшх ЁрсюЄ√ яЁюуЁрьь√
  445. @@End_10:
  446.         sti
  447.         popad
  448.         ret
  449.        
  450. ;*************************************************
  451. ;*    ╬╞╚─└═╚┼ ├╬╥╬┬═╬╤╥╚ ╙╤╥╨╬╔╤╥┬└ ╩ ╨└┴╬╥┼    *
  452. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  453. ;* яхЁьхээ√х:                                    *
  454. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  455. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  456. ;*************************************************
  457. WaitUnitReady:
  458.         pusha
  459. ; ╟ряюьэшЄ№ тЁхь  эрўрыр юяхЁрЎшш
  460.         mov     EAX,[timer_ticks]
  461.         mov     [WURStartTime],EAX
  462. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  463.         call  clear_packet_buffer
  464. ; ╤ЇюЁьшЁютрЄ№ ъюьрэфє TEST UNIT READY
  465.         mov     [PacketCommand],word 00h
  466. ; ╓╚╩╦ ╬╞╚─└═╚▀ ├╬╥╬┬═╬╤╥╚ ╙╤╥╨╬╔╤╥┬└
  467. @@SendCommand:
  468.         ; ╧юфрЄ№ ъюьрэфє яЁютхЁъш уюЄютэюёЄш
  469.         call    SendPacketNoDatCommand
  470.         call    change_task
  471.         ; ╧ЁютхЁшЄ№ ъюф ю°шсъш
  472.         cmp     [DevErrorCode],0
  473.         je      @@End_11
  474.         ; ╧ЁютхЁшЄ№ тЁхь  юцшфрэш  уюЄютэюёЄш
  475.         mov     EAX,[timer_ticks]
  476.         sub     EAX,[WURStartTime]
  477.         cmp     EAX,MaxCDWaitTime
  478.         jb      @@SendCommand
  479.         ; ╬°шсър Єрщь-рєЄр
  480.         mov     [DevErrorCode],1
  481. @@End_11:
  482.         popa
  483.         ret
  484.  
  485.        
  486. ;*************************************************
  487. ;*         ╟└├╨╙╟╚╥▄ ═╬╤╚╥┼╦▄ ┬ ─╚╤╩╬┬╬─         *
  488. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  489. ;* яхЁьхээ√х:                                    *
  490. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  491. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  492. ;*************************************************
  493. LoadMedium:
  494.         pusha
  495. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  496.         call  clear_packet_buffer
  497. ; ╤ЇюЁьшЁютрЄ№ ъюьрэфє START/STOP UNIT
  498.         ; ╟рфрЄ№ ъюф ъюьрэф√
  499.         mov     [PacketCommand],word 1Bh
  500.         ; ╟рфрЄ№ юяхЁрЎш■ чруЁєчъш эюёшЄхы 
  501.         mov     [PacketCommand+4],word 00000011b
  502. ; ╧юфрЄ№ ъюьрэфє
  503.         call    SendPacketNoDatCommand
  504.         popa
  505.         ret
  506.  
  507. ;*************************************************
  508. ;*         ╚╟┬╦┼╫▄ ═╬╤╚╥┼╦▄ ╚╟ ─╚╤╩╬┬╬─└         *
  509. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  510. ;* яхЁьхээ√х:                                    *
  511. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  512. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  513. ;*************************************************
  514. UnloadMedium:
  515.         pusha
  516. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  517.         call  clear_packet_buffer
  518. ; ╤ЇюЁьшЁютрЄ№ ъюьрэфє START/STOP UNIT
  519.         ; ╟рфрЄ№ ъюф ъюьрэф√
  520.         mov     [PacketCommand],word 1Bh
  521.         ; ╟рфрЄ№ юяхЁрЎш■ шчтыхўхэш  эюёшЄхы 
  522.         mov     [PacketCommand+4],word 00000010b
  523. ; ╧юфрЄ№ ъюьрэфє
  524.         call    SendPacketNoDatCommand
  525.         popa
  526.         ret
  527.  
  528. ;*************************************************
  529. ;* ╬╧╨┼─┼╦╚╥▄ ╬┴┘┼┼ ╩╬╦╚╫┼╤╥┬╬ ╤┼╩╥╬╨╬┬ ═└ ─╚╤╩┼ *
  530. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  531. ;* яхЁхьхээ√х:                                   *
  532. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  533. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  534. ;*************************************************
  535. ReadCapacity:
  536.         pusha
  537. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  538.         call  clear_packet_buffer
  539. ; ╟рфрЄ№ ЁрчьхЁ сєЇхЁр т срщЄрї
  540.         mov     [CDBlockSize],8
  541. ; ╤ЇюЁьшЁютрЄ№ ъюьрэфє READ CAPACITY
  542.         mov     [PacketCommand],word 25h
  543. ; ╧юфрЄ№ ъюьрэфє
  544.         call    SendPacketDatCommand
  545.         popa
  546.         ret
  547.  
  548. clear_packet_buffer:        
  549. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  550.         mov     [PacketCommand],dword 0
  551.         mov     [PacketCommand+4],dword 0
  552.         mov     [PacketCommand+8],dword 0
  553.         ret
  554.  
  555.