| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3811 人关注过本帖
标题:关于NEO在486上运行的问题
只看楼主 加入收藏
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
优化是没有公式可循的啊,实际情况实际处理。
2007-07-22 18:40
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 

就那下面的程序来说吧,这个算是直接写屏吧,也优化了吧,可和svga256那个速度一样慢呀?

#include <dos.h>
#include <stdio.h>
#include <mem.h>
#include <alloc.h>
#include <stdlib.h>
#include <conio.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)))

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.bmp",0,0);
getch();

CloseGraph();}

2007-07-24 17:18
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
if((i+x) > -1 && (i+x) < 640 && (j+y) > -1 && (j+y) < 480) /*在屏幕范围*/
提到循环外
*(videoptr+(unsigned int)(addr&0xffff))= buffer[i];
换成内存拷贝函数
2007-07-24 21:36
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 
在电脑(cpu 2.6G,内存512M)上用tc2.0运行程序时(XP系统),能通过,可拿到486(640k常规内存)上就运行时,出现Out of memory in function,程序中并没有使用EMS,XMS呀,在dos下对使用内存上应该是一样的吧?为什么在486上不能运行呢?
2007-07-28 19:40
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 

不要总是用TC20打开你的代码再RUN,LINK了你的程序之后就可以得到一个EXE,它可以到处运行,当然,如果使用了SVGA.bgi的话还要带上这个文件。

2007-07-29 11:02
beyondabcd
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2007-5-19
收藏
得分:0 

在使svga256.bgi 时,与C语言中的graphics.h库中的setfillstyle,bar,setcolor等一些语句中,虽然兼容,但写到一定长度的程序时,有些不稳定呀(大多数时不行,但有极少数时好使);这是怎么回事,是我的程序不对吗?

当申请两次空间时,为什么不行(第一次申请malloc,不释放的情况下,申请第二次,为什么申请不下来呢?)

2007-08-04 20:03
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
应该还是你程序的问题,我很久以前有SVGA.bgi写了一个增强型图形库,也满大的,也没出什么问题。
如果你是小模式或中模式,用malloc能申请到的总量是64KB,如果你用的大模式或紧凑或巨模式,就是640KB,但这是理论值,你的程序本身还要占一部分内存。
2007-08-05 11:56
快速回复:关于NEO在486上运行的问题
数据加载中...
 
   



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

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