益友软件工作室

加密金刚锁相关技术 → C语言类技术文章 → 用C语言实现直接写屏

用C语言实现直接写屏

文章作者:南京 徐金宝

直接写屏,就是直接访问显示缓存区实行屏幕显示的方法,它同DOS系统的中断调用(包括系统调用,DOS调用和BIOS调用)相比,不仅具有快速简洁的优点,而且在中断服务程序编程中(如中断且驻留TSR程序)特别有用,因为DOS系统,特别是DOS5.0以下版本,是不可重入的,在中断服务程序中就不能再调用DOS的系统调用,就是有些BIOS调用也不能再用,这时,直接写屏技术会给你在屏幕显示上带来极大的方便。

显示缓存区:每个字符在显示缓存区内占两个字节,一个是字符的ASCII码,另一个是字符的属性字节,由ASCII码调出字模信息,借助视频硬件将点阵映射到屏幕上,采用字符方式2,每屏25行X80列,每屏2000个字符,占4000字节缓存区,它们分别对应屏幕从左到右自上而下各行列的字符,只要缓存区内ASCII码变化,所显示的字符即随之改变。

显示方法:

DOS系统的显示缓存区首址为B800:0000,可以利用Turbo c的MK-FP()函数和赋值语句向缓存区送内容,所送内容就会在屏幕上显示出来。

/*用c语言实现直接写屏*/

#include<stdio.h>

#include<dos.h>

void Clear(int,int,int,int);/*用户自定义函数Clear(),Print()为void类型*/

void Print(int,int,char *,int);

void main(void)

{

char *s="Hello,Xu Jin Bao!";

char *str="Apr 16,1996";

Clear(0,0,24,79); /*清整个屏幕*/

Print(8,16,s,4);

Print(10,18,str,1);

getch(); /*敲任意健继续,相当于等待*/

Clear(8,16,8,32); /*清s字符串*/

Clear(10,18,10,28); /*清str字符串*/

}

/*Print()函数利用直接写屏技术,在屏幕(StartX,StartY)处显示一字符串str,*/

void Print(int StartX,int StartY,char *str,int attr)

{

char far *p;

int I;

p=MK-FP(0xb800,0x0000); /*显示缓存区首址*/

P=P+StartX*160+StartY*2;/*计算字符串显示位置*/

for(;*str!='\0';p+=2) /*显示字符串*/

{

*p=*str++;

*(p+1)=attr;

}

}

/*Clear()清除指定屏幕区域*/

void Clear(int StartX,int StartY,int EndX,int EndY)

{

char far *p,*EndP;

char c=' ';

int I,attr=7; /*清屏的颜色属性设为白色*/

P=MK-FP(0xb800,0x0000); /*显示缓存区首址*/

P=p+StartX*160+StartY*2;/*计算清屏区域*/

EndP=P+(EndX-StartX)*160+(EndY-StartY)*2;

for (;p<=Endp;p+=2) /*将指定区域清屏*/

{

*p=c;

*(p+1)=attr;

}

}

本程序在Super 386,Turbo c 2.0,DOS 6.0上调试运行通过!

特别申明

本栏目的文章都是本人从网上搜集而来,仅供大家学习研究之用,请不要用于商业目的!其中署名“佚名”的,意思是作者不详。如果某些文章未署你的名字,请来信告知,我会补上的。如果你认为某些文章侵犯了你的正当权宜,也请来信,我会将它删除。