Add partition table

This commit is contained in:
Jakob Lechner 2024-12-05 02:19:15 +01:00
parent b871d897c7
commit 22c94f13a2

View file

@ -123,8 +123,29 @@ fn main() -> ! {
let mut storage: [u8; (DISK_BLOCK_SIZE * DISK_BLOCK_NUM) as usize] = [0u8; (DISK_BLOCK_SIZE * DISK_BLOCK_NUM) as usize]; let mut storage: [u8; (DISK_BLOCK_SIZE * DISK_BLOCK_NUM) as usize] = [0u8; (DISK_BLOCK_SIZE * DISK_BLOCK_NUM) as usize];
// Initialize Boot Sector (Block 0) const LBA: u32 = DISK_BLOCK_NUM - 1;
storage[0x000..0x03E].copy_from_slice(&[ let (last_cyl, last_head, last_sect) = {
const HPC: u32 = 16;
const SPT: u32 = 63;
(
LBA / (HPC * SPT),
(LBA / SPT) % HPC,
(LBA % SPT) + 1
)
};
storage[0x1B8..0x1BC].copy_from_slice(&[0xEF, 0xBE, 0xAD, 0xDE]);
storage[0x1BE..0x1C3].copy_from_slice(&[0x00, 0x00, 0x02, 0x00, 0x01]);
storage[0x1C3] = last_head as u8;
storage[0x1C4] = ((last_cyl >> 8) & 0xc0) as u8 | ((last_sect as u8) & 0x3f);
storage[0x1C5] = last_cyl as u8;
storage[0x1C6..0x1CA].copy_from_slice(&[0x01, 0x00, 0x00, 0x00]); // LBA of first absolute sector in the partition
storage[0x1CA] = LBA as u8;
storage[0x1CB] = (LBA >> 8) as u8;
storage[0x1CC] = (LBA >> 16) as u8;
storage[0x1CD] = (LBA >> 24) as u8;
storage[0x1FE..0x200].copy_from_slice(&[0x55, 0xaa]); // boot signature
storage[0x200..0x23E].copy_from_slice(&[
/* 000 */ 0xEB, 0x3C, 0x90, b'm', b'k', b'f', b's', b'.', b'f', b'a', b't', 0x00, 0x02, 0x04, 0x01, 0x00, /* 000 */ 0xEB, 0x3C, 0x90, b'm', b'k', b'f', b's', b'.', b'f', b'a', b't', 0x00, 0x02, 0x04, 0x01, 0x00,
/* 010 */ 0x02, 0x00, 0x02, (DISK_BLOCK_NUM & 0xff) as u8, /* 010 */ 0x02, 0x00, 0x02, (DISK_BLOCK_NUM & 0xff) as u8,
(DISK_BLOCK_NUM >> 8) as u8, (DISK_BLOCK_NUM >> 8) as u8,
@ -132,10 +153,10 @@ fn main() -> ! {
/* 020 */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0xDE, 0xAD, 0xBE, 0xEF, b'R', b'A', b'M', b'_', b'U', /* 020 */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0xDE, 0xAD, 0xBE, 0xEF, b'R', b'A', b'M', b'_', b'U',
/* 030 */ b'S', b'B', b' ', b' ', b' ', b' ', b'F', b'A', b'T', b'1', b'2', b' ', b' ', b' ' /* 030 */ b'S', b'B', b' ', b' ', b' ', b' ', b'F', b'A', b'T', b'1', b'2', b' ', b' ', b' '
]); ]);
storage[0x1FE..0x200].copy_from_slice(&[0x55, 0xAA]); storage[0x3FE..0x400].copy_from_slice(&[0x55, 0xAA]);
storage[0x200..0x203].copy_from_slice(&[0xF8, 0xFF, 0xFF]);
storage[0x400..0x403].copy_from_slice(&[0xF8, 0xFF, 0xFF]); storage[0x400..0x403].copy_from_slice(&[0xF8, 0xFF, 0xFF]);
storage[0x600..0x61A].copy_from_slice(&[ storage[0x600..0x603].copy_from_slice(&[0xF8, 0xFF, 0xFF]);
storage[0x800..0x81A].copy_from_slice(&[
/* 600 */ b'R', b'A', b'M', b'_', b'U', b'S', b'B', b' ', b' ', b' ', b' ', 0x08, 0x00, 0x00, 0xF9, 0x98, /* 600 */ b'R', b'A', b'M', b'_', b'U', b'S', b'B', b' ', b' ', b' ', b' ', 0x08, 0x00, 0x00, 0xF9, 0x98,
/* 610 */ 0x3A, 0x58, 0x3A, 0x58, 0x00, 0x00, 0xF9, 0x98, 0x3A, 0x58 /* 610 */ 0x3A, 0x58, 0x3A, 0x58, 0x00, 0x00, 0xF9, 0x98, 0x3A, 0x58
]); ]);