· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ELECTRONICS —› АТА-команды

Посл.отвђт Сообщенiе


Дата: Май 5, 2004 19:11:33

Ув. коллеги! Может быть у кого-то из вас есть опыт работы с командой "identify device"? Я не совсем понимаю как и куда идёт читывание слов паспорта харда после выполнения этой команды...


Дата: Май 7, 2004 06:09:04

на вот, писал когда то , на заре своей программерской деятельности, в edi запихаешь адрес двухкилобайтного буфера, и это код вывалит тебе пассорта 4 возможных ата устройств, по два на канал, если устройства нет, то получишь нули, прошу прощеня за комментарии перекодить некада, писал под досом, если чё не так, читай исходник, разбирайся, я помню, что он чётко работал.


.586P
;***************** à®æ¥¤ãàë ¤«ï à ¡®âë á ¦ñá⪨¬ ¤¨áª®¬ ******************
GetDiskInfoEx proc ; edi - ¯®«ì§®¢ â¥«ì᪨© ¡ãää¥à
mov S_Buffer,edi
add edi,4 ; 㢥«¨ç¨¢ ¥¬  ¤à¥á ¡ãä¥à  ¤«ï ¨¤¥­â¨ä¨ª â®à®¢
mov eax,1 ; ª ­ « 1
mov ebx,0 ; ãáâனá⢮ 0
call GetDiskInfo
cmp ebx,0 ; ®¯¥à æ¨ï 㤠筠 ?
jz @@Disk1_ok
mov eax,S_buffer
mov byte ptr [eax],0ffh ; ­¥ã¤ ç­®¥ ®¯à¥¤¥«¥­¨¥ ¢¨­ç¥áâ¥à 
jmp @@Disk2_id
@@Disk1_ok:
mov eax,S_buffer
mov byte ptr [eax],1 ; 㤠筮¥ ®¯à¥¤¥«¥­¨¥ ¢¨­ç¥áâ¥à 
@@Disk2_id:
mov edi,S_Buffer
add edi,516
mov eax,1 ; ª ­ « 1
mov ebx,1 ; ãáâனá⢮ 1
call GetDiskInfo
cmp ebx,0
jz @@Disk2_ok
mov eax,S_Buffer
inc eax
mov byte ptr [eax],0ffh
jmp @@Disk3_id
@@Disk2_ok:
mov eax,S_Buffer
inc eax
mov byte ptr [eax],1
@@Disk3_id:
mov edi,s_buffer
add edi,516+512
mov eax,2 ; ª ­ « 2
mov ebx,0 ; ãáâனá⢮ 0
call GetDiskInfo
cmp ebx,0
jz @@Disk3_ok
mov eax,S_Buffer
inc eax
inc eax
mov byte ptr [eax],0ffh
jmp @@Disk4_id
@@Disk3_ok:
mov eax,S_Buffer
inc eax
inc eax
mov byte ptr [eax],1
@@Disk4_id:
mov edi,s_buffer
add edi,516+1024
mov eax,2 ; ª ­ « 2
mov ebx,1 ; ãáâனá⢮ 1
call GetDiskInfo
cmp ebx,0
jz @@Disk4_ok
mov eax,S_Buffer
add eax,3
mov byte ptr [eax],0ffh
jmp @@All_Detected
@@Disk4_ok:
mov eax,S_Buffer
add eax,3
mov byte ptr [eax],1
@@All_Detected:
ret

S_Buffer dd 0 ;  ¤à¥á ¡ãä¥à 

GetDiskInfoEx endp

GetDiskInfo proc
; ¯®«ãç¨âì ¯ á¯®àâ IDE ATA ¢¨­ç¥áâ¥à 
Chanel_1_Data_Register equ 1f0h
Chanel_1_State_Register equ 1f6h
Chanel_1_Command_Register equ 1f7h

Chanel_2_Data_Register equ 170h
Chanel_2_State_Register equ 176h
Chanel_2_Command_Register equ 177h

; ‚›‡Ž‚:
; eax - ­®¬¥à ª ­ « 
; ebx - ­®¬¥à ãáâனá⢠
; edi -  ¤à¥á ¡ãä¥à 
; ‚އ‚€’:
; eax - ª®¤ ®è¨¡ª¨ (0 - ¢áñ ¢ ¯®à浪¥ 1 - ãáâனá⢮ § ­ïâ®
; 3 - ª ­ « § ­ïâ 4 - ãáâனá⢮ ®âáãâáâ¢ã¥â
; 5- ­¥¢®§¬®¦­® ¯à¨­ïâì ¤ ­­ë¥ )
; ebx = 0 - ãáâனá⢮ ¨¤¥­â¨ä¨æ¨à®¢ ­®
; ebx = 1 - ãáâனá⢮ ®âáãâáâ¢ã¥â «¨¡® ­¥¨á¯à ¢­®
; ¨§¬¥­ï¥â eax,ebx
pushad
pushfd

mov ecx,3000
@@Try_:
push ecx
call @@Get_Info
pop ecx
cmp eax,0
jz _OK
loop @@Try_
mov _eax,eax
popfd
popad
mov eax,_eax
mov ebx,1
ret

_OK:
popfd
popad ; ®¯¥à æ¨ï ¯à®è«  ãᯥ譮
xor eax,eax ; ax = 0
mov ebx,eax ; bx = 0
ret
_eax dd 0
@@Get_Info:
pushad
pushfd
cli
cmp eax,2
jz @@Chanel_2
mov dx, Chanel_1_Command_Register ;7
jmp @@Sel_Dev
@@Chanel_2:
mov dx, Chanel_2_Command_Register ;7
@@Sel_Dev:
;**** ¯à®¢¥à¨¬ § ­ïâ®áâì ª ­ «  (500 à §)
mov ecx,5000
@@Bsy_Chanel:
in al,dx
and al, 10000000b ; bsy bit
cmp al,10000000b
jnz @@Chanel_Free ; ª ­ « § ­ïâ ?
loop @@Bsy_Chanel
popfd
popad
mov eax,3 ; „ , ª ­ « § ­ïâ, ¢ë室¨¬
ret

@@Chanel_Free: ; Š ­ « ᢮¡®¤¥­

dec dx ;6 ; ãáâ ­®¢¨âì ­®¬¥à ãáâனá⢠ ­  ª ­ «¥
in al,dx
cmp ebx,0
jnz @@SetSlave
and al,11101111b ; ãáâனá⢮ Master
jmp @@Dev_Selected
@@SetSlave:
or al,00010000b ; ãáâனá⢮ Slave
@@Dev_Selected:
out dx,al

mov ecx,5000 ; ®¯à®á § ­ïâ®á⨠ãáâனá⢠ 500 à §
@@Bsy_Device:
inc dx ;7
in al,dx
and al,00000001b ; Žè¨¡ª  ?
cmp al, 1
jz @@Error_State
jmp @@No_Error
@@Error_State:
dec dx ;6
in al,dx
and al,4
cmp al, 4 ;  ¢ à¨©­®¥ § ¢¥à襭¨¥ ª®¬ ­¤ë
je @@No_Device
popfd
popad
mov eax,1 ; ãáâனá⢮ § ­ïâ®
ret
@@No_Device:
popfd
popad
mov eax,4 ; ãáâனá⢮ ®âáãâáâ¢ã¥â
ret

@@No_Error:
in al,dx
and al, 11000000b
cmp al,01000000b
je @@Free_Device
loop @@Bsy_Device
popfd
popad
mov ax,1 ; ãáâனá⢮ § ­ïâ®
ret

@@Free_Device: ; ãáâனá⢮ ᢮¡®¤­® ¨ ¦¤ñâ ª®¬ ­¤ã

mov al, 0ech ; ECH - ¯®«ãç¨âì ¯ á¯®àâ ¤¨áª 
out dx,al ;7
mov ecx,0ffffh
@@Try_Get_Data: ; ®¦¨¤ âì £®â®¢­®áâì ãáâனá⢠
in al,dx
and al,00001000b
cmp al,00001000b
jz @@Ready_Data
loop @@Try_Get_Data

popfd
popad
mov eax,5 ; ¥¢®§¬®¦­® ¯à¨­ïâì ¤ ­­ë¥
ret

@@Ready_Data: ; ãáâனá⢮ £®â®¢® ¢ë¤ âì ¤ ­­ë¥
mov ecx,256 ; ª®«-¢® ¡ ©â/2, â.ª.ç¨â ¥¬ ;á«®¢ ¬¨
sub dx, 7 ; ®àâ ¤ ­­ëå (1x0)

rep insw ; ¯®¢â®à¨âì CX à §

popfd
popad
mov eax,0 ; ®è¨¡®ª ­¥â
ret
GetDiskInfo endp


Дата: Май 7, 2004 11:20:06

Спасибо, попоробую разобраться... а насчёт коментариев - может просто выложите этот исходник в виде файла на форуме, я бы его в досе и прочёл бы, а то без коментариев - как без рук...


Дата: Май 8, 2004 03:11:32

Nos
А чего, кодировку сконвертировать нельзя? Я, будучи очень хреновым программистом(еще в школе), написал на QB такую утилиту за минуты. Да к тому же их сейчас в инете завались: выбирай - не хочу...


Дата: Май 9, 2004 13:15:48

Йопт !!!! еле нащёл.

_989644024__HDDRIVE.rar


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.045