hjj1123 发表于 2007-4-15 15:43

显示字符出问题 jig

<P>这是我写的在图形模式下显示字符的程序,可是执行了却什么都没有。你只要帮忙看看函数ASCIIOut(),其他的是底层函数,用于在VESA显卡编程(感谢ROCARRY和董凯,抄袭了NEO里面 也参考了ROCARRY提供的VESA资料),还有作图的函数。出问题就是ASCIIOut()。附件是字库文件,ROCARRY提供的工具生成的。<br>#include &lt;dos.h&gt;<br>#include&lt;stdio.h&gt;<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,&amp;r,&amp;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,&amp;r,&amp;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,&amp;r,&amp;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&gt;&gt;16;<br>  i&amp;=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&lt;&lt;16;<br>i&amp;=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&gt;0) incx=1;<br>    else if(delta_x==0) incx=0;<br>    else incx=-1;<br>    if(delta_y&gt;0) incy=1;<br>    else if(delta_y==0) incy=0;<br>    else incy=-1;</P>
<P>    if(delta_x&lt;0) delta_x=-delta_x;<br>    if(delta_y&lt;0) delta_y=-delta_y;</P>
<P>    if(delta_x&gt;delta_y) distance=delta_x;<br>    else distance=delta_y;</P>
<P>    for(t=0;t&lt;=distance+1;t++){<br>        putpixel(startx,starty,color);<br>        x+=delta_x;<br>        y+=delta_y;<br>        if(x&gt;distance){<br>            x-=distance;<br>            startx+=incx;<br>        }<br>        if(y&gt;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&lt;Endx;i++)<br>    for(j=Starty;j&lt;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&lt; 16; i++)/*16X16的点阵字库*/<br>       {    <br>              bit =0x8000;<br>             for(j=0;j&lt;16;j++)<br>        {    k=buffer[i]&amp;bit;<br>            k=k&gt;&gt;(15-j);<br>            if(k==1)<br>               PutPixel(cx+j,cy+i, color);<br>                   bit=bit&gt;&gt;1;<br>        }<br>        }<br>        fclose(fp);/*我单步跟踪到这程序就自己完了*/<br>}<br>int getkey()<br>{    union REGS rg;<br>    rg.h.ah=0;<br>    int86(0x16,&amp;rg,&amp;rg);<br>    return rg.x.ax;<br>}<br>void initback(int color)<br>{<br>    int i,j;<br>    for (i=0;i&lt;480;i++)<br>      for (j=0;j&lt;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&lt;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]

hjj1123 发表于 2007-4-15 15:45

晕,有传不上去。JIG 帮忙看看。

ba_wang_mao 发表于 2007-4-16 16:43

<P>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////中英文混合输出函数<BR>////unsigned char mat[16][2],<BR>////for(j=0;j&lt;16;j++)<BR>////        for(i=0;i&lt;2;i++)<BR>////            for(k=0;k&lt;8;k++)<BR>////                if(mat[j][i]&amp;(0x80&gt;&gt;k)) /*测试为1的位则显示*/<BR>////                    putpixel(i*8+k+x,j+y,WHITE);<BR>//// x,y 为入口参数屏幕显示英文字符位置<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR></P>

ba_wang_mao 发表于 2007-4-16 16:48

<P>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    汉字点阵字模从XMS读到缓冲区buf中<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl ReadHzkBit(unsigned char *qw,unsigned char *buf)<BR>{<BR>    unsigned short QM,WM;<BR>    long offset;</P>
<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 &gt; 0xA0)<BR>        {<BR>            p--;<BR>            ReadHzkBit(p,matrix);<BR>            for(j = 0 ; j &lt; 16 ; j++)<BR>                for(i = 0 ; i &lt; 16 ; i++)<BR>                    if(matrix[2*j+i/8] &amp; (0x80&gt;&gt;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&lt;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&lt;16;j++)<BR>                for(i=0;i&lt;8;i++)<BR>                    if (matrix[2*j+i/8] &amp; (0x80&gt;&gt;i%8))<BR>                       PutPixel(i+x,y+j,color);<BR>            x+=8+d;<BR>/*----------------------------------------------------------------------*/<BR>//    如果采用8X8点阵字模显示英文及数字,请采用如下代码<BR>/*----------------------------------------------------------------------*/<BR>/*            for(i=0;i&lt;8;i++)<BR>                buf[i]=*(ROM_ASCII+(ch)*8+i);<BR>            for(j=0;j&lt;8;j++)<BR>                for(i=0;i&lt;8;i++)<BR>                    if((0x80&gt;&gt;i%8)&amp;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]

编程论坛