Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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