41 lines
1.2 KiB
C
41 lines
1.2 KiB
C
#include "fat12.h"
|
|
|
|
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;
|
|
} |