Subversion Repositories Kolibri OS

Rev

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

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