diff options
Diffstat (limited to 'src/kernel/fat12.c')
-rw-r--r-- | src/kernel/fat12.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/kernel/fat12.c b/src/kernel/fat12.c new file mode 100644 index 0000000..ef09116 --- /dev/null +++ b/src/kernel/fat12.c @@ -0,0 +1,58 @@ +/* +Copyright 2019 Benji Dial + +Permission to use, copy, modify, and/or distribute this +software for any purpose with or without fee is hereby +granted, provided that the above copyright notice and this +permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS +ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. +*/ + +#include "iso9660.h" +#include "diskio.h" +#include "files.h" +#include "mem.h" + +bool iso_9660_parse_ph(uint8_t dn, uint8_t pn, uint32_t sector, uint8_t *buffer) { + uint32_t s = sector + 64; + read_sectors_t rsf = get_read_sectors_function(dn); + do { + rsf(drives[dn].number, s, 4, buffer); + if ((*buffer == 255) || (*(uint32_t *)&buffer[1] != 0x30304443) || + (buffer[5] != (uint8_t)'1')) + return false; + s += 4; + } while (*buffer != PRIM_VOLUME); + part_info[dn].partition_types[pn] = ISO_9660; + part_info[dn].partition_offsets[pn] = sector; + struct iso_9660_cache *cache = allocate_block(sizeof(struct iso_9660_cache), KERNEL); + struct iso_9660_primary_vd *as_vd = (struct iso_9660_primary_vd *)buffer; + part_info[dn].partition_cache[pn] = cache; + if ((cache->block_size = as_vd->block_size) & ~0x01ff) { + part_info[dn].partition_sizes[pn] = + (as_vd->block_size >> 9) * as_vd->size; + cache->path_table_sector = + (as_vd->block_size >> 9) * as_vd->path_table_block; + cache->optional_path_table_sector = + (as_vd->block_size >> 9) * as_vd->optional_path_table_block; + } + else { + part_info[dn].partition_sizes[pn] = + (as_vd->block_size * as_vd->size) >> 9; + cache->path_table_sector = + (as_vd->block_size * as_vd->path_table_block) >> 9; + cache->optional_path_table_sector = + (as_vd->block_size * as_vd->optional_path_table_block) >> 9; + } + cache->path_table_size = as_vd->path_table_size; + return true; +}
\ No newline at end of file |