/*----------------------------------------*/
/* */
/*------- 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,®s,®s); /*调用中断0x10******/
}
void CloseScreen()
{ /*将屏幕设置成文本模式*/
union REGS regs;
regs.h.ah=0;
regs.h.al=TEXT_MODE; /*定义为文本模式*/
int86(0x10,®s,®s);
}
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;
}