| #include "sysincludes.h" |
| #include "old_dos.h" |
| |
| static struct OldDos_t old_dos[]={ |
| { 40, 9, 1, 4, 1, 2, 0xfc }, /* 180 KB */ |
| { 40, 9, 2, 7, 2, 2, 0xfd }, /* 360 KB */ |
| { 40, 8, 1, 4, 1, 1, 0xfe }, /* 160 KB */ |
| { 40, 8, 2, 7, 2, 1, 0xff }, /* 320 KB */ |
| { 80, 9, 2, 7, 2, 3, 0xf9 }, /* 720 KB */ |
| { 80, 15, 2,14, 1, 7, 0xf9 }, /* 1200 KB */ |
| { 80, 18, 2,14, 1, 9, 0xf0 }, /* 1440 KB */ |
| { 80, 36, 2,15, 2, 9, 0xf0 }, /* 2880 KB */ |
| |
| /* Source: https://en.wikipedia.org/w/index.php?title=File_Allocation_Table&oldid=560606333#Exceptions : */ |
| /* https://www.win.tue.nl/~aeb/linux/fs/fat/fat-1.html */ |
| { 80, 8, 2, 7, 2, 2, 0xfb }, /* 640 KB */ |
| { 80, 8, 1, 7, 2, 2, 0xfa }, /* 320 KB */ |
| { 80, 9, 1, 7, 2, 2, 0xf8 }, /* 360 KB */ |
| }; |
| |
| /** |
| * Get Old Dos parameters for a filesystem of size KBytes (assuming |
| * 512 byte sectors), i.e. number of sectors is double the size |
| */ |
| struct OldDos_t *getOldDosBySize(size_t size) { |
| size_t i; |
| size = size * 2; |
| for(i=0; i < sizeof(old_dos) / sizeof(old_dos[0]); i++){ |
| if (old_dos[i].sectors * |
| old_dos[i].tracks * |
| old_dos[i].heads == size) |
| return &old_dos[i]; |
| } |
| return NULL; |
| } |
| |
| struct OldDos_t *getOldDosByMedia(int media) { |
| size_t i; |
| for(i=0; i < sizeof(old_dos) / sizeof(old_dos[0]); i++){ |
| if (old_dos[i].media == media) |
| return &old_dos[i]; |
| } |
| fprintf(stderr, "Unknown media type %02x\n", media); |
| return NULL; |
| } |
| |
| struct OldDos_t *getOldDosByParams(unsigned int tracks, |
| unsigned int heads, |
| unsigned int sectors, |
| unsigned int dir_len, |
| unsigned int cluster_size) { |
| size_t i; |
| for(i=0; i < sizeof(old_dos) / sizeof(old_dos[0]); i++){ |
| if (sectors == old_dos[i].sectors && |
| tracks == old_dos[i].tracks && |
| heads == old_dos[i].heads && |
| (dir_len == 0 || dir_len == old_dos[i].dir_len) && |
| (cluster_size == 0 || |
| cluster_size == old_dos[i].cluster_size)) { |
| return &old_dos[i]; |
| } |
| } |
| return NULL; |
| } |
| |
| int setDeviceFromOldDos(int media, struct device *dev) { |
| struct OldDos_t *params=getOldDosByMedia(media); |
| if(params == NULL) |
| return -1; |
| dev->heads = params->heads; |
| dev->tracks = params->tracks; |
| dev->sectors = params->sectors; |
| dev->ssize = 0x80; |
| dev->use_2m = ~1u; |
| return 0; |
| } |