阅读:1833回复:8
怎样访问整个1024*768屏幕的视频缓冲区,还是不懂。(turbo c )
我想使用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); } |
|
沙发#
发布于:2002-11-04 14:17
问题是不1024*768已经设置正确了,屏幕已有彩条输出,
只是只能访问到视频缓冲区一页地址。(整屏显示 1024*768需几页地址)在程序中我也作了换页写 屏幕,就是不行。 |
|
板凳#
发布于:2002-11-04 14:01
C语言的版本为什么可以(我们假设那位兄弟说的是真的)?因为他设置显示模式是调用Turbo C的库函数,而那个库函数有可能使用的borland提供的显卡驱动程序来实现的。所以你要是设置不成功的话,要么用别人的开发包,要么自己操纵显卡寄存器。
|
|
地板#
发布于:2002-11-04 13:58
你可以跟踪一下10H设置显示模式的那段,我估计那个地方应该是失败了。
|
|
地下室#
发布于:2002-11-04 13:57
根据你上面的程序,你用的是10H中断来设置显示模式,然后自己操纵显存,我估计最大的可能就是dos 10H不支持那么高的显示模式。
|
|
5楼#
发布于:2002-11-04 13:55
看了你的程序,还好我粗懂一些DOS下的玩艺,我记得首先是要设置显示模式成为 1024*768,一般都是通过中断10H的功能实现,然后可以调用10H的功能写像素,或者自己写显存,如果你的dos版本不够的话,或者显卡dos不认识,我估计就不支持。
|
|
6楼#
发布于:2002-11-04 13:26
To seven:
我刚试过你的程序,它仅能作到640*480 怎么作到1024*768? 不过我非常感谢你支持! |
|
7楼#
发布于:2002-11-04 13:11
To seven:
这个程序能使屏幕1024*768吗? 我先试一试啊! |
|
8楼#
发布于: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(); } 相信你能看懂,如果不明白或有什么问题,我们可以交流。 |
|
|