#include #include #include extern int32_t ide_read48(uint8_t drive, uint64_t lba, uint8_t sector_count, void* buffer); extern int32_t ide_write48(uint8_t drive, uint64_t lba, uint8_t sector_count, const void* buffer); static uint8_t duckfs_drive = 0; void duckfs_set_drive(uint8_t drive) { duckfs_drive = drive; } int32_t disk_read(uint64_t lba, void* buffer, uint32_t count) { /* IDE spec only allows up to 256 sectors in one call */ while (count > 0) { uint8_t sectors = (count > 256) ? 256 : count; int32_t result = ide_read48(duckfs_drive, lba, sectors, buffer); if (result < 0) { return -1; } lba += sectors; count -= sectors; buffer = (void*)((uintptr_t)buffer + 512 * sectors); } return 0; } int32_t disk_write(uint64_t lba, const void* buffer, uint32_t count) { while (count > 0) { uint8_t sectors = (count > 256) ? 256 : count; int32_t result = ide_write48(duckfs_drive, lba, sectors, buffer); if (result < 0) { return -1; } lba += sectors; count -= sectors; buffer = (const void*)((uintptr_t)buffer + 512 * sectors); } return 0; }