#include "STDEFINE.H"
int g_cur_vbe_page = 0;
extern MENU_STRUCT *p_menu;
extern unsigned int KeyCode;
WINDOW mywnd;
STACK Stack;
/////////////////////////////////////////////////////////////////////////////////////////////////
//图形模式初始化子程序
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl InitGraph(unsigned int mode)
{
_AX = 0x4f02;
_BX = mode;
__int__(0x10);
if(_AH != 0)
{
puts("Can't Initialize the graphics mode!");
exit(1);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//关闭图形模式,回到文本模式子程序
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl CloseGraph(void)
{
_AX = 0x4f02;
_BX = 0x03;
__int__(0x10);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//显存换页函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl set_vbe_page(int page)
{
if (g_cur_vbe_page != page)
{
_BX = 0;
_DX = g_cur_vbe_page = page;
_AX = 0x4F05;
__int__(0x10);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//64K真彩色1024*768写点
/////////////////////////////////////////////////////////////////////////////////////////////////
void PutPixel64K(int x,int y,unsigned int Color)
{
long addr = VARM_GRAPH_1024_768_256(x,y);
unsigned int far *videoptr16 = (unsigned int far *)MK_FP(0xa000, 0);
int page;
page = (int)(addr >> 15);
set_vbe_page(page);
*(videoptr16 + (unsigned int)(addr & 0xFFFF))= Color;
}
unsigned int _Cdecl GetPixel64K(int x, int y)
{
long addr;
int page;
unsigned int far *videoptr16 = (unsigned int far *)MK_FP(0xa000, 0);
addr = VARM_GRAPH_1024_768_256(x,y);
page = (int)(addr >> 15);
set_vbe_page(page);
return *(videoptr16 + (unsigned int)(addr & 0xFFFF));
}
//获取系统字模ROM
unsigned char far *Get_ASCII_ROM(unsigned int BX)
{
_AX = 0x1130;
_BX = BX;
__int__(0x10);
return (unsigned char far *)MK_FP(_ES,_BP);
}
void PutHZ(char *mat,int matsize,int x,int y,int scanx,int scany,unsigned int color)
/*依次:字模指针、点阵大小、起始坐标(x,y)X方向缩放比例 Y方向缩放比例 RGB颜色*/
{
int i,j,k,n;
int x1,y1; //与缩放比例有关,用于控制缩放的for循环
n=(matsize-1)/8+1;
for(i=0;i<n;i++)
for(j=0;j<matsize;j++)
for(k=0;k<8;k++)
if(mat[j*n+i]&(0x80>>k)) /*测试为1的位则显示*/
{
for(x1=0;x1<scanx;x1++) //该处用了for循环放大字体,
for(y1=0;y1<scany;y1++) //如果不用,则显示效果为LED点阵效果
PutPixel64K(x+x1+(i*8+k)*scanx,y+y1+j*scany,color);
}
}
void PutASCII(char *mat,int matsize,int x,int y,int scanx,int scany,unsigned int color)
/*依次:字模指针、点阵大小、起始坐标(x,y)X方向缩放比例 Y方向缩放比例 RGB颜色*/
{
int j,k;
int x1,y1; //与缩放比例有关,用于控制缩放的for循环
for(j=0;j<matsize;j++)
for(k=0;k<8;k++)
if(mat[j]&(0x80>>k)) /*测试为1的位则显示*/
{
for(x1=0;x1<scanx;x1++) //该处用了for循环放大字体,
for(y1=0;y1<scany;y1++) //如果不用,则显示效果为LED点阵效果
PutPixel64K(x+x1+k*scanx,y+2+y1+j*scany,color);
}
}
void PutString(char *charbuff,int matsize,int x,int y,int scanx,int scany,unsigned int color)
/*依次:字模指针、点阵大小、起始坐标(x,y)X方向缩放比例 Y方向缩放比例 RGB颜色*/
{
int i = 0;
int j = 0;
unsigned char char_tempbuff[32];
char *p = charbuff;
char far *p_rom;
//char (*pASCII)[16] = ASCII_CODE; //指向ASCII字模的二维数组指针(适用于自建ASCII字模)
unsigned char ch;
unsigned int offset;
while(*p != '\0')
{
ch = *p;
if(ch>0xA0) //是汉字
{
ReadHzkBit(p,char_tempbuff);
PutHZ(char_tempbuff,matsize,x+i*8*scanx, y, scanx, scany, color);
p++;
p++;
i += 2;
}
else //是ASCII字符
{
//==========方法1,用自建的ASCII字模===========================
//offset = ch - 0x20; //得到ASCII偏移位置
//PutASCII((char *)(pASCII+offset), matsize, x+i*8*scanx, y, scanx, scany, color);
//==========方法1,用自建的ASCII字模===========================
//==========方法2,用系统ROM===========================
offset = ch*16; //得到ASCII偏移位置
p_rom = Get_ASCII_ROM(FORNT8X16)+offset;
for(j=0;j<16;j++)
char_tempbuff[j] = *(p_rom +j);
PutASCII(char_tempbuff, matsize, x+i*8*scanx, y, scanx, scany, color);
//==========方法2,用系统ROM=======================
p++;
i++;
}
}
}
//========以下是图形函数========
//画横线
void Hline(int x1, int y1, int x2,unsigned int color)
{
int i;
for (i=x1;i<=x2;i++)
PutPixel64K(i,y1,color);
}
//画横线(虚线)
void Hline_Dot(int x1, int y1, int x2,unsigned int color)
{
int i;
for(i=x1;i<=x2;i++)
if(i%2)
PutPixel64K(i,y1,color);
}
//画竖线
void Vline(int x1, int y1, int y2,unsigned int color)
{
int i;
for (i=y1;i<=y2;i++)
PutPixel64K(x1,i,color);
}
//画竖线
void Vline_Dot(int x1, int y1, int y2,unsigned int color)
{
int i;
for (i=y1;i<=y2;i++)
if(i%8)
PutPixel64K(x1,i,color);
}
/*通用的画线函数(可以画斜线),用color颜色由(x1,y1)画到(x2,y2)*/
void line(int x1,int y1,int x2,int y2,unsigned int color)
{
int xdelta,ydelta,xstep,ystep,change;
xdelta=x2-x1;
ydelta=y2-y1;
if(xdelta<0)
{
xdelta=-xdelta; /*从右向左画线*/
xstep=-1;
}
else xstep=1; /*从左向右画线*/
if(ydelta<0)
{
ydelta=-ydelta; /*从下向上画线*/
ystep=-1;
}
else ystep=1; /*从上向下画线*/
if (xdelta>ydelta) /*x改变得比y快*/
{
change=xdelta>>1;
while(x1!=x2)
{
PutPixel64K(x1,y1,color);
x1+=xstep;
change+=ydelta;
if(change>xdelta)
{
y1+=ystep;
change-=xdelta;
}
}
}
else /*y改变得比x快*/
{
change=ydelta>>1;
while(y1!=y2)
{
PutPixel64K(x1,y1,color);
y1+=ystep;
change+=xdelta;
if(change>ydelta)
{
x1+=xstep;
change-=ydelta;
}
}
}
PutPixel64K(x2,y2,color);
}
/*通用的画线函数(可以画斜线),与上面相同,但用的是三角函数方式*/
void linex(int x1,int y1,int x2,int y2,unsigned int color)
{
int x01,x02,y01,y02;
int x0,y0;
double taga;
x01=x1;
x02=x2;
y01=y1;
y02=y2;
if(x1>x2)
{
x01=x2;
x02=x1;
y01=y2;
y02=y1;
}
taga=(((double)y02-(double)y01)/((double)x02-(double)x01));
for(x0=x01;x0<=x02;x0++)
{
y0 = y01+(int)((double)(x0-x01)*taga+0.5);
PutPixel64K(x0,y0,color);
}
}
/*以(x0,y0)为中心、a和b分别为水平和垂直半轴画一椭圆*/
void Draw_ellipse(int x0,int y0,int a,int b,unsigned int color)
{
int x,y;
float d1,d2;
x=0;
y=b;
d1=b*b+a*a*(-b+0.25);
PutPixel64K(x0+x,y0+y,color);
PutPixel64K(x0-x,y0-y,color);
PutPixel64K(x0-x,y0+y,color);
PutPixel64K(x0+x,y0-y,color);
while((x+1.0f)*b*b<(y-0.5f)*a*a)
{
if(d1<0)
{
d1+=(2.0f*x+3.0)*b*b;
x++;
}
else
{
d1+=(2.0f*x+3.0)*b*b+(-2.0f*y+2.0)*a*a;
x++;
y--;
}
PutPixel64K(x0+x,y0+y,color);
PutPixel64K(x0-x,y0-y,color);
PutPixel64K(x0-x,y0+y,color);
PutPixel64K(x0+x,y0-y,color);
}
d2=(x+0.5f)*b+(y-1.0f)*a-a*b;
while(y>0)
{
if(d2<0)
{
d2+=(2.0f*x+2)*b*b+(-2.0f*y+3)*a*a;
x++;
y--;
}
else
{
d2+=(-2.0f*y+3)*a*a;
y--;
}
PutPixel64K(x0+x,y0+y,color);
PutPixel64K(x0-x,y0-y,color);
PutPixel64K(x0-x,y0+y,color);
PutPixel64K(x0+x,y0-y,color);
}
}
/*以(x0,y0)为中心、a和b分别为水平和垂直半轴画一椭圆(填充)*/
void Draw_ellipse_Fill(int x0,int