Changeset 0153c87 in mainline for uspace/dist/src/bithenge/fat.bh


Ignore:
Timestamp:
2012-08-10T20:09:36Z (12 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6be4142
Parents:
c9797067
Message:

Bithenge: more FAT, operators, and fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/dist/src/bithenge/fat.bh

    rc9797067 r0153c87  
    3232transform u32 = uint32le;
    3333
     34transform fat_dir_entry(disk) = struct {
     35        .filename <- known_length(8);
     36        .extension <- known_length(3);
     37        .attrs <- u8;
     38        .flags <- u8;
     39        .ctime_fine <- u8;
     40        .ctime <- u16;
     41        .cdate <- u16;
     42        .adate <- u16;
     43        .permissions <- u16;
     44        .mtime <- u16;
     45        .mdate <- u16;
     46        .start <- u16;
     47        .size <- u32;
     48};
     49
     50transform fat_table(bits, num_clusters) = switch (bits) {
     51        12: partial {repeat(num_clusters) { uint_le(12) }} <- bits_le;
     52        16: partial {repeat(num_clusters) { u16 }};
     53        32: partial {repeat(num_clusters) { u32 }};
     54};
     55
    3456transform fat_super(disk) = struct {
    3557        .jump_instruction <- known_length(3);
     
    6385        };
    6486
     87        .first_root_sector <- (.num_reserved_sectors + .num_fats * .sectors_per_fat);
     88        .first_data_sector <- (.first_root_sector +
     89            (.num_root_entries * 32 + .bytes_per_sector - 1) //
     90            .bytes_per_sector);
     91        .num_clusters <- (2 + (.num_sectors - .first_data_sector) // .sectors_per_cluster);
     92        .bits <- if (.num_clusters < 4085) { (12) }
     93            else { if (.num_clusters < 65525) { (16) } else { (32) } };
     94
     95        .fats <- partial(.num_reserved_sectors * .bytes_per_sector) {
     96                repeat(.num_fats) {
     97                        fat_table(.bits, .num_clusters) <-
     98                                known_length(.sectors_per_fat * .bytes_per_sector)
     99                }
     100        } <- (disk);
     101
     102        .root <- partial(.first_root_sector * .bytes_per_sector) {
     103                repeat(.num_root_entries) { fat_dir_entry(disk) } } <- (disk);
     104
    65105        .boot_signature <- (disk[510,2]); # b"\x55\xaa"; TODO: what if .bytes_per_sector < 512?
    66106};
Note: See TracChangeset for help on using the changeset viewer.