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

📄 winlink.cpp

📁 linux下的任天堂模拟器代码。供大家参考。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
      ddsd2.ddsCaps.dwCaps |= DDSCAPS_FLIP | DDSCAPS_COMPLEX;   }   HRESULT hRes = lpDD->CreateSurface(&ddsd2, &DD_Primary, NULL);   if (FullScreen == 1)   {     if ((hRes == DDERR_OUTOFMEMORY) || (hRes == DDERR_OUTOFVIDEOMEMORY))     {       ddsd2.dwBackBufferCount = 1;       hRes = lpDD->CreateSurface(&ddsd2, &DD_Primary, NULL);     }   }   if (hRes != DD_OK)   {      MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR);      return FALSE;   }   if (FullScreen == 1)   {      ddsd2.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;      if (DD_Primary->GetAttachedSurface(&ddsd2.ddsCaps, &DD_BackBuffer) != DD_OK)      {         MessageBox(NULL, "IDirectDrawSurface7::GetAttachedSurface failed.", "DirectDraw Error", MB_ICONERROR);         return FALSE;      }   }   else   {      if (lpDD->CreateClipper(0,&lpDDClipper,NULL) != DD_OK)      {         lpDD->Release();         lpDD=NULL;         return FALSE;      }      if (lpDDClipper->SetHWnd(0,hMainWindow) != DD_OK)      {         lpDD->Release();         lpDD=NULL;         return FALSE;      }      if (DD_Primary->SetClipper(lpDDClipper) != DD_OK)      {         return FALSE;      }   }   format.dwSize = sizeof(DDPIXELFORMAT);   if (DD_Primary->GetPixelFormat(&format) != DD_OK)   {      MessageBox(NULL, "IDirectDrawSurface7::GetPixelFormat failed.", "DirectDraw Error", MB_ICONERROR);      return FALSE;   }   BitDepth=format.dwRGBBitCount;   GBitMask=format.dwGBitMask; // 0x07E0 or not   if (BitDepth==24)   {      MessageBox(NULL,"ZSNESw does not support 24bit color.\nPlease change your resolution to either 16bit or 32bit color","Error",MB_OK);      exit(0);   }   converta = (BitDepth==16 && GBitMask!=0x07E0);   ddsd2.dwSize = sizeof(ddsd2);   ddsd2.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;   ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;   ddsd2.dwWidth = SurfaceX;   ddsd2.dwHeight = SurfaceY;   // create drawing surface   if (lpDD->CreateSurface(&ddsd2, &DD_CFB, NULL) != DD_OK)   {      MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR);      return FALSE;   }   AltSurface = 0;   // create alt. drawing surface   if ( BitDepth == 32 )   {     if(DMode == 1 && HQMode == 0)       ddsd2.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY;     ddsd2.dwFlags |= DDSD_PIXELFORMAT;     ddsd2.ddpfPixelFormat.dwSize        = sizeof(DDPIXELFORMAT);     ddsd2.ddpfPixelFormat.dwFlags       = DDPF_RGB;     ddsd2.ddpfPixelFormat.dwRGBBitCount = 16;     ddsd2.ddpfPixelFormat.dwRBitMask    = 0xF800;     ddsd2.ddpfPixelFormat.dwGBitMask    = 0x07E0;     ddsd2.ddpfPixelFormat.dwBBitMask    = 0x001F;     if (lpDD->CreateSurface(&ddsd2, &DD_CFB16, NULL) != DD_OK)     {        MessageBox(NULL, "IDirectDraw7::CreateSurface failed. You should update your video card drivers. Alternatively, you could use a 16-bit desktop or use a non-D mode.", "DirectDraw Error", MB_ICONERROR);        return FALSE;     }     if (((SurfaceX==512) || (SurfaceX==602) || (SurfaceX==640)) && (HQMode==0))       AltSurface = 1;   }   return TRUE;}BYTE* SurfBuf;DDSURFACEDESC2 ddsd;DWORD LockSurface(){  HRESULT hRes;  if (AltSurface == 0)  {    if (DD_CFB != NULL)    {      memset(&ddsd,0,sizeof(ddsd));      ddsd.dwSize = sizeof( ddsd );      ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;      hRes = DD_CFB->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);      if (hRes == DD_OK)      {        SurfBuf = (BYTE*)ddsd.lpSurface;        return(ddsd.lPitch);      }      else      {        if (hRes == DDERR_SURFACELOST)        {          DD_Primary->Restore();          DD_CFB->Restore();          Clear2xSaIBuffer();        }        return(0);      }    }    else      return(0);  }  else  {    if (DD_CFB16 != NULL)    {      memset(&ddsd,0,sizeof(ddsd));      ddsd.dwSize = sizeof( ddsd );      ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;      hRes = DD_CFB16->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);      if (hRes == DD_OK)      {        SurfBuf = (BYTE*)ddsd.lpSurface;        return(ddsd.lPitch);      }      else      {        if (hRes == DDERR_SURFACELOST)        {          DD_Primary->Restore();          DD_CFB16->Restore();          Clear2xSaIBuffer();        }        return(0);      }    }    else      return(0);  }}void UnlockSurface(){  if (AltSurface == 0)    DD_CFB->Unlock((struct tagRECT *)ddsd.lpSurface);  else    DD_CFB16->Unlock((struct tagRECT *)ddsd.lpSurface);}extern "C" {void WinUpdateDevices();short Buffer[1800*2];int X, Y;DWORD pitch;MSG msg;DWORD SurfBufD;int count, x,count2;HRESULT hr;int i;short *Sound;DWORD CurrentPos;DWORD WritePos;DWORD T60HZEnabled=0;DWORD T36HZEnabled=0;DWORD WINAPI SemaphoreThread( LPVOID lpParam ){   while(semaphore_run)   {      if (T60HZEnabled)      {         ReleaseSemaphore(hLock, 1, NULL);         Sleep(1);      }      else         Sleep(20);   }   return 0;}void InitSemaphore(){   if (!hLock)   {      hLock = CreateSemaphore(NULL, 1, SemaphoreMax, NULL);      semaphore_run = 1;      hThread = CreateThread(NULL, 0, SemaphoreThread, &dwThreadParam, 0, &dwThreadId);   }}void ShutdownSemaphore(){   if (hLock)   {      semaphore_run = 0;      WaitForSingleObject(hThread, INFINITE);      CloseHandle(hThread);      CloseHandle(hLock);      hLock = NULL;   }}extern unsigned int pressed;extern unsigned char romispal;void Start60HZ(void){   update_ticks_pc2 = UPDATE_TICKS_UDP * freq / 1000.0;   if (romispal==1)   {      update_ticks_pc = UPDATE_TICKS_GAMEPAL * freq / 1000.0;   }   else   {      update_ticks_pc = UPDATE_TICKS_GAME * freq / 1000.0;   }   QueryPerformanceCounter((LARGE_INTEGER*)&start);   QueryPerformanceCounter((LARGE_INTEGER*)&start2);   T36HZEnabled=0;   T60HZEnabled=1;   InitSemaphore();   if (device1 && device2)   {      MouseInput->Unacquire();      MultiMouseInit();   }   //if (!device1 && !device2) MouseInput->Unacquire();}void Stop60HZ(void){   T60HZEnabled=0;   if (device1 && device2)      MultiMouseShutdown();   MouseInput->Acquire();   ShutdownSemaphore();}void Start36HZ(void){   update_ticks_pc2 = UPDATE_TICKS_UDP * freq / 1000.0;   update_ticks_pc = UPDATE_TICKS_GUI * freq / 1000.0;   QueryPerformanceCounter((LARGE_INTEGER*)&start);   QueryPerformanceCounter((LARGE_INTEGER*)&start2);   T60HZEnabled=0;   T36HZEnabled=1;}void Stop36HZ(void){   T36HZEnabled=0;}char WinMessage[256];void clearwin();char WinName[]={"ZSNESW\0"};void NTSCFilterInit();void NTSCFilterDraw(int SurfaceX, int SurfaceY, int pitch, unsigned char* buffer);extern "C" char GUIM7VID[];void SetHiresOpt(){  if(CustomResX >= 512 && CustomResY >= 448)    GUIM7VID[cvidmode] = 1;  else    GUIM7VID[cvidmode] = 0;}void KeepTVRatio(){  int ratiox = WindowWidth*3;  int ratioy = WindowHeight*4;  int marginchange;  int marginmod;  if (ratiox < ratioy)  {    marginchange = (WindowHeight-(ratiox/4))/2;    marginmod = (WindowHeight-(ratiox/4))%2;    rcWindow.top += marginchange;    rcWindow.bottom -= (marginchange+marginmod);  }  else if (ratiox > ratioy)  {    marginchange = (WindowWidth-(ratioy/3))/2;    marginmod = (WindowWidth-(ratioy/3))%2;    rcWindow.left += marginchange;    rcWindow.right -= (marginchange+marginmod);  }}extern "C" char GUIKEEP43[];bool CheckTVRatioReq(){  return(GUIKEEP43[cvidmode] && Keep4_3Ratio);}void initwinvideo(void){   WINDOWPLACEMENT wndpl;   RECT rc1;   DWORD newmode=0;   DWORD HQMode=0;   if (FirstActivate && NTSCFilter) NTSCFilterInit();   if (cvidmode == 37 || cvidmode == 38 || cvidmode == 41)   {     SetHiresOpt();   }   if ( hqFilter != 0 )   {     if ((GUIHQ2X[cvidmode] != 0) && (hqFilterlevel == 2)) HQMode=2;     if ((GUIHQ3X[cvidmode] != 0) && (hqFilterlevel == 3)) HQMode=3;     if ((GUIHQ4X[cvidmode] != 0) && (hqFilterlevel == 4)) HQMode=4;   }   if ((CurMode!=cvidmode) || (prevHQMode!=HQMode) || (prevNTSCMode!=NTSCFilter) || (changeRes))   {      CurMode=cvidmode;      prevHQMode=HQMode;      prevNTSCMode=NTSCFilter;      changeRes = 0;      newmode=1;      SurfaceX=256;      SurfaceY=240;      X=0;      Y=0;      FullScreen=GUIWFVID[cvidmode];      DMode=GUIDSIZE[cvidmode];      SMode=GUISMODE[cvidmode];      DSMode=GUIDSMODE[cvidmode];      NTSCMode=GUINTVID[cvidmode];      switch (cvidmode)      {      case 0:         WindowWidth=256;         WindowHeight=224;         break;      case 1:         WindowWidth=640;         WindowHeight=480;         break;      case 2:      case 3:         WindowWidth=512;         WindowHeight=448;         break;      case 4:      case 5:      case 6:      case 7:      case 8:         WindowWidth=640;         WindowHeight=480;         break;      case 9:      case 10:         WindowWidth=768;         WindowHeight=672;         break;      case 11:      case 12:      case 13:      case 14:      case 15:         WindowWidth=800;         WindowHeight=600;         break;      case 16:      case 17:      case 18:      case 19:      case 20:         WindowWidth=1024;         WindowHeight=768;         break;      case 21:      case 22:         WindowWidth=1024;         WindowHeight=896;         break;      case 23:      case 24:      case 25:      case 26:      case 27:         WindowWidth=1280;         WindowHeight=960;         break;      case 28:      case 29:      case 30:      case 31:      case 32:         WindowWidth=1280;         WindowHeight=1024;         break;      case 33:      case 34:      case 35:      case 36:      case 37:         WindowWidth=1600;         WindowHeight=1200;         break;      case 38:      case 39:      case 40:      case 41:      case 42:         WindowWidth=CustomResX;         WindowHeight=CustomResY;         break;      default:         WindowWidth=256;         WindowHeight=224;         break;      }      if (DMode == 1)      {        if ((DSMode == 1) || (FullScreen == 0))          SurfaceX = 512;        else          SurfaceX = 640;        SurfaceY=480;        if (NTSCMode && NTSCFilter)        {          SurfaceX = 602;          SurfaceY = 446;        }      }      else      {        if ((SMode == 0) && (FullScreen == 1))          SurfaceX=320;        else          SurfaceX=256;        SurfaceY=240;      }      switch ( HQMode )      {        case 2:          SurfaceX=512;          SurfaceY=480;          break;        case 3:          SurfaceX=768;          SurfaceY=720;          break;

⌨️ 快捷键说明

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