Subversion Repositories Kolibri OS

Rev

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

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