Subversion Repositories Kolibri OS

Rev

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

  1. ;******************************************************
  2. ; ïîèñê ïðèâîäîâ HDD è CD
  3. ; àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
  4. ; àäàïòàöèÿ è äîðàáîòêà Mario79
  5. ;******************************************************
  6.  
  7. ;****************************************************
  8. ;*                 ÏÎÈÑÊ HDD è CD                   *
  9. ;****************************************************
  10. FindHDD:
  11.         mov     [ChannelNumber],1
  12.         mov     [DiskNumber],0
  13.         call    FindHDD_3
  14. ;        mov     ax,[Sector512+176]
  15. ;        mov     [0x40006],ax
  16. ;        mov     ax,[Sector512+126]
  17. ;        mov     [0x40008],ax
  18. ;        mov     ax,[Sector512+128]
  19. ;        mov     [0x40008],ax
  20.         mov     [DiskNumber],1
  21.         call    FindHDD_3
  22. ;        mov     al,[Sector512+176]
  23. ;        mov     [0x40007],al
  24.         inc     [ChannelNumber]
  25.         mov     [DiskNumber],0
  26.         call    FindHDD_3
  27. ;        mov     al,[Sector512+176]
  28. ;        mov     [0x40008],al
  29.         mov     [DiskNumber],1
  30.         call    FindHDD_1
  31. ;        mov     al,[Sector512+176]
  32. ;        mov     [0x40009],al
  33.        
  34.         jmp     EndFindHDD
  35.  
  36. FindHDD_1:
  37.         call    ReadHDD_ID
  38.         cmp     [DevErrorCode],0
  39.         jne     FindHDD_2
  40.         cmp     [Sector512+6],word 16
  41.         ja      FindHDD_2
  42.         cmp     [Sector512+12],word 255
  43.         ja      FindHDD_2
  44.         inc     byte [0x40001]
  45.         jmp     FindHDD_2_2
  46.    FindHDD_2:
  47.         call    DeviceReset
  48.         cmp     [DevErrorCode],0
  49.         jne     FindHDD_2_2
  50.         call    ReadCD_ID
  51.         cmp     [DevErrorCode],0
  52.         jne      FindHDD_2_2
  53.         inc     byte [0x40001]
  54.         inc     byte [0x40001]
  55.    FindHDD_2_2:
  56.         ret
  57.  
  58. FindHDD_3:
  59.         call    FindHDD_1
  60.         shl     byte [0x40001],2  
  61.         ret
  62.  
  63.  
  64. ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà â ðåæèìå LBA
  65. SectorAddress   DD ?
  66.  
  67. ;*************************************************
  68. ;*     ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÆÅÑÒÊÎÃÎ ÄÈÑÊÀ      *
  69. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  70. ;* ïåðåìåííûå:                                   *
  71. ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);       *
  72. ;* DiskNumber - íîìåð äèñêà íà êàíàëå (0 èëè 1). *
  73. ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ     *
  74. ;* â ìàññèâ Sector512.                           *
  75. ;*************************************************
  76. ReadHDD_ID:
  77. ; Çàäàòü ðåæèì CHS
  78.         mov     [ATAAddressMode],0
  79. ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà
  80.         mov     [ATAFeatures],0
  81.         mov     [ATAHead],0
  82.         mov     [ATACommand],0ECh
  83.         call    SendCommandToHDD
  84.         cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
  85.         jne     @@End  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
  86.         mov     DX,[ATABasePortAddr]
  87.         add     DX,7     ;àäðåñ ðåãèñòðà ñîñòîÿíèÿ
  88.         mov  ecx,0xffff
  89. @@WaitCompleet:
  90.         ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû
  91.         dec  ecx
  92.         cmp  ecx,0
  93.         je     @@Error1   ;îøèáêà òàéì-àóòà
  94.         ; Ïðîâåðèòü ãîòîâíîñòü
  95.         in      AL,DX
  96.         test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
  97.         jnz     @@WaitCompleet
  98.         test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
  99.         jnz     @@Error6
  100.         test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
  101.         jz      @@WaitCompleet
  102. ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
  103. ;        mov     AX,DS
  104. ;        mov     ES,AX
  105.         mov     EDI,Sector512  ;offset Sector512
  106.         mov     DX,[ATABasePortAddr] ;ðåãèñòð äàííûõ
  107.         mov     CX,256   ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
  108.         rep     insw     ;ïðèíÿòü áëîê äàííûõ
  109.         jmp @@End
  110. ; Çàïèñàòü êîä îøèáêè
  111. @@Error1:
  112.         mov     [DevErrorCode],1
  113.         jmp @@End
  114. @@Error6:
  115.         mov     [DevErrorCode],6
  116. @@End:  ret
  117.  
  118.  
  119.  
  120. ; Ñòàíäàðòíûå áàçîâûå àäðåñà êàíàëîâ 1 è 2
  121. StandardATABases DW 1F0h, 170h
  122. ; Íîìåð êàíàëà
  123. ChannelNumber   DW ?
  124. ; Íîìåð äèñêà
  125. DiskNumber      DB ?
  126. ; Áàçîâûé àäðåñ ãðóïïû ïîðòîâ êîíòðîëëåðà ATA
  127. ATABasePortAddr DW ?
  128. ; Ïàðàìåòðû ATA-êîìàíäû
  129. ATAFeatures     DB ? ;îñîáåííîñòè
  130. ATASectorCount  DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ
  131. ATASectorNumber DB ? ;íîìåð íà÷àëüíîãî ñåêòîðà
  132. ATACylinder     DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà
  133. ATAHead         DB ? ;íîìåð íà÷àëüíîé ãîëîâêè
  134. ATAAddressMode  DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA)
  135. ATACommand      DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ
  136. ; Êîä îøèáêè (0 - íåò îøèáîê, 1 - ïðåâûøåí äîïóñòèìûé
  137. ; èíòåðâàë îæèäàíèÿ, 2 - íåâåðíûé êîä ðåæèìà àäðåñàöèè,
  138. ; 3 - íåâåðíûé íîìåð êàíàëà, 4 - íåâåðíûé íîìåð äèñêà,
  139. ; 5 - íåâåðíûé íîìåð ãîëîâêè, 6 - îøèáêà ïðè âûïîëíåíèè
  140. ; êîìàíäû)
  141. DevErrorCode DB ?
  142.  
  143. ;****************************************************
  144. ;*          ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ         *
  145. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå    *
  146. ;* ïåðåìåííûå:                                      *
  147. ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);          *
  148. ;* DiskNumber - íîìåð äèñêà (0 èëè 1);              *
  149. ;* ATAFeatures - "îñîáåííîñòè";                     *
  150. ;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ;            *
  151. ;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà;      *
  152. ;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà;         *
  153. ;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè;               *
  154. ;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); *
  155. ;* ATACommand - êîä êîìàíäû.                        *
  156. ;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè:              *
  157. ;* â ATABasePortAddr - áàçîâûé àäðåñ HDD;           *
  158. ;* â DevErrorCode - íîëü.                           *
  159. ;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò    *
  160. ;* âîçâðàùåí êîä îøèáêè.                            *
  161. ;****************************************************
  162. SendCommandToHDD:
  163. ; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà
  164.         cmp     [ATAAddressMode],1
  165.         ja      @@Err2
  166. ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
  167.         mov     BX,[ChannelNumber]
  168.         cmp     BX,1
  169.         jb      @@Err3
  170.         cmp     BX,2
  171.         ja      @@Err3
  172. ; Óñòàíîâèòü áàçîâûé àäðåñ
  173.         dec     BX
  174.         shl     BX,1
  175.         movzx   ebx,bx
  176.         mov     AX,[ebx+StandardATABases]
  177.         mov     [ATABasePortAddr],AX
  178. ; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû
  179.         ; Âûáðàòü íóæíûé äèñê
  180.         mov     DX,[ATABasePortAddr]
  181.         add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
  182.         mov     AL,[DiskNumber]
  183.         cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
  184.         ja      @@Err4
  185.         shl     AL,4
  186.         or      AL,10100000b
  187.         out     DX,AL
  188.         ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ
  189.         inc     DX
  190.         mov  ecx,0xfff
  191. ;        mov     eax,[timer_ticks]
  192. ;        mov     [TickCounter_1],eax
  193. @@WaitHDReady:
  194.         ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ
  195.         dec  ecx
  196.         cmp  ecx,0
  197.         je     @@Err1
  198. ;        mov     eax,[timer_ticks]
  199. ;        sub     eax,[TickCounter_1]
  200. ;        cmp     eax,300    ;îæèäàòü 300 òèêîâ        
  201. ;        ja      @@Err1   ;îøèáêà òàéì-àóòà
  202.         ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíèÿ
  203.         in      AL,DX
  204.         ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
  205.         test    AL,80h
  206.         jnz     @@WaitHDReady
  207.         ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ
  208.         test    AL,08h
  209.         jnz     @@WaitHDReady
  210. ; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà
  211.         cli
  212.         mov     DX,[ATABasePortAddr]
  213.         inc     DX      ;ðåãèñòð "îñîáåííîñòåé"
  214.         mov     AL,[ATAFeatures]
  215.         out     DX,AL
  216.         inc     DX      ;ñ÷åò÷èê ñåêòîðîâ
  217.         mov     AL,[ATASectorCount]
  218.         out     DX,AL
  219.         inc     DX      ;ðåãèñòð íîìåðà ñåêòîðà
  220.         mov     AL,[ATASectorNumber]
  221.         out     DX,AL
  222.         inc     DX      ;íîìåð öèëèíäðà (ìëàäøèé áàéò)
  223.         mov     AX,[ATACylinder]
  224.         out     DX,AL
  225.         inc     DX      ;íîìåð öèëèíäðà (ñòàðøèé áàéò)
  226.         mov     AL,AH
  227.         out     DX,AL
  228.         inc     DX      ;íîìåð ãîëîâêè/íîìåð äèñêà
  229.         mov     AL,[DiskNumber]
  230.         shl     AL,4
  231.         cmp     [ATAHead],0Fh ;ïðîâåðèòü íîìåð ãîëîâêè
  232.         ja      @@Err5
  233.         or      AL,[ATAHead]
  234.         or      AL,10100000b
  235.         mov     AH,[ATAAddressMode]
  236.         shl     AH,6
  237.         or      AL,AH
  238.         out     DX,AL
  239. ; Ïîñëàòü êîìàíäó
  240.         mov     AL,[ATACommand]
  241.         inc     DX      ;ðåãèñòð êîìàíä
  242.         out     DX,AL
  243.         sti
  244. ; Ñáðîñèòü ïðèçíàê îøèáêè
  245.         mov     [DevErrorCode],0
  246.         jmp @@End_2
  247. ; Çàïèñàòü êîä îøèáêè
  248. @@Err1: mov     [DevErrorCode],1
  249.         jmp @@End_2
  250. @@Err2: mov     [DevErrorCode],2
  251.         jmp @@End_2
  252. @@Err3: mov     [DevErrorCode],3
  253.         jmp @@End_2
  254. @@Err4: mov     [DevErrorCode],4
  255.         jmp @@End_2
  256. @@Err5: mov     [DevErrorCode],5
  257. ; Çàâåðøåíèå ðàáîòû ïðîãðàììû
  258. @@End_2:
  259.         ret
  260.  
  261. ;*************************************************
  262. ;*     ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÓÑÒÐÎÉÑÒÂÀ ATAPI    *
  263. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  264. ;* ïåðìåííûå:                                    *
  265. ;* ChannelNumber - íîìåð êàíàëà;                 *
  266. ;* DiskNumber - íîìåð äèñêà íà êàíàëå.           *
  267. ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ     *
  268. ;* â ìàññèâ Sector512.                           *
  269. ;*************************************************
  270. ReadCD_ID:
  271. ; Çàäàòü ðåæèì CHS
  272.         mov     [ATAAddressMode],0
  273. ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà
  274.         mov     [ATAFeatures],0
  275.         mov     [ATASectorCount],0
  276.         mov     [ATASectorNumber],0
  277.         mov     [ATACylinder],0
  278.         mov     [ATAHead],0
  279.         mov     [ATACommand],0A1h
  280.         call    SendCommandToHDD
  281.         cmp     [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè
  282.         jne     @@End_1  ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè
  283. ; Îæèäàòü ãîòîâíîñòü äàííûõ HDD
  284.         mov     DX,[ATABasePortAddr]
  285.         add     DX,7   ;ïîðò 1õ7h
  286.         mov  ecx,0xffff
  287. @@WaitCompleet_1:
  288.         ; Ïðîâåðèòü âðåìÿ
  289.         dec  ecx
  290.         cmp  ecx,0
  291.         je     @@Error1_1  ;îøèáêà òàéì-àóòà
  292.         ; Ïðîâåðèòü ãîòîâíîñòü
  293.         in      AL,DX
  294.         test    AL,80h   ;ñîñòîÿíèå ñèãíàëà BSY
  295.         jnz     @@WaitCompleet_1
  296.         test    AL,1     ;ñîñòîÿíèå ñèãíàëà ERR
  297.         jnz     @@Error6_1
  298.         test    AL,08h   ;ñîñòîÿíèå ñèãíàëà DRQ
  299.         jz      @@WaitCompleet_1
  300. ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà
  301. ;        mov     AX,DS
  302. ;        mov     ES,AX
  303.         mov     EDI,Sector512  ;offset Sector512
  304.         mov     DX,[ATABasePortAddr] ;ïîðò 1x0h
  305.         mov     CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ
  306.         rep     insw
  307.         jmp @@End_1
  308. ; Çàïèñàòü êîä îøèáêè
  309. @@Error1_1:
  310.         mov     [DevErrorCode],1
  311.         jmp @@End_1
  312. @@Error6_1:
  313.         mov     [DevErrorCode],6
  314. @@End_1:
  315.         ret
  316.  
  317. ;*************************************************
  318. ;*                ÑÁÐÎÑ ÓÑÒÐÎÉÑÒÂÀ               *
  319. ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå *
  320. ;* ïåðåìåííûå:                                   *
  321. ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2);       *
  322. ;* DiskNumber - íîìåð äèñêà (0 èëè 1).           *
  323. ;*************************************************
  324. DeviceReset:
  325. ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà
  326.         mov     BX,[ChannelNumber]
  327.         cmp     BX,1
  328.         jb      @@Err3_2
  329.         cmp     BX,2
  330.         ja      @@Err3_2
  331. ; Óñòàíîâèòü áàçîâûé àäðåñ
  332.         dec     BX
  333.         shl     BX,1
  334.         movzx   ebx,bx
  335.         mov     DX,[ebx+StandardATABases]
  336.         mov     [ATABasePortAddr],DX
  337. ; Âûáðàòü íóæíûé äèñê
  338.         add     DX,6    ;àäðåñ ðåãèñòðà ãîëîâîê
  339.         mov     AL,[DiskNumber]
  340.         cmp     AL,1    ;ïðîâåðèòü íîìåðà äèñêà
  341.         ja      @@Err4_2
  342.         shl     AL,4
  343.         or      AL,10100000b
  344.         out     DX,AL
  345. ; Ïîñëàòü êîìàíäó "Ñáðîñ"
  346.         mov     AL,08h
  347.         inc     DX      ;ðåãèñòð êîìàíä
  348.         out     DX,AL
  349.         mov     ecx,0xffff
  350. @@WaitHDReady_1:
  351.         ; Ïðîâåðèòü âðåìÿ îæèäàíèÿ
  352.         dec     ecx
  353.         cmp     ecx,0
  354.         je      @@Err1_2 ;îøèáêà òàéì-àóòà
  355.         ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíèÿ
  356.         in      AL,DX
  357.         ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY
  358.         test    AL,80h
  359.         jnz     @@WaitHDReady_1
  360. ; Ñáðîñèòü ïðèçíàê îøèáêè
  361.         mov     [DevErrorCode],0
  362.         jmp @@End_3
  363. ; Îáðàáîòêà îøèáîê
  364. @@Err1_2: mov     [DevErrorCode],1
  365.         jmp @@End_3
  366. @@Err3_2: mov     [DevErrorCode],3
  367.         jmp @@End_3
  368. @@Err4_2: mov     [DevErrorCode],4
  369. ; Çàïèñàòü êîä îøèáêè
  370. @@End_3:
  371.         ret
  372.  
  373. EndFindHDD:
  374.  
  375.