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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? tl_vesa.c

?? DC上的GB模擬器源代碼
?? C
字號(hào):
/*
** thinlib (c) 2001 Matthew Conte (matt@conte.com)
**
**
** tl_vesa.c
**
** VESA code.
**
** $Id: $
*/

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <go32.h>
#include <dos.h>
#include <dpmi.h>

#include "tl_types.h"
#include "tl_log.h"
#include "tl_bmp.h"

#include "tl_djgpp.h"

#include "tl_video.h"
#include "tl_vesa.h"

#define  __PACKED__  __attribute__ ((packed))

/* VESA information block structure */
typedef struct vesainfo_s
{
   char   VESASignature[4]    __PACKED__;
   uint16 VESAVersion         __PACKED__;
   uint32 OEMStringPtr        __PACKED__;
   char   Capabilities[4]     __PACKED__;
   uint32 VideoModePtr        __PACKED__; 
   uint16 TotalMemory         __PACKED__; 
   uint16 OemSoftwareRev      __PACKED__; 
   uint32 OemVendorNamePtr    __PACKED__; 
   uint32 OemProductNamePtr   __PACKED__; 
   uint32 OemProductRevPtr    __PACKED__; 
   uint8  Reserved[222]       __PACKED__; 
} vesainfo_t;

/* SuperVGA mode information block */
typedef struct modeinfo_s
{
   uint16 ModeAttributes      __PACKED__; 
   uint8  WinAAttributes      __PACKED__; 
   uint8  WinBAttributes      __PACKED__; 
   uint16 WinGranularity      __PACKED__; 
   uint16 WinSize             __PACKED__; 
   uint16 WinASegment         __PACKED__; 
   uint16 WinBSegment         __PACKED__; 
   uint32 WinFuncPtr          __PACKED__; 
   uint16 BytesPerScanLine    __PACKED__; 
   uint16 XResolution         __PACKED__; 
   uint16 YResolution         __PACKED__; 
   uint8  XCharSize           __PACKED__; 
   uint8  YCharSize           __PACKED__; 
   uint8  NumberOfPlanes      __PACKED__; 
   uint8  BitsPerPixel        __PACKED__; 
   uint8  NumberOfBanks       __PACKED__; 
   uint8  MemoryModel         __PACKED__; 
   uint8  BankSize            __PACKED__; 
   uint8  NumberOfImagePages  __PACKED__;
   uint8  Reserved_page       __PACKED__; 
   uint8  RedMaskSize         __PACKED__; 
   uint8  RedMaskPos          __PACKED__; 
   uint8  GreenMaskSize       __PACKED__; 
   uint8  GreenMaskPos        __PACKED__;
   uint8  BlueMaskSize        __PACKED__; 
   uint8  BlueMaskPos         __PACKED__; 
   uint8  ReservedMaskSize    __PACKED__; 
   uint8  ReservedMaskPos     __PACKED__; 
   uint8  DirectColorModeInfo __PACKED__;

   /* VBE 2.0 extensions */
   uint32 PhysBasePtr         __PACKED__; 
   uint32 OffScreenMemOffset  __PACKED__; 
   uint16 OffScreenMemSize    __PACKED__; 

   /* VBE 3.0 extensions */
   uint16 LinBytesPerScanLine __PACKED__;
   uint8  BnkNumberOfPages    __PACKED__;
   uint8  LinNumberOfPages    __PACKED__;
   uint8  LinRedMaskSize      __PACKED__;
   uint8  LinRedFieldPos      __PACKED__;
   uint8  LinGreenMaskSize    __PACKED__;
   uint8  LinGreenFieldPos    __PACKED__;
   uint8  LinBlueMaskSize     __PACKED__;
   uint8  LinBlueFieldPos     __PACKED__;
   uint8  LinRsvdMaskSize     __PACKED__;
   uint8  LinRsvdFieldPos     __PACKED__;
   uint32 MaxPixelClock       __PACKED__;

   uint8  Reserved[190]       __PACKED__; 
} modeinfo_t;


#define  MASK_LINEAR(addr)    (addr & 0x000FFFFF)
#define  RM_TO_LINEAR(addr)   (((addr & 0xFFFF0000) >> 12) + (addr & 0xFFFF))
#define  RM_OFFSET(addr)      (addr & 0xF)
#define  RM_SEGMENT(addr)     ((addr >> 4) & 0xFFFF)

#define  VBE_LINEAR_ADDR      0x4000
#define  VBE_LINEAR_AVAIL     0x0080

#define  VBE_INT              0x10
#define  VBE_SUCCESS          0x004F
#define  VBE_FUNC_DETECT      0x4F00
#define  VBE_FUNC_GETMODEINFO 0x4F01
#define  VBE_FUNC_SETMODE     0x4F02
#define  VBE_FUNC_GETMODE     0x4F03
#define  VBE_FUNC_FLIPPAGE    0x4F07

#define  MAX_NUM_MODES        256

short int vid_selector = -1;
static uint16 modelist[MAX_NUM_MODES];
static bitmap_t *screen = NULL;
static bitmap_t *hardware = NULL;
static int total_memory = 0;
static bool vesa_hardware = false;

/* look for vesa */
static int vesa_detect(void)
{
   vesainfo_t vesa_info;
   __dpmi_regs regs;
   long list_ptr;
   int mode_pos;

   /* Use DOS transfer buffer to hold VBE info */
   THIN_ASSERT(sizeof(vesainfo_t) < _go32_info_block.size_of_transfer_buffer);
   memset(&regs, 0, sizeof(__dpmi_regs));

   strncpy(vesa_info.VESASignature, "VBE2", 4);
   dosmemput(&vesa_info, sizeof(vesainfo_t), MASK_LINEAR(__tb));
   
   regs.x.ax = VBE_FUNC_DETECT;
   regs.x.es = RM_SEGMENT(__tb);
   regs.x.di = RM_OFFSET(__tb);

   __dpmi_int(VBE_INT, &regs);
   if (VBE_SUCCESS != regs.x.ax)
      return -1;

   dosmemget(MASK_LINEAR(__tb), sizeof(vesainfo_t), &vesa_info);
   if (strncmp(vesa_info.VESASignature, "VESA", 4) != 0)
      return -1;

   /* check to see if linear framebuffer is available */
   if ((vesa_info.VESAVersion >> 8) < 2)
   {
      thin_printf("thinlib.vesa: no linear framebuffer available\n");
      return -1;
   }

   /* build list of available modes */
   memset(&modelist, 0, MAX_NUM_MODES * sizeof(uint16));
   mode_pos = 0;
   
   list_ptr = RM_TO_LINEAR(vesa_info.VideoModePtr);
   while (1)
   {
      uint16 mode;

      dosmemget(list_ptr + mode_pos * 2, 2, &mode);

      if (0xFFFF == mode)
      {
         modelist[mode_pos] = 0;
         break;
      }

      modelist[mode_pos++] = mode;
   }

   total_memory = vesa_info.TotalMemory;
  
   return 0;
}

static int vesa_getmodeinfo(uint16 mode, modeinfo_t *modeinfo)
{
   __dpmi_regs regs;

   THIN_ASSERT(sizeof(modeinfo_t) < _go32_info_block.size_of_transfer_buffer);

   memset(&regs, 0, sizeof(regs));
   regs.x.ax = VBE_FUNC_GETMODEINFO; 
   regs.x.cx = mode;
   regs.x.es = RM_SEGMENT(__tb);
   regs.x.di = RM_OFFSET(__tb);
  
   __dpmi_int(VBE_INT, &regs);
   if (VBE_SUCCESS != regs.x.ax)
      return -1;

   dosmemget(MASK_LINEAR(__tb), sizeof(modeinfo_t), modeinfo);
   return 0;
}

static uint16 vesa_findmode(int width, int height, int bpp)
{
   modeinfo_t mode_info;
   uint16 mode;
   int mode_pos;

   for (mode_pos = 0; ; mode_pos++)
   {
      mode = modelist[mode_pos];
      
      if (0 == mode)
         break;

      if (vesa_getmodeinfo(mode, &mode_info))
         break; /* we are definitely screwed */
      
      if (mode_info.XResolution == width && mode_info.YResolution == height 
          && mode_info.BitsPerPixel == bpp)
      {
         return mode;
      }
   }

   return 0;
}

int thin_vesa_setmode(int width, int height, int bpp)
{
   uint16 mode;
   __dpmi_regs regs;
   __dpmi_meminfo mi;
   modeinfo_t mode_info;
   unsigned int address;

   mode = vesa_findmode(width, height, bpp);
   if (0 == mode)
   {
      thin_printf("thinlib.vesa: yikes, couldn't find mode\n");
      return -1;
   }

   if (vesa_getmodeinfo(mode, &mode_info))
   {
      thin_printf("thinlib.vesa: error in vesa_getmodeinfo\n");
      return -1;
   }

   mi.size = mode_info.BytesPerScanLine * mode_info.YResolution;
   mi.address = mode_info.PhysBasePtr;
   if (-1 == __dpmi_physical_address_mapping(&mi))
   {
      thin_printf("thinlib.vesa: error in __dpmi_physical_address_mapping\n");
      return -1;
   }

   if (false == vesa_hardware)
   {
      vid_selector = __dpmi_allocate_ldt_descriptors(1);
      if (-1 == vid_selector)
      {
         thin_printf("thinlib.vesa: error in __dpmi_allocate_ldt_descriptors\n");
         return -1;
      }

      /* paranoid */
      if (-1 == __dpmi_set_descriptor_access_rights(vid_selector, 0x40f3))
      {
         thin_printf("thinlib.vesa: error in __dpmi_set_descriptor_access_rights\n");
         return -1;
      }

      if (-1 == __dpmi_set_segment_base_address(vid_selector, mi.address))
      {
         thin_printf("thinlib.vesa: error in __dpmi_set_segment_base_address\n");
         return -1;
      }

      if (-1 == __dpmi_set_segment_limit(vid_selector, total_memory << 16 | 0xfff))
      {
         thin_printf("thinlib.vesa: error in __dpmi_set_segment_limit\n");
         return -1;
      }
   }

   memset(&regs, 0, sizeof(regs));
   regs.x.ax = VBE_FUNC_SETMODE;
   regs.x.bx = mode | VBE_LINEAR_ADDR;
 
   __dpmi_int(VBE_INT, &regs);
   if (VBE_SUCCESS != regs.x.ax)
   {
      thin_printf("thinlib.vesa: vesa dpmi int failed\n");
      return -1;
   }

   if (false == vesa_hardware)
      address = 0;
   else
      address = mi.address;

   if (NULL != screen)
      thin_bmp_destroy(&screen);

   if (vesa_hardware)
   {
      screen = thin_bmp_createhw((uint8 *) THIN_PHYSICAL_ADDR(address),
                                 mode_info.XResolution, mode_info.YResolution, 
                                 mode_info.BitsPerPixel, mode_info.XResolution);
      if (NULL == screen)
      {
         thin_printf("thinlib.vesa: failed creating hardware surface\n");
         return -1;
      }
   }
   else
   {
      if (NULL != hardware)
         thin_bmp_destroy(&hardware);

      hardware = thin_bmp_createhw((uint8 *) address, 
                                   mode_info.XResolution, mode_info.YResolution, 
                                   mode_info.BitsPerPixel, mode_info.XResolution);
      if (NULL == hardware)
      {
         thin_printf("thinlib.vesa: failed creating hardware surface\n");
         return -1;
      }

      screen = thin_bmp_create(mode_info.XResolution, mode_info.YResolution, 
                               mode_info.BitsPerPixel, 0);
      if (NULL == screen)
      {
         thin_printf("thinlib.vesa: failed creating software surface\n");
         return -1;
      }
   }

   return 0;
}

void thin_vesa_shutdown(void)
{
   __dpmi_regs regs;

   /* set text mode */
   memset(&regs, 0, sizeof(regs));
   regs.x.ax = 0x0003;
   __dpmi_int(VBE_INT, &regs);

   if (NULL != screen)
      thin_bmp_destroy(&screen);

   if (NULL != hardware)
      thin_bmp_destroy(&hardware);
}

int thin_vesa_init(int width, int height, int bpp, int param)
{
   screen = NULL;
   hardware = NULL;
   
   /* check to see if VESA card is present */
   if (vesa_detect())
      return -1;

   if (thinlib_nearptr && (param & THIN_VIDEO_HWSURFACE))
      vesa_hardware = true;
   else
      vesa_hardware = false;

   return thin_vesa_setmode(width, height, bpp);
}

bitmap_t *thin_vesa_lockwrite(void)
{
   return screen;
}


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

   /* if we don't have a hardware surface, blat it out */
   if (false == vesa_hardware)
   {
      _movedatal(_my_ds(), (unsigned) screen->line[0],
               vid_selector, (unsigned) hardware->line[0],
               hardware->pitch * hardware->height / 4);
   }
}

/*
** $Log: $
*/

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品视频在线观看免费| 久久精品一区四区| 欧美国产欧美综合| 免费人成精品欧美精品| 色婷婷av一区二区三区软件| 久久久久久久久久美女| 亚洲成人中文在线| 色婷婷久久久亚洲一区二区三区| 国产亚洲欧美中文| 麻豆成人综合网| 欧美中文字幕亚洲一区二区va在线| 国产欧美一区二区精品秋霞影院| 天使萌一区二区三区免费观看| 91在线视频官网| 国产欧美日韩另类视频免费观看| 看片的网站亚洲| 337p亚洲精品色噜噜狠狠| 一区2区3区在线看| 91香蕉视频黄| 国产精品久久久久久久久晋中 | 国产精品传媒视频| 精一区二区三区| 91精品国产色综合久久不卡电影| 亚洲综合在线电影| 97se亚洲国产综合自在线不卡| 精品国产一区二区三区av性色 | 国产精品色噜噜| 国产麻豆欧美日韩一区| 日韩你懂的在线播放| 石原莉奈一区二区三区在线观看 | 国产精品性做久久久久久| 欧美刺激午夜性久久久久久久 | 亚洲免费av高清| 99热这里都是精品| 国产精品青草久久| 成人影视亚洲图片在线| 欧美精彩视频一区二区三区| 国产精品香蕉一区二区三区| 久久精品人人做人人爽97| 国产精品一区在线| 久久精品日韩一区二区三区| 国产a久久麻豆| 国产精品乱人伦| 99久久久精品免费观看国产蜜| 中文字幕一区二区三中文字幕| 91丝袜美腿高跟国产极品老师 | 久久亚洲欧美国产精品乐播| 国精产品一区一区三区mba视频| 精品国产免费视频| 激情综合色丁香一区二区| 久久色中文字幕| 欧美成人三级在线| 精品无人码麻豆乱码1区2区| 久久影院午夜论| 成人夜色视频网站在线观看| 亚洲日本一区二区| 欧美中文字幕一二三区视频| 丝袜美腿亚洲色图| 精品久久久网站| 成人污污视频在线观看| 亚洲视频图片小说| 欧美日韩一级大片网址| 日本亚洲三级在线| 久久蜜桃av一区精品变态类天堂| 国产成人综合视频| 亚洲精品午夜久久久| 777午夜精品免费视频| 久久99精品国产麻豆不卡| 国产午夜精品久久久久久久 | 九九视频精品免费| 国产日韩欧美综合一区| 色综合中文字幕| 日日摸夜夜添夜夜添亚洲女人| 精品女同一区二区| 成人av在线电影| 亚洲一区在线观看免费观看电影高清| 欧美日韩高清一区二区三区| 激情五月播播久久久精品| 国产精品视频第一区| 欧美色视频一区| 国产专区欧美精品| 亚洲精品国产a| 精品嫩草影院久久| 91免费国产视频网站| 日韩av一区二区三区四区| 国产三级精品三级在线专区| 在线观看日产精品| 国产剧情一区在线| 一区二区在线电影| 精品捆绑美女sm三区| 色欧美乱欧美15图片| 激情综合网最新| 亚洲宅男天堂在线观看无病毒| 欧美成人激情免费网| 色偷偷成人一区二区三区91| 蜜桃视频第一区免费观看| 日韩理论片在线| 欧美成人aa大片| 色综合视频在线观看| 精久久久久久久久久久| 亚洲综合久久av| 国产欧美一区二区精品性色 | 欧美视频三区在线播放| 国产尤物一区二区| 午夜久久久影院| 中文字幕一区二区在线播放 | 91丨国产丨九色丨pron| 麻豆91在线播放免费| 亚洲精品国产精品乱码不99| 久久这里只有精品首页| 欧美精品三级在线观看| 色综合天天在线| 国产精品原创巨作av| 日韩成人伦理电影在线观看| 亚洲免费高清视频在线| 欧美激情中文字幕一区二区| 亚洲午夜在线观看视频在线| 国产亚洲一本大道中文在线| 欧美日韩和欧美的一区二区| av毛片久久久久**hd| 国产一区二区在线观看视频| 香蕉av福利精品导航| 亚洲精品高清在线| 国产日本欧美一区二区| 欧美电影免费观看高清完整版在| 欧美性猛交xxxxxx富婆| 成av人片一区二区| 国产乱码精品1区2区3区| 奇米影视7777精品一区二区| 亚洲成人精品影院| 亚洲欧美韩国综合色| 久久综合网色—综合色88| 91麻豆精品国产自产在线观看一区 | 免费欧美在线视频| 亚洲电影你懂得| 亚洲亚洲精品在线观看| 亚洲精品久久7777| 亚洲婷婷综合色高清在线| 日本一区二区三区国色天香 | 欧美久久久影院| 欧美视频一区二区在线观看| 日本道免费精品一区二区三区| 成人黄色大片在线观看| 国产麻豆视频精品| 国产一区不卡视频| 久久精品国产99国产精品| 日韩中文字幕区一区有砖一区| 亚洲高清中文字幕| 亚洲成人动漫一区| 亚洲1区2区3区视频| 性感美女久久精品| 水蜜桃久久夜色精品一区的特点| 亚洲第一福利一区| 日日摸夜夜添夜夜添亚洲女人| 肉色丝袜一区二区| 视频一区欧美日韩| 蜜臀av性久久久久蜜臀aⅴ| 蜜臀久久99精品久久久画质超高清 | 国产精品丝袜91| 国产精品黄色在线观看| 国产精品久久久久久亚洲毛片 | 激情都市一区二区| 国产一区二区三区四| 国产成人精品一区二区三区四区| 国产一区二区三区蝌蚪| 国产大片一区二区| 成人免费高清视频在线观看| 99re6这里只有精品视频在线观看| 91麻豆国产香蕉久久精品| 欧美性淫爽ww久久久久无| 8v天堂国产在线一区二区| 日韩免费高清视频| 久久综合九色综合久久久精品综合 | 成人白浆超碰人人人人| 成人黄色免费短视频| 在线免费观看日本一区| 欧亚洲嫩模精品一区三区| 欧美精品自拍偷拍动漫精品| 日韩三级电影网址| 国产视频一区二区在线观看| 亚洲婷婷综合久久一本伊一区 | 亚洲桃色在线一区| 亚洲电影在线播放| 久久99热狠狠色一区二区| 国产一区91精品张津瑜| 99久久免费国产| 精品视频123区在线观看| 欧美一区二区三区啪啪| 久久久亚洲精华液精华液精华液 | 国产视频一区二区三区在线观看| 亚洲欧洲www| 日韩电影一区二区三区| 国产一区二区在线影院| 色婷婷综合久久| 欧美一级高清片在线观看| 国产调教视频一区| 亚洲黄色片在线观看| 久久99精品国产麻豆不卡| 99久久综合色| 日韩欧美一区中文|