type命令
类似Linux里的cat命令,输入“type 文件名”就会显示出文件的内容
struct FILEINFO{
unsigned char name[8], ext[3], type;
char reserve[10];
unsigned short time, date, clustno;
unsigned int size;
}
clustno这个成员,代表文件从磁盘上的哪个扇区开始存放。
磁盘映像中的地址 = clustno * 512 + 0x003e00
if(strcmp(cmdline,"type")){
for(y=0;y<11;y++){
s[y] = '';
}
y=0;
for(x=5;y<11&&cmdline[x]!=0;x++){
if(cmdline[x]=='.'&& y<=8){
y=8;
}else{
s[y]=cmdline[x];
if('a'<=s[y]&&s[y]<='z'){
s[y]-=0x20;
}
y++;
}
}
for (x = 0; x < 224; ) {
if (finfo[x].name[0] == 0x00) {
break;
}
if ((finfo[x].type & 0x18) == 0) {
for (y = 0; y < 11; y++) {
if (finfo[x].name[y] != s[y]) {
goto type_next_file;
}
}
break; /*找到文件*/
}
type_next_file:
x++;
}
}
接下来要实现对特殊字符编码的支持:
0x09……制表符:显示空格直到x被4整除为止
0x0a……换行符:换行
0x0d……回车符:忽略
对FAT的支持
FAT—>file allocation table
当存储的文件大于512字节,有时并不能存入连续的扇区中,而对于文件不连续的存储,磁盘中是有记录的,位于0柱面、0磁头、2扇区开始的9个扇区中,磁盘映像中相当于0x000200~0x0013ff,这段就是FAT。
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;
}