;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $Revision$ ;****************************************************** ; ïîèñê ïðèâîäîâ HDD è CD ; àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷. ; àäàïòàöèÿ è äîðàáîòêà Mario79 ;****************************************************** ;**************************************************** ;* ÏÎÈÑÊ HDD è CD * ;**************************************************** FindHDD: mov [ChannelNumber],1 mov [DiskNumber],0 call FindHDD_3 ; mov ax,[Sector512+176] ; mov [DRIVE_DATA+6],ax ; mov ax,[Sector512+126] ; mov [DRIVE_DATA+8],ax ; mov ax,[Sector512+128] ; mov [DRIVE_DATA+8],ax mov [DiskNumber],1 call FindHDD_3 ; mov al,[Sector512+176] ; mov [DRIVE_DATA+7],al inc [ChannelNumber] mov [DiskNumber],0 call FindHDD_3 ; mov al,[Sector512+176] ; mov [DRIVE_DATA+8],al mov [DiskNumber],1 call FindHDD_1 ; mov al,[Sector512+176] ; mov [DRIVE_DATA+9],al jmp EndFindHDD FindHDD_1: call ReadHDD_ID cmp [DevErrorCode],0 jne FindHDD_2 cmp [Sector512+6],word 16 ja FindHDD_2 cmp [Sector512+12],word 255 ja FindHDD_2 inc byte [DRIVE_DATA+1] jmp FindHDD_2_2 FindHDD_2: call DeviceReset cmp [DevErrorCode],0 jne FindHDD_2_2 call ReadCD_ID cmp [DevErrorCode],0 jne FindHDD_2_2 inc byte [DRIVE_DATA+1] inc byte [DRIVE_DATA+1] FindHDD_2_2: ret FindHDD_3: call FindHDD_1 shl byte [DRIVE_DATA+1],2 ret ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà â ðåæèìå LBA uglobal SectorAddress DD ? endg ;************************************************* ;* ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÆÅÑÒÊÎÃÎ ÄÈÑÊÀ * ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * ;* ïåðåìåííûå: * ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * ;* DiskNumber - íîìåð äèñêà íà êàíàëå (0 èëè 1). * ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ * ;* â ìàññèâ Sector512. * ;************************************************* ReadHDD_ID: ; Çàäàòü ðåæèì CHS mov [ATAAddressMode],0 ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà mov [ATAFeatures],0 mov [ATAHead],0 mov [ATACommand],0ECh call SendCommandToHDD cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè jne @@End ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè mov DX,[ATABasePortAddr] add DX,7 ;àäðåñ ðåãèñòðà ñîñòîÿíè mov ecx,0xffff @@WaitCompleet: ; Ïðîâåðèòü âðåìÿ âûïîëíåíèÿ êîìàíäû dec ecx ; cmp ecx,0 jz @@Error1 ;îøèáêà òàéì-àóòà ; Ïðîâåðèòü ãîòîâíîñòü in AL,DX test AL,80h ;ñîñòîÿíèå ñèãíàëà BSY jnz @@WaitCompleet test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR jnz @@Error6 test AL,08h ;ñîñòîÿíèå ñèãíàëà DRQ jz @@WaitCompleet ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà ; mov AX,DS ; mov ES,AX mov EDI,Sector512 ;offset Sector512 mov DX,[ATABasePortAddr] ;ðåãèñòð äàííûõ mov CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ rep insw ;ïðèíÿòü áëîê äàííûõ ret ; Çàïèñàòü êîä îøèáêè @@Error1: mov [DevErrorCode],1 ret @@Error6: mov [DevErrorCode],6 @@End: ret iglobal ; Ñòàíäàðòíûå áàçîâûå àäðåñà êàíàëîâ 1 è 2 StandardATABases DW 1F0h, 170h endg uglobal ; Íîìåð êàíàëà ChannelNumber DW ? ; Íîìåð äèñêà DiskNumber DB ? ; Áàçîâûé àäðåñ ãðóïïû ïîðòîâ êîíòðîëëåðà ATA ATABasePortAddr DW ? ; Ïàðàìåòðû ATA-êîìàíäû ATAFeatures DB ? ;îñîáåííîñòè ATASectorCount DB ? ;êîëè÷åñòâî îáðàáàòûâàåìûõ ñåêòîðîâ ATASectorNumber DB ? ;íîìåð íà÷àëüíîãî ñåêòîðà ATACylinder DW ? ;íîìåð íà÷àëüíîãî öèëèíäðà ATAHead DB ? ;íîìåð íà÷àëüíîé ãîëîâêè ATAAddressMode DB ? ;ðåæèì àäðåñàöèè (0 - CHS, 1 - LBA) ATACommand DB ? ;êîä êîìàíäû, ïîäëåæàùåé âûïîëíåíèþ ; Êîä îøèáêè (0 - íåò îøèáîê, 1 - ïðåâûøåí äîïóñòèìûé ; èíòåðâàë îæèäàíèÿ, 2 - íåâåðíûé êîä ðåæèìà àäðåñàöèè, ; 3 - íåâåðíûé íîìåð êàíàëà, 4 - íåâåðíûé íîìåð äèñêà, ; 5 - íåâåðíûé íîìåð ãîëîâêè, 6 - îøèáêà ïðè âûïîëíåíèè ; êîìàíäû) DevErrorCode dd ? endg ;**************************************************** ;* ÏÎÑËÀÒÜ ÊÎÌÀÍÄÓ ÇÀÄÀÍÍÎÌÓ ÄÈÑÊÓ * ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * ;* ïåðåìåííûå: * ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * ;* DiskNumber - íîìåð äèñêà (0 èëè 1); * ;* ATAFeatures - "îñîáåííîñòè"; * ;* ATASectorCount - êîëè÷åñòâî ñåêòîðîâ; * ;* ATASectorNumber - íîìåð íà÷àëüíîãî ñåêòîðà; * ;* ATACylinder - íîìåð íà÷àëüíîãî öèëèíäðà; * ;* ATAHead - íîìåð íà÷àëüíîé ãîëîâêè; * ;* ATAAddressMode - ðåæèì àäðåñàöèè (0-CHS, 1-LBA); * ;* ATACommand - êîä êîìàíäû. * ;* Ïîñëå óñïåøíîãî âûïîëíåíèÿ ôóíêöèè: * ;* â ATABasePortAddr - áàçîâûé àäðåñ HDD; * ;* â DevErrorCode - íîëü. * ;* Ïðè âîçíèêíîâåíèè îøèáêè â DevErrorCode áóäåò * ;* âîçâðàùåí êîä îøèáêè. * ;**************************************************** SendCommandToHDD: ; Ïðîâåðèòü çíà÷åíèå êîäà ðåæèìà cmp [ATAAddressMode],1 ja @@Err2 ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà mov BX,[ChannelNumber] cmp BX,1 jb @@Err3 cmp BX,2 ja @@Err3 ; Óñòàíîâèòü áàçîâûé àäðåñ dec BX shl BX,1 movzx ebx,bx mov AX,[ebx+StandardATABases] mov [ATABasePortAddr],AX ; Îæèäàíèå ãîòîâíîñòè HDD ê ïðèåìó êîìàíäû ; Âûáðàòü íóæíûé äèñê mov DX,[ATABasePortAddr] add DX,6 ;àäðåñ ðåãèñòðà ãîëîâîê mov AL,[DiskNumber] cmp AL,1 ;ïðîâåðèòü íîìåðà äèñêà ja @@Err4 shl AL,4 or AL,10100000b out DX,AL ; Îæèäàòü, ïîêà äèñê íå áóäåò ãîòîâ inc DX mov ecx,0xfff ; mov eax,[timer_ticks] ; mov [TickCounter_1],eax @@WaitHDReady: ; Ïðîâåðèòü âðåìÿ îæèäàíè dec ecx ; cmp ecx,0 jz @@Err1 ; mov eax,[timer_ticks] ; sub eax,[TickCounter_1] ; cmp eax,300 ;îæèäàòü 300 òèêîâ ; ja @@Err1 ;îøèáêà òàéì-àóòà ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè in AL,DX ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY test AL,80h jnz @@WaitHDReady ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà DRQ test AL,08h jnz @@WaitHDReady ; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà cli mov DX,[ATABasePortAddr] inc DX ;ðåãèñòð "îñîáåííîñòåé" mov AL,[ATAFeatures] out DX,AL inc DX ;ñ÷åò÷èê ñåêòîðîâ mov AL,[ATASectorCount] out DX,AL inc DX ;ðåãèñòð íîìåðà ñåêòîðà mov AL,[ATASectorNumber] out DX,AL inc DX ;íîìåð öèëèíäðà (ìëàäøèé áàéò) mov AX,[ATACylinder] out DX,AL inc DX ;íîìåð öèëèíäðà (ñòàðøèé áàéò) mov AL,AH out DX,AL inc DX ;íîìåð ãîëîâêè/íîìåð äèñêà mov AL,[DiskNumber] shl AL,4 cmp [ATAHead],0Fh ;ïðîâåðèòü íîìåð ãîëîâêè ja @@Err5 or AL,[ATAHead] or AL,10100000b mov AH,[ATAAddressMode] shl AH,6 or AL,AH out DX,AL ; Ïîñëàòü êîìàíäó mov AL,[ATACommand] inc DX ;ðåãèñòð êîìàíä out DX,AL sti ; Ñáðîñèòü ïðèçíàê îøèáêè mov [DevErrorCode],0 ret ; Çàïèñàòü êîä îøèáêè @@Err1: mov [DevErrorCode],1 ret @@Err2: mov [DevErrorCode],2 ret @@Err3: mov [DevErrorCode],3 ret @@Err4: mov [DevErrorCode],4 ret @@Err5: mov [DevErrorCode],5 ; Çàâåðøåíèå ðàáîòû ïðîãðàììû ret ;************************************************* ;* ×ÒÅÍÈÅ ÈÄÅÍÒÈÔÈÊÀÒÎÐÀ ÓÑÒÐÎÉÑÒÂÀ ATAPI * ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * ;* ïåðìåííûå: * ;* ChannelNumber - íîìåð êàíàëà; * ;* DiskNumber - íîìåð äèñêà íà êàíàëå. * ;* Èäåíòèôèêàöèîííûé áëîê äàííûõ ñ÷èòûâàåòñÿ * ;* â ìàññèâ Sector512. * ;************************************************* ReadCD_ID: ; Çàäàòü ðåæèì CHS mov [ATAAddressMode],0 ; Ïîñëàòü êîìàíäó èäåíòèôèêàöèè óñòðîéñòâà mov [ATAFeatures],0 mov [ATASectorCount],0 mov [ATASectorNumber],0 mov [ATACylinder],0 mov [ATAHead],0 mov [ATACommand],0A1h call SendCommandToHDD cmp [DevErrorCode],0 ;ïðîâåðèòü êîä îøèáêè jne @@End_1 ;çàêîí÷èòü, ñîõðàíèâ êîä îøèáêè ; Îæèäàòü ãîòîâíîñòü äàííûõ HDD mov DX,[ATABasePortAddr] add DX,7 ;ïîðò 1õ7h mov ecx,0xffff @@WaitCompleet_1: ; Ïðîâåðèòü âðåì dec ecx ; cmp ecx,0 jz @@Error1_1 ;îøèáêà òàéì-àóòà ; Ïðîâåðèòü ãîòîâíîñòü in AL,DX test AL,80h ;ñîñòîÿíèå ñèãíàëà BSY jnz @@WaitCompleet_1 test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR jnz @@Error6_1 test AL,08h ;ñîñòîÿíèå ñèãíàëà DRQ jz @@WaitCompleet_1 ; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà ; mov AX,DS ; mov ES,AX mov EDI,Sector512 ;offset Sector512 mov DX,[ATABasePortAddr] ;ïîðò 1x0h mov CX,256 ;÷èñëî ñ÷èòûâàåìûõ ñëîâ rep insw ret ; Çàïèñàòü êîä îøèáêè @@Error1_1: mov [DevErrorCode],1 ret @@Error6_1: mov [DevErrorCode],6 @@End_1: ret ;************************************************* ;* ÑÁÐÎÑ ÓÑÒÐÎÉÑÒÂÀ * ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * ;* ïåðåìåííûå: * ;* ChannelNumber - íîìåð êàíàëà (1 èëè 2); * ;* DiskNumber - íîìåð äèñêà (0 èëè 1). * ;************************************************* DeviceReset: ; Ïðîâåðèòü êîððåêòíîñòü íîìåðà êàíàëà mov BX,[ChannelNumber] cmp BX,1 jb @@Err3_2 cmp BX,2 ja @@Err3_2 ; Óñòàíîâèòü áàçîâûé àäðåñ dec BX shl BX,1 movzx ebx,bx mov DX,[ebx+StandardATABases] mov [ATABasePortAddr],DX ; Âûáðàòü íóæíûé äèñê add DX,6 ;àäðåñ ðåãèñòðà ãîëîâîê mov AL,[DiskNumber] cmp AL,1 ;ïðîâåðèòü íîìåðà äèñêà ja @@Err4_2 shl AL,4 or AL,10100000b out DX,AL ; Ïîñëàòü êîìàíäó "Ñáðîñ" mov AL,08h inc DX ;ðåãèñòð êîìàíä out DX,AL mov ecx,0x80000 @@WaitHDReady_1: ; Ïðîâåðèòü âðåìÿ îæèäàíè dec ecx ; cmp ecx,0 je @@Err1_2 ;îøèáêà òàéì-àóòà ; Ïðî÷èòàòü ðåãèñòð ñîñòîÿíè in AL,DX ; Ïðîâåðèòü ñîñòîÿíèå ñèãíàëà BSY test AL,80h jnz @@WaitHDReady_1 ; Ñáðîñèòü ïðèçíàê îøèáêè mov [DevErrorCode],0 ret ; Îáðàáîòêà îøèáîê @@Err1_2: mov [DevErrorCode],1 ret @@Err3_2: mov [DevErrorCode],3 ret @@Err4_2: mov [DevErrorCode],4 ; Çàïèñàòü êîä îøèáêè ret EndFindHDD: