| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 567 人关注过本帖
标题:Turbo C 直接写屏技术
只看楼主 加入收藏
0501xql
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-12-9
收藏
 问题点数:0 回复次数:0 
Turbo C 直接写屏技术

/*----------------------------------------*/
/* */
/*------- Turbo C 直接写屏技术 --------*/
/* */
/*----------------------------------------*/
#include<dos.h>
#include<conio.h>
#include<stdio.h>

#define TEXT_MODE 0x03
#define GRAP_MODE 0x13

char hanzi[][72]={
/* 以下是 '写' 的 24点阵华文行楷 字模,72 byte */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x02,0x1F,0xC0,0x03,0xF8,0x60,0x03,
0x00,0xF0,0x07,0x21,0xE0,0x0E,0x3F,0x00,
0x0E,0x3F,0x00,0x04,0x3E,0x00,0x00,0x20,
0x00,0x00,0x6F,0xC0,0x00,0x78,0x60,0x00,
0x60,0x60,0x00,0x1E,0x60,0x06,0xFE,0x60,
0x07,0xE0,0xE0,0x07,0x20,0xC0,0x00,0x1F,
0xC0,0x00,0x07,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/* 以下是 '屏' 的 24点阵华文行楷 字模,72 byte */
0x00,0x07,0x80,0x00,0x3F,0xC0,0x00,0x5D,
0xC0,0x00,0x63,0x80,0x00,0x5F,0x80,0x00,
0xFF,0x80,0x00,0xF1,0x80,0x01,0xAF,0xC0,
0x01,0xB3,0x00,0x01,0x27,0x80,0x03,0x7F,
0x00,0x02,0x3D,0x00,0x06,0x31,0xF0,0x04,
0x3F,0xF8,0x0C,0xF1,0x00,0x0F,0xE1,0x00,
0x18,0x21,0x00,0x30,0x21,0x00,0x20,0x61,
0x00,0x40,0x41,0x00,0x00,0x01,0x00,0x00,
0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
};

/*初始化屏幕为图形模式*/
void InitScreen()
{
union REGS regs;
/*********************************
WORDREGS原型:
struct WORDREGS
{
Unsigned ax,bx,cx,dx;
Unsigned si,di,cflag,flags;
};
BYTEREGS 原型
struct BYTEREGS
{
Unsigned al,ah,bl,bh;
Unsigned cl,ch,dl,ch;
};
REGS的原型
union REGS
{
struct WORDREGS x;
struct BYTEREGS h;
};
**********************************/

regs.h.ah=0; /* 功能号为0 */
regs.h.al=GRAP_MODE;/* 定义为图形模式 */
/***********************************
定义为320*240*256的图形模式.
其他图形模式:
AL=00 40 * 25 黑白
AL=01 40 * 25 彩色
AL=04/0D 320 * 200 彩色(EGA)
AL=05 320 * 200 黑白
AL=11 640 * 480 单色
AL=12 640 * 480 16色
AL=13 320 * 200 256色
***********************************/
int86(0x10,&regs,&regs); /*调用中断0x10******/
}

void CloseScreen()
{ /*将屏幕设置成文本模式*/
union REGS regs;

regs.h.ah=0;
regs.h.al=TEXT_MODE; /*定义为文本模式*/
int86(0x10,&regs,&regs);
}

void PutPixel(int x,int y,int color)
{ /*直接在屏幕(x,y)点坐标上画一个颜色为color的点.*/
char far *addr=(char far*)0xA0000000L;
/**********************************************
0xA00000000L为首地址,0x表示后面的数字是以
16进制给出的: A0 00 00 00 表示一个4字节长度
的数值。 后面的L表示它为一个 long int 类型值。
图形13H模式是标准VGA模式,该模式的视屏存储器VRAM
从0xA000,0000到0xA000,F9FF为止。
**********************************************/

*(addr + (y<<8)+(y<<6) + x)=color;/* 直接显示*/

/*********************************************
相当于*(addr+y*320+x)=color;(但这样速度慢)
因为320=256+64 所以用移位的方法加速显示。
屏幕上位置计算方法:首地址+纵坐标*320+横坐标.
图形13H模式是标准VGA模式中颜色数最多的模式,它有
256种颜色,屏幕分辨率是320*200。该模式的视屏存储
器VRAM 从 A000:0000 到 A000:F9FF 为止,总共
320*200=64000 个字节。
**********************************************/
}

void drawmat(char *mat,int matsize,int x,int y,int color)
{ /*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/
int i,j,k,n;

n=(matsize-1)/8+1;
for(j=0;j<matsize;j++)
for(i=0;i<n;i++)
for(k=0;k<8;k++)
if(mat[j*n+i]&(0x80>>k)) /*测试为1的位则显示*/
PutPixel(x+i*8+k,y+j,color);
}

int main()
{
int i;

InitScreen(); /* 初始化屏幕 */

for(i=0;i<2;i++)
drawmat(hanzi[i],24,120+i*40,80,i+1);
getch();
CloseScreen();/* 还原为文本模式 */
return 0;
}

搜索更多相关主题的帖子: Turbo 技术 
2007-04-19 15:34
快速回复:Turbo C 直接写屏技术
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.061391 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved