实现命令行
第18章实现了命令行任务,且实现了几个命令。主要是dir命令可以讲一讲。dir命令用于显示目录下的文件信息。
由于磁盘的数据已经全部读取到内存中了,所以这里可以直接访问到。由前面可知,磁盘数据放在0x00100000~0x00267fff,根目录的文件信息存放在磁盘开始的0x2600处。FAT文件目录项的格式为:
struct FILEINFO {
unsigned char name[8], ext[3], type;
char reserve[10];
unsigned short time, date, clustno;
unsigned int size;
};
文件信息最多可以存放224个。如果name[0]为0xe5,表示文件已被删除。如果为0x00,表示不包含文件信息。type=0x10代表目录,0x08代表非文件。从0x102600开始遍历,当读到0x00时终止,便可以读出目录下的文件信息。
对FAT的支持
19章中实现的type命令需要显示文件中的所有内容。一个扇区的大小是512B。文件的第一个扇区的位置可以在目录下的文件信息中找到。当文件大小大于512B时,可能放在不连续的扇区。这时需要使用FAT表查找下一个扇区的位置。FAT表在磁盘的0x200~0x13ff,它记录文件在磁盘中存放的位置。
FAT表是经过压缩的。三个字节,将中间的字节高位放到第三个字节的最低位,低位放到第一个字节的最高位,变成两个数字。如:
ab cd ef -> dab efc
将第一个扇区的扇区号作为index,可以从FAT表中找到下一个扇区号。当找到FFF时,表示结束。
执行应用程序
可以读取文件之后,接下来尝试执行磁盘上的应用程序。应用程序不知道自己会被加载到哪个内存位置,但是不需要知道。在程序中ORG 0,加载程序的时候,给它分配一个段,[段号:0]就是起始地址了。
在命令行程序中,输入应用程序名后,先分配内存,将应用程序复制到这一段内存,然后set_setmdesc()注册段号,然后farjump()跳转过去。这时已经开始运行应用程序了。