| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3813 人关注过本帖
标题:关于NEO在486上运行的问题
只看楼主 加入收藏
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 
我用VESA,设置成101,设置成640X480X256是和<graphics.h>不兼有容吗?它们两分开就单个的就好使,合在一起时,屏幕就一闪就过去了,
如果是的话,那我画鼠标用什么画点(putpixel)函数呀,我看NEO没看明白呀,NEO是怎么画鼠标的呀?
我看有网上说,鼠标驱动程序一般不处理SVGA显示模式,是不是?
Svga256.bgi这个我也用了,是不是和<graphics.h>不兼有容呀?


如果要是举例的话,我手头一大堆这样的例子,只是我在单位的机器不能上网,家里能,我会从单位带会来的,麻烦你,在帮我看看
2007-06-27 17:21
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 

是的,NEO和Graphics不兼容,你不能同时使用它们。NEO提供了一些函数名和Graphics一样的函数,但那些实际上还是NEO自己的函数,和后者无关,只是为了让习惯了Graphics的用户感到方便而已。你可以试试(基本绘图函数一节中有使用方法)。NEO话鼠标不难,example文件夹中有两个例子。你可以发你的代码给我,我给你改改看

2007-06-27 22:42
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 


#include <dos.h>
#include <stdio.h>
#include <mem.h>
#include <alloc.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>

#define VBE320X200X256 0X13
#define VBE640X480X256 0X101
#define VBE800X600X256 0X103
#define VBE1024X768X256 0X105
#define True 1
#define False 0
#define VARM_GRAPH_800(x,y) (((unsigned long)y<<9L)+((unsigned long)y<<7L)+((unsigned long)(x)))
#define WAITING 0xff00
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define RIGHTPRESS 0xff02
#define RIGHTCLICK 0xff20
#define RIGHTDRAG 0xff2a
#define MIDDLEPRESS 0xff04
#define MIDDLECLICK 0xff40
#define MIDDLEDRAG 0xff4c
#define MOUSEMOVE 0xff08int Keystate;

/************************************************mouse************************************/
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;

int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16];
void MouseMath()/*计算鼠标的样子*/
{int i,j,jj,k;
long UpNum[16]={
0x3fff,0x1fff,0x0fff,0x07ff,
0x03ff,0x01ff,0x00ff,0x007f,
0x003f,0x00ff,0x01ff,0x10ff,
0x30ff,0xf87f,0xf87f,0xfc3f
};
long DownNum[16]={
0x0000,0x7c00,0x6000,0x7000,
0x7800,0x7c00,0x7e00,0x7f00,
0x7f80,0x7e00,0x7c00,0x4600,
0x0600,0x0300,0x0300,0x0180
};
for(i=0;i<16;i++)
{
j=jj=15;
while(UpNum[i]!=0)
{
up[i][j]=UpNum[i]%2;
j--;
UpNum[i]/=2;
}
while(DownNum[i]!=0)
{
down[i][jj--]=DownNum[i]%2;
DownNum[i]/=2;
}
for(k=j;k>=0;k--)
up[i][k]=0;
for(k=jj;k>=0;k--)
down[i][k]=0;
for(k=0;k<16;k++)/*四种组合方式*/
{
if(up[i][k]==0&&down[i][k]==0)
mouse_draw[i][k]=1;
else if(up[i][k]==0&&down[i][k]==1)
mouse_draw[i][k]=2;
else if(up[i][k]==1&&down[i][k]==0)
mouse_draw[i][k]=3;
else
mouse_draw[i][k]=4;
}
}
mouse_draw[1][2]=4;/*特殊点*/
}
/*鼠标光标显示*/
void MouseOn(int x,int y)
{
int i,j;
int color; for(i=0;i<16;i++)/*画鼠标*/
{
for(j=0;j<16;j++)
{
pixel_save[i][j]=getpixel(x+j,y+i);/*保存原来的颜色*/
if(mouse_draw[i][j]==1)
putpixel(x+j,y+i,0);
else if(mouse_draw[i][j]==2)
putpixel(x+j,y+i,15);
}
}
}
/*隐藏鼠标*/
void MouseOff()
{
int i,j,x,y,color;
x=MouseX;
y=MouseY;
for(i=0;i<16;i++)/*原位置异或消去*/
for(j=0;j<16;j++)
{
if(mouse_draw[i][j]==3||mouse_draw[i][j]==4)
continue;
color=getpixel(x+j,y+i);
putpixel(x+j,y+i,color^color);
putpixel(x+j,y+i,pixel_save[i][j]);
}
}
/*鼠标是否加载
MouseExist:1=加载
0=未加载
MouseButton:鼠标按键数目 */
void MouseLoad()
{
_AX=0x00;
geninterrupt(0x33);
MouseExist=_AX;
MouseButton=_BX;
}/*鼠标状态值初始化*/
void MouseReset()
{
_AX=0x00;
geninterrupt(0x33);
}/*设置鼠标左右边界
lx:左边界
gx:右边界 */
void MouseSetX(int lx,int rx)
{
_CX=lx;
_DX=rx;
_AX=0x07;
geninterrupt(0x33);
}/*设置鼠标上下边界
uy:上边界
dy:下边界 */
void MouseSetY(int uy,int dy)
{
_CX=uy;
_DX=dy;
_AX=0x08;
geninterrupt(0x33);
}/*设置鼠标当前位置
x:横向坐标
y:纵向坐标 */
void MouseSetXY(int x,int y)
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}/*设置鼠标速度(缺省值:vx=8,vy=1)
值越大速度越慢 */
void MouseSpeed(int vx,int vy)
{
_CX=vx;
_DX=vy;
_AX=0x0f;
geninterrupt(0x33);
}/*获取鼠标按下键的信息*/
/*是否按下左键
返回值: 1=按下 0=释放*/
int LeftPress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}/*是否按下中键
返回值同上 */
int MiddlePress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&4);
}/*是否按下右键
返回值同上 */
int RightPress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
}/*获取鼠标当前位置*/
void MouseGetXY()
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}int MouseStatus()/*鼠标按键情况*/
{
int x,y;
int status;
int press=0;int i,j,color;
status=0;/*默认鼠标没又移动*/
x=MouseX;
y=MouseY;
while(x==MouseX&&y==MouseY&&status==0&&press==0)
{
if(LeftPress()&&RightPress())
press=1;
else if(LeftPress())
press=2;
else if(RightPress())
press=3;
MouseGetXY();
if(MouseX!=x||MouseY!=y)
status=1;
}
if(status)/*移动情况才重新显示鼠标*/
{
for(i=0;i<16;i++)/*原位置异或消去*/
for(j=0;j<16;j++)
{
if(mouse_draw[i][j]==3||mouse_draw[i][j]==4)
continue;
color=getpixel(x+j,y+i);
putpixel(x+j,y+i,color^color);
putpixel(x+j,y+i,pixel_save[i][j]);
}
MouseOn(MouseX,MouseY);/*新位置显示*/
}
if(press!=0)/*有按键得情况*/
return press;
return 0;/*只移动得情况*/
}

/************************************************mouse************************************/


/************************************************BMP************************************/
typedef struct BIGIMAGE /*存图结构*/
{
char fill_name[16];
int height;
int width;
} BIGIMAGE; /*存图类型名*/

typedef struct tagRGBQUAD /*用于读取调色板信息*/
{
char r;
char g;
char b;
char reserved;
} RGBQUAD;
int g_cur_vbe_page = 0;

void _Cdecl InitGraph(void)
{
_AX = 0x4f02;
_BX = VBE640X480X256;
__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 selectpage(register char page) /*换页函数*/
{
union REGS r;

r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page; /*选择页面*/
int86(0x10,&r,&r);
}

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);
}
}

/*******************************************BMP图显示函数**********************************/
void show_bmp_256(char *File_Name, int x, int y) /*图片显示函数,不支持透明色*/
{
unsigned char buffer[9216];
unsigned int width, height, linebytes;
int i, j;
long addr;
int page;
char far *videoptr = (char far *)0xa0000000L;
RGBQUAD bmiColors[256];
FILE *fp;

/****************************读文件,判断是否符合条件*****************************/
if ((fp=fopen(File_Name,"rb"))==NULL) /*判断打开文件是否正确*/
{
printf("Can't open file: %s",File_Name);
bioskey(0);
exit(0);
}
fseek(fp,18L,SEEK_SET); width = getw(fp);/*图片宽度*/
fseek(fp,22L,SEEK_SET); height = getw(fp);/*图片高度*/
/********************************************************************************/
/* 设置当前图片的调色板 */
/********************************************************************************/
fseek(fp, 54L, SEEK_SET);
if (fread((char *)&bmiColors[0], 4, 256, fp) != 256) /* 读当前图片调色板数据 */
{
printf("Can't get palette !\n");
bioskey(0);
exit(0);
}
for (i = 0; i < 256; i++)
{
outportb(0x03C8, i);
outportb(0x03C9, bmiColors[i].b >> 2);
outportb(0x03C9, bmiColors[i].g >> 2);
outportb(0x03C9, bmiColors[i].r >> 2);
}
/*************************************************************************/
if(width%4 != 0)
linebytes = width+(4-width%4); /* 每行字节数--4的整数倍 */
else
linebytes = width;
fseek(fp,1078L,SEEK_SET); /* 跳到位图数据的起始位置 */
for(j = height-1; j >= 0; j--)
{
fread(buffer, linebytes, 1, fp);
for(i = 0; i < width; i++)
{
addr = VARM_GRAPH_800(i+x,j+y);
page = (int)(addr >> 16);
set_vbe_page(page);
if((i+x) > -1 && (i+x) < 640 && (j+y) > -1 && (j+y) < 480) /*在屏幕范围*/
*(videoptr+(unsigned int)(addr&0xffff))= buffer[i];
}
}
fclose(fp);
}

/*****************************************************************************************************/
void main(void)
{
InitGraph();
show_bmp_256("1-1.bmp",0,0);
MouseMath();/*计算鼠标形状,一开始必须使用,后面就不用了*/
MouseSetY(0,479);
MouseSetX(0,639);
MouseSetXY(100,100);
MouseOn(MouseX,MouseY);/*第一次显示鼠标*/
while(!kbhit())
{
switch(MouseStatus())
{/*双键按下画黄点*/
case 1:MouseOff();
putpixel(MouseX,MouseY,YELLOW);
MouseGetXY();
MouseOn(MouseX,MouseY);break;
/*左键按下画红点*/
case 2:
MouseOff();
show_bmp_256("2-1.bmp",0,0);
MouseGetXY();
MouseOn(MouseX,MouseY);break;
/*右键按下画绿点*/
case 3:
MouseOff();
putpixel(MouseX,MouseY,GREEN);
MouseGetXY();
MouseOn(MouseX,MouseY);break;
default:break;
} /* switch*/
} /*while*/
CloseGraph();
}

这个是640X480X256,为什么这个程序一闪就过呢?是不是与graphics.h不兼容呀?如果是的话,那么画鼠标不用putpixel,那用什么画呀?

还有能不能推荐两本书,我好上网上书店买两本,手头上什么也没有就靠上网找点东西也不行呀,还是不明白呀?

在NEO中用什么方法显示BMP的,为什么我显示没有你的那么快呢?你的也太快了,

费心了,帮忙看看


2007-06-28 18:39
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
NEO和Graphics的确不兼容,不论是色深还是函数接口。你只能使用其一,不过你可以试下陈凯的Graphics++,那是Graphics的加强版,用的是扩展BGI库。
书的话似乎不多,我当时做的时候主要是揣摩别人的源码再结合VESA文档慢慢弄的。
NEO显示BMP的速度其实还不够快,如果重写的话我可以让它快的更多(可能达到一倍)。
2007-06-28 21:25
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 
我上面的程序并没有用NEO呀,而是用svga的101H,好像是和Graphics不兼容,
你用什么方法显示BMP的能大概说一下吗?你那个NEO实在太复杂了,看不明白呀
2007-06-29 17:22
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 

不好兼容哪
我就把BMP文件打开然后读出来显示到显存中啊,不过优化了一下而已。主步骤就是这样子的

2007-06-29 21:29
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 
怎么优化的,能大概说说吗?
2007-06-30 07:31
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 

班主,大概说说你是怎么优化的贝

2007-07-04 20:23
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
运算强度减弱,循环展开,空间换时间,充分利用CPU字长等等,这都是些常见简单的优化方法,
像内嵌汇编和更多的优化手段还没使用,如果全部用上,性能还能再提升一个档次。
2007-07-05 08:32
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 
这么复杂呀,就像这上一段程序

for(j = height-1; j >= 0; j--)
{
fread(buffer, linebytes, 1, fp);
for(i = 0; i < width; i++)
{
addr = VARM_GRAPH_800(i+x,j+y);
page = (int)(addr >> 16);
set_vbe_page(page);
if((i+x) > -1 && (i+x) < 640 && (j+y) > -1 && (j+y) < 480) /*在屏幕范围*/
*(videoptr+(unsigned int)(addr&0xffff))= buffer[i];
}
}
这个也没什么好方法优化了呀?
2007-07-06 18:43
快速回复:关于NEO在486上运行的问题
数据加载中...
 
   



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

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