diff options
author | Jari Vetoniemi <mailroxas@gmail.com> | 2017-03-30 17:31:44 +0300 |
---|---|---|
committer | Jari Vetoniemi <mailroxas@gmail.com> | 2017-04-13 14:49:46 +0300 |
commit | 76b8c9e03c97b16d9ff97f3b79c0ecbff0f5e7f2 (patch) | |
tree | 70f1d22a923d1c01b22b2fade3b6e96365990dda /src/xi/xi2path.h |
Initial commit
Diffstat (limited to 'src/xi/xi2path.h')
-rw-r--r-- | src/xi/xi2path.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/xi/xi2path.h b/src/xi/xi2path.h new file mode 100644 index 0000000..954c554 --- /dev/null +++ b/src/xi/xi2path.h @@ -0,0 +1,35 @@ +#pragma once + +#include <stdio.h> +#include <assert.h> +#include <stdint.h> + +static inline void +xi2path(char out[12], const uint16_t id) +{ + // Forms path like: section/id.DAT, from 16bit id. + // First 7 bits are used for DAT and rest of the bits for ROM section. + // + // e.g. ID of 1000 would look like 11101000 00000011 in binary. + // RDDDDDDD RRRRRRRR + // + // In the above graph, 'R' bits form the ROM section (7) and 'D' bits form the DAT (104). + // Thus maximum DAT and ROM section IDs are 127 and 511 respectively (65535 as decimal). + + snprintf(out, 12, "%u/%u.DAT", id >> 7, id & 0x7F); +} + +static inline void +xi2rompath(char out[18], const uint8_t rom, const uint16_t id) +{ + assert(rom <= 9); + + char path[12]; + xi2path(path, id); + + if (rom > 1) { + snprintf(out, 18, "ROM%u/%s", rom, path); + } else { + snprintf(out, 18, "ROM/%s", path); + } +} |