pang-o-lin/src/fat12.c

52 lines
1.4 KiB
C

#include "fat12.h"
void fat12_write_u8(void *ptr, uint8_t val) {
((uint8_t *)ptr)[0] = (val >> 0) & 0xff;
}
uint8_t fat12_read_u8(void *ptr) {
uint16_t val = 0;
val |= (((uint8_t *)ptr)[0] << 0) & 0xff;
return val;
}
void fat12_write_u16(void *ptr, uint16_t val) {
((uint8_t *)ptr)[0] = (val >> 0) & 0xff;
((uint8_t *)ptr)[1] = (val >> 8) & 0xff;
}
uint16_t fat12_read_u16(void *ptr) {
uint16_t val = 0;
val |= (((uint8_t *)ptr)[0] << 0) & 0x00ff;
val |= (((uint8_t *)ptr)[1] << 8) & 0xff00;
return val;
}
void fat12_set_cluster(void *fat, uint32_t cluster, uint32_t value) {
uint32_t offset = (cluster * 3) / 2;
if (cluster&1) {
((uint8_t *)fat)[offset] = (((uint8_t *)fat)[offset] & 0x0f) | ((value << 4) & 0xf0);
((uint8_t *)fat)[offset + 1] = value >> 4;
}
else {
((uint8_t *)fat)[offset] = value;
((uint8_t *)fat)[offset + 1] = (((uint8_t *)fat)[offset] & 0xf0) | ((value >> 8) & 0x0f);
}
}
uint32_t fat12_get_cluster(void *fat, uint32_t cluster) {
uint32_t offset = (cluster * 3) / 2;
uint32_t value = 0;
if (cluster&1) {
value |= (((uint8_t *)fat)[offset] >> 4) & 0x00f;
value |= (((uint8_t *)fat)[offset + 1] << 4) & 0xff0;
}
else {
value |= ((uint8_t *)fat)[offset];
value |= (((uint8_t *)fat)[offset + 1] << 8) & 0xf00;
}
return value;
}