more ata stuff

This commit is contained in:
2026-06-20 21:02:59 -05:00
parent b384723dbd
commit 0f84acde30
5 changed files with 248 additions and 45 deletions

View File

@@ -2,6 +2,149 @@
.code32
.global ident_drives
ident_drives:
.extern selected_drive_primary
.extern selected_drive_secondary
.global ident_device
ident_device:
push %ebp
mov %esp, %ebp
push %ebx
push %ecx
push %edx
push $0
mov 8(%ebp), %ebx # ebx = bus base address
mov 12(%ebp), %ecx # ecx = drive select mask
# drive select
mov %ebx, %edx
add $IO_DRIVE_SELECT_REG, %edx
mov %cl, %al
outb %al, (%dx)
xor %eax, %eax
# clear sector count and LBA
mov %ebx, %edx
add $IO_SECTOR_COUNT_REG, %edx
outb %al, (%dx)
mov %ebx, %edx
add $IO_LBA_LO_REG, %edx
outb %al, (%dx)
mov %ebx, %edx
add $IO_LBA_MID_REG, %edx
outb %al, (%dx)
mov %ebx, %edx
add $IO_LBA_HI_REG, %edx
outb %al, (%dx)
# send ident
mov %ebx, %edx
add $IO_CMD_REG, %edx
mov $0xEC, %al
outb %al, (%dx)
mov %ebx, %edx
add $IO_STATUS_REG, %edx
inb (%dx), %al
inb (%dx), %al
inb (%dx), %al
inb (%dx), %al
cmp $0xFF, %al
je not_found
test %al, %al
jz not_found
poll_status:
inb (%dx), %al
test $STATUS_REG_BSY, %al
jnz poll_status
check_ata:
mov %ebx, %edx
add $IO_LBA_MID_REG, %edx
inb (%dx), %al
test %al, %al
jnz check_atapi
mov %ebx, %edx
add $IO_LBA_HI_REG, %edx
inb (%dx), %al
test %al, %al
jnz check_atapi
mov $0x01, (%esp)
jmp poll_drq
check_atapi:
# check if atapi device
mov %ebx, %edx
add $IO_LBA_MID_REG, %edx
inb (%dx), %al
cmp $0x14, %al
jne not_found
mov %ebx, %edx
add $IO_LBA_HI_REG, %edx
inb (%dx), %al
cmp $0xEB, %al
jne not_found
is_atapi:
mov $0x02, (%esp)
mov %ebx, %edx
add $IO_CMD_REG, %edx
mov $(ATAPI_CMD_IDENTIFY_PACKET), %al
outb %al, (%dx)
mov %ebx, %edx
add $IO_STATUS_REG, %edx
inb (%dx), %al
inb (%dx), %al
inb (%dx), %al
inb (%dx), %al
1:
inb (%dx), %al
test $STATUS_REG_BSY, %al
jnz 1b
poll_drq:
mov %ebx, %edx
add $IO_STATUS_REG, %edx
inb (%dx), %al
test $STATUS_REG_ERR, %al
jnz error
test $STATUS_REG_DRQ, %al
jz poll_drq
drq_set:
mov %ebx, %edx
add $IO_DATA_REG, %edx
mov 16(%ebp), %edi
mov $256, %ecx
read_data:
inw (%dx), %ax
mov %ax, (%edi)
add $2, %edi
loop read_data
jmp done
not_found:
error:
mov $0x0, (%esp)
done:
pop %eax
pop %edx
pop %ecx
pop %ebx
leave
ret