Subversion Repositories Kolibri OS

Rev

Rev 996 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 2971 $
  9.  
  10.  
  11. ;**********************************************************
  12. ;  ═хяюёЁхфёЄтхээр  ЁрсюЄр ё єёЄЁющёЄтюь ╤D (ATAPI)
  13. ;**********************************************************
  14. ; └тЄюЁ ўрёЄш шёїюфэюую ЄхъёЄр ╩єыръют ┬ырфшьшЁ ├хээрф№хтшў
  15. ; └фряЄрЎш , фюЁрсюЄър ш ЁрчЁрсюЄър Mario79
  16.  
  17. ; ╠ръёшьры№эюх ъюышўхёЄтю яютЄюЁхэшщ юяхЁрЎшш ўЄхэш 
  18. MaxRetr equ 10
  19. ; ╧Ёхфхы№эюх тЁхь  юцшфрэш  уюЄютэюёЄш ъ яЁшхьє ъюьрэф√
  20. ; (т Єшърї)
  21. BSYWaitTime equ 1000  ;2
  22. NoTickWaitTime equ 0xfffff
  23.  
  24. ;*************************************************
  25. ;*      ╧╬╦═╬┼ ╫╥┼═╚┼ ╤┼╩╥╬╨└ ╩╬╠╧└╩╥-─╚╤╩└      *
  26. ;* ╤ўшЄ√тр■Єё  фрээ√х яюы№чютрЄхы , шэЇюЁьрЎш    *
  27. ;* ёєсърэрыр ш ъюэЄЁюы№эр  шэЇюЁьрЎш             *
  28. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  29. ;* яхЁьхээ√х:                                    *
  30. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  31. ;* DiskNumber - эюьхЁ фшёър эр ърэрых;           *
  32. ;* CDSectorAddress - рфЁхё ёўшЄ√трхьюую ёхъЄюЁр. *
  33. ;* ─рээ√х ёўшЄ√трхЄё  т ьрёёшт CDDataBuf.        *
  34. ;*************************************************
  35. ReadCD:
  36.         pusha
  37. ; ╟рфрЄ№ ЁрчьхЁ ёхъЄюЁр
  38.         mov       [CDBlockSize],2048 ;2352
  39. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  40.         call  clear_packet_buffer
  41. ; ╤ЇюЁьшЁютрЄ№ яръхЄэє■ ъюьрэфє фы  ёўшЄ√трэш 
  42. ; ёхъЄюЁр фрээ√ї
  43.         ; ╟рфрЄ№ ъюф ъюьрэф√ Read CD
  44.         mov       [PacketCommand],byte 0x28  ;0xBE
  45.         ; ╟рфрЄ№ рфЁхё ёхъЄюЁр
  46.         mov   AX,word [CDSectorAddress+2]
  47.         xchg  AL,AH
  48.         mov   word [PacketCommand+2],AX
  49.         mov   AX,word [CDSectorAddress]
  50.         xchg  AL,AH
  51.         mov   word [PacketCommand+4],AX
  52. ;        mov   eax,[CDSectorAddress]
  53. ;        mov   [PacketCommand+2],eax
  54.         ; ╟рфрЄ№ ъюышўхёЄтю ёўшЄ√трхь√ї ёхъЄюЁют
  55.         mov       [PacketCommand+8],byte 1
  56.         ; ╟рфрЄ№ ёўшЄ√трэшх фрээ√ї т яюыэюь юс·хьх
  57. ;        mov     [PacketCommand+9],byte 0xF8
  58. ; ╧юфрЄ№ ъюьрэфє
  59.         call  SendPacketDatCommand
  60.         popa
  61.         ret
  62.  
  63. ;********************************************
  64. ;*        ╫╥┼═╚┼ ╤┼╩╥╬╨└ ╤ ╧╬┬╥╬╨└╠╚        *
  65. ;* ╠эюуюъЁрЄэюх яютЄюЁхэшх ўЄхэш  яЁш ёсю ї *
  66. ;********************************************
  67. ReadCDWRetr:
  68. ;-----------------------------------------------------------
  69. ; input  : eax = block to read
  70. ;          ebx = destination
  71. ;-----------------------------------------------------------
  72.     pushad
  73.     mov   eax,[CDSectorAddress]
  74.     mov   ebx,[CDDataBuf_pointer]
  75.     call  cd_calculate_cache
  76.     add   esi,8
  77.     mov   edi,1
  78. .hdreadcache:
  79. ;    cmp   dword [esi+4],0       ; empty
  80. ;    je    .nohdcache
  81.     cmp   [esi],eax             ; correct sector
  82.     je    .yeshdcache
  83. .nohdcache:
  84.     add   esi,8
  85.     inc   edi
  86.     dec   ecx
  87.     jnz   .hdreadcache
  88.     call  find_empty_slot_CD_cache       ; ret in edi
  89.  
  90.     push  edi
  91.     push  eax
  92.     call  cd_calculate_cache_2
  93.     shl   edi,11
  94.     add   edi,eax
  95.     mov   [CDDataBuf_pointer],edi
  96.     pop   eax
  97.     pop   edi
  98.  
  99.     call  ReadCDWRetr_1
  100.     cmp   [DevErrorCode],0
  101.     jne   .exit
  102.  
  103.     mov   [CDDataBuf_pointer],ebx
  104.     call  cd_calculate_cache_1
  105.     lea   esi,[edi*8+esi]
  106.     mov   [esi],eax             ; sector number
  107. ;    mov   dword [esi+4],1       ; hd read - mark as same as in hd
  108. .yeshdcache:
  109.     mov   esi,edi
  110.     shl   esi,11    ;9
  111.     push  eax
  112.     call  cd_calculate_cache_2
  113.     add   esi,eax
  114.     pop   eax
  115.     mov   edi,ebx   ;[CDDataBuf_pointer]
  116.     mov   ecx,512   ;/4
  117.     cld
  118.     rep   movsd                 ; move data
  119. .exit:
  120.     popad
  121.     ret
  122.  
  123. ReadCDWRetr_1:
  124.         pushad
  125.  
  126. ; ╓шъы, яюър ъюьрэфр эх т√яюыэхэр єёях°эю шыш эх
  127. ; шёўхЁярэю ъюышўхёЄтю яюя√Єюъ
  128.         mov       ECX,MaxRetr
  129. @@NextRetr:
  130. ; ╧юфрЄ№ ъюьрэфє
  131.         call  ReadCD
  132.         cmp       [DevErrorCode],0
  133.         je        @@End_4
  134.  
  135.         or    ecx,ecx           ;{SPraid.simba} (for cd load)
  136.         jz    @@End_4
  137.         dec   ecx
  138.  
  139.         cmp   [timer_ticks_enable],0
  140.         jne   @f
  141.         mov   eax,NoTickWaitTime
  142. .wait:
  143.         dec   eax
  144.         cmp   eax,0
  145.         je    @@NextRetr
  146.         jmp       .wait
  147. @@:
  148. ; ╟рфхЁцър эр 2,5 ёхъєэф√
  149. ;       mov     EAX,[timer_ticks]
  150. ;       add     EAX,50  ;250
  151. ;@@Wait:
  152. ;       call    change_task
  153. ;       cmp     EAX,[timer_ticks]
  154. ;       ja      @@Wait
  155.         loop  @@NextRetr
  156. @@End_4:
  157.         popad
  158.         ret
  159.  
  160.  
  161. ;   ╙эштхЁёры№э√х яЁюЎхфєЁ√, юсхёяхўштр■∙шх т√яюыэхэшх
  162. ;             яръхЄэ√ї ъюьрэф т Ёхцшьх PIO
  163.  
  164. ; ╠ръёшьры№эю фюяєёЄшьюх тЁхь  юцшфрэш  ЁхръЎшш
  165. ; єёЄЁющёЄтр эр яръхЄэє■ ъюьрэфє (т Єшърї)
  166. MaxCDWaitTime equ 1000 ;200 ;10 ёхъєэф
  167.  
  168. ; ╬сырёЄ№ ярь Єш фы  ЇюЁьшЁютрэш  яръхЄэющ ъюьрэф√
  169. PacketCommand:   rb 12  ;DB 12 DUP (?)
  170. ; ╬сырёЄ№ ярь Єш фы  яЁшхьр фрээ√ї юЄ фшёъютюфр
  171. ;CDDataBuf       DB 4096 DUP (0)
  172. ; ╨рчьхЁ яЁшэшьрхьюую сыюър фрээ√ї т срщЄрї
  173. CDBlockSize     DW ?
  174. ; └фЁхё ёўшЄ√трхьюую ёхъЄюЁр фрээ√ї
  175. CDSectorAddress: DD ?
  176. ; ┬Ёхь  эрўрыр юўхЁхфэющ юяхЁрЎшш ё фшёъюь
  177. TickCounter_1 DD 0
  178. ; ┬Ёхь  эрўрыр юцшфрэш  уюЄютэюёЄш єёЄЁющёЄтр
  179. WURStartTime DD 0
  180. ; єърчрЄхы№ сєЇхЁр фы  ёўшЄ√трэш 
  181. CDDataBuf_pointer dd 0
  182.  
  183. ;****************************************************
  184. ;*    ╧╬╤╦└╥▄ ╙╤╥╨╬╔╤╥┬╙ ATAPI ╧└╩┼╥═╙▐ ╩╬╠└═─╙,    *
  185. ;* ╧╨┼─╙╤╠└╥╨╚┬└▐┘╙▐ ╧┼╨┼─└╫╙ ╬─═╬├╬ ╤┼╩╥╬╨└ ─└══█╒ *
  186. ;*     ╨└╟╠┼╨╬╠ 2048 ┴└╔╥ ╬╥ ╙╤╥╨╬╔╤╥┬└ ╩ ╒╬╤╥╙     *
  187. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х    *
  188. ;* яхЁьхээ√х:                                       *
  189. ;* ChannelNumber - эюьхЁ ърэрыр;                    *
  190. ;* DiskNumber - эюьхЁ фшёър эр ърэрых;              *
  191. ;* PacketCommand - 12-срщЄэ√щ ъюьрэфэ√щ яръхЄ;      *
  192. ;* CDBlockSize - ЁрчьхЁ яЁшэшьрхьюую сыюър фрээ√ї.  *
  193. ;****************************************************
  194. SendPacketDatCommand:
  195.         pushad
  196.         mov   [DevErrorCode],0
  197. ; ╟рфрЄ№ Ёхцшь CHS
  198.         mov     [ATAAddressMode],0
  199. ; ╧юёырЄ№ ATA-ъюьрэфє яхЁхфрўш яръхЄэющ ъюьрэф√
  200.         mov     [ATAFeatures],0
  201.         mov     [ATASectorCount],0
  202.         mov     [ATASectorNumber],0
  203.         ; ╟руЁєчшЄ№ ЁрчьхЁ яхЁхфртрхьюую сыюър
  204.         mov     AX,[CDBlockSize]
  205.         mov     [ATACylinder],AX
  206.         mov     [ATAHead],0
  207.         mov     [ATACommand],0A0h
  208.         call    SendCommandToHDD_1
  209.         cmp     [DevErrorCode],0 ;яЁютхЁшЄ№ ъюф ю°шсъш
  210.         jne     @@End_8    ;чръюэўшЄ№, ёюїЁрэшт ъюф ю°шсъш
  211.  
  212. ; ╬цшфрэшх уюЄютэюёЄш фшёъютюфр ъ яЁшхьє
  213. ; яръхЄэющ ъюьрэф√
  214.         mov     DX,[ATABasePortAddr]
  215.         add     DX,7     ;яюЁЄ 1ї7h
  216.         mov     ecx,NoTickWaitTime
  217. @@WaitDevice0:
  218.         cmp     [timer_ticks_enable],0
  219.         jne     @f
  220.         dec     ecx
  221.         cmp     ecx,0
  222.         je      @@Err1_1
  223.         jmp     .test
  224. @@:
  225.         call    change_task
  226.         ; ╧ЁютхЁшЄ№ тЁхь  т√яюыэхэш  ъюьрэф√
  227.         mov     EAX,[timer_ticks]
  228.         sub     EAX,[TickCounter_1]
  229.         cmp     EAX,BSYWaitTime
  230.         ja      @@Err1_1   ;ю°шсър Єрщь-рєЄр
  231.         ; ╧ЁютхЁшЄ№ уюЄютэюёЄ№
  232. .test:
  233.         in      AL,DX
  234.         test    AL,80h   ;ёюёЄю эшх ёшуэрыр BSY
  235.         jnz     @@WaitDevice0
  236.         test    AL,08h   ;ёюёЄю эшх ёшуэрыр DRQ
  237.         jz      @@WaitDevice0
  238.         test    AL,1     ;ёюёЄю эшх ёшуэрыр ERR
  239.         jnz     @@Err6
  240. ; ╧юёырЄ№ яръхЄэє■ ъюьрэфє
  241.         cli
  242.         mov     DX,[ATABasePortAddr]
  243.         mov     AX,[PacketCommand]
  244.         out     DX,AX
  245.         mov     AX,[PacketCommand+2]
  246.         out     DX,AX
  247.         mov     AX,[PacketCommand+4]
  248.         out     DX,AX
  249.         mov     AX,[PacketCommand+6]
  250.         out     DX,AX
  251.         mov     AX,[PacketCommand+8]
  252.         out     DX,AX
  253.         mov     AX,[PacketCommand+10]
  254.         out     DX,AX
  255.         sti
  256. ; ╬цшфрэшх уюЄютэюёЄш фрээ√ї
  257.         mov     DX,[ATABasePortAddr]
  258.         add     DX,7   ;яюЁЄ 1ї7h
  259.         mov     ecx,NoTickWaitTime
  260. @@WaitDevice1:
  261.         cmp     [timer_ticks_enable],0
  262.         jne     @f
  263.         dec     ecx
  264.         cmp     ecx,0
  265.         je      @@Err1_1
  266.         jmp     .test_1
  267. @@:
  268.         call    change_task
  269.         ; ╧ЁютхЁшЄ№ тЁхь  т√яюыэхэш  ъюьрэф√
  270.         mov     EAX,[timer_ticks]
  271.         sub     EAX,[TickCounter_1]
  272.         cmp     EAX,MaxCDWaitTime
  273.         ja      @@Err1_1   ;ю°шсър Єрщь-рєЄр
  274.         ; ╧ЁютхЁшЄ№ уюЄютэюёЄ№
  275. .test_1:
  276.         in      AL,DX
  277.         test    AL,80h   ;ёюёЄю эшх ёшуэрыр BSY
  278.         jnz     @@WaitDevice1
  279.         test    AL,08h   ;ёюёЄю эшх ёшуэрыр DRQ
  280.         jz      @@WaitDevice1
  281.         test    AL,1     ;ёюёЄю эшх ёшуэрыр ERR
  282.         jnz     @@Err6_temp
  283. ; ╧Ёшэ Є№ сыюъ фрээ√ї юЄ ъюэЄЁюыыхЁр
  284.         mov     EDI,[CDDataBuf_pointer] ;0x7000  ;CDDataBuf
  285.         ; ╟руЁєчшЄ№ рфЁхё ЁхушёЄЁр фрээ√ї ъюэЄЁюыыхЁр
  286.         mov     DX,[ATABasePortAddr] ;яюЁЄ 1x0h
  287.         ; ╟руЁєчшЄ№ т ёўхЄўшъ ЁрчьхЁ сыюър т срщЄрї
  288.         xor     ecx,ecx
  289.         mov     CX,[CDBlockSize]
  290.         ; ┬√ўшёышЄ№ ЁрчьхЁ сыюър т 16-ЁрчЁ фэ√ї ёыютрї
  291.         shr     CX,1 ;ЁрчфхышЄ№ ЁрчьхЁ сыюър эр 2
  292.         ; ╧Ёшэ Є№ сыюъ фрээ√ї
  293.         cli
  294.         cld
  295.         rep     insw
  296.         sti
  297.         ; ╙ёях°эюх чртхЁ°хэшх яЁшхьр фрээ√ї
  298.         jmp @@End_8
  299.  
  300. ; ╟ряшёрЄ№ ъюф ю°шсъш
  301. @@Err1_1:
  302.         mov     [DevErrorCode],1
  303.         jmp @@End_8
  304. @@Err6_temp:
  305.         mov     [DevErrorCode],7
  306.         jmp @@End_8
  307. @@Err6:
  308.         mov     [DevErrorCode],6
  309. @@End_8:
  310.         popad
  311.         ret
  312.  
  313.  
  314.  
  315. ;***********************************************
  316. ;*  ╧╬╤╦└╥▄ ╙╤╥╨╬╔╤╥┬╙ ATAPI ╧└╩┼╥═╙▐ ╩╬╠└═─╙, *
  317. ;*     ═┼ ╧╨┼─╙╤╠└╥╨╚┬└▐┘╙▐ ╧┼╨┼─└╫╚ ─└══█╒    *
  318. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч          *
  319. ;* уыюсры№э√х яхЁьхээ√х:                       *
  320. ;* ChannelNumber - эюьхЁ ърэрыр;               *
  321. ;* DiskNumber - эюьхЁ фшёър эр ърэрых;         *
  322. ;* PacketCommand - 12-срщЄэ√щ ъюьрэфэ√щ яръхЄ. *
  323. ;***********************************************
  324. SendPacketNoDatCommand:
  325.         pushad
  326.     mov   [DevErrorCode],0
  327. ; ╟рфрЄ№ Ёхцшь CHS
  328.         mov     [ATAAddressMode],0
  329. ; ╧юёырЄ№ ATA-ъюьрэфє яхЁхфрўш яръхЄэющ ъюьрэф√
  330.         mov     [ATAFeatures],0
  331.         mov     [ATASectorCount],0
  332.         mov     [ATASectorNumber],0
  333.         mov     [ATACylinder],0
  334.         mov     [ATAHead],0
  335.         mov     [ATACommand],0A0h
  336.         call    SendCommandToHDD_1
  337.         cmp     [DevErrorCode],0 ;яЁютхЁшЄ№ ъюф ю°шсъш
  338.         jne     @@End_9  ;чръюэўшЄ№, ёюїЁрэшт ъюф ю°шсъш
  339. ; ╬цшфрэшх уюЄютэюёЄш фшёъютюфр ъ яЁшхьє
  340. ; яръхЄэющ ъюьрэф√
  341.         mov     DX,[ATABasePortAddr]
  342.         add     DX,7   ;яюЁЄ 1ї7h
  343. @@WaitDevice0_1:
  344.         call    change_task
  345.         ; ╧ЁютхЁшЄ№ тЁхь  юцшфрэш 
  346.         mov     EAX,[timer_ticks]
  347.         sub     EAX,[TickCounter_1]
  348.         cmp     EAX,BSYWaitTime
  349.         ja      @@Err1_3   ;ю°шсър Єрщь-рєЄр
  350.         ; ╧ЁютхЁшЄ№ уюЄютэюёЄ№
  351.         in      AL,DX
  352.         test    AL,80h   ;ёюёЄю эшх ёшуэрыр BSY
  353.         jnz     @@WaitDevice0_1
  354.         test    AL,1     ;ёюёЄю эшх ёшуэрыр ERR
  355.         jnz     @@Err6_1
  356.         test    AL,08h   ;ёюёЄю эшх ёшуэрыр DRQ
  357.         jz      @@WaitDevice0_1
  358. ; ╧юёырЄ№ яръхЄэє■ ъюьрэфє
  359. ;        cli
  360.         mov     DX,[ATABasePortAddr]
  361.         mov     AX,word [PacketCommand]
  362.         out     DX,AX
  363.         mov     AX,word [PacketCommand+2]
  364.         out     DX,AX
  365.         mov     AX,word [PacketCommand+4]
  366.         out     DX,AX
  367.         mov     AX,word [PacketCommand+6]
  368.         out     DX,AX
  369.         mov     AX,word [PacketCommand+8]
  370.         out     DX,AX
  371.         mov     AX,word [PacketCommand+10]
  372.         out     DX,AX
  373. ;        sti
  374.     cmp [ignore_CD_eject_wait],1
  375.     je  @@End_9
  376. ; ╬цшфрэшх яюфЄтхЁцфхэш  яЁшхьр ъюьрэф√
  377.         mov     DX,[ATABasePortAddr]
  378.         add     DX,7   ;яюЁЄ 1ї7h
  379. @@WaitDevice1_1:
  380.         call    change_task
  381.         ; ╧ЁютхЁшЄ№ тЁхь  т√яюыэхэш  ъюьрэф√
  382.         mov     EAX,[timer_ticks]
  383.         sub     EAX,[TickCounter_1]
  384.         cmp     EAX,MaxCDWaitTime
  385.         ja      @@Err1_3   ;ю°шсър Єрщь-рєЄр
  386.         ; ╬цшфрЄ№ юётюсюцфхэш  єёЄЁющёЄтр
  387.         in      AL,DX
  388.         test    AL,80h   ;ёюёЄю эшх ёшуэрыр BSY
  389.         jnz     @@WaitDevice1_1
  390.         test    AL,1     ;ёюёЄю эшх ёшуэрыр ERR
  391.         jnz     @@Err6_1
  392.         test    AL,40h   ;ёюёЄю эшх ёшуэрыр DRDY
  393.         jz      @@WaitDevice1_1
  394.         jmp @@End_9
  395.  
  396. ; ╟ряшёрЄ№ ъюф ю°шсъш
  397. @@Err1_3:
  398.         mov     [DevErrorCode],1
  399.         jmp @@End_9
  400. @@Err6_1:
  401.         mov     [DevErrorCode],6
  402. @@End_9:
  403.         popad
  404.         ret
  405.  
  406. ;****************************************************
  407. ;*          ╧╬╤╦└╥▄ ╩╬╠└═─╙ ╟└─└══╬╠╙ ─╚╤╩╙         *
  408. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х    *
  409. ;* яхЁхьхээ√х:                                      *
  410. ;* ChannelNumber - эюьхЁ ърэрыр (1 шыш 2);          *
  411. ;* DiskNumber - эюьхЁ фшёър (0 шыш 1);              *
  412. ;* ATAFeatures - "юёюсхээюёЄш";                     *
  413. ;* ATASectorCount - ъюышўхёЄтю ёхъЄюЁют;            *
  414. ;* ATASectorNumber - эюьхЁ эрўры№эюую ёхъЄюЁр;      *
  415. ;* ATACylinder - эюьхЁ эрўры№эюую ЎшышэфЁр;         *
  416. ;* ATAHead - эюьхЁ эрўры№эющ уюыютъш;               *
  417. ;* ATAAddressMode - Ёхцшь рфЁхёрЎшш (0-CHS, 1-LBA); *
  418. ;* ATACommand - ъюф ъюьрэф√.                        *
  419. ;* ╧юёых єёях°эюую т√яюыэхэш  ЇєэъЎшш:              *
  420. ;* т ATABasePortAddr - срчют√щ рфЁхё HDD;           *
  421. ;* т DevErrorCode - эюы№.                           *
  422. ;* ╧Ёш тючэшъэютхэшш ю°шсъш т DevErrorCode сєфхЄ    *
  423. ;* тючтЁр∙хэ ъюф ю°шсъш.                            *
  424. ;****************************************************
  425. SendCommandToHDD_1:
  426.         pushad
  427.     mov   [DevErrorCode],0
  428. ; ╧ЁютхЁшЄ№ чэрўхэшх ъюфр Ёхцшьр
  429.         cmp     [ATAAddressMode],1
  430.         ja      @@Err2_4
  431. ; ╧ЁютхЁшЄ№ ъюЁЁхъЄэюёЄ№ эюьхЁр ърэрыр
  432.         mov     BX,[ChannelNumber]
  433.         cmp     BX,1
  434.         jb      @@Err3_4
  435.         cmp     BX,2
  436.         ja      @@Err3_4
  437. ; ╙ёЄрэютшЄ№ срчют√щ рфЁхё
  438.         dec     BX
  439.         shl     BX,1
  440.         movzx   ebx,bx
  441.         mov     AX,[ebx+StandardATABases]
  442.         mov     [ATABasePortAddr],AX
  443. ; ╬цшфрэшх уюЄютэюёЄш HDD ъ яЁшхьє ъюьрэф√
  444.         ; ┬√сЁрЄ№ эєцэ√щ фшёъ
  445.         mov     DX,[ATABasePortAddr]
  446.         add     DX,6    ;рфЁхё ЁхушёЄЁр уюыютюъ
  447.         mov     AL,[DiskNumber]
  448.         cmp     AL,1    ;яЁютхЁшЄ№ эюьхЁр фшёър
  449.         ja      @@Err4_4
  450.         shl     AL,4
  451.         or      AL,10100000b
  452.         out     DX,AL
  453.         ; ╬цшфрЄ№, яюър фшёъ эх сєфхЄ уюЄют
  454.         inc     DX
  455.         mov     eax,[timer_ticks]
  456.         mov     [TickCounter_1],eax
  457.         mov     ecx,NoTickWaitTime
  458. @@WaitHDReady_2:
  459.         cmp    [timer_ticks_enable],0
  460.         jne    @f
  461.         dec    ecx
  462.         cmp    ecx,0
  463.         je     @@Err1_4
  464.         jmp    .test
  465. @@:
  466.         call    change_task
  467.         ; ╧ЁютхЁшЄ№ тЁхь  юцшфрэш 
  468.         mov     eax,[timer_ticks]
  469.         sub     eax,[TickCounter_1]
  470.         cmp     eax,BSYWaitTime ;300    ;юцшфрЄ№ 3 ёхъ.
  471.         ja      @@Err1_4   ;ю°шсър Єрщь-рєЄр
  472.         ; ╧ЁюўшЄрЄ№ ЁхушёЄЁ ёюёЄю эш 
  473. .test:
  474.         in      AL,DX
  475.         ; ╧ЁютхЁшЄ№ ёюёЄю эшх ёшуэрыр BSY
  476.         test    AL,80h
  477.         jnz     @@WaitHDReady_2
  478.         ; ╧ЁютхЁшЄ№ ёюёЄю эшх ёшуэрыр DRQ
  479.         test    AL,08h
  480.         jnz     @@WaitHDReady_2
  481.  
  482. ; ╟руЁєчшЄ№ ъюьрэфє т ЁхушёЄЁ√ ъюэЄЁюыыхЁр
  483.         cli
  484.         mov     DX,[ATABasePortAddr]
  485.         inc     DX      ;ЁхушёЄЁ "юёюсхээюёЄхщ"
  486.         mov     AL,[ATAFeatures]
  487.         out     DX,AL
  488.         inc     DX      ;ёўхЄўшъ ёхъЄюЁют
  489.         mov     AL,[ATASectorCount]
  490.         out     DX,AL
  491.         inc     DX      ;ЁхушёЄЁ эюьхЁр ёхъЄюЁр
  492.         mov     AL,[ATASectorNumber]
  493.         out     DX,AL
  494.         inc     DX      ;эюьхЁ ЎшышэфЁр (ьырф°шщ срщЄ)
  495.         mov     AX,[ATACylinder]
  496.         out     DX,AL
  497.         inc     DX      ;эюьхЁ ЎшышэфЁр (ёЄрЁ°шщ срщЄ)
  498.         mov     AL,AH
  499.         out     DX,AL
  500.         inc     DX      ;эюьхЁ уюыютъш/эюьхЁ фшёър
  501.         mov     AL,[DiskNumber]
  502.         shl     AL,4
  503.         cmp     [ATAHead],0Fh ;яЁютхЁшЄ№ эюьхЁ уюыютъш
  504.         ja      @@Err5_4
  505.         or      AL,[ATAHead]
  506.         or      AL,10100000b
  507.         mov     AH,[ATAAddressMode]
  508.         shl     AH,6
  509.         or      AL,AH
  510.         out     DX,AL
  511. ; ╧юёырЄ№ ъюьрэфє
  512.         mov     AL,[ATACommand]
  513.         inc     DX      ;ЁхушёЄЁ ъюьрэф
  514.         out     DX,AL
  515.         sti
  516. ; ╤сЁюёшЄ№ яЁшчэръ ю°шсъш
  517.         mov     [DevErrorCode],0
  518.         jmp @@End_10
  519. ; ╟ряшёрЄ№ ъюф ю°шсъш
  520. @@Err1_4:
  521.         mov     [DevErrorCode],1
  522.         jmp @@End_10
  523. @@Err2_4:
  524.         mov     [DevErrorCode],2
  525.         jmp @@End_10
  526. @@Err3_4:
  527.         mov     [DevErrorCode],3
  528.         jmp @@End_10
  529. @@Err4_4:
  530.         mov     [DevErrorCode],4
  531.         jmp @@End_10
  532. @@Err5_4:
  533.         mov     [DevErrorCode],5
  534. ; ╟ртхЁ°хэшх ЁрсюЄ√ яЁюуЁрьь√
  535. @@End_10:
  536. ;        sti
  537.         popad
  538.         ret
  539.  
  540. ;*************************************************
  541. ;*    ╬╞╚─└═╚┼ ├╬╥╬┬═╬╤╥╚ ╙╤╥╨╬╔╤╥┬└ ╩ ╨└┴╬╥┼    *
  542. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  543. ;* яхЁьхээ√х:                                    *
  544. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  545. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  546. ;*************************************************
  547. WaitUnitReady:
  548.         pusha
  549. ; ╟ряюьэшЄ№ тЁхь  эрўрыр юяхЁрЎшш
  550.         mov     EAX,[timer_ticks]
  551.         mov     [WURStartTime],EAX
  552. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  553.         call  clear_packet_buffer
  554. ; ╤ЇюЁьшЁютрЄ№ ъюьрэфє TEST UNIT READY
  555.         mov     [PacketCommand],word 00h
  556. ; ╓╚╩╦ ╬╞╚─└═╚▀ ├╬╥╬┬═╬╤╥╚ ╙╤╥╨╬╔╤╥┬└
  557.         mov     ecx,NoTickWaitTime
  558. @@SendCommand:
  559.         ; ╧юфрЄ№ ъюьрэфє яЁютхЁъш уюЄютэюёЄш
  560.         call    SendPacketNoDatCommand
  561.         cmp     [timer_ticks_enable],0
  562.         jne     @f
  563.         cmp     [DevErrorCode],0
  564.         je      @@End_11
  565.         dec     ecx
  566.         cmp     ecx,0
  567.         je      .Error
  568.         jmp     @@SendCommand
  569. @@:
  570.         call    change_task
  571.         ; ╧ЁютхЁшЄ№ ъюф ю°шсъш
  572.         cmp     [DevErrorCode],0
  573.         je      @@End_11
  574.         ; ╧ЁютхЁшЄ№ тЁхь  юцшфрэш  уюЄютэюёЄш
  575.         mov     EAX,[timer_ticks]
  576.         sub     EAX,[WURStartTime]
  577.         cmp     EAX,MaxCDWaitTime
  578.         jb      @@SendCommand
  579. .Error:
  580.         ; ╬°шсър Єрщь-рєЄр
  581.         mov     [DevErrorCode],1
  582. @@End_11:
  583.         popa
  584.         ret
  585.  
  586. ;*************************************************
  587. ;*            ╟└╧╨┼╥╚╥▄ ╤╠┼═╙ ─╚╤╩└              *
  588. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  589. ;* яхЁьхээ√х:                                    *
  590. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  591. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  592. ;*************************************************
  593. prevent_medium_removal:
  594.         pusha
  595. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  596.         call  clear_packet_buffer
  597. ; ╟рфрЄ№ ъюф ъюьрэф√
  598.         mov  [PacketCommand],byte 0x1E
  599. ; ╟рфрЄ№ ъюф чряЁхЄр
  600.     mov  [PacketCommand+4],byte 11b
  601. ; ╧юфрЄ№ ъюьрэфє
  602.         call SendPacketNoDatCommand
  603.         mov  eax,ATAPI_IDE0_lock
  604.         add  eax,[cdpos]
  605.         dec  eax
  606.         mov  [eax],byte 1
  607.         popa
  608.         ret
  609.  
  610. ;*************************************************
  611. ;*            ╨└╟╨┼╪╚╥▄ ╤╠┼═╙ ─╚╤╩└              *
  612. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  613. ;* яхЁьхээ√х:                                    *
  614. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  615. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  616. ;*************************************************
  617. allow_medium_removal:
  618.         pusha
  619. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  620.         call  clear_packet_buffer
  621. ; ╟рфрЄ№ ъюф ъюьрэф√
  622.         mov  [PacketCommand],byte 0x1E
  623. ; ╟рфрЄ№ ъюф чряЁхЄр
  624.     mov  [PacketCommand+4],byte 00b
  625. ; ╧юфрЄ№ ъюьрэфє
  626.         call SendPacketNoDatCommand
  627.         mov  eax,ATAPI_IDE0_lock
  628.         add  eax,[cdpos]
  629.         dec  eax
  630.         mov  [eax],byte 0
  631.         popa
  632.         ret
  633.  
  634. ;*************************************************
  635. ;*         ╟└├╨╙╟╚╥▄ ═╬╤╚╥┼╦▄ ┬ ─╚╤╩╬┬╬─         *
  636. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  637. ;* яхЁьхээ√х:                                    *
  638. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  639. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  640. ;*************************************************
  641. LoadMedium:
  642.         pusha
  643. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  644.         call  clear_packet_buffer
  645. ; ╤ЇюЁьшЁютрЄ№ ъюьрэфє START/STOP UNIT
  646.         ; ╟рфрЄ№ ъюф ъюьрэф√
  647.         mov     [PacketCommand],word 1Bh
  648.         ; ╟рфрЄ№ юяхЁрЎш■ чруЁєчъш эюёшЄхы 
  649.         mov     [PacketCommand+4],word 00000011b
  650. ; ╧юфрЄ№ ъюьрэфє
  651.         call    SendPacketNoDatCommand
  652.         popa
  653.         ret
  654.  
  655. ;*************************************************
  656. ;*         ╚╟┬╦┼╫▄ ═╬╤╚╥┼╦▄ ╚╟ ─╚╤╩╬┬╬─└         *
  657. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  658. ;* яхЁьхээ√х:                                    *
  659. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  660. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  661. ;*************************************************
  662. EjectMedium:
  663.         pusha
  664. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  665.         call  clear_packet_buffer
  666. ; ╤ЇюЁьшЁютрЄ№ ъюьрэфє START/STOP UNIT
  667.         ; ╟рфрЄ№ ъюф ъюьрэф√
  668.         mov     [PacketCommand],word 1Bh
  669.         ; ╟рфрЄ№ юяхЁрЎш■ шчтыхўхэш  эюёшЄхы 
  670.         mov     [PacketCommand+4],word 00000010b
  671. ; ╧юфрЄ№ ъюьрэфє
  672.         call    SendPacketNoDatCommand
  673.         popa
  674.         ret
  675.  
  676. ;*************************************************
  677. ;* ╧ЁютхЁшЄ№ ёюс√Єшх эрцрЄш  ъэюяъш шчтыхўхэш    *
  678. ;*                     фшёър                     *
  679. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  680. ;* яхЁхьхээ√х:                                   *
  681. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  682. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  683. ;*************************************************
  684. check_ATAPI_device_event:
  685.         pusha
  686.     mov  eax,[timer_ticks]
  687.     sub  eax,[timer_ATAPI_check]
  688.     cmp  eax,100
  689.     jb   .end_1
  690.     mov  al,[DRIVE_DATA+1]
  691.     and al,11b
  692.     cmp al,10b
  693.     jz  .ide3
  694. .ide2_1:
  695.     mov  al,[DRIVE_DATA+1]
  696.     and al,1100b
  697.     cmp al,1000b
  698.     jz  .ide2
  699. .ide1_1:
  700.     mov  al,[DRIVE_DATA+1]
  701.     and al,110000b
  702.     cmp al,100000b
  703.     jz  .ide1
  704. .ide0_1:
  705.     mov  al,[DRIVE_DATA+1]
  706.     and al,11000000b
  707.     cmp al,10000000b
  708.     jz  .ide0
  709. .end:
  710.  
  711.     sti
  712.     mov  eax,[timer_ticks]
  713.     mov  [timer_ATAPI_check],eax
  714. .end_1:
  715.         popa
  716.         ret
  717.  
  718. .ide3:
  719.     cli
  720.     cmp  [ATAPI_IDE3_lock],1
  721.     jne  .ide2_1
  722.     cmp  [IDE_Channel_2],0
  723.     jne  .ide1_1
  724.     cmp  [cd_status],0
  725.     jne  .end
  726.         mov  [IDE_Channel_2],1
  727.     call reserve_ok2
  728.         mov  [ChannelNumber],2
  729.         mov  [DiskNumber],1
  730.         mov      [cdpos],4
  731.         call GetEvent_StatusNotification
  732.         cmp  [CDDataBuf+4],byte 1
  733.         je   .eject_ide3
  734.         call syscall_cdaudio.free
  735.     jmp  .ide2_1
  736. .eject_ide3:
  737.     call .eject
  738.         call syscall_cdaudio.free
  739.     jmp  .ide2_1
  740.  
  741. .ide2:
  742.     cli
  743.     cmp  [ATAPI_IDE2_lock],1
  744.     jne  .ide1_1
  745.     cmp  [IDE_Channel_2],0
  746.     jne  .ide1_1
  747.     cmp  [cd_status],0
  748.     jne  .end
  749.         mov  [IDE_Channel_2],1
  750.     call  reserve_ok2
  751.         mov  [ChannelNumber],2
  752.         mov  [DiskNumber],0
  753.         mov     [cdpos],3
  754.         call GetEvent_StatusNotification
  755.         cmp  [CDDataBuf+4],byte 1
  756.         je   .eject_ide2
  757.         call syscall_cdaudio.free
  758.     jmp  .ide1_1
  759. .eject_ide2:
  760.     call .eject
  761.         call syscall_cdaudio.free
  762.     jmp  .ide1_1
  763.  
  764. .ide1:
  765.     cli
  766.     cmp  [ATAPI_IDE1_lock],1
  767.     jne  .ide0_1
  768.     cmp  [IDE_Channel_1],0
  769.     jne  .end
  770.     cmp  [cd_status],0
  771.     jne  .end
  772.         mov  [IDE_Channel_1],1
  773.     call reserve_ok2
  774.         mov  [ChannelNumber],1
  775.         mov  [DiskNumber],1
  776.         mov     [cdpos],2
  777.         call GetEvent_StatusNotification
  778.         cmp  [CDDataBuf+4],byte 1
  779.         je   .eject_ide1
  780.         call syscall_cdaudio.free
  781.     jmp  .ide0_1
  782. .eject_ide1:
  783.     call .eject
  784.         call syscall_cdaudio.free
  785.     jmp  .ide0_1
  786.  
  787. .ide0:
  788.     cli
  789.     cmp  [ATAPI_IDE0_lock],1
  790.     jne  .end
  791.     cmp  [IDE_Channel_1],0
  792.     jne  .end
  793.     cmp  [cd_status],0
  794.     jne  .end
  795.         mov  [IDE_Channel_1],1
  796.     call reserve_ok2
  797.         mov  [ChannelNumber],1
  798.         mov  [DiskNumber],0
  799.         mov     [cdpos],1
  800.         call GetEvent_StatusNotification
  801.         cmp  [CDDataBuf+4],byte 1
  802.         je   .eject_ide0
  803.         call syscall_cdaudio.free
  804.     jmp  .end
  805. .eject_ide0:
  806.     call .eject
  807.         call syscall_cdaudio.free
  808.     jmp  .end
  809.  
  810. .eject:
  811.         call clear_CD_cache
  812.         call allow_medium_removal
  813.         mov  [ignore_CD_eject_wait],1
  814.         call EjectMedium
  815.         mov  [ignore_CD_eject_wait],0
  816.         ret
  817.  
  818. timer_ATAPI_check dd 0
  819. ATAPI_IDE0_lock db 0
  820. ATAPI_IDE1_lock db 0
  821. ATAPI_IDE2_lock db 0
  822. ATAPI_IDE3_lock db 0
  823. ignore_CD_eject_wait db 0
  824.  
  825. ;*************************************************
  826. ;* ╧юыєўшЄ№ ёююс∙хэшх ю ёюс√Єшш шыш ёюёЄю эшш    *
  827. ;*                  єёЄЁющёЄтр                   *
  828. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  829. ;* яхЁхьхээ√х:                                   *
  830. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  831. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  832. ;*************************************************
  833. GetEvent_StatusNotification:
  834.         pusha
  835.         mov     [CDDataBuf_pointer],CDDataBuf
  836. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  837.         call  clear_packet_buffer
  838. ; ╟рфрЄ№ ъюф ъюьрэф√
  839.         mov     [PacketCommand],byte 4Ah
  840.         mov     [PacketCommand+1],byte 00000001b
  841. ; ╟рфрЄ№ чряЁюё ъырёёр ёююс∙хэшщ
  842.         mov     [PacketCommand+4],byte 00010000b
  843. ; ╨рчьхЁ т√фхыхээющ юсырёЄш
  844.         mov     [PacketCommand+7],byte 8h
  845.         mov     [PacketCommand+8],byte 0h
  846. ; ╧юфрЄ№ ъюьрэфє
  847.         call    SendPacketDatCommand
  848.         popa
  849.         ret
  850.  
  851. ;*************************************************
  852. ; яЁюўшЄрЄ№ шэЇюЁьрЎш■ шч TOC
  853. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  854. ;* яхЁхьхээ√х:                                   *
  855. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  856. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  857. ;*************************************************
  858. Read_TOC:
  859.         pusha
  860.         mov     [CDDataBuf_pointer],CDDataBuf
  861. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  862.         call  clear_packet_buffer
  863. ; ╤ЇюЁьшЁютрЄ№ яръхЄэє■ ъюьрэфє фы  ёўшЄ√трэш 
  864. ; ёхъЄюЁр фрээ√ї
  865.         mov       [PacketCommand],byte 0x43
  866.         ; ╟рфрЄ№ ЇюЁьрЄ
  867.         mov       [PacketCommand+2],byte 1
  868. ; ╨рчьхЁ т√фхыхээющ юсырёЄш
  869.         mov     [PacketCommand+7],byte 0xFF
  870.         mov     [PacketCommand+8],byte 0h
  871. ; ╧юфрЄ№ ъюьрэфє
  872.         call  SendPacketDatCommand
  873.         popa
  874.         ret
  875.  
  876. ;*************************************************
  877. ;* ╬╧╨┼─┼╦╚╥▄ ╬┴┘┼┼ ╩╬╦╚╫┼╤╥┬╬ ╤┼╩╥╬╨╬┬ ═└ ─╚╤╩┼ *
  878. ;* ┬їюфэ√х ярЁрьхЄЁ√ яхЁхфр■Єё  ўхЁхч уыюсры№э√х *
  879. ;* яхЁхьхээ√х:                                   *
  880. ;* ChannelNumber - эюьхЁ ърэрыр;                 *
  881. ;* DiskNumber - эюьхЁ фшёър эр ърэрых.           *
  882. ;*************************************************
  883. ;ReadCapacity:
  884. ;       pusha
  885. ;; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  886. ;       call  clear_packet_buffer
  887. ;; ╟рфрЄ№ ЁрчьхЁ сєЇхЁр т срщЄрї
  888. ;       mov     [CDBlockSize],8
  889. ;; ╤ЇюЁьшЁютрЄ№ ъюьрэфє READ CAPACITY
  890. ;       mov     [PacketCommand],word 25h
  891. ;; ╧юфрЄ№ ъюьрэфє
  892. ;       call    SendPacketDatCommand
  893. ;       popa
  894. ;       ret
  895.  
  896. clear_packet_buffer:
  897. ; ╬ўшёЄшЄ№ сєЇхЁ яръхЄэющ ъюьрэф√
  898.         mov     [PacketCommand],dword 0
  899.         mov     [PacketCommand+4],dword 0
  900.         mov     [PacketCommand+8],dword 0
  901.         ret
  902.