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

📄 winlink.cpp

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 CPP
📖 第 1 页 / 共 5 页
字号:
   T36HZEnabled=1;
}

void Stop36HZ(void)
{
   T36HZEnabled=0;
}

char WinMessage[256];
extern unsigned char cvidmode;
extern BYTE GrayscaleMode;
extern BYTE V8Mode;
DWORD FirstVid=1;
DWORD FirstFull=1;
extern BYTE GUIWFVID[];
void clearwin();

char WinName[]={"ZSNESW\0"};

void initwinvideo(void)
{
   RECT zwindowrect;
   WINDOWPLACEMENT wndpl;
   RECT rc1, swrect;
   DWORD newmode=0;

   V8Mode = (GrayscaleMode == 1);

   if (CurMode!=cvidmode)
   {
      CurMode=cvidmode;
      newmode=1;
      SurfaceX=256;
      SurfaceY=224;
      X=0;
      Y=0;
      FullScreen=GUIWFVID[cvidmode];

      switch (cvidmode)
      {
      case 0:
         WindowWidth=64;
         WindowHeight=56;
         break;
      case 1:
         WindowWidth=128;
         WindowHeight=112;
         break;
      case 2:
         WindowWidth=256;
         WindowHeight=224;
         break;
      case 3:
         WindowWidth=640;
         WindowHeight=480;
         SurfaceX=320;
         SurfaceY=240;
         break;
      case 4:
         WindowWidth=512;
         WindowHeight=448;
         break;
      case 5:
         WindowWidth=512;
         WindowHeight=448;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 6:
         WindowWidth=640;
         WindowHeight=480;
         break;
      case 7:
         WindowWidth=640;
         WindowHeight=480;
         SurfaceX=640;
         SurfaceY=480;
         break;
      case 8:
         WindowWidth=640;
         WindowHeight=480;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 9:
         WindowWidth=640;
         WindowHeight=480;
         break;
      case 10:
         WindowWidth=800;
         WindowHeight=600;
         break;
      case 11:
         WindowWidth=800;
         WindowHeight=600;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 12:
         WindowWidth=800;
         WindowHeight=600;
         break;
      case 13:
         WindowWidth=800;
         WindowHeight=600;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 14:
         WindowWidth=1024;
         WindowHeight=768;
         break;
      case 15:
         WindowWidth=1024;
         WindowHeight=768;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 16:
         WindowWidth=1024;
         WindowHeight=768;
         break;
      case 17:
         WindowWidth=1024;
         WindowHeight=768;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 18:
         WindowWidth=768;
         WindowHeight=672;
         break;
      case 19:
         WindowWidth=768;
         WindowHeight=672;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 20:
         WindowWidth=1024;
         WindowHeight=896;
         break;
      case 21:
         WindowWidth=1024;
         WindowHeight=896;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 22:
         WindowWidth=1280;
         WindowHeight=960;
         SurfaceX=640;
         SurfaceY=480;
         break;
      case 23:
         WindowWidth=1280;
         WindowHeight=960;
         SurfaceX=512;
         SurfaceY=448;
         break;
      case 24:
         WindowWidth=800;
         WindowHeight=600;
         SurfaceX=640;
         SurfaceY=480;
         break;
      default:
         WindowWidth=256;
         WindowHeight=224;
         break;
      }
   }

   if (((PrevStereoSound!=StereoSound)||(PrevSoundQuality!=SoundQuality))&&FirstSound!=1)
      ReInitSound();

   if (!FirstVid)
   {   
      if (X<0)X=0;
      if (X>(GetSystemMetrics( SM_CXSCREEN )-WindowWidth)) X=(GetSystemMetrics( SM_CXSCREEN )-WindowWidth);
      if (Y<0)Y=0;
      if (Y>(GetSystemMetrics( SM_CYSCREEN )-WindowHeight)) Y=(GetSystemMetrics( SM_CYSCREEN )-WindowHeight);
      if (FullScreen==1) {X=0; Y=0;}

      MainWindowX = X; MainWindowY = Y;

      MoveWindow( hMainWindow, X, Y,
                  WindowWidth, WindowHeight, TRUE );

      wndpl.length = sizeof(wndpl);
      GetWindowPlacement( hMainWindow, &wndpl);
      SetRect( &rc1, 0, 0, WindowWidth, WindowHeight );

      AdjustWindowRectEx( &rc1,GetWindowLong( hMainWindow, GWL_STYLE ),
      GetMenu( hMainWindow ) != NULL, GetWindowLong( hMainWindow, GWL_EXSTYLE ) ); 

      GetClientRect(hMainWindow, &rcWindow);
      ClientToScreen(hMainWindow, ( LPPOINT )&rcWindow);
      ClientToScreen(hMainWindow, ( LPPOINT )&rcWindow + 1);
   }
   else
   {
      atexit(ExitFunction);

      AltTimer = AlternateTimer;

      if (AltTimer == 0)
      {
         if (!QueryPerformanceFrequency((LARGE_INTEGER*)&freq)) return;
      }
      else
      {
         freq = CLOCKS_PER_SEC;
      }

      if (!RegisterWinClass())
      { 
          exit(1);
      }
      X=(GetSystemMetrics( SM_CXSCREEN ) - WindowWidth) / 2;
      Y=(GetSystemMetrics( SM_CYSCREEN ) - WindowHeight) / 2;
      if (FullScreen==1) {X=0; Y=0;}

      if (hMainWindow) 
      {
         CloseWindow(hMainWindow);
      }

      if (SaveMainWindowPos == 1 && MainWindowX != -1) { X = MainWindowX; Y = MainWindowY; }

      hMainWindow = CreateWindow( "ZSNESWIN", WinName, WS_VISIBLE|WS_POPUP,X,Y,  //WS_OVERLAPPED "ZSNESWIN"
                                 WindowWidth,WindowHeight,NULL,NULL,hInst,NULL);
      
      CheckPriority();
      CheckAlwaysOnTop();
      CheckScreenSaver();

      if (!hMainWindow)
      { 
         return;
      }

      ShowWindow(hMainWindow, SW_SHOWNORMAL);
      SetWindowText(hMainWindow,"ZSNESWIN");
      InitInput();
      InitSound();
      TestJoy();
   }

   if (FirstVid == 1)
   {
      FirstVid = 0;
      InitDirectDraw();
      clearwin();
      return;
   }

   if (Moving == 1) return;

   if (newmode == 1)
   {
      ReleaseDirectDraw();
      InitDirectDraw();
      clearwin();
      return;
   }

}

extern unsigned int vidbuffer;
extern void SoundProcess();
extern int DSPBuffer;
int * DSPBuffer1;
DWORD ScreenPtr;
DWORD ScreenPtr2;
extern GUI36hzcall(void);
extern Game60hzcall(void);
extern int packettimeleft[256];
extern int PacketCounter;
extern int CounterA;
extern int CounterB;

void CheckTimers(void)
{
   if (AltTimer == 0) QueryPerformanceCounter((LARGE_INTEGER*)&end2);
      else end2 = timeGetTime();

   while ((end2 - start2) >= update_ticks_pc2)
      {
         if (CounterA>0) CounterA--;
         if (CounterB>0) CounterB--;
         if (PacketCounter){
           for (int i=0;i<256;i++){
             if (packettimeleft[i]>0)
               packettimeleft[i]--;
           }
         }
         start2 += update_ticks_pc2;
      }                                     

   if (T60HZEnabled)
   {
      if (AltTimer == 0) QueryPerformanceCounter((LARGE_INTEGER*)&end);
         else end = timeGetTime();

   while ((end - start) >= update_ticks_pc)
      {
         _asm{
         pushad
         call Game60hzcall
         popad
         }
         start += update_ticks_pc;
      }                                     
   }

   if (T36HZEnabled)
   {
      if (AltTimer == 0) QueryPerformanceCounter((LARGE_INTEGER*)&end);
         else end = timeGetTime();

   while ((end - start) >= update_ticks_pc)
      {
         _asm{
         pushad
         call GUI36hzcall
         popad
         }
         start += update_ticks_pc;
      }                                     
   }
}

extern BYTE GUIOn2;

void UpdateVFrame(void)
{
   if (GUIOn2 == 1 && IsActivated == 0) WaitMessage();

   int DataNeeded;
   int SPCSize=256;

   if (StereoSound==1)SPCSize=256;

   while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

   WinUpdateDevices();
   CheckTimers();

   if (SoundEnabled == 0) return;

   lpSoundBuffer->GetCurrentPosition(&CurrentPos,&WritePos);

   if (LastUsedPos <= CurrentPos)
   {
      DataNeeded=CurrentPos-LastUsedPos;
   }
   else
   {
      DataNeeded=SoundBufferSize - LastUsedPos + CurrentPos;
   }

   DataNeeded/=(SPCSize*2);
   DataNeeded*=(SPCSize*2);

   while (DataNeeded>0)
   {
      _asm
      {
         pushad
         call SoundProcess
         popad
      }

      DSPBuffer1=(int *)&DSPBuffer;

      for(i=0;i<SPCSize;i++)
      {
         Buffer[i]=DSPBuffer1[i];
         if (DSPBuffer1[i]>32767)Buffer[i]=32767;
         if (DSPBuffer1[i]<-32767)Buffer[i]=-32767;
         if (T36HZEnabled)Buffer[i]=0;
      }

      if (DS_OK!=lpSoundBuffer->Lock(LastUsedPos,
                                  SPCSize*2, &lpvPtr1,
                                  &dwBytes1, &lpvPtr2,
                                  &dwBytes2, 0))
      {
         return;
      }

      Sound=(short *)lpvPtr1;

      CopyMemory(lpvPtr1, &Buffer[0], dwBytes1);

      if (NULL != lpvPtr2)
      {
         CopyMemory(lpvPtr2, &Buffer[0]+dwBytes1, dwBytes2);
      }   

      if (DS_OK != lpSoundBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2))
      {
         return;
      }

      LastUsedPos+=SPCSize*2;
      if (LastUsedPos==SoundBufferSize) LastUsedPos=0;
      DataNeeded-=(SPCSize*2);
   }

}

extern unsigned char curblank;
extern DWORD AddEndBytes;
extern DWORD NumBytesPerLine;
extern unsigned char * WinVidMemStart;
extern void copy640x480x16bwin(void);
extern unsigned char FPUCopy;
extern unsigned char NGNoTransp;
extern unsigned char newengen;

void clearwin()
{
   DWORD i,j,color32;
   DWORD *SURFDW;

   Temp1=LockSurface();
   if (Temp1==0) { return; }

   SurfBufD=(DWORD) &SurfBuf[0];
   SURFDW=(DWORD *) &SurfBuf[0];

   switch (BitDepth)
   {
      case 16:
         _asm {
            push es
            mov ax,ds
            mov es,ax
            xor eax,eax
            mov edi,SurfBufD
            xor ebx,ebx
         Blank2:
            xor eax,eax
            mov ecx,SurfaceX
            rep stosw
            add edi,Temp1
            sub edi,SurfaceX
            sub edi,SurfaceX
            add ebx,1
            cmp ebx,SurfaceY
            jne Blank2
            pop es  // BUGFIX
         }
         break;
      case 32:
         _asm {
            push es
            mov ax,ds
            mov es,ax
            xor eax,eax
            mov edi,SurfBufD
            xor ebx,ebx
         Blank3:
            xor eax,eax
            mov ecx,SurfaceX
            rep stosd
            add edi,Temp1
            sub edi,SurfaceX
            sub edi,SurfaceX
            sub edi,SurfaceX
            sub edi,SurfaceX
            add ebx,1
            cmp ebx,SurfaceY
            jne Blank3
            pop es  // BUGFIX
         }
         break;
   }
   UnlockSurface();
}

void drawscreenwin(void)
{

⌨️ 快捷键说明

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