51 lines
1.2 KiB
C
51 lines
1.2 KiB
C
#include <fs/duckfs.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
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;
|
|
}
|