Subversion Repositories Kolibri OS

Rev

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

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