⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 et6000.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
📖 第 1 页 / 共 3 页
字号:
    case SVGADRV:DPRT("SVGADRV\n");	    break;    default:	return 1;		/* mode not available */    }    modeinfo = __svgalib_createModeInfoStructureForSvgalibMode(mode);    modetiming = malloc(sizeof(ModeTiming));    if(__svgalib_getmodetiming(modetiming,modeinfo,cardspecs))      {	free(modetiming);	free(modeinfo);	return(1);      }    moderegs = malloc(ET6000_TOTAL_REGS);    et6000_initializemode(moderegs,modetiming,modeinfo,mode);#ifdef DBG    fprintf(fdm,"In setmode.\n");    pmodetiming(modetiming);    fdumpregs(fdm,moderegs,ET6000_TOTAL_REGS);#endif	__svgalib_setregs(moderegs);	et6000_setregs(moderegs,mode);	free(moderegs);	free(modeinfo);	return(0);}static int  et6000_modeavailable(int mode){  int rtn;  struct info *info;  ModeTiming *modetiming;  ModeInfo *modeinfo;  if(mode == G720x348x2 || mode == GPLANE16 || mode < G640x480x256 )    return(__svgalib_vga_driverspecs.modeavailable(mode));  if(mode <= TEXT || mode > GLASTMODE)    return(0);  info = &__svgalib_infotable[mode];  if(et6000_memory*1024*1024 < info->ydim*info->xbytes)    return(0);       /* The xbytes is xdim*bytesperpixel                     ** The DAC is built in and I should be able to create		     **	anything I have memory for.  I will DISABLE_MODE what		     ** I can't handle. */  modeinfo = __svgalib_createModeInfoStructureForSvgalibMode(mode);  modetiming = malloc(sizeof(ModeTiming));#ifdef DBG  fprintf(fdm,"Calling getmodetiming\n");#endif  if(__svgalib_getmodetiming(modetiming,modeinfo,cardspecs))    rtn = 0;  else if(modetiming->flags & INTERLACED)      rtn = 0;  else if(modetiming->flags & DOUBLESCAN && (modeinfo->bytesPerPixel == 1))    rtn = 0;  else    rtn = SVGADRV;#ifdef DBG  pmodeinfo(modeinfo);  pmodetiming(modetiming);  fprintf(fdm,"Mode %d %s.\n",mode,rtn?"OK":"failure");#endif  free(modetiming);  free(modeinfo);  return(rtn);}static void et6000_setdisplaystart(int address){  DPRT("setdisplaystart");  outw(x3_4, 0x0d + ((address ) & 0x00ff)*256);      /* ds0-7  */  outw(x3_4, 0x0c + ((address ) & 0xff00)*256);      /* ds0 15 */  /* inb(x3_a);                This was from the et4000 card /? ATC write      outb(0x3c0,0x13 + 0x20);                                      mode.     outb(0x3c0,(inb(0x3c1) & 0xf0) | ((address & 3) << 1));  ds0-1  */  outb(x3_4, 0x33);  outb(x3_5, (inb(x3_5) & 0xfc)  | ((address & 0xf0000) >> 16 ));                                                          /* ds 16-19 */}static void et6000_setlogicalwidth(int width){  DPRT("setlogicalwidth");  outw(x3_4,0x13 + (((width >> 3 ) & 0xff) << 8));       /* lw3-10 */  outb(x3_4 ,0x3f);  outb(x3_5,(inb(x3_5) & 0x3f) | ((width & 0x1800) >> 3)); /* lw11-12 */}static void et6000_getmodeinfo(int mode,vga_modeinfo *modeinfo){  switch(modeinfo->colors){  case 16:    modeinfo->maxpixels = 65536*8;    break;  default:    if(modeinfo->bytesperpixel > 0)      modeinfo->maxpixels = et6000_memory*1024*1024/	modeinfo->bytesperpixel;    else      modeinfo->maxpixels = et6000_memory*1024*1024;    break;  }  modeinfo->maxlogicalwidth = 4088;              /* Why? */  modeinfo->startaddressrange = 0xfffff;  /* Mask for the startaddress */  if(mode == G320x200x256)    modeinfo->startaddressrange = 0;  modeinfo->haveblit = 0;  modeinfo->memory = et6000_memory*1024;         /* In kbytes. */  modeinfo->flags |= HAVE_RWPAGE | HAVE_EXT_SET;  if(et6000_interlaced(mode))    modeinfo->flags |= IS_INTERLACED;  modeinfo->flags |= EXT_INFO_AVAILABLE;#ifdef DB6K  fprintf(outf,"Getmodeinfo mode = %d, colors = %d, linearset = 0x%x "           ,mode,modeinfo->colors,__svgalib_modeinfo_linearset);#endif    if((mode > LMODEMIN) && (mode < LMODEMAX)) {      modeinfo->flags |= (__svgalib_modeinfo_linearset | CAPABLE_LINEAR); #ifdef DB6K      fprintf(outf,"flag = 0x%x\n",modeinfo->flags);#endif    }  modeinfo->chiptype = et6000_chiptype;            /* is set in vgamisc.c  */  modeinfo->linewidth_unit = 8;  modeinfo->aperture_size = et6000_memory*1024;#ifdef DB6K  fprintf(outf,"\nModeinfo at the end of the subroutine:\n");  prtmodeinfo(modeinfo);  fprintf(outf,"Text mode errors = %d\n",compareregs());}static void prtmodeinfo(vga_modeinfo *m){  fprintf(outf,"width\t\t\t%4d\nheight\t\t\t%4d\nbytesperpixel\t\t%4d\\ncolors\t\t\t%4d\nlinewidth\t\t%4d\nmaxlogicalwidth\t\t%4d\\nstartaddressrange\t%4d\nmaxpixels\t\t%4d\nhaveblit\t\t%4d\nflags\t\t\t%4x\\nchiptype\t\t%4d\nmemory\t\t\t%4dkbytes\nlinewidth_unit\t\t%4d\\nlinear_aperture\t\t%s\naperture_size\t\t%4d\nset_aperture_page\t%4x\\nextensions\t\t%4s\n",	  m->width,m->height,m->bytesperpixel,m->colors,m->linewidth,	  m->maxlogicalwidth,m->startaddressrange,m->maxpixels,m->haveblit,	  m->flags,m->chiptype,m->memory,m->linewidth_unit,	  m->linear_aperture ? "available":"not available",m->aperture_size,	  m->set_aperture_page ? (int) *m->set_aperture_page :(int) 0,	  m->extensions ? "yes" : "no");}static int compareregs(void){  int n,i;  n = 0;    if(textset == 0) {      textstore = malloc(MAX_REGS);      vgatextstore = malloc(MAX_REGS);      textset = 1;    }    if(textset == 1) {      vga_gettextmoderegs(textstore);      fputc('C',outf);      if(textstore[25] == 1) 	textset = 2;    }    if(textset == 2) {	vga_gettextmoderegs(vgatextstore);      fprintf(outf,"textstore = %x and vgatextstore = %x.\n",(int) textstore,	   (int) vgatextstore);      for(i = 0;i < 73;i++) {	if(textstore[i] != vgatextstore[i]) {	  fprintf(outf,"register %d text = %2x, vgatext = %2x\n",i,		textstore[i],vgatextstore[i]);	  n++;	}      }      if(vgatextstore[25] == 0)	textset = 1;    }  return(n);}#else}#endifstatic int  et6000_ext_set(unsigned what, va_list params){  DNOTW("ext_set");  return(0);}static int  et6000_accel(unsigned operation, va_list params){  DNOTW("accel");  return(0);}static int  et6000_linear(int op, int param){#ifdef DB6K  fprintf(outf,"linear op = %d, param = 0x%0x ",op,param);#endif  if(op == LINEAR_QUERY_BASE) {#ifdef DB6K    fprintf(outf, "QUERY\n");#endif    if((vga_getmodeinfo(vga_getcurrentmode())->flags | CAPABLE_LINEAR))      return(et6000_linear_base);    else                    /* frame_ptr was determined at init time */      return(-1);  }  else if(op == LINEAR_ENABLE)    {#ifdef DB6K      fprintf(outf,"ENABLE, param = 0x%x\n",param);#endif      et6000_mapped_mem = param;      port_out(0,SEG_SELECT);      port_out(0,0x3cb);      port_out(5,0x3ce);      port_out(0x40,0x3cf);  /* Set linear graphics. Don't touch this */                             /* on disable. */      outb(base1 | 0x40, 0x09);      /* Set memory relocation and linear. */      return(0);    }  else if(op == LINEAR_DISABLE)    {#ifdef DB6K      fprintf(outf,"DISABLE\n");#endif      outb(base1 | 0x40, 0);      /* Turn off memory relocation and linear. */      __svgalib_modeinfo_linearset = 0;  /* In vga.c */      /*      port_out(5,0x3ce);      port_out(0x00,0x3cf);   See comment on LINEAR_ENABLE */      return(0);    }    else if(op == LINEAR_QUERY_RANGE) {#ifdef DB6K      fprintf(outf,"RANGE\n");#endif    return(-1);    }    else if(op == LINEAR_QUERY_GRANULARITY) {#ifdef DB6K      fprintf(outf,"GRANULARITY\n");#endif    return(et6000_memory*1024*1024);    }#ifdef DB6K  fprintf(outf,"UNKNOWN function\n");#endif    return(-1);}/* Programs not exported. */static int et6000_interlaced(int mode){  ModeTiming *modetiming;  ModeInfo   *modeinfo;  int        rtn;  DPRT("In interlaced\n");#ifdef DB6K  fprintf(outf,"Text mode errors = %d\n",compareregs());#endif    if (et6000_modeavailable(mode) != SVGADRV)	return 0;    modeinfo = __svgalib_createModeInfoStructureForSvgalibMode(mode);    modetiming = malloc(sizeof(ModeTiming));    if(__svgalib_getmodetiming(modetiming,modeinfo,cardspecs))       rtn = 0;    else      rtn = modeinfo->flags & INTERLACED;#ifdef DB6K    fprintf(outf,"Interlaced %s\n",rtn?"Yes":"No");#endif    free(modetiming);    free(modeinfo);    return(rtn);}#define WITHIN(v,c1,c2) (((v) >= (c1)) && ((v) <= (c2)))static unsigned comp_lmn(unsigned clock,float fac){  int     m, n1, n2;  double  fvco;  double  fout;  double  fmax, fmin;  double  fref;  double  fvco_goal;  fmax = 230000.0;  fmin = 48000.0;/* fmin, fmax and limits for n and m are guesses */  fref = 14318;   for (n1 = 4; n1 <= 33; n1++)  {    for (n2 = 0; n2 <= 3; n2++)    {      for (m = 42; m <= 115; m++)      {        fout = ((double)(m) * fref)/((double)(n1) * (1 << n2));        fvco_goal = (double)clock * (double)(1 << n2)*fac;        fvco = fout * (double)(1 << n2);        if (!WITHIN(fvco, 0.995*fvco_goal, 1.005*fvco_goal))          continue;        if (!WITHIN(fvco, fmin, fmax))          continue;#if 0	printf("clock=%i m=%i n1=%i n2=%i\n ",clock,m,n1,n2);#endif        return (m - 2) | ((n1 - 2)<<8) | (n2 << 13) ;      }    }  }  printf("ET6000: Illegal clock\n");  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -