/* 文件相关函数 */ #include "bootpack.h" void file_readfat(int *fat, unsigned char *img) /*将磁盘映像中的FAT解压缩 */ { int i, j = 0; for (i = 0; i < 2880; i += 2) { fat[i + 0] = (img[j + 0] | img[j + 1] << 8) & 0xfff; fat[i + 1] = (img[j + 1] >> 4 | img[j + 2] << 4) & 0xfff; j += 3; } return; } void file_loadfile(int clustno, int size, char *buf, int *fat, char *img) { int i; for (;;) { if (size <= 512) { for (i = 0; i < size; i++) { buf[i] = img[clustno * 512 + i]; } break; } for (i = 0; i < 512; i++) { buf[i] = img[clustno * 512 + i]; } size -= 512; buf += 512; clustno = fat[clustno]; } return; } struct FILEINFO *file_search(char *name, struct FILEINFO *finfo, int max) { int i, j; char s[12]; for (j = 0; j < 11; j++) { s[j] = ' '; } j = 0; for (i = 0; name[i] != 0; i++) { if (j >= 11) { return 0; /*没有找到*/ } if (name[i] == '.' && j <= 8) { j = 8; } else { s[j] = name[i]; if ('a' <= s[j] && s[j] <= 'z') { /*将小写字母转换为大写字母*/ s[j] -= 0x20; } j++; } } for (i = 0; i < max; ) { if (finfo->name[0] == 0x00) { break; } if ((finfo[i].type & 0x18) == 0) { for (j = 0; j < 11; j++) { if (finfo[i].name[j] != s[j]) { goto next; } } return finfo + i; /*找到文件*/ } next: i++; } return 0; /*没有找到*/ } char *file_loadfile2(int clustno, int *psize, int *fat) { int size = *psize, size2; struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; char *buf, *buf2; buf = (char *) memman_alloc_4k(memman, size); file_loadfile(clustno, size, buf, fat, (char *) (ADR_DISKIMG + 0x003e00)); if (size >= 17) { size2 = tek_getsize(buf); if (size2 > 0) { /*使用tek格式压缩的文件*/ buf2 = (char *) memman_alloc_4k(memman, size2); tek_decomp(buf, buf2, size2); memman_free_4k(memman, (int) buf, size); buf = buf2; *psize = size2; } } return buf; }