re,
exemple en Nasm: ici, je lit le registre de status, je l'affiche, j'envoi une commande NOP au controleur et je réaffiche les status lus apres jusqu'a !BUSY
apparement, si aucun disque n'est attaché au controleur, il repond 0x20 ou 0x00 ( peut etre suivant MASTER/SLAVE ) faut que je teste avec différentes positions MASTER/SLAVE et différentes combinaisons.
je préfererai gagner du temps avec un algo fiable.
( dans le cadre d'un boot en 32 bits )
PRIVATE ideTrace:;(devid) LOCALBEGIN pushb 0 pushb 0
%define lbuf pd[ebp-4] %define lstat pd[ebp-8]
This ebx sub esp,128 mov lbuf,esp
mov eax,__param(0) lea esi,[ebx+CZONE] mov edi,[ebx+eax*4+DISK.IDE.dev] lea edi,[edi+ebx]
xor eax,eax movzx edx,word [edi+IDEPARM.iobase] lea edx,[edx+IDEREG_ALTST] in al,dx mov lstat,eax
lea edx,[ebx+IDESTR.fmtB] call printf,lbuf,edx,lstat mov eax,lbuf call StaticPrint
mov eax,lstat inc al je .3 movzx edx,word [edi+IDEPARM.iobase] mov al,(CB_DC_HD15+CB_DC_NIEN) lea edx,[edx+IDEREG_ALTST] out dx,al
movzx edx,word [edi+IDEPARM.iobase] mov al,[esi+IDEPARM.drive] lea edx,[edx+IDEREG_DSEL] out dx,al
movzx edx,word [edi+IDEPARM.iobase] mov al,IDECMD_NOP lea edx,[edx+IDEREG_CMD] out dx,al
IODELAY 50
.1 movzx edx,word [edi+IDEPARM.iobase] xor eax,eax lea edx,[edx+IDEREG_ALTST] in al,dx cmp eax,lstat mov lstat,eax je .2 lea edx,[ebx+IDESTR.fmtB] call printf,lbuf,edx,lstat mov eax,lbuf call StaticPrint .2 test lstat,IDEST_BSY jne .1
.3 LOCALEND ret
voilà, j'espère que c plus clair ( pas d'API ici car c'est moi qui doit la faire : )
@++
|