Subversion Repositories Kolibri OS

Rev

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