关于直接写屏

来源:互联网 发布:西科大网络教育 编辑:程序博客网 时间:2024/04/29 13:42
DOS现在人们都很少使用了,在DOS下开发程序的程序员也越来越少了。但我认为DOS拥有比Windows更大的灵活性,DOS下的编程难度也比Windows下大的多,毕竟Windows下面有WinAPI可以使用,而DOS提供的功能就很少。
可是DOS能让程序员更多的接触计算机底层的东西,从某种意义上来说一些Windows程序员就根本算不上程序员,他们所做的编程只是最简单的编程,只有真正触及了底层和核心,才能了解计算机与编程的本质。
本文简单的讲述了DOS下的VGA直接写屏技术。

    直接写屏技术在DOS下面很容易实现,调用BIOS的10h中断的00h功能即可进入视频模式,对于VGA、VESA的显示模式,显存的起始地址都是A000:0000H(是一个16位地址的段址+偏移形式)。在支持DOS程序的C编译器下面很容易实现进入视频模式,并且用一个far指针指向视频显存的首地址,然后你就可以在显存里面为所欲为了,比如画点什么的。以下可以给出例子:

#define MODE_VGA13H  0x13
#define MODE_TEXT       0x03

void setmode(char mode)      //设置视频模式的函数
{
    asm mov ah,0x00    //调用00h功能设置视频模式
    asm mov al,mode    //AL寄存器放欲设置的视频模式号,这里以13h视频模式为例
    asm int    0x10        //调用10h中断
}

char far * vediobuf=(char far*)0xa0000000L;    //指向显存地址的指针

void putpixel(int x,int y,int c)    //画点的函数
{
    *(vediobuf+x+320*y)=c;
}

int getpixel(int x,int y)              //取点的函数
{
    return *(vediobuf+x+320*y);
}

void main(void)
{
    int i;
    int j;

    //设置VGA13H视频模式
    setmode(MODE_VGA13H);

    //用一个二重循环画满屏幕
    for(i=0;i<20;i++)
        for(j=0;j<320;j++)
            putpixel(j,i,j);

    getch();
    //返回DOS文本模式
    setmode(MODE_TEXT);
}

    以上只是给出了很简单的实现直接写屏的代码,VGA13H视频模式是320*200*256的,即320*200的现实分辨率256色的最大颜色数。这个模式在现在看来已经很落后了,当然你也可以设置其它的显示模式,在VESA标准中能支持多种高分辨率高色彩的视频模式,编程的原理都差不多,要注意的就是对分页的处理。

    上面实现了一个画点的函数和一个取点的函数,在此基础上结合一些算法很容易写出画直线、画矩形、画圆等图形函数,对于BMP位图的显示,只要了解BMP的文件结构,再根据位图中的数据画点就可以把位图显示出来了,这里不在给出程序实现,有兴趣的话可以参见我以前写的一个VGA13H的Lib,在我的网站上可以下载(http://rockcarry.126.com)。

    DOS的直接写屏的实现就是这么简单,不费吹灰之力,以上代码要正常运行得有支持DOS程序的C编译器(如Turbo C2.0),VC就不行了,VC只能做Windows的程序。

    在Windows程序中要直接写屏几乎是不可能的,不管你用什么语言,这和语言没有多大关系,这是由平台所决定的。Windows平台为了克服不能直接写屏的缺点就推出了DirectX技术,以获得高速的图形性能。DirectX不能严格的称为直接写屏,但是他带来的速度已经很快了,所以在流行的Windows游戏中几乎都采用了DirectX技术。

    直接写屏之所以快是因为可以直接操作显存,DirectX里面也可以通过功能调用获得一个指向显存的指针,从而达到直接写屏的目的。

    在易语言里面要实现直接写屏能采用的只可能是DirectX技术,因为易语言只能编译生成Windows程序(注意DOS程序和Windows控制台程序不能混为一谈)。上面一些人所说的直接写屏都是假的,性能也不可能有多好,直接写屏当然就是获得一个指向显存的指针然后直接对显存进行操作,你去调用Windows的API还能叫做直接写屏?

    我也很期待易语言里面能够支持DirectX技术,易语言现在已经逐渐强大起来了,加入DirectX也是必须的。

    上面的直接写屏程序,在垃圾电脑上,比如286都应该能达到300帧左右的速度,在Windows下,如果不用DirectX几乎不可能达到这个速度,天行用的WinAPI也不行,那个就不叫直接写屏。

    编程到了最底层,连操作系统都没有了,我给的程序并没有调用DOS的功能,而只调用了BIOS的功能,BIOS是主板提供的,除非你的电脑没有主板,我的代码才不能工作。这也是底层编程的难度所在,一切都没有现成的,你面对的只有一个CPU、一块内存、一些I/O设备,一切都是自己创造。这也是写底层的乐趣所在,只有在这个时候,你才真正的成为了计算机的主人,他的一切行为都是由你来规定。

    对于直接写屏的理解可能各人都不一样,但需要指出的是,我所说的直接写屏是多数人都公认了的含义。相反直接写屏的含义并不重要,我们要达到的最终目的是有一个快速的高效的图形性能。如果要达到这样的要求,在Windows下面可能就只能用DirectDraw了,调用WinAPI也不行的,这个我已经试过了,而且为众多的游戏开发者所证实了。如果WinAPI能行的话,我相信就不会有DirectX技术的出现了。

    应当承认易语言是一个相当优秀的编程语言,最直接的体现在“易”上。而且他重要的是实现了自己的编译器技术,这在中国可能就找不到几个。


(注:本人写过一个VGA的图形函数库,大家可以在我的网站上下载,地址:http://rockcarry.126.com

    

                                                                   作者:陈凯
                                                                   2004.1.1
                                                                   版权所有、不得转载