Subversion Repositories Kolibri OS

Rev

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