Subversion Repositories Kolibri OS

Rev

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

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