Loader.asm控制权转交给BootEntry后,开始启动Foxdisk的主体代码。BootEntry()函数中,只调用了Foxdisk()函数。BootEntry没有其他作用,只是用来定位的,方便Loader.asm去加载。
看代码前,首先熟悉一下将要用到的结构体,定义在Common.h中。
图1 数据结构对应图
程序中允许安装四个不同的操作系统,每个系统的引导代码Foxdisk都会保存起来,理论上可以兼容所有类型的操作系统。如图1,准备了四个导航条与之对应。数据结构navBar定义了导航条的显示资料,包括字体、字符串、颜色等等;数据结构menuitem则定义了与导航条连接的菜单项的显示资料。数据结构_WallPaper是壁纸的数据结构,包含壁纸存放在硬盘中的位置及其是否有效。壁纸从1024×768的bmp中提取,没有压缩,直接存储在硬盘上,其大小为1024×768 bit。总共可以存7张不同的壁纸,在安装的时候指定。
数据结构OperationSystem对应每个导航条指定的系统,允许用户添加密码。数据结构FoxdiskPara定义了Foxdisk所用的必要信息,包括倒计时时间、默认进入的系统、foxdisk的存储位置等。
在以上数据结构的支持下,Foxdisk的启动才得以实现。在foxdisk()中,第一步启用磁盘访问的驱动,建立硬盘参数表,允许硬盘访问。第二步,获取FoxdiskPara等参数,这些参数在安装的时候已经存储在硬盘上了,接着调用bootMenu()。出现指定的壁纸及倒计时信息。如下图。
图2 启动界面
这是指定了壁纸的启动界面,如果没有指定,则启动缺省的foxdisk界面,如图3。
图3 缺省启动界面
在启动界面上,如果按F2键,则进入Foxdisk的设置界面,类似图1。如果不按,倒计时结束将进入显示中正在进入的系统。当时为了设计右下角的显示信息,也费了一番功夫。最大的问题是,如何在不同的图片上,能够将倒计时的数据显示出来。固定颜色是不行的,很难保证图片颜色与倒计时颜色不同。最终用了些小技巧,用反色、倒影的方式进行显示,解决了这个问题。
读到现在,我也发现之前设计上的不足,很多地方过于繁复了,有些需要显示的信息,比如当前有哪些操作系统,在界面上却没有显示。
最后一步,调用SysRun()。也即在第二步中,如果按F2,将执行此处代码,进入Foxdisk的设置界面。
图4 设置界面
设置界面的右下角提供了快捷选项。F1键唤出帮助界面;F2键为系统菜单,也即类似图1中显示的界面;F3键唤出参数设定,如图4显示;F4键还没有实现;F5键唤出关于菜单,打印关于Foxdisk的一些说明。
至此,所有启动相关的信息全部介绍完毕。Foxdisk在运行过程中,需要用到硬盘访问、分区设置、图形显示、汉字显示、时间中断等,最早曾经把扬声器也放进去了,觉得没有太大作用,后来把它去除了。
后续的博客中,将针对上述实现一一阐述,记下我在秦淮河畔曾经挥汗调试的日子。
1,476 total views, 1 views today