Subversion Repositories Kolibri OS

Rev

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

  1. $Revision: 543 $
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;                                                              ;;
  4. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  5. ;; Distributed under terms of the GNU General Public License    ;;
  6. ;;                                                              ;;
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8.  
  9. ;**********************************************************
  10. ;  Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI)
  11. ;**********************************************************
  12. ; Àâòîð èñõîäíîãî òåêñòà  Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
  13. ; Àäàïòàöèÿ è äîðàáîòêà Mario79
  14.  
  15. ;        Ïðîöåäóðà äëÿ ïîëíîãî ñ÷èòûâàíèÿ âñåõ
  16. ;           äàííûõ èç ñåêòîðà êîìïàêò-äèñêà
  17. ; Àâòîð òåêñòà ïðîãðàììû Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
  18.  
  19.  
  20. ; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ
  21. MaxRetr equ 10
  22. ; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû
  23. ; (â òèêàõ)
  24. BSYWaitTime equ 1000  ;2
  25. NoTickWaitTime equ 0xfffff
  26. ;*************************************************
  27. ;*      ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ      *
  28. ;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ   *
  29. ;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ            *
  30. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  31. ;* ïåðìåííûå:                                    *
  32. ;* ChannelNumber - íîìåð êàíàëà;                 *
  33. ;* DiskNumber - íîìåð äèñêà íà êàíàëå;           *
  34. ;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. *
  35. ;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf.        *
  36. ;*************************************************
  37. ReadCD:
  38.         pusha
  39. ; Çàäàòü ðàçìåð ñåêòîðà
  40.         mov     [CDBlockSize],2048 ;2352
  41. ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
  42.         call  clear_packet_buffer
  43. ; Ñôîðìèðîâàòü ïàêåòíóþ êîìàíäó äëÿ ñ÷èòûâàíèÿ
  44. ; ñåêòîðà äàííûõ
  45.         ; Çàäàòü êîä êîìàíäû Read CD
  46.         mov     [PacketCommand],byte 0x28  ;0xBE
  47.         ; Çàäàòü àäðåñ ñåêòîðà
  48.         mov     AX,word [CDSectorAddress+2]
  49.         xchg    AL,AH
  50.         mov     word [PacketCommand+2],AX
  51.         mov     AX,word [CDSectorAddress]
  52.         xchg    AL,AH
  53.         mov     word [PacketCommand+4],AX
  54. ;        mov   eax,[CDSectorAddress]
  55. ;        mov   [PacketCommand+2],eax
  56.         ; Çàäàòü êîëè÷åñòâî ñ÷èòûâàåìûõ ñåêòîðîâ
  57.         mov     [PacketCommand+8],byte 1
  58.         ; Çàäàòü ñ÷èòûâàíèå äàííûõ â ïîëíîì îáúåìå
  59. ;        mov     [PacketCommand+9],byte 0xF8
  60. ; Ïîäàòü êîìàíäó
  61.         call    SendPacketDatCommand
  62. ;        call test_mario79
  63.         popa
  64.         ret
  65.  
  66. ;********************************************
  67. ;*        ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ Ñ ÏÎÂÒÎÐÀÌÈ        *
  68. ;* Ìíîãîêðàòíîå ïîâòîðåíèå ÷òåíèÿ ïðè ñáîÿõ *
  69. ;********************************************
  70. ReadCDWRetr:
  71.         pushad
  72.                
  73. ; Öèêë, ïîêà êîìàíäà íå âûïîëíåíà óñïåøíî èëè íå
  74. ; èñ÷åðïàíî êîëè÷åñòâî ïîïûòîê
  75.         mov     ECX,MaxRetr
  76. @@NextRetr:
  77. ; Ïîäàòü êîìàíäó
  78.         call    ReadCD
  79.         cmp     [DevErrorCode],0
  80.         je      @@End_4
  81.        
  82.         or              ecx,ecx                 ;{SPraid.simba} (for cd load)
  83.         jz              @@End_4
  84.         dec     ecx
  85.        
  86.         cmp    [timer_ticks_enable],0
  87.         jne     @f
  88.         mov     eax,NoTickWaitTime
  89. .wait:
  90.         dec     eax
  91.         cmp     eax,0
  92.         je      @@NextRetr
  93.         jmp     .wait
  94. @@:
  95. ; Çàäåðæêà íà 2,5 ñåêóíäû
  96.         mov     EAX,[timer_ticks]
  97.         add     EAX,250 ;50
  98. @@Wait:
  99.         call    change_task
  100.         cmp     EAX,[timer_ticks]
  101.         ja      @@Wait
  102.         loop    @@NextRetr
  103. @@End_4:
  104.         popad
  105.         ret
  106.  
  107.  
  108. ;   Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå
  109. ;             ïàêåòíûõ êîìàíä â ðåæèìå PIO
  110. ;
  111. ; Àâòîð òåêñòà ïðîãðàììû Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
  112.  
  113. ; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè
  114. ; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ)
  115. MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä
  116.  
  117. ; Îáëàñòü ïàìÿòè äëÿ ôîðìèðîâàíèÿ ïàêåòíîé êîìàíäû
  118. PacketCommand:   rb 12  ;DB 12 DUP (?)
  119. ; Îáëàñòü ïàìÿòè äëÿ ïðèåìà äàííûõ îò äèñêîâîäà
  120. ;CDDataBuf       DB 4096 DUP (0)
  121. ; Ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ â áàéòàõ
  122. CDBlockSize     DW ?
  123. ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà äàííûõ
  124. CDSectorAddress: DD ?
  125. ; Âðåìÿ íà÷àëà î÷åðåäíîé îïåðàöèè ñ äèñêîì
  126. TickCounter_1 DD 0
  127. ; Âðåìÿ íà÷àëà îæèäàíèÿ ãîòîâíîñòè óñòðîéñòâà
  128. WURStartTime DD 0
  129. ; óêàçàòåëü áóôåðà äëÿ ñ÷èòûâàíèÿ
  130. CDDataBuf_pointer dd 0
  131.  
  132. ;****************************************************
  133. ;*    ÏÎÑËÀÒÜ ÓÑÒÐÎÉÑÒÂÓ ATAPI ÏÀÊÅÒÍÓÞ ÊÎÌÀÍÄÓ,    *
  134. ;* ÏÐÅÄÓÑÌÀÒÐÈÂÀÞÙÓÞ ÏÅÐÅÄÀ×Ó ÎÄÍÎÃÎ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ *
  135. ;*     ÐÀÇÌÅÐÎÌ 2048 ÁÀÉÒ ÎÒ ÓÑÒÐÎÉÑÒÂÀ Ê ÕÎÑÒÓ     *
  136. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå    *
  137. ;* ïåðìåííûå:                                       *
  138. ;* ChannelNumber - íîìåð êàíàëà;                    *
  139. ;* DiskNumber - íîìåð äèñêà íà êàíàëå;              *
  140. ;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò;      *
  141. ;* CDBlockSize - ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ.  *
  142. ;****************************************************
  143. SendPacketDatCommand:
  144.         pushad
  145. ; Çàäàòü ðåæèì CHS
  146.         mov     [ATAAddressMode],0
  147. ; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû
  148.         mov     [ATAFeatures],0
  149.         mov     [ATASectorCount],0
  150.         mov     [ATASectorNumber],0
  151.         ; Çàãðóçèòü ðàçìåð ïåðåäàâàåìîãî áëîêà
  152.         mov     AX,[CDBlockSize]
  153.         mov     [ATACylinder],AX
  154.         mov     [ATAHead],0
  155.         mov     [ATACommand],0A0h
  156.         call    SendCommandToHDD_1
  157.         cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
  158.         jne     @@End_8    ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
  159.  
  160. ; Îæèäàíèå ãîòîâíîñòè äèñêîâîäà ê ïðèåìó
  161. ; ïàêåòíîé êîìàíäû
  162.         mov     DX,[ATABasePortAddr]
  163.         add     DX,7     ;ïîðò 1õ7h
  164.         mov     ecx,NoTickWaitTime
  165. @@WaitDevice0:
  166.         cmp     [timer_ticks_enable],0
  167.         jne     @f
  168.         dec     ecx
  169.         cmp     ecx,0
  170.         je      @@Err1_1
  171.         jmp     .test
  172. @@:
  173.         call    change_task
  174.         ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
  175.         mov     EAX,[timer_ticks]
  176.         sub     EAX,[TickCounter_1]
  177.         cmp     EAX,BSYWaitTime
  178.         ja      @@Err1_1   ;îøèáêà òàéì-àóòà
  179.         ; Ïðîâåðèòü ãîòîâíîñòü
  180. .test:
  181.         in      AL,DX
  182.         test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
  183.         jnz     @@WaitDevice0
  184.         test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
  185.         jz      @@WaitDevice0
  186.         test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
  187.         jnz     @@Err6
  188. ; Ïîñëàòü ïàêåòíóþ êîìàíäó
  189.         cli
  190.         mov     DX,[ATABasePortAddr]
  191.         mov     AX,[PacketCommand]
  192.         out     DX,AX
  193.         mov     AX,[PacketCommand+2]
  194.         out     DX,AX
  195.         mov     AX,[PacketCommand+4]
  196.         out     DX,AX
  197.         mov     AX,[PacketCommand+6]
  198.         out     DX,AX
  199.         mov     AX,[PacketCommand+8]
  200.         out     DX,AX
  201.         mov     AX,[PacketCommand+10]
  202.         out     DX,AX
  203.         sti
  204. ; Îæèäàíèå ãîòîâíîñòè äàííûõ
  205.         mov     DX,[ATABasePortAddr]
  206.         add     DX,7   ;ïîðò 1õ7h
  207.         mov     ecx,NoTickWaitTime
  208. @@WaitDevice1:
  209.         cmp     [timer_ticks_enable],0
  210.         jne     @f
  211.         dec     ecx
  212.         cmp     ecx,0
  213.         je      @@Err1_1
  214.         jmp     .test_1
  215. @@:
  216.         call    change_task
  217.         ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
  218.         mov     EAX,[timer_ticks]
  219.         sub     EAX,[TickCounter_1]
  220.         cmp     EAX,MaxCDWaitTime
  221.         ja      @@Err1_1   ;îøèáêà òàéì-àóòà
  222.         ; Ïðîâåðèòü ãîòîâíîñòü
  223. .test_1:
  224.         in      AL,DX
  225.         test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
  226.         jnz     @@WaitDevice1
  227.         test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
  228.         jz      @@WaitDevice1
  229.         test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
  230.         jnz     @@Err6_temp
  231. ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
  232.         mov     EDI,[CDDataBuf_pointer] ;0x7000  ;CDDataBuf
  233.         ; Çàãðóçèòü àäðåñ ðåãèñòðà äàííûõ êîíòðîëëåðà
  234.         mov     DX,[ATABasePortAddr] ;ïîðò 1x0h
  235.         ; Çàãðóçèòü â ñ÷åò÷èê ðàçìåð áëîêà â áàéòàõ
  236.         xor     ecx,ecx
  237.         mov     CX,[CDBlockSize]
  238.         ; Âû÷èñëèòü ðàçìåð áëîêà â 16-ðàçðÿäíûõ ñëîâàõ
  239.         shr     CX,1 ;ðàçäåëèòü ðàçìåð áëîêà íà 2
  240.         ; Ïðèíÿòü áëîê äàííûõ
  241.         cli
  242.         cld
  243.         rep     insw
  244.         sti
  245.         ; Óñïåøíîå çàâåðøåíèå ïðèåìà äàííûõ
  246.         jmp @@End_8
  247.  
  248. ; Çàïèñàòü êîä îøèáêè
  249. @@Err1_1:
  250.         mov     [DevErrorCode],1
  251.         jmp @@End_8
  252. @@Err6_temp:
  253.         mov     [DevErrorCode],7
  254.         jmp @@End_8
  255. @@Err6:
  256.         mov     [DevErrorCode],6
  257.  
  258. @@End_8:
  259.         popad
  260.         ret
  261.  
  262.  
  263.  
  264. ;***********************************************
  265. ;*  ÏÎÑËÀÒÜ ÓÑÒÐÎÉÑÒÂÓ ATAPI ÏÀÊÅÒÍÓÞ ÊÎÌÀÍÄÓ, *
  266. ;*     ÍÅ ÏÐÅÄÓÑÌÀÒÐÈÂÀÞÙÓÞ ÏÅÐÅÄÀ×È ÄÀÍÍÛÕ    *
  267. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç          *
  268. ;* ãëîáàëüíûå ïåðìåííûå:                       *
  269. ;* ChannelNumber - íîìåð êàíàëà;               *
  270. ;* DiskNumber - íîìåð äèñêà íà êàíàëå;         *
  271. ;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò. *
  272. ;***********************************************
  273. SendPacketNoDatCommand:
  274.         pushad
  275. ; Çàäàòü ðåæèì CHS
  276.         mov     [ATAAddressMode],0
  277. ; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû
  278.         mov     [ATAFeatures],0
  279.         mov     [ATASectorCount],0
  280.         mov     [ATASectorNumber],0
  281.         mov     [ATACylinder],0
  282.         mov     [ATAHead],0
  283.         mov     [ATACommand],0A0h
  284.         call    SendCommandToHDD_1
  285.         cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
  286.         jne     @@End_9  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
  287. ; Îæèäàíèå ãîòîâíîñòè äèñêîâîäà ê ïðèåìó
  288. ; ïàêåòíîé êîìàíäû
  289.         mov     DX,[ATABasePortAddr]
  290.         add     DX,7   ;ïîðò 1õ7h
  291. @@WaitDevice0_1:
  292.         call    change_task
  293.         ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ
  294.         mov     EAX,[timer_ticks]
  295.         sub     EAX,[TickCounter_1]
  296.         cmp     EAX,BSYWaitTime
  297.         ja      @@Err1_3   ;îøèáêà òàéì-àóòà
  298.         ; Ïðîâåðèòü ãîòîâíîñòü
  299.         in      AL,DX
  300.         test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
  301.         jnz     @@WaitDevice0_1
  302.         test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
  303.         jnz     @@Err6_1
  304.         test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
  305.         jz      @@WaitDevice0_1
  306. ; Ïîñëàòü ïàêåòíóþ êîìàíäó
  307. ;        cli
  308.         mov     DX,[ATABasePortAddr]
  309.         mov     AX,word [PacketCommand]
  310.         out     DX,AX
  311.         mov     AX,word [PacketCommand+2]
  312.         out     DX,AX
  313.         mov     AX,word [PacketCommand+4]
  314.         out     DX,AX
  315.         mov     AX,word [PacketCommand+6]
  316.         out     DX,AX
  317.         mov     AX,word [PacketCommand+8]
  318.         out     DX,AX
  319.         mov     AX,word [PacketCommand+10]
  320.         out     DX,AX
  321. ;        sti
  322. ; Îæèäàíèå ïîäòâåðæäåíèÿ ïðèåìà êîìàíäû
  323.         mov     DX,[ATABasePortAddr]
  324.         add     DX,7   ;ïîðò 1õ7h
  325. @@WaitDevice1_1:
  326.         call    change_task
  327.         ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
  328.         mov     EAX,[timer_ticks]
  329.         sub     EAX,[TickCounter_1]
  330.         cmp     EAX,MaxCDWaitTime
  331.         ja      @@Err1_3   ;îøèáêà òàéì-àóòà
  332.         ; Îæèäàòü îñâîáîæäåíèÿ óñòðîéñòâà
  333.         in      AL,DX
  334.         test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
  335.         jnz     @@WaitDevice1_1
  336.         test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
  337.         jnz     @@Err6_1
  338.         test    AL,40h   ;ñîñòîÿíèå ñèãíàëà DRDY
  339.         jz      @@WaitDevice1_1
  340.         jmp @@End_9
  341.  
  342. ; Çàïèñàòü êîä îøèáêè
  343. @@Err1_3:
  344.         mov     [DevErrorCode],1
  345.         jmp @@End_9
  346. @@Err6_1:
  347.         mov     [DevErrorCode],6
  348. @@End_9:
  349.         popad
  350.         ret
  351.  
  352. ;****************************************************
  353. ;*          ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ         *
  354. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå    *
  355. ;* ïåðåìåííûå:                                      *
  356. ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);          *
  357. ;* DiskNumber - íîìåð äèñêà (0 èëè 1);              *
  358. ;* ATAFeatures - "îñîáåííîñòè";                     *
  359. ;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ;            *
  360. ;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà;      *
  361. ;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà;         *
  362. ;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè;               *
  363. ;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); *
  364. ;* ATACommand - êîä êîìàíäû.                        *
  365. ;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè:              *
  366. ;* â ATABasePortAddr - áàçîâûé àäðåñ HDD;           *
  367. ;* â DevErrorCode - íîëü.                           *
  368. ;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò    *
  369. ;* âîçâðàùåí êîä îøèáêè.                            *
  370. ;****************************************************
  371. SendCommandToHDD_1:
  372.         pushad
  373. ; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà
  374.         cmp     [ATAAddressMode],1
  375.         ja      @@Err2_4
  376. ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
  377.         mov     BX,[ChannelNumber]
  378.         cmp     BX,1
  379.         jb      @@Err3_4
  380.         cmp     BX,2
  381.         ja      @@Err3_4
  382. ; Óñòàíîâèòü áàçîâûé àäðåñ
  383.         dec     BX
  384.         shl     BX,1
  385.         movzx   ebx,bx
  386.         mov     AX,[ebx+StandardATABases]
  387.         mov     [ATABasePortAddr],AX
  388. ; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû
  389.         ; Âûáðàòü íóæíûé äèñê
  390.         mov     DX,[ATABasePortAddr]
  391.         add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
  392.         mov     AL,[DiskNumber]
  393.         cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
  394.         ja      @@Err4_4
  395.         shl     AL,4
  396.         or      AL,10100000b
  397.         out     DX,AL
  398.         ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ
  399.         inc     DX
  400.         mov     eax,[timer_ticks]
  401.         mov     [TickCounter_1],eax
  402.         mov     ecx,NoTickWaitTime
  403. @@WaitHDReady_2:
  404.         cmp    [timer_ticks_enable],0
  405.         jne    @f
  406.         dec    ecx
  407.         cmp    ecx,0
  408.         je     @@Err1_4
  409.         jmp    .test
  410. @@:
  411.         call    change_task
  412.         ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ
  413.         mov     eax,[timer_ticks]
  414.         sub     eax,[TickCounter_1]
  415.         cmp     eax,BSYWaitTime ;300    ;îæèäàòü 3 ñåê.        
  416.         ja      @@Err1_4   ;îøèáêà òàéì-àóòà
  417.         ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíèÿ
  418. .test:
  419.         in      AL,DX
  420.         ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
  421.         test    AL,80h
  422.         jnz     @@WaitHDReady_2
  423.         ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ
  424.         test    AL,08h
  425.         jnz     @@WaitHDReady_2
  426.  
  427. ; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà
  428.         cli
  429.         mov     DX,[ATABasePortAddr]
  430.         inc     DX      ;ðåãèñòð "îñîáåííîñòåé"
  431.         mov     AL,[ATAFeatures]
  432.         out     DX,AL
  433.         inc     DX      ;ñ÷åò÷èê ñåêòîðîâ
  434.         mov     AL,[ATASectorCount]
  435.         out     DX,AL
  436.         inc     DX      ;ðåãèñòð íîìåðà ñåêòîðà
  437.         mov     AL,[ATASectorNumber]
  438.         out     DX,AL
  439.         inc     DX      ;íîìåð öèëèíäðà (ìëàäøèé áàéò)
  440.         mov     AX,[ATACylinder]
  441.         out     DX,AL
  442.         inc     DX      ;íîìåð öèëèíäðà (ñòàðøèé áàéò)
  443.         mov     AL,AH
  444.         out     DX,AL
  445.         inc     DX      ;íîìåð ãîëîâêè/íîìåð äèñêà
  446.         mov     AL,[DiskNumber]
  447.         shl     AL,4
  448.         cmp     [ATAHead],0Fh ;ïðîâåðèòü íîìåð ãîëîâêè
  449.         ja      @@Err5_4
  450.         or      AL,[ATAHead]
  451.         or      AL,10100000b
  452.         mov     AH,[ATAAddressMode]
  453.         shl     AH,6
  454.         or      AL,AH
  455.         out     DX,AL
  456. ; Ïîñëàòü êîìàíäó
  457.         mov     AL,[ATACommand]
  458.         inc     DX      ;ðåãèñòð êîìàíä
  459.         out     DX,AL
  460.         sti
  461. ; Ñáðîñèòü ïðèçíàê îøèáêè
  462.         mov     [DevErrorCode],0
  463.         jmp @@End_10
  464. ; Çàïèñàòü êîä îøèáêè
  465. @@Err1_4:
  466.         mov     [DevErrorCode],1
  467.         jmp @@End_10
  468. @@Err2_4:
  469.         mov     [DevErrorCode],2
  470.         jmp @@End_10
  471. @@Err3_4:
  472.         mov     [DevErrorCode],3
  473.         jmp @@End_10
  474. @@Err4_4:
  475.         mov     [DevErrorCode],4
  476.         jmp @@End_10
  477. @@Err5_4:
  478.         mov     [DevErrorCode],5
  479. ; Çàâåðøåíèå ðàáîòû ïðîãðàììû
  480. @@End_10:
  481. ;        sti
  482.         popad
  483.         ret
  484.        
  485. ;*************************************************
  486. ;*    ÎÆÈÄÀÍÈÅ ÃÎÒÎÂÍÎÑÒÈ ÓÑÒÐÎÉÑÒÂÀ Ê ÐÀÁÎÒÅ    *
  487. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  488. ;* ïåðìåííûå:                                    *
  489. ;* ChannelNumber - íîìåð êàíàëà;                 *
  490. ;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
  491. ;*************************************************
  492. WaitUnitReady:
  493.         pusha
  494. ; Çàïîìíèòü âðåìÿ íà÷àëà îïåðàöèè
  495.         mov     EAX,[timer_ticks]
  496.         mov     [WURStartTime],EAX
  497. ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
  498.         call  clear_packet_buffer
  499. ; Ñôîðìèðîâàòü êîìàíäó TEST UNIT READY
  500.         mov     [PacketCommand],word 00h
  501. ; ÖÈÊË ÎÆÈÄÀÍÈß ÃÎÒÎÂÍÎÑÒÈ ÓÑÒÐÎÉÑÒÂÀ
  502. @@SendCommand:
  503.         ; Ïîäàòü êîìàíäó ïðîâåðêè ãîòîâíîñòè
  504.         call    SendPacketNoDatCommand
  505.         call    change_task
  506.         ; Ïðîâåðèòü êîä îøèáêè
  507.         cmp     [DevErrorCode],0
  508.         je      @@End_11
  509.         ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ ãîòîâíîñòè
  510.         mov     EAX,[timer_ticks]
  511.         sub     EAX,[WURStartTime]
  512.         cmp     EAX,MaxCDWaitTime
  513.         jb      @@SendCommand
  514.         ; Îøèáêà òàéì-àóòà
  515.         mov     [DevErrorCode],1
  516. @@End_11:
  517.         popa
  518.         ret
  519.  
  520.        
  521. ;*************************************************
  522. ;*         ÇÀÃÐÓÇÈÒÜ ÍÎÑÈÒÅËÜ Â ÄÈÑÊÎÂÎÄ         *
  523. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  524. ;* ïåðìåííûå:                                    *
  525. ;* ChannelNumber - íîìåð êàíàëà;                 *
  526. ;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
  527. ;*************************************************
  528. LoadMedium:
  529.         pusha
  530. ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
  531.         call  clear_packet_buffer
  532. ; Ñôîðìèðîâàòü êîìàíäó START/STOP UNIT
  533.         ; Çàäàòü êîä êîìàíäû
  534.         mov     [PacketCommand],word 1Bh
  535.         ; Çàäàòü îïåðàöèþ çàãðóçêè íîñèòåëÿ
  536.         mov     [PacketCommand+4],word 00000011b
  537. ; Ïîäàòü êîìàíäó
  538.         call    SendPacketNoDatCommand
  539.         popa
  540.         ret
  541.  
  542. ;*************************************************
  543. ;*         ÈÇÂËÅ×Ü ÍÎÑÈÒÅËÜ ÈÇ ÄÈÑÊÎÂÎÄÀ         *
  544. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  545. ;* ïåðìåííûå:                                    *
  546. ;* ChannelNumber - íîìåð êàíàëà;                 *
  547. ;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
  548. ;*************************************************
  549. UnloadMedium:
  550.         pusha
  551. ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
  552.         call  clear_packet_buffer
  553. ; Ñôîðìèðîâàòü êîìàíäó START/STOP UNIT
  554.         ; Çàäàòü êîä êîìàíäû
  555.         mov     [PacketCommand],word 1Bh
  556.         ; Çàäàòü îïåðàöèþ èçâëå÷åíèÿ íîñèòåëÿ
  557.         mov     [PacketCommand+4],word 00000010b
  558. ; Ïîäàòü êîìàíäó
  559.         call    SendPacketNoDatCommand
  560.         popa
  561.         ret
  562.  
  563. ;*************************************************
  564. ;* ÎÏÐÅÄÅËÈÒÜ ÎÁÙÅÅ ÊÎËÈ×ÅÑÒÂÎ ÑÅÊÒÎÐΠÍÀ ÄÈÑÊÅ *
  565. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  566. ;* ïåðåìåííûå:                                   *
  567. ;* ChannelNumber - íîìåð êàíàëà;                 *
  568. ;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
  569. ;*************************************************
  570. ReadCapacity:
  571.         pusha
  572. ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
  573.         call  clear_packet_buffer
  574. ; Çàäàòü ðàçìåð áóôåðà â áàéòàõ
  575.         mov     [CDBlockSize],8
  576. ; Ñôîðìèðîâàòü êîìàíäó READ CAPACITY
  577.         mov     [PacketCommand],word 25h
  578. ; Ïîäàòü êîìàíäó
  579.         call    SendPacketDatCommand
  580.         popa
  581.         ret
  582.  
  583. clear_packet_buffer:        
  584. ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû
  585.         mov     [PacketCommand],dword 0
  586.         mov     [PacketCommand+4],dword 0
  587.         mov     [PacketCommand+8],dword 0
  588.         ret
  589.  
  590.