#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; }