显示字符出问题 jig
<P>这是我写的在图形模式下显示字符的程序,可是执行了却什么都没有。你只要帮忙看看函数ASCIIOut(),其他的是底层函数,用于在VESA显卡编程(感谢ROCARRY和董凯,抄袭了NEO里面 也参考了ROCARRY提供的VESA资料),还有作图的函数。出问题就是ASCIIOut()。附件是字库文件,ROCARRY提供的工具生成的。<br>#include <dos.h><br>#include<stdio.h><br>#define MAXX 640<br>#define MAXY 480</P><P>static float asp_ratio=1;</P>
<P>static void selectpage(int page) /*换页函数*/<br>{<br> union REGS r;<br> r.x.ax=0x4f05;<br> r.x.bx=0;<br> r.x.dx=page;<br> int86(0x10,&r,&r);<br>}</P>
<P>void init256(void)<br>{<br> union REGS r;<br> r.x.ax=0x4f02;<br> r.x.bx=0x101;<br> int86(0x10,&r,&r);<br>}</P>
<P>void exit256(void)<br>{<br> union REGS r;<br> r.h.ah=0;<br> r.h.al=3;<br> int86(0x10,&r,&r);<br>}</P>
<P>void PutPixel(int x,int y,int color)<br>{ long i;<br> static int t=0;<br> int tt=0;<br> char far *p=0xa0000000;<br> i=y;<br> i*=MAXX;<br> i+=x;<br> tt=i>>16;<br> i&=0xffff;<br> if(t!=tt) selectpage(tt);<br> *(p+i)=(char)color;<br> t=tt;<br>}</P>
<P>int GetPixel(int x,int y)<br>{<br>long i;<br>static int t=0;<br>int tt=0;<br>char far *p=0xa0000000;<br>i=y;<br>i*=MAXX;<br>i+=x;<br>tt=i<<16;<br>i&=0xffff;<br>if(t!=tt) selectpage(tt);<br>t=tt;<br>return((int)*(p+i));<br>}</P>
<P><br>void Line(int startx,int starty,int endx,int endy,int color)<br>{<br> register int t,distance;<br> int x=0,y=0,delta_x,delta_y;<br> int incx,incy;</P>
<P> delta_x=endx-startx;<br> delta_y=endy-starty;</P>
<P> if(delta_x>0) incx=1;<br> else if(delta_x==0) incx=0;<br> else incx=-1;<br> if(delta_y>0) incy=1;<br> else if(delta_y==0) incy=0;<br> else incy=-1;</P>
<P> if(delta_x<0) delta_x=-delta_x;<br> if(delta_y<0) delta_y=-delta_y;</P>
<P> if(delta_x>delta_y) distance=delta_x;<br> else distance=delta_y;</P>
<P> for(t=0;t<=distance+1;t++){<br> putpixel(startx,starty,color);<br> x+=delta_x;<br> y+=delta_y;<br> if(x>distance){<br> x-=distance;<br> startx+=incx;<br> }<br> if(y>distance){<br> y-=distance;<br> starty+=incy;<br> }<br> }<br>}</P>
<P>void Rectangle(int Startx,int Starty,int Endx,int Endy,int Color )<br>{<br> int i,j;<br> for(i=Startx;i<Endx;i++)<br> for(j=Starty;j<Endy;j++)<br> putpixel(i,j,Color);<br>}<br>void ASCIIOut(int c, int cx, int cy, int color)/*主要就是这个函数的问题*/<br>{<br> unsigned int i,j,bit,k;<br> FILE *fp;<br> unsigned int buffer[16];<br> unsigned int size=16;<br> fp=fopen("ASC1616","rb");<br> if(fp==NULL) { fclose(fp);<br> printf("open file failled !");<br> exit(0);<br> }<br> fseek(fp,c*32,0);<br> fread(buffer,size,16,fp);<br> for (i= 0; i< 16; i++)/*16X16的点阵字库*/<br> { <br> bit =0x8000;<br> for(j=0;j<16;j++)<br> { k=buffer[i]&bit;<br> k=k>>(15-j);<br> if(k==1)<br> PutPixel(cx+j,cy+i, color);<br> bit=bit>>1;<br> }<br> }<br> fclose(fp);/*我单步跟踪到这程序就自己完了*/<br>}<br>int getkey()<br>{ union REGS rg;<br> rg.h.ah=0;<br> int86(0x16,&rg,&rg);<br> return rg.x.ax;<br>}<br>void initback(int color)<br>{<br> int i,j;<br> for (i=0;i<480;i++)<br> for (j=0;j<640;j++)<br> PutPixel(j,i, color);<br> <br>}<br>main()/*只是调用写字符的函数*/<br>{ <br> int x=100,y=100,color=35;<br> init256();<br> initback(35);<br> /*Rectangle(j*40,i*30,j*40+20,i*30+20,i*16+j);<br> for(i=0;i<10;i++)*/<br> ASCIIOut(48,500,400,70);<br> /*ASCIIOut(96,300,200,9);<br> box(x,y,x+100,y+100,color);<br> circle(x+200,y+150,200,color);<br> fillbox(200,200,350,350,color);*/<br> while(getkey()!=0X5000)<br> { }<br> exit256();<br>}<br></P>
[align=right][color=#000066][此贴子已经被作者于2007-4-15 15:45:00编辑过][/color][/align]
<P> QM = *qw - 160;<BR> WM = *(qw+1) - 160;<BR> offset = ((QM-1)*94+WM-1)*32L;<BR> Read_From_XMS(buf,32,xms_handle,offset);<BR>}<BR><BR><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////中英文混合输出函数<BR>//// p = 汉字串(可能包括英文及数字)<BR>//// d = 字符之间的间距<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl puthz(int x,int y,char *p,int color,int d)<BR>{<BR> unsigned int i,j;<BR> unsigned char ch;<BR> unsigned char matrix[32];</P>
<P> while((ch=*p++)!=0)<BR> {<BR> if(ch > 0xA0)<BR> {<BR> p--;<BR> ReadHzkBit(p,matrix);<BR> for(j = 0 ; j < 16 ; j++)<BR> for(i = 0 ; i < 16 ; i++)<BR> if(matrix[2*j+i/8] & (0x80>>i%8))<BR> PutPixel(i+x,y+j,color);<BR> p++;<BR> p++;<BR> x+=16+d;<BR> }<BR> else // 显示8*16点阵英文字符<BR> {<BR> for(i=0;i<16;i++)<BR> {<BR> matrix[i*2]=*(ROM_ASCII+(ch)*16+i);<BR> matrix[i*2+1]=0; // 字模右边8位补0<BR> }<BR> for(j=0;j<16;j++)<BR> for(i=0;i<8;i++)<BR> if (matrix[2*j+i/8] & (0x80>>i%8))<BR> PutPixel(i+x,y+j,color);<BR> x+=8+d;<BR>/*----------------------------------------------------------------------*/<BR>// 如果采用8X8点阵字模显示英文及数字,请采用如下代码<BR>/*----------------------------------------------------------------------*/<BR>/* for(i=0;i<8;i++)<BR> buf[i]=*(ROM_ASCII+(ch)*8+i);<BR> for(j=0;j<8;j++)<BR> for(i=0;i<8;i++)<BR> if((0x80>>i%8)&buf[j+i/8])<BR> POPUP_PutPixel(i+x,y+j+5,color);<BR> //else<BR> // POPUP_PutPixel(i+x,y+j+5,Back_Color);<BR> x+=8+d;*/<BR> }<BR> }<BR>}</P>
页:
[1]
