dd88d5bff6
git-svn-id: svn://kolibrios.org@2540 a494cfbc-eb01-0410-851d-a64ba20cac60
395 lines
13 KiB
PHP
395 lines
13 KiB
PHP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; ;;
|
|
;; Copyright (C) KolibriOS team 2004-2011. 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:
|
|
|