CoolPotOS/driver/disk.c

60 lines
1.6 KiB
C
Raw Normal View History

2024-04-09 23:46:56 +08:00
#include "../include/disk.h"
#include "../include/io.h"
void wait_disk_ready() {
while (1) {
int data = io_in8(0x1f7);
if ((data & 0x88) == 0x08) // 第3位为1表示硬盘控制器已准备好数据传输第7位为1表示硬盘忙。
{
return;
}
}
}
void select_sector(int lba) {
io_out8(0x1f2, 1);
io_out8(0x1f3, lba);
io_out8(0x1f4, lba >> 8);
io_out8(0x1f5, lba >> 16);
io_out8(0x1f6, (((lba >> 24) & 0x0f) | 0xe0));
}
void read_disk_one_sector(int lba, unsigned int memory_addrress) {
while (io_in8(0x1f7) & 0x80);
select_sector(lba);
io_out8(0x1f7, 0x20);
wait_disk_ready();
for (int i = 0; i < 256; i++) {
short data = (short) io_in16(0x1f0);
*((short *) memory_addrress) = data;
memory_addrress += 2;
}
}
void write_disk_one_sertor(int lba, unsigned int memory_addrress) {
while (io_in8(0x1f7) & 0x80);
select_sector(lba);
io_out8(0x1f7, 0x30);
wait_disk_ready();
for (int i = 0; i < 256; i++) {
short data = *((short *) memory_addrress);
io_out16(0x1f0, data);
memory_addrress += 2;
}
}
void read_disk(int lba, int sector_count, unsigned int memory_addrress) {
for (int i = 0; i < sector_count; i++) {
read_disk_one_sector(lba, memory_addrress);
lba++;
memory_addrress += 512;
}
}
void write_disk(int lba, int sector_count, unsigned int memory_addrress) {
for (int i = 0; i < sector_count; i++) {
write_disk_one_sertor(lba, memory_addrress);
lba++;
memory_addrress += 512;
}
}