《30天自制操作系统》笔记----Day19

DAY19:应用程序

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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃人的坤坤坤坤坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值