Код:
mov dx, [basePort]
add dx, 6
mov al, [device]
shl al, 4
or al, 10100000b
out dx, al
inc dx
mov ecx, 0xFF
.WaitHDDReady:
dec ecx
je $
in al, dx
inc word [0xB8000+158]
test al, 80h
jnz .WaitHDDReady
mov al, 0xEC
out dx, al
jmp short $+2
jmp short $+2
mov ecx, 0xFF
.WaitHDDReady1:
dec ecx
je $
in al, dx
inc word [0xB8000+158*2]
test al, 80h
jnz .WaitHDDReady1
mov dx, [basePort]
mov edi, buf
mov ecx, 256
rep insw
mov esi, buf
mov edi, esi
mov ecx, 256
@@:
lodsw
xchg al, ah
stosw
loop @b
mov ax, word[buf+80*2] //80-е слово (адрес 160) содержит версию ATA/ATAPI
mov edi, buf
call convertAX
xor al, al
stosb
mov edi, 0xB8000+160*4
mov esi, buf
call showMessage
jmp $
этот код выводит мне
борщ: 0x7E00
вмваря: 0х1Е00
qemu: 0хF000
виртуалбокс через раз выводи 0х7Е00, иногда висне. что самое интересное так это то, что все виртуалки при сбросе девайся шлют прерывание, а бокс нет. в итоге я не могу расшифровать версию ATA/ATAPI. судя по коду так виртуалка вообще ни один стандарт не поддерживает