📄 et6000.c
字号:
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 + -