| 50 | |
| 51 | |
| 52 | int DetectDrive(int port, int drive){ |
| 53 | WriteRegister(port, ATA_REGISTER_DRIVE_HEAD, 0xa0 | (drive << 4)); // Drive |
| 54 | |
| 55 | for(int i = 0; i < 4; i++) inportb(controlPort0); |
| 56 | |
| 57 | WriteRegister(port, ATA_REGISTER_SECTOR_COUNT, 0); |
| 58 | WriteRegister(port, ATA_REGISTER_LBA_LOW, 0); |
| 59 | WriteRegister(port, ATA_REGISTER_LBA_MID, 0); |
| 60 | WriteRegister(port, ATA_REGISTER_LBA_HIGH, 0); |
| 61 | |
| 62 | WriteRegister(port, ATA_REGISTER_COMMAND, ATA_CMD_IDENTIFY); // Identify |
| 63 | |
| 64 | Timer::Wait(1); |
| 65 | |
| 66 | if(!ReadRegister(port, ATA_REGISTER_STATUS)){ |
| 67 | return 0; |
| 68 | } |
| 69 | |
| 70 | { |
| 71 | int timer = 0xFFFFFF; |
| 72 | while(timer--){ |
| 73 | uint8_t status = ReadRegister(port, ATA_REGISTER_STATUS); |
| 74 | if(status & ATA_DEV_ERR) { |
| 75 | return 0; |
| 76 | } |
| 77 | if(!(status & ATA_DEV_BUSY) && status & ATA_DEV_DRQ) goto c1; |
| 78 | } |
| 79 | return 0; |
| 80 | } |
| 81 | |
| 82 | c1: |
| 83 | if(ReadRegister(port, ATA_REGISTER_LBA_MID) || ReadRegister(port, ATA_REGISTER_LBA_HIGH)) return 0; |
| 84 | |
| 85 | int timer2 = 0xFFFFFF; |
| 86 | while(timer2--){ |
| 87 | uint8_t status = ReadRegister(port, ATA_REGISTER_STATUS); |
| 88 | if((status & ATA_DEV_ERR)) return 0; |
| 89 | if((status & ATA_DEV_DRQ)) return 1; |
| 90 | } |
| 91 | return 0; |
| 92 | } |
| 93 | |
| 94 | void IRQHandler(regs64_t* r){ |
| 95 | Log::Info("Disk IRQ"); |
no test coverage detected