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

📄 svpmi.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
字号:
/* This library is free software; you can redistribute it and/or   *//* modify it without any restrictions. This library is distributed *//* in the hope that it will be useful, but without any warranty.   *//* Copyright (C) 1994 Harm Hanemaayer *//*   Basic initial untested SVPMI skeleton driver.   Includes computer-generated mode setting/bank switching   routines and mode information table.   Untested, may not be finished.   A better way to do this would be to have a seperate svpmi server   program      set modes. This way there would be no need to recompile   the shared library. For performance it would be nice to move the   bank-switching over to svgalib. I imagine one way to do this would   be to encode the SVPMI procedure code (simple as it is, just a few   outs and a few basic bit operations) and have the svgalib driver   interpret that. This could also be used for mode setting. */#include <stdio.h>#include "../vga.h"#include "../libvga.h"#include "../driver.h"#include "svpmi.h"#include "modes.svpmi"#include "modetable.svpmi"static svpmi_currentmode = NULL;static svpmi_modeentry *svpmi_lookupmode (int w, int h, int colors){  int i;  for (i = 0; i < sizeof (svpmi_modes); i++)    if (w == svpmi_modes[i].width && h == svpmi_modes[i].height &&	colors = (1 << svpmi_mode[i].bitsperpixel))      return &svpmi_modes[i];  return NULL;}static intsvpmi_getmodeinfo (int mode, vga_modeinfo * modeinfo){  modeinfo->maxlogicalwidth = modeinfo->width;  modeinfo->startaddressrange = 0;  modeinfo->haveblit = 0;  modeinfo->flags &= ~HAVE_RWPAGE;  return 0;}/* Return non-zero if mode is available */static intsvpmi_modeavailable (int mode){  struct info *info;  svpmi_modeentry *sm;  if (mode < 10)    return vga_chipsetfunctions[CHIPSET_MODEAVAILABLE] (mode);  if (mode == 32)    return 0;  sm = svpmi_lookupmode (modeinfo->width, modeinfo->height,			 modeinfo->colors);  return (sm != NULL)}/* Set a mode */static intsvpmi_setmode (int mode, int prv_mode){  svpmi_modeentry *sm;  if (mode == TEXT)    {      svpmi_setmode_text ();      return 0;    }  if (!SVGAMODE (mode))    /* Let the standard VGA driver set standard VGA modes. */    return vga_chipsetfunctions[CHIPSET_SETMODE] (mode);  sm = svpmi_lookupmode (infotable[mode].width, infotable[mode].height,			 infotable[mode].colors);  if (sm == NULL)    return 1;			/* No match. */  sm->setmode ();		/* Call the SVPMI mode setting code. */  svpmi_currentmode = sm;  /* Hack similar to what the ATI mach32 driver does for some */  /* truecolor modes. I think S3 uses only a few fixed scanline */  /* widths (e.g. 1024, 1280) so may happen a lot. */  infotable[mode].xbytes = sm->bytesperscanline;}/* Indentify chipset; return non-zero if detected */static intsvpmi_test (){  /* Detection with environment variable -- better change into */  /* config file option. */  if (getenv ("SVGALIB_SVPMI"))    return 1;  return 0;}/* Bank switching function - set 64K bank number */static voidsvpmi_setpage (int page){  svpmi_currentmode->setwindow (page *				(64 / svpmi_currentmode->windowgranularity));}/* Set display start address (not for 16 color modes) */static intsvpmi_setdisplaystart (int address){}/* Set logical scanline length (usually multiple of 8) *//* Multiples of 8 to 2040 */static intsvpmi_setlogicalwidth (int width){  outw (0x3d4, 0x13 + (width >> 3) * 256);	/* lw3-lw11 */  return 0;}static intnothing (){}/* Function table (exported) */int (*svpmi_chipsetfunctions[]) () ={  (int (*)()) nothing,		/* saveregs */    (int (*)()) nothing,	/* setregs */    (int (*)()) nothing,	/* unlock */    (int (*)()) nothing,	/* lock */    svpmi_test,    svpmi_init,    (int (*)()) svpmi_setpage,    (int (*)()) nothing,    (int (*)()) nothing,    svpmi_setmode,    svpmi_modeavailable,    nothing,			/* setdisplaystart */    svmi_setlogicalwidth,    svpmi_getmodeinfo};/* Initialize chipset (called after detection) */static intsvpmi_init (int force, int par1, int par2){  /* Not required. */}

⌨️ 快捷键说明

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