jli1976929
驱动牛犊
驱动牛犊
  • 注册日期2002-05-27
  • 最后登录2006-08-25
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1832回复:8

怎样访问整个1024*768屏幕的视频缓冲区,还是不懂。(turbo c )

楼主#
更多 发布于:2002-11-04 09:07
我想使用turbo C语言输出1024*768f分辨率DOS满屏界面,结果
只在屏幕顶部输出一条彩带,请教怎么样使整个屏障输出彩条?
屏幕输出见附图。
#include <dos.h>
void changepage(int x)
{
union REGS Regs;
Regs.h.ah=0x4f;
Regs.h.al=5;
Regs.h.bh=0;
Regs.x.dx=x;
int86(0x10,&Regs,&Regs);
}
putpixel(int x,int y)
{
int scanleng=1024;
asm {
  mov ax,y
  mul scanleng
  add ax,x
 jnc jemp1
  inc dx
  }
jemp1:
asm{
   mov di,ax
   cmp dx,0
   je jemp2
   }
   //changepage(1);
   jemp2:
   asm{
   //mov di,ax
   mov ax,0a000h
   mov es,ax
   mov al,3
   mov es:[di],al
   }
   }
   void SetScr(int mode)
{union REGS Regs;
Regs.x.ax=0x4f02;
Regs.x.bx=mode;
int86(0x10,&Regs,&Regs);}
void SetScr1(int mode)
{union REGS Regs;
//Regs.x.ax=0x03;
Regs.x.ax=mode;
int86(0x10,&Regs,&Regs);}
void main(void)
{
int x,y;
SetScr(0x105);
//outportb(0x3ce,0x06);
//outportb(0x3cf,0x02);
outportb(0x3c4,0x04);
outportb(0x3c5,0xf4);
  // changepage(2);
for(y=0;y<=600;y++)
{
for(x=0;x<=1024;x++)
putpixel(x,y);
}
getch();
SetScr1(3);
}
seven
驱动小牛
驱动小牛
  • 注册日期2001-04-03
  • 最后登录2007-03-28
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-04 12:44
看到了你的19分,所以我就来回答你了。呵呵。不过,你那里用了太多的汇编,我不知道问题出在什么地方。但我可以给你一个纯C的代码,你可以自己研究研究:#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#define maxx 480
#define maxy 480
main()
{int k,m,r;
 float x,y;
 long int i;
 float a[4][6];
 int color[]={1,2,15};
 int gd=DETECT,gm=VGAHI;
 a[0][0]=0.5;a[0][1]=0;a[0][2]=0;
 a[0][3]=0.5;a[0][4]=0;a[0][5]=0;
 a[1][0]=0.5;a[1][1]=0;a[1][2]=0;
 a[1][3]=0.5;a[1][4]=2;a[1][5]=0;
 a[2][0]=-0.4;a[2][1]=0;a[2][2]=1;
 a[2][3]=0.4;a[2][4]=0;a[2][5]=1;
 a[3][0]=-0.5;a[3][1]=0;a[3][2]=0;
 a[3][3]=0.5;a[3][4]=2;a[3][5]=1;
 initgraph(&gd,&gm,\"\");
 setbkcolor(7);
 randomize();
 i=0;
 x=0;y=0;
 while(!kbhit())
 {i=i+1;
  k=random(4);
  x=a[k][0]*x+a[k][1]*y+a[k][4];
  y=a[k][2]*x+a[k][3]*y+a[k][5];
  r=random(100);
  if(r<2) m=color[0];
  else if(r<3) m=color[1];
  else m=color[2];
  if(i>100) putpixel((int)(maxx*x/2),maxy-(int)(maxy*y/2),m);
 }
 closegraph();
}
相信你能看懂,如果不明白或有什么问题,我们可以交流。
我爱中医:http://www.ngotcm.com/forum/index.php
jli1976929
驱动牛犊
驱动牛犊
  • 注册日期2002-05-27
  • 最后登录2006-08-25
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-04 13:11
To seven:

这个程序能使屏幕1024*768吗?
我先试一试啊!
jli1976929
驱动牛犊
驱动牛犊
  • 注册日期2002-05-27
  • 最后登录2006-08-25
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-04 13:26
To seven:

我刚试过你的程序,它仅能作到640*480
怎么作到1024*768?
不过我非常感谢你支持!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地下室#
发布于:2002-11-04 13:55
看了你的程序,还好我粗懂一些DOS下的玩艺,我记得首先是要设置显示模式成为 1024*768,一般都是通过中断10H的功能实现,然后可以调用10H的功能写像素,或者自己写显存,如果你的dos版本不够的话,或者显卡dos不认识,我估计就不支持。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2002-11-04 13:57
根据你上面的程序,你用的是10H中断来设置显示模式,然后自己操纵显存,我估计最大的可能就是dos 10H不支持那么高的显示模式。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
6楼#
发布于:2002-11-04 13:58
你可以跟踪一下10H设置显示模式的那段,我估计那个地方应该是失败了。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
7楼#
发布于:2002-11-04 14:01
C语言的版本为什么可以(我们假设那位兄弟说的是真的)?因为他设置显示模式是调用Turbo C的库函数,而那个库函数有可能使用的borland提供的显卡驱动程序来实现的。所以你要是设置不成功的话,要么用别人的开发包,要么自己操纵显卡寄存器。
jli1976929
驱动牛犊
驱动牛犊
  • 注册日期2002-05-27
  • 最后登录2006-08-25
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-04 14:17
问题是不1024*768已经设置正确了,屏幕已有彩条输出,
只是只能访问到视频缓冲区一页地址。(整屏显示
1024*768需几页地址)在程序中我也作了换页写
屏幕,就是不行。
游客

返回顶部