首页 百科知识 函数图形显示系统设计

函数图形显示系统设计

时间:2023-10-17 百科知识 版权反馈
【摘要】:在使用int86()函数进行BIOS接口的系统调用时,有的中断调用设有若干选择项,这些选择项可以根据调用时AH寄存器中的值来进行访问。程序从键盘输入数据,例如,输入数据流如下:Turbo C中有关时间、日期、BIOS接口和系统调用的函数十分丰富,这为系统软件及应用软件的开发提供了有利的支持。

10.2.2 DOS系统调用函数

在用于DOS系统调用的函数中,我们仅介绍最常用的intdos()和int86()两个函数。

1.intdos()函数

调用方式:

  int intdos(union REGS*in_regs,union REGS*out_regs)

函数intdos()用于访问in_regs指向的联合变量中,由系统调用号所指定的DOS系统调用。它执行一次INT 21H中断指令,并把结果放入out_regs指向的联合中。放入AX寄存器中的返回值为DOS的返回信息。返回时,如果进位标志被置位,说明出现错误,类型REGS是在dos.h定义的。

例10-5 下面是一个使用0x2C系统调用直接从系统时钟中读取时间的程序。

img742

  运行结果:

  time is 18:4:27

程序第7行将系统调用号0x2c赋予联合REGS变量的ah寄存器中,第8行执行系统调用,产生中断服务,返回的时、分、秒放入ch、cl和dh字节寄存器中。

2. int86()函数

调用方式:

  int int86(int int_num,union REGS*in_regs,union REGS*out_regs)

函数int86()用来执行由int_num指定的软件中断。首先把指针in_regs指向的联合变量中的内容拷贝到处理器的寄存器中,随即产生对应的中断,指针out_regs指向的联合变量将保存中断调用后的返回值,返回值放在AX寄存器中。

在使用int86()函数进行BIOS接口的系统调用时,有的中断调用设有若干选择项,这些选择项可以根据调用时AH寄存器中的值来进行访问。

下面以调用ROM_BIOS中显示器的功能为例,说明int86()函数的使用方法。

在ROM_BIOS中为显示器适配器提供显示服务的程序是VIDEO_I/O,在CGA情况下,它由16个功能模块组成,编号为00H~0FH。调用方式为,将功能编号送入AH寄存器,通过软中断10H(十进制16号中断),便可对相应功能模块进行调用,实现显示功能。

例如,要设置显示器的工作模式和在显示器上写点或读点,可调用0号功能和12号功能或13号功能。其功能如下:

  AH=0  置显示器工作模式

  AL  放入工作方式值

  字符方式       图形方式

  AL=0  40×25黑白  AL=4 320×200彩色

  AL=1  40×25彩色  AL=5 320×200黑白

  AL=2  80×25黑白  AL=6 640×200黑白

  AL=3  80×25彩色

  AH=12   写点,DX=行数 CX=列数 AL=颜色值

  AH=13   读点,DX=行数 CX=列数 AL=返回所读的点

使用BIOS中的基本图形功能进行图形编程,可以大大简化程序设计过程,提高设计效率。凡BIOS中能实现的功能,可直接调用,用不着自己重新编写。

下面是一个将显示器设置为指定的图形工作方式的程序段:

img743

这里,将设置图形工作模式的0号功能送入ah寄存器(第7行),将表示图形工作方式的mode值送入a1寄存器(第6行),调用int86()函数,产生10H号中断服务,结果是将显示器设置为mode表示的工作方式。当mode为6时,设置显示器为640×200黑白图形工作方式。

必须说明,在增强型图形适配器EGA的情况下,适配器的工作范围比CGA已扩展很多,因此,适配器的mode取值范围为0~16(8~11未用)。

例10-6 为方便使用,可使用命令行参数将上面程序段编写成一个设置显示器工作方式的完整程序。

程序如下:

img744

img745

如果这个源程序名为setmode.c,经编译、连接生成的可执行程序为setmode.exe,那么,运行方式为:

  C:〉setmode 6

将显示器设置为分辨率为640×200黑白图形方式。

  C:〉setmode l4

在EGA显示适配器中,将显示器设置为分辨率为640×200,具有16种颜色的图形方式。

当结束图形方式,需要返回到文本方式时,可以使用:

  C:〉setmode 3

在图形程序设计中,任何图形都可以看成是由点和线段组成的,但最终可认为是由点组成的。因此,点是图形中最基本的图元。有了点就可以构成线。有了点和线,使用一定的算法,就可以构成其他复杂的图形。下面程序中使用12号功能,编写了一个写点的函数point()。形参x和y表示点的x和y坐标,clr为选取的颜色。在工作方式为6的情况下,clr为l亮点,为0暗点,x和y的屏幕坐标取值为:

  0≤x≤639,0≤y≤199;

程序使用写点函数point(),编写了一个画圆函数circle()。形参中x、y、clr和写点函数相同。x和y表示圆心坐标,r表示半径长度,a=1/r为圆上相邻两个点间的角增量,用点画圆算法是,每增加一个角增量,求出圆上对应点的坐标(x,y),然后用point()函数画出该点。圆由(2*pi*r)个点组成。f为校正因子(小于1)。由于显示器屏幕的网格为非正方形矩形,相邻两个像素间的距离,在y方向大于x方向,所以使求出的y坐标要乘以校正因子,以减小圆的失真度。如不校正,显示出的圆为一个椭圆。通常f取0.5左右,可以根据不同的显示器调整。

程序main开始执行,调用setmode函数,将显示器设置为工作模式后,调用circle()函数,在指定的圆心位置,按指定的半径长度和颜色在显示器上画出一个圆。程序从键盘输入数据,例如,输入数据流如下:

  input x y r clr f:

  319 99 50 1 0.45

程序以显示屏中心为圆心,以50个单位长度(像素距离)为半径,在屏上画一个圆。校正因子取0.45。

例10-7 从键盘输入数据,在显示器上画一个圆。

img746

img747

Turbo C中有关时间、日期、BIOS接口和系统调用的函数十分丰富,这为系统软件及应用软件的开发提供了有利的支持。其他函数,这里不再一一介绍,使用时请参阅有关手册。

需要说明的是,尽管计算机软硬件资源已经有了很大的发展,但上述例子的设计思想、方法和实现技术对提高和培养学生的软件开发能力是大有益处的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈