软件是为人类服务的,因此通常都需要一个界面或需要提供个人机交互的接口,比如BIOS里面就有个叫setup的界面,供用户设置选项。说到人机交互,则是另外一门学问,这跟心理学,人体工程学都能挂靠上的,这里就只针对我们预计的小项目提供的界面来介绍。
上篇布局中已经把我们想要实现的各功能划分的各具体文件中,而负责界面UI显示的,我们用Display.c文件实现,本文就针对这个文件详细介绍一下。 要知道,实现界面显示功能方法,途经很多,微软VC MFC等,Linux下用QT,而我们的这个DOS传统系统下做显示功能,没必要也不方便实现显示,因此本文采用的策略是通过写屏来实现,理由 1, 更直观地理解X86字符显示的基本原理,2,增强对指针操作的掌握。
下面来说说VGA的发展,尽管现在的显示技术已经突飞猛进,光Intel的集成显卡就弄出不少花活,神马DP,eDP, HDMI, DVI等等, 但通常VGA作为一个经典的显示适配标准仍然有很大地市场空间,CGA,MDA,EGA,MCGA,VGA,SVGA,较为通用的还是VGA标准
视频显存和视频控制器,要知道,处理显示部分,相对比较复杂,我们回归到最原始的IBM PC来看看,有 助于理解,X86架构的PC将内存A0000H-BFFFFH这1M一下的128K空间分配给显存使用,这部分内存,主CPU
可以访问,视频显示控制器(GPU)也可以访问,当需要显示信息时,主CPU将显示内容写到显存中,然后就是视频显示控制器的工作了,读取显存中的内容,并将其转化合适的的信号到显示设备上。至于这128K的Video Buffer实际上只用的部分,具体怎样使用,要根据显示适配器和所选择的模式来定了。在DOS下,默认的是模式3 模拟CGA模式,显示字符,其显示一个页面的字符是80x25,即一共显示25行,每行80个字符,16色,对应的显存开始位置是B8000h。 在B8000h这个位置开始,就是DOS默认显示第一个字符的位置,在对应的位置写上要显示的ASCII,就能在第一行第一列看到对应的字符,而B8001h这个Byte就是第一个字符的显示属性了,参考如下表格各位的定义说明
表一 屏幕属性位定义
属性位定义 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
Blinking | R G B | Intensity | R G B | |||||
Background | Foreground |
对应的I R G B 组合成16中颜色,如下表所示。
表二 颜色对应表
I |