欢迎访问中山自考网!本站由《帕思教育培训中心》提供助学服务,非政府官方网站,官方信息以广东省教育考试院(http://eea.gd.gov.cn/)为准。

报名热线:177-2280-6683

在线招生老师|中山自考网招生老师

首页
自考服务: |报名报考 |报考须知 |考办联系方式 |考试时间安排表 |免考办理 |学历证明办理 |合并准考证办理 |转出、转入办理 |考籍信息更正办理
通知公告:

微机UNIX直接视频图形程序设计

编辑整理:中山自考网    发布时间:2018-05-24 14:20:31    浏览热度:   [添加招生老师微信]
立即购买

《自考视频课程》名师讲解,轻松易懂,助您轻松上岸!低至399元/科!


微机UNIX直接视频图形程序设计
吴建林

UNIX操作系统提供了X-Window图形窗口系统和OPENLOOK图形用户界面,这些系统不仅昂贵、庞大,而且不便于移植以前开发的DOS图形应用程序。本文介绍利用微机内部硬件控制,针对EGA/VGA图形适配器,进行直接视频图形程序设计。对于比较熟悉PC-AT体系结构和视频程序设计知识的程序员来说,更喜欢后者,因为能有效地利用硬件特性,加快图形处理速度。
进行图形程序设计时,还须考虑视频接口的一个重要特性——虚拟终端功能,因为它允许控制几个独立的图形应用窗口,允许多个应用程序在同一个终端上进行切换。本文提供针对IBM标准终端对虚拟终端进行有效管理的手段。
微机UNIX直接视频图形程序设计有两种方法,一种是利用设备驱动程序(见参考文献1),另一种是针对IBM标准终端进行编程,本文介绍后者。
一、图形程序设计
1.检测视频适配器
视频显示器是由视频适配器硬件控制的,视频适配器决定了图形方式下显示图形的分辨率及可能的颜色[2]。利用系统调用ioctl中的CONS-CURRENT命令可以检测到当前的视频适配器,即:
ioctl(0,CONS-CURRENT,NULL)
返回-1时表示出错,即没有相应的视频适配器硬件,如果检测到VGA卡则返回值为VGA,如果检测到EGA卡则返回值为EGA,……。
2.初始化图形系统
初始化图形必须完成下列任务。
(1) 获取当前的视频显示方式
ioctl的CONS-GET命令用来判断当前适配器的显示方式,即:
ioctl(0,CONS-GET,NULL)
它返回显示方式的值,这些值在包含文件vtkd.h中均有定义,如:SW-VAG640x480C为VGA适配器设置成640x480分辨率彩色图形模式。
(2) 设置图形模式
直接将图形模式值放入ioctl中的命令项即可设置相应的图形模式,如ioctl(0,SW-VGA640x480C,NULL)
将VGA适配器设置成640x480分辨率的彩色图形模式。
(3) 获取图形模式下视频缓冲区物理地址
利用ioctl的MAPCONS命令可以实现此功能,即:
char *scrnmem;
scrnmem=(char *)ioctl(0,MAPCONS,NULL)
所有实现基本图素的操作都将针对scrnmem进行,scrnmem就是EGA/VGA相应的四个位平面的重叠地址,有关EGA/VGA的结构可参阅[2]。
3.实现基本图素
DOS操作系统下,对EGA/VGA的各种视频I/O寄存器进行操作是很方便的,可以直接使用汇编语言in和out指令进行读写。然而,UNIX操作系统下,对物理硬件的访问都是由UNIX系统核心和设备驱动程序管理的,要访问EGA/VGA的各种I/O寄存器,必须获得对其访问的特权,为了实现这种功能要求,可以使用下列ioctl系统调用方式:
ioctl(0,VGA-IOPRIVL,1) 获取VGA的各种I/O寄存器的访问特权
ioctl(0,EGA-IOPRIVL,1) 获取EGA的各种I/O寄存器的访问特权
UNIX操作系统基本上是采用C语言编写的,只是在低层的系统内核方面才使用低级的汇编语言,遵循这一原则,对EGA/VGA的I/O寄存器的访问可以采用汇编语言,而实现图形系统的基本图素则采用C语言。
如果用户的UNIX系统中已有inb()和outb()函数(嵌入在/usr/include/sys/inline.h中),则可以直接使用它们完成对各种I/O寄存器的读写,否则,必须编写下列低级汇编语言例程:
/*向一端口输出一字节*/
/*从一端口输入一字节 */
void outb(int port,uchar value)
{
-asm push edx
-asm mov edx,port
-asm mov al,value
-asm out dx,al
-asm pop edx
}
uchar inb(int port)
{
-asm push edx
-asm mov edx,port
-asm in al,dx
-asm pop edx
}
基本图素一般包括:设置颜色,对调色板的操作,画点、线、弧、矩形、圆、椭圆、多边形、画扇形、饼图,任意图形填充,多边形填充,保存屏幕,恢复屏幕等,这些操作均可用C语言实现,细节问题可参阅[2]。
4.关闭图形系统
退出图形系统之前必须恢复EGA/VGA各I/O寄存器的值,并将显示模式恢复到进入图形模式之前的模式。采用下列ioctl调用实现:
ioctl(0,MODESWITCH | oldmode,NULL)
oldmode是进入图形方式之前获取的方式,UNIX系统中,获取的方式和设置的方式之间的关系为:设置方式值=获取方式值|MODESWITCH
二、虚拟终端的使用
虚拟终端(Virtual Terminal,简称VT)加强了UNIX系统V/386的接口功能,它不仅允许单个用户开发一个图形应用软件,而且允许多用户、多道程序在同一个物理终端上运行,在开始一个用户的应用程序之前不必停止另一个应用程序,而且各个用户之间可以互相切换。
虚拟终端有两种操作方式[1],一种是自动操作方式(VT-AUTO),这是默认情况,比较简单,应用程序并不了解终端用户接受或放弃当前VT的请求,这意味着被切换掉的进程的任何输入输出都可能丢失。另一种方式是进程控制方式(VT-PROCESS),该方式支持应用程序与其它正在使用VT的进程之间同步,应用程序可以负责接受或放弃使用VT。
[1]中介绍了以进程方式控制VT的过程,并以设备驱动程序方式介绍了接受和放弃对VT控制的信号处理例程。本文给出针对IBM标准终端编制VT的程序和相应的信号处理例程。
/* 设置虚拟终端 */
void setvirtualterm(void)
{
struct vt-mode vtmode;
signal(SIGUSR1,release-disp); //release-disp为放弃VT的信号处理例程
signal(SIGUSR2,acquire-disp); //acquire-disp为接受VT的信号处理例程
vtmode.mode=VT_PROCESS; //设置进程控制方式
vtmode.relsig=SIGUSR1;
vtmode.acqsig=SIGUSR2;
if (ioctl(0,VT-SETMODE,&vtmode)==-1) exit(1);//出错即终止此进程
}
/* 放弃VT的信号处理例程 */
void release-disp(void)
{
signal(SIGUSR1,release-disp);
保存整个图形屏幕于内部缓冲区videobuf中;
ioctl(0),MODESWITCH | oldmode,NULL);
//oldmode为进入图形模式之前的显示方式
ioctl(0,VT-RELDISP,VT-TRUE);
//VT-TRUE表明同意放弃VT,如果此项为0,则表示拒绝放弃VT.
}
/* 接受VT的信号处理例程 */
void acquire-disp(void)
{
signal(SIGUSR2,acquire-disp);
ioctl(0,newmode,NULL);//newmode为应用程序所处的图形模式
scrnmem=(char *)ioctl(0,MAPCONS,NULL);
//重新获取图形缓冲区的物理地址
从videobuf中恢复整个图形屏幕,并释放videobuf;
ioctl(0,VT-RELDISP,VT-ACKACQ); //VT-ACKACQ表明接受VT
}
在微机UNIX操作系统下,针对EGA/VGA进行直接视频程序设计,独立开发一个图形程序包,不仅小巧方便,而且可以重用以前在DOS下开发的图形应用程序。笔者在SCO UNIX系统下开发了一个小的低层图形软件包,许多以前的DOS图形应用程序都可以移植到UNIX系统下来。
另外,本文介绍的程序在使用前还应包含下列文件,即:
#include<stdio.h>
#include<sys/types.h>
#include<sys/console.h>
#include<sys/vtkd.h>
#include<termio.h>
#include<sys/signal.h>
分配空间时还应加上#include<malloc.h>


参考文献
1 仲萃豪等.UNIX系统V/386第4版-集成软件开发指南.北京:电子工业出版社,1992.8.
2 张福炎等.微型计算机IBM PC的原理与应用(续二)-图形显示器及其程序设计.南京:南京大学出版社,1990.7.

转贴于 中国论文下载中心 http://paper.studa.com


《中山自考网》免责声明:

1、由于考试政策等各方面情况的调整与变化,本网提供的考试信息仅供参考,最终考试信息请以省考试院及院校官方发布的信息为准。

2、本站内容部分信息均来源网络收集整理或来源出处标注为其它媒体的稿件转载,免费转载出于非商业性学习目的,版权归原作者所有,如有内容与版权问题等请与本站联系。联系邮箱:812379481@qq.com