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

📄 vbios.c

📁 功能强大的文本编辑器
💻 C
字号:
/*      vbios.c                              08.03.95       */
/*!
/  --------------------------------------------------------------
/  Copyright (C) 1993: Michael Braun
/                      Kaetinger Muehlenweg 103 A
/                      D-28816 Stuhr
/  --------------------------------------------------------------
/
/     video bios functions
/     (extract from: Allen Holub, "c fuer kenner")
/                                                                             
*/

/****************************************************************
*                                                               *
*  BENUTZTE UNTERPROGRAMME (C LIBRARY)                          *
*                                                               *
****************************************************************/

#include "config.h"
#if (ACT_OP_SYSTEM == MS_DOS)

#include <stdio.h>
#include <dos.h>
#include <malloc.h>
#include "vbios.h"


/****************************************************************
*                                                               *
*  BENUTZTE UNTERPROGRAMME / GLOBALE VARIABLEN                  *
*                                                               *
****************************************************************/

static union REGS Regs;
static struct SREGS SRegs;

#pragma pack(1)

struct VGA_STATIC_FUNCTIONALITY
{ 
  unsigned char info_bytes[16];
};

union VGA_STATE
{
  struct VGA_state_info
  {
    struct VGA_STATIC_FUNCTIONALITY far * const VGA_static_functionality;
    unsigned char CRT_mode;
    unsigned int  CRT_cols;
    unsigned int  CRT_len;
    unsigned int  CRT_start;
    unsigned char cursors[2][8];
    unsigned char cursor_start;
    unsigned char cursor_stop;
    unsigned char CRT_page;
    unsigned int  CRTC_port;
    unsigned char CRT_mode_set;
    unsigned char CRT_palette;
    unsigned char CRT_rows;
    unsigned int  CRT_points;
    unsigned char active_displ_combine;
    unsigned char inactive_displ_combine;
    unsigned int  num_colors;
    unsigned char num_pages;
    unsigned char raster_lines;
  }
   data;
  char fill[64];
};

#pragma pack()


/****************************************************************
*                                                               *
*  ENDE DER DEKLARATIONEN                                       *
*                                                               *
****************************************************************/


/*-------------------------------------------------------------*/

int vb_getpage (void)
{
/* liefert die nummer der momentan aktiven Anzeigeseite */

   Regs.h.ah = GET_VMODE;
   int86 (VIDEO_INT, &Regs, &Regs);

   return (int) Regs.h.bh;
}  /* vb_getpage */

/*-------------------------------------------------------------*/

void vb_setcur (int posn)
{
/* Set Cursor to position (LSB = x=column, MSB = y=row) */

   Regs.h.bh = (unsigned char) vb_getpage ();
   Regs.x.dx = posn;
   Regs.h.ah = SET_POSN;
   int86 (VIDEO_INT, &Regs, &Regs);

   return;
}

/*-------------------------------------------------------------*/

void vb_ctoxy (int x, int y)
{
/* set cursor to x/y (column/row) */

   vb_setcur ((y << 8) | (x & 0xff));

   return;
}

/*-------------------------------------------------------------*/

int vb_getvmode (void)
{ 
  /* returns actual video mode */

   Regs.h.ah = GET_VMODE;
   int86 (VIDEO_INT, &Regs, &Regs);

   return ((int) Regs.h.al);
}

/*-------------------------------------------------------------*/

int vb_setvmode (int mode)
{ 
  /* sets new video mode */

   Regs.h.ah = SET_VMODE;
   Regs.h.al = (unsigned char) mode;
   int86 (VIDEO_INT, &Regs, &Regs);

   return vb_getvmode ();  /* for control, if set was o.k. */
}

/*-------------------------------------------------------------*/

int vb_getvsize (int* cols, int* lines)
{ 
  /* returns video screen dimensions */
  static union VGA_STATE vga_state;
  static void _far * fp = &vga_state;


   Regs.h.ah = GET_VSTATE;
   Regs.h.al = 0;
   Regs.x.bx = 0;
   Regs.x.di = FP_OFF(fp);
   SRegs.es  = FP_SEG(fp);
   int86x (VIDEO_INT, &Regs, &Regs, &SRegs);

   if (Regs.h.al == GET_VSTATE)
   {
     *cols = vga_state.data.CRT_cols;
     *lines = vga_state.data.CRT_rows;
     return 1;
   }
   else
   {
     *cols  = INIT_COLUMNS;
     *lines = INIT_ROWS;
     return 0;
   }
}

/*-------------------------------------------------------------*/

static void * vcontext;

void vb_savecontext (void)
{
  if (!vcontext) /* only once */
  {
    Regs.h.ah = SAVE_VSTATE;
    Regs.h.al = 0;   /* Get size buffer size */
    Regs.x.cx = 0x7; /* Hardware, BIOS and DAC states */
  
    int86 (VIDEO_INT, &Regs, &Regs);
  
    if (Regs.h.al == SAVE_VSTATE)
    {
      vcontext = malloc ((size_t)Regs.x.bx*64);

      Regs.h.ah = SAVE_VSTATE;
      Regs.h.al = 1;   /* Save requested states */
      Regs.x.cx = 0x7; /* Hardware, BIOS and DAC states */
      Regs.x.bx = FP_OFF(vcontext);
      SRegs.es  = FP_SEG(vcontext);
      int86x (VIDEO_INT, &Regs, &Regs, &SRegs);
    }
  }
}


void vb_restorecontext (void)
{
  if (vcontext)
  {
    Regs.h.ah = SAVE_VSTATE;
    Regs.h.al = 2;   /* Restore requested states */
    Regs.x.cx = 0x7; /* Hardware, BIOS and DAC states */
    Regs.x.bx = FP_OFF(vcontext);
    SRegs.es  = FP_SEG(vcontext);
    int86x (VIDEO_INT, &Regs, &Regs, &SRegs);

    free (vcontext);
    vcontext = NULL;
  }
}

/*-------------------------------------------------------------*/

void vb_setvlines (int lines)
{ 
  /* sets video screen dimensions */

  switch (lines)
  {
    case 50:
      vb_setvmode (3);  /* character generator functions in mode 3 */
      Regs.h.al = LOAD_8x8;
      break;

    case 28:
      vb_setvmode (3);  /* character generator functions in mode 3 */
      Regs.h.al = LOAD_8x14;
      break;

    default:
      vb_setvmode (3);  /* character generator functions in mode 3 */
      Regs.h.al = LOAD_8x16;
      break;
  }
  Regs.h.ah = VIDEO_CHAR;
  Regs.h.bl = 0;  
  int86 (VIDEO_INT, &Regs, &Regs);
}

/*-------------------------------------------------------------*/

void vb_switch_lines (void)
{
  static int resolution;

  switch (resolution)
  {
    case 0: 
      vb_setvlines (28); 
      resolution++;
      break;
      
    case 1: 
      vb_setvlines (50); 
      resolution++;
      break;

    case 2: 
      vb_setvlines (25); 
      resolution = 0;
      break;
  }
}

/*-------------------------------------------------------------*/

#elif (ACT_OP_SYSTEM == WIN_32)

int vb_getvsize (int* cols, int* lines)
{ 
  /* returns video screen dimensions */
    *cols  = INIT_COLUMNS;
    *lines = INIT_ROWS;
    return 0;
}


/*-------------------------------------------------------------*/

/* -FF-  */

#else

static int dummy (void)
{
   ;  /* leer-anweisung fuer os-9 c-compiler */
}

#endif


/* Modification History */
/* 19.12.92 - file erzeugt */
/* 21.12.92 - vb_getvmode (), vb_setvmode () */
/* 22.01.95 - vb_getvsize (), ... */
/* 08.03.95 - INIT_ROWS, INIT_COLUMNS */

⌨️ 快捷键说明

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