ВАЖНО: этот код сделает носитель непригодным для использования без форматирования или восстановления.Используйте неиспользованный, пустой или ненужный носитель.
Должно быть прямолинейно реплицировать поведение функций прерывания BIOS, но информация об этом в Интернете является скудной в реальных сценариях использования.Поэтому я написал код для чтения 2,5-дюймовой информации идентификации жесткого диска, которая является функцией int 13h. Я получаю зависание на этапе проверки на бит DRQ (данные готовы для запроса?) Регистра состояния 0x1f7. Когда я комментируюВ цикле check-DRQ код продолжается, но все данные равны 0, возможно потому, что они не были прочитаны. Я пробовал варьировать ведомый и ведущий биты, а также первичную / вторичную шину ... Вторичная шина проходит проверку DRQно данные, кажется, все 1 с. Важно, что int 13h на одном и том же диске и на одной и той же машине работает нормально. Кто-нибудь знает, есть ли способ: a) узнать идеальное местоположение (основной / дополнительный, главный / подчиненный) жесткого дискато есть загрузка, а затем б) проверить его там без чтения из него, и в) выяснить, как вернуть бит DRQ в зеленый цвет? Будет ли регистр ошибок значимым до того, как DRQ выйдет?
Интересно, BIOS показывает3 жестких диска, кроме USB, DVD и LAN, но у меня есть только два слота для жестких дисков, и я никогда не смогу подключить свой жесткий диск, чтобы он был HDD1.zarre.Может ли это быть связано?
Вот мой загрузочный код для чтения с основного мастера жесткого диска ATA с использованием управляющих регистров и для вывода нескольких его байтов на экране в виде двоичных чисел:
[bits 16]
[org 0x7c00]
xor ax, ax
cli
mov dx, 0x1f7
m1:
in al, dx
test al, 010000000b
jnz m1
mov dx, 0x1f6
mov al, 0xE0 ; LBA mode - not needed for this?
out dx,al
mov dx, 0x1f7
m2:
in al, dx
test al, 010000000b ; wait for BSY to be 0
jnz m2
test al, 001000000b ; wait for DRDY to be 1
jz m2
mov dx, 0x1f7
mov al, 0xEC ; identify drive command
out dx, al
mov dx, 0x1f7
m3:
in al, dx
test al, 010000000b
jnz m3
mov dx, 0x1f7
m4:
in al, dx
test al, 000001000b ; this test for DRQ never turns 1
jz m4
mov ax, 0
mov es, ax
mov di, 0x7e00 ;save the identification to 0x7e00
mov dx, 0x1f0
mov cx, 256
rep insw
mov ax, 0xb800 ; display in table of binary bytes
mov es, ax
mov di, 0
mov ax, 0
mov ds, ax
mov si, 0x7e00 ;starting RAM address to read
mov cx, 0
mov dl, 20 ;how many lines to print
morelines:
mov bh, 7 ;how many bytes per line
morebytes:
mov ah, [ds:si]
mov bl, 8 ;counter for bits of each byte to print
morebits:
shl ah, 1
mov al, 48
jnc zero
mov al, 49
zero:
mov [es:di], al
inc di
inc di
dec bl
jnz morebits
mov al, 32
mov [es:di], al
inc di
inc di
inc si
dec bh
jnz morebytes
add cx, 80*2
mov di, cx
dec dl
jnz morelines
times 510 - ($ - $$) db 0
dw 0xaa55