Subversion Repositories Kolibri OS

Rev

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

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