#include "drivers/atapi/ata.h" .code32 .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