亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tl_vga.c

?? DC上的GB模擬器源代碼
?? C
字號:
/*
** thinlib (c) 2001 Matthew Conte (matt@conte.com)
**
**
** tl_vga.c
**
** VGA-related functions
**
** $Id: $
*/

#include <stdio.h>
#include <string.h>
#include <dpmi.h>
#include <dos.h>
#include "tl_types.h"
#include "tl_bmp.h"
#include "tl_video.h"
#include "tl_vga.h"
#include "tl_djgpp.h"
#include "tl_int.h"

#define  DEFAULT_OVERSCAN        0

#define  MODE_TEXT               0x03
#define  MODE_13H                0x13

#define  VGA_ADDRESS             0xA0000  /* we love segments! */

/* VGA card register addresses */
#define  VGA_ATTR                0x3C0 /* Attribute reg */
#define  VGA_MISC                0x3C2 /* Misc. output register */
#define  VGA_SEQ_ADDR            0x3C4 /* Base port of sequencer */
#define  VGA_SEQ_DATA            0x3C5 /* Data port of sequencer */
#define  VGA_CRTC_ADDR           0x3D4 /* Base port of CRT controller */
#define  VGA_CRTC_DATA           0x3D5 /* Data port of CRT controller */
#define  VGA_STATUS              0x3DA /* Input status #1 register */

#define  VGA_PAL_READ            0x3C7 /* Palette read address */
#define  VGA_PAL_WRITE           0x3C8 /* Palette write address */
#define  VGA_PAL_DATA            0x3C9 /* Palette data register */

/* generic VGA CRTC register indexes */
#define  HZ_DISPLAY_TOTAL        0x00
#define  HZ_DISPLAY_END          0x01
#define  CRTC_OVERFLOW           0x07
#define  VT_DISPLAY_END          0x12
#define  MEM_OFFSET              0x13

/* indices into our register array */
#define  CLOCK_INDEX             0
#define  H_TOTAL_INDEX           1
#define  H_DISPLAY_INDEX         2
#define  H_BLANKING_START_INDEX  3
#define  H_BLANKING_END_INDEX    4
#define  H_RETRACE_START_INDEX   5
#define  H_RETRACE_END_INDEX     6
#define  V_TOTAL_INDEX           7
#define  OVERFLOW_INDEX          8
#define  MAXIMUM_SCANLINE_INDEX  10
#define  V_RETRACE_START_INDEX   11
#define  V_RETRACE_END_INDEX     12
#define  V_END_INDEX             13
#define  MEM_OFFSET_INDEX        14
#define  UNDERLINE_LOC_INDEX     15
#define  V_BLANKING_START_INDEX  16
#define  V_BLANKING_END_INDEX    17
#define  MODE_CONTROL_INDEX      18
#define  MEMORY_MODE_INDEX       20


typedef struct vgareg_s
{
   int port;
   int index;
   uint8 value;
} vgareg_t;

typedef struct vgamode_s
{
   int width;
   int height;
   char *name;
   vgareg_t *regs;
} vgamode_t;

/* 60 Hz */
static vgareg_t mode_256x224[] =
{
   { 0x3C2, 0x00, 0xE3 }, { 0x3D4, 0x00, 0x5F }, { 0x3D4, 0x01, 0x3F },
   { 0x3D4, 0x02, 0x40 }, { 0x3D4, 0x03, 0x82 }, { 0x3D4, 0x04, 0x4A },
   { 0x3D4, 0x05, 0x9A }, { 0x3D4, 0x06, 0x0B }, { 0x3D4, 0x07, 0xB2 },
   { 0x3D4, 0x08, 0x00 }, { 0x3D4, 0x09, 0x61 }, { 0x3d4, 0x10, 0x00 },
   { 0x3D4, 0x11, 0xAC }, { 0x3D4, 0x12, 0xBF }, { 0x3D4, 0x13, 0x20 },
   { 0x3D4, 0x14, 0x40 }, { 0x3D4, 0x15, 0x01 }, { 0x3D4, 0x16, 0x0A },
   { 0x3D4, 0x17, 0xA3 }, { 0x3C4, 0x01, 0x01 }, { 0x3C4, 0x04, 0x0E },
   { 0, 0, 0 }
};

static vgareg_t mode_256x240[] =
{
   { 0x3c2, 0x00, 0xe3},{ 0x3d4, 0x00, 0x55},{ 0x3d4, 0x01, 0x3f},
   { 0x3d4, 0x02, 0x80},{ 0x3d4, 0x03, 0x90},{ 0x3d4, 0x04, 0x49},
   { 0x3d4, 0x05, 0x80},{ 0x3D4, 0x06, 0x43},{ 0x3d4, 0x07, 0xb2},
   { 0x3d4, 0x08, 0x00},{ 0x3D4, 0x09, 0x61},{ 0x3d4, 0x10, 0x04},
   { 0x3d4, 0x11, 0xac},{ 0x3D4, 0x12, 0xdf},{ 0x3d4, 0x13, 0x20},
   { 0x3d4, 0x14, 0x40},{ 0x3d4, 0x15, 0x07},{ 0x3D4, 0x16, 0x11},
   { 0x3d4, 0x17, 0xa3},{ 0x3c4, 0x01, 0x01},{ 0x3c4, 0x04, 0x0e},
   { 0, 0, 0 }
};

static vgareg_t mode_256x256[] =
{
   { 0x3C2, 0x00, 0xE3 }, { 0x3D4, 0x00, 0x5F }, { 0x3D4, 0x01, 0x3F },
   { 0x3D4, 0x02, 0x40 }, { 0x3D4, 0x03, 0x82 }, { 0x3D4, 0x04, 0x4A },
   { 0x3D4, 0x05, 0x9A }, { 0x3D4, 0x06, 0x23 }, { 0x3D4, 0x07, 0xB2 },
   { 0x3D4, 0x08, 0x00 }, { 0x3D4, 0x09, 0x61 }, { 0x3D4, 0x10, 0x0A },
   { 0x3D4, 0x11, 0xAC }, { 0x3D4, 0x12, 0xFF }, { 0x3D4, 0x13, 0x20 },
   { 0x3D4, 0x14, 0x40 }, { 0x3D4, 0x15, 0x07 }, { 0x3D4, 0x16, 0x1A },
   { 0x3D4, 0x17, 0xA3 }, { 0x3C4, 0x01, 0x01 }, { 0x3C4, 0x04, 0x0E },
   { 0, 0, 0 }
};

/* 60 Hz */
static vgareg_t mode_256x256wide[] =
{
   { 0x3C2, 0x00, 0xE3 }, { 0x3D4, 0x00, 0x52 }, { 0x3D4, 0x01, 0x3F },
   { 0x3D4, 0x02, 0x80 }, { 0x3D4, 0x03, 0x90 }, { 0x3D4, 0x04, 0x49 },
   { 0x3D4, 0x05, 0x80 }, { 0x3D4, 0x06, 0x55 }, { 0x3D4, 0x07, 0xB2 },
   { 0x3D4, 0x08, 0x00 }, { 0x3D4, 0x09, 0x61 }, { 0x3D4, 0x10, 0x20 },
   { 0x3D4, 0x11, 0xAC }, { 0x3D4, 0x12, 0xFF }, { 0x3D4, 0x13, 0x20 },
   { 0x3D4, 0x14, 0x40 }, { 0x3D4, 0x15, 0x07 }, { 0x3D4, 0x16, 0x1A },
   { 0x3D4, 0x17, 0xA3 }, { 0x3C4, 0x01, 0x01 }, { 0x3C4, 0x04, 0x0E },
   { 0, 0, 0 }
};

/* 60 Hz */
static vgareg_t mode_288x224[] =
{
   { 0x3C2, 0x00, 0xE3 }, { 0x3D4, 0x00, 0x5F }, { 0x3D4, 0x01, 0x47 },
   { 0x3D4, 0x02, 0x50 }, { 0x3D4, 0x03, 0x82 }, { 0x3D4, 0x04, 0x50 },
   { 0x3D4, 0x05, 0x80 }, { 0x3D4, 0x06, 0x08 }, { 0x3D4, 0x07, 0x3E },
   { 0x3D4, 0x08, 0x00 }, { 0x3D4, 0x09, 0x41 }, { 0x3D4, 0x10, 0xDA },
   { 0x3D4, 0x11, 0x9C }, { 0x3D4, 0x12, 0xBF }, { 0x3D4, 0x13, 0x24 },
   { 0x3D4, 0x14, 0x40 }, { 0x3D4, 0x15, 0xC7 }, { 0x3D4, 0x16, 0x04 },
   { 0x3D4, 0x17, 0xA3 }, { 0x3C4, 0x01, 0x01 }, { 0x3C4, 0x04, 0x0E },
   { 0, 0, 0 }
};

static vgareg_t mode_320x200[] =
{
   { 0, 0, 0 }
};

static vgamode_t vidmodes[] =
{
   { 288, 224, "288x224", mode_288x224 },
   { 256, 224, "256x224", mode_256x224 },
   { 256, 240, "256x240", mode_256x240 },
   { 256, 256, "256x256 (wide)", mode_256x256wide },
   { 256, 256, "256x256", mode_256x256 },
   { 320, 200, "320x200", mode_320x200 },
   { 0, 0, NULL, 0 }
};


static bitmap_t *screen = NULL;
static bitmap_t *hardware = NULL;

/* current VGA mode */
static vgamode_t *vga_mode = NULL;
static bool vga_hardware = false;

/* Set a VGA mode */
static void vga_setvgamode(uint8 mode)
{
   __dpmi_regs r;
   r.x.ax = mode;
   __dpmi_int(0x10, &r);
}

static void vga_set_overscan(int index)
{
   outportb(VGA_ATTR, 0x31);
   outportb(VGA_ATTR, index);
}

static void vga_outregs(vgareg_t *reg)
{
   uint8 crtc_val;

   /* Disable interrupts, wait for vertical retrace */
//   thin_vga_waitvsync();
   THIN_DISABLE_INTS();

   /* Sequencer reset */
   outportb(VGA_SEQ_ADDR, 0x00);
   outportb(VGA_SEQ_DATA, 0x01);
   crtc_val = inportb(VGA_CRTC_DATA) & 0x7F;
   
   /* Unprotect registers 0-7 */
   outportb(VGA_CRTC_ADDR, 0x11);
   outportb(VGA_CRTC_DATA, crtc_val);

   /* Reset read/write flip-flop */
   inportb(VGA_STATUS);

   /* Do the icky register stuff */
   while (reg->port)
   {
      switch(reg->port)
      {
      case VGA_ATTR:
         /* Reset read/write flip-flop */
         inportb(VGA_STATUS);
         /* Ensure VGA output is enabled - bit 5 */
         outportb(VGA_ATTR, reg->index | 0x20);
         outportb(VGA_ATTR, reg->value);
         break;

      case VGA_MISC:
         /* Write directly to port */
         outportb(reg->port, reg->value);
         break;
      
      case VGA_SEQ_ADDR:
      case VGA_CRTC_ADDR:
      default:
         /* Index to port, value to port + 1 */
         outportb(reg->port, reg->index);
         outportb(reg->port + 1, reg->value);
         break;
      }

      reg++;
   }

   /* Set overscan color */
   vga_set_overscan(DEFAULT_OVERSCAN);

   /* Clear sequencer reset */
   outportb(VGA_SEQ_ADDR, 0x00);
   outportb(VGA_SEQ_DATA, 0x03);

   THIN_ENABLE_INTS();
}

/* Set up VGA mode 13h, then tweak it appropriately */
int thin_vga_setmode(int width, int height, int bpp)
{
   if (8 != bpp)
      return -1;

   vga_mode = vidmodes;

   /* Search for the video mode */
   while ((vga_mode->width != width) || (vga_mode->height != height))
   {
      if (NULL == vga_mode->regs)
      {
         vga_mode = NULL;
         return -1;
      }
      vga_mode++;
   }

   /* Set up our standard mode 13h */
   vga_setvgamode(MODE_13H);

   vga_outregs(vga_mode->regs);

   return 0;
}

/* Destroy VGA */
void thin_vga_shutdown(void)
{
   /* set textmode */
   vga_setvgamode(MODE_TEXT);

   if (screen)
      thin_bmp_destroy(&screen);

   if (hardware)
      thin_bmp_destroy(&hardware);
}

/* Initialize VGA */
int thin_vga_init(int width, int height, int bpp, int param)
{
   if (8 != bpp)
      return -1;

   /* ensure we really want a hardware surface */
   if (thinlib_nearptr && (param & THIN_VIDEO_HWSURFACE))
   {
      vga_hardware = true;
      screen = thin_bmp_createhw((uint8 *) THIN_PHYSICAL_ADDR(VGA_ADDRESS),
                                 width, height, bpp, width);
      if (NULL == screen)
         return -1;
   }
   else
   {
      vga_hardware = false;
      hardware = thin_bmp_createhw((uint8 *) VGA_ADDRESS,
                                   width, height, bpp, width);
      if (NULL == hardware)
         return -1;

      screen = thin_bmp_create(width, height, bpp, 0);
      if (NULL == screen)
         return -1;
   }

   /* Set the initial video mode, no scanlines */
   if (thin_vga_setmode(width, height, bpp))
   {
      thin_vga_shutdown();
      return -1;
   }

   return 0;
}

/* cram an 8-bit, 256 entry rgb palette into 6-bit vga */
void thin_vga_setpalette(rgb_t *palette, int index, int length)
{
   int i;
   
   /* we also want to find the closest color index to black,
   ** and set that as our overscan color
   */
   int overscan_index = 0;
   int overscan_sum = 255 * 3;

   outportb(VGA_PAL_WRITE, index);

   for (i = 0; i < length; i++)
   {
      if (palette[i].r + palette[i].g + palette[i].b < overscan_sum)
      {
         overscan_sum = palette[i].r + palette[i].g + palette[i].b;
         overscan_index = index + i;
      }

      outportb(VGA_PAL_DATA, palette[i].r >> 2);
      outportb(VGA_PAL_DATA, palette[i].g >> 2);
      outportb(VGA_PAL_DATA, palette[i].b >> 2);
   }

   vga_set_overscan(overscan_index);
}

void thin_vga_waitvsync(void)
{
   while (0 == (inportb(VGA_STATUS) & 0x08));
   //while (inportb(VGA_STATUS) & 0x08);
}

bitmap_t *thin_vga_lockwrite(void)
{
   /* always return screen */
   return screen;
}

void thin_vga_freewrite(int num_dirties, rect_t *dirty_rects)
{
   UNUSED(num_dirties);
   UNUSED(dirty_rects);

   if (false == vga_hardware)
   {
      dosmemput(screen->line[0], hardware->pitch * hardware->height,
                (int) hardware->line[0]);
   }
}

/*
** $Log: $
*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕一区三区| 日本韩国精品在线| 免费一级片91| 久久精品av麻豆的观看方式| 韩日精品视频一区| 成熟亚洲日本毛茸茸凸凹| 99精品1区2区| 91丝袜美女网| 欧美日韩你懂的| 精品国产免费一区二区三区四区| 久久久久久久久久美女| 国产精品白丝在线| 亚洲成人自拍网| 激情成人综合网| 94-欧美-setu| 欧美美女直播网站| 久久精品人人做| 一区二区三区免费看视频| 亚洲国产精品久久久久婷婷884| 美女高潮久久久| k8久久久一区二区三区| 欧美在线不卡一区| 久久精品一区二区三区四区| 国产精品不卡在线| 日韩av在线免费观看不卡| 波多野结衣在线一区| 欧美高清视频不卡网| 久久精品视频免费观看| 午夜视频在线观看一区| 国产精品白丝av| 欧美三级在线视频| 日本一区二区三区久久久久久久久不 | 国产成人av电影免费在线观看| 99久久99久久免费精品蜜臀| 91精品国产综合久久香蕉的特点| 久久久久国产免费免费 | 色噜噜狠狠成人网p站| 日韩视频免费直播| 成人欧美一区二区三区在线播放| 无吗不卡中文字幕| av在线综合网| 日韩精品一区二区三区四区 | 91国模大尺度私拍在线视频| 欧美xfplay| 亚洲人成精品久久久久| 久88久久88久久久| 欧美日韩另类一区| 欧美国产一区在线| 麻豆视频一区二区| 欧美性猛片xxxx免费看久爱| 国产三级欧美三级| 蜜臀av国产精品久久久久| 99re66热这里只有精品3直播 | 中文字幕制服丝袜成人av| 亚洲高清免费观看 | 欧美一区二区福利视频| 亚洲欧美日韩国产手机在线| 国产综合色视频| 欧美日韩国产另类一区| 亚洲欧美综合在线精品| 国产一区二区三区久久悠悠色av| 欧美群妇大交群中文字幕| 亚洲免费观看高清完整版在线| 国产一区在线精品| 欧美一区二区三区婷婷月色| 亚洲欧美激情插 | 成人教育av在线| 精品久久99ma| 日韩精品电影一区亚洲| 91色视频在线| 一色屋精品亚洲香蕉网站| 国产成人av电影免费在线观看| 日韩一区二区三区精品视频| 午夜精品久久一牛影视| 欧美性极品少妇| 亚洲精品视频观看| 国产麻豆欧美日韩一区| 欧美电视剧免费全集观看| 人人爽香蕉精品| 91麻豆精品国产91久久久使用方法| 水野朝阳av一区二区三区| 欧美三级日韩三级国产三级| 午夜国产精品一区| 欧美电影精品一区二区| 国产精品一区免费在线观看| 欧美激情在线看| 91首页免费视频| 亚洲一区二区三区中文字幕在线| 欧美三级在线看| 久久av中文字幕片| 亚洲国产高清不卡| 99国产欧美另类久久久精品| 亚洲亚洲精品在线观看| 91精品国产色综合久久不卡蜜臀| 美女诱惑一区二区| 欧美激情综合在线| 色噜噜狠狠色综合中国| 日本不卡一区二区三区高清视频| 精品剧情在线观看| 99re这里只有精品首页| 午夜视频在线观看一区二区| 欧美精品一区二区久久久| 成人激情免费电影网址| 亚洲午夜在线观看视频在线| 欧美一区二区三区在线| 高清不卡一区二区在线| 自拍偷自拍亚洲精品播放| 欧美电影在哪看比较好| 久草中文综合在线| 中文字幕一区二区三区四区不卡| 欧美日韩在线播放一区| 国产福利91精品| 亚洲自拍偷拍网站| 久久久久国产一区二区三区四区| 一本色道久久综合精品竹菊| 美美哒免费高清在线观看视频一区二区| 日本一区二区视频在线观看| 欧美性videosxxxxx| 国产精品亚洲专一区二区三区 | 欧美综合欧美视频| 国产一区二区在线影院| 亚洲自拍偷拍网站| 久久综合久色欧美综合狠狠| 欧美在线观看你懂的| 国产成人av一区二区三区在线 | 欧美电影在线免费观看| 成人黄色电影在线 | 久久亚洲综合色一区二区三区| 91免费在线看| 国内久久精品视频| 亚洲国产成人tv| 国产精品美女久久久久久久久久久 | 日本一区二区电影| 欧美一三区三区四区免费在线看| 成人99免费视频| 久久99九九99精品| 亚洲国产精品尤物yw在线观看| 久久综合久久鬼色| 88在线观看91蜜桃国自产| 99re这里只有精品视频首页| 精品综合久久久久久8888| 伊人色综合久久天天| 国产人成亚洲第一网站在线播放 | 久久精品99国产精品日本| 亚洲精品乱码久久久久久| 久久精品亚洲精品国产欧美| 欧美电影影音先锋| 欧美偷拍一区二区| av一二三不卡影片| 国产麻豆91精品| 天堂一区二区在线| 亚洲一二三四区| 亚洲男人天堂av网| 欧美国产精品劲爆| 精品国产免费人成电影在线观看四季| 欧美日韩综合不卡| 91成人免费网站| 色视频成人在线观看免| 不卡视频免费播放| 成人自拍视频在线观看| 国产精品一级片在线观看| 另类欧美日韩国产在线| 日本亚洲天堂网| 日韩专区欧美专区| 亚洲va欧美va天堂v国产综合| 综合久久久久久久| 中文字幕一区二区三中文字幕| 日本一区二区三区四区| 国产婷婷色一区二区三区四区 | 国产精品亚洲第一| 国产在线精品视频| 久草热8精品视频在线观看| 奇米精品一区二区三区在线观看| 午夜精彩视频在线观看不卡| 亚洲国产精品一区二区www| 亚洲一二三区在线观看| 一区二区三区蜜桃| 亚洲成人免费电影| 天天影视网天天综合色在线播放| 亚洲成人动漫精品| 日韩中文字幕av电影| 婷婷丁香激情综合| 免费观看91视频大全| 久久国产日韩欧美精品| 国产在线国偷精品免费看| 国产精品香蕉一区二区三区| 国产91在线|亚洲| 高清免费成人av| 色综合天天综合网国产成人综合天| 91一区二区在线观看| 欧美亚洲综合久久| 在线播放日韩导航| 精品精品国产高清a毛片牛牛 | 不卡大黄网站免费看| 99久久亚洲一区二区三区青草| 91在线精品秘密一区二区| 色老综合老女人久久久| 欧美精品 国产精品| 欧美成人一区二区| 久久精品视频免费观看|